packages feed

LslPlus-0.3.0: src/Data/Generics/Extras/Schemes.hs

{-# LANGUAGE Rank2Types #-}
module Data.Generics.Extras.Schemes (
    downup,
    everythingTwice
 ) where

------------------------------------------------------------------------------

import Data.Data
import Data.Generics.Aliases
import Control.Monad

everythingTwice :: (r -> r -> r) -> GenericQ r -> GenericQ r -> GenericQ r
everythingTwice k f g x
  = foldl k (f x) (gmapQ (everythingTwice k f g) x) `k` (g x)


downup :: Monad m => GenericM m -> GenericM m -> GenericM m

downup down up x = do x' <- down x
                      x'' <- gmapM (downup down up) x'
                      up x''