reductio
Version:
Reductio: Crossfilter groupings
42 lines (40 loc) • 1.12 kB
JavaScript
import crossfilter from 'crossfilter2';
var value_count = {
add: function (a, prior, path) {
var i, curr;
return function (p, v, nf) {
if(prior) prior(p, v, nf);
// Not sure if this is more efficient than sorting.
i = path(p).bisect(path(p).values, a(v), 0, path(p).values.length);
curr = path(p).values[i];
if(curr && curr[0] === a(v)) {
// Value already exists in the array - increment it
curr[1]++;
} else {
// Value doesn't exist - add it in form [value, 1]
path(p).values.splice(i, 0, [a(v), 1]);
}
return p;
};
},
remove: function (a, prior, path) {
var i;
return function (p, v, nf) {
if(prior) prior(p, v, nf);
i = path(p).bisect(path(p).values, a(v), 0, path(p).values.length);
// Value already exists or something has gone terribly wrong.
path(p).values[i][1]--;
return p;
};
},
initial: function (prior, path) {
return function (p) {
p = prior(p);
// Array[Array[value, count]]
path(p).values = [];
path(p).bisect = crossfilter.bisect.by(function(d) { return d[0]; }).left;
return p;
};
}
};
export default value_count;