module Hedgehog.Internal.Exception (
tryAll
, tryEvaluate
) where
import Control.Exception (Exception(..), AsyncException, SomeException(..), evaluate)
import Control.Monad.Catch (MonadCatch(..), throwM)
import System.IO.Unsafe (unsafePerformIO)
tryAll :: MonadCatch m => m a -> m (Either SomeException a)
tryAll m =
catch (fmap Right m) $ \exception ->
case fromException exception :: Maybe AsyncException of
Nothing ->
pure $ Left exception
Just async ->
throwM async
tryEvaluate :: a -> Either SomeException a
tryEvaluate x =
unsafePerformIO (tryAll (evaluate x))