1open Wonka_types;
2
3type delayStateT = {
4 mutable talkback: (. talkbackT) => unit,
5 mutable active: int,
6 mutable gotEndSignal: bool,
7};
8
9let delay = wait =>
10 curry(source =>
11 curry(sink => {
12 let state: delayStateT = {
13 talkback: Wonka_helpers.talkbackPlaceholder,
14 active: 0,
15 gotEndSignal: false,
16 };
17
18 source((. signal) =>
19 switch (signal) {
20 | Start(tb) => state.talkback = tb
21 | _ when !state.gotEndSignal =>
22 state.active = state.active + 1;
23 ignore(
24 Js.Global.setTimeout(
25 () => {
26 if (state.gotEndSignal && state.active === 0) {
27 sink(. End);
28 } else {
29 state.active = state.active - 1;
30 };
31
32 sink(. signal);
33 },
34 wait,
35 ),
36 );
37 | _ => ()
38 }
39 );
40
41 sink(.
42 Start(
43 (. signal) =>
44 switch (signal) {
45 | Close =>
46 state.gotEndSignal = true;
47 if (state.active === 0) {
48 sink(. End);
49 };
50 | _ when !state.gotEndSignal => state.talkback(. signal)
51 | _ => ()
52 },
53 ),
54 );
55 })
56 );