    {-# LANGUAGE MultiParamTypeClasses #-}

    {- |
        /DEPRECATED/: Use "Data.Generics.Uniplate.Operations" instead.

        Requires multi-parameter type classes, so is no longer Haskell 98. These operations
        are easier to use and construct than the equivalent "Data.Generics.UniplateStrOn" methods,
        but perform the same operation.

        It is recommended that instead of importing this module, you import one of the following
        modules, to construct instances:

        * "Data.Generics.PlateDirect" - does not require overlapping instances, highest performance
        but requires /O(n^2)/ instances in the worst case.

        * "Data.Generics.PlateTypeable" - requires the "Data.Typeable" class for all data structures.

        * "Data.Generics.PlateData" - requires "Data.Generics" and the 'Data' class, which is only
        available on GHC, but automatically infers instances.
    -}

    module Data.Generics.Biplate
        {- DEPRECATED "Use Data.Generics.Uniplate.Operations instead" -}
        (
        module Data.Generics.UniplateStrOn,
        module Data.Generics.Biplate
        ) where

    import Data.Generics.UniplateStrOn

    -- * The Class

    -- | Children are defined as the top-most items of type to
    --   /starting at the root/.
    class Uniplate to => Biplate from to where
        biplate :: BiplateType from to

    -- | Compatibility method, for direct users of the 'biplate' function
    biplateList :: Biplate from to => from -> ([to], [to] -> from)
    biplateList x = (c, b . d)
        where
            (a,b) = biplate x
            (c,d) = strStructure a

    -- * The Operations

    -- ** Queries

    universeBi :: Biplate from to => from -> [to]
    universeBi = universeOn biplate

    childrenBi :: Biplate from to => from -> [to]
    childrenBi = childrenOn biplate

    -- ** Transformations

    transformBi :: Biplate from to => (to -> to) -> from -> from
    transformBi = transformOn biplate

    transformBiM :: (Monad m, Biplate from to) => (to -> m to) -> from -> m from
    transformBiM = transformOnM biplate

    rewriteBi :: Biplate from to => (to -> Maybe to) -> from -> from
    rewriteBi = rewriteOn biplate

    rewriteBiM :: (Monad m, Biplate from to) => (to -> m (Maybe to)) -> from -> m from
    rewriteBiM = rewriteOnM biplate

    descendBi :: Biplate from to => (to -> to) -> from -> from
    descendBi = descendOn biplate

    descendBiM :: (Monad m, Biplate from to) => (to -> m to) -> from -> m from
    descendBiM = descendOnM biplate

    -- ** Others

    contextsBi:: Biplate from to => from -> [(to, to -> from)]
    contextsBi = contextsOn biplate

    holesBi:: Biplate from to => from -> [(to, to -> from)]
    holesBi = holesOn biplate