| Copyright | (c) Owen Shepherd 2021 |
|---|---|
| License | MIT |
| Maintainer | [email protected] |
| Stability | stable |
| Portability | portable |
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Control.Applicative.MultiExcept
Description
Errors are accumulated through Applicative sequencing.
The recommended way to use MultiExcept is with ApplicativeDo:
{-# LANGUAGE ApplicativeDo #-}
import Control.Applicative.MultiExcept
errors :: MultiExcept String (Int, Int, Int)
errors = do
a <- throwError "no monad instance"
b <- pure 12
c <- throwError "i am scared"
pure (a, b, c)
Synopsis
- data MultiExcept err a
- fromEither :: Either err a -> MultiExcept err a
- fromEitherPoly :: Either (NonEmpty err) a -> MultiExcept err a
- join :: MultiExcept err (MultiExcept err a) -> MultiExcept err a
- or :: MultiExcept err a -> MultiExcept err a -> MultiExcept err a
- runMultiExcept :: MultiExcept err a -> Either (NonEmpty err) a
- succeed :: forall err a. a -> MultiExcept err a
- throwError :: forall a err. err -> MultiExcept err a
- throwErrors :: forall a err. NonEmpty err -> MultiExcept err a
- mapMultiExcept :: (err -> err') -> (a -> a') -> MultiExcept err a -> MultiExcept err' a'
Documentation
data MultiExcept err a Source #
A MultiExcept is a success value, or one or more errors.
Instances
| Bifunctor MultiExcept Source # | WARNING: O(n) space and time in the length of the amount of errors this could be fixed by changing the difference list Functor instance. |
Defined in Control.Applicative.MultiExcept Methods bimap :: (a -> b) -> (c -> d) -> MultiExcept a c -> MultiExcept b d # first :: (a -> b) -> MultiExcept a c -> MultiExcept b c # second :: (b -> c) -> MultiExcept a b -> MultiExcept a c # | |
| Foldable (MultiExcept err) Source # | |
Defined in Control.Applicative.MultiExcept Methods fold :: Monoid m => MultiExcept err m -> m # foldMap :: Monoid m => (a -> m) -> MultiExcept err a -> m # foldMap' :: Monoid m => (a -> m) -> MultiExcept err a -> m # foldr :: (a -> b -> b) -> b -> MultiExcept err a -> b # foldr' :: (a -> b -> b) -> b -> MultiExcept err a -> b # foldl :: (b -> a -> b) -> b -> MultiExcept err a -> b # foldl' :: (b -> a -> b) -> b -> MultiExcept err a -> b # foldr1 :: (a -> a -> a) -> MultiExcept err a -> a # foldl1 :: (a -> a -> a) -> MultiExcept err a -> a # toList :: MultiExcept err a -> [a] # null :: MultiExcept err a -> Bool # length :: MultiExcept err a -> Int # elem :: Eq a => a -> MultiExcept err a -> Bool # maximum :: Ord a => MultiExcept err a -> a # minimum :: Ord a => MultiExcept err a -> a # sum :: Num a => MultiExcept err a -> a # product :: Num a => MultiExcept err a -> a # | |
| Traversable (MultiExcept err) Source # | |
Defined in Control.Applicative.MultiExcept Methods traverse :: Applicative f => (a -> f b) -> MultiExcept err a -> f (MultiExcept err b) # sequenceA :: Applicative f => MultiExcept err (f a) -> f (MultiExcept err a) # mapM :: Monad m => (a -> m b) -> MultiExcept err a -> m (MultiExcept err b) # sequence :: Monad m => MultiExcept err (m a) -> m (MultiExcept err a) # | |
| Applicative (MultiExcept err) Source # | |
Defined in Control.Applicative.MultiExcept Methods pure :: a -> MultiExcept err a # (<*>) :: MultiExcept err (a -> b) -> MultiExcept err a -> MultiExcept err b # liftA2 :: (a -> b -> c) -> MultiExcept err a -> MultiExcept err b -> MultiExcept err c # (*>) :: MultiExcept err a -> MultiExcept err b -> MultiExcept err b # (<*) :: MultiExcept err a -> MultiExcept err b -> MultiExcept err a # | |
| Functor (MultiExcept err) Source # | |
Defined in Control.Applicative.MultiExcept Methods fmap :: (a -> b) -> MultiExcept err a -> MultiExcept err b # (<$) :: a -> MultiExcept err b -> MultiExcept err a # | |
| (Show a, Show err) => Show (MultiExcept err a) Source # | |
Defined in Control.Applicative.MultiExcept Methods showsPrec :: Int -> MultiExcept err a -> ShowS # show :: MultiExcept err a -> String # showList :: [MultiExcept err a] -> ShowS # | |
| (Eq a, Eq err) => Eq (MultiExcept err a) Source # | |
Defined in Control.Applicative.MultiExcept Methods (==) :: MultiExcept err a -> MultiExcept err a -> Bool # (/=) :: MultiExcept err a -> MultiExcept err a -> Bool # | |
| (Ord a, Ord err) => Ord (MultiExcept err a) Source # | |
Defined in Control.Applicative.MultiExcept Methods compare :: MultiExcept err a -> MultiExcept err a -> Ordering # (<) :: MultiExcept err a -> MultiExcept err a -> Bool # (<=) :: MultiExcept err a -> MultiExcept err a -> Bool # (>) :: MultiExcept err a -> MultiExcept err a -> Bool # (>=) :: MultiExcept err a -> MultiExcept err a -> Bool # max :: MultiExcept err a -> MultiExcept err a -> MultiExcept err a # min :: MultiExcept err a -> MultiExcept err a -> MultiExcept err a # | |
fromEither :: Either err a -> MultiExcept err a Source #
Convert an Either to a MultiExcept.
fromEitherPoly :: Either (NonEmpty err) a -> MultiExcept err a Source #
Convert a multi-error Either to a MultiExcept.
join :: MultiExcept err (MultiExcept err a) -> MultiExcept err a Source #
Join nested MultiExcepts with the same error type.
Note that this doesn't imply a useful Monad instance.
The instance defined in terms of join discards errors on the RHS of >>=,
when the LHS is an error value.
or :: MultiExcept err a -> MultiExcept err a -> MultiExcept err a Source #
Return the first success, or all of the combined errors.
Examples
>>>pure 1 `or` throwError 3Success 1
>>>throwError 2 `or` pure 1Success 1
>>>throwError 2 `or` throwError 3Errors [2, 3]
runMultiExcept :: MultiExcept err a -> Either (NonEmpty err) a Source #
Run the computation.
succeed :: forall err a. a -> MultiExcept err a Source #
Embeds a value into a MultiExcept context.
throwError :: forall a err. err -> MultiExcept err a Source #
Throw a single error.
throwErrors :: forall a err. NonEmpty err -> MultiExcept err a Source #
Throw one or more errors.
mapMultiExcept :: (err -> err') -> (a -> a') -> MultiExcept err a -> MultiExcept err' a' Source #
A non-overloaded bimap