dependency 0.1.0.5 → 0.1.0.6
raw patch · 3 files changed
+11/−26 lines, 3 files
Files
- bench/Bench.hs +3/−6
- dependency.cabal +1/−1
- src/Data/Dependency.hs +7/−19
bench/Bench.hs view
@@ -35,10 +35,7 @@ main :: IO () main =- defaultMain [ bgroup "buildSequence"- [ bench "3" $ nf buildSequence deps- , bench "6" $ nf buildSequence (bifunctors : microlens : deps)- ]- , bgroup "resolveDependencies"- [ bench "3" $ nf (resolveDependencies set) [lens] ]+ defaultMain [ bgroup "resolveDependencies"+ [ bench "3" $ nf (resolveDependencies set) [lens]+ , bench "6" $ nf (resolveDependencies set) [lens, microlens, bifunctors] ] ]
dependency.cabal view
@@ -1,5 +1,5 @@ name: dependency-version: 0.1.0.5+version: 0.1.0.6 synopsis: Dependency resolution for package management description: A library for resolving dependencies; uses a topological sort to construct a build plan and then allows choice between all compatible plans. license: BSD3
src/Data/Dependency.hs view
@@ -40,31 +40,19 @@ buildSequence = reverse . groupBy independent . sortDeps where independent (Dependency ln _ ls _) (Dependency ln' _ ls' _) = ln' `notElem` ls && ln `notElem` ls' -dock :: (Eq a, Ord a) => [S.Set a] -> S.Set a-dock [x] = x-dock [] = S.fromList []-dock (x:ys@(y:_))- | x == y = y- | otherwise = dock ys- iterateM :: (Monad m) => Int -> (a -> m a) -> a -> m [a] iterateM 0 _ _ = pure [] iterateM n f x = (x:) <$> (iterateM (n-1) f =<< f x) --- FIXME saturate everything at once.-saturateDeps :: PackageSet Dependency -> Dependency -> DepM [Dependency]-saturateDeps ps = fmap toList . resolve <=< saturateDeps' ps- where resolve :: S.Set Dependency -> DepM (S.Set Dependency)- resolve set = dock <$> iterateM n next set- next :: S.Set Dependency -> DepM (S.Set Dependency)+saturateDeps :: PackageSet Dependency -> Dependency -> DepM (S.Set Dependency)+saturateDeps ps = resolve <=< saturateDeps' ps+ where resolve set = last <$> iterateM n next set next depSet = S.unions <$> sequence (saturateDeps' ps <$> toList depSet)- n :: Int n = length (toList ps) saturateDeps' :: PackageSet Dependency -> Dependency -> DepM (S.Set Dependency) saturateDeps' (PackageSet ps) dep = do- let libDeps = _libDependencies dep- deps <- sequence [ lookupMap lib ps | lib <- libDeps ]+ deps <- sequence [ lookupMap lib ps | lib <- _libDependencies dep ] list <- (:) dep <$> traverse lookupSet deps pure $ S.fromList list @@ -78,11 +66,11 @@ -- -- 4. Specify an error for overconstrained builds ----- 5. Specify an error if a package is not present.+-- 5. Specify an error if a package is not present -- -- This doesn't do any package resolution beyond versioning. resolveDependencies :: PackageSet Dependency -> [Dependency] -> DepM [[Dependency]]-resolveDependencies ps = select . getLatest <=< fmap buildSequence . saturated+resolveDependencies ps = select . getLatest <=< fmap (buildSequence . toList) . saturated where select = fmap (fmap (fmap snd))- saturated dep = join <$> traverse (saturateDeps ps) dep+ saturated dep = S.unions <$> traverse (saturateDeps ps) dep getLatest = traverse (traverse (latest ps))