Skip to content
Snippets Groups Projects
Commit 587cfebf authored by Duncan Coutts's avatar Duncan Coutts
Browse files

Improve style and performance of PackageIndex.dependencyClosure

Keep the completed set as another PackageIndex rather than a list.
We want to return an index at the end anyway and in the mean time
we want to do lots of lookups to see if we've visited previously.
parent b339b31f
No related branches found
No related tags found
Loading
...@@ -272,20 +272,18 @@ dependencyClosure :: PackageFixedDeps pkg ...@@ -272,20 +272,18 @@ dependencyClosure :: PackageFixedDeps pkg
-> [PackageIdentifier] -> [PackageIdentifier]
-> Either (PackageIndex pkg) -> Either (PackageIndex pkg)
[(pkg, [PackageIdentifier])] [(pkg, [PackageIdentifier])]
dependencyClosure index pkgids0 = case closure [] [] pkgids0 of dependencyClosure index pkgids0 = case closure mempty [] pkgids0 of
(completed, []) -> Left $ fromList completed (completed, []) -> Left completed
(completed, _) -> Right $ brokenPackages (fromList completed) (completed, _) -> Right (brokenPackages completed)
where where
closure completed failed [] = (completed, failed) closure completed failed [] = (completed, failed)
closure completed failed (pkgid:pkgids) = case lookupPackageId index pkgid of closure completed failed (pkgid:pkgids) = case lookupPackageId index pkgid of
Nothing -> closure completed (pkgid:failed) pkgids Nothing -> closure completed (pkgid:failed) pkgids
-- TODO: use more effecient test here: Just pkg -> case lookupPackageId completed (packageId pkg) of
Just pkg | packageId pkg `elem` map packageId completed Just _ -> closure completed failed pkgids
-> closure completed failed pkgids Nothing -> closure completed' failed pkgids'
| otherwise where completed' = insert pkg completed
-> closure (pkg:completed) failed pkgids' pkgids' = depends pkg ++ pkgids
where pkgids' = depends pkg ++ pkgids
-- | Given a package index where we assume we want to use all the packages -- | Given a package index where we assume we want to use all the packages
-- (use 'dependencyClosure' if you need to get such a index subset) find out -- (use 'dependencyClosure' if you need to get such a index subset) find out
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment