5 | module Data.Enumerate.Indexed
8 | import Data.Description.Regular
9 | import Data.Description.Indexed
11 | import Data.Enumerate.Common
22 | record IEnumerator {i : Type} (a : i -> Type) (b : Type) where
23 | constructor MkIEnumerator
24 | runIEnumerator : ((v : i) -> List (a v)) -> List b
31 | Functor (IEnumerator a) where
32 | map f (MkIEnumerator enum) = MkIEnumerator (map f . enum)
35 | Applicative (IEnumerator a) where
36 | pure = MkIEnumerator . const . pure
37 | MkIEnumerator e1 <*> MkIEnumerator e2
38 | = MkIEnumerator (\ as => prodWith ($) (e1 as) (e2 as))
41 | Alternative (IEnumerator a) where
42 | empty = MkIEnumerator (const [])
43 | MkIEnumerator e1 <|> MkIEnumerator e2
44 | = MkIEnumerator (\ as => interleave (e1 as) (e2 as))
47 | Monad (IEnumerator a) where
48 | xs >>= ks = MkIEnumerator $
\ as =>
49 | foldr (\ x => interleave (runIEnumerator (ks x) as)) []
50 | (runIEnumerator xs as)
53 | rec : (v : i) -> IEnumerator a (a v)
54 | rec v = MkIEnumerator ($
v)
57 | pairWith : (b -> c -> d) -> IEnumerator a b -> IEnumerator a c -> IEnumerator a d
58 | pairWith f (MkIEnumerator e1) (MkIEnumerator e2)
59 | = MkIEnumerator (\ as => prodWith f (e1 as) (e2 as))
62 | pair : IEnumerator a b -> IEnumerator a c -> IEnumerator a (b, c)
66 | sig : {b : a -> Type} ->
67 | IEnumerator f a -> ((x : a) -> IEnumerator f (b x)) ->
68 | IEnumerator f (x : a ** b x)
69 | sig as bs = as >>= \ a => bs a >>= \ b => pure (
a ** b)
72 | const : List b -> IEnumerator a b
73 | const bs = MkIEnumerator (const bs)
80 | isized : ((v : i) -> IEnumerator a (a v)) -> Nat -> (v : i) -> List (a v)
82 | isized f (S n) v = runIEnumerator (f v) (isized f n)
89 | indexed : (d : i -> IDesc List i) -> (v : i) -> IEnumerator (Fix d) (Fix d v)
90 | indexed d v = MkFix <$> go (d v) where
92 | go : (e : IDesc List i) -> IEnumerator (Fix d) (Elem e (Fix d))
96 | go (d1 * d2) = pair (go d1) (go d2)
97 | go (d1 + d2) = Left <$> go d1 <|> Right <$> go d2
98 | go (Sig s vs f) = sig (const vs) (\ x => go (f x))
101 | 0 Memorator : (d : Desc p) -> (Fix d -> Type) -> Type -> Type
102 | Memorator d a b = (d ~> (List . a)) -> List b
105 | memorate : {d : Desc p} ->
106 | {0 b : Fix d -> Type} ->
107 | ((x : Fix d) -> Memorator d b (b x)) ->
108 | Nat -> (x : Fix d) -> List (b x)
109 | memorate f 0 x = []
110 | memorate f (S n) x = f x (trie $
memorate f n)