import { type Purried, purry } from '../../compositions/purry.js'; import { _isIterable } from '../../controls/_guards.js'; import type { MaybePromise, Series, SyncSeries } from '../../controls/types.js'; function* _syncFilter( input: SyncSeries, test: ((value: T) => value is S) | ((value: T) => boolean), ): Generator { for (const value of input) { if (test(value)) yield value; } } async function* _asyncFilter>( input: Series, test: ((value: Awaited) => value is S) | ((value: Awaited) => MaybePromise), ): AsyncGenerator { const awaited = await input; if (_isIterable(awaited)) { for (const value of awaited) { if (await test(await value)) yield value; } } else { for await (const value of awaited) { if (await test(value)) yield value; } } } export function filterSync( input: SyncSeries, test: (value: T) => value is S, ): Generator; export function filterSync( test: (value: T) => value is S, ): (input: SyncSeries) => Generator; export function filterSync(input: SyncSeries, test: (value: T) => boolean): Generator; export function filterSync(test: (value: T) => boolean): (input: SyncSeries) => Generator; export function filterSync( ...args: Parameters>> ): ReturnType>> { return purry(_syncFilter)(...args); } export function filterAsync>( input: Series, test: (value: Awaited) => value is S, ): AsyncGenerator; export function filterAsync>( test: (value: Awaited) => value is S, ): (input: Series) => AsyncGenerator; export function filterAsync( input: Series, test: (value: Awaited) => MaybePromise, ): AsyncGenerator>; export function filterAsync( test: (value: Awaited) => MaybePromise, ): (input: Series) => AsyncGenerator>; export function filterAsync>( ...args: Parameters>> ): ReturnType>> { return purry(_asyncFilter)(...args); } /** Filters the elements by the specified test. */ export namespace filter { export const sync = filterSync; export const async = filterAsync; }