import { wrap as wrapSync } from "../sync/index.js"; import { Sequence } from "../sync/types.js"; import { MaybeAsyncGenerator, MaybeAsyncIterable, MaybePromiseLike } from "../types.js"; import { isAsyncIterable } from "../utils.js"; import { WrappedSequence, WrappedAsyncIterable, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncSequence, GeneratorAsyncSequence, RangeAsyncSequence, RepeatForeverAsyncSequence, RepeatAsyncSequence, AsyncSequenceMarker, EMPTY, ConcatAsyncSequence } from "./impl.js"; import { AsyncSequence } from "./types.js"; export function asAsync(sequence: Sequence>): AsyncSequence { return new WrappedSequence(sequence); } export function wrap(iterable: MaybeAsyncIterable>): AsyncSequence { if (isAsyncSequence(iterable)) { return iterable; } if (isAsyncIterable(iterable)) { return sequence(iterable); } return asAsync(wrapSync(iterable)); } export function sequence(iterable: AsyncIterable>): AsyncSequence { return new WrappedAsyncIterable(iterable); } export function empty(): AsyncSequence { return EMPTY; } export function single(obj: MaybePromiseLike): AsyncSequence { return new WrappedObjectAsync(obj); } export function array(array: ReadonlyArray>): AsyncSequence { return new WrappedArrayAsync(array); } export function arrayLike(arrayLike: ArrayLike>): AsyncSequence { return new WrappedArrayLikeAsync(arrayLike); } export function of(...elements: MaybePromiseLike[]): AsyncSequence { switch (elements.length) { case 0: return empty(); case 1: return single(elements[0]); default: return array(elements); } } export function concat(...sequences: AsyncSequence[]): AsyncSequence { return new ConcatAsyncSequence(sequences); } export function func(f: () => MaybePromiseLike): AsyncSequence { return new FunctionAsyncSequence(f); } export function generator(generator: () => MaybeAsyncGenerator>): AsyncSequence { return new GeneratorAsyncSequence(generator); } export function range(max: number): AsyncSequence export function range(min: number, max: number): AsyncSequence export function range(min: number, max: number, step: number): AsyncSequence export function range(a: number, b?: number, c?: number): AsyncSequence { if (b === undefined) { b = a; a = 0; } if (c === undefined) { c = 1; } return new RangeAsyncSequence(a, b, c); } export function repeat(value: MaybePromiseLike, count?: number): AsyncSequence { if (count == undefined) { return new RepeatForeverAsyncSequence(value); } if (count < 0) { throw new Error("count < 0"); } if (count === 0) { return empty(); } if (count === 1) { return new WrappedObjectAsync(value); } return new RepeatAsyncSequence(value, count); } export function isAsyncSequence(obj: any): obj is AsyncSequence { return obj instanceof AsyncSequenceMarker; }