This interface is designed to make it easy to build complex streams of values in a way that resembles Python's generators (using "yield").
let naturals : int OSeq.t = OSeq.Generator.(
let rec aux n = yield n >>= fun () -> aux (n+1) in
run (aux 0)
)
type 'a tree = E | N of 'a tree * 'a * 'a tree
let traverse (t:'a tree) : 'a OSeq.t =
let open OSeq.Generator in
let rec trav = function
| E -> empty
| N (l,v,r) -> trav l >>= fun () -> yield v >>= fun () -> trav r
in
run (trav t)