packages feed

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