data-collectors
Version:
A collection of composable reduction operations for arbitrary streams of values
51 lines • 1.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const collector_1 = require("../collector");
const toArray_1 = require("./toArray");
class GroupingByCollector extends collector_1.BaseCollector {
constructor(mapper, supplier, collector) {
super();
this.mapper = mapper;
this.supplier = supplier;
this.collector = collector;
}
supply() {
return new Map();
}
accumulate(container, item) {
const key = this.mapper(item);
if (!container.get(key)) {
const subContainer = this.collector.supply();
container.set(key, subContainer);
this.collector.accumulate(subContainer, item);
}
else {
this.collector.accumulate(container.get(key), item);
}
}
combine(container1, container2) {
for (let [key, value] of container2) {
container1.set(key, this.collector.combine(container1.get(key), value));
}
return container1;
}
finish(container) {
let finished = this.supplier();
for (let [key, value] of container) {
finished.set(key, this.collector.finish(value));
}
return finished;
}
}
exports.GroupingByCollector = GroupingByCollector;
function groupingBy(mapper, supplier, collector) {
if (!supplier && !collector) {
return groupingBy(mapper, () => new Map(), toArray_1.toArray());
}
else if (!collector) {
return groupingBy(mapper, () => new Map(), supplier);
}
return new GroupingByCollector(mapper, supplier, collector);
}
exports.groupingBy = groupingBy;
//# sourceMappingURL=groupingBy.js.map