dependency 0.1.0.1 → 0.1.0.2
raw patch · 5 files changed
+44/−11 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Dependency: PackageSet :: (Map String (Set Version)) -> PackageSet
+ Data.Dependency: PackageSet :: (Map String (Set a)) -> PackageSet a
- Data.Dependency: isPresent :: PackageSet -> Dependency -> Bool
+ Data.Dependency: isPresent :: PackageSet Version -> Dependency -> Bool
- Data.Dependency: newtype PackageSet
+ Data.Dependency: newtype PackageSet a
- Data.Dependency: resolveDependencies :: PackageSet -> [[Dependency]] -> Maybe [[(String, Version)]]
+ Data.Dependency: resolveDependencies :: PackageSet Dependency -> [[Dependency]] -> Maybe [[Dependency]]
Files
- bench/Bench.hs +13/−4
- dependency.cabal +3/−1
- src/Data/Dependency.hs +14/−4
- src/Data/Dependency/Type.hs +1/−1
- test/Spec.hs +13/−1
bench/Bench.hs view
@@ -1,7 +1,10 @@ module Main where +import Control.Arrow import Criterion.Main import Data.Dependency+import qualified Data.Map as M+import qualified Data.Set as S microlens :: Dependency microlens = Dependency "microlens" mempty mempty@@ -21,12 +24,18 @@ deps :: [Dependency] deps = [free, lens, comonad] +mapSingles :: [(d, b)] -> [(d, S.Set b)]+mapSingles = fmap (second S.singleton)++set :: PackageSet Dependency+set = PackageSet $ M.fromList (mapSingles [("lens", lens), ("comonad", comonad), ("free", free)])+ main :: IO () main = defaultMain [ bgroup "buildSequence"- [ bench "3" $ nf buildSequence deps ]- , bgroup "asGraph"- [ bench "3" $ nf (fst . asGraph) deps- , bench "6" $ nf (fst . asGraph) (bifunctors : microlens : deps)+ [ bench "3" $ nf buildSequence deps+ , bench "6" $ nf buildSequence (bifunctors : microlens : deps) ]+ , bgroup "resolveDependencies"+ [ bench "3" $ nf (resolveDependencies set) (buildSequence [lens]) ] ]
dependency.cabal view
@@ -1,5 +1,5 @@ name: dependency-version: 0.1.0.1+version: 0.1.0.2 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@@ -45,6 +45,7 @@ build-depends: base , dependency , hspec+ , containers if flag(development) ghc-options: -Werror if impl(ghc >= 8.0)@@ -58,6 +59,7 @@ main-is: Bench.hs build-depends: base , dependency+ , containers , criterion if flag(development) ghc-options: -Werror
src/Data/Dependency.hs view
@@ -10,18 +10,19 @@ , Version (..) ) where +import Control.Monad import Data.Dependency.Sort import Data.Dependency.Type import Data.List (groupBy) import qualified Data.Map as M import qualified Data.Set as S -isPresent :: PackageSet -> Dependency -> Bool+isPresent :: PackageSet Version -> Dependency -> Bool isPresent (PackageSet ps) (Dependency ln _ _) = g (M.lookup ln ps) where g (Just x) = not (S.null x) g Nothing = False -latest :: PackageSet -> Dependency -> Maybe (String, Version)+latest :: (Ord a) => PackageSet a -> Dependency -> Maybe (String, a) latest (PackageSet ps) (Dependency ln _ _) = do s <- M.lookup ln ps (,) ln <$> S.lookupMax s@@ -30,6 +31,12 @@ buildSequence = reverse . groupBy independent . sortDeps where independent (Dependency ln _ ls) (Dependency ln' _ ls') = ln' `notElem` ls && ln `notElem` ls' +saturateDeps :: PackageSet Dependency -> Dependency -> Maybe [Dependency]+saturateDeps (PackageSet ps) dep = do+ let libDeps = _libDependencies dep+ deps <- sequence [ M.lookup lib ps | lib <- libDeps ]+ (:) dep <$> traverse S.lookupMax deps+ -- | Heuristics: -- -- 1. Always use a newer version when possible@@ -43,5 +50,8 @@ -- 5. Specify an error if a package is not present. -- -- This doesn't do any package resolution beyond versioning.-resolveDependencies :: PackageSet -> [[Dependency]] -> Maybe [[(String, Version)]]-resolveDependencies ps sd = sequence (traverse (latest ps) <$> sd)+resolveDependencies :: PackageSet Dependency -> [[Dependency]] -> Maybe [[Dependency]]+resolveDependencies ps = select . getLatest <=< fmap buildSequence . saturated+ where select = fmap (fmap (fmap snd))+ saturated dep = join . join <$> traverse (traverse (saturateDeps ps)) dep+ getLatest = sequence . fmap (traverse (latest ps))
src/Data/Dependency/Type.hs view
@@ -31,7 +31,7 @@ import GHC.Generics (Generic) import Text.PrettyPrint.ANSI.Leijen hiding ((<$>), (<>)) -newtype PackageSet = PackageSet (M.Map String (S.Set Version))+newtype PackageSet a = PackageSet (M.Map String (S.Set a)) deriving (Eq, Ord, Generic) deriving newtype Binary
test/Spec.hs view
@@ -1,4 +1,7 @@+import Control.Arrow import Data.Dependency+import qualified Data.Map as M+import qualified Data.Set as S import Test.Hspec free :: Dependency@@ -13,8 +16,17 @@ deps :: [Dependency] deps = [free, lens, comonad] +mapSingles :: [(d, b)] -> [(d, S.Set b)]+mapSingles = fmap (second S.singleton)++set :: PackageSet Dependency+set = PackageSet $ M.fromList (mapSingles [("lens", lens), ("comonad", comonad), ("free", free)])+ main :: IO ()-main = hspec $ parallel $+main = hspec $ parallel $ do describe "buildSequence" $ it "correctly orders dependencies" $ buildSequence deps `shouldBe` [[free, comonad], [lens]]+ describe "resolveDependencies" $+ it "correctly resolves dependencies in a package set" $+ resolveDependencies set (buildSequence [lens]) `shouldBe` Just [[free, comonad], [lens]]