-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Use template Haskell to generate Uniplate-like functions.
--   
--   Use template Haskell to generate Uniplate-like functions.
@package geniplate
@version 0.6.0.3

module Data.Generics.Geniplate

-- | Generate TH code for a function that extracts all subparts of a
--   certain type. The argument to genUniverseBi is a name with the
--   type S -> [T], for some types S and T.
--   The function will extract all subparts of type T from
--   S.
genUniverseBi :: Name -> Q Exp

-- | Same as genUniverseBi, but does not look inside any types
--   mention in the list of types.
genUniverseBiT :: [TypeQ] -> Name -> Q Exp

-- | Generate TH code for a function that transforms all subparts of a
--   certain type. The argument to genTransformBi is a name with the
--   type (S->S) -> T -> T, for some types S and
--   T. The function will transform all subparts of type
--   S inside T using the given function.
genTransformBi :: Name -> Q Exp

-- | Same as genTransformBi, but does not look inside any types
--   mention in the list of types.
genTransformBiT :: [TypeQ] -> Name -> Q Exp
genTransformBiM :: Name -> Q Exp
genTransformBiMT :: [TypeQ] -> Name -> Q Exp

-- | Class for universeBi.
class UniverseBi s t
universeBi :: UniverseBi s t => s -> [t]
universe :: UniverseBi a a => a -> [a]

-- | Create a UniverseBi instance. The TypeQ argument should
--   be a pair; the source and target types for
--   universeBi.
instanceUniverseBi :: TypeQ -> Q [Dec]

-- | Create a UniverseBi instance with certain types being abstract.
--   The TypeQ argument should be a pair; the source and
--   target types for universeBi.
instanceUniverseBiT :: [TypeQ] -> TypeQ -> Q [Dec]

-- | Class for transformBi.
class TransformBi s t
transformBi :: TransformBi s t => (s -> s) -> t -> t
transform :: TransformBi a a => (a -> a) -> a -> a

-- | Create a TransformBi instance. The TypeQ argument should
--   be a pair; the inner and outer types for
--   transformBi.
instanceTransformBi :: TypeQ -> Q [Dec]

-- | Create a TransformBi instance with certain types being
--   abstract. The TypeQ argument should be a pair; the inner
--   and outer types for transformBi.
instanceTransformBiT :: [TypeQ] -> TypeQ -> Q [Dec]

-- | Class for transformBiM.
class TransformBiM m s t
transformBiM :: TransformBiM m s t => (s -> m s) -> t -> m t
transformM :: TransformBiM m a a => (a -> m a) -> a -> m a

-- | Create a TransformBiM instance.
instanceTransformBiM :: TypeQ -> TypeQ -> Q [Dec]

-- | Create a TransformBiM instance with certain types being
--   abstract.
instanceTransformBiMT :: [TypeQ] -> TypeQ -> TypeQ -> Q [Dec]
instance Quasi U
