1open Wonka_types;
2
3let testWithListenable = operator => {
4 let sink = ref((. _: signalT(int)) => ());
5 let signals = [||];
6 let source = x => {
7 sink := x;
8 x(. Start((. signal) => ignore(Js.Array.push(signal, signals))));
9 };
10
11 let talkback = ref((. _: talkbackT) => ());
12 let res = [||];
13 operator(source, (. signal) =>
14 switch (signal) {
15 | Start(x) => talkback := x
16 | _ => ignore(Js.Array.push(signal, res))
17 }
18 );
19
20 Js.Promise.make((~resolve, ~reject as _) => {
21 sink^(. Push(1));
22 ignore(
23 Js.Global.setTimeout(
24 () => {
25 sink^(. Push(2));
26 ignore(
27 Js.Global.setTimeout(
28 () => {
29 sink^(. End);
30 ignore(
31 Js.Global.setTimeout(() => resolve(. (signals, res)), 0),
32 );
33 },
34 0,
35 ),
36 );
37 },
38 0,
39 ),
40 );
41 });
42};
43
44let testTalkbackEnd = operator => {
45 let sink = ref((. _: signalT(int)) => ());
46 let signals: array(talkbackT) = [||];
47 let source = x => {
48 x(. Start((. signal) => ignore(Js.Array.push(signal, signals))));
49 sink := x;
50 };
51
52 let talkback = ref((. _: talkbackT) => ());
53 let res = [||];
54 operator(source, (. signal) =>
55 switch (signal) {
56 | Start(x) => talkback := x
57 | _ => ignore(Js.Array.push(signal, res))
58 }
59 );
60
61 Js.Promise.make((~resolve, ~reject as _) => {
62 sink^(. Push(1));
63 ignore(
64 Js.Global.setTimeout(
65 () => {
66 talkback^(. Close);
67 ignore(Js.Global.setTimeout(() => resolve(. (signals, res)), 0));
68 },
69 0,
70 ),
71 );
72 });
73};
74
75let testSource = source => {
76 let talkback = ref((. _: talkbackT) => ());
77 let res = [||];
78
79 Js.Promise.make((~resolve, ~reject as _) =>
80 source((. signal) =>
81 switch (signal) {
82 | Start(x) =>
83 talkback := x;
84 talkback^(. Pull);
85 | Push(_) =>
86 ignore(Js.Array.push(signal, res));
87 talkback^(. Pull);
88 | End =>
89 ignore(Js.Array.push(signal, res));
90 resolve(. res);
91 }
92 )
93 );
94};
95
96type observableClassT;
97
98[@bs.module] external observableClass: observableClassT = "zen-observable";
99[@bs.send]
100external _observableFromArray:
101 (observableClassT, array('a)) => Wonka.observableT('a) =
102 "from";
103[@bs.send]
104external _observableFrom:
105 (observableClassT, Wonka.observableT('a)) => Wonka.observableT('a) =
106 "from";
107[@bs.send]
108external observableForEach:
109 (Wonka.observableT('a), 'a => unit) => Js.Promise.t(unit) =
110 "forEach";
111
112let observableFromArray = (arr: array('a)): Wonka.observableT('a) =>
113 _observableFromArray(observableClass, arr);
114let observableFrom = (obs: Wonka.observableT('a)): Wonka.observableT('a) =>
115 _observableFrom(observableClass, obs);
116
117[@bs.module]
118external callbagFromArray: array('a) => Wonka.callbagT('a) =
119 "callbag-from-iter";
120
121[@bs.module]
122external callbagFromObservable: Wonka.observableT('a) => Wonka.callbagT('a) =
123 "callbag-from-obs";
124
125[@bs.module]
126external callbagIterate: (. ('a => unit)) => (. Wonka.callbagT('a)) => unit =
127 "callbag-iterate";