Mirror: 🎩 A tiny but capable push & pull stream library for TypeScript and Flow

Add take operator and tests

Changed files
+67
__tests__
src
+34
__tests__/callbag_test.re
···
expect(res) |> toEqual([| (1, 2), (2, 2), (2, 4) |]);
});
});
+
+
describe("take", () => {
+
open Expect;
+
+
it("only lets a maximum number of values through", () => {
+
let talkback = ref((_: Callbag_types.talkbackT) => ());
+
let num = ref(1);
+
+
let source = Callbag.take(2, sink => sink(Start(signal => {
+
switch (signal) {
+
| Pull => {
+
let i = num^;
+
num := num^ + 1;
+
sink(Push(i));
+
}
+
| _ => ()
+
}
+
})));
+
+
let res = [||];
+
+
source(signal => {
+
switch (signal) {
+
| Start(x) => talkback := x
+
| _ => ignore(Js.Array.push(signal, res))
+
}
+
});
+
+
talkback^(Pull);
+
talkback^(Pull);
+
talkback^(Pull);
+
expect(res) |> toEqual([| Push(1), Push(2), End |]);
+
});
+
});
});
describe("sink factories", () => {
+27
src/callbag.re
···
}));
};
+
let take = (max, source, sink) => {
+
let taken = ref(0);
+
let talkback = ref((_: talkbackT) => ());
+
+
source(signal => {
+
switch (signal) {
+
| Start(tb) => {
+
talkback := tb;
+
sink(Start(signal => {
+
if (taken^ < max) tb(signal);
+
}));
+
}
+
| Push(_) when taken^ < max => {
+
taken := taken^ + 1;
+
sink(signal);
+
+
if (taken^ === max) {
+
sink(End);
+
talkback^(End);
+
};
+
}
+
| End => sink(End)
+
| _ => ()
+
}
+
});
+
};
+
let forEach = (f, source) =>
captureTalkback(source, [@bs] (signal, talkback) => {
switch (signal) {
+6
src/callbag.rei
···
) =>
unit;
+
/* Takes a max number and a source, and creates a sink & source.
+
It will emit values that the sink receives until the passed maximum number
+
of values is reached, at which point it will end the source and the
+
returned, new source. */
+
let take: (int, (signalT('a) => unit) => unit, signalT('a) => unit) => unit;
+
/* -- sink factories */
/* Takes a function and a source, and creates a sink.