failure 0.1.2 → 0.2.0.3
raw patch · 3 files changed
Files
- Control/Failure.hs +105/−95
- Setup.lhs +7/−7
- failure.cabal +25/−30
Control/Failure.hs view
@@ -1,95 +1,105 @@-{-# LANGUAGE Rank2Types #-} -{-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE UndecidableInstances #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE CPP #-} --- | Type classes for returning failures. -module Control.Failure - ( -- * Type class - Failure (..) - -- * Wrapping failures - , WrapFailure (..) - -- * Convenience 'String' failure - , StringException (..) - , failureString - -- * Convert 'Failure's into concrete types - , Try (..) - , NothingException (..) - , NullException (..) - ) where - -import Prelude hiding (catch) -import Control.Exception (throw, catch, Exception, SomeException (..)) -import Data.Typeable (Typeable) -#if !(MIN_VERSION_base(4,3,0)) -import Control.Monad.Trans.Error () -#else -import Control.Monad.Instances () -#endif - -class Monad f => Failure e f where - failure :: e -> f v - -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 -instance Exception e => WrapFailure e IO where - wrapFailure f m = - m `catch` \e@SomeException{} -> throw (f e) - -class Try f where - type Error f - -- Turn a concrete failure into an abstract failure - try :: Failure (Error f) f' => f a -> f' a - --- | Call 'failure' with a 'String'. -failureString :: Failure 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 Failure e (Either e) where failure = Left - -instance Exception e => Failure e IO where - failure = Control.Exception.throw - --- not a monad or applicative instance Failure e (Either e) where failure = Left - -data NothingException = NothingException - deriving (Show, Typeable) -instance Exception NothingException - -instance Try Maybe where - type Error Maybe = NothingException - try Nothing = failure NothingException - try (Just x) = return x - -instance Try (Either e) where - type Error (Either e) = e - try (Left e) = failure e - try (Right x) = return x - -data NullException = NullException - deriving (Show, Typeable) -instance Exception NullException - -instance Try [] where - type Error [] = NullException - try [] = failure NullException - try (x:_) = return x +{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+-- | Type classes for returning failures.+--+-- Note: This module used to contain a lot more functionality, but I believe it+-- was unused functionality. If you want any of it back, just email me.+module Control.Failure+ ( -- * Type class+ Failure (..)+ -- * General exceptions+ , exception+ {-+ -- * Wrapping failures+ , WrapFailure (..)+ -- * Convenience 'String' failure+ , StringException (..)+ , failureString+ -- * Convert 'Failure's into concrete types+ , Try (..)+ , NothingException (..)+ , NullException (..)+ -}+ ) where++import Control.Exception (throwIO, Exception (toException), SomeException (..))+import Control.Monad.Trans.Error ()+import Control.Monad.Trans.Class (MonadTrans (lift))++class Monad f => Failure e f where+ failure :: e -> f v++-- | Convert to a 'SomeException' via 'toException' before calling 'failure'.+exception :: (Exception e, Failure SomeException m) => e -> m a+exception = failure . toException++{-+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+instance Exception e => WrapFailure e IO where+ wrapFailure f m =+ m `catch` \e@SomeException{} -> throwIO (f e)++class Try f where+ type Error f+ -- Turn a concrete failure into an abstract failure+ try :: Failure (Error f) f' => f a -> f' a++-- | Call 'failure' with a 'String'.+failureString :: Failure 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 Failure e (Either e) where failure = Left++instance Exception e => Failure e IO where+ failure = throwIO++-- | Instance for all monad transformers, simply lift the @failure@ into the+-- base monad.+instance (MonadTrans t, Failure e m, Monad (t m)) => Failure e (t m) where+ failure = lift . failure++{-+-- not a monad or applicative instance Failure e (Either e) where failure = Left++data NothingException = NothingException+ deriving (Show, Typeable)+instance Exception NothingException++instance Try Maybe where+ type Error Maybe = NothingException+ try Nothing = failure NothingException+ try (Just x) = return x++instance Try (Either e) where+ type Error (Either e) = e+ try (Left e) = failure e+ try (Right x) = return x++data NullException = NullException+ deriving (Show, Typeable)+instance Exception NullException++instance Try [] where+ type Error [] = NullException+ try [] = failure NullException+ try (x:_) = return x+-}
Setup.lhs view
@@ -1,7 +1,7 @@-#!/usr/bin/env runhaskell - -> module Main where -> import Distribution.Simple - -> main :: IO () -> main = defaultMain +#!/usr/bin/env runhaskell++> module Main where+> import Distribution.Simple++> main :: IO ()+> main = defaultMain
failure.cabal view
@@ -1,30 +1,25 @@-name: failure -version: 0.1.2 -Cabal-Version: >= 1.6 -build-type: Simple -license: BSD3 -author: Pepe Iborra, Michael Snoyman, Nicolas Pouillard -maintainer: pepeiborra@gmail.com -homepage: http://www.haskell.org/haskellwiki/Failure -description: A simple type class for success/failure computations. -synopsis: A simple type class for success/failure computations. -category: Control, Monads, Failure -stability: stable - -flag base43 - -Library - buildable: True - if flag(base43) - build-depends: base >= 4.3 && < 5 - else - build-depends: base >= 4 && < 4.3 - , transformers >= 0.2 && < 0.3 - ghc-options: -Wall - - exposed-modules: - Control.Failure - -source-repository head - type: git - location: git://github.com/snoyberg/failure.git +name: failure+version: 0.2.0.3+Cabal-Version: >= 1.6+build-type: Simple+license: BSD3+author: Pepe Iborra, Michael Snoyman, Nicolas Pouillard+maintainer: pepeiborra@gmail.com+homepage: http://www.haskell.org/haskellwiki/Failure+description: Please switch to the exceptions package+synopsis: A simple type class for success/failure computations. (deprecated)+category: Control, Monads, Failure+stability: stable++Library+ buildable: True+ build-depends: base >= 4 && < 5+ , transformers >= 0.2+ ghc-options: -Wall++ exposed-modules:+ Control.Failure++source-repository head+ type: git+ location: git://github.com/snoyberg/failure.git