-- | Default imports for the "Control.Proxy" hierarchy

module Control.Proxy.Core (
    -- * Modules
    -- $modules
    module Control.Proxy.Class,
    module Control.Proxy.Synonym,
    module Control.Proxy.Prelude,
    module Control.Proxy.Trans,
    module Control.Proxy.Trans.Identity,
    module Control.Proxy.ListT,
    module Control.Proxy.Morph,
    module Control.Monad,
    module Control.Monad.Trans.Class,
    module Control.Monad.Morph,
    ) where

import Control.Monad.Morph (MFunctor(hoist))
import Control.Monad (forever, (>=>), (<=<))
import Control.Monad.Trans.Class (MonadTrans(lift))
import Control.Proxy.Class
import Control.Proxy.ListT
import Control.Proxy.Morph
import Control.Proxy.Synonym
import Control.Proxy.Trans
import Control.Proxy.Trans.Identity
import Control.Proxy.Prelude

{- $modules
    "Control.Proxy.Class" defines the 'Proxy' type class that lets you program
    generically over proxy implementations and their transformers.

    "Control.Proxy.Synonym" defines type synonyms for proxies that don't use all
    of their inputs or outputs, such as 'Pipe's, 'Producer's, and 'Server's.

    "Control.Proxy.Prelude" provides a standard library of proxies.

    "Control.Proxy.Trans" defines the 'ProxyTrans' type class that lets you
    write your own proxy extensions.

    "Control.Proxy.Trans.Identity" exports 'runIdentityP', which substantially
    eases writing completely polymorphic proxies.

    "Control.Proxy.ListT" defines a generalized @ListT@ monad transformer that
    can interconvert with proxies.

    "Control.Proxy.Morph" exports 'hoistP'.

    "Control.Monad" exports 'forever', ('>=>'), and ('<=<').

    "Control.Monad.Trans.Class" exports 'lift'.

    "Control.Monad.Morph" exports 'hoist'.