import { InferKeyValueIterableKeys, InferKeyValueIterableTupleKeys, InferKeyValueIterableTupleValues, InferKeyValueIterableValues } from '../infer/iterable'; export type InferMergeMapsReturn, TMaps extends Iterable<[any, any]>[]> = Map | InferKeyValueIterableTupleKeys, InferKeyValueIterableValues | InferKeyValueIterableTupleValues>; /** * Merges N maps into the first map */ export function MergeMaps, TMaps extends Iterable<[any, any]>[]>(firstMap: TFirstMap, ...maps: TMaps): InferMergeMapsReturn { const mergedMap: InferMergeMapsReturn = firstMap; type TIterableValues = [InferKeyValueIterableTupleKeys, InferKeyValueIterableTupleValues]; for (let i = 0, l = maps.length; i < l; i++) { const map: Iterable = maps[i]; const iterator: Iterator = map[Symbol.iterator](); let result: IteratorResult; while (!(result = iterator.next()).done) { mergedMap.set(result.value[0], result.value[1]); } } return mergedMap; } // export function MergeMaps[]>(...maps: TMaps): TMergeMap { // if (maps.length === 0) { // throw new Error(`Expects at least one argument`); // } else { // // const mergedMap: TMergeMap = new Map, TMergeMapValues>(); // const mergedMap: TMergeMap = maps[0]; // for (let i = 1, l = maps.length; i < l; i++) { // const map: TMergeMap = maps[i]; // const iterator: Iterator<[TMergeMapKeys, TMergeMapValues]> = map.entries(); // let result: IteratorResult<[TMergeMapKeys, TMergeMapValues]>; // while (!(result = iterator.next()).done) { // mergedMap.set(result.value[0], result.value[1]); // } // } // return mergedMap; // } // }