5 | import public Control.MonadRec
11 | refl : {k : Nat} -> LTE k k
12 | refl = reflexive {x = k}
15 | interface Iterable container element | container where
17 | {auto rec : MonadRec m}
18 | -> (accum : element -> st -> m st)
19 | -> (done : st -> res)
21 | -> (seed : container)
26 | {auto _ : Iterable container element}
27 | -> {auto _ : MonadRec m}
28 | -> (run : element -> m ())
29 | -> (seed : container)
31 | forM_ run = iterM (\e,_ => run e) (const ()) ()
35 | {auto _ : Iterable container element}
36 | -> {auto _ : MonadRec m}
37 | -> {auto _ : Monoid mo}
38 | -> (calc : element -> m mo)
39 | -> (seed : container)
41 | foldM calc = iterM (\e,acc => (<+> acc) <$> calc e) id neutral
48 | Iterable Nat Nat where
49 | iterM accum done ini seed =
51 | \case Z => pure . Done . done
52 | v@(S k) => map (Cont k refl) . accum v
55 | Iterable (List a) a where
56 | iterM accum done ini seed =
58 | \case Nil => pure . Done . done
59 | h :: t => map (Cont t refl) . accum h
62 | Iterable (List1 a) a where
63 | iterM accum done ini = iterM accum done ini . forget
66 | Iterable Fuel () where
67 | iterM accum done ini seed =
69 | \case Dry => pure . Done . done
70 | More f => map (Cont f refl) . accum ()
73 | Iterable (SnocList a) a where
74 | iterM accum done ini seed =
76 | \case [<] => pure . Done . done
77 | sx :< x => map (Cont sx refl) . accum x