-- 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)