diff --git a/src/async/impl.ts b/src/async/impl.ts index c1c7699..f6665cb 100644 --- a/src/async/impl.ts +++ b/src/async/impl.ts @@ -6,7 +6,7 @@ import { getRandomElementAsync } from "../random/index.js"; import { AsyncRandomOptions } from "../random/types.js"; import { selectionSorter } from "../sorting.js"; import { Sequence } from "../sync/types.js"; -import { MaybeAsyncConverter, MaybeAsyncPredicate, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybePromiseLike, MaybeAsyncGenerator, MaybeAsyncSequence } from "../types.js"; +import { MaybeAsyncAnyPredicate, MaybeAsyncConverter, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybePromiseLike, MaybeAsyncGenerator, MaybeAsyncSequence } from "../types.js"; import { strictEquals, identity, operatorCompare, defaultArrayComparer, combineAsyncComparers, asAsyncIterable } from "../utils.js"; import { array, empty, wrap } from "./index.js"; import { AsyncSequence, GroupedAsyncSequence, OrderedAsyncSequence } from "./types.js"; @@ -25,15 +25,15 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im } select(converter: MaybeAsyncConverter): AsyncSequence { - return new MapperAsyncSequence(this, converter); + return new SelectAsyncSequence(this, converter); } selectMany(converter: MaybeAsyncConverter>): AsyncSequence { - return new FlatMapperAsyncSequence(this, converter); + return new SelectManyAsyncSequence(this, converter); } - where(predicate: MaybeAsyncPredicate): AsyncSequence { - return new FilterAsyncSequence(this, predicate); + where(predicate: MaybeAsyncAnyPredicate): AsyncSequence { + return new WhereAsyncSequence(this, predicate); } groupBy(keySelector: MaybeAsyncConverter, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater | undefined): AsyncSequence>; @@ -133,7 +133,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return new ConcatAsyncSequence(arr); } - async count(predicate?: MaybeAsyncPredicate) { + async count(predicate?: MaybeAsyncAnyPredicate) { let count = 0; if (predicate) { @@ -167,7 +167,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return n >= 0 ? n : Infinity; } - async #tryGetFirst(predicate?: MaybeAsyncPredicate) { + async #tryGetFirst(predicate?: MaybeAsyncAnyPredicate) { if (predicate) { for await (const element of this) { if (await predicate(element)) { @@ -193,7 +193,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im } as const; } - async first(predicate?: MaybeAsyncPredicate) { + async first(predicate?: MaybeAsyncAnyPredicate) { const result = await this.#tryGetFirst(predicate); if (result.found) { @@ -203,13 +203,13 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im throw new Error("No element was found."); } - async firstOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement) { + async firstOrDefault(predicate?: MaybeAsyncAnyPredicate, def?: TElement) { const result = await this.#tryGetFirst(predicate); return result.found ? result.element : def; } - async #tryGetLast(predicate?: MaybeAsyncPredicate) { + async #tryGetLast(predicate?: MaybeAsyncAnyPredicate) { let found = false; let result: TElement | undefined = undefined; @@ -233,7 +233,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im }; } - async last(predicate?: MaybeAsyncPredicate) { + async last(predicate?: MaybeAsyncAnyPredicate) { const result = await this.#tryGetLast(predicate); if (result.found) { @@ -243,13 +243,13 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im throw new Error("No element was found."); } - async lastOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement) { + async lastOrDefault(predicate?: MaybeAsyncAnyPredicate, def?: TElement) { const result = await this.#tryGetLast(predicate); return result.found ? result.element : def; } - async #tryGetSingle(predicate?: MaybeAsyncPredicate) { + async #tryGetSingle(predicate?: MaybeAsyncAnyPredicate) { if (predicate) { let result: { found: true; element: TElement; } | undefined = undefined; @@ -297,7 +297,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im } as const; } - async single(predicate?: MaybeAsyncPredicate) { + async single(predicate?: MaybeAsyncAnyPredicate) { const result = await this.#tryGetSingle(predicate); if (result.found == true) { @@ -318,7 +318,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im throw new Error(reason); } - async singleOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement) { + async singleOrDefault(predicate?: MaybeAsyncAnyPredicate, def?: TElement) { const result = await this.#tryGetSingle(predicate); return result.found ? result.element : def; @@ -391,7 +391,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return acc as unknown as TResult; } - async #find(sorter: MaybeAsyncPredicate, selector?: MaybeAsyncConverter, comparer?: MaybeAsyncComparer) { + async #find(sorter: MaybeAsyncAnyPredicate, selector?: MaybeAsyncConverter, comparer?: MaybeAsyncComparer) { const iterator = this.iterator(); let next = await iterator.next(); @@ -462,11 +462,11 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return new OrderByAsyncSequence(this, true, selector, comparer); } - partition(equater?: MaybeAsyncEquater): AsyncSequence { + partition(equater?: MaybeAsyncEquater): AsyncSequence> { return new PartitionAsyncSequence(this, equater); } - partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence { + partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence> { return new PartitionByAsyncSequence(this, selector, equater); } @@ -502,7 +502,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return new IntersectByAsyncSequence(this, wrap(sequence), selector); } - async all(predicate: MaybeAsyncPredicate) { + async all(predicate: MaybeAsyncAnyPredicate) { const n = await this.nonEnumeratedCount(); if (n === 0) { @@ -518,7 +518,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return true; } - async any(predicate?: MaybeAsyncPredicate) { + async any(predicate?: MaybeAsyncAnyPredicate) { const n = await this.nonEnumeratedCount(); if (n === 0) { @@ -538,7 +538,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return n < 0 ? !(await this.iterator().next()).done : n > 0; } - async none(predicate?: MaybeAsyncPredicate) { + async none(predicate?: MaybeAsyncAnyPredicate) { const n = await this.nonEnumeratedCount(); if (n === 0) { @@ -574,7 +574,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return n === 0 ? this : new SkipLastAsyncSequence(this, n); } - skipWhile(predicate: MaybeAsyncPredicate): AsyncSequence { + skipWhile(predicate: MaybeAsyncAnyPredicate): AsyncSequence { return new SkipWhileAsyncSequence(this, predicate); } @@ -594,7 +594,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return n === 0 ? empty() : new TakeLastAsyncSequence(this, n); } - takeWhile(predicate: MaybeAsyncPredicate): AsyncSequence { + takeWhile(predicate: MaybeAsyncAnyPredicate): AsyncSequence { return new TakeWhileAsyncSequence(this, predicate); } @@ -612,7 +612,7 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return new ZippedAsyncSequence(this, wrap(sequence)); } - indexex(): AsyncSequence<[number, TElement]> { + indexed(): AsyncSequence<[number, TElement]> { return new IndexedAsyncSequence(this); } @@ -620,12 +620,15 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return new ReversedAsyncSequence(this); } - chunked(size: number): AsyncSequence> { + chunked(size: number, asArray?: false): AsyncSequence>; + chunked(size: number, asArray: true): AsyncSequence; + chunked(size: number, asArray?: boolean): AsyncSequence> | AsyncSequence { if (size <= 0) { throw new Error("Chunk size must be positive."); } - return new ChunkedAsyncSequence(this, size); + const sequence = new ChunkedAsyncSequence(this, size); + return asArray ? sequence : sequence.select(array); } async random(options?: AsyncRandomOptions | undefined): Promise { @@ -636,6 +639,10 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return new CacheAsyncSequence(this); } + async asArray(): Promise { + return await this.toArray(); + } + async toArray() { const array: TElement[] = []; @@ -646,8 +653,12 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return array; } - async toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter) { - const map = new Map(); + toMap(keySelector: MaybeAsyncConverter): Promise>; + toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; + async toMap(keySelector: MaybeAsyncConverter, valueSelector?: MaybeAsyncConverter): Promise> { + valueSelector ??= identity; + + const map = new Map(); for await (const element of this) { const key = await keySelector(element); @@ -669,8 +680,12 @@ export abstract class BaseAsyncSequence extends AsyncSequenceMarker im return set; } - async toObject(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter) { - const obj: Record = {}; + toObject(keySelector: MaybeAsyncConverter): Promise>; + toObject(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; + async toObject(keySelector: MaybeAsyncConverter, valueSelector?: MaybeAsyncConverter): Promise> { + valueSelector ??= identity; + + const obj: Record = {}; for await (const element of this) { const key = await keySelector(element); @@ -722,7 +737,7 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.apply(pipeline); } - count(predicate?: MaybeAsyncPredicate | undefined): Promise { + count(predicate?: MaybeAsyncAnyPredicate | undefined): Promise { return this.#sequence.count(predicate); } @@ -746,7 +761,7 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.selectMany(selector); } - where(predicate: MaybeAsyncPredicate): AsyncSequence { + where(predicate: MaybeAsyncAnyPredicate): AsyncSequence { return this.#sequence.where(predicate); } @@ -792,27 +807,27 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.concat(...sequences); } - first(predicate?: MaybeAsyncPredicate | undefined): Promise { + first(predicate?: MaybeAsyncAnyPredicate | undefined): Promise { return this.#sequence.first(predicate); } - firstOrDefault(predicate?: MaybeAsyncPredicate | undefined, def?: TElement | undefined): Promise { + firstOrDefault(predicate?: MaybeAsyncAnyPredicate | undefined, def?: TElement | undefined): Promise { return this.#sequence.firstOrDefault(predicate, def); } - last(predicate?: MaybeAsyncPredicate | undefined): Promise { + last(predicate?: MaybeAsyncAnyPredicate | undefined): Promise { return this.#sequence.last(predicate); } - lastOrDefault(predicate?: MaybeAsyncPredicate | undefined, def?: TElement | undefined): Promise { + lastOrDefault(predicate?: MaybeAsyncAnyPredicate | undefined, def?: TElement | undefined): Promise { return this.#sequence.lastOrDefault(predicate, def); } - single(predicate?: MaybeAsyncPredicate | undefined): Promise { + single(predicate?: MaybeAsyncAnyPredicate | undefined): Promise { return this.#sequence.single(predicate); } - singleOrDefault(predicate?: MaybeAsyncPredicate | undefined, def?: TElement | undefined): Promise { + singleOrDefault(predicate?: MaybeAsyncAnyPredicate | undefined, def?: TElement | undefined): Promise { return this.#sequence.singleOrDefault(predicate, def); } @@ -863,11 +878,11 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.orderByDescending(selector, comparer); } - partition(equater?: MaybeAsyncEquater | undefined): AsyncSequence { + partition(equater?: MaybeAsyncEquater | undefined): AsyncSequence> { return this.#sequence.partition(equater); } - partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater | undefined): AsyncSequence { + partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater | undefined): AsyncSequence> { return this.#sequence.partitionBy(selector, equater); } @@ -903,17 +918,17 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.intersectBy(wrap(sequence), selector, equater); } - all(predicate: MaybeAsyncPredicate): Promise { + all(predicate: MaybeAsyncAnyPredicate): Promise { return this.#sequence.all(predicate); } - any(predicate: MaybeAsyncPredicate): Promise; + any(predicate: MaybeAsyncAnyPredicate): Promise; any(): Promise; any(predicate?: any) { return this.#sequence.any(predicate); } - none(predicate: MaybeAsyncPredicate): Promise; + none(predicate: MaybeAsyncAnyPredicate): Promise; none(): Promise; none(predicate?: any) { return this.#sequence.none(predicate); @@ -927,7 +942,7 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.skipLast(n); } - skipWhile(condition: MaybeAsyncPredicate): AsyncSequence { + skipWhile(condition: MaybeAsyncAnyPredicate): AsyncSequence { return this.#sequence.skipWhile(condition); } @@ -939,7 +954,7 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.takeLast(n); } - takeWhile(condition: MaybeAsyncPredicate): AsyncSequence { + takeWhile(condition: MaybeAsyncAnyPredicate): AsyncSequence { return this.#sequence.takeWhile(condition); } @@ -955,16 +970,18 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.zip(wrap(sequence)); } - indexex(): AsyncSequence<[number, TElement]> { - return this.#sequence.indexex(); + indexed(): AsyncSequence<[number, TElement]> { + return this.#sequence.indexed(); } reversed(): AsyncSequence { return this.#sequence.reversed(); } - chunked(size: number): AsyncSequence> { - return this.#sequence.chunked(size); + chunked(size: number, asArray?: false): AsyncSequence>; + chunked(size: number, asArray: true): AsyncSequence; + chunked(size: number, asArray?: any): AsyncSequence> | AsyncSequence { + return this.#sequence.chunked(size, asArray); } random(options?: AsyncRandomOptions | undefined): Promise { @@ -975,11 +992,17 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.cached(); } + asArray(): Promise { + return this.#sequence.asArray(); + } + toArray(): Promise { return this.#sequence.toArray(); } - toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise> { + toMap(keySelector: MaybeAsyncConverter): Promise>; + toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; + toMap(keySelector: any, valueSelector?: any) { return this.#sequence.toMap(keySelector, valueSelector); } @@ -987,7 +1010,9 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.toSet(); } - toObject(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise> { + toObject(keySelector: MaybeAsyncConverter): Promise>; + toObject(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; + toObject(keySelector: any, valueSelector?: any) { return this.#sequence.toObject(keySelector, valueSelector); } @@ -1352,11 +1377,11 @@ class DistinctByAsyncSequence extends BaseAsyncSequence { } } -class FilterAsyncSequence extends BaseAsyncSequence { +class WhereAsyncSequence extends BaseAsyncSequence { readonly #sequence: AsyncSequence; - readonly #predicate: MaybeAsyncPredicate; + readonly #predicate: MaybeAsyncAnyPredicate; - constructor(sequence: AsyncSequence, predicate: MaybeAsyncPredicate) { + constructor(sequence: AsyncSequence, predicate: MaybeAsyncAnyPredicate) { super(); this.#sequence = sequence; @@ -1372,7 +1397,7 @@ class FilterAsyncSequence extends BaseAsyncSequence { } } -class FlatMapperAsyncSequence extends BaseAsyncSequence { +class SelectManyAsyncSequence extends BaseAsyncSequence { readonly #sequence: AsyncSequence; readonly #converter: MaybeAsyncConverter>; @@ -1408,7 +1433,7 @@ class IndexedAsyncSequence extends BaseAsyncSequence<[number, T]> { } } -class MapperAsyncSequence extends BaseAsyncSequence { +class SelectAsyncSequence extends BaseAsyncSequence { readonly #sequence: AsyncSequence; readonly #converter: MaybeAsyncConverter; @@ -1432,9 +1457,9 @@ class MapperAsyncSequence extends BaseAsyncSequence { class SkipWhileAsyncSequence extends BaseAsyncSequence { readonly #sequence: AsyncSequence; - readonly #predicate: MaybeAsyncPredicate; + readonly #predicate: MaybeAsyncAnyPredicate; - constructor(sequence: AsyncSequence, predicate: MaybeAsyncPredicate) { + constructor(sequence: AsyncSequence, predicate: MaybeAsyncAnyPredicate) { super(); this.#sequence = sequence; @@ -1538,9 +1563,9 @@ class SkipAsyncSequence extends BaseAsyncSequence { class TakeWhileAsyncSequence extends BaseAsyncSequence { readonly #sequence: AsyncSequence; - readonly #predicate: MaybeAsyncPredicate; + readonly #predicate: MaybeAsyncAnyPredicate; - constructor(sequence: AsyncSequence, predicate: MaybeAsyncPredicate) { + constructor(sequence: AsyncSequence, predicate: MaybeAsyncAnyPredicate) { super(); this.#sequence = sequence; @@ -1998,7 +2023,7 @@ class GroupByAsyncSequence extends BaseAsyncSequence extends BaseAsyncSequence> { +class ChunkedAsyncSequence extends BaseAsyncSequence { readonly #sequence: AsyncSequence; readonly #size: number; @@ -2021,13 +2046,13 @@ class ChunkedAsyncSequence extends BaseAsyncSequence> { chunk.push(obj); if (chunk.length === this.#size) { - yield array(chunk); + yield chunk; chunk = []; } } if (chunk.length > 0) { - yield array(chunk); + yield chunk; } } } @@ -2158,7 +2183,7 @@ class CacheAsyncSequence extends BaseAsyncSequence { } } -class PartitionAsyncSequence extends BaseAsyncSequence { +class PartitionAsyncSequence extends BaseAsyncSequence> { readonly #sequence: AsyncSequence; readonly #equater: MaybeAsyncEquater; @@ -2182,11 +2207,13 @@ class PartitionAsyncSequence extends BaseAsyncSequence { } } - yield* partitions.values(); + for (const partition of partitions.values()) { + yield array(partition); + } } } -class PartitionByAsyncSequence extends BaseAsyncSequence { +class PartitionByAsyncSequence extends BaseAsyncSequence> { readonly #sequence: AsyncSequence; readonly #selector: MaybeAsyncConverter; readonly #equater: MaybeAsyncEquater; @@ -2213,6 +2240,8 @@ class PartitionByAsyncSequence extends BaseAsyncSequence(sequence: Sequence>): AsyncSequence { @@ -52,6 +52,10 @@ export function of(...elements: MaybePromiseLike[]): AsyncSequence { } } +export function concat(...sequences: AsyncSequence[]): AsyncSequence { + return new ConcatAsyncSequence(sequences); +} + export function func(f: () => MaybePromiseLike): AsyncSequence { return new FunctionAsyncSequence(f); } diff --git a/src/async/types.ts b/src/async/types.ts index bfcb7c4..9a15884 100644 --- a/src/async/types.ts +++ b/src/async/types.ts @@ -1,13 +1,13 @@ import { Collector } from "../collector/types.js"; import { AsyncRandomOptions } from "../random/types.js"; -import { MaybeAsyncPredicate, MaybeAsyncConverter, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybeAsyncSequence } from "../types.js"; +import { MaybeAsyncAnyPredicate, MaybeAsyncConverter, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybeAsyncSequence } from "../types.js"; export interface AsyncSequence extends AsyncIterable { iterator(): AsyncIterator; apply(pipeline: (sequence: AsyncSequence) => TResult): TResult; - count(predicate?: MaybeAsyncPredicate): Promise; + count(predicate?: MaybeAsyncAnyPredicate): Promise; nonEnumeratedCount(): Promise; fastCount(): Promise; maxCount(): Promise; @@ -15,7 +15,7 @@ export interface AsyncSequence extends AsyncIterable { select(selector: MaybeAsyncConverter): AsyncSequence; selectMany(selector: MaybeAsyncConverter>): AsyncSequence; - where(predicate: MaybeAsyncPredicate): AsyncSequence; + where(predicate: MaybeAsyncAnyPredicate): AsyncSequence; groupBy(keySelector: MaybeAsyncConverter, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncSequence>; groupBy(keySelector: MaybeAsyncConverter, elementSelector: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater): AsyncSequence>; @@ -38,14 +38,14 @@ export interface AsyncSequence extends AsyncIterable { concat(...sequences: MaybeAsyncSequence[]): AsyncSequence; - first(predicate?: MaybeAsyncPredicate): Promise; - firstOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement): Promise; + first(predicate?: MaybeAsyncAnyPredicate): Promise; + firstOrDefault(predicate?: MaybeAsyncAnyPredicate, def?: TElement): Promise; - last(predicate?: MaybeAsyncPredicate): Promise; - lastOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement): Promise; + last(predicate?: MaybeAsyncAnyPredicate): Promise; + lastOrDefault(predicate?: MaybeAsyncAnyPredicate, def?: TElement): Promise; - single(predicate?: MaybeAsyncPredicate): Promise; - singleOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement): Promise; + single(predicate?: MaybeAsyncAnyPredicate): Promise; + singleOrDefault(predicate?: MaybeAsyncAnyPredicate, def?: TElement): Promise; elementAt(index: number): Promise; elementAtOrDefault(index: number, def?: TElement): Promise; @@ -66,8 +66,8 @@ export interface AsyncSequence extends AsyncIterable { orderDescending(comparer?: MaybeAsyncComparer): AsyncSequence; orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): AsyncSequence; - partition(equater?: MaybeAsyncEquater): AsyncSequence; - partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; + partition(equater?: MaybeAsyncEquater): AsyncSequence>; + partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence>; distinct(equater?: MaybeAsyncEquater): AsyncSequence; distinctBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; @@ -81,19 +81,19 @@ export interface AsyncSequence extends AsyncIterable { intersect(sequence: MaybeAsyncSequence, equater?: MaybeAsyncEquater): AsyncSequence; intersectBy(sequence: MaybeAsyncSequence, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; - all(predicate: MaybeAsyncPredicate): Promise; - any(predicate: MaybeAsyncPredicate): Promise; + all(predicate: MaybeAsyncAnyPredicate): Promise; + any(predicate: MaybeAsyncAnyPredicate): Promise; any(): Promise; - none(predicate: MaybeAsyncPredicate): Promise; + none(predicate: MaybeAsyncAnyPredicate): Promise; none(): Promise; skip(n: number): AsyncSequence; skipLast(n: number): AsyncSequence; - skipWhile(condition: MaybeAsyncPredicate): AsyncSequence; + skipWhile(condition: MaybeAsyncAnyPredicate): AsyncSequence; take(n: number): AsyncSequence; takeLast(n: number): AsyncSequence; - takeWhile(condition: MaybeAsyncPredicate): AsyncSequence; + takeWhile(condition: MaybeAsyncAnyPredicate): AsyncSequence; peek(action: MaybeAsyncAction): AsyncSequence; @@ -101,19 +101,24 @@ export interface AsyncSequence extends AsyncIterable { zip(sequence: MaybeAsyncSequence): AsyncSequence<[TElement, TOther]>; - indexex(): AsyncSequence<[number, TElement]>; + indexed(): AsyncSequence<[number, TElement]>; reversed(): AsyncSequence; - chunked(size: number): AsyncSequence>; + chunked(size: number, asArray?: false): AsyncSequence>; + chunked(size: number, asArray: true): AsyncSequence; random(options?: AsyncRandomOptions): Promise; cached(): AsyncSequence; + asArray(): Promise; + toArray(): Promise; + toMap(keySelector: MaybeAsyncConverter): Promise>; toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; toSet(): Promise>; + toObject(keySelector: MaybeAsyncConverter): Promise>; toObject(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; collect(collector: Collector): Promise; diff --git a/src/sync/impl.ts b/src/sync/impl.ts index e814745..5190a66 100644 --- a/src/sync/impl.ts +++ b/src/sync/impl.ts @@ -1,3 +1,5 @@ +import util from "util"; + import { BaseAsyncSequence } from "../async/impl.js"; import { AsyncSequence } from "../async/types.js"; import { Collector } from "../collector/types.js"; @@ -6,7 +8,7 @@ import { createEqualitySet } from "../equality-set.js"; import { createQueue } from "../queue.js"; import { getRandomElement } from "../random/index.js"; import { RandomOptions } from "../random/types.js"; -import { Converter, FilterPredicate, Equater, BiConverter, Predicate, Accumulator, Comparer, Action } from "../types.js"; +import { AnyPredicate, Converter, FilterPredicate, Equater, BiConverter, Accumulator, Comparer, Action } from "../types.js"; import { strictEquals, identity, operatorCompare, reverseComparer, asIterable, defaultArrayComparer, combineComparers } from "../utils.js"; import { array, empty } from "./index.js"; import { Sequence, GroupedSequence, OrderedSequence } from "./types.js"; @@ -18,6 +20,18 @@ export abstract class BaseSequence extends SequenceMarker implements S return this.iterator(); } + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return "Sequence {}"; + } + + override valueOf() { + return this.toJSON(); + } + + toJSON() { + return this.asArray(); + } + abstract iterator(): Iterator; apply(pipeline: (sequence: this) => TResult) { @@ -32,8 +46,10 @@ export abstract class BaseSequence extends SequenceMarker implements S return new SelectManySequence(this, converter); } - where(predicate: FilterPredicate): Sequence { - return new WhereSequence(this, predicate); + where(predicate: FilterPredicate): Sequence; + where(predicate: AnyPredicate): Sequence; + where(predicate: any) { + return new WhereSequence(this, predicate); } groupBy(keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater): Sequence> { @@ -125,7 +141,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return new ConcatSequence(arr); } - count(predicate?: Predicate) { + count(predicate?: AnyPredicate) { let count = 0; if (predicate) { @@ -159,7 +175,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return n >= 0 ? n : Infinity; } - #tryGetFirst(predicate?: Predicate): { found: boolean, element?: TElement | undefined } { + #tryGetFirst(predicate?: AnyPredicate): { found: boolean, element?: TElement | undefined } { if (predicate) { for (const element of this) { if (predicate(element)) { @@ -185,7 +201,7 @@ export abstract class BaseSequence extends SequenceMarker implements S }; } - first(predicate?: Predicate) { + first(predicate?: AnyPredicate) { const result = this.#tryGetFirst(predicate); if (result.found) { @@ -195,13 +211,13 @@ export abstract class BaseSequence extends SequenceMarker implements S throw new Error("No element was found."); } - firstOrDefault(predicate?: Predicate, def?: TElement) { + firstOrDefault(predicate?: AnyPredicate, def?: TElement) { const result = this.#tryGetFirst(predicate); return result.found ? result.element : def; } - #tryGetLast(predicate?: Predicate): { found: boolean, element?: TElement } { + #tryGetLast(predicate?: AnyPredicate): { found: boolean, element?: TElement } { let found = false; let result: TElement | undefined = undefined; @@ -225,7 +241,7 @@ export abstract class BaseSequence extends SequenceMarker implements S }; } - last(predicate?: Predicate) { + last(predicate?: AnyPredicate) { const result = this.#tryGetLast(predicate); if (result.found) { @@ -235,13 +251,13 @@ export abstract class BaseSequence extends SequenceMarker implements S throw new Error("No element was found."); } - lastOrDefault(predicate?: Predicate, def?: TElement) { + lastOrDefault(predicate?: AnyPredicate, def?: TElement) { const result = this.#tryGetLast(predicate); return result.found ? result.element : def; } - #tryGetSingle(predicate?: Predicate): { found: boolean, element?: TElement, reason?: number } { + #tryGetSingle(predicate?: AnyPredicate): { found: boolean, element?: TElement, reason?: number } { if (predicate) { let result: { found: boolean; element: TElement; } | undefined = undefined; @@ -289,7 +305,7 @@ export abstract class BaseSequence extends SequenceMarker implements S }; } - single(predicate?: Predicate) { + single(predicate?: AnyPredicate) { const result = this.#tryGetSingle(predicate); if (result.found) { @@ -310,7 +326,7 @@ export abstract class BaseSequence extends SequenceMarker implements S throw new Error(reason); } - singleOrDefault(predicate?: Predicate, def?: TElement) { + singleOrDefault(predicate?: AnyPredicate, def?: TElement) { const result = this.#tryGetSingle(predicate); return result.found ? result.element : def; @@ -383,7 +399,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return acc as unknown as TResult; } - #find(sorter: Predicate, selector?: Converter, comparer?: Comparer) { + #find(sorter: AnyPredicate, selector?: Converter, comparer?: Comparer) { const iterator = this.iterator(); let next = iterator.next(); @@ -454,11 +470,11 @@ export abstract class BaseSequence extends SequenceMarker implements S return new OrderBySequence(this, true, selector, comparer); } - partition(equater?: Equater): Sequence { + partition(equater?: Equater): Sequence> { return new PartitionSequence(this, equater); } - partitionBy(selector: Converter, equater?: Equater): Sequence { + partitionBy(selector: Converter, equater?: Equater): Sequence> { return new PartitionBySequence(this, selector, equater); } @@ -494,7 +510,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return new IntersectBySequence(this, sequence, selector); } - all(predicate: Predicate) { + all(predicate: AnyPredicate) { const n = this.nonEnumeratedCount(); if (n === 0) { @@ -510,7 +526,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return true; } - any(predicate?: Predicate) { + any(predicate?: AnyPredicate) { const n = this.nonEnumeratedCount(); if (n === 0) { @@ -530,7 +546,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return n < 0 ? !this.iterator().next().done : n > 0; } - none(predicate?: Predicate) { + none(predicate?: AnyPredicate) { const n = this.nonEnumeratedCount(); if (n === 0) { @@ -566,7 +582,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return n === 0 ? this : new SkipLastSequence(this, n); } - skipWhile(predicate: Predicate): Sequence { + skipWhile(predicate: AnyPredicate): Sequence { return new SkipWhileSequence(this, predicate); } @@ -586,7 +602,7 @@ export abstract class BaseSequence extends SequenceMarker implements S return n === 0 ? empty() : new TakeLastSequence(this, n); } - takeWhile(predicate: Predicate): Sequence { + takeWhile(predicate: AnyPredicate): Sequence { return new TakeWhileSequence(this, predicate); } @@ -612,12 +628,15 @@ export abstract class BaseSequence extends SequenceMarker implements S return new ReversedSequence(this); } - chunked(size: number): Sequence> { + chunked(size: number, asArray?: false): Sequence>; + chunked(size: number, asArray: true): Sequence; + chunked(size: number, asArray?: boolean): Sequence> | Sequence { if (size <= 0) { throw new Error("Chunk size must be positive."); } - return new ChunkedSequence(this, size); + const sequence = new ChunkedSequence(this, size); + return asArray ? sequence : sequence.select(array); } random(options?: RandomOptions) { @@ -632,12 +651,20 @@ export abstract class BaseSequence extends SequenceMarker implements S return new AwaitedSequence(this); } + asArray() { + return this.toArray(); + } + toArray() { return Array.from(this); } - toMap(keySelector: Converter, valueSelector: Converter) { - const map = new Map(); + toMap(keySelector: Converter): Map; + toMap(keySelector: Converter, valueSelector: Converter): Map; + toMap(keySelector: Converter, valueSelector?: Converter): Map { + valueSelector ??= identity; + + const map = new Map(); for (const element of this) { const key = keySelector(element); @@ -653,8 +680,12 @@ export abstract class BaseSequence extends SequenceMarker implements S return new Set(this); } - toObject(keySelector: Converter, valueSelector: Converter) { - const obj: Record = {}; + toObject(keySelector: Converter): Record; + toObject(keySelector: Converter, valueSelector: Converter): Record; + toObject(keySelector: Converter, valueSelector?: Converter): Record { + valueSelector ??= identity; + + const obj: Record = {}; for (const element of this) { const key = keySelector(element); @@ -698,6 +729,14 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.iterator(); } + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return inspect(this.#sequence); + } + + toJSON() { + return this.#sequence.toJSON(); + } + iterator() { return this.#sequence.iterator(); } @@ -706,7 +745,7 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.apply(pipeline); } - count(predicate?: Predicate) { + count(predicate?: AnyPredicate) { return this.#sequence.count(predicate); } @@ -730,7 +769,9 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.selectMany(selector); } - where(predicate: FilterPredicate) { + where(predicate: FilterPredicate): Sequence; + where(predicate: AnyPredicate): Sequence; + where(predicate: any): Sequence { return this.#sequence.where(predicate); } @@ -776,27 +817,27 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.concat(...sequences); } - first(predicate?: Predicate) { + first(predicate?: AnyPredicate) { return this.#sequence.first(predicate); } - firstOrDefault(predicate?: Predicate, def?: TElement) { + firstOrDefault(predicate?: AnyPredicate, def?: TElement) { return this.#sequence.firstOrDefault(predicate, def); } - last(predicate?: Predicate) { + last(predicate?: AnyPredicate) { return this.#sequence.last(predicate); } - lastOrDefault(predicate?: Predicate, def?: TElement) { + lastOrDefault(predicate?: AnyPredicate, def?: TElement) { return this.#sequence.lastOrDefault(predicate, def); } - single(predicate?: Predicate) { + single(predicate?: AnyPredicate) { return this.#sequence.single(predicate); } - singleOrDefault(predicate?: Predicate, def?: TElement) { + singleOrDefault(predicate?: AnyPredicate, def?: TElement) { return this.#sequence.singleOrDefault(predicate, def); } @@ -844,11 +885,11 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.orderByDescending(selector, comparer); } - partition(equater?: Equater | undefined): Sequence { + partition(equater?: Equater | undefined): Sequence> { return this.#sequence.partition(equater); } - partitionBy(selector: Converter, equater?: Equater | undefined): Sequence { + partitionBy(selector: Converter, equater?: Equater | undefined): Sequence> { return this.#sequence.partitionBy(selector, equater); } @@ -884,17 +925,17 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.intersectBy(sequence, selector, equater); } - all(predicate: Predicate) { + all(predicate: AnyPredicate) { return this.#sequence.all(predicate); } - any(predicate: Predicate): boolean; + any(predicate: AnyPredicate): boolean; any(): boolean; any(predicate?: any) { return this.#sequence.any(predicate); } - none(predicate: Predicate): boolean; + none(predicate: AnyPredicate): boolean; none(): boolean; none(predicate?: any) { return this.#sequence.none(predicate); @@ -908,7 +949,7 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.skipLast(n); } - skipWhile(condition: Predicate) { + skipWhile(condition: AnyPredicate) { return this.#sequence.skipWhile(condition); } @@ -920,7 +961,7 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.takeLast(n); } - takeWhile(condition: Predicate) { + takeWhile(condition: AnyPredicate) { return this.#sequence.takeWhile(condition); } @@ -944,8 +985,10 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.reversed(); } - chunked(size: number) { - return this.#sequence.chunked(size); + chunked(size: number, asArray?: false): Sequence>; + chunked(size: number, asArray: true): Sequence; + chunked(size: number, asArray?: any): Sequence> | Sequence { + return this.#sequence.chunked(size, asArray); } random(options?: RandomOptions) { @@ -960,11 +1003,17 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.awaited(); } + asArray() { + return this.#sequence.asArray(); + } + toArray() { return this.#sequence.toArray(); } - toMap(keySelector: Converter, valueSelector: Converter) { + toMap(keySelector: Converter): Map; + toMap(keySelector: Converter, valueSelector: Converter): Map; + toMap(keySelector: any, valueSelector?: any) { return this.#sequence.toMap(keySelector, valueSelector); } @@ -972,7 +1021,9 @@ export class DelegatedSequence extends SequenceMarker implements Seque return this.#sequence.toSet(); } - toObject(keySelector: Converter, valueSelector: Converter) { + toObject(keySelector: Converter): Record; + toObject(keySelector: Converter, valueSelector: Converter): Record; + toObject(keySelector: any, valueSelector?: any) { return this.#sequence.toObject(keySelector, valueSelector); } @@ -993,8 +1044,17 @@ export class GroupedSequenceImpl extends DelegatedSequence extends BaseSequence implements OrderedSequence { readonly #sequence: Sequence; readonly #sorter: Comparer | undefined; @@ -1008,6 +1068,10 @@ export abstract class BaseOrderedSequence extends BaseSequence extends BaseSequence): OrderedSequence { return new ThenOrderSequence(this, false, comparer); } @@ -1063,6 +1131,10 @@ class EmptySequence extends BaseSequence { } override *iterator() { } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Empty {}`; + } } export const EMPTY = new EmptySequence(); @@ -1097,6 +1169,10 @@ export class RangeSequence extends BaseSequence { yield i; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Range { start: ${inspect(this.#min)}, end: ${inspect(this.#max)}, step: ${inspect(this.#step)} }`; + } } export class BigIntRangeSequence extends BaseSequence { @@ -1129,6 +1205,10 @@ export class BigIntRangeSequence extends BaseSequence { yield i; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `BigIntRange { start: ${inspect(this.#min)}, end: ${inspect(this.#max)}, step: ${inspect(this.#step)} }`; + } } export class RepeatSequence extends BaseSequence { @@ -1157,6 +1237,10 @@ export class RepeatSequence extends BaseSequence { yield this.#value; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Repeat { value: ${inspect(this.#value)}, amount: ${inspect(this.#count)} }`; + } } export class RepeatForeverSequence extends BaseSequence { @@ -1181,6 +1265,10 @@ export class RepeatForeverSequence extends BaseSequence { yield this.#value; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `RepeatForever { value: ${inspect(this.#value)} }`; + } } export class WrappedObject extends BaseSequence { @@ -1203,6 +1291,10 @@ export class WrappedObject extends BaseSequence { override *iterator() { yield this.#obj; } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedObject { value: ${inspect(this.#obj)} }`; + } } export class WrappedIterable extends BaseSequence { @@ -1217,17 +1309,25 @@ export class WrappedIterable extends BaseSequence { override iterator() { return this.#iterable[Symbol.iterator](); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedIterable { value: ${inspect(this.#iterable)} }`; + } } -export class WrappedArray extends BaseSequence { - readonly #array: T[]; +export class WrappedReadonlyArray extends BaseSequence { + readonly #array: ReadonlyArray; - constructor(array: T[]) { + constructor(array: ReadonlyArray) { super(); this.#array = array; } + get array() { + return this.#array; + } + override nonEnumeratedCount() { return this.#array.length; } @@ -1244,11 +1344,11 @@ export class WrappedArray extends BaseSequence { return this.#array.includes(obj); } - override all(predicate: Predicate) { + override all(predicate: AnyPredicate) { return this.#array.every(predicate); } - override any(predicate?: Predicate) { + override any(predicate?: AnyPredicate) { if (predicate) { return this.#array.some(predicate); } @@ -1256,7 +1356,7 @@ export class WrappedArray extends BaseSequence { return this.#array.length > 0; } - override none(predicate?: Predicate) { + override none(predicate?: AnyPredicate) { if (predicate) { return !this.#array.some(predicate); } @@ -1277,6 +1377,24 @@ export class WrappedArray extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedArray { value: ${inspect(this.#array)} }`; + } +} + +export class WrappedArray extends WrappedReadonlyArray { + constructor(array: T[]) { + super(array); + } + + override asArray() { + return this.array as T[]; + } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedArray { value: ${inspect(this.array)} }`; + } } export class WrappedArrayLike extends BaseSequence { @@ -1313,12 +1431,16 @@ export class WrappedArrayLike extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedArrayLike { value: ${inspect(this.#arrayLike)} }`; + } } export class WrappedSet extends BaseSequence { - readonly #set: Set; + readonly #set: ReadonlySet; - constructor(set: Set) { + constructor(set: ReadonlySet) { super(); this.#set = set; @@ -1343,12 +1465,16 @@ export class WrappedSet extends BaseSequence { override iterator() { return this.#set.values(); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedSet { value: ${inspect(this.#set)} }`; + } } export class WrappedMap extends BaseSequence<[K, V]> { - readonly #map: Map; + readonly #map: ReadonlyMap; - constructor(map: Map) { + constructor(map: ReadonlyMap) { super(); this.#map = map; @@ -1377,6 +1503,10 @@ export class WrappedMap extends BaseSequence<[K, V]> { override iterator() { return this.#map.entries(); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedMap { value: ${inspect(this.#map)} }`; + } } export class GeneratorSequence extends BaseSequence { @@ -1391,6 +1521,10 @@ export class GeneratorSequence extends BaseSequence { override iterator() { return this.#generator()[Symbol.iterator](); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedGenerator { value: ${inspect(this.#generator)} }`; + } } export class FunctionSequence extends BaseSequence { @@ -1415,6 +1549,10 @@ export class FunctionSequence extends BaseSequence { yield this.#f(); } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `WrappedFunction { value: ${inspect(this.#f)} }`; + } } export class ConcatSequence extends BaseSequence { @@ -1467,6 +1605,10 @@ export class ConcatSequence extends BaseSequence { yield* sequence; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Concat { sequences: ${inspect(this.#sequences)} }`; + } } class DistinctSequence extends BaseSequence { @@ -1493,18 +1635,22 @@ class DistinctSequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Distinct { equater: ${inspect(this.#equater)}, sequence: ${inspect(this.#sequence)} }`; + } } class DistinctBySequence extends BaseSequence { readonly #sequence: Sequence; - readonly #selector: Converter; + readonly #converter: Converter; readonly #equater: Equater | undefined; - constructor(sequence: Sequence, selector: Converter, equater?: Equater) { + constructor(sequence: Sequence, converter: Converter, equater?: Equater) { super(); this.#sequence = sequence; - this.#selector = selector; + this.#converter = converter; this.#equater = equater; } @@ -1516,11 +1662,15 @@ class DistinctBySequence extends BaseSequence { const set = createEqualitySet(this.#equater); for (const obj of this.#sequence) { - if (set.add(this.#selector(obj))) { + if (set.add(this.#converter(obj))) { yield obj; } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `DistinctBy { converter: ${inspect(this.#converter)}, equater: ${inspect(this.#equater)}, sequence: ${inspect(this.#sequence)} }`; + } } class WhereSequence extends BaseSequence { @@ -1545,6 +1695,10 @@ class WhereSequence extends BaseSequence extends BaseSequence { @@ -1563,6 +1717,10 @@ class SelectManySequence extends BaseSequence { yield* this.#converter(obj); } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `SelectMany { converter: ${inspect(this.#converter)}, sequence: ${inspect(this.#sequence)} }`; + } } class IndexedSequence extends BaseSequence<[number, T]> { @@ -1589,6 +1747,10 @@ class IndexedSequence extends BaseSequence<[number, T]> { yield [i++, obj] as [number, T]; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Indexed { sequence: ${inspect(this.#sequence)} }`; + } } class SelectSequence extends BaseSequence { @@ -1615,13 +1777,17 @@ class SelectSequence extends BaseSequence { yield this.#converter(obj); } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Select { converter: ${inspect(this.#converter)}, sequence: ${inspect(this.#sequence)} }`; + } } class SkipWhileSequence extends BaseSequence { readonly #sequence: Sequence; - readonly #predicate: Predicate; + readonly #predicate: AnyPredicate; - constructor(sequence: Sequence, predicate: Predicate) { + constructor(sequence: Sequence, predicate: AnyPredicate) { super(); this.#sequence = sequence; @@ -1644,6 +1810,10 @@ class SkipWhileSequence extends BaseSequence { yield* e; } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `SkipWhile { predicate: ${inspect(this.#predicate)}, sequence: ${inspect(this.#sequence)} }`; + } } class SkipLastSequence extends BaseSequence { @@ -1689,6 +1859,10 @@ class SkipLastSequence extends BaseSequence { i = (i + 1) % this.#n; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `SkipLast { amount: ${inspect(this.#n)}, sequence: ${inspect(this.#sequence)} }`; + } } class SkipSequence extends BaseSequence { @@ -1725,13 +1899,17 @@ class SkipSequence extends BaseSequence { yield* asIterable(iterator); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Skip { amount: ${inspect(this.#n)}, sequence: ${inspect(this.#sequence)} }`; + } } class TakeWhileSequence extends BaseSequence { readonly #sequence: Sequence; - readonly #predicate: Predicate; + readonly #predicate: AnyPredicate; - constructor(sequence: Sequence, predicate: Predicate) { + constructor(sequence: Sequence, predicate: AnyPredicate) { super(); this.#sequence = sequence; @@ -1751,6 +1929,10 @@ class TakeWhileSequence extends BaseSequence { yield obj; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `TakeWhile { predicate: ${inspect(this.#predicate)}, sequence: ${inspect(this.#sequence)} }`; + } } class TakeLastSequence extends BaseSequence { @@ -1782,6 +1964,10 @@ class TakeLastSequence extends BaseSequence { yield* queue; } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `TakeLast { amount: ${inspect(this.#n)}, sequence: ${inspect(this.#sequence)} }`; + } } class TakeSequence extends BaseSequence { @@ -1819,17 +2005,33 @@ class TakeSequence extends BaseSequence { i--; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Take { amount: ${inspect(this.#n)}, sequence: ${inspect(this.#sequence)} }`; + } } class OrderSequence extends BaseOrderedSequence { constructor(sequence: Sequence, descending: boolean, sorter?: Comparer) { super(sequence, sorter, descending); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Order${this.descending ? "Descending" : ""} { sequence: ${inspect(this.sequence)} }`; + } } class OrderBySequence extends BaseOrderedSequence { + readonly #selector: Converter; + constructor(sequence: Sequence, descending: boolean, selector: Converter, sorter?: Comparer) { super(sequence, OrderBySequence.#createSorter(selector, sorter), descending); + + this.#selector = selector; + } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `OrderBy${this.descending ? "Descending" : ""} { converter: ${inspect(this.#selector)}, sequence: ${inspect(this.sequence)} }`; } static #createSorter(selector: Converter, sorter?: Comparer) { @@ -1842,11 +2044,23 @@ class ThenOrderSequence extends BaseOrderedSequence { constructor(sequence: OrderedSequence, descending: boolean, sorter?: Comparer) { super(sequence, combineComparers(sequence.comparer ?? defaultArrayComparer, sorter ?? defaultArrayComparer), descending); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `ThenOrder${this.descending ? "Descending" : ""} { sequence: ${inspect(this.sequence)} }`; + } } class ThenOrderBySequence extends BaseOrderedSequence { + readonly #selector: Converter; + constructor(sequence: OrderedSequence, descending: boolean, selector: Converter, sorter?: Comparer) { super(sequence, ThenOrderBySequence.#createCombinedSorter(sequence.comparer, selector, sorter), descending); + + this.#selector = selector; + } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `ThenOrderBy${this.descending ? "Descending" : ""} { converter: ${inspect(this.#selector)}, sequence: ${inspect(this.sequence)} }`; } static #createCombinedSorter(baseSorter: Comparer | undefined, selector: Converter, sorter?: Comparer) { @@ -1880,6 +2094,10 @@ class AppendSequence extends BaseSequence { yield* this.#sequence; yield this.#obj; } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Append { value: ${inspect(this.#obj)}, sequence: ${inspect(this.#sequence)} }`; + } } class PrependSequence extends BaseSequence { @@ -1906,6 +2124,10 @@ class PrependSequence extends BaseSequence { yield this.#obj; yield* this.#sequence; } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Prepend { value: ${inspect(this.#obj)}, sequence: ${inspect(this.#sequence)} }`; + } } class PeekSequence extends DelegatedSequence { @@ -1923,6 +2145,10 @@ class PeekSequence extends DelegatedSequence { yield obj; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Prepend { action: ${inspect(this.#action)}, sequence: ${inspect(this.sequence)} }`; + } } class ZippedSequence extends BaseSequence<[T, U]> { @@ -1962,6 +2188,10 @@ class ZippedSequence extends BaseSequence<[T, U]> { yield [firstNext.value, secondNext.value] as [T, U]; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Zip { first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class UnionSequence extends BaseSequence { @@ -1995,6 +2225,10 @@ class UnionSequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Union { first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class UnionBySequence extends BaseSequence { @@ -2030,6 +2264,10 @@ class UnionBySequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Zip { converter: ${inspect(this.#selector)}, equater: ${inspect(this.#equater)}, first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class ExceptSequence extends BaseSequence { @@ -2062,6 +2300,10 @@ class ExceptSequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Except { equater: ${inspect(this.#equater)}, first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class ExceptBySequence extends BaseSequence { @@ -2096,6 +2338,10 @@ class ExceptBySequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `ExceptBy { converter: ${inspect(this.#selector)}, equater: ${inspect(this.#equater)}, first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class IntersectSequence extends BaseSequence { @@ -2128,6 +2374,10 @@ class IntersectSequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Intersect { equater: ${inspect(this.#equater)}, first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class IntersectBySequence extends BaseSequence { @@ -2162,6 +2412,10 @@ class IntersectBySequence extends BaseSequence { } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `IntersectBy { converter: ${inspect(this.#selector)}, equater: ${inspect(this.#equater)}, first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class ReversedSequence extends BaseSequence { @@ -2192,21 +2446,25 @@ class ReversedSequence extends BaseSequence { yield buffer.pop()!; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Reversed { sequence: ${inspect(this.#sequence)} }`; + } } class GroupBySequence extends BaseSequence> { readonly #sequence: Sequence; readonly #keySelector: Converter; readonly #elementSelector: Converter; - readonly #keyComparer: Equater | undefined; + readonly #keyEquater: Equater | undefined; - constructor(sequence: Sequence, keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater) { + constructor(sequence: Sequence, keySelector: Converter, elementSelector?: Converter, keyEquater?: Equater) { super(); this.#sequence = sequence; this.#keySelector = keySelector; this.#elementSelector = elementSelector ?? identity as Converter; - this.#keyComparer = keyComparer; + this.#keyEquater = keyEquater; } override maxCount() { @@ -2214,7 +2472,7 @@ class GroupBySequence extends BaseSequence(this.#keyComparer); + const groupings = createEqualityMap(this.#keyEquater); for (const obj of this.#sequence) { const key = this.#keySelector(obj); @@ -2233,9 +2491,13 @@ class GroupBySequence extends BaseSequence extends BaseSequence> { +class ChunkedSequence extends BaseSequence { readonly #sequence: Sequence; readonly #size: number; @@ -2262,15 +2524,19 @@ class ChunkedSequence extends BaseSequence> { chunk.push(obj); if (chunk.length === this.#size) { - yield array(chunk); + yield chunk; chunk = []; } } if (chunk.length > 0) { - yield array(chunk); + yield chunk; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `ChunkedAsArray { size: ${inspect(this.#size, options)} sequence: ${inspect(this.#sequence, options)} }`; + } } class JoinSequence extends BaseSequence { @@ -2279,9 +2545,9 @@ class JoinSequence extends BaseSequence readonly #firstKeySelector: Converter; readonly #secondKeySelector: Converter; readonly #resultSelector: BiConverter; - readonly #keyComparer: Equater; + readonly #keyEquater: Equater; - constructor(first: Sequence, second: Sequence, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyComparer?: Equater) { + constructor(first: Sequence, second: Sequence, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyEquater?: Equater) { super(); this.#first = first; @@ -2289,7 +2555,7 @@ class JoinSequence extends BaseSequence this.#firstKeySelector = firstKeySelector; this.#secondKeySelector = secondKeySelector; this.#resultSelector = resultSelector ?? JoinSequence.#defaultResultSelector as BiConverter; - this.#keyComparer = keyComparer ?? strictEquals; + this.#keyEquater = keyEquater ?? strictEquals; } static #defaultResultSelector(first: TOuter, second: TInner): [TOuter, TInner] { @@ -2307,12 +2573,16 @@ class JoinSequence extends BaseSequence for (const secondObj of this.#second) { const secondKey = this.#secondKeySelector(secondObj); - if (this.#keyComparer(firstKey, secondKey)) { + if (this.#keyEquater(firstKey, secondKey)) { yield this.#resultSelector(firstObj, secondObj); } } } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Join { firstKeySelector: ${inspect(this.#firstKeySelector)}, secondKeySelector: ${inspect(this.#secondKeySelector)}, resultSelector: ${inspect(this.#resultSelector)}, keyEquater: ${inspect(this.#keyEquater)}, first: ${inspect(this.#first)}, second: ${inspect(this.#second)} }`; + } } class GroupJoinSequence extends BaseSequence { @@ -2321,9 +2591,9 @@ class GroupJoinSequence extends BaseSequence; readonly #secondKeySelector: Converter; readonly #resultSelector: BiConverter, TResult>; - readonly #keyComparer: Equater; + readonly #keyEquater: Equater; - constructor(first: Sequence, second: Sequence, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater) { + constructor(first: Sequence, second: Sequence, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyEquater?: Equater) { super(); this.#first = first; @@ -2331,7 +2601,7 @@ class GroupJoinSequence extends BaseSequence, TResult>; - this.#keyComparer = keyComparer ?? strictEquals; + this.#keyEquater = keyEquater ?? strictEquals; } static #defaultResultSelector(first: TOuter, second: Sequence) { @@ -2354,7 +2624,7 @@ class GroupJoinSequence extends BaseSequence extends BaseSequence extends BaseSequence { @@ -2401,6 +2675,10 @@ class RemoveSequence extends BaseSequence { yield obj; } } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Remove { value: ${inspect(this.#obj)}, all: ${inspect(this.#all)}, equater: ${inspect(this.#equater)} sequence: ${inspect(this.#sequence)} }`; + } } class CacheSequence extends DelegatedSequence { @@ -2418,9 +2696,13 @@ class CacheSequence extends DelegatedSequence { return super.iterator(); } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Cached { sequence: ${inspect(this.sequence)} }`; + } } -class PartitionSequence extends BaseSequence { +class PartitionSequence extends BaseSequence> { readonly #sequence: Sequence; readonly #equater: Equater; @@ -2444,11 +2726,17 @@ class PartitionSequence extends BaseSequence { } } - yield* partitions.values(); + for (const partition of partitions.values()) { + yield array(partition); + } + } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Partition { equater: ${inspect(this.#equater)}, sequence: ${inspect(this.#sequence)} }`; } } -class PartitionBySequence extends BaseSequence { +class PartitionBySequence extends BaseSequence> { readonly #sequence: Sequence; readonly #selector: Converter; readonly #equater: Equater; @@ -2475,7 +2763,13 @@ class PartitionBySequence extends BaseSequence { } } - yield* partitions.values(); + for (const partition of partitions.values()) { + yield array(partition); + } + } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `PartitionBy { converter: ${inspect(this.#selector)}, equater: ${inspect(this.#equater)}, sequence: ${inspect(this.#sequence)} }`; } } @@ -2491,4 +2785,8 @@ class AwaitedSequence extends BaseAsyncSequence> { override async *iterator() { yield* this.#sequence; } + + [util.inspect.custom](depth: number, options: util.InspectOptionsStylized, inspect: typeof util.inspect): string { + return `Awaited { sequence: ${inspect(this.#sequence)} }`; + } } diff --git a/src/sync/index.ts b/src/sync/index.ts index 1102dd8..b96af7c 100644 --- a/src/sync/index.ts +++ b/src/sync/index.ts @@ -1,9 +1,9 @@ import { mathRandom } from "../random/index.js"; import { RandomGenerator } from "../random/types.js"; -import { BigIntRangeSequence, ConcatSequence, SequenceMarker, FunctionSequence, GeneratorSequence, RangeSequence, RepeatSequence, RepeatForeverSequence, WrappedArray, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet, EMPTY } from "./impl.js"; +import { BigIntRangeSequence, ConcatSequence, SequenceMarker, FunctionSequence, GeneratorSequence, RangeSequence, RepeatSequence, RepeatForeverSequence, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet, WrappedReadonlyArray, EMPTY } from "./impl.js"; import { Sequence } from "./types.js"; -export function wrap(iterable: Iterable): Sequence { +export function wrap(iterable: Iterable): Sequence { if (isSequence(iterable)) { return iterable; } @@ -23,11 +23,11 @@ export function wrap(iterable: Iterable): Sequence { return sequence(iterable); } -export function sequence(iterable: Iterable): Sequence { +export function sequence(iterable: Iterable): Sequence { return new WrappedIterable(iterable); } -export function empty(): Sequence { +export function empty(): Sequence { return EMPTY; } @@ -35,19 +35,19 @@ export function single(obj: T): Sequence { return new WrappedObject(obj); } -export function array(array: T[]): Sequence { - return new WrappedArray(array); +export function array(array: ReadonlyArray): Sequence { + return new WrappedReadonlyArray(array); } -export function arrayLike(arrayLike: ArrayLike): Sequence { +export function arrayLike(arrayLike: ArrayLike): Sequence { return new WrappedArrayLike(arrayLike); } -export function set(set: Set): Sequence { +export function set(set: ReadonlySet): Sequence { return new WrappedSet(set); } -export function map(map: Map): Sequence<[K, V]> { +export function map(map: ReadonlyMap): Sequence<[K, V]> { return new WrappedMap(map); } diff --git a/src/sync/types.ts b/src/sync/types.ts index 45babc9..5cde0bb 100644 --- a/src/sync/types.ts +++ b/src/sync/types.ts @@ -1,14 +1,18 @@ import { AsyncSequence } from "../async/types.js"; import { Collector } from "../collector/types.js"; import { RandomOptions } from "../random/types.js"; -import { Predicate, Converter, FilterPredicate, Equater, BiConverter, Accumulator, Comparer, Action } from "../types.js"; +import { AnyPredicate, Converter, FilterPredicate, Equater, BiConverter, Accumulator, Comparer, Action } from "../types.js"; + +export type SequencePipeline = (sequence: Sequence) => TResult; export interface Sequence extends Iterable { iterator(): Iterator; - apply(pipeline: (sequence: Sequence) => TResult): TResult; + toJSON(): any; - count(predicate?: Predicate): number; + apply(pipeline: SequencePipeline): TResult; + + count(predicate?: AnyPredicate): number; nonEnumeratedCount(): number; fastCount(): number; maxCount(): number; @@ -17,7 +21,7 @@ export interface Sequence extends Iterable { selectMany(selector: Converter>): Sequence; where(predicate: FilterPredicate): Sequence; - where(predicate: Predicate): Sequence; + where(predicate: AnyPredicate): Sequence; groupBy(keySelector: Converter, elementSelector?: undefined, keyComparer?: Equater): Sequence>; groupBy(keySelector: Converter, elementSelector: Converter, keyComparer?: Equater): Sequence>; @@ -40,14 +44,14 @@ export interface Sequence extends Iterable { concat(...sequences: Sequence[]): Sequence; - first(predicate?: Predicate): TElement; - firstOrDefault(predicate?: Predicate, def?: TElement): TElement | undefined; + first(predicate?: AnyPredicate): TElement; + firstOrDefault(predicate?: AnyPredicate, def?: TElement): TElement | undefined; - last(predicate?: Predicate): TElement; - lastOrDefault(predicate?: Predicate, def?: TElement): TElement | undefined; + last(predicate?: AnyPredicate): TElement; + lastOrDefault(predicate?: AnyPredicate, def?: TElement): TElement | undefined; - single(predicate?: Predicate): TElement; - singleOrDefault(predicate?: Predicate, def?: TElement): TElement | undefined; + single(predicate?: AnyPredicate): TElement; + singleOrDefault(predicate?: AnyPredicate, def?: TElement): TElement | undefined; elementAt(index: number): TElement; elementAtOrDefault(index: number, def?: TElement): TElement | undefined; @@ -68,8 +72,8 @@ export interface Sequence extends Iterable { orderDescending(comparer?: Comparer): OrderedSequence; orderByDescending(selector: Converter, comparer?: Comparer): OrderedSequence; - partition(equater?: Equater): Sequence; - partitionBy(selector: Converter, equater?: Equater): Sequence; + partition(equater?: Equater): Sequence>; + partitionBy(selector: Converter, equater?: Equater): Sequence>; distinct(equater?: Equater): Sequence; distinctBy(selector: Converter, equater?: Equater): Sequence; @@ -83,19 +87,19 @@ export interface Sequence extends Iterable { intersect(sequence: Sequence, equater?: Equater): Sequence; intersectBy(sequence: Sequence, selector: Converter, equater?: Equater): Sequence; - all(predicate: Predicate): boolean; - any(predicate: Predicate): boolean; + all(predicate: AnyPredicate): boolean; + any(predicate: AnyPredicate): boolean; any(): boolean; - none(predicate: Predicate): boolean; + none(predicate: AnyPredicate): boolean; none(): boolean; skip(n: number): Sequence; skipLast(n: number): Sequence; - skipWhile(condition: Predicate): Sequence; + skipWhile(condition: AnyPredicate): Sequence; take(n: number): Sequence; takeLast(n: number): Sequence; - takeWhile(condition: Predicate): Sequence; + takeWhile(condition: AnyPredicate): Sequence; peek(action: Action): Sequence; @@ -107,7 +111,8 @@ export interface Sequence extends Iterable { reversed(): Sequence; - chunked(size: number): Sequence>; + chunked(size: number, asArray?: false): Sequence>; + chunked(size: number, asArray: true): Sequence; random(options?: RandomOptions): TElement | undefined; @@ -115,9 +120,12 @@ export interface Sequence extends Iterable { awaited(): AsyncSequence>; + asArray(): TElement[]; toArray(): TElement[]; + toMap(keySelector: Converter): Map; toMap(keySelector: Converter, valueSelector: Converter): Map; toSet(): Set; + toObject(keySelector: Converter): Record; toObject(keySelector: Converter, valueSelector: Converter): Record; collect(collector: Collector): TResult; diff --git a/src/types.ts b/src/types.ts index 11952ae..3dfbd07 100644 --- a/src/types.ts +++ b/src/types.ts @@ -2,6 +2,7 @@ import { AsyncSequence } from "./async/types.js"; import { Sequence } from "./sync/types.js"; export type Predicate = (obj: T) => boolean; +export type AnyPredicate = (obj: T) => unknown; export type FilterPredicate = (obj: TElement) => obj is TFiltered; export type Converter = (obj: TFrom) => TTo; export type BiConverter = (first: TFromFirst, second: TFromSecond) => TTo; @@ -20,7 +21,9 @@ export type MaybeAsyncFunction any> = TFunc exte export type MaybeAsyncSequence = Sequence | AsyncSequence; export type AsyncPredicate = AsyncFunction>; +export type AsyncAnyPredicate = AsyncFunction>; export type MaybeAsyncPredicate = MaybeAsyncFunction>; +export type MaybeAsyncAnyPredicate = MaybeAsyncFunction>; export type AsyncConverter = AsyncFunction>; export type MaybeAsyncConverter = MaybeAsyncFunction>; export type AsyncBiConverter = AsyncFunction>;