import { Collector, Supplier } from '../collector'; import { toArray } from './toArray'; import { GroupingByCollector } from './groupingBy'; import { flatMapping } from '../transformers/flatMapping'; import { mapping } from '../transformers/mapping'; export function groupingByMany ( mapper : ( item : T ) => Iterable ) : Collector, Map>; export function groupingByMany ( mapper : ( item : T ) => Iterable, collector : Collector ) : Collector, Map>; export function groupingByMany> ( mapper : ( item : T ) => Iterable, supplier : Supplier, collector : Collector ) : Collector, Map>; export function groupingByMany> ( mapper : ( item : T ) => Iterable, supplier ?: Supplier | Collector, collector ?: Collector ) : Collector { if ( !supplier && !collector ) { return groupingByMany( mapper, () => new Map(), toArray() ); } else if ( !collector ) { return groupingByMany( mapper, () => new Map(), supplier as Collector ); } return flatMapping( item => Array.from( mapper( item ) ).map( k => [ k, item ] as [ K, T ] ), new GroupingByCollector<[K, T], K, any, any, any>( pair => pair[ 0 ], supplier as Supplier, mapping( pair => pair[ 1 ] ) ) ); }