-- 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 <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

-- | Same as <a>genUniverseBi</a>, 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 <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

-- | Same as <a>genTransformBi</a>, 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 <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]
instance Quasi U
