0 | module Data.Foldable.Dependent
2 | import Data.SortedMap.Dependent
6 | interface DepFoldable (0 i : Type) (0 t : (i -> Type) -> Type) | t where
7 | dfoldl : {0 v : i -> Type} -> (m -> (x : i) -> v x -> m) -> m -> t v -> m
8 | dfoldr : {0 v : i -> Type} -> ((x : i) -> v x -> m -> m) -> m -> t v -> m
10 | dconcatMap : Monoid m => {0 v : i -> Type} -> ((x : i) -> v x -> m) -> t v -> m
11 | dconcatMap f = dfoldl (\a, x, y => a <+> f x y) neutral
14 | dconcatMap' : {0 i : Type} -> {0 t : (i -> Type) -> Type} -> (DepFoldable i t, Monoid m) => {0 v : i -> Type} -> ((x : i) -> v x -> m) -> t v -> m
15 | dconcatMap' f = dfoldr (\x, y, a => f x y <+> a) neutral
18 | dToList : DepFoldable i t => t v -> List (DPair i v)
19 | dToList = dfoldr (\x, y, l => (
x ** y)
::l) []
22 | indepToList : DepFoldable i t => t (const a) -> List (i, a)
23 | indepToList = dfoldr (\x, y, l => (x, y)::l) []
27 | {0 i : Type} -> DepFoldable i (DPair i) where
28 | dfoldl f z (
x ** y)
= f z x y
29 | dfoldr f z (
x ** y)
= f x y z
30 | dconcatMap f (
x ** y)
= f x y
33 | DepFoldable k (SortedDMap k) where
35 | g : m -> DPair k v -> m
36 | g x (MkDPair k v) = f x k v
39 | g : DPair k v -> m -> m
40 | g (MkDPair k v) x = f k v x
42 | dconcatMap = foldMap