content: {-# 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
  