[make more program and annotation routines preserve combinator rules properly.
John Meacham <john@repetae.net>**20080229085553] hunk ./E/Annotate.hs 28
-    let ds' = [ (combHead c,combBody c) | c <- ds]
-    ELetRec { eDefs = ds'', eBody = Unknown } <- annotate imap idann letann lamann (ELetRec ds' Unknown)
-    return [ combBody_s y . combHead_s x $ emptyComb | (x,y) <- ds'']
+
+    cs <- forM ds $ \comb -> do
+        nfo <- letann (combBody comb) (tvrInfo $ combHead comb)
+        nt <- annotate imap idann letann lamann (tvrType  $ combHead comb)
+        return $ combHead_u (tvrInfo_s nfo . tvrType_s nt) comb
+    let nimap = fromList [ (combIdent c, Just . EVar $ combHead c) | c <- cs ] `mappend` imap
+    cs <- forM cs $ \comb -> do
+        rs <- forM (combRules comb) $ \r -> do
+            r' <- annotate nimap idann letann lamann $ ruleBody r
+            return r { ruleBody = r' }
+        nb <- annotate nimap idann letann lamann (combBody comb)
+        return . combRules_s rs . combBody_s nb $ comb
+    return cs
+
+
+    --let ds' = [ (combHead c,combBody c) | c <- ds]
+    --ELetRec { eDefs = ds'', eBody = Unknown } <- annotate imap idann letann lamann (ELetRec ds' Unknown)
+    -- TODO. slow
+    --return [ combBody_s y . combHead_s x $ c | c <- ds, (x,y) <- ds'', x == combHead c]
hunk ./E/Program.hs 66
+progCombinators_u f prog = programUpdate prog { progCombinators = f $ progCombinators prog }
+progCombinators_s cs prog = programUpdate prog { progCombinators = cs }
+
hunk ./E/Program.hs 91
-programAddDs :: [(TVr,E)] -> Program -> Program
-programAddDs ds prog = prog { progCombinators = [ emptyComb { combHead = t, combBody = e } | (t,e) <- ds ] ++ progCombinators prog }
-
hunk ./E/Program.hs 102
+programMapBodies :: Monad m => (E -> m E) -> Program -> m Program
hunk ./E/Program.hs 104
-     ds <- sequence [ f e >>= return . (,) t | (t,e) <- programDs prog ]
-     return $ programSetDs ds prog
+    let f' (t,e) = f e >>= \e' -> return (t,e')
+    programMapDs f' prog
hunk ./E/Program.hs 108
-     ds <- mapM f (programDs prog)
-     return $ programSetDs ds prog
+    cs <- forM (progCombinators prog) $ \comb -> do
+        (t,e) <- f (combHead comb,combBody comb)
+        return . combHead_s t . combBody_s e $ comb
+    return $ progCombinators_s cs prog