import type { Curried } from '../../compositions/curry.js'; import { type Purried, purry } from '../../compositions/purry.js'; import { _isIterable } from '../../controls/_guards.js'; import type { MaybePromise, Series, SyncSeries } from '../../controls/types.js'; function _syncEvery( input: SyncSeries, test: ((value: T) => value is S) | ((value: T) => boolean), ): input is SyncSeries { for (const value of input) { if (!test(value)) return false; } return true; } async function _asyncEvery( input: Series, test: (value: Awaited) => MaybePromise, ): Promise { const awaited = await input; if (_isIterable(awaited)) { for (const value of awaited) { if (!(await test(await value))) return false; } } else { for await (const value of awaited) { if (!(await test(value))) return false; } } return true; } export function everySync( input: SyncSeries, test: (value: T) => value is S, ): input is SyncSeries; export function everySync( test: (value: T) => value is S, ): (input: SyncSeries) => input is SyncSeries; export function everySync(input: SyncSeries, test: (value: T) => boolean): boolean; export function everySync(test: (value: T) => boolean): (input: SyncSeries) => boolean; export function everySync( ...args: Parameters>> ): ReturnType>> { return purry(_syncEvery)(...args); } export function everyAsync( ...args: Parameters> ): ReturnType>; export function everyAsync( ...args: Parameters>> ): ReturnType>>; export function everyAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncEvery)(...args); } /** Determines whether every element satisfies the specified test. */ export namespace every { export const sync = everySync; export const async = everyAsync; }