module Control.Monad.TaggedException.Hidden
(
HiddenException(..)
, hideWith
, throwHidden
, throw'
)
where
import Control.Exception (Exception)
import qualified Control.Exception as E
#if MIN_VERSION_base(4,8,0)
( AllocationLimitExceeded
, ArithException
#else
( ArithException
#endif
, ArrayException
, AssertionFailed
, AsyncException
#if MIN_VERSION_base(4,2,0)
, BlockedIndefinitelyOnMVar
, BlockedIndefinitelyOnSTM
#else
, BlockedIndefinitely
, BlockedOnDeadMVar
#endif
, Deadlock
, ErrorCall
, IOException
, NestedAtomically
, NoMethodError
, NonTermination
, PatternMatchFail
, RecConError
, RecSelError
, RecUpdError
#if MIN_VERSION_base(4,7,0)
, SomeAsyncException
#endif
, SomeException
#if MIN_VERSION_base(4,9,0)
, TypeError
#endif
)
import Data.Dynamic (Dynamic)
import Data.Function ((.))
#if MIN_VERSION_base(4,8,0)
import Data.Void (Void)
#endif
import System.Exit (ExitCode)
import Control.Monad.Catch (MonadCatch, MonadThrow)
import qualified Control.Monad.Catch as Exceptions
( MonadCatch(catch)
, MonadThrow(throwM)
)
import Control.Monad.TaggedException.Internal.Throws (Throws(Throws))
import qualified Control.Monad.TaggedException.Internal.Throws as Internal
(Throws(hideException))
class Exception e => HiddenException e where
hideException :: MonadThrow m => Throws e m a -> m a
hideException = Internal.hideException
instance HiddenException Dynamic
instance HiddenException E.ArithException
instance HiddenException E.ArrayException
instance HiddenException E.AssertionFailed
instance HiddenException E.AsyncException
instance HiddenException E.BlockedIndefinitelyOnMVar
instance HiddenException E.BlockedIndefinitelyOnSTM
instance HiddenException E.Deadlock
instance HiddenException E.ErrorCall
instance HiddenException E.IOException
instance HiddenException E.NestedAtomically
instance HiddenException E.NoMethodError
instance HiddenException E.NonTermination
instance HiddenException E.PatternMatchFail
instance HiddenException E.RecConError
instance HiddenException E.RecSelError
instance HiddenException E.RecUpdError
instance HiddenException E.SomeException
instance HiddenException ExitCode
#if MIN_VERSION_base(4,7,0)
instance HiddenException E.SomeAsyncException
#endif
#if MIN_VERSION_base(4,8,0)
instance HiddenException E.AllocationLimitExceeded
instance HiddenException Void
#endif
#if MIN_VERSION_base(4,9,0)
instance HiddenException E.TypeError
#endif
hideWith
:: (Exception e, HiddenException e', MonadCatch m)
=> (e -> e')
-> Throws e m a
-> m a
hideWith f (Throws ma) = Exceptions.catch ma (Exceptions.throwM . f)
throwHidden
:: (HiddenException e, MonadThrow m)
=> e
-> m a
throwHidden = Exceptions.throwM
throw'
:: (HiddenException e, MonadThrow m)
=> e
-> m a
throw' = Exceptions.throwM