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