Added `liftEither` for lifting Either into MonadError
authorElvishJerricco <elvishjerricco@gmail.com>
Fri, 8 Jul 2016 16:48:14 +0000 (12:48 -0400)
committerElvishJerricco <elvishjerricco@gmail.com>
Fri, 8 Jul 2016 16:48:14 +0000 (12:48 -0400)
Lifts an @'Either' e@ into any @'MonadError' e@.

> do { val <- liftEither =<< action1; action2 }

where @action1@ returns an 'Either' to represent errors.

Control/Monad/Error/Class.hs
Control/Monad/Except.hs

index 4b8d8fe..e303700 100644 (file)
@@ -38,6 +38,7 @@ The Error monad (also called the Exception monad).
 module Control.Monad.Error.Class (
     Error(..),
     MonadError(..),
+    liftEither,
   ) where
 
 import Control.Monad.Trans.Except (Except, ExceptT)
@@ -64,7 +65,7 @@ import Control.Monad.Instances ()
 #endif
 
 import Data.Monoid
-import Prelude (Either(..), (.), IO)
+import Prelude (Either(..), either, (.), IO)
 
 {- |
 The strategy of combining computations that can throw exceptions
@@ -102,6 +103,16 @@ class (Monad m) => MonadError e m | m -> e where
     {-# MINIMAL throwError, catchError #-}
 #endif
 
+{- |
+Lifts an @'Either' e@ into any @'MonadError' e@.
+
+> do { val <- liftEither =<< action1; action2 }
+
+where @action1@ returns an 'Either' to represent errors.
+-}
+liftEither :: MonadError e m => Either e a -> m a
+liftEither = either throwError return
+
 instance MonadError IOException IO where
     throwError = ioError
     catchError = catch
index 6f28a6e..178927d 100644 (file)
@@ -33,6 +33,7 @@ module Control.Monad.Except
   (
     -- * Monads with error handling
     MonadError(..),
+    liftEither,
     -- * The ExceptT monad transformer
     ExceptT(ExceptT),
     Except,