2 | module Data.Traversable.Indexed
4 | import Control.Applicative.Const
7 | import public Data.Foldable.Indexed
10 | interface (Traversable t,
IndFoldable i t) => IndTraversable i t | t where
11 | itraverse : Applicative f => (i -> a -> f b) -> t a -> f (t b)
15 | IndTraversable () Maybe where
16 | itraverse f = traverse (f ())
19 | IndTraversable a (Pair a) where
20 | itraverse f (MkPair x y) = MkPair x <$> f x y
23 | IndTraversable Nat List where
24 | itraverse g = inner 0 where
25 | inner : Nat -> List a -> f (List b)
26 | inner _ [] = pure []
27 | inner i (a::as) = (::) <$> g i a <*> inner (i+1) as
30 | IndTraversable (Fin k) (Vect k) where
31 | itraverse f [] = pure []
32 | itraverse f (x::xs) = (::) <$> f FZ x <*> itraverse (f . FS) xs
36 | indTraversableFoldMap : (IndTraversable i t, Monoid m) => (i -> a -> m) -> t a -> m
37 | indTraversableFoldMap f = let
38 | g : i -> a -> Const m ()
40 | in runConst . itraverse g