diff --git a/package-lock.json b/package-lock.json index 77e1bef..6d4b8e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "enumerable", + "name": "sequence-js", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "enumerable", + "name": "sequence-js", "version": "1.0.0", "license": "ISC", "devDependencies": { @@ -76,9 +76,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/package.json b/package.json index 67fd29e..7ab328e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "enumerable", + "name": "sequence-js", "version": "1.0.0", - "description": "Implementation of Enumerable API from .NET", + "description": "Synchronous and asynchronous sequence manipulation library inspired by .NET Enumerables and Java Streams", "main": "src/index.ts", "type": "module", "scripts": { diff --git a/src/async/impl.ts b/src/async/impl.ts index 9fce8f4..be29db4 100644 --- a/src/async/impl.ts +++ b/src/async/impl.ts @@ -5,47 +5,47 @@ import { createQueue } from "../queue.js"; import { getRandomElementAsync } from "../random/index.js"; import { AsyncRandomOptions } from "../random/types.js"; import { selectionSorter } from "../sorting.js"; -import { Enumerable } from "../sync/types.js"; +import { Sequence } from "../sync/types.js"; import { MaybeAsyncConverter, MaybeAsyncIterable, MaybeAsyncPredicate, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybePromise, Predicate } from "../types.js"; import { strictEquals, identity, operatorCompare, asAsyncGenerator, defaultArrayComparer, combineAsyncComparers } from "../utils.js"; import { array, empty, wrap } from "./index.js"; -import { AsyncEnumerable, GroupedAsyncEnumerable, OrderedAsyncEnumerable } from "./types.js"; +import { AsyncSequence, GroupedAsyncSequence, OrderedAsyncSequence } from "./types.js"; -export class AsyncEnumerableMarker { } +export class AsyncSequenceMarker { } -export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarker implements AsyncEnumerable { +export abstract class BaseAsyncSequence extends AsyncSequenceMarker implements AsyncSequence { [Symbol.asyncIterator]() { return this.iterator(); } abstract iterator(): AsyncIterator>; - apply(pipeline: (enumerable: AsyncEnumerable) => TResult): TResult { + apply(pipeline: (sequence: AsyncSequence) => TResult): TResult { return pipeline(this); } - select(converter: MaybeAsyncConverter): AsyncEnumerable { - return new MapperAsyncEnumerable(this, converter); + select(converter: MaybeAsyncConverter): AsyncSequence { + return new MapperAsyncSequence(this, converter); } - selectMany(converter: MaybeAsyncConverter>): AsyncEnumerable { - return new FlatMapperAsyncEnumerable(this, converter); + selectMany(converter: MaybeAsyncConverter>): AsyncSequence { + return new FlatMapperAsyncSequence(this, converter); } - where(predicate: MaybeAsyncPredicate): AsyncEnumerable { - return new FilterAsyncEnumerable(this, predicate); + where(predicate: MaybeAsyncPredicate): AsyncSequence { + return new FilterAsyncSequence(this, predicate); } - groupBy(keySelector: MaybeAsyncConverter, elementSelector?: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater): AsyncEnumerable> { - return new GroupByAsyncEnumerable(this, keySelector, elementSelector, keyComparer); + groupBy(keySelector: MaybeAsyncConverter, elementSelector?: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater): AsyncSequence> { + return new GroupByAsyncSequence(this, keySelector, elementSelector, keyComparer); } - join(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, keyComparer?: MaybeAsyncEquater): AsyncEnumerable { - return new JoinAsyncEnumerable(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); + join(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, keyComparer?: MaybeAsyncEquater): AsyncSequence { + return new JoinAsyncSequence(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); } - groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, TResult>, keyComparer?: MaybeAsyncEquater): AsyncEnumerable { - return new GroupJoinAsyncEnumerable(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); + groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, TResult>, keyComparer?: MaybeAsyncEquater): AsyncSequence { + return new GroupJoinAsyncSequence(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); } async contains(obj: TElement, equater?: MaybeAsyncEquater) { @@ -101,30 +101,30 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke } } - append(obj: TElement): AsyncEnumerable { - return new AppendAsyncEnumerable(this, obj); + append(obj: TElement): AsyncSequence { + return new AppendAsyncSequence(this, obj); } - prepend(obj: TElement): AsyncEnumerable { - return new PrependAsyncEnumerable(this, obj); + prepend(obj: TElement): AsyncSequence { + return new PrependAsyncSequence(this, obj); } - remove(obj: TElement, all?: boolean, equater?: MaybeAsyncEquater): AsyncEnumerable { - return new RemoveAsyncEnumerable(this, obj, all, equater); + remove(obj: TElement, all?: boolean, equater?: MaybeAsyncEquater): AsyncSequence { + return new RemoveAsyncSequence(this, obj, all, equater); } - concat(...iterables: MaybeAsyncIterable[]): AsyncEnumerable { + concat(...iterables: MaybeAsyncIterable[]): AsyncSequence { if (iterables.length === 0) { return this; } - const arr: AsyncEnumerable[] = [this]; + const arr: AsyncSequence[] = [this]; for (const iterable of iterables) { arr.push(wrap(iterable)); } - return new ConcatAsyncEnumerable(arr); + return new ConcatAsyncSequence(arr); } async count(predicate?: MaybeAsyncPredicate) { @@ -440,52 +440,52 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke return this.#find(x => x < 0, converter, comparer); } - order(comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new OrderAsyncEnumerable(this, false, comparer); + order(comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new OrderAsyncSequence(this, false, comparer); } - orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new OrderByAsyncEnumerable(this, false, selector, comparer); + orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new OrderByAsyncSequence(this, false, selector, comparer); } - orderDescending(comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new OrderAsyncEnumerable(this, true, comparer); + orderDescending(comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new OrderAsyncSequence(this, true, comparer); } - orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new OrderByAsyncEnumerable(this, true, selector, comparer); + orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new OrderByAsyncSequence(this, true, selector, comparer); } - distinct(equater?: MaybeAsyncEquater): AsyncEnumerable { - return new DistinctAsyncEnumerable(this, equater); + distinct(equater?: MaybeAsyncEquater): AsyncSequence { + return new DistinctAsyncSequence(this, equater); } - distinctBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncEnumerable { - return new DistinctByAsyncEnumerable(this, selector, equater); + distinctBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence { + return new DistinctByAsyncSequence(this, selector, equater); } - union(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncEnumerable { - return new UnionAsyncEnumerable(this, wrap(iterable), equater); + union(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncSequence { + return new UnionAsyncSequence(this, wrap(iterable), equater); } - unionBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncEnumerable { - return new UnionByAsyncEnumerable(this, wrap(iterable), selector, equater); + unionBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence { + return new UnionByAsyncSequence(this, wrap(iterable), selector, equater); } - except(iterable: MaybeAsyncIterable): AsyncEnumerable { - return new ExceptAsyncEnumerable(this, wrap(iterable)); + except(iterable: MaybeAsyncIterable): AsyncSequence { + return new ExceptAsyncSequence(this, wrap(iterable)); } - exceptBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter): AsyncEnumerable { - return new ExceptByAsyncEnumerable(this, wrap(iterable), selector); + exceptBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter): AsyncSequence { + return new ExceptByAsyncSequence(this, wrap(iterable), selector); } - intersect(iterable: MaybeAsyncIterable): AsyncEnumerable { - return new IntersectAsyncEnumerable(this, wrap(iterable)); + intersect(iterable: MaybeAsyncIterable): AsyncSequence { + return new IntersectAsyncSequence(this, wrap(iterable)); } - intersectBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter): AsyncEnumerable { - return new IntersectByAsyncEnumerable(this, wrap(iterable), selector); + intersectBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter): AsyncSequence { + return new IntersectByAsyncSequence(this, wrap(iterable), selector); } async all(predicate: MaybeAsyncPredicate) { @@ -544,48 +544,48 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke return n < 0 && (await this.iterator().next()).done === true; } - skip(n: number): AsyncEnumerable { + skip(n: number): AsyncSequence { if (n < 0) { throw new Error("Cannot skip a negative number of elements."); } - return n === 0 ? this : new SkipAsyncEnumerable(this, n); + return n === 0 ? this : new SkipAsyncSequence(this, n); } - skipLast(n: number): AsyncEnumerable { + skipLast(n: number): AsyncSequence { if (n < 0) { throw new Error("Cannot skip a negative number of elements."); } - return n === 0 ? this : new SkipLastAsyncEnumerable(this, n); + return n === 0 ? this : new SkipLastAsyncSequence(this, n); } - skipWhile(predicate: MaybeAsyncPredicate): AsyncEnumerable { - return new SkipWhileAsyncEnumerable(this, predicate); + skipWhile(predicate: MaybeAsyncPredicate): AsyncSequence { + return new SkipWhileAsyncSequence(this, predicate); } - take(n: number): AsyncEnumerable { + take(n: number): AsyncSequence { if (n < 0) { throw new Error("Cannot take a negative number of elements."); } - return n === 0 ? empty() : new TakeAsyncEnumerable(this, n); + return n === 0 ? empty() : new TakeAsyncSequence(this, n); } - takeLast(n: number): AsyncEnumerable { + takeLast(n: number): AsyncSequence { if (n < 0) { throw new Error("Cannot take a negative number of elements."); } - return n === 0 ? empty() : new TakeLastAsyncEnumerable(this, n); + return n === 0 ? empty() : new TakeLastAsyncSequence(this, n); } - takeWhile(predicate: MaybeAsyncPredicate): AsyncEnumerable { - return new TakeWhileAsyncEnumerable(this, predicate); + takeWhile(predicate: MaybeAsyncPredicate): AsyncSequence { + return new TakeWhileAsyncSequence(this, predicate); } - peek(action: MaybeAsyncAction): AsyncEnumerable { - return new PeekAsyncEnumerable(this, action); + peek(action: MaybeAsyncAction): AsyncSequence { + return new PeekAsyncSequence(this, action); } async forEach(action: MaybeAsyncAction) { @@ -594,32 +594,32 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke } } - zip(iterable: MaybeAsyncIterable): AsyncEnumerable<[Awaited, Awaited]> { - return new ZippedAsyncEnumerable(this, wrap(iterable)); + zip(iterable: MaybeAsyncIterable): AsyncSequence<[Awaited, Awaited]> { + return new ZippedAsyncSequence(this, wrap(iterable)); } - indexex(): AsyncEnumerable<[number, Awaited]> { - return new IndexedAsyncEnumerable(this); + indexex(): AsyncSequence<[number, Awaited]> { + return new IndexedAsyncSequence(this); } - reversed(): AsyncEnumerable { - return new ReversedAsyncEnumerable(this); + reversed(): AsyncSequence { + return new ReversedAsyncSequence(this); } - chunked(size: number): AsyncEnumerable { + chunked(size: number): AsyncSequence { if (size <= 0) { throw new Error("Chunk size must be positive."); } - return new ChunkedAsyncEnumerable(this, size); + return new ChunkedAsyncSequence(this, size); } async random(options?: AsyncRandomOptions | undefined): Promise { return (await getRandomElementAsync(this, options)).element; } - cached(): AsyncEnumerable { - return new CacheAsyncEnumerable(this); + cached(): AsyncSequence { + return new CacheAsyncSequence(this); } async toArray() { @@ -679,21 +679,21 @@ export abstract class BaseAsyncEnumerable extends AsyncEnumerableMarke } } -export class DelegatedAsyncEnumerable extends AsyncEnumerableMarker implements AsyncEnumerable { - #enumerable: AsyncEnumerable; +export class DelegatedAsyncSequence extends AsyncSequenceMarker implements AsyncSequence { + #sequence: AsyncSequence; - constructor(enumerable: AsyncEnumerable) { + constructor(sequence: AsyncSequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } - get enumerable() { - return this.#enumerable; + get sequence() { + return this.#sequence; } - protected set enumerable(value: AsyncEnumerable) { - this.#enumerable = value; + protected set sequence(value: AsyncSequence) { + this.#sequence = value; } [Symbol.asyncIterator]() { @@ -701,283 +701,283 @@ export class DelegatedAsyncEnumerable extends AsyncEnumerableMarker im } iterator() { - return this.#enumerable.iterator(); + return this.#sequence.iterator(); } - apply(pipeline: (enumerable: AsyncEnumerable) => TResult) { - return this.#enumerable.apply(pipeline); + apply(pipeline: (sequence: AsyncSequence) => TResult) { + return this.#sequence.apply(pipeline); } count(predicate?: ((obj: TElement) => MaybePromise) | undefined): Promise { - return this.#enumerable.count(predicate); + return this.#sequence.count(predicate); } nonEnumeratedCount(): Promise { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } fastCount(): Promise { - return this.#enumerable.fastCount(); + return this.#sequence.fastCount(); } maxCount(): Promise { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } - select(selector: (obj: TElement) => MaybePromise): AsyncEnumerable { - return this.#enumerable.select(selector); + select(selector: (obj: TElement) => MaybePromise): AsyncSequence { + return this.#sequence.select(selector); } - selectMany(selector: (obj: TElement) => MaybePromise>): AsyncEnumerable { - return this.#enumerable.selectMany(selector); + selectMany(selector: (obj: TElement) => MaybePromise>): AsyncSequence { + return this.#sequence.selectMany(selector); } - where(predicate: (obj: TElement) => MaybePromise): AsyncEnumerable { - return this.#enumerable.where(predicate); + where(predicate: (obj: TElement) => MaybePromise): AsyncSequence { + return this.#sequence.where(predicate); } - groupBy(keySelector: (obj: TElement) => MaybePromise, elementSelector?: undefined, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncEnumerable>; - groupBy(keySelector: (obj: TElement) => MaybePromise, elementSelector: (obj: TElement) => MaybePromise, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncEnumerable>; + groupBy(keySelector: (obj: TElement) => MaybePromise, elementSelector?: undefined, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncSequence>; + groupBy(keySelector: (obj: TElement) => MaybePromise, elementSelector: (obj: TElement) => MaybePromise, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncSequence>; groupBy(keySelector: any, elementSelector?: any, keyComparer?: any) { - return this.#enumerable.groupBy(keySelector, elementSelector, keyComparer); + return this.#sequence.groupBy(keySelector, elementSelector, keyComparer); } - join(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector?: undefined, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncEnumerable<[Awaited, Awaited]>; - join(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector: (first: TElement, second: TOther) => MaybePromise, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncEnumerable; + join(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector?: undefined, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncSequence<[Awaited, Awaited]>; + join(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector: (first: TElement, second: TOther) => MaybePromise, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncSequence; join(iterable: any, firstKeySelector: any, secondKeySelector: any, resultSelector?: any, keyComparer?: any) { - return this.#enumerable.join(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); + return this.#sequence.join(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); } - groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector?: undefined, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncEnumerable>; - groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector: (first: TElement, second: AsyncEnumerable) => MaybePromise, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncEnumerable; + groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector?: undefined, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncSequence>; + groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: (obj: TElement) => MaybePromise, secondKeySelector: (obj: TOther) => MaybePromise, resultSelector: (first: TElement, second: AsyncSequence) => MaybePromise, keyComparer?: ((first: TKey, second: TKey) => MaybePromise) | undefined): AsyncSequence; groupJoin(iterable: any, firstKeySelector: any, secondKeySelector: any, resultSelector?: any, keyComparer?: any) { - return this.#enumerable.groupJoin(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); + return this.#sequence.groupJoin(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); } contains(obj: TElement, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): Promise { - return this.#enumerable.contains(obj, equater); + return this.#sequence.contains(obj, equater); } sequenceEquals(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): Promise { - return this.#enumerable.sequenceEquals(iterable, equater); + return this.#sequence.sequenceEquals(iterable, equater); } - append(obj: TElement): AsyncEnumerable { - return this.#enumerable.append(obj); + append(obj: TElement): AsyncSequence { + return this.#sequence.append(obj); } - prepend(obj: TElement): AsyncEnumerable { - return this.#enumerable.prepend(obj); + prepend(obj: TElement): AsyncSequence { + return this.#sequence.prepend(obj); } - remove(obj: TElement, all?: boolean | undefined, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.remove(obj, all, equater); + remove(obj: TElement, all?: boolean | undefined, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.remove(obj, all, equater); } - concat(...iterables: MaybeAsyncIterable[]): AsyncEnumerable { - return this.#enumerable.concat(...iterables); + concat(...iterables: MaybeAsyncIterable[]): AsyncSequence { + return this.#sequence.concat(...iterables); } first(predicate?: ((obj: TElement) => MaybePromise) | undefined): Promise { - return this.#enumerable.first(predicate); + return this.#sequence.first(predicate); } firstOrDefault(predicate?: ((obj: TElement) => MaybePromise) | undefined, def?: TElement | undefined): Promise { - return this.#enumerable.firstOrDefault(predicate, def); + return this.#sequence.firstOrDefault(predicate, def); } last(predicate?: ((obj: TElement) => MaybePromise) | undefined): Promise { - return this.#enumerable.last(predicate); + return this.#sequence.last(predicate); } lastOrDefault(predicate?: ((obj: TElement) => MaybePromise) | undefined, def?: TElement | undefined): Promise { - return this.#enumerable.lastOrDefault(predicate, def); + return this.#sequence.lastOrDefault(predicate, def); } single(predicate?: ((obj: TElement) => MaybePromise) | undefined): Promise { - return this.#enumerable.single(predicate); + return this.#sequence.single(predicate); } singleOrDefault(predicate?: ((obj: TElement) => MaybePromise) | undefined, def?: TElement | undefined): Promise { - return this.#enumerable.singleOrDefault(predicate, def); + return this.#sequence.singleOrDefault(predicate, def); } elementAt(index: number): Promise { - return this.#enumerable.elementAt(index); + return this.#sequence.elementAt(index); } elementAtOrDefault(index: number, def?: TElement | undefined): Promise { - return this.#enumerable.elementAtOrDefault(index, def); + return this.#sequence.elementAtOrDefault(index, def); } aggregate(accumulator: (acc: TElement, obj: TElement) => MaybePromise): Promise; aggregate(accumulator: (acc: TAccumulator, obj: TElement) => MaybePromise, seed?: TAccumulator | undefined): Promise; aggregate(accumulator: (acc: TAccumulator, obj: TElement) => MaybePromise, seed?: TAccumulator | undefined, resultSelector?: ((obj: TAccumulator) => MaybePromise) | undefined): Promise; aggregate(accumulator: any, seed?: any, resultSelector?: any) { - return this.#enumerable.aggregate(accumulator, seed, resultSelector); + return this.#sequence.aggregate(accumulator, seed, resultSelector); } min(): Promise { - return this.#enumerable.min(); + return this.#sequence.min(); } minBy(selector: (obj: TElement) => MaybePromise): Promise { - return this.#enumerable.minBy(selector); + return this.#sequence.minBy(selector); } max(): Promise { - return this.#enumerable.max(); + return this.#sequence.max(); } maxBy(selector: (obj: TElement) => MaybePromise): Promise { - return this.#enumerable.maxBy(selector); + return this.#sequence.maxBy(selector); } - order(comparer?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.order(comparer); + order(comparer?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.order(comparer); } - orderBy(selector: (obj: TElement) => MaybePromise, comparer?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.orderBy(selector, comparer); + orderBy(selector: (obj: TElement) => MaybePromise, comparer?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.orderBy(selector, comparer); } - orderDescending(comparer?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.orderDescending(comparer); + orderDescending(comparer?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.orderDescending(comparer); } - orderByDescending(selector: (obj: TElement) => MaybePromise, comparer?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.orderByDescending(selector, comparer); + orderByDescending(selector: (obj: TElement) => MaybePromise, comparer?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.orderByDescending(selector, comparer); } - distinct(equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.distinct(equater); + distinct(equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.distinct(equater); } - distinctBy(selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.distinctBy(selector, equater); + distinctBy(selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.distinctBy(selector, equater); } - union(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.union(iterable, equater); + union(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.union(iterable, equater); } - unionBy(iterable: MaybeAsyncIterable, selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.unionBy(iterable, selector, equater); + unionBy(iterable: MaybeAsyncIterable, selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.unionBy(iterable, selector, equater); } - except(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.except(iterable, equater); + except(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.except(iterable, equater); } - exceptBy(iterable: MaybeAsyncIterable, selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.exceptBy(iterable, selector, equater); + exceptBy(iterable: MaybeAsyncIterable, selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.exceptBy(iterable, selector, equater); } - intersect(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.intersect(iterable, equater); + intersect(iterable: MaybeAsyncIterable, equater?: ((first: TElement, second: TElement) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.intersect(iterable, equater); } - intersectBy(iterable: MaybeAsyncIterable, selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncEnumerable { - return this.#enumerable.intersectBy(iterable, selector, equater); + intersectBy(iterable: MaybeAsyncIterable, selector: (obj: TElement) => MaybePromise, equater?: ((first: TBy, second: TBy) => MaybePromise) | undefined): AsyncSequence { + return this.#sequence.intersectBy(iterable, selector, equater); } all(predicate: (obj: TElement) => MaybePromise): Promise { - return this.#enumerable.all(predicate); + return this.#sequence.all(predicate); } any(predicate: (obj: TElement) => MaybePromise): Promise; any(): Promise; any(predicate?: any) { - return this.#enumerable.any(predicate); + return this.#sequence.any(predicate); } none(predicate: Predicate): Promise; none(): Promise; none(predicate?: any) { - return this.#enumerable.none(predicate); + return this.#sequence.none(predicate); } - skip(n: number): AsyncEnumerable { - return this.#enumerable.skip(n); + skip(n: number): AsyncSequence { + return this.#sequence.skip(n); } - skipLast(n: number): AsyncEnumerable { - return this.#enumerable.skipLast(n); + skipLast(n: number): AsyncSequence { + return this.#sequence.skipLast(n); } - skipWhile(condition: (obj: TElement) => MaybePromise): AsyncEnumerable { - return this.#enumerable.skipWhile(condition); + skipWhile(condition: (obj: TElement) => MaybePromise): AsyncSequence { + return this.#sequence.skipWhile(condition); } - take(n: number): AsyncEnumerable { - return this.#enumerable.take(n); + take(n: number): AsyncSequence { + return this.#sequence.take(n); } - takeLast(n: number): AsyncEnumerable { - return this.#enumerable.takeLast(n); + takeLast(n: number): AsyncSequence { + return this.#sequence.takeLast(n); } - takeWhile(condition: (obj: TElement) => MaybePromise): AsyncEnumerable { - return this.#enumerable.takeWhile(condition); + takeWhile(condition: (obj: TElement) => MaybePromise): AsyncSequence { + return this.#sequence.takeWhile(condition); } - peek(action: (obj: TElement) => MaybePromise): AsyncEnumerable { - return this.#enumerable.peek(action); + peek(action: (obj: TElement) => MaybePromise): AsyncSequence { + return this.#sequence.peek(action); } forEach(action: (obj: TElement) => MaybePromise): Promise { - return this.#enumerable.forEach(action); + return this.#sequence.forEach(action); } - zip(iterable: MaybeAsyncIterable): AsyncEnumerable<[Awaited, Awaited]> { - return this.#enumerable.zip(iterable); + zip(iterable: MaybeAsyncIterable): AsyncSequence<[Awaited, Awaited]> { + return this.#sequence.zip(iterable); } - indexex(): AsyncEnumerable<[number, Awaited]> { - return this.#enumerable.indexex(); + indexex(): AsyncSequence<[number, Awaited]> { + return this.#sequence.indexex(); } - reversed(): AsyncEnumerable { - return this.#enumerable.reversed(); + reversed(): AsyncSequence { + return this.#sequence.reversed(); } - chunked(size: number): AsyncEnumerable { - return this.#enumerable.chunked(size); + chunked(size: number): AsyncSequence { + return this.#sequence.chunked(size); } random(options?: AsyncRandomOptions | undefined): Promise { - return this.#enumerable.random(options); + return this.#sequence.random(options); } - cached(): AsyncEnumerable { - return this.#enumerable.cached(); + cached(): AsyncSequence { + return this.#sequence.cached(); } toArray(): Promise { - return this.#enumerable.toArray(); + return this.#sequence.toArray(); } toMap(keySelector: (obj: TElement) => MaybePromise, valueSelector: (obj: TElement) => MaybePromise): Promise> { - return this.#enumerable.toMap(keySelector, valueSelector); + return this.#sequence.toMap(keySelector, valueSelector); } toSet(): Promise> { - return this.#enumerable.toSet(); + return this.#sequence.toSet(); } toObject(keySelector: (obj: TElement) => MaybePromise, valueSelector: (obj: TElement) => MaybePromise): Promise> { - return this.#enumerable.toObject(keySelector, valueSelector); + return this.#sequence.toObject(keySelector, valueSelector); } collect(collector: Collector): Promise { - return this.#enumerable.collect(collector); + return this.#sequence.collect(collector); } } -export class GroupedAsyncEnumerableImpl extends DelegatedAsyncEnumerable implements GroupedAsyncEnumerable { +export class GroupedAsyncSequenceImpl extends DelegatedAsyncSequence implements GroupedAsyncSequence { readonly #key: TKey; - constructor(key: TKey, grouping: AsyncEnumerable) { + constructor(key: TKey, grouping: AsyncSequence) { super(grouping); this.#key = key; @@ -988,51 +988,51 @@ export class GroupedAsyncEnumerableImpl extends DelegatedAsyncEn } } -abstract class BaseOrderedAsyncEnumerable extends BaseAsyncEnumerable implements OrderedAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +abstract class BaseOrderedAsyncSequence extends BaseAsyncSequence implements OrderedAsyncSequence { + readonly #sequence: AsyncSequence; readonly #sorter: MaybeAsyncComparer; readonly #descending: boolean; - constructor(enumerable: AsyncEnumerable, sorter: MaybeAsyncComparer, descending: boolean) { + constructor(sequence: AsyncSequence, sorter: MaybeAsyncComparer, descending: boolean) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#sorter = sorter; this.#descending = descending; } override async nonEnumeratedCount() { - return await this.#enumerable.nonEnumeratedCount(); + return await this.#sequence.nonEnumeratedCount(); } override async maxCount() { - return await this.#enumerable.maxCount(); + return await this.#sequence.maxCount(); } get comparer() { return this.#sorter; } - thenSelf(comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new ThenOrderAsyncEnumerable(this, false, comparer); + thenSelf(comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new ThenOrderAsyncSequence(this, false, comparer); } - thenBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new ThenOrderByAsyncEnumerable(this, false, selector, comparer); + thenBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new ThenOrderByAsyncSequence(this, false, selector, comparer); } - thenSelfDescending(comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new ThenOrderAsyncEnumerable(this, true, comparer); + thenSelfDescending(comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new ThenOrderAsyncSequence(this, true, comparer); } - thenByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable { - return new ThenOrderByAsyncEnumerable(this, true, selector, comparer); + thenByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncSequence { + return new ThenOrderByAsyncSequence(this, true, selector, comparer); } override async *iterator() { const arr: TElement[] = []; - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { arr.push(obj); } @@ -1042,8 +1042,8 @@ abstract class BaseOrderedAsyncEnumerable extends BaseAsyncEnumerable< } } -export class EmptyAsyncEnumerable extends BaseAsyncEnumerable { - static readonly INSTANCE = new EmptyAsyncEnumerable(); +export class EmptyAsyncSequence extends BaseAsyncSequence { + static readonly INSTANCE = new EmptyAsyncSequence(); override async nonEnumeratedCount() { return 0; @@ -1054,7 +1054,7 @@ export class EmptyAsyncEnumerable extends BaseAsyncEnumerable { } } -export class RangeAsyncEnumerable extends BaseAsyncEnumerable { +export class RangeAsyncSequence extends BaseAsyncSequence { readonly #min: number; readonly #max: number; readonly #step: number; @@ -1078,7 +1078,7 @@ export class RangeAsyncEnumerable extends BaseAsyncEnumerable { } } -export class RepeatAsyncEnumerable extends BaseAsyncEnumerable { +export class RepeatAsyncSequence extends BaseAsyncSequence { readonly #value: T; readonly #count: number; @@ -1102,7 +1102,7 @@ export class RepeatAsyncEnumerable extends BaseAsyncEnumerable { } } -export class RepeatForeverAsyncEnumerable extends BaseAsyncEnumerable { +export class RepeatForeverAsyncSequence extends BaseAsyncSequence { readonly #value: T; constructor(value: T) { @@ -1122,7 +1122,7 @@ export class RepeatForeverAsyncEnumerable extends BaseAsyncEnumerable { } } -export class WrappedObjectAsync extends BaseAsyncEnumerable { +export class WrappedObjectAsync extends BaseAsyncSequence { readonly #obj: T | PromiseLike; constructor(obj: T | PromiseLike) { @@ -1140,7 +1140,7 @@ export class WrappedObjectAsync extends BaseAsyncEnumerable { } } -export class WrappedArrayAsync extends BaseAsyncEnumerable { +export class WrappedArrayAsync extends BaseAsyncSequence { readonly #array: (T | PromiseLike)[]; constructor(array: (T | PromiseLike)[]) { @@ -1158,7 +1158,7 @@ export class WrappedArrayAsync extends BaseAsyncEnumerable { } } -export class WrappedArrayLikeAsync extends BaseAsyncEnumerable { +export class WrappedArrayLikeAsync extends BaseAsyncSequence { readonly #arrayLike: ArrayLike>; constructor(arrayLike: ArrayLike>) { @@ -1178,7 +1178,7 @@ export class WrappedArrayLikeAsync extends BaseAsyncEnumerable { } } -export class WrappedAsyncIterable extends BaseAsyncEnumerable { +export class WrappedAsyncIterable extends BaseAsyncSequence { readonly #iterable: AsyncIterable; constructor(iterable: AsyncIterable) { @@ -1192,7 +1192,7 @@ export class WrappedAsyncIterable extends BaseAsyncEnumerable { } } -export class GeneratorAsyncEnumerable extends BaseAsyncEnumerable { +export class GeneratorAsyncSequence extends BaseAsyncSequence { readonly #generator: () => AsyncGenerator; constructor(generator: () => AsyncGenerator) { @@ -1206,7 +1206,7 @@ export class GeneratorAsyncEnumerable extends BaseAsyncEnumerable { } } -export class FunctionAsyncEnumerable extends BaseAsyncEnumerable { +export class FunctionAsyncSequence extends BaseAsyncSequence { readonly #f: () => MaybePromise; constructor(f: () => MaybePromise) { @@ -1226,45 +1226,45 @@ export class FunctionAsyncEnumerable extends BaseAsyncEnumerable { } } -export class WrappedEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: Enumerable; +export class WrappedSequence extends BaseAsyncSequence { + readonly #sequence: Sequence; - constructor(enumerable: Enumerable) { + constructor(sequence: Sequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } override async nonEnumeratedCount() { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } override async fastCount() { - return this.#enumerable.fastCount(); + return this.#sequence.fastCount(); } override async maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override async *iterator() { - yield* this.#enumerable; + yield* this.#sequence; } } -export class ConcatAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerables: Iterable>; +export class ConcatAsyncSequence extends BaseAsyncSequence { + readonly #sequences: Iterable>; - constructor(enumerables: Iterable>) { + constructor(sequences: Iterable>) { super(); - this.#enumerables = enumerables; + this.#sequences = sequences; } override async nonEnumeratedCount() { let n = 0; - for (const iterable of this.#enumerables) { + for (const iterable of this.#sequences) { const m = await iterable.nonEnumeratedCount(); if (m < 0) { @@ -1278,27 +1278,27 @@ export class ConcatAsyncEnumerable extends BaseAsyncEnumerable { } override async *iterator() { - for (const enumerable of this.#enumerables) { - yield* enumerable; + for (const sequence of this.#sequences) { + yield* sequence; } } } -export class DistinctAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class DistinctAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #equater: MaybeAsyncEquater | undefined; - constructor(enumerable: AsyncEnumerable, equater?: MaybeAsyncEquater) { + constructor(sequence: AsyncSequence, equater?: MaybeAsyncEquater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#equater = equater; } override async *iterator() { const set = createAsyncEqualitySet(this.#equater); - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { if (await set.add(obj)) { yield obj; } @@ -1306,15 +1306,15 @@ export class DistinctAsyncEnumerable extends BaseAsyncEnumerable { } } -export class DistinctByAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class DistinctByAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #selector: MaybeAsyncConverter; readonly #equater: MaybeAsyncEquater | undefined; - constructor(enumerable: AsyncEnumerable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { + constructor(sequence: AsyncSequence, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#selector = selector; this.#equater = equater; } @@ -1322,7 +1322,7 @@ export class DistinctByAsyncEnumerable extends BaseAsyncEnumerable { override async *iterator() { const set = createAsyncEqualitySet(this.#equater); - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { if (await set.add(await this.#selector(obj))) { yield obj; } @@ -1332,19 +1332,19 @@ export class DistinctByAsyncEnumerable extends BaseAsyncEnumerable { } } -export class FilterAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class FilterAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #predicate: MaybeAsyncPredicate; - constructor(enumerable: AsyncEnumerable, predicate: MaybeAsyncPredicate) { + constructor(sequence: AsyncSequence, predicate: MaybeAsyncPredicate) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#predicate = predicate; } override async *iterator() { - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { if (await this.#predicate(obj)) { yield obj; } @@ -1352,77 +1352,77 @@ export class FilterAsyncEnumerable extends BaseAsyncEnumerable { } } -export class FlatMapperAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class FlatMapperAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #converter: MaybeAsyncConverter>; - constructor(enumerable: AsyncEnumerable, converter: MaybeAsyncConverter>) { + constructor(sequence: AsyncSequence, converter: MaybeAsyncConverter>) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#converter = converter; } override async *iterator() { - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { yield* await this.#converter(obj); } } } -export class IndexedAsyncEnumerable extends BaseAsyncEnumerable<[number, Awaited]> { - readonly #enumerable: AsyncEnumerable; +export class IndexedAsyncSequence extends BaseAsyncSequence<[number, Awaited]> { + readonly #sequence: AsyncSequence; - constructor(enumerable: AsyncEnumerable) { + constructor(sequence: AsyncSequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } override async *iterator() { let i = 0; - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { yield [i++, obj] as [number, Awaited]; } } } -export class MapperAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class MapperAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #converter: MaybeAsyncConverter; - constructor(enumerable: AsyncEnumerable, converter: MaybeAsyncConverter) { + constructor(sequence: AsyncSequence, converter: MaybeAsyncConverter) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#converter = converter; } override async nonEnumeratedCount() { - return await this.#enumerable.nonEnumeratedCount(); + return await this.#sequence.nonEnumeratedCount(); } override async *iterator() { - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { yield await this.#converter(obj); } } } -export class SkipWhileAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class SkipWhileAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #predicate: MaybeAsyncPredicate; - constructor(enumerable: AsyncEnumerable, predicate: MaybeAsyncPredicate) { + constructor(sequence: AsyncSequence, predicate: MaybeAsyncPredicate) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#predicate = predicate; } override async *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); while (true) { const next = await iterator.next(); @@ -1443,24 +1443,24 @@ export class SkipWhileAsyncEnumerable extends BaseAsyncEnumerable { } } -export class SkipLastAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class SkipLastAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #n: number; - constructor(enumerable: AsyncEnumerable, n: number) { + constructor(sequence: AsyncSequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : Math.max(0, n - this.#n); } override async *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); const buffer = new Array(this.#n); // n > 0 let i = 0; @@ -1484,24 +1484,24 @@ export class SkipLastAsyncEnumerable extends BaseAsyncEnumerable { } } -export class SkipAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class SkipAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #n: number; - constructor(enumerable: AsyncEnumerable, n: number) { + constructor(sequence: AsyncSequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : Math.max(0, n - this.#n); } override async *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); let i = 0; do { @@ -1516,19 +1516,19 @@ export class SkipAsyncEnumerable extends BaseAsyncEnumerable { } } -export class TakeWhileAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class TakeWhileAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #predicate: MaybeAsyncPredicate; - constructor(enumerable: AsyncEnumerable, predicate: MaybeAsyncPredicate) { + constructor(sequence: AsyncSequence, predicate: MaybeAsyncPredicate) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#predicate = predicate; } override async *iterator() { - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { if (!await this.#predicate(obj)) { return; } @@ -1538,26 +1538,26 @@ export class TakeWhileAsyncEnumerable extends BaseAsyncEnumerable { } } -export class TakeLastAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class TakeLastAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #n: number; - constructor(enumerable: AsyncEnumerable, n: number) { + constructor(sequence: AsyncSequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : Math.min(this.#n, n); } override async *iterator() { const queue = createQueue(this.#n); - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { queue.enqueue(obj); } @@ -1565,24 +1565,24 @@ export class TakeLastAsyncEnumerable extends BaseAsyncEnumerable { } } -export class TakeAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class TakeAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #n: number; - constructor(enumerable: AsyncEnumerable, n: number) { + constructor(sequence: AsyncSequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : Math.min(this.#n, n); } override async *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); let i = this.#n; while (i > 0) { @@ -1598,15 +1598,15 @@ export class TakeAsyncEnumerable extends BaseAsyncEnumerable { } } -export class OrderAsyncEnumerable extends BaseOrderedAsyncEnumerable { - constructor(enumerable: AsyncEnumerable, descending: boolean, sorter?: MaybeAsyncComparer) { - super(enumerable, sorter ?? defaultArrayComparer, descending); +export class OrderAsyncSequence extends BaseOrderedAsyncSequence { + constructor(sequence: AsyncSequence, descending: boolean, sorter?: MaybeAsyncComparer) { + super(sequence, sorter ?? defaultArrayComparer, descending); } } -export class OrderByAsyncEnumerable extends BaseOrderedAsyncEnumerable { - constructor(enumerable: AsyncEnumerable, descending: boolean, selector: MaybeAsyncConverter, sorter?: MaybeAsyncComparer) { - super(enumerable, OrderByAsyncEnumerable.#createSorter(selector, sorter), descending); +export class OrderByAsyncSequence extends BaseOrderedAsyncSequence { + constructor(sequence: AsyncSequence, descending: boolean, selector: MaybeAsyncConverter, sorter?: MaybeAsyncComparer) { + super(sequence, OrderByAsyncSequence.#createSorter(selector, sorter), descending); } static #createSorter(selector: MaybeAsyncConverter, sorter?: MaybeAsyncComparer) { @@ -1615,15 +1615,15 @@ export class OrderByAsyncEnumerable extends BaseOrderedAsyncEnumerable } } -export class ThenOrderAsyncEnumerable extends BaseOrderedAsyncEnumerable { - constructor(enumerable: OrderedAsyncEnumerable, descending: boolean, sorter?: MaybeAsyncComparer) { - super(enumerable, combineAsyncComparers(enumerable.comparer ?? defaultArrayComparer, sorter ?? defaultArrayComparer), descending); +export class ThenOrderAsyncSequence extends BaseOrderedAsyncSequence { + constructor(sequence: OrderedAsyncSequence, descending: boolean, sorter?: MaybeAsyncComparer) { + super(sequence, combineAsyncComparers(sequence.comparer ?? defaultArrayComparer, sorter ?? defaultArrayComparer), descending); } } -export class ThenOrderByAsyncEnumerable extends BaseOrderedAsyncEnumerable { - constructor(enumerable: OrderedAsyncEnumerable, descending: boolean, selector: MaybeAsyncConverter, sorter?: MaybeAsyncComparer) { - super(enumerable, ThenOrderByAsyncEnumerable.#createCombinedSorter(enumerable.comparer, selector, sorter), descending); +export class ThenOrderByAsyncSequence extends BaseOrderedAsyncSequence { + constructor(sequence: OrderedAsyncSequence, descending: boolean, selector: MaybeAsyncConverter, sorter?: MaybeAsyncComparer) { + super(sequence, ThenOrderByAsyncSequence.#createCombinedSorter(sequence.comparer, selector, sorter), descending); } static #createCombinedSorter(baseSorter: MaybeAsyncComparer, selector: MaybeAsyncConverter, sorter?: MaybeAsyncComparer) { @@ -1633,78 +1633,78 @@ export class ThenOrderByAsyncEnumerable extends BaseOrderedAsyncEnumerable } } -export class AppendAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class AppendAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #obj: T; - constructor(enumerable: AsyncEnumerable, obj: T) { + constructor(sequence: AsyncSequence, obj: T) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#obj = obj; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : n + 1; } override async *iterator() { - yield* this.#enumerable; + yield* this.#sequence; yield this.#obj; } } -export class PrependAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class PrependAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #obj: T; - constructor(enumerable: AsyncEnumerable, obj: T) { + constructor(sequence: AsyncSequence, obj: T) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#obj = obj; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : n + 1; } override async *iterator() { yield this.#obj; - yield* this.#enumerable; + yield* this.#sequence; } } -export class PeekAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class PeekAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #action: MaybeAsyncAction; - constructor(enumerable: AsyncEnumerable, action: MaybeAsyncAction) { + constructor(sequence: AsyncSequence, action: MaybeAsyncAction) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#action = action; } override async nonEnumeratedCount() { - return await this.#enumerable.nonEnumeratedCount(); + return await this.#sequence.nonEnumeratedCount(); } override async *iterator() { - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { await this.#action(obj); yield obj; } } } -export class ZippedAsyncEnumerable extends BaseAsyncEnumerable<[Awaited, Awaited]> { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class ZippedAsyncSequence extends BaseAsyncSequence<[Awaited, Awaited]> { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; - constructor(first: AsyncEnumerable, second: AsyncEnumerable) { + constructor(first: AsyncSequence, second: AsyncSequence) { super(); this.#first = first; @@ -1735,12 +1735,12 @@ export class ZippedAsyncEnumerable extends BaseAsyncEnumerable<[Awaited } } -export class UnionAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class UnionAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #equater: MaybeAsyncEquater | undefined; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, equater?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, equater?: MaybeAsyncEquater) { super(); this.#first = first; @@ -1767,13 +1767,13 @@ export class UnionAsyncEnumerable extends BaseAsyncEnumerable { } } -export class UnionByAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class UnionByAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #selector: MaybeAsyncConverter; readonly #equater: MaybeAsyncEquater | undefined; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { super(); this.#first = first; @@ -1801,12 +1801,12 @@ export class UnionByAsyncEnumerable extends BaseAsyncEnumerable { } } -export class ExceptAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class ExceptAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #equater: MaybeAsyncEquater | undefined; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, equater?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, equater?: MaybeAsyncEquater) { super(); this.#first = first; @@ -1831,13 +1831,13 @@ export class ExceptAsyncEnumerable extends BaseAsyncEnumerable { } } -export class ExceptByAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class ExceptByAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #selector: MaybeAsyncConverter; readonly #equater: MaybeAsyncEquater | undefined; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { super(); this.#first = first; @@ -1863,12 +1863,12 @@ export class ExceptByAsyncEnumerable extends BaseAsyncEnumerable { } } -export class IntersectAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class IntersectAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #equater: MaybeAsyncEquater | undefined; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, equater?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, equater?: MaybeAsyncEquater) { super(); this.#first = first; @@ -1893,13 +1893,13 @@ export class IntersectAsyncEnumerable extends BaseAsyncEnumerable { } } -export class IntersectByAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class IntersectByAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #selector: MaybeAsyncConverter; readonly #equater: MaybeAsyncEquater | undefined; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater) { super(); this.#first = first; @@ -1925,19 +1925,19 @@ export class IntersectByAsyncEnumerable extends BaseAsyncEnumerable { } } -export class ReversedAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class ReversedAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; - constructor(enumerable: AsyncEnumerable) { + constructor(sequence: AsyncSequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } override async *iterator() { const buffer: T[] = []; - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { buffer.push(obj); } @@ -1947,16 +1947,16 @@ export class ReversedAsyncEnumerable extends BaseAsyncEnumerable { } } -export class GroupByAsyncEnumerable extends BaseAsyncEnumerable> { - readonly #enumerable: AsyncEnumerable; +export class GroupByAsyncSequence extends BaseAsyncSequence> { + readonly #sequence: AsyncSequence; readonly #keySelector: MaybeAsyncConverter; readonly #elementSelector: MaybeAsyncConverter; readonly #keyComparer: MaybeAsyncEquater | undefined; - constructor(enumerable: AsyncEnumerable, keySelector: MaybeAsyncConverter, elementSelector?: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater) { + constructor(sequence: AsyncSequence, keySelector: MaybeAsyncConverter, elementSelector?: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#keySelector = keySelector; this.#elementSelector = elementSelector ?? identity as MaybeAsyncConverter; this.#keyComparer = keyComparer; @@ -1965,7 +1965,7 @@ export class GroupByAsyncEnumerable extends BaseAsyncEn override async *iterator() { const groupings = createAsyncEqualityMap(this.#keyComparer); - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { const key = await this.#keySelector(obj); let grouping = await groupings.get(key); @@ -1977,31 +1977,31 @@ export class GroupByAsyncEnumerable extends BaseAsyncEn } for await (const entry of groupings) { - yield new GroupedAsyncEnumerableImpl(entry[0], array(entry[1])); + yield new GroupedAsyncSequenceImpl(entry[0], array(entry[1])); } } } -export class ChunkedAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class ChunkedAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #size: number; - constructor(enumerable: AsyncEnumerable, size: number) { + constructor(sequence: AsyncSequence, size: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#size = size; } override async nonEnumeratedCount() { - const n = await this.#enumerable.nonEnumeratedCount(); + const n = await this.#sequence.nonEnumeratedCount(); return n < 0 ? -1 : Math.ceil(n / this.#size); } override async *iterator() { let chunk: T[] = []; - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { chunk.push(obj); if (chunk.length === this.#size) { @@ -2016,15 +2016,15 @@ export class ChunkedAsyncEnumerable extends BaseAsyncEnumerable { } } -export class JoinAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class JoinAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #firstKeySelector: MaybeAsyncConverter; readonly #secondKeySelector: MaybeAsyncConverter; readonly #resultSelector: MaybeAsyncBiConverter; readonly #keyComparer: MaybeAsyncEquater; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, keyComparer?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, keyComparer?: MaybeAsyncEquater) { super(); this.#first = first; @@ -2050,27 +2050,27 @@ export class JoinAsyncEnumerable extends BaseAsyn } } -export class GroupJoinAsyncEnumerable extends BaseAsyncEnumerable { - readonly #first: AsyncEnumerable; - readonly #second: AsyncEnumerable; +export class GroupJoinAsyncSequence extends BaseAsyncSequence { + readonly #first: AsyncSequence; + readonly #second: AsyncSequence; readonly #firstKeySelector: MaybeAsyncConverter; readonly #secondKeySelector: MaybeAsyncConverter; - readonly #resultSelector: MaybeAsyncBiConverter, TResult>; + readonly #resultSelector: MaybeAsyncBiConverter, TResult>; readonly #keyComparer: MaybeAsyncEquater; - constructor(first: AsyncEnumerable, second: AsyncEnumerable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, TResult>, keyComparer?: MaybeAsyncEquater) { + constructor(first: AsyncSequence, second: AsyncSequence, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: MaybeAsyncBiConverter, TResult>, keyComparer?: MaybeAsyncEquater) { super(); this.#first = first; this.#second = second; this.#firstKeySelector = firstKeySelector; this.#secondKeySelector = secondKeySelector; - this.#resultSelector = resultSelector ?? GroupJoinAsyncEnumerable.#defaultResultSelector as MaybeAsyncBiConverter, TResult>; + this.#resultSelector = resultSelector ?? GroupJoinAsyncSequence.#defaultResultSelector as MaybeAsyncBiConverter, TResult>; this.#keyComparer = keyComparer ?? strictEquals; } - static #defaultResultSelector(first: TOuter, second: AsyncEnumerable) { - return new GroupedAsyncEnumerableImpl(first, second); + static #defaultResultSelector(first: TOuter, second: AsyncSequence) { + return new GroupedAsyncSequenceImpl(first, second); } override async *iterator() { @@ -2092,16 +2092,16 @@ export class GroupJoinAsyncEnumerable extends Bas } } -export class RemoveAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class RemoveAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; readonly #obj: T; readonly #all: boolean; readonly #equater: MaybeAsyncEquater; - constructor(enumerable: AsyncEnumerable, obj: T, all?: boolean, equater?: MaybeAsyncEquater) { + constructor(sequence: AsyncSequence, obj: T, all?: boolean, equater?: MaybeAsyncEquater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#obj = obj; this.#all = all ?? false; this.#equater = equater ?? strictEquals; @@ -2110,7 +2110,7 @@ export class RemoveAsyncEnumerable extends BaseAsyncEnumerable { override async *iterator() { let gotOne = false; - for await (const obj of this.#enumerable) { + for await (const obj of this.#sequence) { if (await this.#equater(this.#obj, obj)) { if (this.#all) { continue; @@ -2127,17 +2127,17 @@ export class RemoveAsyncEnumerable extends BaseAsyncEnumerable { } } -export class CacheAsyncEnumerable extends BaseAsyncEnumerable { - readonly #enumerable: AsyncEnumerable; +export class CacheAsyncSequence extends BaseAsyncSequence { + readonly #sequence: AsyncSequence; #cache: T[] | undefined; - constructor(enumerable: AsyncEnumerable) { + constructor(sequence: AsyncSequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } override async *iterator() { - yield* this.#cache ??= await this.#enumerable.toArray(); + yield* this.#cache ??= await this.#sequence.toArray(); } } diff --git a/src/async/index.ts b/src/async/index.ts index 924b489..0e5135b 100644 --- a/src/async/index.ts +++ b/src/async/index.ts @@ -1,16 +1,16 @@ import { wrap as wrapSync } from "../sync/index.js"; -import { Enumerable } from "../sync/types.js"; +import { Sequence } from "../sync/types.js"; import { MaybeAsyncIterable } from "../types.js"; import { isAsyncIterable } from "../utils.js"; -import { WrappedEnumerable, WrappedAsyncIterable, EmptyAsyncEnumerable, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncEnumerable, GeneratorAsyncEnumerable, RangeAsyncEnumerable, RepeatForeverAsyncEnumerable, RepeatAsyncEnumerable, AsyncEnumerableMarker } from "./impl.js"; -import { AsyncEnumerable } from "./types.js"; +import { WrappedSequence, WrappedAsyncIterable, EmptyAsyncSequence, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncSequence, GeneratorAsyncSequence, RangeAsyncSequence, RepeatForeverAsyncSequence, RepeatAsyncSequence, AsyncSequenceMarker } from "./impl.js"; +import { AsyncSequence } from "./types.js"; -export function asAsync(enumerable: Enumerable): AsyncEnumerable { - return new WrappedEnumerable(enumerable); +export function asAsync(sequence: Sequence): AsyncSequence { + return new WrappedSequence(sequence); } -export function wrap(iterable: MaybeAsyncIterable): AsyncEnumerable { - if (isAsyncEnumerable(iterable)) { +export function wrap(iterable: MaybeAsyncIterable): AsyncSequence { + if (isAsyncSequence(iterable)) { return iterable; } @@ -21,27 +21,27 @@ export function wrap(iterable: MaybeAsyncIterable): AsyncEnumerable { return asAsync(wrapSync(iterable)); } -export function sequence(iterable: AsyncIterable): AsyncEnumerable { +export function sequence(iterable: AsyncIterable): AsyncSequence { return new WrappedAsyncIterable(iterable); } -export function empty(): AsyncEnumerable { - return EmptyAsyncEnumerable.INSTANCE; +export function empty(): AsyncSequence { + return EmptyAsyncSequence.INSTANCE; } -export function single(obj: T | PromiseLike): AsyncEnumerable { +export function single(obj: T | PromiseLike): AsyncSequence { return new WrappedObjectAsync(obj); } -export function array(array: (T | PromiseLike)[]): AsyncEnumerable { +export function array(array: (T | PromiseLike)[]): AsyncSequence { return new WrappedArrayAsync(array); } -export function arrayLike(arrayLike: ArrayLike<(T | PromiseLike)>): AsyncEnumerable { +export function arrayLike(arrayLike: ArrayLike<(T | PromiseLike)>): AsyncSequence { return new WrappedArrayLikeAsync(arrayLike); } -export function of(...elements: (T | PromiseLike)[]): AsyncEnumerable { +export function of(...elements: (T | PromiseLike)[]): AsyncSequence { switch (elements.length) { case 0: return empty(); @@ -52,18 +52,18 @@ export function of(...elements: (T | PromiseLike)[]): AsyncEnumerable { } } -export function func(f: () => Promise): AsyncEnumerable { - return new FunctionAsyncEnumerable(f); +export function func(f: () => Promise): AsyncSequence { + return new FunctionAsyncSequence(f); } -export function generator(generator: () => AsyncGenerator): AsyncEnumerable { - return new GeneratorAsyncEnumerable(generator); +export function generator(generator: () => AsyncGenerator): AsyncSequence { + return new GeneratorAsyncSequence(generator); } -export function range(max: number): AsyncEnumerable -export function range(min: number, max: number): AsyncEnumerable -export function range(min: number, max: number, step: number): AsyncEnumerable -export function range(a: number, b?: number, c?: number): AsyncEnumerable { +export function range(max: number): AsyncSequence +export function range(min: number, max: number): AsyncSequence +export function range(min: number, max: number, step: number): AsyncSequence +export function range(a: number, b?: number, c?: number): AsyncSequence { if (b === undefined) { b = a; a = 0; @@ -73,12 +73,12 @@ export function range(a: number, b?: number, c?: number): AsyncEnumerable(value: T, count?: number): AsyncEnumerable { +export function repeat(value: T, count?: number): AsyncSequence { if (count == undefined) { - return new RepeatForeverAsyncEnumerable(value); + return new RepeatForeverAsyncSequence(value); } if (count < 0) { @@ -93,9 +93,9 @@ export function repeat(value: T, count?: number): AsyncEnumerable { return new WrappedObjectAsync(value); } - return new RepeatAsyncEnumerable(value, count); + return new RepeatAsyncSequence(value, count); } -export function isAsyncEnumerable(obj: any): obj is AsyncEnumerable { - return obj instanceof AsyncEnumerableMarker; +export function isAsyncSequence(obj: any): obj is AsyncSequence { + return obj instanceof AsyncSequenceMarker; } diff --git a/src/async/types.ts b/src/async/types.ts index 7c1ed2d..2a0723d 100644 --- a/src/async/types.ts +++ b/src/async/types.ts @@ -2,41 +2,41 @@ import { Collector } from "../collector/types.js"; import { AsyncRandomOptions } from "../random/types.js"; import { MaybeAsyncPredicate, MaybeAsyncConverter, MaybeAsyncIterable, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, Predicate, MaybeAsyncAction } from "../types.js"; -export interface AsyncEnumerable extends AsyncIterable> { +export interface AsyncSequence extends AsyncIterable> { iterator(): AsyncIterator>; - apply(pipeline: (enumerable: AsyncEnumerable) => TResult): TResult; + apply(pipeline: (sequence: AsyncSequence) => TResult): TResult; count(predicate?: MaybeAsyncPredicate): Promise; nonEnumeratedCount(): Promise; fastCount(): Promise; maxCount(): Promise; - select(selector: MaybeAsyncConverter): AsyncEnumerable; - selectMany(selector: MaybeAsyncConverter>): AsyncEnumerable; + select(selector: MaybeAsyncConverter): AsyncSequence; + selectMany(selector: MaybeAsyncConverter>): AsyncSequence; - where(predicate: MaybeAsyncPredicate): AsyncEnumerable; + where(predicate: MaybeAsyncPredicate): AsyncSequence; - groupBy(keySelector: MaybeAsyncConverter, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncEnumerable>; - groupBy(keySelector: MaybeAsyncConverter, elementSelector: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater): AsyncEnumerable>; + groupBy(keySelector: MaybeAsyncConverter, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncSequence>; + groupBy(keySelector: MaybeAsyncConverter, elementSelector: MaybeAsyncConverter, keyComparer?: MaybeAsyncEquater): AsyncSequence>; - join(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncEnumerable<[Awaited, Awaited]>; - join(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector: MaybeAsyncBiConverter, keyComparer?: MaybeAsyncEquater): AsyncEnumerable; + join(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncSequence<[Awaited, Awaited]>; + join(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector: MaybeAsyncBiConverter, keyComparer?: MaybeAsyncEquater): AsyncSequence; - groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncEnumerable>; - groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector: MaybeAsyncBiConverter, TResult>, keyComparer?: MaybeAsyncEquater): AsyncEnumerable; + groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector?: undefined, keyComparer?: MaybeAsyncEquater): AsyncSequence>; + groupJoin(iterable: MaybeAsyncIterable, firstKeySelector: MaybeAsyncConverter, secondKeySelector: MaybeAsyncConverter, resultSelector: MaybeAsyncBiConverter, TResult>, keyComparer?: MaybeAsyncEquater): AsyncSequence; contains(obj: TElement, equater?: MaybeAsyncEquater): Promise; sequenceEquals(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): Promise; - append(obj: TElement): AsyncEnumerable; + append(obj: TElement): AsyncSequence; - prepend(obj: TElement): AsyncEnumerable; + prepend(obj: TElement): AsyncSequence; - remove(obj: TElement, all?: boolean, equater?: MaybeAsyncEquater): AsyncEnumerable; + remove(obj: TElement, all?: boolean, equater?: MaybeAsyncEquater): AsyncSequence; - concat(...iterables: MaybeAsyncIterable[]): AsyncEnumerable; + concat(...iterables: MaybeAsyncIterable[]): AsyncSequence; first(predicate?: MaybeAsyncPredicate): Promise; firstOrDefault(predicate?: MaybeAsyncPredicate, def?: TElement): Promise; @@ -60,23 +60,23 @@ export interface AsyncEnumerable extends AsyncIterable; maxBy(selector: MaybeAsyncConverter): Promise; - order(comparer?: MaybeAsyncComparer): AsyncEnumerable; - orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): AsyncEnumerable; + order(comparer?: MaybeAsyncComparer): AsyncSequence; + orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): AsyncSequence; - orderDescending(comparer?: MaybeAsyncComparer): AsyncEnumerable; - orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): AsyncEnumerable; + orderDescending(comparer?: MaybeAsyncComparer): AsyncSequence; + orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): AsyncSequence; - distinct(equater?: MaybeAsyncEquater): AsyncEnumerable; - distinctBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncEnumerable; + distinct(equater?: MaybeAsyncEquater): AsyncSequence; + distinctBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; - union(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncEnumerable; - unionBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncEnumerable; + union(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncSequence; + unionBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; - except(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncEnumerable; - exceptBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncEnumerable; + except(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncSequence; + exceptBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; - intersect(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncEnumerable; - intersectBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncEnumerable; + intersect(iterable: MaybeAsyncIterable, equater?: MaybeAsyncEquater): AsyncSequence; + intersectBy(iterable: MaybeAsyncIterable, selector: MaybeAsyncConverter, equater?: MaybeAsyncEquater): AsyncSequence; all(predicate: MaybeAsyncPredicate): Promise; any(predicate: MaybeAsyncPredicate): Promise; @@ -84,29 +84,29 @@ export interface AsyncEnumerable extends AsyncIterable): Promise; none(): Promise; - skip(n: number): AsyncEnumerable; - skipLast(n: number): AsyncEnumerable; - skipWhile(condition: MaybeAsyncPredicate): AsyncEnumerable; + skip(n: number): AsyncSequence; + skipLast(n: number): AsyncSequence; + skipWhile(condition: MaybeAsyncPredicate): AsyncSequence; - take(n: number): AsyncEnumerable; - takeLast(n: number): AsyncEnumerable; - takeWhile(condition: MaybeAsyncPredicate): AsyncEnumerable; + take(n: number): AsyncSequence; + takeLast(n: number): AsyncSequence; + takeWhile(condition: MaybeAsyncPredicate): AsyncSequence; - peek(action: MaybeAsyncAction): AsyncEnumerable; + peek(action: MaybeAsyncAction): AsyncSequence; forEach(action: MaybeAsyncAction): Promise; - zip(iterable: MaybeAsyncIterable): AsyncEnumerable<[Awaited, Awaited]>; + zip(iterable: MaybeAsyncIterable): AsyncSequence<[Awaited, Awaited]>; - indexex(): AsyncEnumerable<[number, Awaited]>; + indexex(): AsyncSequence<[number, Awaited]>; - reversed(): AsyncEnumerable; + reversed(): AsyncSequence; - chunked(size: number): AsyncEnumerable; + chunked(size: number): AsyncSequence; random(options?: AsyncRandomOptions): Promise; - cached(): AsyncEnumerable; + cached(): AsyncSequence; toArray(): Promise; toMap(keySelector: MaybeAsyncConverter, valueSelector: MaybeAsyncConverter): Promise>; @@ -116,18 +116,18 @@ export interface AsyncEnumerable extends AsyncIterable(collector: Collector): Promise; } -export interface GroupedAsyncEnumerable extends AsyncEnumerable { +export interface GroupedAsyncSequence extends AsyncSequence { get key(): TKey; } -export interface OrderedAsyncEnumerable extends AsyncEnumerable { +export interface OrderedAsyncSequence extends AsyncSequence { get comparer(): MaybeAsyncComparer; - thenSelf(comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable; + thenSelf(comparer?: MaybeAsyncComparer): OrderedAsyncSequence; - thenBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable; + thenBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncSequence; - thenSelfDescending(comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable; + thenSelfDescending(comparer?: MaybeAsyncComparer): OrderedAsyncSequence; - thenByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncEnumerable; + thenByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparer): OrderedAsyncSequence; } diff --git a/src/index.ts b/src/index.ts index 3713778..38dd087 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,8 @@ -export { BaseEnumerable, DelegatedEnumerable } from "./sync/impl.js"; -export * as Enumerables from "./sync/index.js"; +export { BaseSequence, DelegatedSequence } from "./sync/impl.js"; +export * as Sequences from "./sync/index.js"; export * from "./sync/types.js"; -export { BaseAsyncEnumerable, DelegatedAsyncEnumerable } from "./async/impl.js"; -export * as AsyncEnumerables from "./async/index.js"; +export { BaseAsyncSequence, DelegatedAsyncSequence } from "./async/impl.js"; +export * as AsyncSequences from "./async/index.js"; export * from "./async/types.js"; export * as Collectors from "./collector/index.js"; export * from "./collector/types.js"; diff --git a/src/sync/impl.ts b/src/sync/impl.ts index 1486965..cacd1ab 100644 --- a/src/sync/impl.ts +++ b/src/sync/impl.ts @@ -7,43 +7,43 @@ import { RandomOptions } from "../random/types.js"; import { Converter, FilterPredicate, Equater, BiConverter, Predicate, Accumulator, Comparer, Action } from "../types.js"; import { strictEquals, identity, operatorCompare, reverseComparer, wrapAsIterable, defaultArrayComparer, combineComparers } from "../utils.js"; import { array, empty, wrap } from "./index.js"; -import { Enumerable, GroupedEnumerable, OrderedEnumerable } from "./types.js"; +import { Sequence, GroupedSequence, OrderedSequence } from "./types.js"; -export class EnumerableMarker { } +export class SequenceMarker { } -export abstract class BaseEnumerable extends EnumerableMarker implements Enumerable { +export abstract class BaseSequence extends SequenceMarker implements Sequence { [Symbol.iterator]() { return this.iterator(); } abstract iterator(): Iterator; - apply(pipeline: (enumerable: this) => TResult) { + apply(pipeline: (sequence: this) => TResult) { return pipeline(this); } - select(converter: Converter): Enumerable { - return new SelectEnumerable(this, converter); + select(converter: Converter): Sequence { + return new SelectSequence(this, converter); } - selectMany(converter: Converter>): Enumerable { - return new SelectManyEnumerable(this, converter); + selectMany(converter: Converter>): Sequence { + return new SelectManySequence(this, converter); } - where(predicate: FilterPredicate): Enumerable { - return new WhereEnumerable(this, predicate); + where(predicate: FilterPredicate): Sequence { + return new WhereSequence(this, predicate); } - groupBy(keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater): Enumerable> { - return new GroupByEnumerable(this, keySelector, elementSelector, keyComparer); + groupBy(keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater): Sequence> { + return new GroupBySequence(this, keySelector, elementSelector, keyComparer); } - join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyComparer?: Equater): Enumerable { - return new JoinEnumerable(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); + join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyComparer?: Equater): Sequence { + return new JoinSequence(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); } - groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater): Enumerable { - return new GroupJoinEnumerable(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); + groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater): Sequence { + return new GroupJoinSequence(this, wrap(iterable), firstKeySelector, secondKeySelector, resultSelector, keyComparer); } contains(obj: TElement, equater?: Equater) { @@ -99,16 +99,16 @@ export abstract class BaseEnumerable extends EnumerableMarker implemen } } - append(obj: TElement): Enumerable { - return new AppendEnumerable(this, obj); + append(obj: TElement): Sequence { + return new AppendSequence(this, obj); } - prepend(obj: TElement): Enumerable { - return new PrependEnumerable(this, obj); + prepend(obj: TElement): Sequence { + return new PrependSequence(this, obj); } - remove(obj: TElement, all?: boolean, equater?: Equater): Enumerable { - return new RemoveEnumerable(this, obj, all, equater); + remove(obj: TElement, all?: boolean, equater?: Equater): Sequence { + return new RemoveSequence(this, obj, all, equater); } concat(...iterables: Iterable[]) { @@ -116,13 +116,13 @@ export abstract class BaseEnumerable extends EnumerableMarker implemen return this; } - const arr: Enumerable[] = [this]; + const arr: Sequence[] = [this]; for (const iterable of iterables) { arr.push(wrap(iterable)); } - return new ConcatEnumerable(arr); + return new ConcatSequence(arr); } count(predicate?: Predicate) { @@ -438,52 +438,52 @@ export abstract class BaseEnumerable extends EnumerableMarker implemen return this.#find(x => x < 0, converter, comparer); } - order(comparer?: Comparer): OrderedEnumerable { - return new OrderEnumerable(this, false, comparer); + order(comparer?: Comparer): OrderedSequence { + return new OrderSequence(this, false, comparer); } - orderBy(selector: Converter, comparer?: Comparer): OrderedEnumerable { - return new OrderByEnumerable(this, false, selector, comparer); + orderBy(selector: Converter, comparer?: Comparer): OrderedSequence { + return new OrderBySequence(this, false, selector, comparer); } - orderDescending(comparer?: Comparer): OrderedEnumerable { - return new OrderEnumerable(this, true, comparer); + orderDescending(comparer?: Comparer): OrderedSequence { + return new OrderSequence(this, true, comparer); } - orderByDescending(selector: Converter, comparer?: Comparer): OrderedEnumerable { - return new OrderByEnumerable(this, true, selector, comparer); + orderByDescending(selector: Converter, comparer?: Comparer): OrderedSequence { + return new OrderBySequence(this, true, selector, comparer); } - distinct(equater?: Equater): Enumerable { - return new DistinctEnumerable(this, equater); + distinct(equater?: Equater): Sequence { + return new DistinctSequence(this, equater); } - distinctBy(selector: Converter, equater?: Equater): Enumerable { - return new DistinctByEnumerable(this, selector, equater); + distinctBy(selector: Converter, equater?: Equater): Sequence { + return new DistinctBySequence(this, selector, equater); } - union(iterable: Iterable, equater?: Equater): Enumerable { - return new UnionEnumerable(this, wrap(iterable), equater); + union(iterable: Iterable, equater?: Equater): Sequence { + return new UnionSequence(this, wrap(iterable), equater); } - unionBy(iterable: Iterable, selector: Converter, equater?: Equater): Enumerable { - return new UnionByEnumerable(this, wrap(iterable), selector, equater); + unionBy(iterable: Iterable, selector: Converter, equater?: Equater): Sequence { + return new UnionBySequence(this, wrap(iterable), selector, equater); } - except(iterable: Iterable): Enumerable { - return new ExceptEnumerable(this, wrap(iterable)); + except(iterable: Iterable): Sequence { + return new ExceptSequence(this, wrap(iterable)); } - exceptBy(iterable: Iterable, selector: Converter): Enumerable { - return new ExceptByEnumerable(this, wrap(iterable), selector); + exceptBy(iterable: Iterable, selector: Converter): Sequence { + return new ExceptBySequence(this, wrap(iterable), selector); } - intersect(iterable: Iterable): Enumerable { - return new IntersectEnumerable(this, wrap(iterable)); + intersect(iterable: Iterable): Sequence { + return new IntersectSequence(this, wrap(iterable)); } - intersectBy(iterable: Iterable, selector: Converter): Enumerable { - return new IntersectByEnumerable(this, wrap(iterable), selector); + intersectBy(iterable: Iterable, selector: Converter): Sequence { + return new IntersectBySequence(this, wrap(iterable), selector); } all(predicate: Predicate) { @@ -542,48 +542,48 @@ export abstract class BaseEnumerable extends EnumerableMarker implemen return n < 0 && this.iterator().next().done === true; } - skip(n: number): Enumerable { + skip(n: number): Sequence { if (n < 0) { throw new Error("Cannot skip a negative number of elements."); } - return n === 0 ? this : new SkipEnumerable(this, n); + return n === 0 ? this : new SkipSequence(this, n); } - skipLast(n: number): Enumerable { + skipLast(n: number): Sequence { if (n < 0) { throw new Error("Cannot skip a negative number of elements."); } - return n === 0 ? this : new SkipLastEnumerable(this, n); + return n === 0 ? this : new SkipLastSequence(this, n); } - skipWhile(predicate: Predicate): Enumerable { - return new SkipWhileEnumerable(this, predicate); + skipWhile(predicate: Predicate): Sequence { + return new SkipWhileSequence(this, predicate); } - take(n: number): Enumerable { + take(n: number): Sequence { if (n < 0) { throw new Error("Cannot take a negative number of elements."); } - return n === 0 ? empty() : new TakeEnumerable(this, n); + return n === 0 ? empty() : new TakeSequence(this, n); } - takeLast(n: number): Enumerable { + takeLast(n: number): Sequence { if (n < 0) { throw new Error("Cannot take a negative number of elements."); } - return n === 0 ? empty() : new TakeLastEnumerable(this, n); + return n === 0 ? empty() : new TakeLastSequence(this, n); } - takeWhile(predicate: Predicate): Enumerable { - return new TakeWhileEnumerable(this, predicate); + takeWhile(predicate: Predicate): Sequence { + return new TakeWhileSequence(this, predicate); } - peek(action: Action): Enumerable { - return new PeekEnumerable(this, action); + peek(action: Action): Sequence { + return new PeekSequence(this, action); } forEach(action: Action) { @@ -592,32 +592,32 @@ export abstract class BaseEnumerable extends EnumerableMarker implemen } } - zip(iterable: Iterable): Enumerable<[TElement, TOther]> { - return new ZippedEnumerable(this, wrap(iterable)); + zip(iterable: Iterable): Sequence<[TElement, TOther]> { + return new ZippedSequence(this, wrap(iterable)); } - indexed(): Enumerable<[number, TElement]> { - return new IndexedEnumerable(this); + indexed(): Sequence<[number, TElement]> { + return new IndexedSequence(this); } - reversed(): Enumerable { - return new ReversedEnumerable(this); + reversed(): Sequence { + return new ReversedSequence(this); } - chunked(size: number): Enumerable { + chunked(size: number): Sequence { if (size <= 0) { throw new Error("Chunk size must be positive."); } - return new ChunkedEnumerable(this, size); + return new ChunkedSequence(this, size); } random(options?: RandomOptions) { return getRandomElement(this, options).element; } - cached(): Enumerable { - return new CacheEnumerable(this); + cached(): Sequence { + return new CacheSequence(this); } asArray() { @@ -669,21 +669,21 @@ export abstract class BaseEnumerable extends EnumerableMarker implemen } } -export class DelegatedEnumerable extends EnumerableMarker implements Enumerable { - #enumerable: Enumerable; +export class DelegatedSequence extends SequenceMarker implements Sequence { + #sequence: Sequence; - constructor(enumerable: Enumerable) { + constructor(sequence: Sequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } - get enumerable() { - return this.#enumerable; + get sequence() { + return this.#sequence; } - protected set enumerable(value: Enumerable) { - this.#enumerable = value; + protected set sequence(value: Sequence) { + this.#sequence = value; } [Symbol.iterator]() { @@ -691,279 +691,279 @@ export class DelegatedEnumerable extends EnumerableMarker implements E } iterator() { - return this.#enumerable.iterator(); + return this.#sequence.iterator(); } - apply(pipeline: (enumerable: Enumerable) => TResult) { - return this.#enumerable.apply(pipeline); + apply(pipeline: (sequence: Sequence) => TResult) { + return this.#sequence.apply(pipeline); } count(predicate?: Predicate) { - return this.#enumerable.count(predicate); + return this.#sequence.count(predicate); } nonEnumeratedCount() { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } fastCount() { - return this.#enumerable.fastCount(); + return this.#sequence.fastCount(); } maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } select(selector: Converter) { - return this.#enumerable.select(selector); + return this.#sequence.select(selector); } selectMany(selector: Converter>) { - return this.#enumerable.selectMany(selector); + return this.#sequence.selectMany(selector); } where(predicate: FilterPredicate) { - return this.#enumerable.where(predicate); + return this.#sequence.where(predicate); } groupBy(keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater) { //@ts-ignore - return this.#enumerable.groupBy(keySelector, elementSelector, keyComparer); + return this.#sequence.groupBy(keySelector, elementSelector, keyComparer); } join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyComparer?: Equater) { //@ts-ignore - return this.#enumerable.join(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); + return this.#sequence.join(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); } - groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater) { + groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater) { //@ts-ignore - return this.#enumerable.groupJoin(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); + return this.#sequence.groupJoin(iterable, firstKeySelector, secondKeySelector, resultSelector, keyComparer); } contains(obj: TElement, equater?: Equater) { - return this.#enumerable.contains(obj, equater); + return this.#sequence.contains(obj, equater); } sequenceEquals(iterable: Iterable, equater?: Equater) { - return this.#enumerable.sequenceEquals(iterable, equater); + return this.#sequence.sequenceEquals(iterable, equater); } append(obj: TElement) { - return this.#enumerable.append(obj); + return this.#sequence.append(obj); } prepend(obj: TElement) { - return this.#enumerable.prepend(obj); + return this.#sequence.prepend(obj); } remove(obj: TElement, all?: boolean, equater?: Equater) { - return this.#enumerable.remove(obj, all, equater); + return this.#sequence.remove(obj, all, equater); } concat(...iterables: Iterable[]) { - return this.#enumerable.concat(...iterables); + return this.#sequence.concat(...iterables); } first(predicate?: Predicate) { - return this.#enumerable.first(predicate); + return this.#sequence.first(predicate); } firstOrDefault(predicate?: Predicate, def?: TElement) { - return this.#enumerable.firstOrDefault(predicate, def); + return this.#sequence.firstOrDefault(predicate, def); } last(predicate?: Predicate) { - return this.#enumerable.last(predicate); + return this.#sequence.last(predicate); } lastOrDefault(predicate?: Predicate, def?: TElement) { - return this.#enumerable.lastOrDefault(predicate, def); + return this.#sequence.lastOrDefault(predicate, def); } single(predicate?: Predicate) { - return this.#enumerable.single(predicate); + return this.#sequence.single(predicate); } singleOrDefault(predicate?: Predicate, def?: TElement) { - return this.#enumerable.singleOrDefault(predicate, def); + return this.#sequence.singleOrDefault(predicate, def); } elementAt(index: number) { - return this.#enumerable.elementAt(index); + return this.#sequence.elementAt(index); } elementAtOrDefault(index: number, def?: TElement) { - return this.#enumerable.elementAtOrDefault(index, def); + return this.#sequence.elementAtOrDefault(index, def); } aggregate(accumulator: Accumulator, seed?: TAccumulator, resultSelector?: Converter) { - return this.#enumerable.aggregate(accumulator, seed, resultSelector); + return this.#sequence.aggregate(accumulator, seed, resultSelector); } min(comparer?: Comparer) { - return this.#enumerable.min(comparer); + return this.#sequence.min(comparer); } minBy(selector: Converter, comparer?: Comparer) { - return this.#enumerable.minBy(selector, comparer); + return this.#sequence.minBy(selector, comparer); } max(comparer?: Comparer) { - return this.#enumerable.max(comparer); + return this.#sequence.max(comparer); } maxBy(selector: Converter, comparer?: Comparer) { - return this.#enumerable.maxBy(selector, comparer); + return this.#sequence.maxBy(selector, comparer); } order(comparer?: Comparer) { - return this.#enumerable.order(comparer); + return this.#sequence.order(comparer); } orderBy(selector: Converter, comparer?: Comparer) { - return this.#enumerable.orderBy(selector, comparer); + return this.#sequence.orderBy(selector, comparer); } orderDescending(comparer?: Comparer) { - return this.#enumerable.orderDescending(comparer); + return this.#sequence.orderDescending(comparer); } orderByDescending(selector: Converter, comparer?: Comparer) { - return this.#enumerable.orderByDescending(selector, comparer); + return this.#sequence.orderByDescending(selector, comparer); } distinct(equater?: Equater) { - return this.#enumerable.distinct(equater); + return this.#sequence.distinct(equater); } distinctBy(selector: Converter, equater?: Equater) { - return this.#enumerable.distinctBy(selector, equater); + return this.#sequence.distinctBy(selector, equater); } union(iterable: Iterable, equater?: Equater) { - return this.#enumerable.union(iterable, equater); + return this.#sequence.union(iterable, equater); } unionBy(iterable: Iterable, selector: Converter, equater?: Equater) { - return this.#enumerable.unionBy(iterable, selector, equater); + return this.#sequence.unionBy(iterable, selector, equater); } except(iterable: Iterable, equater?: Equater) { - return this.#enumerable.except(iterable, equater); + return this.#sequence.except(iterable, equater); } exceptBy(iterable: Iterable, selector: Converter, equater?: Equater) { - return this.#enumerable.exceptBy(iterable, selector, equater); + return this.#sequence.exceptBy(iterable, selector, equater); } intersect(iterable: Iterable, equater?: Equater) { - return this.#enumerable.intersect(iterable, equater); + return this.#sequence.intersect(iterable, equater); } intersectBy(iterable: Iterable, selector: Converter, equater?: Equater) { - return this.#enumerable.intersectBy(iterable, selector, equater); + return this.#sequence.intersectBy(iterable, selector, equater); } all(predicate: Predicate) { - return this.#enumerable.all(predicate); + return this.#sequence.all(predicate); } any(predicate?: Predicate) { //@ts-ignore - return this.#enumerable.any(predicate); + return this.#sequence.any(predicate); } none(predicate?: Predicate) { //@ts-ignore - return this.#enumerable.none(predicate); + return this.#sequence.none(predicate); } skip(n: number) { - return this.#enumerable.skip(n); + return this.#sequence.skip(n); } skipLast(n: number) { - return this.#enumerable.skipLast(n); + return this.#sequence.skipLast(n); } skipWhile(condition: Predicate) { - return this.#enumerable.skipWhile(condition); + return this.#sequence.skipWhile(condition); } take(n: number) { - return this.#enumerable.take(n); + return this.#sequence.take(n); } takeLast(n: number) { - return this.#enumerable.takeLast(n); + return this.#sequence.takeLast(n); } takeWhile(condition: Predicate) { - return this.#enumerable.takeWhile(condition); + return this.#sequence.takeWhile(condition); } peek(action: Action) { - return this.#enumerable.peek(action); + return this.#sequence.peek(action); } forEach(action: Action) { - this.#enumerable.forEach(action); + this.#sequence.forEach(action); } zip(iterable: Iterable) { - return this.#enumerable.zip(iterable); + return this.#sequence.zip(iterable); } indexed() { - return this.#enumerable.indexed(); + return this.#sequence.indexed(); } reversed() { - return this.#enumerable.reversed(); + return this.#sequence.reversed(); } chunked(size: number) { - return this.#enumerable.chunked(size); + return this.#sequence.chunked(size); } random(options?: RandomOptions) { - return this.#enumerable.random(options); + return this.#sequence.random(options); } cached() { - return this.#enumerable.cached(); + return this.#sequence.cached(); } asArray() { - return this.#enumerable.asArray(); + return this.#sequence.asArray(); } toArray() { - return this.#enumerable.toArray(); + return this.#sequence.toArray(); } toMap(keySelector: Converter, valueSelector: Converter) { - return this.#enumerable.toMap(keySelector, valueSelector); + return this.#sequence.toMap(keySelector, valueSelector); } toSet() { - return this.#enumerable.toSet(); + return this.#sequence.toSet(); } toObject(keySelector: Converter, valueSelector: Converter) { - return this.#enumerable.toObject(keySelector, valueSelector); + return this.#sequence.toObject(keySelector, valueSelector); } collect(collector: Collector) { - return this.#enumerable.collect(collector); + return this.#sequence.collect(collector); } } -export class GroupedEnumerableImpl extends DelegatedEnumerable implements GroupedEnumerable { +export class GroupedSequenceImpl extends DelegatedSequence implements GroupedSequence { readonly #key: TKey; - constructor(key: TKey, grouping: Enumerable) { + constructor(key: TKey, grouping: Sequence) { super(grouping); this.#key = key; @@ -974,51 +974,51 @@ export class GroupedEnumerableImpl extends DelegatedEnumerable extends BaseEnumerable implements OrderedEnumerable { - readonly #enumerable: Enumerable; +export abstract class BaseOrderedSequence extends BaseSequence implements OrderedSequence { + readonly #sequence: Sequence; readonly #sorter: Comparer | undefined; readonly #descending: boolean; - constructor(enumerable: Enumerable, sorter: Comparer | undefined, descending: boolean) { + constructor(sequence: Sequence, sorter: Comparer | undefined, descending: boolean) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#sorter = sorter; this.#descending = descending; } override nonEnumeratedCount() { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } get comparer() { return this.#sorter; } - thenSelf(comparer?: Comparer): OrderedEnumerable { - return new ThenOrderEnumerable(this, false, comparer); + thenSelf(comparer?: Comparer): OrderedSequence { + return new ThenOrderSequence(this, false, comparer); } - thenBy(selector: Converter, comparer?: Comparer): OrderedEnumerable { - return new ThenOrderByEnumerable(this, false, selector, comparer); + thenBy(selector: Converter, comparer?: Comparer): OrderedSequence { + return new ThenOrderBySequence(this, false, selector, comparer); } - thenSelfDescending(comparer?: Comparer): OrderedEnumerable { - return new ThenOrderEnumerable(this, true, comparer); + thenSelfDescending(comparer?: Comparer): OrderedSequence { + return new ThenOrderSequence(this, true, comparer); } - thenByDescending(selector: Converter, comparer?: Comparer): OrderedEnumerable { - return new ThenOrderByEnumerable(this, true, selector, comparer); + thenByDescending(selector: Converter, comparer?: Comparer): OrderedSequence { + return new ThenOrderBySequence(this, true, selector, comparer); } override *iterator() { const arr: TElement[] = []; - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { arr.push(obj); } @@ -1036,8 +1036,8 @@ export abstract class BaseOrderedEnumerable extends BaseEnumerable extends BaseEnumerable { - static readonly INSTANCE = new EmptyEnumerable(); +export class EmptySequence extends BaseSequence { + static readonly INSTANCE = new EmptySequence(); override nonEnumeratedCount() { return 0; @@ -1050,7 +1050,7 @@ export class EmptyEnumerable extends BaseEnumerable { override *iterator() { } } -export class RangeEnumerable extends BaseEnumerable { +export class RangeSequence extends BaseSequence { readonly #min: number; readonly #max: number; readonly #step: number; @@ -1082,7 +1082,7 @@ export class RangeEnumerable extends BaseEnumerable { } } -export class BigIntRangeEnumerable extends BaseEnumerable { +export class BigIntRangeSequence extends BaseSequence { readonly #min: bigint; readonly #max: bigint; readonly #step: bigint; @@ -1114,7 +1114,7 @@ export class BigIntRangeEnumerable extends BaseEnumerable { } } -export class RepeatEnumerable extends BaseEnumerable { +export class RepeatSequence extends BaseSequence { readonly #value: T; readonly #count: number; @@ -1142,7 +1142,7 @@ export class RepeatEnumerable extends BaseEnumerable { } } -export class RepeatForeverEnumerable extends BaseEnumerable { +export class RepeatForeverSequence extends BaseSequence { readonly #value: T; constructor(value: T) { @@ -1166,7 +1166,7 @@ export class RepeatForeverEnumerable extends BaseEnumerable { } } -export class WrappedObject extends BaseEnumerable { +export class WrappedObject extends BaseSequence { readonly #obj: T; constructor(obj: T) { @@ -1188,7 +1188,7 @@ export class WrappedObject extends BaseEnumerable { } } -export class WrappedIterable extends BaseEnumerable { +export class WrappedIterable extends BaseSequence { readonly #iterable: Iterable; constructor(iterable: Iterable) { @@ -1202,7 +1202,7 @@ export class WrappedIterable extends BaseEnumerable { } } -export class WrappedArray extends BaseEnumerable { +export class WrappedArray extends BaseSequence { readonly #array: T[]; constructor(array: T[]) { @@ -1266,7 +1266,7 @@ export class WrappedArray extends BaseEnumerable { } } -export class WrappedArrayLike extends BaseEnumerable { +export class WrappedArrayLike extends BaseSequence { readonly #arrayLike: ArrayLike; constructor(arrayLike: ArrayLike) { @@ -1302,7 +1302,7 @@ export class WrappedArrayLike extends BaseEnumerable { } } -export class WrappedSet extends BaseEnumerable { +export class WrappedSet extends BaseSequence { readonly #set: Set; constructor(set: Set) { @@ -1332,7 +1332,7 @@ export class WrappedSet extends BaseEnumerable { } } -export class WrappedMap extends BaseEnumerable<[K, V]> { +export class WrappedMap extends BaseSequence<[K, V]> { readonly #map: Map; constructor(map: Map) { @@ -1366,7 +1366,7 @@ export class WrappedMap extends BaseEnumerable<[K, V]> { } } -export class GeneratorEnumerable extends BaseEnumerable { +export class GeneratorSequence extends BaseSequence { readonly #generator: () => Iterable; constructor(generator: () => Iterable) { @@ -1380,7 +1380,7 @@ export class GeneratorEnumerable extends BaseEnumerable { } } -export class FunctionEnumerable extends BaseEnumerable { +export class FunctionSequence extends BaseSequence { readonly #f: () => T; constructor(f: () => T) { @@ -1404,20 +1404,20 @@ export class FunctionEnumerable extends BaseEnumerable { } } -export class ConcatEnumerable extends BaseEnumerable { - readonly #enumerables: Iterable>; +export class ConcatSequence extends BaseSequence { + readonly #sequences: Iterable>; - constructor(enumerables: Iterable>) { + constructor(sequences: Iterable>) { super(); - this.#enumerables = enumerables; + this.#sequences = sequences; } override nonEnumeratedCount() { let n = 0; - for (const enumerable of this.#enumerables) { - const m = enumerable.nonEnumeratedCount(); + for (const sequence of this.#sequences) { + const m = sequence.nonEnumeratedCount(); if (m < 0) { return super.nonEnumeratedCount(); @@ -1432,8 +1432,8 @@ export class ConcatEnumerable extends BaseEnumerable { override count() { let n = 0; - for (const enumerable of this.#enumerables) { - n += enumerable.count(); + for (const sequence of this.#sequences) { + n += sequence.count(); } return n; @@ -1442,39 +1442,39 @@ export class ConcatEnumerable extends BaseEnumerable { override maxCount() { let n = 0; - for (const enumerable of this.#enumerables) { - n += enumerable.maxCount(); + for (const sequence of this.#sequences) { + n += sequence.maxCount(); } return n; } override *iterator() { - for (const enumerable of this.#enumerables) { - yield* enumerable; + for (const sequence of this.#sequences) { + yield* sequence; } } } -export class DistinctEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class DistinctSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #equater: Equater | undefined; - constructor(enumerable: Enumerable, equater?: Equater) { + constructor(sequence: Sequence, equater?: Equater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#equater = equater; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { const set = createEqualitySet(this.#equater); - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { if (set.add(obj)) { yield obj; } @@ -1482,27 +1482,27 @@ export class DistinctEnumerable extends BaseEnumerable { } } -export class DistinctByEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class DistinctBySequence extends BaseSequence { + readonly #sequence: Sequence; readonly #selector: Converter; readonly #equater: Equater | undefined; - constructor(enumerable: Enumerable, selector: Converter, equater?: Equater) { + constructor(sequence: Sequence, selector: Converter, equater?: Equater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#selector = selector; this.#equater = equater; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { const set = createEqualitySet(this.#equater); - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { if (set.add(this.#selector(obj))) { yield obj; } @@ -1510,23 +1510,23 @@ export class DistinctByEnumerable extends BaseEnumerable { } } -export class WhereEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class WhereSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #predicate: FilterPredicate; - constructor(enumerable: Enumerable, predicate: FilterPredicate) { + constructor(sequence: Sequence, predicate: FilterPredicate) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#predicate = predicate; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { if (this.#predicate(obj)) { yield obj; } @@ -1534,93 +1534,93 @@ export class WhereEnumerable extends BaseE } } -export class SelectManyEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class SelectManySequence extends BaseSequence { + readonly #sequence: Sequence; readonly #converter: Converter>; - constructor(enumerable: Enumerable, converter: Converter>) { + constructor(sequence: Sequence, converter: Converter>) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#converter = converter; } override *iterator() { - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { yield* this.#converter(obj); } } } -export class IndexedEnumerable extends BaseEnumerable<[number, T]> { - readonly #enumerable: Enumerable; +export class IndexedSequence extends BaseSequence<[number, T]> { + readonly #sequence: Sequence; - constructor(enumerable: Enumerable) { + constructor(sequence: Sequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } override nonEnumeratedCount() { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { let i = 0; - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { yield [i++, obj] as [number, T]; } } } -export class SelectEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class SelectSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #converter: Converter; - constructor(enumerable: Enumerable, converter: Converter) { + constructor(sequence: Sequence, converter: Converter) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#converter = converter; } override nonEnumeratedCount() { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { yield this.#converter(obj); } } } -export class SkipWhileEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class SkipWhileSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #predicate: Predicate; - constructor(enumerable: Enumerable, predicate: Predicate) { + constructor(sequence: Sequence, predicate: Predicate) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#predicate = predicate; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { - const e = wrapAsIterable(this.#enumerable.iterator()); + const e = wrapAsIterable(this.#sequence.iterator()); for (const obj of e) { if (!this.#predicate(obj)) { @@ -1633,28 +1633,28 @@ export class SkipWhileEnumerable extends BaseEnumerable { } } -export class SkipLastEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class SkipLastSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #n: number; - constructor(enumerable: Enumerable, n: number) { + constructor(sequence: Sequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : Math.max(0, n - this.#n); } override maxCount() { - return Math.max(0, this.#enumerable.maxCount() - this.#n); + return Math.max(0, this.#sequence.maxCount() - this.#n); } override *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); const buffer = new Array(this.#n); // n > 0 let i = 0; @@ -1678,28 +1678,28 @@ export class SkipLastEnumerable extends BaseEnumerable { } } -export class SkipEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class SkipSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #n: number; - constructor(enumerable: Enumerable, n: number) { + constructor(sequence: Sequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : Math.max(0, n - this.#n); } override maxCount() { - return Math.max(0, this.#enumerable.maxCount() - this.#n); + return Math.max(0, this.#sequence.maxCount() - this.#n); } override *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); let i = 0; do { @@ -1714,23 +1714,23 @@ export class SkipEnumerable extends BaseEnumerable { } } -export class TakeWhileEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class TakeWhileSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #predicate: Predicate; - constructor(enumerable: Enumerable, predicate: Predicate) { + constructor(sequence: Sequence, predicate: Predicate) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#predicate = predicate; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { if (!this.#predicate(obj)) { return; } @@ -1740,30 +1740,30 @@ export class TakeWhileEnumerable extends BaseEnumerable { } } -export class TakeLastEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class TakeLastSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #n: number; - constructor(enumerable: Enumerable, n: number) { + constructor(sequence: Sequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : Math.min(this.#n, n); } override maxCount() { - return Math.min(this.#n, this.#enumerable.maxCount()); + return Math.min(this.#n, this.#sequence.maxCount()); } override *iterator() { const queue = createQueue(this.#n); - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { queue.enqueue(obj); } @@ -1771,28 +1771,28 @@ export class TakeLastEnumerable extends BaseEnumerable { } } -export class TakeEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class TakeSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #n: number; - constructor(enumerable: Enumerable, n: number) { + constructor(sequence: Sequence, n: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#n = n; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : Math.min(this.#n, n); } override maxCount() { - return Math.min(this.#n, this.#enumerable.maxCount()); + return Math.min(this.#n, this.#sequence.maxCount()); } override *iterator() { - const iterator = this.#enumerable.iterator(); + const iterator = this.#sequence.iterator(); let i = this.#n; while (i > 0) { @@ -1808,15 +1808,15 @@ export class TakeEnumerable extends BaseEnumerable { } } -export class OrderEnumerable extends BaseOrderedEnumerable { - constructor(enumerable: Enumerable, descending: boolean, sorter?: Comparer) { - super(enumerable, sorter, descending); +export class OrderSequence extends BaseOrderedSequence { + constructor(sequence: Sequence, descending: boolean, sorter?: Comparer) { + super(sequence, sorter, descending); } } -export class OrderByEnumerable extends BaseOrderedEnumerable { - constructor(enumerable: Enumerable, descending: boolean, selector: Converter, sorter?: Comparer) { - super(enumerable, OrderByEnumerable.#createSorter(selector, sorter), descending); +export class OrderBySequence extends BaseOrderedSequence { + constructor(sequence: Sequence, descending: boolean, selector: Converter, sorter?: Comparer) { + super(sequence, OrderBySequence.#createSorter(selector, sorter), descending); } static #createSorter(selector: Converter, sorter?: Comparer) { @@ -1825,15 +1825,15 @@ export class OrderByEnumerable extends BaseOrderedEnumerable { } } -export class ThenOrderEnumerable extends BaseOrderedEnumerable { - constructor(enumerable: OrderedEnumerable, descending: boolean, sorter?: Comparer) { - super(enumerable, combineComparers(enumerable.comparer ?? defaultArrayComparer, sorter ?? defaultArrayComparer), descending); +export class ThenOrderSequence extends BaseOrderedSequence { + constructor(sequence: OrderedSequence, descending: boolean, sorter?: Comparer) { + super(sequence, combineComparers(sequence.comparer ?? defaultArrayComparer, sorter ?? defaultArrayComparer), descending); } } -export class ThenOrderByEnumerable extends BaseOrderedEnumerable { - constructor(enumerable: OrderedEnumerable, descending: boolean, selector: Converter, sorter?: Comparer) { - super(enumerable, ThenOrderByEnumerable.#createCombinedSorter(enumerable.comparer, selector, sorter), descending); +export class ThenOrderBySequence extends BaseOrderedSequence { + constructor(sequence: OrderedSequence, descending: boolean, selector: Converter, sorter?: Comparer) { + super(sequence, ThenOrderBySequence.#createCombinedSorter(sequence.comparer, selector, sorter), descending); } static #createCombinedSorter(baseSorter: Comparer | undefined, selector: Converter, sorter?: Comparer) { @@ -1843,63 +1843,63 @@ export class ThenOrderByEnumerable extends BaseOrderedEnumerable { } } -export class AppendEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class AppendSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #obj: T; - constructor(enumerable: Enumerable, obj: T) { + constructor(sequence: Sequence, obj: T) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#obj = obj; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : n + 1; } override maxCount() { - return this.#enumerable.maxCount() + 1; + return this.#sequence.maxCount() + 1; } override *iterator() { - yield* this.#enumerable; + yield* this.#sequence; yield this.#obj; } } -export class PrependEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class PrependSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #obj: T; - constructor(enumerable: Enumerable, obj: T) { + constructor(sequence: Sequence, obj: T) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#obj = obj; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : n + 1; } override maxCount() { - return this.#enumerable.maxCount() + 1; + return this.#sequence.maxCount() + 1; } override *iterator() { yield this.#obj; - yield* this.#enumerable; + yield* this.#sequence; } } -export class PeekEnumerable extends DelegatedEnumerable { +export class PeekSequence extends DelegatedSequence { readonly #action: Action; - constructor(enumerable: Enumerable, action: Action) { - super(enumerable); + constructor(sequence: Sequence, action: Action) { + super(sequence); this.#action = action; } @@ -1912,11 +1912,11 @@ export class PeekEnumerable extends DelegatedEnumerable { } } -export class ZippedEnumerable extends BaseEnumerable<[T, U]> { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class ZippedSequence extends BaseSequence<[T, U]> { + readonly #first: Sequence; + readonly #second: Sequence; - constructor(first: Enumerable, second: Enumerable) { + constructor(first: Sequence, second: Sequence) { super(); this.#first = first; @@ -1951,12 +1951,12 @@ export class ZippedEnumerable extends BaseEnumerable<[T, U]> { } } -export class UnionEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class UnionSequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #equater: Equater | undefined; - constructor(first: Enumerable, second: Enumerable, equater?: Equater) { + constructor(first: Sequence, second: Sequence, equater?: Equater) { super(); this.#first = first; @@ -1984,13 +1984,13 @@ export class UnionEnumerable extends BaseEnumerable { } } -export class UnionByEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class UnionBySequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #selector: Converter; readonly #equater: Equater | undefined; - constructor(first: Enumerable, second: Enumerable, selector: Converter, equater?: Equater) { + constructor(first: Sequence, second: Sequence, selector: Converter, equater?: Equater) { super(); this.#first = first; @@ -2019,12 +2019,12 @@ export class UnionByEnumerable extends BaseEnumerable { } } -export class ExceptEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class ExceptSequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #equater: Equater | undefined; - constructor(first: Enumerable, second: Enumerable, equater?: Equater) { + constructor(first: Sequence, second: Sequence, equater?: Equater) { super(); this.#first = first; @@ -2051,13 +2051,13 @@ export class ExceptEnumerable extends BaseEnumerable { } } -export class ExceptByEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class ExceptBySequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #selector: Converter; readonly #equater: Equater | undefined; - constructor(first: Enumerable, second: Enumerable, selector: Converter, equater?: Equater) { + constructor(first: Sequence, second: Sequence, selector: Converter, equater?: Equater) { super(); this.#first = first; @@ -2085,12 +2085,12 @@ export class ExceptByEnumerable extends BaseEnumerable { } } -export class IntersectEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class IntersectSequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #equater: Equater | undefined; - constructor(first: Enumerable, second: Enumerable, equater?: Equater) { + constructor(first: Sequence, second: Sequence, equater?: Equater) { super(); this.#first = first; @@ -2117,13 +2117,13 @@ export class IntersectEnumerable extends BaseEnumerable { } } -export class IntersectByEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class IntersectBySequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #selector: Converter; readonly #equater: Equater | undefined; - constructor(first: Enumerable, second: Enumerable, selector: Converter, equater?: Equater) { + constructor(first: Sequence, second: Sequence, selector: Converter, equater?: Equater) { super(); this.#first = first; @@ -2151,27 +2151,27 @@ export class IntersectByEnumerable extends BaseEnumerable { } } -export class ReversedEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class ReversedSequence extends BaseSequence { + readonly #sequence: Sequence; - constructor(enumerable: Enumerable) { + constructor(sequence: Sequence) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; } override nonEnumeratedCount() { - return this.#enumerable.nonEnumeratedCount(); + return this.#sequence.nonEnumeratedCount(); } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { const buffer: T[] = []; - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { buffer.push(obj); } @@ -2181,29 +2181,29 @@ export class ReversedEnumerable extends BaseEnumerable { } } -export class GroupByEnumerable extends BaseEnumerable> { - readonly #enumerable: Enumerable; +export class GroupBySequence extends BaseSequence> { + readonly #sequence: Sequence; readonly #keySelector: Converter; readonly #elementSelector: Converter; readonly #keyComparer: Equater | undefined; - constructor(enumerable: Enumerable, keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater) { + constructor(sequence: Sequence, keySelector: Converter, elementSelector?: Converter, keyComparer?: Equater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#keySelector = keySelector; this.#elementSelector = elementSelector ?? identity as Converter; this.#keyComparer = keyComparer; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { const groupings = createEqualityMap(this.#keyComparer); - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { const key = this.#keySelector(obj); let grouping = groupings.get(key); @@ -2215,35 +2215,35 @@ export class GroupByEnumerable extends BaseEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class ChunkedSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #size: number; - constructor(enumerable: Enumerable, size: number) { + constructor(sequence: Sequence, size: number) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#size = size; } override nonEnumeratedCount() { - const n = this.#enumerable.nonEnumeratedCount(); + const n = this.#sequence.nonEnumeratedCount(); return n < 0 ? super.nonEnumeratedCount() : Math.ceil(n / this.#size); } override maxCount() { - return Math.ceil(this.#enumerable.maxCount() / this.#size); + return Math.ceil(this.#sequence.maxCount() / this.#size); } override *iterator() { let chunk: T[] = []; - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { chunk.push(obj); if (chunk.length === this.#size) { @@ -2258,22 +2258,22 @@ export class ChunkedEnumerable extends BaseEnumerable { } } -export class JoinEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class JoinSequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #firstKeySelector: Converter; readonly #secondKeySelector: Converter; readonly #resultSelector: BiConverter; readonly #keyComparer: Equater; - constructor(first: Enumerable, second: Enumerable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyComparer?: Equater) { + constructor(first: Sequence, second: Sequence, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, keyComparer?: Equater) { super(); this.#first = first; this.#second = second; this.#firstKeySelector = firstKeySelector; this.#secondKeySelector = secondKeySelector; - this.#resultSelector = resultSelector ?? JoinEnumerable.#defaultResultSelector as BiConverter; + this.#resultSelector = resultSelector ?? JoinSequence.#defaultResultSelector as BiConverter; this.#keyComparer = keyComparer ?? strictEquals; } @@ -2300,27 +2300,27 @@ export class JoinEnumerable extends BaseEnumerabl } } -export class GroupJoinEnumerable extends BaseEnumerable { - readonly #first: Enumerable; - readonly #second: Enumerable; +export class GroupJoinSequence extends BaseSequence { + readonly #first: Sequence; + readonly #second: Sequence; readonly #firstKeySelector: Converter; readonly #secondKeySelector: Converter; - readonly #resultSelector: BiConverter, TResult>; + readonly #resultSelector: BiConverter, TResult>; readonly #keyComparer: Equater; - constructor(first: Enumerable, second: Enumerable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater) { + constructor(first: Sequence, second: Sequence, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: BiConverter, TResult>, keyComparer?: Equater) { super(); this.#first = first; this.#second = second; this.#firstKeySelector = firstKeySelector; this.#secondKeySelector = secondKeySelector; - this.#resultSelector = resultSelector ?? GroupJoinEnumerable.#defaultResultSelector as BiConverter, TResult>; + this.#resultSelector = resultSelector ?? GroupJoinSequence.#defaultResultSelector as BiConverter, TResult>; this.#keyComparer = keyComparer ?? strictEquals; } - static #defaultResultSelector(first: TOuter, second: Enumerable) { - return new GroupedEnumerableImpl(first, second); + static #defaultResultSelector(first: TOuter, second: Sequence) { + return new GroupedSequenceImpl(first, second); } override nonEnumeratedCount() { @@ -2349,29 +2349,29 @@ export class GroupJoinEnumerable extends BaseEnum } } -export class RemoveEnumerable extends BaseEnumerable { - readonly #enumerable: Enumerable; +export class RemoveSequence extends BaseSequence { + readonly #sequence: Sequence; readonly #obj: T; readonly #all: boolean; readonly #equater: Equater; - constructor(enumerable: Enumerable, obj: T, all?: boolean, equater?: Equater) { + constructor(sequence: Sequence, obj: T, all?: boolean, equater?: Equater) { super(); - this.#enumerable = enumerable; + this.#sequence = sequence; this.#obj = obj; this.#all = all ?? false; this.#equater = equater ?? strictEquals; } override maxCount() { - return this.#enumerable.maxCount(); + return this.#sequence.maxCount(); } override *iterator() { let gotOne = false; - for (const obj of this.#enumerable) { + for (const obj of this.#sequence) { if (this.#equater(this.#obj, obj)) { if (this.#all) { continue; @@ -2388,16 +2388,16 @@ export class RemoveEnumerable extends BaseEnumerable { } } -export class CacheEnumerable extends DelegatedEnumerable { +export class CacheSequence extends DelegatedSequence { #cached = false; - constructor(enumerable: Enumerable) { - super(enumerable); + constructor(sequence: Sequence) { + super(sequence); } override iterator() { if (!this.#cached) { - this.enumerable = array(this.enumerable.toArray()); + this.sequence = array(this.sequence.toArray()); this.#cached = true; } diff --git a/src/sync/index.ts b/src/sync/index.ts index 7dcb325..8bb3658 100644 --- a/src/sync/index.ts +++ b/src/sync/index.ts @@ -1,10 +1,10 @@ import { mathRandom } from "../random/index.js"; import { RandomGenerator } from "../random/types.js"; -import { BigIntRangeEnumerable, ConcatEnumerable, EmptyEnumerable, EnumerableMarker, FunctionEnumerable, GeneratorEnumerable, RangeEnumerable, RepeatEnumerable, RepeatForeverEnumerable, WrappedArray, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet } from "./impl.js"; -import { Enumerable } from "./types.js"; +import { BigIntRangeSequence, ConcatSequence, EmptySequence, SequenceMarker, FunctionSequence, GeneratorSequence, RangeSequence, RepeatSequence, RepeatForeverSequence, WrappedArray, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet } from "./impl.js"; +import { Sequence } from "./types.js"; -export function wrap(iterable: Iterable): Enumerable { - if (isEnumerable(iterable)) { +export function wrap(iterable: Iterable): Sequence { + if (isSequence(iterable)) { return iterable; } @@ -17,41 +17,41 @@ export function wrap(iterable: Iterable): Enumerable { } if (iterable instanceof Map) { - return map(iterable) as unknown as Enumerable; + return map(iterable) as unknown as Sequence; } return sequence(iterable); } -export function sequence(iterable: Iterable): Enumerable { +export function sequence(iterable: Iterable): Sequence { return new WrappedIterable(iterable); } -export function empty(): Enumerable { - return EmptyEnumerable.INSTANCE; +export function empty(): Sequence { + return EmptySequence.INSTANCE; } -export function single(obj: T): Enumerable { +export function single(obj: T): Sequence { return new WrappedObject(obj); } -export function array(array: T[]): Enumerable { +export function array(array: T[]): Sequence { return new WrappedArray(array); } -export function arrayLike(arrayLike: ArrayLike): Enumerable { +export function arrayLike(arrayLike: ArrayLike): Sequence { return new WrappedArrayLike(arrayLike); } -export function set(set: Set): Enumerable { +export function set(set: Set): Sequence { return new WrappedSet(set); } -export function map(map: Map): Enumerable<[K, V]> { +export function map(map: Map): Sequence<[K, V]> { return new WrappedMap(map); } -export function of(...elements: T[]): Enumerable { +export function of(...elements: T[]): Sequence { switch (elements.length) { case 0: return empty(); @@ -62,30 +62,30 @@ export function of(...elements: T[]): Enumerable { } } -export function ofPropertyKeys(...elements: T[]): Enumerable { +export function ofPropertyKeys(...elements: T[]): Sequence { return of(...elements); } -export function entries(o: Record | ArrayLike): Enumerable<[string, T]> { +export function entries(o: Record | ArrayLike): Sequence<[string, T]> { return array(Object.entries(o)); } -export function keys(o: object): Enumerable { +export function keys(o: object): Sequence { return array(Object.keys(o)); } -export function func(f: () => T): Enumerable { - return new FunctionEnumerable(f); +export function func(f: () => T): Sequence { + return new FunctionSequence(f); } -export function generator(generator: () => Iterable): Enumerable { - return new GeneratorEnumerable(generator); +export function generator(generator: () => Iterable): Sequence { + return new GeneratorSequence(generator); } -export function range(max: number): Enumerable -export function range(min: number, max: number): Enumerable -export function range(min: number, max: number, step: number): Enumerable -export function range(a: number, b?: number, c?: number): Enumerable { +export function range(max: number): Sequence +export function range(min: number, max: number): Sequence +export function range(min: number, max: number, step: number): Sequence +export function range(a: number, b?: number, c?: number): Sequence { if (b === undefined) { b = a; a = 0; @@ -95,13 +95,13 @@ export function range(a: number, b?: number, c?: number): Enumerable { c = 1; } - return new RangeEnumerable(a, b, c); + return new RangeSequence(a, b, c); } -export function bigintRange(max: bigint): Enumerable -export function bigintRange(min: bigint, max: bigint): Enumerable -export function bigintRange(min: bigint, max: bigint, step: bigint): Enumerable -export function bigintRange(a: bigint, b?: bigint, c?: bigint): Enumerable { +export function bigintRange(max: bigint): Sequence +export function bigintRange(min: bigint, max: bigint): Sequence +export function bigintRange(min: bigint, max: bigint, step: bigint): Sequence +export function bigintRange(a: bigint, b?: bigint, c?: bigint): Sequence { if (b === undefined) { b = a; a = 0n; @@ -111,12 +111,12 @@ export function bigintRange(a: bigint, b?: bigint, c?: bigint): Enumerable(value: T, count?: number): Enumerable { +export function repeat(value: T, count?: number): Sequence { if (count == undefined) { - return new RepeatForeverEnumerable(value); + return new RepeatForeverSequence(value); } if (count < 0) { @@ -131,17 +131,17 @@ export function repeat(value: T, count?: number): Enumerable { return new WrappedObject(value); } - return new RepeatEnumerable(value, count); + return new RepeatSequence(value, count); } -export function randomSequence(random?: RandomGenerator): Enumerable { - return new FunctionEnumerable(random ?? mathRandom); +export function randomSequence(random?: RandomGenerator): Sequence { + return new FunctionSequence(random ?? mathRandom); } -export function concat(...enumerables: Enumerable[]): Enumerable { - return new ConcatEnumerable(enumerables); +export function concat(...sequences: Sequence[]): Sequence { + return new ConcatSequence(sequences); } -export function isEnumerable(obj: any): obj is Enumerable { - return obj instanceof EnumerableMarker; +export function isSequence(obj: any): obj is Sequence { + return obj instanceof SequenceMarker; } diff --git a/src/sync/types.ts b/src/sync/types.ts index 8c51162..d09dcac 100644 --- a/src/sync/types.ts +++ b/src/sync/types.ts @@ -2,42 +2,42 @@ import { Collector } from "../collector/types.js"; import { RandomOptions } from "../random/types.js"; import { Predicate, Converter, FilterPredicate, Equater, BiConverter, Accumulator, Comparer, Action } from "../types.js"; -export interface Enumerable extends Iterable { +export interface Sequence extends Iterable { iterator(): Iterator; - apply(pipeline: (enumerable: Enumerable) => TResult): TResult; + apply(pipeline: (sequence: Sequence) => TResult): TResult; count(predicate?: Predicate): number; nonEnumeratedCount(): number; fastCount(): number; maxCount(): number; - select(selector: Converter): Enumerable; - selectMany(selector: Converter>): Enumerable; + select(selector: Converter): Sequence; + selectMany(selector: Converter>): Sequence; - where(predicate: FilterPredicate): Enumerable; - where(predicate: Predicate): Enumerable; + where(predicate: FilterPredicate): Sequence; + where(predicate: Predicate): Sequence; - groupBy(keySelector: Converter, elementSelector?: undefined, keyComparer?: Equater): Enumerable>; - groupBy(keySelector: Converter, elementSelector: Converter, keyComparer?: Equater): Enumerable>; + groupBy(keySelector: Converter, elementSelector?: undefined, keyComparer?: Equater): Sequence>; + groupBy(keySelector: Converter, elementSelector: Converter, keyComparer?: Equater): Sequence>; - join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: undefined, keyComparer?: Equater): Enumerable<[TElement, TOther]>; - join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector: BiConverter, keyComparer?: Equater): Enumerable; + join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: undefined, keyComparer?: Equater): Sequence<[TElement, TOther]>; + join(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector: BiConverter, keyComparer?: Equater): Sequence; - groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: undefined, keyComparer?: Equater): Enumerable>; - groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector: BiConverter, TResult>, keyComparer?: Equater): Enumerable; + groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector?: undefined, keyComparer?: Equater): Sequence>; + groupJoin(iterable: Iterable, firstKeySelector: Converter, secondKeySelector: Converter, resultSelector: BiConverter, TResult>, keyComparer?: Equater): Sequence; contains(obj: TElement, equater?: Equater): boolean; sequenceEquals(iterable: Iterable, equater?: Equater): boolean; - append(obj: TElement): Enumerable; + append(obj: TElement): Sequence; - prepend(obj: TElement): Enumerable; + prepend(obj: TElement): Sequence; - remove(obj: TElement, all?: boolean, equater?: Equater): Enumerable; + remove(obj: TElement, all?: boolean, equater?: Equater): Sequence; - concat(...iterables: Iterable[]): Enumerable; + concat(...iterables: Iterable[]): Sequence; first(predicate?: Predicate): TElement; firstOrDefault(predicate?: Predicate, def?: TElement): TElement | undefined; @@ -61,23 +61,23 @@ export interface Enumerable extends Iterable { max(comparer?: Comparer): TElement; maxBy(selector: Converter, comparer?: Comparer): TElement; - order(comparer?: Comparer): OrderedEnumerable; - orderBy(selector: Converter, comparer?: Comparer): OrderedEnumerable; + order(comparer?: Comparer): OrderedSequence; + orderBy(selector: Converter, comparer?: Comparer): OrderedSequence; - orderDescending(comparer?: Comparer): OrderedEnumerable; - orderByDescending(selector: Converter, comparer?: Comparer): OrderedEnumerable; + orderDescending(comparer?: Comparer): OrderedSequence; + orderByDescending(selector: Converter, comparer?: Comparer): OrderedSequence; - distinct(equater?: Equater): Enumerable; - distinctBy(selector: Converter, equater?: Equater): Enumerable; + distinct(equater?: Equater): Sequence; + distinctBy(selector: Converter, equater?: Equater): Sequence; - union(iterable: Iterable, equater?: Equater): Enumerable; - unionBy(iterable: Iterable, selector: Converter, equater?: Equater): Enumerable; + union(iterable: Iterable, equater?: Equater): Sequence; + unionBy(iterable: Iterable, selector: Converter, equater?: Equater): Sequence; - except(iterable: Iterable, equater?: Equater): Enumerable; - exceptBy(iterable: Iterable, selector: Converter, equater?: Equater): Enumerable; + except(iterable: Iterable, equater?: Equater): Sequence; + exceptBy(iterable: Iterable, selector: Converter, equater?: Equater): Sequence; - intersect(iterable: Iterable, equater?: Equater): Enumerable; - intersectBy(iterable: Iterable, selector: Converter, equater?: Equater): Enumerable; + intersect(iterable: Iterable, equater?: Equater): Sequence; + intersectBy(iterable: Iterable, selector: Converter, equater?: Equater): Sequence; all(predicate: Predicate): boolean; any(predicate: Predicate): boolean; @@ -85,29 +85,29 @@ export interface Enumerable extends Iterable { none(predicate: Predicate): boolean; none(): boolean; - skip(n: number): Enumerable; - skipLast(n: number): Enumerable; - skipWhile(condition: Predicate): Enumerable; + skip(n: number): Sequence; + skipLast(n: number): Sequence; + skipWhile(condition: Predicate): Sequence; - take(n: number): Enumerable; - takeLast(n: number): Enumerable; - takeWhile(condition: Predicate): Enumerable; + take(n: number): Sequence; + takeLast(n: number): Sequence; + takeWhile(condition: Predicate): Sequence; - peek(action: Action): Enumerable; + peek(action: Action): Sequence; forEach(action: Action): void; - zip(iterable: Iterable): Enumerable<[TElement, TOther]>; + zip(iterable: Iterable): Sequence<[TElement, TOther]>; - indexed(): Enumerable<[number, TElement]>; + indexed(): Sequence<[number, TElement]>; - reversed(): Enumerable; + reversed(): Sequence; - chunked(size: number): Enumerable; + chunked(size: number): Sequence; random(options?: RandomOptions): TElement | undefined; - cached(): Enumerable; + cached(): Sequence; asArray(): TElement[]; toArray(): TElement[]; @@ -118,18 +118,18 @@ export interface Enumerable extends Iterable { collect(collector: Collector): TResult; } -export interface GroupedEnumerable extends Enumerable { +export interface GroupedSequence extends Sequence { get key(): TKey; } -export interface OrderedEnumerable extends Enumerable { +export interface OrderedSequence extends Sequence { get comparer(): Comparer | undefined; - thenSelf(comparer?: Comparer): OrderedEnumerable; + thenSelf(comparer?: Comparer): OrderedSequence; - thenBy(selector: Converter, comparer?: Comparer): OrderedEnumerable; + thenBy(selector: Converter, comparer?: Comparer): OrderedSequence; - thenSelfDescending(comparer?: Comparer): OrderedEnumerable; + thenSelfDescending(comparer?: Comparer): OrderedSequence; - thenByDescending(selector: Converter, comparer?: Comparer): OrderedEnumerable; + thenByDescending(selector: Converter, comparer?: Comparer): OrderedSequence; }