{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE Safe #-}
module Base.CompileError (
CompileErrorM(..),
errorFromIO,
mapErrorsM,
mapErrorsM_,
) where
import Control.Monad.IO.Class
import System.IO.Error (catchIOError)
#if MIN_VERSION_base(4,13,0)
import Control.Monad.Fail ()
#elif MIN_VERSION_base(4,9,0)
import Control.Monad.Fail
#endif
#if MIN_VERSION_base(4,9,0)
class (Monad m, MonadFail m) => CompileErrorM m where
#else
class Monad m => CompileErrorM m where
#endif
compileErrorM :: String -> m a
collectAllOrErrorM :: Foldable f => f (m a) -> m [a]
collectOneOrErrorM :: Foldable f => f (m a) -> m a
reviseErrorM :: m a -> String -> m a
reviseErrorM e _ = e
compileWarningM :: String -> m ()
mapErrorsM :: CompileErrorM m => (a -> m b) -> [a] -> m [b]
mapErrorsM f = collectAllOrErrorM . map f
mapErrorsM_ :: CompileErrorM m => (a -> m b) -> [a] -> m ()
mapErrorsM_ f xs = mapErrorsM f xs >> return ()
errorFromIO :: (MonadIO m, CompileErrorM m) => IO a -> m a
errorFromIO x = do
x' <- liftIO $ fmap Right x `catchIOError` (return . Left . show)
case x' of
(Right x2) -> return x2
(Left e) -> compileErrorM e