-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Error handling using extensible exceptions outside the IO monad.
--
-- Defines a data type, Attempt, which has a Success and Failure
-- constructor. Failure contains an extensible exception.
@package attempt
@version 0.0.1
-- | A universal data type for computations which may fail. Errors are
-- reported using extensible exceptions. These exceptions are not
-- explicitly stated; if you want this kind of functionality, something
-- like control-monad-exception might be a more appropriate fit.
module Data.Attempt
-- | Contains either a Success value or a Failure exception.
data Attempt v
Success :: v -> Attempt v
Failure :: SomeException -> Attempt v
-- | Any type which can be converted from an Attempt. The included
-- instances are your "usual suspects" for dealing with error handling.
-- They include:
--
-- IO: For the IO instance, any exceptions in the Attempt
-- are thrown as runtime exceptions.
--
-- Maybe: Returns Nothing on Failure, or Just
-- on Success.
--
-- List: Returns the empty list on Failure, or a singleton list on
-- Success.
--
-- Either String: Returns Left (show
-- exception) on Failure, or Right on Success.
--
-- Either Exception: Returns Left exception on
-- Failure, or Right on Success.
class FromAttempt a
fromAttempt :: (FromAttempt a) => Attempt v -> a v
-- | A shortcut for fromAttempt.
fa :: (FromAttempt a) => Attempt v -> a v
-- | This is not a simple translation of the Control.Monad.join function.
-- Instead, for Monads which are instances of FromAttempt,
-- it removes the inner Attempt type, reporting errors as defined
-- in the FromAttempt instance.
--
-- For example, join (Just (failureString "foo")) == Nothing.
joinAttempt :: (FromAttempt m, Monad m) => m (Attempt v) -> m v
-- | Process either the exception or value in an Attempt to produce
-- a result.
--
-- This function is modeled after maybe and either. The
-- first argument must accept any instances of Exception. If you
-- want to handle multiple types of exceptions, see makeHandler.
-- The second argument converts the success value.
attempt :: (forall e. (Exception e) => e -> b) -> (a -> b) -> Attempt a -> b
-- | Convert multiple AttemptHandlers and a default value into an
-- exception handler.
--
-- This is a convenience function when you want to have special handling
-- for a few types of Exceptions and provide another value for
-- anything else.
makeHandler :: [AttemptHandler v] -> v -> (forall e. (Exception e) => e -> v)
-- | A simple wrapper value necesary due to the Haskell type system. Wraps
-- a function from a *specific* Exception type to some value.
data AttemptHandler v
AttemptHandler :: (e -> v) -> AttemptHandler v
-- | Tests for a Failure value.
isFailure :: Attempt v -> Bool
-- | Tests for a Success value.
isSuccess :: Attempt v -> Bool
-- | This is an unsafe, partial function which should only be used if you
-- either know that a function will succeed or don't mind the occassional
-- runtime exception.
fromSuccess :: Attempt v -> v
-- | Returns only the Success values.
successes :: [Attempt v] -> [v]
-- | Returns only the Failure values, each wrapped in a
-- SomeException.
failures :: [Attempt v] -> [SomeException]
-- | Return all of the Failures and Successes separately in a
-- tuple.
partitionAttempts :: [Attempt v] -> ([SomeException], [v])
instance Typeable1 Attempt
instance (Show v) => Show (Attempt v)
instance FromAttempt (Either SomeException)
instance FromAttempt (Either String)
instance FromAttempt []
instance FromAttempt Maybe
instance FromAttempt IO
instance (Exception e) => WrapFailure e Attempt
instance (Exception e) => MonadFailure e Attempt
instance Monad Attempt
instance Applicative Attempt
instance Functor Attempt
-- | Provide a monad transformer for the attempt monad, which allows the
-- reporting of errors using extensible exceptions.
module Control.Monad.Attempt
newtype AttemptT m v
AttemptT :: m (Attempt v) -> AttemptT m v
runAttemptT :: AttemptT m v -> m (Attempt v)
-- | Instances of FromAttempt specify a manner for embedding
-- Attempt failures directly into the target data type. For
-- example, the IO instance simply throws a runtime error. This is
-- a convenience wrapper when you simply want to use that default action.
--
-- So given a type AttemptT IO Int, this function
-- will convert it to IO Int, throwing any exceptions in
-- the original value.
evalAttemptT :: (Monad m, FromAttempt m) => AttemptT m v -> m v
instance (Monad m) => FromAttempt (AttemptT m)
instance (MonadIO m) => MonadIO (AttemptT m)
instance MonadTrans AttemptT
instance (Monad m, Exception e) => WrapFailure e (AttemptT m)
instance (Exception e, Monad m) => MonadFailure e (AttemptT m)
instance (Monad m) => Monad (AttemptT m)
instance (Monad m) => Applicative (AttemptT m)
instance (Monad m) => Functor (AttemptT m)