import { Collector, BaseCollector } from "../collector"; import { Mapper } from "../collections/groupingBy"; import { toArray } from "../collections/toArray"; export class FilteringCollector extends BaseCollector { protected predicate : Mapper; protected collector : Collector; constructor ( predicate : Mapper, collector : Collector ) { super(); this.predicate = predicate; this.collector = collector; } supply () : A { return this.collector.supply(); } accumulate ( container : A, item : T ) : void { if ( this.predicate( item ) ) { this.collector.accumulate( container, item ); } } combine ( container1 : A, container2 : A ) : A { return this.collector.combine( container1, container2 ); } finish ( container : A ) : R { return this.collector.finish( container ); } } export function filtering ( predicate : Mapper ) : Collector; export function filtering ( predicate : Mapper, collector ?: Collector ) : Collector; export function filtering ( predicate : Mapper, collector ?: Collector ) : Collector { return new FilteringCollector( predicate, collector || toArray() as any ); }