{-# LANGUAGE ScopedTypeVariables #-} module Util where import Control.Monad.Trans import Control.Monad.Trans.Either -- mapLeft :: (a -> c) -> Either a b -> Either c b -- mapLeft f (Left x) = Left (f x) -- mapLeft _ (Right x) = Right x maybeToEither :: e -> Maybe v -> Either e v maybeToEither _ (Just x) = Right x maybeToEither e Nothing = Left e maybeToEitherT :: Monad m => e -> Maybe a -> EitherT e m a maybeToEitherT x y = hoistEither $ maybeToEither x y ioEither :: (Monad m) => m (Either l r) -> EitherT l m r ioEither action = do result <- lift action hoistEither result