Source file seq.ml

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 })