pipes-2.4.0: Control/Proxy/Trans.hs
{-| You can define your own extensions to the 'Proxy' type by writing your own
\"proxy transformers\". Proxy transformers are monad transformers that
correctly lift 'Proxy' composition from the base monad. Stack multiple
proxy transformers to chain features together. -}
module Control.Proxy.Trans (
-- * Proxy Transformers
ProxyTrans(..)
)where
import Control.Proxy.Class
{-| 'mapP' defines a functor that preserves 'Proxy' composition and Kleisli
composition.
Laws:
* Functor between 'Proxy' categories
> mapP (f <-< g) = mapP f <-< mapP g
> mapP idT = idT
* Functor between Kleisli categories
> mapP (f <=< g) = mapP f <=< mapP g
> mapP return = return
Minimal complete definition: 'mapP' or 'liftP'. Defining 'liftP' is more
efficient.
-}
class ProxyTrans t where
liftP :: (Monad (p b c d e m), Channel p)
=> p b c d e m r -> t p b c d e m r
liftP f = mapP (\() -> f) ()
mapP :: (Monad (p b c d e m), Channel p)
=> (a -> p b c d e m r) -> (a -> t p b c d e m r)
mapP = (liftP .)