import { mathRandom } from "../random/index.js"; import { RandomGenerator } from "../random/types.js"; import { BigIntRangeSequence, ConcatSequence, SequenceMarker, FunctionSequence, GeneratorSequence, RangeSequence, RepeatSequence, RepeatForeverSequence, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet, WrappedArray, EMPTY, ZippedSequence } from "./impl.js"; import { Sequence } from "./types.js"; export function wrap(iterable: Iterable): Sequence { if (isSequence(iterable)) { return iterable; } if (Array.isArray(iterable)) { return array(iterable); } if (iterable instanceof Set) { return set(iterable); } if (iterable instanceof Map) { return map(iterable) as unknown as Sequence; } return sequence(iterable); } export function sequence(iterable: Iterable): Sequence { return new WrappedIterable(iterable); } export function empty(): Sequence { return EMPTY; } export function single(obj: T): Sequence { return new WrappedObject(obj); } export function array(array: ReadonlyArray): Sequence { return new WrappedArray(array); } export function arrayLike(arrayLike: ArrayLike): Sequence { return new WrappedArrayLike(arrayLike); } export function set(set: ReadonlySet): Sequence { return new WrappedSet(set); } export function map(map: ReadonlyMap): Sequence<[K, V]> { return new WrappedMap(map); } export function of(...elements: T[]): Sequence { switch (elements.length) { case 0: return empty(); case 1: return single(elements[0]); default: return array(elements); } } export function ofPropertyKeys(...elements: T[]): Sequence { return of(...elements); } export function entries(o: Record | ArrayLike): Sequence<[string, T]> { return array(Object.entries(o)); } export function keys(o: object): Sequence { return array(Object.keys(o)); } export function func(f: () => T): Sequence { return new FunctionSequence(f); } export function generator(generator: () => Iterable): Sequence { return new GeneratorSequence(generator); } export function range(max: number): Sequence export function range(min: number, max: number): Sequence export function range(min: number, max: number, step: number): Sequence export function range(a: number, b?: number, c?: number): Sequence { if (b === undefined) { b = a; a = 0; } if (c === undefined) { c = 1; } return new RangeSequence(a, b, c); } export function bigintRange(max: bigint): Sequence export function bigintRange(min: bigint, max: bigint): Sequence export function bigintRange(min: bigint, max: bigint, step: bigint): Sequence export function bigintRange(a: bigint, b?: bigint, c?: bigint): Sequence { if (b === undefined) { b = a; a = 0n; } if (c === undefined) { c = 1n; } return new BigIntRangeSequence(a, b, c); } export function repeat(value: T, count?: number): Sequence { if (count == undefined) { return new RepeatForeverSequence(value); } if (count < 0) { throw new RangeError(); } if (count === 0) { return empty(); } if (count === 1) { return new WrappedObject(value); } return new RepeatSequence(value, count); } export function randomSequence(random?: RandomGenerator): Sequence { return new FunctionSequence(random ?? mathRandom); } export function concat(...sequences: Sequence[]): Sequence { return new ConcatSequence(sequences); } export function zip(first: Sequence, second: Sequence): Sequence<[T, T]> { return new ZippedSequence(first, second); } export function isSequence(obj: any): obj is Sequence { return obj instanceof SequenceMarker; }