Callbag factory that merges data from multiple callbag sources
npm install callbag-merge'use strict';
/**
* callbag-merge
* -------------
*
* Callbag factory that merges data from multiple callbag sources. Works well
* with listenable sources, and while it may work for some pullable sources,
* it is only designed for listenable sources.
*
* npm install callbag-merge
*
* Example:
*
* const interval = require('callbag-interval');
* const forEach = require('callbag-for-each');
* const merge = require('callbag-merge');
*
* const source = merge(interval(100), interval(350));
*
* forEach(x => console.log(x))(source); // 0
* // 1
* // 2
* // 0
* // 3
* // 4
* // 5
* // ...
*/
function merge(...sources) {
return (start, sink) => {
if (start !== 0) return;
const n = sources.length;
const sourceTalkbacks = new Array(n);
let startCount = 0;
let endCount = 0;
let ended = false;
const talkback = (t, d) => {
if (t === 2) ended = true;
for (let i = 0; i < n; i++) sourceTalkbacks[i] && sourceTalkbacksi;
};
for (let i = 0; i < n; i++) {
if (ended) return;
sourcesi => {
if (t === 0) {
sourceTalkbacks[i] = d;
if (++startCount === 1) sink(0, talkback);
} else if (t === 2 && d) {
ended = true;
for (let j = 0; j < n; j++) {
if (j !== i) sourceTalkbacks[j] && sourceTalkbacksj;
}
sink(2, d);
} else if (t === 2) {
sourceTalkbacks[i] = void 0;
if (++endCount === n) sink(2);
} else sink(t, d);
});
}
};
}
module.exports = merge;