[cache cumulative invarient dependencies in every ho file
John Meacham <john@repetae.net>**20090807065227
 Ignore-this: 3c29e3e9c504cf66c47f9ee65b93f11f
] hunk ./src/Ho/Build.hs 149
+    validSources   :: Set.Set SourceHash,
hunk ./src/Ho/Build.hs 185
-    if sh `Map.member` knownSourceMap done || optIgnoreHo options then return (False,honame) else do
+    writeIORef done_ref (done { validSources = Set.insert sh (validSources done) })
+    if sh `Set.member` validSources done || optIgnoreHo options then return (False,honame) else do
hunk ./src/Ho/Build.hs 192
+                modifyIORef done_ref (validSources_u $ Set.union (Set.fromList . map snd $ hoDepends hidep))
hunk ./src/Ho/Build.hs 377
-    (needed,cug) <- loadModules (optHls options) need
+    (ksm, needed,cug) <- loadModules (optHls options) need
hunk ./src/Ho/Build.hs 380
-    compileCompNode ifunc func cnode
+    compileCompNode ifunc func ksm cnode
hunk ./src/Ho/Build.hs 386
-            -> IO ([Module],CompUnitGraph)         -- ^ the resulting acyclic graph of compilation units
+            -> IO (Map.Map SourceHash (Module,[Module]),[Module],CompUnitGraph)  -- ^ the resulting acyclic graph of compilation units
hunk ./src/Ho/Build.hs 404
-    return (needed,cug)
+    --return (Map.filterWithKey (\k _ -> k `Set.member` validSources done) (knownSourceMap done),needed,cug)
+    return (Map.filterWithKey (\k _ -> k `Set.member` validSources done) (knownSourceMap done),needed,cug)
hunk ./src/Ho/Build.hs 495
+                -> Map.Map SourceHash (Module,[Module])
hunk ./src/Ho/Build.hs 498
-compileCompNode ifunc func cn = do ns <- countNodes cn
-                                   cur <- newMVar (1::Int)
-                                   f (Set.size ns) cur cn where
+compileCompNode ifunc func ksm cn = do ns <- countNodes cn
+                                       cur <- newMVar (1::Int)
+                                       ksm_r <- newIORef ksm
+                                       f (Set.size ns) cur ksm_r cn where
hunk ./src/Ho/Build.hs 518
-    f n cur (CompNode hh deps ref) = readIORef ref >>= g where
+    f n cur ksm_r (CompNode hh deps ref) = readIORef ref >>= g where
hunk ./src/Ho/Build.hs 522
-                xs <- mconcat `fmap` mapM (f n cur) deps
+                xs <- mconcat `fmap` mapM (f n cur ksm_r) deps
hunk ./src/Ho/Build.hs 526
-                cho <- mconcat `fmap` mapM (f n cur) deps
+                cho <- mconcat `fmap` mapM (f n cur ksm_r) deps
hunk ./src/Ho/Build.hs 534
-                cho <- mconcat `fmap` mapM (f n cur) deps
+                cho <- mconcat `fmap` mapM (f n cur ksm_r) deps
hunk ./src/Ho/Build.hs 538
+                modifyIORef ksm_r (Map.union $ Map.fromList [ (h,(hsModuleName mod,hsModuleRequires mod)) | (h,mod) <- modules])
+                ksm <- readIORef ksm_r
hunk ./src/Ho/Build.hs 549
-                            hoIDeps = Map.fromList [ (h,(hsModuleName mod,hsModuleRequires mod)) | (h,mod) <- modules],
+                            hoIDeps =    ksm,
hunk ./src/Ho/Build.hs 788
+    showList "IDepCache" (map pprint . sortUnder fst $ Map.toList $ hoIDeps idep)