pointless-rewrite-0.0.3: src/Transform/Rules/SYB/TP.hs
-----------------------------------------------------------------------------
-- |
-- Module : Transform.Rules.SYB.TP
-- Copyright : (c) 2010 University of Minho
-- License : BSD3
--
-- Maintainer : hpacheco@di.uminho.pt
-- Stability : experimental
-- Portability : non-portable
--
-- Pointless Rewrite:
-- automatic transformation system for point-free programs
--
-- Specialization rules for type-preserving strategy combinators.
--
-----------------------------------------------------------------------------
module Transform.Rules.SYB.TP where
import Data.Type
import Data.Pf
import Data.Eval
import Transform.Rewriting hiding (gmapQ)
import Transform.Rules.PF.Combinators
import Control.Monad
nop_applyT :: Rule
nop_applyT _ (APPLY _ NOP) = success "nop-applyT" ID
nop_applyT _ _ = mzero
seq_applyT :: Rule
seq_applyT _ (APPLY t (SEQ f g)) = success "seq-applyT" (COMP t (APPLY t f) (APPLY t g))
seq_applyT _ _ = mzero
gmapT_applyT :: Rule
gmapT_applyT _ (APPLY Dynamic (ALL f)) = mzero
gmapT_applyT _ (APPLY a (ALL f)) = success "gmapT-applyT" (allT a f)
gmapT_applyT _ _ = mzero
everywhere_applyT :: Rule
everywhere_applyT _ (APPLY a (EVERYWHERE f)) = success "everywhere-applyT" (everywhereT a f)
everywhere_applyT _ (APPLY a (EVERYWHERE' f)) = success "everywhere-applyT" (everywhereT' a f)
everywhere_applyT _ _ = mzero
mkT_applyT :: Rule
mkT_applyT _ (APPLY Dynamic (MKT b f)) = mzero
mkT_applyT _ (APPLY a (MKT b f)) = success "mkT-applyT" (mkT a b f)
mkT_applyT _ _ = mzero
extT_applyT :: Rule
extT_applyT _ (APPLY Dynamic (EXTT f t g)) = mzero
extT_applyT _ (APPLY a (EXTT f t g)) = success "extT-applyT" (extT a f t g)
extT_applyT _ _ = mzero
dyn_applyT, dyn_applyT' :: Rule
dyn_applyT = comp dyn_applyT'
dyn_applyT' (Fun _ _) (COMP _ (APPLY Dynamic f) (MKDYN a)) = success "dyn-ApplyQ" $ COMP a (MKDYN a) $ APPLY a f
dyn_applyT' _ _ = mzero
tp :: Rule
tp = top nop_applyT ||| top seq_applyT
||| top gmapT_applyT ||| top everywhere_applyT
||| top mkT_applyT ||| top extT_applyT ||| top dyn_applyT