pipes-errors-0.2: Pipes/Lift/EitherT.hs
module Pipes.Lift.EitherT where
import Control.Monad ((>=>))
import Pipes (Proxy, lift)
import Pipes.Lift (distribute)
import Pipes.Internal (unsafeHoist)
import Control.Error (EitherT(..), runEitherT, flipE)
import Pipes.Lift.Error.Instances ()
-- | Wrap the base monad in 'EitherT'.
eitherP :: Monad m
=> Proxy a' a b' b m (Either e r)
-> Proxy a' a b' b (EitherT e m) r
eitherP = unsafeHoist lift >=> lift . EitherT . return
{-# INLINABLE eitherP #-}
-- | Run 'EitherT' in the base monad.
runEitherP :: Monad m
=> Proxy a' a b' b (EitherT e m) r
-> Proxy a' a b' b m (Either e r)
runEitherP = runEitherT . distribute
{-# INLINABLE runEitherP #-}
-- | Flip the type variables in the 'EitherT' base monad.
flipEP :: Monad m
=> Proxy a' a b' b (EitherT a m) b
-> Proxy a' a b' b (EitherT b m) a
flipEP = unsafeHoist lift . runEitherT . distribute
>=> lift . EitherT . return . flipE
{-# INLINABLE flipEP #-}