Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/staltz/callbag-scan

👜 Callbag operator that combines consecutive values from the same source
https://github.com/staltz/callbag-scan

Last synced: 28 days ago
JSON representation

👜 Callbag operator that combines consecutive values from the same source

Awesome Lists containing this project

README

        

/**
* callbag-scan
* ------------
*
* Callbag operator that combines consecutive values from the same source.
* It's essentially like array `.reduce`, but delivers a new accumulated value
* for each value from the callbag source. Works on either pullable or
* listenable sources.
*
* `npm install callbag-scan`
*
* Example:
*
* const fromIter = require('callbag-from-iter');
* const forEach = require('callbag-for-each');
* const scan = require('callbag-scan');
*
* const iterSource = fromIter([1,2,3,4,5]);
* const scanned = scan((prev, x) => prev + x, 0)(iterSource);
*
* forEach(x => console.log(x))(scanned); // 1
* // 3
* // 6
* // 10
* // 15
*/

function scan(reducer, seed) {
let hasAcc = arguments.length === 2;
return source => (start, sink) => {
if (start !== 0) return;
let acc = seed;
source(0, (t, d) => {
if (t === 1) {
acc = hasAcc ? reducer(acc, d) : ((hasAcc = true), d);
sink(1, acc);
} else sink(t, d);
});
};
}

module.exports = scan;