-- 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.
--   
--   This is a maintained mirror of the geniplate package, written
--   by Lennart Augustsson.
@package geniplate-mirror
@version 0.7.9

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
genUniverseBi' :: TypeQ -> Q Exp

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

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

-- | Class for descendBiM.
class DescendBiM m s t
descendBiM :: DescendBiM m s t => (s -> m s) -> t -> m t

-- | Create a DescendBiM instance.
instanceDescendBiM :: TypeQ -> TypeQ -> Q [Dec]

-- | Create a DescendBiM instance with certain types being abstract.
instanceDescendBiMT :: [TypeQ] -> TypeQ -> TypeQ -> Q [Dec]

-- | Class for descendM.
class DescendM m t
descendM :: DescendM m t => (t -> m t) -> t -> m t
descend :: DescendM Identity a => (a -> a) -> a -> a

-- | Create a DescendBiM instance.
instanceDescendM :: TypeQ -> TypeQ -> Q [Dec]

-- | Create a DescendBiM instance with certain types being abstract.
instanceDescendMT :: [TypeQ] -> TypeQ -> TypeQ -> Q [Dec]
instance GHC.Show.Show Data.Generics.Geniplate.Mode
instance GHC.Classes.Ord Data.Generics.Geniplate.Mode
instance GHC.Classes.Eq Data.Generics.Geniplate.Mode
instance Language.Haskell.TH.Syntax.Quasi Data.Generics.Geniplate.U
