From 727cdc3b2b343ef86f823086f4b81e370d3ebb40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20BECHER?= Date: Sat, 11 May 2024 12:56:12 +0200 Subject: [PATCH] fix AsyncEnumerable types --- src/async.ts | 55 ++++++++++++++++++++-------------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/async.ts b/src/async.ts index 8c5438c..faa4b1d 100644 --- a/src/async.ts +++ b/src/async.ts @@ -9,8 +9,8 @@ import { MaybeAsyncPredicate, MaybeAsyncConverter, MaybeAsyncIterable, MaybeAsyn //#region interfaces -export interface AsyncEnumerable extends AsyncIterable { - iterator(): AsyncIterator; +export interface AsyncEnumerable extends AsyncIterable> { + iterator(): AsyncIterator>; apply(pipeline: (enumerable: AsyncEnumerable) => TResult): TResult; @@ -115,7 +115,6 @@ export interface AsyncEnumerable extends AsyncIterable { cached(): AsyncEnumerable; - asArray(): Promise; toArray(): Promise; toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; toSet(): Promise>; @@ -150,7 +149,7 @@ export namespace AsyncEnumerable { } export function wrap(iterable: MaybeAsyncIterable): AsyncEnumerable { - if (iterable instanceof BaseAsyncEnumerable) { + if (isAsyncEnumerable(iterable)) { return iterable; } @@ -169,19 +168,19 @@ export namespace AsyncEnumerable { return EmptyAsyncEnumerable.INSTANCE; } - export function single(obj: T): AsyncEnumerable { + export function single(obj: T | PromiseLike): AsyncEnumerable { return new WrappedObjectAsync(obj); } - export function array(array: T[]): AsyncEnumerable { + export function array(array: (T | PromiseLike)[]): AsyncEnumerable { return new WrappedArrayAsync(array); } - export function arrayLike(arrayLike: ArrayLike): AsyncEnumerable { + export function arrayLike(arrayLike: ArrayLike<(T | PromiseLike)>): AsyncEnumerable { return new WrappedArrayLikeAsync(arrayLike); } - export function of(...elements: T[]): AsyncEnumerable { + export function of(...elements: (T | PromiseLike)[]): AsyncEnumerable { switch (elements.length) { case 0: return empty(); @@ -222,7 +221,7 @@ export namespace AsyncEnumerable { } if (count < 0) { - throw new RangeError(); + throw new Error("count < 0"); } if (count === 0) { @@ -236,7 +235,7 @@ export namespace AsyncEnumerable { return new RepeatAsyncEnumerable(value, count); } - export function isAsyncEnumerable(obj: any): obj is Enumerable { + export function isAsyncEnumerable(obj: any): obj is AsyncEnumerable { return obj instanceof AsyncEnumerableMarker; } } @@ -254,7 +253,7 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke return this.iterator(); } - abstract iterator(): AsyncIterator; + abstract iterator(): AsyncIterator>; apply(pipeline: (enumerable: AsyncEnumerable) => TResult): TResult { return pipeline(this); @@ -854,10 +853,6 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke return new CacheAsyncEnumerable(this); } - async asArray() { - return await this.toArray(); - } - async toArray() { const array: TElement[] = []; @@ -1185,10 +1180,6 @@ class DelegatedAsyncEnumerable extends AsyncEnumerableMarker implement return this.#enumerable.cached(); } - asArray(): Promise { - return this.#enumerable.asArray(); - } - toArray(): Promise { return this.#enumerable.toArray(); } @@ -1359,9 +1350,9 @@ class RepeatForeverAsyncEnumerable extends BaseAsyncEnumerable { } class WrappedObjectAsync extends BaseAsyncEnumerable { - readonly #obj: T; + readonly #obj: T | PromiseLike; - constructor(obj: T) { + constructor(obj: T | PromiseLike) { super(); this.#obj = obj; @@ -1377,9 +1368,9 @@ class WrappedObjectAsync extends BaseAsyncEnumerable { } class WrappedArrayAsync extends BaseAsyncEnumerable { - readonly #array: T[]; + readonly #array: (T | PromiseLike)[]; - constructor(array: T[]) { + constructor(array: (T | PromiseLike)[]) { super(); this.#array = array; @@ -1390,14 +1381,14 @@ class WrappedArrayAsync extends BaseAsyncEnumerable { } override async *iterator() { - yield* this.#array.values(); + yield* this.#array; } } class WrappedArrayLikeAsync extends BaseAsyncEnumerable { - readonly #arrayLike: ArrayLike; + readonly #arrayLike: ArrayLike>; - constructor(arrayLike: ArrayLike) { + constructor(arrayLike: ArrayLike>) { super(); this.#arrayLike = arrayLike; @@ -1423,8 +1414,8 @@ class WrappedAsyncIterable extends BaseAsyncEnumerable { this.#iterable = iterable; } - override iterator() { - return this.#iterable[Symbol.asyncIterator](); + override async *iterator() { + yield* this.#iterable; } } @@ -1437,8 +1428,8 @@ class GeneratorAsyncEnumerable extends BaseAsyncEnumerable { this.#generator = generator; } - override iterator() { - return this.#generator(); + override async *iterator() { + yield* this.#generator(); } } @@ -1483,10 +1474,6 @@ class WrappedEnumerable extends BaseAsyncEnumerable { return this.#enumerable.maxCount(); } - override async asArray() { - return this.#enumerable.asArray(); - } - override async *iterator() { yield* this.#enumerable; }