diff --git a/Makefile.am b/Makefile.am index f8498ca..8fbd701 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,6 +19,7 @@ GHC_OPTS = \ -iflow \ -ifrontends \ -ipass \ + -ipolyplate \ -ipregen \ -itransformations @@ -188,6 +189,8 @@ tock_SOURCES_hs += pass/Pass.hs tock_SOURCES_hs += pass/PassList.hs tock_SOURCES_hs += pass/Properties.hs tock_SOURCES_hs += pass/Traversal.hs +tock_SOURCES_hs += polyplate/Data/Generics/Polyplate.hs +tock_SOURCES_hs += polyplate/Data/Generics/Polyplate/Schemes.hs tock_SOURCES_hs += transformations/ImplicitMobility.hs tock_SOURCES_hs += transformations/SimplifyAbbrevs.hs tock_SOURCES_hs += transformations/SimplifyComms.hs diff --git a/polyplate/Data/Generics/Polyplate.hs b/polyplate/Data/Generics/Polyplate.hs index 4438fc2..3af371e 100644 --- a/polyplate/Data/Generics/Polyplate.hs +++ b/polyplate/Data/Generics/Polyplate.hs @@ -31,7 +31,9 @@ module Data.Generics.Polyplate (PolyplateM(..), Polyplate(..), makeRecurseM, RecurseM, makeDescendM, DescendM, BaseOp, baseOp, - ExtOpM, extOp, OneOpM) where + ExtOpM, extOpM, ExtOp, extOp, OneOpM, OneOp, TwoOpM, TwoOp) where + +import Control.Monad.Identity -- | The main Polyplate type-class. -- @@ -90,20 +92,20 @@ class Polyplate t o o' where transform :: o -> o' -> t -> t instance (PolyplateM t mo mo' Identity, ConvertOpsToIdentity o mo, ConvertOpsToIdentity o' mo') => Polyplate t o o' where - transform o o' t = runIdentity (transformM o o' t) + transform o o' t = runIdentity (transformM (convertOpsToIdentity o) (convertOpsToIdentity o') t) -- | A type representing a recursive monadic modifier function that applies the given ops -- (in the given monad) directly to the given type. -type RecurseM m opT = forall t. Polyplate t opT () m => t -> m t +type RecurseM m opT = forall t. PolyplateM t opT () m => t -> m t -- | Given a set of operations (as described in the 'PolyplateM' type-class), -- makes a recursive modifier function. -makeRecurseM :: Monad m => opT -> Recurse m opT +makeRecurseM :: Monad m => opT -> RecurseM m opT makeRecurseM ops = transformM ops () -type DescendM m opT = forall t. Polyplate t () opT m => t -> m t +type DescendM m opT = forall t. PolyplateM t () opT m => t -> m t -makeDescendM :: Monad m => opT -> Descend m opT +makeDescendM :: Monad m => opT -> DescendM m opT makeDescendM ops = transformM () ops -- | The type of the empty set of operations @@ -138,10 +140,10 @@ extOp ops f = (f, ops) -- | A handy synonym for an ops set with only one item. type OneOpM m t = ExtOpM m BaseOp t -- | A handy synonym for an ops set with only one item. -type OneOp t = ExtOpM m BaseOp t +type OneOp t = ExtOp BaseOp t -- | A handy synonym for an ops set with only two items. type TwoOpM m s t = ExtOpM m (ExtOpM m BaseOp s) t -- | A handy synonym for an ops set with only two items. -type TwoOp s t = ExtOpM (ExtOp BaseOp s) t +type TwoOp s t = ExtOp (ExtOp BaseOp s) t diff --git a/polyplate/Data/Generics/Polyplate/Schemes.hs b/polyplate/Data/Generics/Polyplate/Schemes.hs index a44e4b8..ac05630 100644 --- a/polyplate/Data/Generics/Polyplate/Schemes.hs +++ b/polyplate/Data/Generics/Polyplate/Schemes.hs @@ -19,6 +19,7 @@ with this program. If not, see . module Data.Generics.Polyplate.Schemes where +import Data.Generics.Polyplate -- | Given a list of operations and a modifier function, augments that modifier -- function to first descend into the value before then applying the modifier function. @@ -27,7 +28,7 @@ module Data.Generics.Polyplate.Schemes where makeBottomUpM :: PolyplateM t () opT m => opT -> (t -> m t) -> t -> m t makeBottomUpM ops f v = descend v >>= f where - descend = makeDescend ops + descend = makeDescendM ops -- | Given a list of operations and a modifier function, augments that modifier -- function to first apply the modifier function before then descending into the value. @@ -36,7 +37,7 @@ makeBottomUpM ops f v = descend v >>= f makeTopDownM :: PolyplateM t () opT m => opT -> (t -> m t) -> t -> m t makeTopDownM ops f v = f v >>= descend where - descend = makeDescend ops + descend = makeDescendM ops -- | Given a list of operations and a modifier function, augments that modifier -- function to first descend into the value before then applying the modifier function.