[add routines for mapping over the arguments as well as the body of a rule and for deleting arguments to a rule
John Meacham <john@repetae.net>**20060224064723] hunk ./E/Rules.hs 15
+    mapABodiesArgs,
+    dropArguments,
hunk ./E/Rules.hs 30
+import Maybe
hunk ./E/Rules.hs 42
+import E.Values
hunk ./E/Rules.hs 164
-    return $ ARules $ rs'
+    return $ arules $ rs'
+
+mapABodiesArgs :: Monad m => (E -> m E) -> ARules -> m ARules
+mapABodiesArgs g (ARules rs) = do
+    let f rule = do
+            b <- g (ruleBody rule)
+            as <- mapM g (ruleArgs rule)
+            return rule { ruleArgs = as, ruleBody = b }
+    rs' <- mapM f rs
+    return $ arules $ rs'
+
+-- replace the given arguments with the E values, dropping impossible rules
+dropArguments :: [(Int,E)] -> ARules -> ARules
+dropArguments os (ARules rs) = arules (catMaybes $  map f rs) where
+    f r = do
+        let g (i,a) | Just v <- lookup i os = do
+                rs <- match (const Nothing) (ruleBinds r) a v
+                return (Right rs)
+            g (i,a) = return (Left a)
+        as' <- mapM g $ zip naturals (ruleArgs r)
+        let sb = substLet (concat $ rights as')
+            sa = substMap $ Map.fromList [ (tvrIdent t,v) |  Right ds <- as', (t,v) <- ds ]
+        return r { ruleArgs = map sa (lefts as'), ruleBody = sb (ruleBody r) }