module Database.Algebra.Rewrite.Rule
( Rule
, RuleSet
, applyRuleSet ) where
import Database.Algebra.Dag.Common
import Database.Algebra.Rewrite.DagRewrite
import Database.Algebra.Rewrite.Match
type Rule o p e = AlgNode -> Match o p e (Rewrite o e ())
type RuleSet o p e = [Rule o p e]
applyRuleSet :: e -> NodeMap p -> RuleSet o p e -> AlgNode -> Rewrite o e Bool
applyRuleSet e pm rules q = do
d <- exposeDag
let aux [] = return False
aux (rule:rs) = case runMatch e d pm (rule q) of
Just rewrite -> rewrite >> return True
Nothing -> aux rs
aux rules