Copyright | (c) Grant Weyburne 2022 |
---|---|
License | BSD-3 |
Safe Haskell | None |
Language | Haskell2010 |
tracks one or more successes and optionally a failure
prefer the smart constructors to enforce correctness or use the apply methods
Synopsis
- data LRHist as e a where
- rhi :: forall e a. a -> (Proxy 'True, LRHist '[] e a)
- rh :: forall e a a' as proxy. a -> (proxy 'True, LRHist as e a') -> (proxy 'True, LRHist (a' ': as) e a)
- lh :: forall a e a' as proxy. e -> (proxy 'True, LRHist as e a') -> (Proxy 'False, LRHist (a' ': as) e a)
- lhskip :: forall a e a' as proxy. (proxy 'False, LRHist as e a') -> (proxy 'False, LRHist (a' ': as) e a)
- rhi' :: forall e a. a -> LRHist '[] e a
- rh' :: forall e a a' as. a -> LRHist as e a' -> LRHist (a' ': as) e a
- lh' :: forall a e a' as. e -> LRHist as e a' -> LRHist (a' ': as) e a
- lhskip' :: forall a e a' as. LRHist as e a' -> LRHist (a' ': as) e a
- lhToEitherI :: forall e a as. RHistC as => LRHist as e a -> Either e (RHistT a as)
- lhToEither :: forall e a as. LRHist as e a -> Either e a
- lhToEitherTuples :: forall e a as tp. (ITupleC tp, RHistC as, ToITupleT tp ~ RHistT a as) => LRHist as e a -> Either e tp
- lhBool :: forall e a a' as. (a ~ a', Monoid e) => (a' -> Bool) -> LRHist as e a' -> LRHist (a' ': as) e a
- lhMaybe :: forall e a a' as. Monoid e => (a' -> Maybe a) -> LRHist as e a' -> LRHist (a' ': as) e a
- lhMaybe' :: forall e a a' as. Monoid e => (a' -> Bool) -> (a' -> a) -> LRHist as e a' -> LRHist (a' ': as) e a
- lhEither :: forall e a a' as. (a' -> Either e a) -> LRHist as e a' -> LRHist (a' ': as) e a
- lhEither' :: forall e a a' as. (a' -> Bool) -> (a' -> e) -> (a' -> a) -> LRHist as e a' -> LRHist (a' ': as) e a
- appLR :: forall e a a' as x. ApTheseF e a' x a => (a' -> x) -> LRHist as e a' -> LRHist (a' ': as) e a
- appLRS :: forall e a' x a as z. ApTheseF e a' x a => (z -> a' -> (z, x)) -> z -> LRHist as e a' -> (z, LRHist (a' ': as) e a)
- appLRB :: forall e a a' as. (a' -> Bool) -> (a' -> e) -> (a' -> a) -> LRHist as e a' -> LRHist (a' ': as) e a
- traverseLRHistB :: forall e a t a' as. Functor t => (a' -> Bool) -> (a' -> e) -> (a' -> a) -> t (LRHist as e a') -> t (LRHist (a' ': as) e a)
- traverseLRHist :: forall e a t a' as z. Traversable t => (z -> a' -> (z, Either e a)) -> z -> t (LRHist as e a') -> (z, t (LRHist (a' ': as) e a))
- eitherToLH :: Either e a -> LRHist '[()] e a
- maybeToLH :: Monoid e => Maybe a -> LRHist '[()] e a
- validateLRHist :: forall e a as. LRHist as e a -> Either String ()
datatype
data LRHist as e a where Source #
like Either
but keeps track of history of all successes
if there is a failure it wraps the previous successes and stops adding data to LRHist
"e" the error type
"as" is the typelevel list in reverse order that tracks all previous "a"s
"a" is the latest success type
LhSkip :: LRHist as e a' -> LRHist (a' ': as) e a | wraps an existing error |
Lh :: e -> LRHist as e a' -> LRHist (a' ': as) e a | wraps previous nested successes with an error |
Rhi :: a -> LRHist '[] e a | initial success value |
Rh :: a -> LRHist as e a' -> LRHist (a' ': as) e a | subsequent success |
Instances
Bifunctor (LRHist as) Source # | |
Bitraversable (LRHist as) Source # | |
Defined in Primus.LRHist bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> LRHist as a b -> f (LRHist as c d) # | |
Bifoldable (LRHist as) Source # | |
Functor (LRHist as e) Source # | |
Foldable (LRHist as e) Source # | |
Defined in Primus.LRHist fold :: Monoid m => LRHist as e m -> m # foldMap :: Monoid m => (a -> m) -> LRHist as e a -> m # foldMap' :: Monoid m => (a -> m) -> LRHist as e a -> m # foldr :: (a -> b -> b) -> b -> LRHist as e a -> b # foldr' :: (a -> b -> b) -> b -> LRHist as e a -> b # foldl :: (b -> a -> b) -> b -> LRHist as e a -> b # foldl' :: (b -> a -> b) -> b -> LRHist as e a -> b # foldr1 :: (a -> a -> a) -> LRHist as e a -> a # foldl1 :: (a -> a -> a) -> LRHist as e a -> a # toList :: LRHist as e a -> [a] # null :: LRHist as e a -> Bool # length :: LRHist as e a -> Int # elem :: Eq a => a -> LRHist as e a -> Bool # maximum :: Ord a => LRHist as e a -> a # minimum :: Ord a => LRHist as e a -> a # | |
Traversable (LRHist as e) Source # | |
Defined in Primus.LRHist | |
(ApplyConstraints '[Eq] as, Eq e, Eq a) => Eq (LRHist as e a) Source # | |
(ApplyConstraints '[Eq, Ord] as, Eq e, Ord e, Ord a) => Ord (LRHist as e a) Source # | |
Defined in Primus.LRHist compare :: LRHist as e a -> LRHist as e a -> Ordering # (<) :: LRHist as e a -> LRHist as e a -> Bool # (<=) :: LRHist as e a -> LRHist as e a -> Bool # (>) :: LRHist as e a -> LRHist as e a -> Bool # (>=) :: LRHist as e a -> LRHist as e a -> Bool # | |
(Read a, Read e, Read a', Read (LRHist as e a'), ApplyConstraints '[Read] as) => Read (LRHist (a' ': as) e a) Source # | successor case for |
(Read a, Read e) => Read (LRHist ('[] :: [Type]) e a) Source # | base case for |
(Show a, Show e, ApplyConstraints '[Show] as) => Show (LRHist as e a) Source # | |
(Semigroup a, Semigroup e, ApplyConstraints '[Semigroup] as) => Semigroup (LRHist as e a) Source # | |
(Monoid a, Monoid e, Monoid a', ApplyConstraints '[Semigroup, Monoid] as, Monoid (LRHist as e a')) => Monoid (LRHist (a' ': as) e a) Source # | |
(Semigroup e, Monoid a) => Monoid (LRHist ('[] :: [Type]) e a) Source # | |
smart constructors
rh :: forall e a a' as proxy. a -> (proxy 'True, LRHist as e a') -> (proxy 'True, LRHist (a' ': as) e a) Source #
smart constructor for Rh
lh :: forall a e a' as proxy. e -> (proxy 'True, LRHist as e a') -> (Proxy 'False, LRHist (a' ': as) e a) Source #
smart constructor for Lh
lhskip :: forall a e a' as proxy. (proxy 'False, LRHist as e a') -> (proxy 'False, LRHist (a' ': as) e a) Source #
smart constructor for LhSkip
constructors with better type application order
rhi' :: forall e a. a -> LRHist '[] e a Source #
constructor for Rhi
with more convenient type application order
rh' :: forall e a a' as. a -> LRHist as e a' -> LRHist (a' ': as) e a Source #
constructor for Rh
with more convenient type application order
lh' :: forall a e a' as. e -> LRHist as e a' -> LRHist (a' ': as) e a Source #
constructor for Lh
with more convenient type application order
lhskip' :: forall a e a' as. LRHist as e a' -> LRHist (a' ': as) e a Source #
constructor for LhSkip
with more convenient type application order
converters
lhToEitherI :: forall e a as. RHistC as => LRHist as e a -> Either e (RHistT a as) Source #
returns an inductive tuple on success and Either for failure
lhToEitherTuples :: forall e a as tp. (ITupleC tp, RHistC as, ToITupleT tp ~ RHistT a as) => LRHist as e a -> Either e tp Source #
returns flattened n-tuple with all the history of successes on success and Either for failure
function application
lhBool :: forall e a a' as. (a ~ a', Monoid e) => (a' -> Bool) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
uses a boolean predicate to determine success or failure
lhMaybe :: forall e a a' as. Monoid e => (a' -> Maybe a) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
uses a maybe function to determine success or failure and also allow change of type "a"
lhMaybe' :: forall e a a' as. Monoid e => (a' -> Bool) -> (a' -> a) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
lhEither :: forall e a a' as. (a' -> Either e a) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
uses an either function to determine success or failure and also allow change of type "a"
lhEither' :: forall e a a' as. (a' -> Bool) -> (a' -> e) -> (a' -> a) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
similar to lhEither
leveraging boolEither
appLR :: forall e a a' as x. ApTheseF e a' x a => (a' -> x) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
appLRS :: forall e a' x a as z. ApTheseF e a' x a => (z -> a' -> (z, x)) -> z -> LRHist as e a' -> (z, LRHist (a' ': as) e a) Source #
similar to appLR
with state
appLRB :: forall e a a' as. (a' -> Bool) -> (a' -> e) -> (a' -> a) -> LRHist as e a' -> LRHist (a' ': as) e a Source #
apply a function to a LRHist
via boolEither
traversals
traverseLRHistB :: forall e a t a' as. Functor t => (a' -> Bool) -> (a' -> e) -> (a' -> a) -> t (LRHist as e a') -> t (LRHist (a' ': as) e a) Source #
traverseLRHist :: forall e a t a' as z. Traversable t => (z -> a' -> (z, Either e a)) -> z -> t (LRHist as e a') -> (z, t (LRHist (a' ': as) e a)) Source #
miscellaneous
eitherToLH :: Either e a -> LRHist '[()] e a Source #