bdcs-0.1.0: src/BDCS/Utils/Error.hs
-- |
-- Module: BDCS.Utils.Error
-- Copyright: (c) 2016-2017 Red Hat, Inc.
-- License: LGPL
--
-- Maintainer: https://github.com/weldr
-- Stability: alpha
-- Portability: portable
--
-- Functions to help with errors
module BDCS.Utils.Error(errorToEither,
errorToMaybe,
mapError)
where
import Control.Monad.Except(ExceptT(..), MonadError, catchError, runExceptT, throwError)
-- | Convert an error action into an Either
-- This is essentially 'runExceptT' generalized to 'MonadError'
errorToEither :: MonadError e m => m a -> m (Either e a)
errorToEither action = (Right <$> action) `catchError` (return . Left)
-- | Convert an error into into nothing
errorToMaybe :: MonadError e m => m a -> m (Maybe a)
errorToMaybe action = (Just <$> action) `catchError` (const . return) Nothing
-- | Run an 'ExceptT' action. On error, run a supplied function to convert the error into
-- some type that can be thrown with 'throwError' in 'MonadError'. On success, simply
-- return the value of the action.
mapError :: MonadError e' m => (e -> e') -> ExceptT e m a -> m a
mapError f action = runExceptT action >>= either (throwError . f) return