Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

reduce over mutable collections without recomputing everything

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 example
Octocat-spinner-32 test
Octocat-spinner-32 .travis.yml
Octocat-spinner-32 LICENSE
Octocat-spinner-32 index.js
Octocat-spinner-32 package.json
Octocat-spinner-32 readme.markdown
readme.markdown

rolling-reduce

Reduce over collections without recomputing everything when new items arrive or when items in the source change.

browser support

build status

example

sum

var reduce = require('rolling-reduce');
var summer = reduce(0);

summer.on('insert', function (sum, x) {
    return sum + x;
});

summer.on('update', function (sum, xPrev, x) {
    return sum - xPrev + x;
});

summer.on('remove', function (sum, x) {
    return sum - x;
});

summer.on('result', function (sum) {
    console.log('sum=' + sum);
});

[ 7, 8, 9 ].forEach(function (x) {
    summer.insert(x);
}); // 7 + 8 + 9 = 24

summer.remove(7); // 24 - 7 = 17

summer.update(9, 10); // 17 - 9 + 10 = 18

summer.insert(11); // 18 + 11 = 29
$ node example/sum.js
sum=7
sum=15
sum=24
sum=17
sum=18
sum=29

pairs

var reduce = require('rolling-reduce');
var pairs = reduce([]);

function indexOf (xs, x) {
    for (var i = 0; i < xs.length; i++) {
        if (xs[i][0] === x.id) return i;
    }
    return -1;
}

pairs.on('insert', function (xs, x) {
    xs.push([ x.id, x.value ]);
    return xs;
});

pairs.on('update', function (xs, xPrev, x) {
    var ix = indexOf(xs, xPrev);
    xs[ix][1] = x.value;
    return xs;
});

pairs.on('remove', function (xs, x) {
    var ix = indexOf(xs, x);
    if (ix >= 0) xs.splice(ix, 1);
    return xs;
});

pairs.on('result', function (res) {
    console.log('pairs=' + JSON.stringify(res));
});

var abc = { id : 'abc', value : 7 };
pairs.insert(abc);

var def = { id : 'def', value : 8 };
pairs.insert(def);

var ghi = { id : 'ghi', value : 9 };
pairs.insert(ghi);

pairs.remove(abc);

pairs.update(def, { id : 'def', value : 555 });

var xyz = { id : 'xyz', value : 5 };
pairs.insert(xyz);
$ node example/pairs.js
pairs=[["abc",7]]
pairs=[["abc",7],["def",8]]
pairs=[["abc",7],["def",8],["ghi",9]]
pairs=[["def",8],["ghi",9]]
pairs=[["def",555],["ghi",9]]
pairs=[["def",555],["ghi",9],["xyz",5]]

methods

var reduce = require('rolling-reduce')

var r = reduce(init)

Create a reduce object r from an initial accumulator value init.

The event handlers 'insert', 'update', and 'remove' are responible for computing the reduction on the accumulator.

r.insert(x)

Insert a new object x into the source.

r.update(xPrev, x)

Update over the previous item xPrev with a new source item x.

r.remove(x)

Remove the item x from the source.

events

r.on('insert', cb)

The callback cb(acc,x) fires when r.insert(x) is called.

cb(acc,x) should return the new value for the accumulator acc.

r.on('update', cb)

The callback cb(acc,xPrev,x) fires when r.update(xPrev,x) is called.

Note that xPrev and x are merely a convention and the values from r.update() are passed directly through.

cb(acc,xPrev,x) should return the new value for the accumulator acc.

r.on('remove', cb)

The callback cb(acc,x) fires when r.remove(x) is called.

Note that x is merely a convention and you can choose to signify elements in any scheme that you like.

cb(acc,x) should return the new value for the accumulator acc.

install

With npm do:

npm install rolling-reduce

license

MIT

Something went wrong with that request. Please try again.