///
///
// 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