pipes-errors-0.3: Pipes/Lift/ExceptRT.hs
module Pipes.Lift.ExceptRT where
import Control.Monad ((>=>))
import Pipes (Proxy, lift)
import Pipes.Lift (distribute)
import Pipes.Internal (unsafeHoist)
import Control.Error
( ExceptT(..)
, ExceptRT(..)
, runExceptT
, runExceptRT
, flipET
, flipEither
)
import Pipes.Lift.ExceptT
-- | Turn 'ExceptT' in the base monad into 'ExceptRT'
exceptRP :: Monad m
=> Proxy a' a b' b (ExceptT e m) r
-> Proxy a' a b' b (ExceptRT r m) e
exceptRP = unsafeHoist lift . runExceptP
>=> lift . ExceptRT . ExceptT . return
{-# INLINABLE exceptRP #-}
-- | Turn 'ExceptRT' in the base monad into 'ExceptT'
runExceptRP :: Monad m
=> Proxy a' a b' b (ExceptRT r m) e
-> Proxy a' a b' b (ExceptT e m) r
runExceptRP = unsafeHoist lift . runExceptT . flipET . runExceptRT . distribute
>=> lift . ExceptT . return . flipEither
{-# INLINABLE runExceptRP #-}