import { EqualityComparer, IEnumerable, IEnumerableFactory } from '../../types'; import { getKeySelectorAndComparer } from '../../utilities/utilityFunctions'; export function applyExcept( 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); const secondKeySet: Set = new Set(others.reduce((prev, curr) => [...prev, ...curr])); if (equalityComparer) { for (const item of src) { const key = keySelector(item); let returnItem = true; for (const secondItemKey of secondKeySet) { if (equalityComparer(key, secondItemKey)) { returnItem = false; break; } } if (returnItem) { secondKeySet.add(key); yield item; } } } else { for (const item of src) { const key = keySelector(item); if (!secondKeySet.has(key)) { secondKeySet.add(key); yield item; } } } } return factory.createBasicEnumerable(generator); }