on d8571ea help sign in
stackage/Stackage/NarrowDatabase.hs
30 lines 1.2 kB history raw
1module Stackage.NarrowDatabase where
3import qualified Data.Map as Map
4import qualified Data.Set as Set
5import Prelude hiding (pi)
6import Stackage.Types
8-- | Narrow down the database to only the specified packages and all of
9-- their dependencies.
10narrowPackageDB :: PackageDB
11 -> Set PackageName
12 -> IO (Map PackageName Version)
13narrowPackageDB (PackageDB pdb) =
14 loop Map.empty . Set.map ((,) True)
15 where
16 loop result toProcess =
17 case Set.minView toProcess of
18 Nothing -> return result
19 Just ((isOrig, p), toProcess') ->
20 case Map.lookup p pdb of
21 Nothing
22 | isOrig -> error $ "Unknown package: " ++ show p
23 | otherwise -> loop result toProcess'
24 Just pi -> do
25 let result' = Map.insert p (piVersion pi) result
26 loop result' $ Set.foldl' (addDep result') toProcess' $ piDeps pi
27 addDep result toProcess p =
28 case Map.lookup p result of
29 Nothing -> Set.insert (False, p) toProcess
30 Just{} -> toProcess