{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE Safe #-}
module Base.CompileError (
CompileErrorM(..),
(<??),
(??>),
(<!!),
(!!>),
collectAllM_,
collectFirstM_,
errorFromIO,
isCompileErrorM,
isCompileSuccessM,
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
collectAllM :: Foldable f => f (m a) -> m [a]
collectAnyM :: Foldable f => f (m a) -> m [a]
collectFirstM :: Foldable f => f (m a) -> m a
withContextM :: m a -> String -> m a
withContextM m a
c String
_ = m a
c
summarizeErrorsM :: m a -> String -> m a
summarizeErrorsM m a
e String
_ = m a
e
compileWarningM :: String -> m ()
compileWarningM String
_ = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
compileBackgroundM :: String -> m ()
compileBackgroundM String
_ = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
resetBackgroundM :: m a -> m a
resetBackgroundM = m a -> m a
forall a. a -> a
id
(<??) :: CompileErrorM m => m a -> String -> m a
<?? :: m a -> String -> m a
(<??) = m a -> String -> m a
forall (m :: * -> *) a. CompileErrorM m => m a -> String -> m a
withContextM
(??>) :: CompileErrorM m => String -> m a -> m a
??> :: String -> m a -> m a
(??>) = (m a -> String -> m a) -> String -> m a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip m a -> String -> m a
forall (m :: * -> *) a. CompileErrorM m => m a -> String -> m a
withContextM
(<!!) :: CompileErrorM m => m a -> String -> m a
<!! :: m a -> String -> m a
(<!!) = m a -> String -> m a
forall (m :: * -> *) a. CompileErrorM m => m a -> String -> m a
summarizeErrorsM
(!!>) :: CompileErrorM m => String -> m a -> m a
!!> :: String -> m a -> m a
(!!>) = (m a -> String -> m a) -> String -> m a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip m a -> String -> m a
forall (m :: * -> *) a. CompileErrorM m => m a -> String -> m a
summarizeErrorsM
collectAllM_ :: (Foldable f, CompileErrorM m) => f (m a) -> m ()
collectAllM_ :: f (m a) -> m ()
collectAllM_ = ([a] -> ()) -> m [a] -> m ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> [a] -> ()
forall a b. a -> b -> a
const ()) (m [a] -> m ()) -> (f (m a) -> m [a]) -> f (m a) -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f (m a) -> m [a]
forall (m :: * -> *) (f :: * -> *) a.
(CompileErrorM m, Foldable f) =>
f (m a) -> m [a]
collectAllM
collectFirstM_ :: (Foldable f, CompileErrorM m) => f (m a) -> m ()
collectFirstM_ :: f (m a) -> m ()
collectFirstM_ = (a -> ()) -> m a -> m ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> a -> ()
forall a b. a -> b -> a
const ()) (m a -> m ()) -> (f (m a) -> m a) -> f (m a) -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f (m a) -> m a
forall (m :: * -> *) (f :: * -> *) a.
(CompileErrorM m, Foldable f) =>
f (m a) -> m a
collectFirstM
mapErrorsM :: CompileErrorM m => (a -> m b) -> [a] -> m [b]
mapErrorsM :: (a -> m b) -> [a] -> m [b]
mapErrorsM a -> m b
f = [m b] -> m [b]
forall (m :: * -> *) (f :: * -> *) a.
(CompileErrorM m, Foldable f) =>
f (m a) -> m [a]
collectAllM ([m b] -> m [b]) -> ([a] -> [m b]) -> [a] -> m [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m b) -> [a] -> [m b]
forall a b. (a -> b) -> [a] -> [b]
map a -> m b
f
mapErrorsM_ :: CompileErrorM m => (a -> m b) -> [a] -> m ()
mapErrorsM_ :: (a -> m b) -> [a] -> m ()
mapErrorsM_ a -> m b
f = [m b] -> m ()
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, CompileErrorM m) =>
f (m a) -> m ()
collectAllM_ ([m b] -> m ()) -> ([a] -> [m b]) -> [a] -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m b) -> [a] -> [m b]
forall a b. (a -> b) -> [a] -> [b]
map a -> m b
f
isCompileErrorM :: CompileErrorM m => m a -> m Bool
isCompileErrorM :: m a -> m Bool
isCompileErrorM m a
x = [m Bool] -> m Bool
forall (m :: * -> *) (f :: * -> *) a.
(CompileErrorM m, Foldable f) =>
f (m a) -> m a
collectFirstM [m a
x m a -> m Bool -> m Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False,Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True]
isCompileSuccessM :: CompileErrorM m => m a -> m Bool
isCompileSuccessM :: m a -> m Bool
isCompileSuccessM m a
x = [m Bool] -> m Bool
forall (m :: * -> *) (f :: * -> *) a.
(CompileErrorM m, Foldable f) =>
f (m a) -> m a
collectFirstM [m a
x m a -> m Bool -> m Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True,Bool -> m Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False]
errorFromIO :: (MonadIO m, CompileErrorM m) => IO a -> m a
errorFromIO :: IO a -> m a
errorFromIO IO a
x = do
Either String a
x' <- IO (Either String a) -> m (Either String a)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either String a) -> m (Either String a))
-> IO (Either String a) -> m (Either String a)
forall a b. (a -> b) -> a -> b
$ (a -> Either String a) -> IO a -> IO (Either String a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either String a
forall a b. b -> Either a b
Right IO a
x IO (Either String a)
-> (IOError -> IO (Either String a)) -> IO (Either String a)
forall a. IO a -> (IOError -> IO a) -> IO a
`catchIOError` (Either String a -> IO (Either String a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String a -> IO (Either String a))
-> (IOError -> Either String a) -> IOError -> IO (Either String a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String a
forall a b. a -> Either a b
Left (String -> Either String a)
-> (IOError -> String) -> IOError -> Either String a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IOError -> String
forall a. Show a => a -> String
show)
case Either String a
x' of
(Right a
x2) -> a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x2
(Left String
e) -> String -> m a
forall (m :: * -> *) a. CompileErrorM m => String -> m a
compileErrorM String
e