{-# LANGUAGE Safe #-}
module Data.Either.Utils
(
maybeToEither,
forceEither,
forceEitherMsg,
eitherToMonadError,
fromLeft, fromRight, fromEither
) where
import Control.Monad.Error
maybeToEither :: MonadError e m =>
e
-> Maybe a
-> m a
maybeToEither :: e -> Maybe a -> m a
maybeToEither errorval :: e
errorval Nothing = e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError e
errorval
maybeToEither _ (Just normalval :: a
normalval) = a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
normalval
forceEither :: Show e => Either e a -> a
forceEither :: Either e a -> a
forceEither (Left x :: e
x) = [Char] -> a
forall a. HasCallStack => [Char] -> a
error (e -> [Char]
forall a. Show a => a -> [Char]
show e
x)
forceEither (Right x :: a
x) = a
x
forceEitherMsg :: Show e => String -> Either e a -> a
forceEitherMsg :: [Char] -> Either e a -> a
forceEitherMsg msg :: [Char]
msg (Left x :: e
x) = [Char] -> a
forall a. HasCallStack => [Char] -> a
error ([Char] -> a) -> [Char] -> a
forall a b. (a -> b) -> a -> b
$ [Char]
msg [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ ": " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ e -> [Char]
forall a. Show a => a -> [Char]
show e
x
forceEitherMsg _ (Right x :: a
x) = a
x
eitherToMonadError :: MonadError e m => Either e a -> m a
eitherToMonadError :: Either e a -> m a
eitherToMonadError (Left x :: e
x) = e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError e
x
eitherToMonadError (Right x :: a
x) = a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
fromLeft :: Either a b -> a
fromLeft :: Either a b -> a
fromLeft (Left a :: a
a) = a
a
fromLeft _ = [Char] -> a
forall a. HasCallStack => [Char] -> a
error "Data.Either.Utils.fromLeft: Right"
fromRight :: Either a b -> b
fromRight :: Either a b -> b
fromRight (Right a :: b
a) = b
a
fromRight _ = [Char] -> b
forall a. HasCallStack => [Char] -> a
error "Data.Either.Utils.fromRight: Left"
fromEither :: Either a a -> a
fromEither :: Either a a -> a
fromEither (Left a :: a
a) = a
a
fromEither (Right a :: a
a) = a
a