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 #-}