data-collectors
Version:
A collection of composable reduction operations for arbitrary streams of values
54 lines • 1.69 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class Collector {
static of(supplier, accumulator, combinator, finisher) {
return new FunctionalCollector(supplier, accumulator, combinator, finisher || (x => x));
}
}
exports.Collector = Collector;
class BaseCollector {
then(transformer) {
return Collector.of(this.supply.bind(this), this.accumulate.bind(this), this.combine.bind(this), (result) => transformer(this.finish(result)));
}
apply(iterable) {
const container = this.supply();
for (let item of iterable) {
this.accumulate(container, item);
}
return this.finish(container);
}
}
exports.BaseCollector = BaseCollector;
class FunctionalCollector extends BaseCollector {
constructor(supplier, accumulator, combinator, finisher) {
super();
this.supplier = supplier;
this.accumulator = accumulator;
this.combinator = combinator;
this.finisher = finisher;
}
supply() {
return this.supplier();
}
accumulate(container, item) {
return this.accumulator(container, item);
}
combine(container1, container2) {
return this.combinator(container1, container2);
}
finish(container) {
return this.finisher(container);
}
}
exports.FunctionalCollector = FunctionalCollector;
/**
* Applies a given collector to the given iterator's items
*
* @param iterable
* @param collector
*/
function collect(iterable, collector) {
return collector.apply(iterable);
}
exports.collect = collect;
//# sourceMappingURL=collector.js.map