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 { _uniqueContext } from './_unique-context.js'; import { filterAsync, filterSync } from './filter.js'; const _syncUniqueBy = (input: SyncSeries, key: (value: T) => unknown): Generator => { const isUnique = _uniqueContext(); return filterSync(input, value => isUnique(key(value))); }; const _asyncUniqueBy = ( input: Series, key: (value: Awaited) => MaybePromise, ): AsyncGenerator> => { const isUnique = _uniqueContext(); return filterAsync(input, async value => isUnique(await key(value))); }; export function uniqueBySync( ...args: Parameters> ): ReturnType>; export function uniqueBySync( ...args: Parameters>> ): ReturnType>>; export function uniqueBySync( ...args: Parameters>> ): ReturnType>> { return purry(_syncUniqueBy)(...args); } export function uniqueByAsync( ...args: Parameters> ): ReturnType>; export function uniqueByAsync( ...args: Parameters>> ): ReturnType>>; export function uniqueByAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncUniqueBy)(...args); } export namespace uniqueBy { export const sync = uniqueBySync; export const async = uniqueByAsync; }