Skip to content

๐Ÿ‘œ Callbag operator that combines consecutive values from the same source

License

Notifications You must be signed in to change notification settings

staltz/callbag-scan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

11 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

/**
 * 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;

About

๐Ÿ‘œ Callbag operator that combines consecutive values from the same source

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published