-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Catching all exceptions from within an enclosed computation
--   
--   Catching all exceptions raised within an enclosed computation, while
--   remaining responsive to (external) asynchronous exceptions. For more
--   information on the technique, please see:
--   https://www.fpcomplete.com/user/snoyberg/general-haskell/exceptions/catching-all-exceptions
@package enclosed-exceptions
@version 1.0.3

-- | The purpose of this module is to allow you to capture all exceptions
--   originating from within the enclosed computation, while still reacting
--   to asynchronous exceptions aimed at the calling thread.
--   
--   This way, you can be sure that the function that calls, for example,
--   catchAny, will still respond to
--   ThreadKilled or Timeout events
--   raised by another thread (with throwTo), while
--   capturing all exceptions, synchronous or asynchronous, resulting from
--   the execution of the enclosed computation.
--   
--   One particular use case is to allow the safe execution of code from
--   various libraries (which you do not control), capturing any faults
--   that might occur, while remaining responsive to higher level events
--   and control actions.
--   
--   This library was originally developed by Michael Snoyman for the
--   ClassyPrelude library, and was latter 'spun-off' into a
--   separate independent package.
--   
--   For a more detailed explanation of the motivation behind this
--   functions, see:
--   
--   
--   https://www.fpcomplete.com/user/snoyberg/general-haskell/exceptions/catching-all-exceptions
--   
--   and
--   
--   
--   https://groups.google.com/forum/#!topic/haskell-cafe/e9H2I-3uVJE
module Control.Exception.Enclosed

-- | A version of catch which is specialized for any exception. This
--   simplifies usage as no explicit type signatures are necessary.
--   
--   Note that since version 0.5.9, this function now has proper support
--   for asynchronous exceptions, by only catching exceptions generated by
--   the internal (enclosed) action.
--   
--   Since 0.5.6
catchAny :: MonadBaseControl IO m => m a -> (SomeException -> m a) -> m a

-- | A version of handle which is specialized for any exception.
--   This simplifies usage as no explicit type signatures are necessary.
--   
--   Note that since version 0.5.9, this function now has proper support
--   for asynchronous exceptions, by only catching exceptions generated by
--   the internal (enclosed) action.
--   
--   Since 0.5.6
handleAny :: MonadBaseControl IO m => (SomeException -> m a) -> m a -> m a

-- | A version of try which is specialized for any exception. This
--   simplifies usage as no explicit type signatures are necessary.
--   
--   Note that since version 0.5.9, this function now has proper support
--   for asynchronous exceptions, by only catching exceptions generated by
--   the internal (enclosed) action.
--   
--   Since 0.5.6
tryAny :: MonadBaseControl IO m => m a -> m (Either SomeException a)

-- | An extension to catch which ensures that the return value is
--   fully evaluated. See tryAny.
--   
--   Since 1.0.1
catchDeep :: (Exception e, NFData a, MonadBaseControl IO m) => m a -> (e -> m a) -> m a

-- | An extension to catchAny which ensures that the return value
--   is fully evaluated. See tryAnyDeep.
--   
--   Since 0.5.9
catchAnyDeep :: (NFData a, MonadBaseControl IO m) => m a -> (SomeException -> m a) -> m a

-- | 
--   flip catchAnyDeep
--   
--   
--   Since 0.5.6
handleAnyDeep :: (NFData a, MonadBaseControl IO m) => (SomeException -> m a) -> m a -> m a

-- | an extension to try which ensures that the return value is
--   fully evaluated. in other words, if you get a right response
--   here, you can be confident that using it will not result in another
--   exception.
--   
--   Since 1.0.1
tryDeep :: (Exception e, NFData a, MonadBaseControl IO m) => m a -> m (Either e a)

-- | an extension to tryany which ensures that the return value is
--   fully evaluated. in other words, if you get a right response
--   here, you can be confident that using it will not result in another
--   exception.
--   
--   Since 0.5.9
tryAnyDeep :: (NFData a, MonadBaseControl IO m) => m a -> m (Either SomeException a)

-- | A version of catch which is specialized for IO exceptions. This
--   simplifies usage as no explicit type signatures are necessary.
--   
--   Since 0.5.6
catchIO :: MonadBaseControl IO m => m a -> (IOException -> m a) -> m a

-- | A version of handle which is specialized for IO exceptions.
--   This simplifies usage as no explicit type signatures are necessary.
--   
--   Since 0.5.6
handleIO :: MonadBaseControl IO m => (IOException -> m a) -> m a -> m a

-- | A version of try which is specialized for IO exceptions. This
--   simplifies usage as no explicit type signatures are necessary.
--   
--   Since 0.5.6
tryIO :: MonadBaseControl IO m => m a -> m (Either IOException a)

-- | Since 0.5.6
asIOException :: IOException -> IOException

-- | Since 0.5.6
asSomeException :: SomeException -> SomeException
