Skip to content

Commit

Permalink
Imported from c-m-f, new Failure based class
Browse files Browse the repository at this point in the history
  • Loading branch information
snoyberg committed Dec 5, 2009
1 parent c03f698 commit 97bb518
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
62 changes: 62 additions & 0 deletions Control/Failure.hs
@@ -0,0 +1,62 @@
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
-- | Type classes for returning failures.
module Control.Failure
( -- * Type classes
Failure (..)
, FunctorFailure
, ApplicativeFailure
, MonadFailure
-- * Wrapping failures
, WrapFailure (..)
-- * Convenience 'String' failure
, StringException (..)
, failureString
) where

import Control.Exception (throw, Exception)
import Data.Typeable (Typeable)
import Control.Applicative (Applicative)

class Failure e f where
failure :: e -> f v
class (Functor f, Failure e f) => FunctorFailure e f
class (Applicative f, Failure e f) => ApplicativeFailure e f
class (Monad f, Applicative f, Failure e f) => MonadFailure e f

-- These introduce the need to use undecidables and overlapping.
-- However, since they are merely type synonyms, this is acceptable.
instance (Functor f, Failure e f) => FunctorFailure e f
instance (Applicative f, Failure e f) => ApplicativeFailure e f
instance (Monad f, Applicative f, Failure e f) => MonadFailure e f

class Failure e f => WrapFailure e f where
-- | Wrap the failure value, if any, with the given function. This is
-- useful in particular when you want all the exceptions returned from a
-- certain library to be of a certain type, even if they were generated by
-- a different library.
wrapFailure :: (forall eIn. Exception eIn => eIn -> e) -> f a -> f a

-- | Call 'failure' with a 'String'.
failureString :: MonadFailure StringException m => String -> m a
failureString = failure . StringException

newtype StringException = StringException String
deriving Typeable
instance Show StringException where
show (StringException s) = "StringException: " ++ s
instance Exception StringException

-- --------------
-- base instances
-- --------------

instance Failure e Maybe where failure _ = Nothing
instance Failure e [] where failure _ = []

instance Exception e => Failure e IO where
failure = Control.Exception.throw
24 changes: 24 additions & 0 deletions failure.cabal
@@ -0,0 +1,24 @@
name: failure
version: 0.0.0
Cabal-Version: >= 1.6
build-type: Simple
license: PublicDomain
author: Pepe Iborra, Michael Snoyman, Nicolas Pouillard
maintainer: pepeiborra@gmail.com
homepage: http://github.com/snoyberg/failure
description: Typeclass for representing failures
synopsis: Typeclass for representing failures
category: Control, Monads, Failure
stability: stable

Library
buildable: True
build-depends: base >= 4 && < 5
ghc-options: -Wall

exposed-modules:
Control.Failure

source-repository head
type: git
location: git://github.com/snoyberg/failure.git

0 comments on commit 97bb518

Please sign in to comment.