module DDC.Core.Simplifier.Recipe
(
idsimp
, anonymize
, snip
, snipOver
, flatten
, beta
, betaLets
, prune
, forward
, bubble
, elaborate
, anormalize
, rewriteSimp)
where
import DDC.Core.Simplifier.Base
import DDC.Core.Transform.Namify
import qualified DDC.Core.Transform.Snip as Snip
import qualified DDC.Core.Transform.Beta as Beta
import DDC.Type.Env
import Data.Monoid
idsimp :: Simplifier s a n
idsimp = Trans Id
anonymize :: Simplifier s a n
anonymize = Trans Anonymize
snip :: Simplifier s a n
snip = Trans (Snip Snip.configZero)
snipOver :: Simplifier s a n
snipOver = Trans (Snip Snip.configZero { Snip.configSnipOverApplied = True })
flatten :: Simplifier s a n
flatten = Trans Flatten
beta :: Simplifier s a n
beta = Trans (Beta Beta.configZero)
betaLets :: Simplifier s a n
betaLets = Trans (Beta Beta.configZero { Beta.configBindRedexes = True })
prune :: Simplifier s a n
prune = Trans Prune
forward :: Simplifier s a n
forward = Trans Forward
bubble :: Simplifier s a n
bubble = Trans Bubble
elaborate :: Simplifier s a n
elaborate = Trans Elaborate
anormalize
:: (KindEnv n -> Namifier s n)
-> (TypeEnv n -> Namifier s n)
-> Simplifier s a n
anormalize namK namT
= snip
<> Trans Flatten
<> Trans (Namify namK namT)
rewriteSimp
:: Int
-> NamedRewriteRules a n
-> Simplifier s a n
rewriteSimp maxIters rules
= let rewrite = Trans $ Rewrite rules
in Fix maxIters (rewrite <> bubble <> betaLets)