1open Wonka_types;
2open Wonka_helpers;
3
4type toArrayStateT('a) = {
5 values: Rebel.MutableQueue.t('a),
6 mutable talkback: (. talkbackT) => unit,
7 mutable value: option('a),
8 mutable ended: bool,
9};
10
11let toArray = (source: sourceT('a)): array('a) => {
12 let state: toArrayStateT('a) = {
13 values: Rebel.MutableQueue.make(),
14 talkback: talkbackPlaceholder,
15 value: None,
16 ended: false,
17 };
18
19 source((. signal) =>
20 switch (signal) {
21 | Start(x) =>
22 state.talkback = x;
23 x(. Pull);
24 | Push(value) =>
25 Rebel.MutableQueue.add(state.values, value);
26 state.talkback(. Pull);
27 | End => state.ended = true
28 }
29 );
30
31 if (!state.ended) {
32 state.talkback(. Close);
33 };
34
35 Rebel.MutableQueue.toArray(state.values);
36};