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* _syncTake(input: SyncSeries, take: number): Generator { let leftTake = take; for (const value of input) { if (leftTake <= 0) { break; } yield value; leftTake--; } } async function* _asyncTake(input: Series, take: number): AsyncGenerator { let leftTake = take; const awaited = await input; if (_isIterable(awaited)) { for (const value of awaited) { if (leftTake <= 0) { break; } yield value; leftTake--; } } else { for await (const value of awaited) { if (leftTake <= 0) { break; } yield value; leftTake--; } } } export function takeSync( ...args: Parameters> ): ReturnType>; export function takeSync( ...args: Parameters>> ): ReturnType>>; export function takeSync( ...args: Parameters>> ): ReturnType>> { return purry(_syncTake)(...args); } export function takeAsync( ...args: Parameters> ): ReturnType>; export function takeAsync( ...args: Parameters>> ): ReturnType>>; export function takeAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncTake)(...args); } /** Takes the first n elements. */ export namespace take { export const sync = takeSync; export const async = takeAsync; }