-
Notifications
You must be signed in to change notification settings - Fork 3
๐ Callbag factory that merges data from multiple callbag sources
License
staltz/callbag-merge
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
ย | ย | |||
Repository files navigation
/** * 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] && sourceTalkbacks[i](t, d); }; for (let i = 0; i < n; i ) { if (ended) return; sources[i](0, (t, d) => { 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] && sourceTalkbacks[j](2); } sink(2, d); } else if (t === 2) { sourceTalkbacks[i] = void 0; if ( endCount === n) sink(2); } else sink(t, d); }); } }; } export default merge;
About
๐ Callbag factory that merges data from multiple callbag sources
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published