wonka
Version:
A fast push & pull stream library for Reason, loosely following the [callbag spec](https://github.com/callbag/callbag)
119 lines (110 loc) • 4.81 kB
JavaScript
import * as Block from "bs-platform/lib/es6/block.js";
import * as Curry from "bs-platform/lib/es6/curry.js";
import * as Wonka_helpers from "../wonka_helpers.js";
import * as Wonka_source_fromArray from "../sources/wonka_source_fromArray.js";
function mergeMap(f) {
return (function (source) {
return (function (sink) {
var state = /* record */[
/* outerTalkback */Wonka_helpers.talkbackPlaceholder,
/* innerTalkbacks */new Array(),
/* ended */false
];
var applyInnerSource = function (innerSource) {
var talkback = /* record */[/* contents */Wonka_helpers.talkbackPlaceholder];
return Curry._1(innerSource, (function (signal) {
if (typeof signal === "number") {
state[/* innerTalkbacks */1] = state[/* innerTalkbacks */1].filter((function (x) {
return x !== talkback[0];
}));
if (state[/* ended */2] && state[/* innerTalkbacks */1].length === 0) {
return sink(/* End */0);
} else {
return 0;
}
} else if (signal.tag) {
if (state[/* innerTalkbacks */1].length !== 0) {
sink(/* Push */Block.__(1, [signal[0]]));
return talkback[0](/* Pull */0);
} else {
return /* () */0;
}
} else {
var tb = signal[0];
talkback[0] = tb;
state[/* innerTalkbacks */1] = state[/* innerTalkbacks */1].concat(tb);
return tb(/* Pull */0);
}
}));
};
Curry._1(source, (function (signal) {
if (typeof signal === "number") {
if (state[/* ended */2]) {
return /* () */0;
} else {
state[/* ended */2] = true;
if (state[/* innerTalkbacks */1].length === 0) {
return sink(/* End */0);
} else {
return 0;
}
}
} else if (signal.tag) {
if (state[/* ended */2]) {
return /* () */0;
} else {
applyInnerSource(f(signal[0]));
return state[/* outerTalkback */0](/* Pull */0);
}
} else {
var tb = signal[0];
state[/* outerTalkback */0] = tb;
return tb(/* Pull */0);
}
}));
return sink(/* Start */Block.__(0, [(function (signal) {
if (signal) {
state[/* innerTalkbacks */1].forEach((function (talkback) {
return talkback(/* Close */1);
}));
if (state[/* ended */2]) {
return 0;
} else {
state[/* ended */2] = true;
state[/* outerTalkback */0](/* Close */1);
state[/* innerTalkbacks */1].forEach((function (talkback) {
return talkback(/* Close */1);
}));
state[/* innerTalkbacks */1] = new Array();
return /* () */0;
}
} else if (state[/* ended */2]) {
return /* () */0;
} else {
state[/* innerTalkbacks */1].forEach((function (talkback) {
return talkback(/* Pull */0);
}));
return /* () */0;
}
})]));
});
});
}
function merge(sources) {
return mergeMap((function (x) {
return x;
}))(Wonka_source_fromArray.fromArray(sources));
}
function mergeAll(source) {
return mergeMap((function (x) {
return x;
}))(source);
}
var flatten = mergeAll;
export {
mergeMap ,
merge ,
mergeAll ,
flatten ,
}
/* No side effect */