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