1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
include Stdlib.Seq
open Eio
type 'a reader = 'a t
type 'a writer = { mutable resolver : 'a node Promise.u }
let write writer item =
let promise, resolver = Promise.create () in
let next = Cons (item, fun () -> Promise.await promise) in
Promise.resolve writer.resolver next;
writer.resolver <- resolver
let close_writer writer = Promise.resolve writer.resolver Nil
let read reader = reader ()
let rec exhaust_reader reader =
match reader () with Nil -> () | Cons (_, reader) -> exhaust_reader reader
let read_and_exhaust reader =
match reader () with
| Nil -> None
| Cons (item, reader) ->
exhaust_reader reader;
Some item
let create_reader_writer () =
let promise, resolver = Promise.create () in
((fun () -> Promise.await promise), { resolver })