import { EqualityComparer, IEnumerable, IEnumerableFactory } from '../../types'; import { getKeySelectorAndComparer } from '../../utilities/utilityFunctions'; export function applyUnion( factory: IEnumerableFactory, overrideKeySelector: ((item: TSource) => TKey) | null, src: Iterable, second: (Iterable | ((item: TSource) => TKey) | EqualityComparer)[] ): IEnumerable { function* generator(): Generator { const [others, keySelector, equalityComparer] = getKeySelectorAndComparer(overrideKeySelector, second); if (equalityComparer) { const seenKeys: TKey[] = []; for (const source of [src, ...others]) { for (const item of source) { const key = keySelector(item); let returnItem = true; for (let i = 0; i < seenKeys.length; i++) { if (equalityComparer(key, seenKeys[i])) { returnItem = false; break; } } if (returnItem) { seenKeys.push(key); yield item; } } } } else { const seenKeys = new Set(); for (const source of [src, ...others]) { for (const item of source) { const key = keySelector(item); if (!seenKeys.has(key)) { seenKeys.add(key); yield item; } } } } } return factory.createBasicEnumerable(generator); }