import type { Curried } from '../../compositions/curry.js'; import { type Purried, purry } from '../../compositions/purry.js'; import type { MaybePromise, Series, StaticSeries, SyncSeries } from '../../controls/types.js'; import { filterAsync, filterSync } from '../filters/filter.js'; import { _toSet } from './_to-set.js'; const _syncDifferenceBy = ( input: SyncSeries, other: StaticSeries, key: (value: T) => U, ): Generator => { const otherSet = _toSet(other); return filterSync(input, value => !otherSet.has(key(value))); }; const _asyncDifferenceBy = ( input: Series, other: StaticSeries, key: (value: Awaited) => MaybePromise, ): AsyncGenerator> => { const otherSet = _toSet(other); return filterAsync(input, async value => !otherSet.has(await key(value))); }; export function differenceBySync( ...args: Parameters> ): ReturnType>; export function differenceBySync( ...args: Parameters>> ): ReturnType>>; export function differenceBySync( ...args: Parameters>> ): ReturnType>> { return purry(_syncDifferenceBy)(...args); } export function differenceByAsync( ...args: Parameters> ): ReturnType>; export function differenceByAsync( ...args: Parameters>> ): ReturnType>>; export function differenceByAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncDifferenceBy)(...args); } export namespace differenceBy { export const sync = differenceBySync; export const async = differenceByAsync; }