data-collectors
Version:
A collection of composable reduction operations for arbitrary streams of values
48 lines • 1.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const collector_1 = require("../collector");
const toArray_1 = require("../collections/toArray");
class DistinctCollector extends collector_1.BaseCollector {
constructor(keyer, collector) {
super();
this.keyer = keyer;
this.collector = collector;
}
supply() {
return {
keys: new Map(),
items: []
};
}
accumulate(container, item) {
const key = this.keyer(item);
if (!container.keys.has(key)) {
container.keys.set(key, container.items.length);
container.items.push([key, item]);
}
}
combine(container1, container2) {
const keys = new Map(container1.keys);
const items = container1.items.slice();
for (let [key, item] of container2.items) {
if (!keys.has(key)) {
keys.set(key, items.length);
items.push([key, item]);
}
}
return { keys, items };
}
finish(container) {
const subContainer = this.collector.supply();
for (let [_, item] of container.items) {
this.collector.accumulate(subContainer, item);
}
return this.collector.finish(subContainer);
}
}
exports.DistinctCollector = DistinctCollector;
function distinct(keyer, collector) {
return new DistinctCollector(keyer || (x => x), collector || toArray_1.toArray());
}
exports.distinct = distinct;
//# sourceMappingURL=distinct.js.map