purescript-0.4.18.2: PureScript Programming Language Compiler

Safe HaskellSafe-Inferred

Data.Generics.Extras

Description

Additional SYB combinators

Synopsis

Documentation

everywhereM' :: (Monad m, Data d) => (forall d1. Data d1 => d1 -> m d1) -> d -> m dSource

Apply a top-down monadic transformation everywhere

everywhereWithContextM' :: (Monad m, Data d) => s -> (forall d1. Data d1 => s -> d1 -> m (s, d1)) -> d -> m dSource

Apply a top-down transformation, mutating a state when descending from parents to children

For example, if we want to relabel bound variables with a different data constructor, we can do so:

 data Expr = Var String
           | Lam String Test
           | App Test Test
           | LocalVar String deriving (Show, Data, Typeable)

 test = App (Lam "a" (App (Var "a") (Var "b"))) (Var "a")

 varsToLocals :: Expr -> Expr
 varsToLocals = everywhereWithContext' [] (mkS go)
   where
   go locals (Var v) | v `elem` locals = (locals, LocalVar v)
   go locals lam@(Lam local _) = (local : locals, lam)
   go locals other = (locals, other)

mkS :: (Monad m, Data a, Data b) => (s -> a -> m (s, a)) -> s -> b -> m (s, b)Source

Make a stateful transformation function

extS :: (Monad m, Data a, Data b) => (s -> a -> m (s, a)) -> (s -> b -> m (s, b)) -> s -> a -> m (s, a)Source

Extend a stateful transformation function