1open Wonka_types;
2open Wonka_helpers;
3
4let takeWhile = f =>
5 curry(source =>
6 curry(sink => {
7 let ended = ref(false);
8 let talkback = ref(talkbackPlaceholder);
9
10 source((. signal) =>
11 switch (signal) {
12 | Start(tb) =>
13 talkback := tb;
14 sink(. signal);
15 | End when ! ended^ =>
16 ended := true;
17 sink(. End);
18 | End => ()
19 | Push(x) when ! ended^ =>
20 if (!f(. x)) {
21 ended := true;
22 sink(. End);
23 talkback^(. Close);
24 } else {
25 sink(. signal);
26 }
27 | Push(_) => ()
28 }
29 );
30
31 sink(.
32 Start(
33 (. signal) =>
34 if (! ended^) {
35 switch (signal) {
36 | Pull => talkback^(. Pull)
37 | Close =>
38 ended := true;
39 talkback^(. Close);
40 };
41 },
42 ),
43 );
44 })
45 );