neither 0.0.0 → 0.0.1
raw patch · 3 files changed
+61/−1 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Neither: class Neither e
+ Data.Neither: either :: (Neither e) => (a -> c) -> (b -> c) -> e a b -> c
+ Data.Neither: left :: (Neither e) => a -> e a b
+ Data.Neither: lefts :: (Neither e, MonadPlus m) => m (e a b) -> m a
+ Data.Neither: mapEither :: (Neither e) => (a -> c) -> (b -> d) -> e a b -> e c d
+ Data.Neither: mapLeft :: (Neither e) => (a -> c) -> e a b -> e c b
+ Data.Neither: mapRight :: (Neither e) => (b -> c) -> e a b -> e a c
+ Data.Neither: partitionEithers :: (Neither e, MonadPlus m) => m (e a b) -> (m a, m b)
+ Data.Neither: right :: (Neither e) => b -> e a b
+ Data.Neither: rights :: (Neither e, MonadPlus m) => m (e a b) -> m b
Files
- Data/Neither.hs +14/−0
- Data/Neither/Class.hs +45/−0
- neither.cabal +2/−1
Data/Neither.hs view
@@ -2,6 +2,10 @@ -- applicative version of Either. It does not provide a monad instance, and -- 'mappend's together error values. 'MEither' is the monadic version, which -- only holds onto the first error value. 'MEitherT' is a monad transformer.+--+-- Also, *Either datatypes and utility functions from Data.Either+-- are generalized with 'Neither' type class.+ module Data.Neither ( -- * Applicative version AEither (..)@@ -13,8 +17,18 @@ , MEitherT (..) , mapMEitherT , throwMEither+ -- * Neither typeclass+ , Neither (..)+ -- * Utility functions+ , mapLeft+ , mapRight+ , mapEither+ , lefts+ , rights+ , partitionEithers ) where import Data.Neither.Base+import Data.Neither.Class import Data.Neither.Transformers () import Data.Neither.Mtl ()
+ Data/Neither/Class.hs view
@@ -0,0 +1,45 @@+module Data.Neither.Class where++import Prelude hiding (either)+import qualified Data.Either as E+import Data.Neither.Base+import Control.Monad+import Control.Arrow ((&&&))++class Neither e where+ left :: a -> e a b+ right :: b -> e a b+ either :: (a -> c) -> (b -> c) -> e a b -> c++instance Neither Either where+ left = Left+ right = Right+ either = E.either++instance Neither MEither where+ left = MLeft+ right = MRight+ either = meither++instance Neither AEither where+ left = ALeft+ right = ARight+ either = aeither++mapLeft :: Neither e => (a -> c) -> e a b -> e c b+mapLeft = flip mapEither id++mapRight :: Neither e => (b -> c) -> e a b -> e a c+mapRight = mapEither id++mapEither :: Neither e => (a -> c) -> (b -> d) -> e a b -> e c d+mapEither f g = either (left . f) (right . g)++lefts :: (Neither e, MonadPlus m) => m (e a b) -> m a+lefts = (=<<) $ either return (const mzero)++rights :: (Neither e, MonadPlus m) => m (e a b) -> m b+rights = (=<<) $ either (const mzero) return++partitionEithers :: (Neither e, MonadPlus m) => m (e a b) -> (m a, m b)+partitionEithers = lefts &&& rights
neither.cabal view
@@ -1,5 +1,5 @@ name: neither-version: 0.0.0+version: 0.0.1 license: BSD3 license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -25,6 +25,7 @@ MonadCatchIO-mtl >= 0.3.0.1 && < 0.4 exposed-modules: Data.Neither other-modules: Data.Neither.Base+ Data.Neither.Class Data.Neither.Transformers Data.Neither.Mtl ghc-options: -Wall