-- 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 <a>geniplate</a> package, written
--   by Lennart Augustsson.
@package geniplate-mirror
@version 0.7.4

module Data.Generics.Geniplate

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

-- | Same as <a>genUniverseBi</a>, 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 <a>genTransformBi</a> is a name with the
--   type <tt>(S-&gt;S) -&gt; T -&gt; T</tt>, for some types <tt>S</tt> and
--   <tt>T</tt>. The function will transform all subparts of type
--   <tt>S</tt> inside <tt>T</tt> using the given function.
genTransformBi :: Name -> Q Exp
genTransformBi' :: TypeQ -> Q Exp

-- | Same as <a>genTransformBi</a>, 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 <a>universeBi</a>.
class UniverseBi s t
universeBi :: UniverseBi s t => s -> [t]
universe :: (UniverseBi a a) => a -> [a]

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

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

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

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

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

-- | Class for <a>transformBiM</a>.
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 <a>TransformBiM</a> instance.
instanceTransformBiM :: TypeQ -> TypeQ -> Q [Dec]

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

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

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

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

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

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

-- | Create a <a>DescendBiM</a> 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
