packages feed

ribosome-0.2.0.0: lib/Ribosome/Control/Monad/Trans/Unlift.hs

module Ribosome.Control.Monad.Trans.Unlift(
  MonadUnlift(..),
) where

import Control.Monad.Trans.Except (ExceptT, mapExceptT)

class MonadUnlift t where
  unlift :: Monad m => (m a -> m b) -> t m a -> t m b

instance MonadUnlift (ExceptT e) where
  unlift f =
    mapExceptT (>>= trans)
    where
      trans (Left e) = return $ Left e
      trans (Right a) = Right <$> f (return a)