/// /// // I don't want to change types of built-ins only because of this rule /* eslint-disable @typescript-eslint/no-explicit-any */ export declare type _Awaitable = PromiseLike | T; export declare type _IteratorSkeleton = { next(value?: unknown): IteratorResult }; export declare type _AsyncIteratorSkeleton = { next(value?: unknown): PromiseLike> }; export declare type _IterableSkeleton = { [Symbol.iterator](): _IteratorSkeleton }; export declare type _AsyncIterableSkeleton = { [Symbol.asyncIterator](): _AsyncIteratorSkeleton }; export declare type _IteratorLike = _IteratorSkeleton | _IterableSkeleton; export declare type _AsyncIteratorLike = _AsyncIteratorSkeleton | _AsyncIterableSkeleton | _IteratorLike> | _IteratorLike; declare global { interface Iterator { map(mapper: (value: T, index: number) => R): Iterator; filter(filterer: (value: T, index: number) => value is R): Iterator; filter(filterer: (value: T, index: number) => unknown): Iterator; asIndexedPairs(): Iterator; take(limit: number): Iterator; drop(limit: number): Iterator; flatMap(mapper: (value: T, index: number) => _IteratorLike): Iterator; forEach(fn: (value: T, index: number) => void): void; toArray(): T[]; reduce(reducer: (previousValue: T, currentValue: T, index: number) => T): T; reduce(reducer: (previousValue: T, currentValue: T, index: number) => T, initialValue: T): T; reduce(reducer: (previousValue: U, currentValue: T, index: number) => U, initialValue: U): U; some(fn: (value: T, index: number) => unknown): boolean; every(fn: (value: T, index: number) => unknown): boolean; find(fn: (value: T, index: number) => unknown): T | undefined; [Symbol.iterator](): Iterator; } interface AsyncIterator { map(mapper: (value: T, index: number) => _Awaitable): AsyncIterator; filter(filterer: (value: T, index: number) => value is R): AsyncIterator; filter(filterer: (value: T, index: number) => _Awaitable): AsyncIterator; asIndexedPairs(): AsyncIterator; take(limit: number): AsyncIterator; drop(limit: number): AsyncIterator; flatMap(mapper: (value: T, index: number) => _Awaitable<_AsyncIteratorLike>): AsyncIterator; forEach(fn: (value: T, index: number) => _Awaitable): Promise; toArray(): Promise<_RA>; reduce(reducer: (previousValue: T, currentValue: T, index: number) => _Awaitable): Promise; reduce(reducer: (previousValue: T, currentValue: T, index: number) => _Awaitable, initialValue: T): Promise; reduce(reducer: (previousValue: U, currentValue: T, index: number) => _Awaitable, initialValue: U): Promise; some(fn: (value: T, index: number) => _Awaitable): Promise; every(fn: (value: T, index: number) => _Awaitable): Promise; find(fn: (value: T, index: number) => _Awaitable): Promise; [Symbol.asyncIterator](): AsyncIterator; } interface IteratorConstructor { readonly prototype: Iterator; new (): Iterator; from(iterable: _IteratorLike): Iterator; range(start: number, end?: number, step?: number, inclusive?: boolean): Iterator; } interface AsyncIteratorConstructor { readonly prototype: AsyncIterator; new (): AsyncIterator; from(iterable: _AsyncIteratorLike): AsyncIterator; range(start: number, end?: number, step?: number, inclusive?: boolean): AsyncIterator; } var Iterator: IteratorConstructor; var AsyncIterator: AsyncIteratorConstructor; } // Additional features available to polyfill (TODO) declare type _MapIterator> = A extends readonly [] ? A : A extends readonly [infer R, ...(infer Rest)] ? readonly [_INR, ..._MapIterator ? Rest : readonly []>] : A extends _RA ? _RA<_INR> : readonly []; declare type _MapAsyncIterator> = A extends readonly [] ? A : A extends readonly [infer R, ...(infer Rest)] ? readonly [_INR, ..._MapIterator ? Rest : readonly []>] : A extends _RA ? _RA<_INR> : readonly []; /** IteratorNextResult */ declare type _INR = R extends _AsyncIteratorLike ? I : never; declare type _RA = readonly T[]; // elegant solution from https://deno.land/std@0.107.0/async/tee.ts // licensed by same lisence as used in this project // license can be found here: https://deno.land/std@0.107.0/LICENSE // modified by me to confirm my needs // ::start declare type _Tuple = N extends N ? number extends N ? _RA : _TupleOf : never; declare type _TupleOf = R["length"] extends N ? R : _TupleOf; // ::end declare type _Length = A["length"] extends number ? A["length"] : never; declare type _IRANR, T = never> = A extends _RA<_AsyncIteratorLike> ? readonly [] extends A ? T : [] extends A ? T : T | V : T; declare type _IfElse = true extends C ? T : F; // Testing purposes & indicator that something is broken type _ = IterableIterator> extends _IteratorLike ? V : never; type _StarMap = (fn: (...args: T extends _IteratorLike ? T extends _RA ? T : readonly V[] : never) => _IfElse, S>) => _IfElse, Iterator>; type _SymmetricDifference = (iterable: _IteratorLike) => Iterator | Exclude>; type _SymmetricDifferenceAsync = (iterable: _AsyncIteratorLike) => AsyncIterator | Exclude>; type DecrementLoop = _Tuple<0, (readonly [0, ..._Tuple<0, R>])["length"] & number> extends _Tuple<0, N> ? R: DecrementLoop])["length"] & number>; type Decrement = number extends N ? number : DecrementLoop; // type FlattenIterator = T extends string ? string : T extends _AsyncIteratorLike ? number extends Depth ? // FlattenIterator, T | Saved> : 0 extends Decrement ? V | Saved : FlattenIterator, Saved> : T; type FlattenIteratorLatter = T extends string ? (number extends Depth ? Saved | T : never) : T extends _IteratorLike ? number extends Depth ? T extends Saved ? Saved : FlattenIteratorLatter : 0 extends Decrement ? V | Saved : FlattenIteratorLatter, Saved> : T; type FlattenIterator = T extends string ? (number extends Depth ? Saved | T : never) : T extends _IteratorLike ? number extends Depth ? T extends Saved ? Saved : FlattenIteratorLatter | T : 0 extends Decrement ? V | Saved : FlattenIteratorLatter, Saved> : T; type FlattenAsyncIteratorLatter = T extends string ? (number extends Depth ? Saved | T : never) : T extends _AsyncIteratorLike ? number extends Depth ? T extends Saved ? Saved : FlattenAsyncIteratorLatter : 0 extends Decrement ? V | Saved : FlattenAsyncIteratorLatter, Saved> : T; type FlattenAsyncIterator = T extends string ? (number extends Depth ? Saved | T : never) : T extends _AsyncIteratorLike ? number extends Depth ? T extends Saved ? Saved : FlattenAsyncIteratorLatter | T : 0 extends Decrement ? V | Saved : FlattenAsyncIteratorLatter, Saved> : T; declare global { interface Iterator { enumerate(): Iterator; entries(): Iterator; roundrobin>(...iterables: A): Iterator<_IRANR>; heads>(...iterables: A): Iterator<_Tuple<_IRANR, _Length>>; flatten(times?: Depth, options?: { keepStringsAsIs?: boolean }): Iterator>; filterMap(fn: (item: T, index: number) => S | E, excludedValue?: E): S; groupBy(fn: (item: T, index: number) => S): Record; groupByToMap(fn: (item: T, index: number) => S): Map; symmetricDifference: _SymmetricDifference; difference(iterable: _IteratorLike): Iterator>; intersection(iterable: _IteratorLike): Iterator; intersperse(item: S): Iterator; each(fn: (value: T, index: number) => void): Iterator; /** @note value is used only when the `next` method of `this` iterator is actually called */ tee(count?: N): _Tuple, N>; zip>(...iterables: A): Iterator]>; skip(count: number): Iterator; contains(value: T): boolean; average(): number; max(): number; min(): number; count(): number; chunked(times?: N): Iterator<_Tuple>; chain>(...iterables: A): Iterator<_IRANR<_RA ? NonNullable : never>, T>>; concat>(...iterables: A): Iterator<_IRANR<_RA ? NonNullable : never>, T>>; cycle(/** @default Infinity */ times?: N): Iterator; repeat(/** @default Infinity */ times?: N): Iterator; starMap: _StarMap; skipWhile(fn: (item: T, index: number) => unknown): Iterator; takeWhile(fn: (item: T, index: number) => unknown): Iterator; dropWhile(fn: (item: T, index: number) => unknown): Iterator; zipLongest>(...iterables: A): Iterator]>; unique(): Iterator; uniqueJustseen(): Iterator; join(separator?: S): string; partition(filterer: (value: T, index: number) => unknown): _Tuple, 2>; partition(filterer: (value: T, index: number) => value is R): readonly [Iterator, Iterator>]; } interface AsyncIterator { entries(): AsyncIterator; enumerate(): AsyncIterator; roundrobin>(...iterables: A): AsyncIterator<_IRANR>; heads>(...iterables: A): AsyncIterator<_Tuple<_IRANR, _Length>>; flatten(times?: Depth, options?: { keepStringsAsIs?: boolean }): AsyncIterator>; // TODO: Better typing filterMap(fn: (item: T, index: number) => S | E, excludedValue?: E): S; groupBy(fn: (item: T, index: number) => S): Promise>; groupByToMap(fn: (item: T, index: number) => S): Promise>; symmetricDifference: _SymmetricDifferenceAsync; difference(iterable: _AsyncIteratorLike): AsyncIterator>; intersection(iterable: _AsyncIteratorLike): AsyncIterator; intersperse(item: _Awaitable): AsyncIterator; each(fn: (value: T, index: number) => _Awaitable): AsyncIterator; tee(count?: N): _Tuple, N>; zip>(...iterables: A): AsyncIterator]>; skip(count: number): AsyncIterator; contains(value: T): Promise; average(): Promise; max(): Promise; min(): Promise; count(): Promise; chunked(times?: N): AsyncIterator<_Tuple>; chain>(...iterables: A): AsyncIterator<_IRANR<_RA ? NonNullable : never>, T>>; concat>(...iterables: A): AsyncIterator<_IRANR<_RA ? NonNullable : never>, T>>; cycle(/** @default Infinity */ times?: N): AsyncIterator; repeat(/** @default Infinity */ times?: N): AsyncIterator; starMap: _StarMap; skipWhile(fn: (item: T, index: number) => _Awaitable): AsyncIterator; takeWhile(fn: (item: T, index: number) => _Awaitable): AsyncIterator; dropWhile(fn: (item: T, index: number) => _Awaitable): AsyncIterator; zipLongest>(...iterables: A): AsyncIterator]>; unique(): AsyncIterator; uniqueJustseen(): AsyncIterator; join(separator?: S): Promise; partition(filterer: (value: T, index: number) => _Awaitable): _Tuple, 2>; partition(filterer: (value: T, index: number) => value is R): readonly [AsyncIterator, AsyncIterator>]; } } // polyfilled ones are easier to manage since i don't need to type another one proposed additional method here declare type keys = "asIndexedPairs" | "drop" | "every" | "filter" | "filter" | "find" | "flatMap" | "forEach" | "map" | "reduce" | "reduce" | "reduce" | "some" | "take" | "toArray"; declare class Config { public additionals: boolean & Record, keys | typeof Symbol.iterator | "next" | "throw" | "return">, boolean>; public polyfilled: boolean & Record; } export const config: Config; export const AsyncIterator: AsyncIteratorConstructor; export const Iterator: IteratorConstructor; /** * Injects `Iterator` and `AsyncIterator` constructors onto globalThis. */ export function installIntoGlobal(): void;