module Pipes.Lift.EitherRT where import Control.Monad ((>=>)) import Pipes (Proxy, lift) import Pipes.Lift (distribute) import Pipes.Internal (unsafeHoist) import Control.Error ( EitherT(..) , EitherRT(..) , runEitherT , runEitherRT , flipET , flipE ) import Pipes.Lift.EitherT -- | Turn 'EitherT' in the base monad into 'EitherRT' eitherRP :: Monad m => Proxy a' a b' b (EitherT e m) r -> Proxy a' a b' b (EitherRT r m) e eitherRP = unsafeHoist lift . runEitherP >=> lift . EitherRT . EitherT . return {-# INLINABLE eitherRP #-} -- | Turn 'EitherRT' in the base monad into 'EitherT' runEitherRP :: Monad m => Proxy a' a b' b (EitherRT r m) e -> Proxy a' a b' b (EitherT e m) r runEitherRP = unsafeHoist lift . runEitherT . flipET . runEitherRT . distribute >=> lift . EitherT . return . flipE {-# INLINABLE runEitherRP #-}