1open Wonka_types;
2open Wonka_helpers;
3
4let takeWhile = f => curry(source => curry(sink => {
5 let ended = ref(false);
6 let talkback = ref(talkbackPlaceholder);
7
8 source((.signal) => {
9 switch (signal) {
10 | Start(tb) => {
11 talkback := tb;
12 sink(.signal);
13 }
14 | End when !ended^ => {
15 ended := true;
16 sink(.End);
17 }
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 }
28 | Push(_) => ()
29 }
30 });
31
32 sink(.Start((.signal) => {
33 if (!ended^) {
34 switch (signal) {
35 | Pull => talkback^(.Pull);
36 | Close => {
37 ended := true;
38 talkback^(.Close);
39 }
40 }
41 };
42 }));
43}));