data-collectors
Version:
A collection of composable reduction operations for arbitrary streams of values
51 lines (50 loc) • 2 kB
TypeScript
export interface Supplier<T> {
(): T;
}
export interface Accumulator<A, T> {
(container: A, item: T): void;
}
export interface Combinator<A> {
(first: A, second: A): A;
}
export interface Finisher<A, R> {
(container: A): R;
}
export interface Collector<T, A, R> {
supply(): A;
accumulate(container: A, item: T): void;
combine(container1: A, container2: A): A;
finish(container: A): R;
then<U>(transformer: (result: R) => U): Collector<T, A, U>;
apply(iterable: Iterable<T>): R;
}
export declare class Collector<T, A, R> {
static of<T, A, R>(supplier: Supplier<A>, accumulator: Accumulator<A, T>, combinator: Combinator<A>, finisher: Finisher<A, R>): Collector<T, A, R>;
static of<T, A>(supplier: Supplier<A>, accumulator: Accumulator<A, T>, combinator: Combinator<A>): Collector<T, A, A>;
}
export declare abstract class BaseCollector<T, A, R> implements Collector<T, A, R> {
abstract supply(): A;
abstract accumulate(container: A, item: T): void;
abstract combine(container1: A, container2: A): A;
abstract finish(container: A): R;
then<U>(transformer: (result: R) => U): Collector<T, A, U>;
apply(iterable: Iterable<T>): R;
}
export declare class FunctionalCollector<T, A, R> extends BaseCollector<T, A, R> implements Collector<T, A, R> {
protected supplier: Supplier<A>;
protected accumulator: Accumulator<A, T>;
protected combinator: Combinator<A>;
protected finisher: Finisher<A, R>;
constructor(supplier: Supplier<A>, accumulator: Accumulator<A, T>, combinator: Combinator<A>, finisher: Finisher<A, R>);
supply(): A;
accumulate(container: A, item: T): void;
combine(container1: A, container2: A): A;
finish(container: A): R;
}
/**
* Applies a given collector to the given iterator's items
*
* @param iterable
* @param collector
*/
export declare function collect<T, R>(iterable: Iterable<T>, collector: Collector<T, any, R>): R;