[add programMapProgGroups to generate and modify subprograms in dependency groups.
John Meacham <john@repetae.net>**20061125041703] hunk ./E/Inline.hs 6
+    programMapProgGroups,
hunk ./E/Inline.hs 24
-import qualified Info.Info as Info
hunk ./E/Inline.hs 28
-import qualified FlagOpts as FO
hunk ./E/Inline.hs 32
+import qualified FlagOpts as FO
+import qualified Info.Info as Info
hunk ./E/Inline.hs 142
+programSubProgram prog rec ds = programSetDs ds prog { progType = SubProgram rec, progEntryPoints = map fst ds }
hunk ./E/Inline.hs 144
+programMapProgGroups :: Monad m =>
+    IdMap (Maybe E)        -- ^ initial map to apply
+    -> (Program -> m Program)  -- ^ bool is true if group is recursive.
+    -> Program
+    -> m Program
+programMapProgGroups imap f prog = do
+    let g prog' rs imap (Left d:rds) = do
+            [d'] <- annotateDs imap nann nann nann [d]
+            nprog <- f (programSubProgram prog' False [d'])
+            let nds = programDs nprog
+            g (unames nds nprog) (nds:rs) (bm nds imap) rds
+        g prog' rs imap (Right ds:rds) = do
+            ds' <- annotateDs imap nann nann nann ds
+            nprog <- f (programSubProgram prog' True ds')
+            let imap' = bm nds imap
+                smap = substMap'' $ fromList [ (tvrIdent x,Just $ EVar x) | (x,y) <- nds]
+                nds = programDs nprog
+                nds' = [ (x,smap y) | (x,y) <- nds]
+            g (unames nds' nprog) (nds':rs) imap' rds
+        g prog' rs _ [] = return $ (concat rs,prog')
+        bm xs imap = fromList [ (tvrIdent t,Just $ EVar t) | (t,_) <- xs ] `union` imap
+        nann _ = return
+        prog' = prog { progStats = mempty }
+        unames ds prog = prog { progExternalNames = progExternalNames prog `mappend` fromList [ tvrIdent t | (t,_) <- ds ] }
+    (ds,prog'') <- g prog' [] imap $ programDecomposedDs prog
+    return $ programSetDs ds prog'' { progStats = progStats prog `mappend` progStats prog'' }
hunk ./E/Program.hs 19
+data ProgramType = SubProgram Bool | MainProgram
+
hunk ./E/Program.hs 33
+    progType    :: ProgramType,
hunk ./E/Program.hs 50
+    progType = MainProgram,
hunk ./Main.hs 333
-    let fint (rec,ns) = do
-        let names = [ n | (n,_) <- ns]
+    let fint mprog' = do
+        let names = [ n | (n,_) <- programDs mprog']
hunk ./Main.hs 337
-        let mprog = programSetDs ns prog {
-            progStats = mempty,
-            progClosed = True,
-            progEntryPoints = fsts ns,
-            progExternalNames = progExternalNames prog `mappend` (fromList $ map tvrIdent $ fsts (programDs prog))
-            }
+        let mprog = mprog' { progClosed = True }
hunk ./Main.hs 366
-        wdump FD.Progress $ putErr (if rec then "*" else ".")
-        return (programDs mprog)
+        wdump FD.Progress $ let SubProgram rec = progType mprog in  putErr (if rec then "*" else ".")
+        return mprog
hunk ./Main.hs 372
-    prog <- programMapRecGroups initMap (const return) (const return) (const return) fint prog
+    prog <- programMapProgGroups initMap  fint prog
hunk ./Main.hs 420
-        --cds <- E.Strictness.solveDs cds
hunk ./Main.hs 429
-        -- cds <- E.Strictness.solveDs cds
hunk ./Main.hs 431
-        --cds' <- return $ concatMap (uncurry (workWrap fullDataTable)) cds