[add routine to split program into independent components, get rid of progClosed field in program in favor of progType.
John Meacham <john@repetae.net>**20061125113959] hunk ./E/Inline.hs 7
+    programMapProgComponents,
hunk ./E/Inline.hs 15
-import qualified Data.Graph as G
hunk ./E/Inline.hs 128
-    ds <- g [] imap $ decomposeDs (programDs prog)
+    ds <- g [] imap $ programDecomposedDs prog
hunk ./E/Inline.hs 132
-decomposeDs bs = map f mp where
-    mp = G.stronglyConnComp [ (v,i, idSetToList $ bindingFreeVars t e) | v@(t@TVr { tvrIdent = i },e) <- bs]
-    f (G.AcyclicSCC v) = Left v
-    f (G.CyclicSCC vs) = Right vs
+decomposeDs bs = scc g where
+    g = newGraph bs (tvrIdent . fst ) (toList . uncurry bindingFreeVars)
+    --mp = G.stronglyConnComp [ (v,i, idSetToList $ bindingFreeVars t e) | v@(t@TVr { tvrIdent = i },e) <- bs]
+    --f (G.AcyclicSCC v) = Left v
+    --f (G.CyclicSCC vs) = Right vs
+
hunk ./E/Inline.hs 144
+programComponents :: Program -> [[(TVr,E)]]
+programComponents prog = components $ newGraph (programDs prog) (tvrIdent . fst) (toList . uncurry bindingFreeVars)
+
hunk ./E/Inline.hs 151
-    -> (Program -> m Program)  -- ^ bool is true if group is recursive.
+    -> (Program -> m Program)
hunk ./E/Inline.hs 176
+
+programMapProgComponents :: Monad m =>
+    (Program -> m Program)
+    -> Program
+    -> m Program
+programMapProgComponents f prog = do
+    let cs = programComponents prog
+        prog' = prog { progStats = mempty, progType = MainComponent }
+        g ds = f (programSetDs ds prog')
+    ps <- mapM g (programComponents prog)
+    return $ programSetDs (concatMap programDs ps) prog { progStats = progStats prog `mappend` (mconcat $ map progStats ps) }
+
+
hunk ./E/Program.hs 27
-data ProgramType = SubProgram Bool | MainProgram
+data ProgramType = SubProgram Bool | MainProgram | MainComponent
hunk ./E/Program.hs 37
-    progClosed :: Bool,           -- ^ whether the universe is closed other than the entry points and external names
hunk ./E/Program.hs 52
-    progClosed = False,
hunk ./E/SSimplify.hs 81
-        (dsIn',(OMap fvs,uids)) = runReaderWriter (unOM $ collectDs dsIn $ if progClosed prog then mempty else fromList $ map (flip (,) noUseInfo) (map (tvrIdent . fst) dsIn)) (fromList $ map tvrIdent $ progEntryPoints prog)
+        (dsIn',(OMap fvs,uids)) = runReaderWriter (unOM $ collectDs dsIn mempty) (fromList $ map tvrIdent $ progEntryPoints prog)
hunk ./Main.hs 257
-            progClosed = True,
hunk ./Main.hs 331
-    let fint mprog' = do
-        let names = pprint [ n | (n,_) <- programDs mprog']
+    let fint mprog = do
+        let names = pprint [ n | (n,_) <- programDs mprog]
hunk ./Main.hs 335
-        let mprog = mprog' { progClosed = True }
-            tparms = transformParms { transformPass = "Init", transformDumpProgress = coreMini }
+        let tparms = transformParms { transformPass = "Init", transformDumpProgress = coreMini }
hunk ./Main.hs 550
-        prog = (hoToProgram ho) { progClosed = True }
+        prog = hoToProgram ho
hunk ./Main.hs 1099
-        putErrLn (show ids)
+        --putErrLn (show ids)