import type { Curried } from '../../compositions/curry.js'; import { type Purried, purry } from '../../compositions/purry.js'; import type { MaybePromise, Series, SyncSeries } from '../../controls/types.js'; import { someAsync } from '../reducers/some.js'; import { filterAsync, filterSync } from './filter.js'; const _syncUniqueWith = ( input: SyncSeries, equals: (value1: T, value2: T) => boolean, ): Generator => { const array: T[] = []; return filterSync(input, value1 => array.some(value2 => equals(value1, value2)) ? false : (array.push(value1), true), ); }; const _asyncUniqueWith = ( input: Series, equals: (value1: Awaited, value2: Awaited) => MaybePromise, ): AsyncGenerator> => { const array: Array> = []; return filterAsync(input, async value1 => (await someAsync(array, async value2 => await equals(value1, value2))) ? false : (array.push(value1), true), ); }; export function uniqueWithSync( ...args: Parameters> ): ReturnType>; export function uniqueWithSync( ...args: Parameters>> ): ReturnType>>; export function uniqueWithSync( ...args: Parameters>> ): ReturnType>> { return purry(_syncUniqueWith)(...args); } export function uniqueWithAsync( ...args: Parameters> ): ReturnType>; export function uniqueWithAsync( ...args: Parameters>> ): ReturnType>>; export function uniqueWithAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncUniqueWith)(...args); } export namespace uniqueWith { export const sync = uniqueWithSync; export const async = uniqueWithAsync; }