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* _syncPeek(input: SyncSeries, action: (value: T) => void): Generator { for (const value of input) { action(value); yield value; } } async function* _asyncPeek( input: Series, action: (value: Awaited) => MaybePromise, ): AsyncGenerator> { const awaited = await input; if (_isIterable(awaited)) { for (const value of awaited) { await action(await value); yield value; } } else { for await (const value of awaited) { await action(value); yield value; } } } export function peekSync( ...args: Parameters> ): ReturnType>; export function peekSync( ...args: Parameters>> ): ReturnType>>; export function peekSync( ...args: Parameters>> ): ReturnType>> { return purry(_syncPeek)(...args); } export function peekAsync( ...args: Parameters> ): ReturnType>; export function peekAsync( ...args: Parameters>> ): ReturnType>>; export function peekAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncPeek)(...args); } /** Performs the specified action for each element and passes it through. */ export namespace peek { export const sync = peekSync; export const async = peekAsync; }