[cache free variables inside of ARules structure
John Meacham <john@repetae.net>**20061122055849] hunk ./E/Rules.hs 62
+-- a rule in its user visible form
+
hunk ./E/Rules.hs 92
+-- a collection of rules
+
hunk ./E/Rules.hs 116
-ruleAllFreeVars (Rules r) = freeVars (concatMap (map ruleBody) (melems r))
+ruleAllFreeVars (Rules r) = freeVars (melems r)
hunk ./E/Rules.hs 119
+ruleHeadFreeVars :: Rules -> IdSet
+ruleHeadFreeVars (Rules rs) = unions $ map f (concat $ melems rs) where
+    f r = (S.insert (tvrIdent $ ruleHead r) $ freeVars (ruleArgs r)) S.\\ fromList (map tvrIdent $ ruleBinds r)
hunk ./E/Rules.hs 123
-instance FreeVars Rule b => FreeVars ARules b where
-    freeVars (ARules rs) = freeVars rs
+
+instance FreeVars ARules IdSet where
+    freeVars a = aruleFreeVars a
hunk ./E/Rules.hs 166
-mapABodies g (ARules rs) = do
+mapABodies g ARules { aruleRules = rs } = do
hunk ./E/Rules.hs 174
-mapABodiesArgs g (ARules rs) = do
+mapABodiesArgs g ARules { aruleRules = rs } = do
hunk ./E/Rules.hs 183
-rulesFromARules (ARules rs) = rs
+rulesFromARules = aruleRules
hunk ./E/Rules.hs 186
-mapRules f (ARules rules) = do
+mapRules f ARules { aruleRules = rules } = do
hunk ./E/Rules.hs 192
-dropArguments os (ARules rs) = arules (catMaybes $  map f rs) where
+dropArguments os ARules { aruleRules = rs } = arules (catMaybes $  map f rs) where
hunk ./E/Rules.hs 203
--- | invarients for ARules
+-- | ARules contains a set of rules for a single id, optimized for fast application
+--
+-- invarients for ARules
hunk ./E/Rules.hs 208
+-- free variables are up to date
+
+
+
+data ARules = ARules {
+    aruleFreeVars :: IdSet,
+    aruleRules :: [Rule]
+    }
+    deriving(Typeable)
hunk ./E/Rules.hs 218
-newtype ARules = ARules [Rule]
-    deriving(Show,Typeable)
+instance Show ARules where
+    showsPrec n a = showsPrec n (aruleRules a)
hunk ./E/Rules.hs 221
-arules xs = ARules (sortUnder ruleNArgs (map f xs)) where
+arules xs = ARules { aruleFreeVars = freeVars rs, aruleRules = rs } where
+    rs = sortUnder ruleNArgs (map f xs)
hunk ./E/Rules.hs 233
-    mempty = ARules []
+    mempty = ARules { aruleFreeVars = mempty, aruleRules = [] }
hunk ./E/Rules.hs 237
-joinARules ar@(ARules a) br@(ARules b)
-    | [] <- rs = ARules []
-    | all (== r) rs = ARules (sortUnder (\r -> (ruleNArgs r,ruleUniq r)) (snubUnder ruleUniq $ a ++ b))
+joinARules ar@(ARules fvsa a) br@(ARules fvsb b)
+    | [] <- rs = ARules mempty []
+    | all (== r) rs = ARules (fvsa `mappend` fvsb) (sortUnder (\r -> (ruleNArgs r,ruleUniq r)) (snubUnder ruleUniq $ a ++ b))
hunk ./E/Rules.hs 246
-applyRules lup (ARules rs) xs = f rs where
+applyRules lup (ARules _ rs) xs = f rs where
hunk ./E/SSimplify.hs 212
-    let rvars = freeVars (Info.fetch (tvrInfo t) :: ARules) :: IdMap TVr
-        romap = OMap $ fmap (const noUseInfo) rvars
+    let rvars = freeVars (Info.fetch (tvrInfo t) :: ARules) :: IdSet
+        romap = OMap (idSetToIdMap (const noUseInfo) rvars)