///
///
type IteratorResult = IteratorYieldResult | IteratorReturnResult;
interface IteratorYieldResult {
done: false;
value: Yields;
}
interface IteratorReturnResult {
done: true;
value: Returns;
}
interface Iterator {
// Takes either 0 or 1 arguments - doesn't accept 'undefined'
next: (...args: [] | [Next]) => IteratorResult;
}
interface AsyncIterator {
next: (...args: [] | [Next]) => Promise>;
}
interface Generator extends Iterator {
next: (...args: [] | [Next]) => IteratorResult;
[Symbol.iterator](): Generator;
}
interface AsyncGenerator extends AsyncIterator {
next: (...args: [] | [Next]) => Promise>;
[Symbol.asyncIterator](): AsyncGenerator;
}
interface AsyncIterable {
[Symbol.asyncIterator](): AsyncIterator;
}
interface Iterable {
[Symbol.iterator](): Iterator;
}
interface AsyncIterableIterator extends AsyncIterator {
[Symbol.asyncIterator](): AsyncIterableIterator;
}
interface IterableIterator extends Iterator {
[Symbol.iterator](): IterableIterator;
}
interface IterableFunction extends Iterable {
(): T;
}