7 | module Data.Withering
9 | import Data.Indexed.Fixed
10 | import Data.Witherable.Indexed
14 | data Withering : (Type -> Type) -> Type -> Type -> Type -> Type where
15 | MkWithering : Applicative f
16 | => ({0 t : Type -> Type} -> (IndWitherable i t) => t a -> f (t b))
17 | -> Withering f i a b
20 | runWither : (IndWitherable i t) => Withering f i a b -> t a -> f (t b)
21 | runWither (MkWithering w) m = w m
24 | witherOne : Withering f i a b -> i -> a -> f (Maybe b)
25 | witherOne (MkWithering w) x y = let
26 | z : FixIndex x Maybe a
27 | z = WithIndex (Just y)
33 | preserving : Applicative f => Withering f i a a
34 | preserving = MkWithering (pure . id)
37 | flushing : Applicative f => Withering f i a b
38 | flushing = MkWithering (pure . flush)
41 | mapping : Applicative f => (a -> b) -> Withering f i a b
42 | mapping f = MkWithering (pure . map f)
45 | imapping : Applicative f => (i -> a -> b) -> Withering f i a b
46 | imapping f = MkWithering (pure . imap f)
49 | mapMaybeing : Applicative f => (a -> Maybe b) -> Withering f i a b
50 | mapMaybeing f = MkWithering (pure . mapMaybe f)
53 | imapMaybeing : Applicative f => (i -> a -> Maybe b) -> Withering f i a b
54 | imapMaybeing f = MkWithering (pure . imapMaybe f)
57 | traversing : Applicative f => (a -> f b) -> Withering f i a b
58 | traversing f = MkWithering (traverse f)
61 | itraversing : Applicative f => (i -> a -> f b) -> Withering f i a b
62 | itraversing f = MkWithering (itraverse f)
65 | withering : Applicative f => (a -> f (Maybe b)) -> Withering f i a b
66 | withering f = MkWithering (wither f)
69 | iwithering : Applicative f => (i -> a -> f (Maybe b)) -> Withering f i a b
70 | iwithering f = MkWithering (iwither f)