From 587cfebf64fa73184490a5899dc568bceb618415 Mon Sep 17 00:00:00 2001 From: Duncan Coutts <duncan@haskell.org> Date: Tue, 6 May 2008 23:44:47 +0000 Subject: [PATCH] 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. --- Distribution/Simple/PackageIndex.hs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Distribution/Simple/PackageIndex.hs b/Distribution/Simple/PackageIndex.hs index eebb2cf2b3..57479be052 100644 --- a/Distribution/Simple/PackageIndex.hs +++ b/Distribution/Simple/PackageIndex.hs @@ -272,20 +272,18 @@ dependencyClosure :: PackageFixedDeps pkg -> [PackageIdentifier] -> Either (PackageIndex pkg) [(pkg, [PackageIdentifier])] -dependencyClosure index pkgids0 = case closure [] [] pkgids0 of - (completed, []) -> Left $ fromList completed - (completed, _) -> Right $ brokenPackages (fromList completed) - +dependencyClosure index pkgids0 = case closure mempty [] pkgids0 of + (completed, []) -> Left completed + (completed, _) -> Right (brokenPackages completed) where - closure completed failed [] = (completed, failed) + closure completed failed [] = (completed, failed) closure completed failed (pkgid:pkgids) = case lookupPackageId index pkgid of - Nothing -> closure completed (pkgid:failed) pkgids - -- TODO: use more effecient test here: - Just pkg | packageId pkg `elem` map packageId completed - -> closure completed failed pkgids - | otherwise - -> closure (pkg:completed) failed pkgids' - where pkgids' = depends pkg ++ pkgids + Nothing -> closure completed (pkgid:failed) pkgids + Just pkg -> case lookupPackageId completed (packageId pkg) of + Just _ -> closure completed failed pkgids + Nothing -> closure completed' failed pkgids' + where completed' = insert pkg completed + pkgids' = depends pkg ++ pkgids -- | 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 -- GitLab