24 | record Fold (s,t,a,b : Type) where
26 | foldMap_ : {0 m : _} -> Monoid m => (a -> m) -> s -> m
29 | public export %inline
30 | fold_ : Foldable t => Fold (t a) (t a) a a
34 | public export %inline
35 | empty : Fold s t a b
36 | empty = F $
\_,_ => neutral
39 | public export %inline
40 | (~>) : Fold s t a b -> Fold a b c d -> Fold s t c d
41 | F f ~> F g = F $
f . g
49 | interface ToFold (0 o : Type -> Type -> Type -> Type -> Type) where
50 | toFold : o s t a b -> Fold s t a b
52 | public export %inline
53 | ToFold Fold where toFold = id
60 | [SFirst] Semigroup (Maybe a) where
65 | [First] Monoid (Maybe a) using SFirst where neutral = Nothing
68 | [SLast] Semigroup (Maybe a) where
73 | [Last] Monoid (Maybe a) using SLast where neutral = Nothing
81 | public export %inline
82 | foldMap : Monoid m => ToFold o => o s t a b -> (a -> m) -> s -> m
83 | foldMap f = foldMap_ (toFold f)
87 | public export %inline
88 | fold : ToFold o => Monoid a => o s t a b -> s -> a
89 | fold f = foldMap f id
92 | public export %inline
93 | asList : ToFold o => o s t a b -> s -> List a
94 | asList f = foldMap f pure
98 | public export %inline
99 | asSnocList : ToFold o => o s t a b -> s -> SnocList a
100 | asSnocList f = foldMap f pure
103 | public export %inline
104 | first : ToFold o => o s t a b -> s -> Maybe a
105 | first f = foldMap @{First} f Just
109 | last : ToFold o => o s t a b -> s -> Maybe a
110 | last f = foldMap @{Last} f Just
115 | find : ToFold o => o s t a b -> (a -> Bool) -> s -> Maybe a
116 | find f g = foldMap @{First} f (\x => if g x then Just x else Nothing)