{-| Recommended entry import for this library

    Read "Control.Proxy.Tutorial" for an extended proxy tutorial. -}

module Control.Proxy (
    -- * Modules
    -- $default
    module Control.Proxy.Core,
    module Control.Proxy.Core.Fast
    ) where

import Control.Proxy.Core
import Control.Proxy.Core.Fast hiding (Request, Respond, M, Pure)

{- $default
    "Control.Proxy.Core" exports everything except 'runProxy'.

    This library provides two base proxy implementations, each of which export
    their own 'runProxy' function:

    * "Control.Proxy.Core.Fast": This runs faster for code that is not
      'IO'-bound, but it only obeys the monad transformer laws modulo safe
      observation functions.

    * "Control.Proxy.Core.Correct": This trades speed on pure code segments, but
       strictly preserves the monad transformer laws.

    This module selects the currently recommended implementation (Fast).

    You can switch to the correct implementation by importing
    "Control.Proxy.Core" and "Control.Proxy.Core.Correct".

    You can lock in the fast implementation (in case I change the recommended
    default) by importing "Control.Proxy.Core" and "Control.Proxy.Core.Fast".