import type { Curried } from '../../compositions/curry.js'; import { type Purried, purry } from '../../compositions/purry.js'; import { _isIterable } from '../../controls/_guards.js'; import type { Series, SyncSeries } from '../../controls/types.js'; function _syncForEach(input: SyncSeries, action: (value: T) => void): void { for (const value of input) { action(value); } } async function _asyncForEach( input: Series, action: (value: Awaited) => void | Promise, ): Promise { const awaited = await input; if (_isIterable(awaited)) { for (const value of awaited) { await action(await value); } } else { for await (const value of awaited) { await action(value); } } } export function forEachSync( ...args: Parameters> ): ReturnType>; export function forEachSync( ...args: Parameters>> ): ReturnType>>; export function forEachSync( ...args: Parameters>> ): ReturnType>> { return purry(_syncForEach)(...args); } export function forEachAsync( ...args: Parameters> ): ReturnType>; export function forEachAsync( ...args: Parameters>> ): ReturnType>>; export function forEachAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncForEach)(...args); } /** Performs the specified action for each element. */ export namespace forEach { export const sync = forEachSync; export const async = forEachAsync; }