export interface Supplier { (): T; } export interface Accumulator { (container: A, item: T): void; } export interface Combinator { (first: A, second: A): A; } export interface Finisher { (container: A): R; } export interface Collector { supply(): A; accumulate(container: A, item: T): void; combine(container1: A, container2: A): A; finish(container: A): R; then(transformer: (result: R) => U): Collector; apply(iterable: Iterable): R; } export declare class Collector { static of(supplier: Supplier, accumulator: Accumulator, combinator: Combinator, finisher: Finisher): Collector; static of(supplier: Supplier, accumulator: Accumulator, combinator: Combinator): Collector; } export declare abstract class BaseCollector implements Collector { abstract supply(): A; abstract accumulate(container: A, item: T): void; abstract combine(container1: A, container2: A): A; abstract finish(container: A): R; then(transformer: (result: R) => U): Collector; apply(iterable: Iterable): R; } export declare class FunctionalCollector extends BaseCollector implements Collector { protected supplier: Supplier; protected accumulator: Accumulator; protected combinator: Combinator; protected finisher: Finisher; constructor(supplier: Supplier, accumulator: Accumulator, combinator: Combinator, finisher: Finisher); 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(iterable: Iterable, collector: Collector): R;