    {-# OPTIONS_HADDOCK not-home #-}
    module Hedgehog.Internal.Exception (
        tryAll
      , tryEvaluate
      ) where

    import           Control.Exception (Exception(..), AsyncException, SomeException(..), evaluate)
    import           Control.Exception.Safe (MonadCatch, catch, throwM)

    import           System.IO.Unsafe (unsafePerformIO)

    tryAll :: MonadCatch m => m a -> m (Either SomeException a)
    tryAll :: forall (m :: * -> *) a.
    MonadCatch m =>
    m a -> m (Either SomeException a)
    tryAll m a
    m =
      m (Either SomeException a)
    -> (SomeException -> m (Either SomeException a))
    -> m (Either SomeException a)
    forall (m :: * -> *) e a.
    (HasCallStack, MonadCatch m, Exception e) =>
    m a -> (e -> m a) -> m a
    catch ((a -> Either SomeException a) -> m a -> m (Either SomeException a)
    forall a b. (a -> b) -> m a -> m b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap a -> Either SomeException a
    forall a b. b -> Either a b
    Right m a
    m) ((SomeException -> m (Either SomeException a))
     -> m (Either SomeException a))
    -> (SomeException -> m (Either SomeException a))
    -> m (Either SomeException a)
    forall a b. (a -> b) -> a -> b
    $ \SomeException
    exception ->
        case SomeException -> Maybe AsyncException
    forall e. Exception e => SomeException -> Maybe e
    fromException SomeException
    exception :: Maybe AsyncException of
          Maybe AsyncException
    Nothing ->
            Either SomeException a -> m (Either SomeException a)
    forall a. a -> m a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (Either SomeException a -> m (Either SomeException a))
    -> Either SomeException a -> m (Either SomeException a)
    forall a b. (a -> b) -> a -> b
    $ SomeException -> Either SomeException a
    forall a b. a -> Either a b
    Left SomeException
    exception
          Just AsyncException
    async ->
            AsyncException -> m (Either SomeException a)
    forall (m :: * -> *) e a.
    (HasCallStack, MonadThrow m, Exception e) =>
    e -> m a
    throwM AsyncException
    async

    tryEvaluate :: a -> Either SomeException a
    tryEvaluate :: forall a. a -> Either SomeException a
    tryEvaluate a
    x =
      IO (Either SomeException a) -> Either SomeException a
    forall a. IO a -> a
    unsafePerformIO (IO a -> IO (Either SomeException a)
    forall (m :: * -> *) a.
    MonadCatch m =>
    m a -> m (Either SomeException a)
    tryAll (a -> IO a
    forall a. a -> IO a
    evaluate a
    x))