Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/staltz/callbag-scan
- Owner: staltz
- License: mit
- Created: 2018-01-23T21:39:22.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2021-12-28T12:44:17.000Z (almost 3 years ago)
- Last Synced: 2024-10-10T00:50:00.387Z (about 1 month ago)
- Language: JavaScript
- Homepage:
- Size: 11.7 KB
- Stars: 6
- Watchers: 3
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: readme.js
- License: LICENSE
Awesome Lists containing this project
- awesome-callbags - scan
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;