0 | module Control.Applicative.Indexing
2 | import Data.Contravariant
8 | record Indexing {0 k : Type} i f (a : k) where
9 | constructor MkIndexing
10 | runIndexing : i -> (i, f a)
14 | Functor f => Functor (Indexing i f) where
15 | map f (MkIndexing g) = MkIndexing (mapSnd (map f) . g)
18 | Applicative f => Applicative (Indexing i f) where
19 | pure x = MkIndexing $
\i => (i, pure x)
20 | MkIndexing mf <*> MkIndexing ma = MkIndexing $
\i =>
26 | Contravariant f => Contravariant (Indexing i f) where
27 | contramap f (MkIndexing g) = MkIndexing (mapSnd (contramap f) . g)
31 | indexing : Num i => ((a -> Indexing i f b) -> s -> Indexing i f t) -> (i -> a -> f b) -> s -> f t
32 | indexing l fn s = snd $
runIndexing {f} (l (\x => MkIndexing $
\i => (1 + i, fn i x)) s) 0