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* _syncDrop(input: SyncSeries, drop: number): Generator { let leftDrop = drop; for (const value of input) { if (leftDrop > 0) { leftDrop--; continue; } yield value; } } async function* _asyncDrop(input: Series, drop: number): AsyncGenerator { let leftDrop = drop; const awaited = await input; if (_isIterable(awaited)) { for (const value of awaited) { if (leftDrop > 0) { leftDrop--; continue; } yield value; } } else { for await (const value of awaited) { if (leftDrop > 0) { leftDrop--; continue; } yield value; } } } export function dropSync( ...args: Parameters> ): ReturnType>; export function dropSync( ...args: Parameters>> ): ReturnType>>; export function dropSync( ...args: Parameters>> ): ReturnType>> { return purry(_syncDrop)(...args); } export function dropAsync( ...args: Parameters> ): ReturnType>; export function dropAsync( ...args: Parameters>> ): ReturnType>>; export function dropAsync( ...args: Parameters>> ): ReturnType>> { return purry(_asyncDrop)(...args); } /** Drops the first n elements. */ export namespace drop { export const sync = dropSync; export const async = dropAsync; }