1
0

sync local repositories

add booleanish predicates
enable custom inspection
default to sequence of any when sequence type is unknown
This commit is contained in:
2024-08-15 00:40:45 +02:00
parent aedad87c8e
commit 0b03475f66
7 changed files with 543 additions and 196 deletions

View File

@@ -6,7 +6,7 @@ import { getRandomElementAsync } from "../random/index.js";
import { AsyncRandomOptions } from "../random/types.js"; import { AsyncRandomOptions } from "../random/types.js";
import { selectionSorter } from "../sorting.js"; import { selectionSorter } from "../sorting.js";
import { Sequence } from "../sync/types.js"; import { Sequence } from "../sync/types.js";
import { MaybeAsyncConverter, MaybeAsyncPredicate, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybePromiseLike, MaybeAsyncGenerator, MaybeAsyncSequence } from "../types.js"; import { MaybeAsyncAnyPredicate, MaybeAsyncConverter, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybePromiseLike, MaybeAsyncGenerator, MaybeAsyncSequence } from "../types.js";
import { strictEquals, identity, operatorCompare, defaultArrayComparer, combineAsyncComparers, asAsyncIterable } from "../utils.js"; import { strictEquals, identity, operatorCompare, defaultArrayComparer, combineAsyncComparers, asAsyncIterable } from "../utils.js";
import { array, empty, wrap } from "./index.js"; import { array, empty, wrap } from "./index.js";
import { AsyncSequence, GroupedAsyncSequence, OrderedAsyncSequence } from "./types.js"; import { AsyncSequence, GroupedAsyncSequence, OrderedAsyncSequence } from "./types.js";
@@ -25,15 +25,15 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
} }
select<TResult>(converter: MaybeAsyncConverter<TElement, TResult>): AsyncSequence<TResult> { select<TResult>(converter: MaybeAsyncConverter<TElement, TResult>): AsyncSequence<TResult> {
return new MapperAsyncSequence<TElement, TResult>(this, converter); return new SelectAsyncSequence<TElement, TResult>(this, converter);
} }
selectMany<TResult>(converter: MaybeAsyncConverter<TElement, MaybeAsyncSequence<TResult>>): AsyncSequence<TResult> { selectMany<TResult>(converter: MaybeAsyncConverter<TElement, MaybeAsyncSequence<TResult>>): AsyncSequence<TResult> {
return new FlatMapperAsyncSequence<TElement, TResult>(this, converter); return new SelectManyAsyncSequence<TElement, TResult>(this, converter);
} }
where(predicate: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement> { where(predicate: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement> {
return new FilterAsyncSequence<TElement>(this, predicate); return new WhereAsyncSequence<TElement>(this, predicate);
} }
groupBy<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater<TKey> | undefined): AsyncSequence<GroupedAsyncSequence<TKey, TElement>>; groupBy<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater<TKey> | undefined): AsyncSequence<GroupedAsyncSequence<TKey, TElement>>;
@@ -133,7 +133,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return new ConcatAsyncSequence(arr); return new ConcatAsyncSequence(arr);
} }
async count(predicate?: MaybeAsyncPredicate<TElement>) { async count(predicate?: MaybeAsyncAnyPredicate<TElement>) {
let count = 0; let count = 0;
if (predicate) { if (predicate) {
@@ -167,7 +167,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return n >= 0 ? n : Infinity; return n >= 0 ? n : Infinity;
} }
async #tryGetFirst(predicate?: MaybeAsyncPredicate<TElement>) { async #tryGetFirst(predicate?: MaybeAsyncAnyPredicate<TElement>) {
if (predicate) { if (predicate) {
for await (const element of this) { for await (const element of this) {
if (await predicate(element)) { if (await predicate(element)) {
@@ -193,7 +193,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
} as const; } as const;
} }
async first(predicate?: MaybeAsyncPredicate<TElement>) { async first(predicate?: MaybeAsyncAnyPredicate<TElement>) {
const result = await this.#tryGetFirst(predicate); const result = await this.#tryGetFirst(predicate);
if (result.found) { if (result.found) {
@@ -203,13 +203,13 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
throw new Error("No element was found."); throw new Error("No element was found.");
} }
async firstOrDefault(predicate?: MaybeAsyncPredicate<TElement>, def?: TElement) { async firstOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement>, def?: TElement) {
const result = await this.#tryGetFirst(predicate); const result = await this.#tryGetFirst(predicate);
return result.found ? result.element : def; return result.found ? result.element : def;
} }
async #tryGetLast(predicate?: MaybeAsyncPredicate<TElement>) { async #tryGetLast(predicate?: MaybeAsyncAnyPredicate<TElement>) {
let found = false; let found = false;
let result: TElement | undefined = undefined; let result: TElement | undefined = undefined;
@@ -233,7 +233,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
}; };
} }
async last(predicate?: MaybeAsyncPredicate<TElement>) { async last(predicate?: MaybeAsyncAnyPredicate<TElement>) {
const result = await this.#tryGetLast(predicate); const result = await this.#tryGetLast(predicate);
if (result.found) { if (result.found) {
@@ -243,13 +243,13 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
throw new Error("No element was found."); throw new Error("No element was found.");
} }
async lastOrDefault(predicate?: MaybeAsyncPredicate<TElement>, def?: TElement) { async lastOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement>, def?: TElement) {
const result = await this.#tryGetLast(predicate); const result = await this.#tryGetLast(predicate);
return result.found ? result.element : def; return result.found ? result.element : def;
} }
async #tryGetSingle(predicate?: MaybeAsyncPredicate<TElement>) { async #tryGetSingle(predicate?: MaybeAsyncAnyPredicate<TElement>) {
if (predicate) { if (predicate) {
let result: { found: true; element: TElement; } | undefined = undefined; let result: { found: true; element: TElement; } | undefined = undefined;
@@ -297,7 +297,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
} as const; } as const;
} }
async single(predicate?: MaybeAsyncPredicate<TElement>) { async single(predicate?: MaybeAsyncAnyPredicate<TElement>) {
const result = await this.#tryGetSingle(predicate); const result = await this.#tryGetSingle(predicate);
if (result.found == true) { if (result.found == true) {
@@ -318,7 +318,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
throw new Error(reason); throw new Error(reason);
} }
async singleOrDefault(predicate?: MaybeAsyncPredicate<TElement>, def?: TElement) { async singleOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement>, def?: TElement) {
const result = await this.#tryGetSingle(predicate); const result = await this.#tryGetSingle(predicate);
return result.found ? result.element : def; return result.found ? result.element : def;
@@ -391,7 +391,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return acc as unknown as TResult; return acc as unknown as TResult;
} }
async #find<TResult>(sorter: MaybeAsyncPredicate<number>, selector?: MaybeAsyncConverter<TElement, TResult>, comparer?: MaybeAsyncComparer<TResult>) { async #find<TResult>(sorter: MaybeAsyncAnyPredicate<number>, selector?: MaybeAsyncConverter<TElement, TResult>, comparer?: MaybeAsyncComparer<TResult>) {
const iterator = this.iterator(); const iterator = this.iterator();
let next = await iterator.next(); let next = await iterator.next();
@@ -462,11 +462,11 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return new OrderByAsyncSequence<TElement, TBy>(this, true, selector, comparer); return new OrderByAsyncSequence<TElement, TBy>(this, true, selector, comparer);
} }
partition(equater?: MaybeAsyncEquater<TElement>): AsyncSequence<TElement[]> { partition(equater?: MaybeAsyncEquater<TElement>): AsyncSequence<AsyncSequence<TElement>> {
return new PartitionAsyncSequence<TElement>(this, equater); return new PartitionAsyncSequence<TElement>(this, equater);
} }
partitionBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<TElement[]> { partitionBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<AsyncSequence<TElement>> {
return new PartitionByAsyncSequence<TElement, TBy>(this, selector, equater); return new PartitionByAsyncSequence<TElement, TBy>(this, selector, equater);
} }
@@ -502,7 +502,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return new IntersectByAsyncSequence<TElement, TBy>(this, wrap(sequence), selector); return new IntersectByAsyncSequence<TElement, TBy>(this, wrap(sequence), selector);
} }
async all(predicate: MaybeAsyncPredicate<TElement>) { async all(predicate: MaybeAsyncAnyPredicate<TElement>) {
const n = await this.nonEnumeratedCount(); const n = await this.nonEnumeratedCount();
if (n === 0) { if (n === 0) {
@@ -518,7 +518,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return true; return true;
} }
async any(predicate?: MaybeAsyncPredicate<TElement>) { async any(predicate?: MaybeAsyncAnyPredicate<TElement>) {
const n = await this.nonEnumeratedCount(); const n = await this.nonEnumeratedCount();
if (n === 0) { if (n === 0) {
@@ -538,7 +538,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return n < 0 ? !(await this.iterator().next()).done : n > 0; return n < 0 ? !(await this.iterator().next()).done : n > 0;
} }
async none(predicate?: MaybeAsyncPredicate<TElement>) { async none(predicate?: MaybeAsyncAnyPredicate<TElement>) {
const n = await this.nonEnumeratedCount(); const n = await this.nonEnumeratedCount();
if (n === 0) { if (n === 0) {
@@ -574,7 +574,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return n === 0 ? this : new SkipLastAsyncSequence<TElement>(this, n); return n === 0 ? this : new SkipLastAsyncSequence<TElement>(this, n);
} }
skipWhile(predicate: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement> { skipWhile(predicate: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement> {
return new SkipWhileAsyncSequence<TElement>(this, predicate); return new SkipWhileAsyncSequence<TElement>(this, predicate);
} }
@@ -594,7 +594,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return n === 0 ? empty<TElement>() : new TakeLastAsyncSequence<TElement>(this, n); return n === 0 ? empty<TElement>() : new TakeLastAsyncSequence<TElement>(this, n);
} }
takeWhile(predicate: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement> { takeWhile(predicate: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement> {
return new TakeWhileAsyncSequence<TElement>(this, predicate); return new TakeWhileAsyncSequence<TElement>(this, predicate);
} }
@@ -612,7 +612,7 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return new ZippedAsyncSequence<TElement, TOther>(this, wrap(sequence)); return new ZippedAsyncSequence<TElement, TOther>(this, wrap(sequence));
} }
indexex(): AsyncSequence<[number, TElement]> { indexed(): AsyncSequence<[number, TElement]> {
return new IndexedAsyncSequence<TElement>(this); return new IndexedAsyncSequence<TElement>(this);
} }
@@ -620,12 +620,15 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return new ReversedAsyncSequence<TElement>(this); return new ReversedAsyncSequence<TElement>(this);
} }
chunked(size: number): AsyncSequence<AsyncSequence<TElement>> { chunked(size: number, asArray?: false): AsyncSequence<AsyncSequence<TElement>>;
chunked(size: number, asArray: true): AsyncSequence<TElement[]>;
chunked(size: number, asArray?: boolean): AsyncSequence<AsyncSequence<TElement>> | AsyncSequence<TElement[]> {
if (size <= 0) { if (size <= 0) {
throw new Error("Chunk size must be positive."); throw new Error("Chunk size must be positive.");
} }
return new ChunkedAsyncSequence<TElement>(this, size); const sequence = new ChunkedAsyncSequence<TElement>(this, size);
return asArray ? sequence : sequence.select(array);
} }
async random(options?: AsyncRandomOptions<TElement> | undefined): Promise<TElement | undefined> { async random(options?: AsyncRandomOptions<TElement> | undefined): Promise<TElement | undefined> {
@@ -636,6 +639,10 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return new CacheAsyncSequence<TElement>(this); return new CacheAsyncSequence<TElement>(this);
} }
async asArray(): Promise<TElement[]> {
return await this.toArray();
}
async toArray() { async toArray() {
const array: TElement[] = []; const array: TElement[] = [];
@@ -646,8 +653,12 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return array; return array;
} }
async toMap<TKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>) { toMap<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>): Promise<Map<TKey, TElement>>;
const map = new Map<TKey, TValue>(); toMap<TKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Map<TKey, TValue>>;
async toMap<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector?: MaybeAsyncConverter<TElement, any>): Promise<Map<TKey, any>> {
valueSelector ??= identity;
const map = new Map<TKey, any>();
for await (const element of this) { for await (const element of this) {
const key = await keySelector(element); const key = await keySelector(element);
@@ -669,8 +680,12 @@ export abstract class BaseAsyncSequence<TElement> extends AsyncSequenceMarker im
return set; return set;
} }
async toObject<TValue>(keySelector: MaybeAsyncConverter<TElement, PropertyKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>) { toObject<TKey extends PropertyKey>(keySelector: MaybeAsyncConverter<TElement, TKey>): Promise<Record<TKey, TElement>>;
const obj: Record<PropertyKey, TValue> = {}; toObject<TKey extends PropertyKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Record<TKey, TValue>>;
async toObject<TKey extends PropertyKey>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector?: MaybeAsyncConverter<TElement, any>): Promise<Record<TKey, any>> {
valueSelector ??= identity;
const obj: Record<PropertyKey, any> = {};
for await (const element of this) { for await (const element of this) {
const key = await keySelector(element); const key = await keySelector(element);
@@ -722,7 +737,7 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.apply(pipeline); return this.#sequence.apply(pipeline);
} }
count(predicate?: MaybeAsyncPredicate<TElement> | undefined): Promise<number> { count(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined): Promise<number> {
return this.#sequence.count(predicate); return this.#sequence.count(predicate);
} }
@@ -746,7 +761,7 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.selectMany(selector); return this.#sequence.selectMany(selector);
} }
where(predicate: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement> { where(predicate: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement> {
return this.#sequence.where(predicate); return this.#sequence.where(predicate);
} }
@@ -792,27 +807,27 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.concat(...sequences); return this.#sequence.concat(...sequences);
} }
first(predicate?: MaybeAsyncPredicate<TElement> | undefined): Promise<TElement> { first(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined): Promise<TElement> {
return this.#sequence.first(predicate); return this.#sequence.first(predicate);
} }
firstOrDefault(predicate?: MaybeAsyncPredicate<TElement> | undefined, def?: TElement | undefined): Promise<TElement | undefined> { firstOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined, def?: TElement | undefined): Promise<TElement | undefined> {
return this.#sequence.firstOrDefault(predicate, def); return this.#sequence.firstOrDefault(predicate, def);
} }
last(predicate?: MaybeAsyncPredicate<TElement> | undefined): Promise<TElement> { last(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined): Promise<TElement> {
return this.#sequence.last(predicate); return this.#sequence.last(predicate);
} }
lastOrDefault(predicate?: MaybeAsyncPredicate<TElement> | undefined, def?: TElement | undefined): Promise<TElement | undefined> { lastOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined, def?: TElement | undefined): Promise<TElement | undefined> {
return this.#sequence.lastOrDefault(predicate, def); return this.#sequence.lastOrDefault(predicate, def);
} }
single(predicate?: MaybeAsyncPredicate<TElement> | undefined): Promise<TElement> { single(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined): Promise<TElement> {
return this.#sequence.single(predicate); return this.#sequence.single(predicate);
} }
singleOrDefault(predicate?: MaybeAsyncPredicate<TElement> | undefined, def?: TElement | undefined): Promise<TElement | undefined> { singleOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement> | undefined, def?: TElement | undefined): Promise<TElement | undefined> {
return this.#sequence.singleOrDefault(predicate, def); return this.#sequence.singleOrDefault(predicate, def);
} }
@@ -863,11 +878,11 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.orderByDescending(selector, comparer); return this.#sequence.orderByDescending(selector, comparer);
} }
partition(equater?: MaybeAsyncEquater<TElement> | undefined): AsyncSequence<TElement[]> { partition(equater?: MaybeAsyncEquater<TElement> | undefined): AsyncSequence<AsyncSequence<TElement>> {
return this.#sequence.partition(equater); return this.#sequence.partition(equater);
} }
partitionBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy> | undefined): AsyncSequence<TElement[]> { partitionBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy> | undefined): AsyncSequence<AsyncSequence<TElement>> {
return this.#sequence.partitionBy(selector, equater); return this.#sequence.partitionBy(selector, equater);
} }
@@ -903,17 +918,17 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.intersectBy(wrap(sequence), selector, equater); return this.#sequence.intersectBy(wrap(sequence), selector, equater);
} }
all(predicate: MaybeAsyncPredicate<TElement>): Promise<boolean> { all(predicate: MaybeAsyncAnyPredicate<TElement>): Promise<boolean> {
return this.#sequence.all(predicate); return this.#sequence.all(predicate);
} }
any(predicate: MaybeAsyncPredicate<TElement>): Promise<boolean>; any(predicate: MaybeAsyncAnyPredicate<TElement>): Promise<boolean>;
any(): Promise<boolean>; any(): Promise<boolean>;
any(predicate?: any) { any(predicate?: any) {
return this.#sequence.any(predicate); return this.#sequence.any(predicate);
} }
none(predicate: MaybeAsyncPredicate<TElement>): Promise<boolean>; none(predicate: MaybeAsyncAnyPredicate<TElement>): Promise<boolean>;
none(): Promise<boolean>; none(): Promise<boolean>;
none(predicate?: any) { none(predicate?: any) {
return this.#sequence.none(predicate); return this.#sequence.none(predicate);
@@ -927,7 +942,7 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.skipLast(n); return this.#sequence.skipLast(n);
} }
skipWhile(condition: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement> { skipWhile(condition: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement> {
return this.#sequence.skipWhile(condition); return this.#sequence.skipWhile(condition);
} }
@@ -939,7 +954,7 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.takeLast(n); return this.#sequence.takeLast(n);
} }
takeWhile(condition: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement> { takeWhile(condition: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement> {
return this.#sequence.takeWhile(condition); return this.#sequence.takeWhile(condition);
} }
@@ -955,16 +970,18 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.zip(wrap(sequence)); return this.#sequence.zip(wrap(sequence));
} }
indexex(): AsyncSequence<[number, TElement]> { indexed(): AsyncSequence<[number, TElement]> {
return this.#sequence.indexex(); return this.#sequence.indexed();
} }
reversed(): AsyncSequence<TElement> { reversed(): AsyncSequence<TElement> {
return this.#sequence.reversed(); return this.#sequence.reversed();
} }
chunked(size: number): AsyncSequence<AsyncSequence<TElement>> { chunked(size: number, asArray?: false): AsyncSequence<AsyncSequence<TElement>>;
return this.#sequence.chunked(size); chunked(size: number, asArray: true): AsyncSequence<TElement[]>;
chunked(size: number, asArray?: any): AsyncSequence<AsyncSequence<TElement>> | AsyncSequence<TElement[]> {
return this.#sequence.chunked(size, asArray);
} }
random(options?: AsyncRandomOptions<TElement> | undefined): Promise<TElement | undefined> { random(options?: AsyncRandomOptions<TElement> | undefined): Promise<TElement | undefined> {
@@ -975,11 +992,17 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.cached(); return this.#sequence.cached();
} }
asArray(): Promise<TElement[]> {
return this.#sequence.asArray();
}
toArray(): Promise<TElement[]> { toArray(): Promise<TElement[]> {
return this.#sequence.toArray(); return this.#sequence.toArray();
} }
toMap<TKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Map<TKey, TValue>> { toMap<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>): Promise<Map<TKey, TElement>>;
toMap<TKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Map<TKey, TValue>>;
toMap(keySelector: any, valueSelector?: any) {
return this.#sequence.toMap(keySelector, valueSelector); return this.#sequence.toMap(keySelector, valueSelector);
} }
@@ -987,7 +1010,9 @@ export class DelegatedAsyncSequence<TElement> extends AsyncSequenceMarker implem
return this.#sequence.toSet(); return this.#sequence.toSet();
} }
toObject<TKey extends PropertyKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Record<TKey, TValue>> { toObject<TKey extends PropertyKey>(keySelector: MaybeAsyncConverter<TElement, TKey>): Promise<Record<TKey, TElement>>;
toObject<TKey extends PropertyKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Record<TKey, TValue>>;
toObject(keySelector: any, valueSelector?: any) {
return this.#sequence.toObject(keySelector, valueSelector); return this.#sequence.toObject(keySelector, valueSelector);
} }
@@ -1352,11 +1377,11 @@ class DistinctByAsyncSequence<T, U> extends BaseAsyncSequence<T> {
} }
} }
class FilterAsyncSequence<T> extends BaseAsyncSequence<T> { class WhereAsyncSequence<T> extends BaseAsyncSequence<T> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #predicate: MaybeAsyncPredicate<T>; readonly #predicate: MaybeAsyncAnyPredicate<T>;
constructor(sequence: AsyncSequence<T>, predicate: MaybeAsyncPredicate<T>) { constructor(sequence: AsyncSequence<T>, predicate: MaybeAsyncAnyPredicate<T>) {
super(); super();
this.#sequence = sequence; this.#sequence = sequence;
@@ -1372,7 +1397,7 @@ class FilterAsyncSequence<T> extends BaseAsyncSequence<T> {
} }
} }
class FlatMapperAsyncSequence<T, U> extends BaseAsyncSequence<U> { class SelectManyAsyncSequence<T, U> extends BaseAsyncSequence<U> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #converter: MaybeAsyncConverter<T, MaybeAsyncSequence<U>>; readonly #converter: MaybeAsyncConverter<T, MaybeAsyncSequence<U>>;
@@ -1408,7 +1433,7 @@ class IndexedAsyncSequence<T> extends BaseAsyncSequence<[number, T]> {
} }
} }
class MapperAsyncSequence<T, U> extends BaseAsyncSequence<U> { class SelectAsyncSequence<T, U> extends BaseAsyncSequence<U> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #converter: MaybeAsyncConverter<T, U>; readonly #converter: MaybeAsyncConverter<T, U>;
@@ -1432,9 +1457,9 @@ class MapperAsyncSequence<T, U> extends BaseAsyncSequence<U> {
class SkipWhileAsyncSequence<T> extends BaseAsyncSequence<T> { class SkipWhileAsyncSequence<T> extends BaseAsyncSequence<T> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #predicate: MaybeAsyncPredicate<T>; readonly #predicate: MaybeAsyncAnyPredicate<T>;
constructor(sequence: AsyncSequence<T>, predicate: MaybeAsyncPredicate<T>) { constructor(sequence: AsyncSequence<T>, predicate: MaybeAsyncAnyPredicate<T>) {
super(); super();
this.#sequence = sequence; this.#sequence = sequence;
@@ -1538,9 +1563,9 @@ class SkipAsyncSequence<T> extends BaseAsyncSequence<T> {
class TakeWhileAsyncSequence<T> extends BaseAsyncSequence<T> { class TakeWhileAsyncSequence<T> extends BaseAsyncSequence<T> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #predicate: MaybeAsyncPredicate<T>; readonly #predicate: MaybeAsyncAnyPredicate<T>;
constructor(sequence: AsyncSequence<T>, predicate: MaybeAsyncPredicate<T>) { constructor(sequence: AsyncSequence<T>, predicate: MaybeAsyncAnyPredicate<T>) {
super(); super();
this.#sequence = sequence; this.#sequence = sequence;
@@ -1998,7 +2023,7 @@ class GroupByAsyncSequence<TElement, TKey, TResult> extends BaseAsyncSequence<Gr
} }
} }
class ChunkedAsyncSequence<T> extends BaseAsyncSequence<AsyncSequence<T>> { class ChunkedAsyncSequence<T> extends BaseAsyncSequence<T[]> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #size: number; readonly #size: number;
@@ -2021,13 +2046,13 @@ class ChunkedAsyncSequence<T> extends BaseAsyncSequence<AsyncSequence<T>> {
chunk.push(obj); chunk.push(obj);
if (chunk.length === this.#size) { if (chunk.length === this.#size) {
yield array(chunk); yield chunk;
chunk = []; chunk = [];
} }
} }
if (chunk.length > 0) { if (chunk.length > 0) {
yield array(chunk); yield chunk;
} }
} }
} }
@@ -2158,7 +2183,7 @@ class CacheAsyncSequence<T> extends BaseAsyncSequence<T> {
} }
} }
class PartitionAsyncSequence<T> extends BaseAsyncSequence<T[]> { class PartitionAsyncSequence<T> extends BaseAsyncSequence<AsyncSequence<T>> {
readonly #sequence: AsyncSequence<T>; readonly #sequence: AsyncSequence<T>;
readonly #equater: MaybeAsyncEquater<T>; readonly #equater: MaybeAsyncEquater<T>;
@@ -2182,11 +2207,13 @@ class PartitionAsyncSequence<T> extends BaseAsyncSequence<T[]> {
} }
} }
yield* partitions.values(); for (const partition of partitions.values()) {
yield array(partition);
}
} }
} }
class PartitionByAsyncSequence<TElement, TBy> extends BaseAsyncSequence<TElement[]> { class PartitionByAsyncSequence<TElement, TBy> extends BaseAsyncSequence<AsyncSequence<TElement>> {
readonly #sequence: AsyncSequence<TElement>; readonly #sequence: AsyncSequence<TElement>;
readonly #selector: MaybeAsyncConverter<TElement, TBy>; readonly #selector: MaybeAsyncConverter<TElement, TBy>;
readonly #equater: MaybeAsyncEquater<TBy>; readonly #equater: MaybeAsyncEquater<TBy>;
@@ -2213,6 +2240,8 @@ class PartitionByAsyncSequence<TElement, TBy> extends BaseAsyncSequence<TElement
} }
} }
yield* partitions.values(); for (const partition of partitions.values()) {
yield array(partition);
}
} }
} }

View File

@@ -2,7 +2,7 @@ import { wrap as wrapSync } from "../sync/index.js";
import { Sequence } from "../sync/types.js"; import { Sequence } from "../sync/types.js";
import { MaybeAsyncGenerator, MaybeAsyncIterable, MaybePromiseLike } from "../types.js"; import { MaybeAsyncGenerator, MaybeAsyncIterable, MaybePromiseLike } from "../types.js";
import { isAsyncIterable } from "../utils.js"; import { isAsyncIterable } from "../utils.js";
import { WrappedSequence, WrappedAsyncIterable, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncSequence, GeneratorAsyncSequence, RangeAsyncSequence, RepeatForeverAsyncSequence, RepeatAsyncSequence, AsyncSequenceMarker, EMPTY } from "./impl.js"; import { WrappedSequence, WrappedAsyncIterable, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncSequence, GeneratorAsyncSequence, RangeAsyncSequence, RepeatForeverAsyncSequence, RepeatAsyncSequence, AsyncSequenceMarker, EMPTY, ConcatAsyncSequence } from "./impl.js";
import { AsyncSequence } from "./types.js"; import { AsyncSequence } from "./types.js";
export function asAsync<T>(sequence: Sequence<MaybePromiseLike<T>>): AsyncSequence<T> { export function asAsync<T>(sequence: Sequence<MaybePromiseLike<T>>): AsyncSequence<T> {
@@ -52,6 +52,10 @@ export function of<T>(...elements: MaybePromiseLike<T>[]): AsyncSequence<T> {
} }
} }
export function concat<T>(...sequences: AsyncSequence<T>[]): AsyncSequence<T> {
return new ConcatAsyncSequence<T>(sequences);
}
export function func<T>(f: () => MaybePromiseLike<T>): AsyncSequence<T> { export function func<T>(f: () => MaybePromiseLike<T>): AsyncSequence<T> {
return new FunctionAsyncSequence(f); return new FunctionAsyncSequence(f);
} }

View File

@@ -1,13 +1,13 @@
import { Collector } from "../collector/types.js"; import { Collector } from "../collector/types.js";
import { AsyncRandomOptions } from "../random/types.js"; import { AsyncRandomOptions } from "../random/types.js";
import { MaybeAsyncPredicate, MaybeAsyncConverter, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybeAsyncSequence } from "../types.js"; import { MaybeAsyncAnyPredicate, MaybeAsyncConverter, MaybeAsyncEquater, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncComparer, MaybeAsyncAction, MaybeAsyncSequence } from "../types.js";
export interface AsyncSequence<TElement> extends AsyncIterable<TElement> { export interface AsyncSequence<TElement> extends AsyncIterable<TElement> {
iterator(): AsyncIterator<TElement>; iterator(): AsyncIterator<TElement>;
apply<TResult>(pipeline: (sequence: AsyncSequence<TElement>) => TResult): TResult; apply<TResult>(pipeline: (sequence: AsyncSequence<TElement>) => TResult): TResult;
count(predicate?: MaybeAsyncPredicate<TElement>): Promise<number>; count(predicate?: MaybeAsyncAnyPredicate<TElement>): Promise<number>;
nonEnumeratedCount(): Promise<number>; nonEnumeratedCount(): Promise<number>;
fastCount(): Promise<number>; fastCount(): Promise<number>;
maxCount(): Promise<number>; maxCount(): Promise<number>;
@@ -15,7 +15,7 @@ export interface AsyncSequence<TElement> extends AsyncIterable<TElement> {
select<TResult>(selector: MaybeAsyncConverter<TElement, TResult>): AsyncSequence<TResult>; select<TResult>(selector: MaybeAsyncConverter<TElement, TResult>): AsyncSequence<TResult>;
selectMany<TResult>(selector: MaybeAsyncConverter<TElement, MaybeAsyncSequence<TResult>>): AsyncSequence<TResult>; selectMany<TResult>(selector: MaybeAsyncConverter<TElement, MaybeAsyncSequence<TResult>>): AsyncSequence<TResult>;
where(predicate: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement>; where(predicate: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement>;
groupBy<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater<TKey>): AsyncSequence<GroupedAsyncSequence<TKey, TElement>>; groupBy<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>, elementSelector?: undefined, keyComparer?: MaybeAsyncEquater<TKey>): AsyncSequence<GroupedAsyncSequence<TKey, TElement>>;
groupBy<TKey, TResult>(keySelector: MaybeAsyncConverter<TElement, TKey>, elementSelector: MaybeAsyncConverter<TElement, TResult>, keyComparer?: MaybeAsyncEquater<TKey>): AsyncSequence<GroupedAsyncSequence<TKey, TResult>>; groupBy<TKey, TResult>(keySelector: MaybeAsyncConverter<TElement, TKey>, elementSelector: MaybeAsyncConverter<TElement, TResult>, keyComparer?: MaybeAsyncEquater<TKey>): AsyncSequence<GroupedAsyncSequence<TKey, TResult>>;
@@ -38,14 +38,14 @@ export interface AsyncSequence<TElement> extends AsyncIterable<TElement> {
concat(...sequences: MaybeAsyncSequence<TElement>[]): AsyncSequence<TElement>; concat(...sequences: MaybeAsyncSequence<TElement>[]): AsyncSequence<TElement>;
first(predicate?: MaybeAsyncPredicate<TElement>): Promise<TElement>; first(predicate?: MaybeAsyncAnyPredicate<TElement>): Promise<TElement>;
firstOrDefault(predicate?: MaybeAsyncPredicate<TElement>, def?: TElement): Promise<TElement | undefined>; firstOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement>, def?: TElement): Promise<TElement | undefined>;
last(predicate?: MaybeAsyncPredicate<TElement>): Promise<TElement>; last(predicate?: MaybeAsyncAnyPredicate<TElement>): Promise<TElement>;
lastOrDefault(predicate?: MaybeAsyncPredicate<TElement>, def?: TElement): Promise<TElement | undefined>; lastOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement>, def?: TElement): Promise<TElement | undefined>;
single(predicate?: MaybeAsyncPredicate<TElement>): Promise<TElement>; single(predicate?: MaybeAsyncAnyPredicate<TElement>): Promise<TElement>;
singleOrDefault(predicate?: MaybeAsyncPredicate<TElement>, def?: TElement): Promise<TElement | undefined>; singleOrDefault(predicate?: MaybeAsyncAnyPredicate<TElement>, def?: TElement): Promise<TElement | undefined>;
elementAt(index: number): Promise<TElement>; elementAt(index: number): Promise<TElement>;
elementAtOrDefault(index: number, def?: TElement): Promise<TElement | undefined>; elementAtOrDefault(index: number, def?: TElement): Promise<TElement | undefined>;
@@ -66,8 +66,8 @@ export interface AsyncSequence<TElement> extends AsyncIterable<TElement> {
orderDescending(comparer?: MaybeAsyncComparer<TElement>): AsyncSequence<TElement>; orderDescending(comparer?: MaybeAsyncComparer<TElement>): AsyncSequence<TElement>;
orderByDescending<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, comparer?: MaybeAsyncComparer<TBy>): AsyncSequence<TElement>; orderByDescending<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, comparer?: MaybeAsyncComparer<TBy>): AsyncSequence<TElement>;
partition(equater?: MaybeAsyncEquater<TElement>): AsyncSequence<TElement[]>; partition(equater?: MaybeAsyncEquater<TElement>): AsyncSequence<AsyncSequence<TElement>>;
partitionBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<TElement[]>; partitionBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<AsyncSequence<TElement>>;
distinct(equater?: MaybeAsyncEquater<TElement>): AsyncSequence<TElement>; distinct(equater?: MaybeAsyncEquater<TElement>): AsyncSequence<TElement>;
distinctBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<TElement>; distinctBy<TBy>(selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<TElement>;
@@ -81,19 +81,19 @@ export interface AsyncSequence<TElement> extends AsyncIterable<TElement> {
intersect(sequence: MaybeAsyncSequence<TElement>, equater?: MaybeAsyncEquater<TElement>): AsyncSequence<TElement>; intersect(sequence: MaybeAsyncSequence<TElement>, equater?: MaybeAsyncEquater<TElement>): AsyncSequence<TElement>;
intersectBy<TBy>(sequence: MaybeAsyncSequence<TElement>, selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<TElement>; intersectBy<TBy>(sequence: MaybeAsyncSequence<TElement>, selector: MaybeAsyncConverter<TElement, TBy>, equater?: MaybeAsyncEquater<TBy>): AsyncSequence<TElement>;
all(predicate: MaybeAsyncPredicate<TElement>): Promise<boolean>; all(predicate: MaybeAsyncAnyPredicate<TElement>): Promise<boolean>;
any(predicate: MaybeAsyncPredicate<TElement>): Promise<boolean>; any(predicate: MaybeAsyncAnyPredicate<TElement>): Promise<boolean>;
any(): Promise<boolean>; any(): Promise<boolean>;
none(predicate: MaybeAsyncPredicate<TElement>): Promise<boolean>; none(predicate: MaybeAsyncAnyPredicate<TElement>): Promise<boolean>;
none(): Promise<boolean>; none(): Promise<boolean>;
skip(n: number): AsyncSequence<TElement>; skip(n: number): AsyncSequence<TElement>;
skipLast(n: number): AsyncSequence<TElement>; skipLast(n: number): AsyncSequence<TElement>;
skipWhile(condition: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement>; skipWhile(condition: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement>;
take(n: number): AsyncSequence<TElement>; take(n: number): AsyncSequence<TElement>;
takeLast(n: number): AsyncSequence<TElement>; takeLast(n: number): AsyncSequence<TElement>;
takeWhile(condition: MaybeAsyncPredicate<TElement>): AsyncSequence<TElement>; takeWhile(condition: MaybeAsyncAnyPredicate<TElement>): AsyncSequence<TElement>;
peek(action: MaybeAsyncAction<TElement>): AsyncSequence<TElement>; peek(action: MaybeAsyncAction<TElement>): AsyncSequence<TElement>;
@@ -101,19 +101,24 @@ export interface AsyncSequence<TElement> extends AsyncIterable<TElement> {
zip<TOther>(sequence: MaybeAsyncSequence<TOther>): AsyncSequence<[TElement, TOther]>; zip<TOther>(sequence: MaybeAsyncSequence<TOther>): AsyncSequence<[TElement, TOther]>;
indexex(): AsyncSequence<[number, TElement]>; indexed(): AsyncSequence<[number, TElement]>;
reversed(): AsyncSequence<TElement>; reversed(): AsyncSequence<TElement>;
chunked(size: number): AsyncSequence<AsyncSequence<TElement>>; chunked(size: number, asArray?: false): AsyncSequence<AsyncSequence<TElement>>;
chunked(size: number, asArray: true): AsyncSequence<TElement[]>;
random(options?: AsyncRandomOptions<TElement>): Promise<TElement | undefined>; random(options?: AsyncRandomOptions<TElement>): Promise<TElement | undefined>;
cached(): AsyncSequence<TElement>; cached(): AsyncSequence<TElement>;
asArray(): Promise<TElement[]>;
toArray(): Promise<TElement[]>; toArray(): Promise<TElement[]>;
toMap<TKey>(keySelector: MaybeAsyncConverter<TElement, TKey>): Promise<Map<TKey, TElement>>;
toMap<TKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Map<TKey, TValue>>; toMap<TKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Map<TKey, TValue>>;
toSet(): Promise<Set<TElement>>; toSet(): Promise<Set<TElement>>;
toObject<TKey extends PropertyKey>(keySelector: MaybeAsyncConverter<TElement, TKey>): Promise<Record<TKey, TElement>>;
toObject<TKey extends PropertyKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Record<TKey, TValue>>; toObject<TKey extends PropertyKey, TValue>(keySelector: MaybeAsyncConverter<TElement, TKey>, valueSelector: MaybeAsyncConverter<TElement, TValue>): Promise<Record<TKey, TValue>>;
collect<TResult>(collector: Collector<TElement, any, TResult>): Promise<TResult>; collect<TResult>(collector: Collector<TElement, any, TResult>): Promise<TResult>;

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
import { mathRandom } from "../random/index.js"; import { mathRandom } from "../random/index.js";
import { RandomGenerator } from "../random/types.js"; import { RandomGenerator } from "../random/types.js";
import { BigIntRangeSequence, ConcatSequence, SequenceMarker, FunctionSequence, GeneratorSequence, RangeSequence, RepeatSequence, RepeatForeverSequence, WrappedArray, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet, EMPTY } from "./impl.js"; import { BigIntRangeSequence, ConcatSequence, SequenceMarker, FunctionSequence, GeneratorSequence, RangeSequence, RepeatSequence, RepeatForeverSequence, WrappedArrayLike, WrappedIterable, WrappedMap, WrappedObject, WrappedSet, WrappedReadonlyArray, EMPTY } from "./impl.js";
import { Sequence } from "./types.js"; import { Sequence } from "./types.js";
export function wrap<T>(iterable: Iterable<T>): Sequence<T> { export function wrap<T = any>(iterable: Iterable<T>): Sequence<T> {
if (isSequence<T>(iterable)) { if (isSequence<T>(iterable)) {
return iterable; return iterable;
} }
@@ -23,11 +23,11 @@ export function wrap<T>(iterable: Iterable<T>): Sequence<T> {
return sequence(iterable); return sequence(iterable);
} }
export function sequence<T>(iterable: Iterable<T>): Sequence<T> { export function sequence<T = any>(iterable: Iterable<T>): Sequence<T> {
return new WrappedIterable(iterable); return new WrappedIterable(iterable);
} }
export function empty<T>(): Sequence<T> { export function empty<T = any>(): Sequence<T> {
return EMPTY; return EMPTY;
} }
@@ -35,19 +35,19 @@ export function single<T>(obj: T): Sequence<T> {
return new WrappedObject(obj); return new WrappedObject(obj);
} }
export function array<T>(array: T[]): Sequence<T> { export function array<T = any>(array: ReadonlyArray<T>): Sequence<T> {
return new WrappedArray(array); return new WrappedReadonlyArray(array);
} }
export function arrayLike<T>(arrayLike: ArrayLike<T>): Sequence<T> { export function arrayLike<T = any>(arrayLike: ArrayLike<T>): Sequence<T> {
return new WrappedArrayLike(arrayLike); return new WrappedArrayLike(arrayLike);
} }
export function set<T>(set: Set<T>): Sequence<T> { export function set<T>(set: ReadonlySet<T>): Sequence<T> {
return new WrappedSet(set); return new WrappedSet(set);
} }
export function map<K, V>(map: Map<K, V>): Sequence<[K, V]> { export function map<K, V>(map: ReadonlyMap<K, V>): Sequence<[K, V]> {
return new WrappedMap(map); return new WrappedMap(map);
} }

View File

@@ -1,14 +1,18 @@
import { AsyncSequence } from "../async/types.js"; import { AsyncSequence } from "../async/types.js";
import { Collector } from "../collector/types.js"; import { Collector } from "../collector/types.js";
import { RandomOptions } from "../random/types.js"; import { RandomOptions } from "../random/types.js";
import { Predicate, Converter, FilterPredicate, Equater, BiConverter, Accumulator, Comparer, Action } from "../types.js"; import { AnyPredicate, Converter, FilterPredicate, Equater, BiConverter, Accumulator, Comparer, Action } from "../types.js";
export type SequencePipeline<TElement, TResult> = (sequence: Sequence<TElement>) => TResult;
export interface Sequence<TElement> extends Iterable<TElement> { export interface Sequence<TElement> extends Iterable<TElement> {
iterator(): Iterator<TElement>; iterator(): Iterator<TElement>;
apply<TResult>(pipeline: (sequence: Sequence<TElement>) => TResult): TResult; toJSON(): any;
count(predicate?: Predicate<TElement>): number; apply<TResult>(pipeline: SequencePipeline<TElement, TResult>): TResult;
count(predicate?: AnyPredicate<TElement>): number;
nonEnumeratedCount(): number; nonEnumeratedCount(): number;
fastCount(): number; fastCount(): number;
maxCount(): number; maxCount(): number;
@@ -17,7 +21,7 @@ export interface Sequence<TElement> extends Iterable<TElement> {
selectMany<TResult>(selector: Converter<TElement, Sequence<TResult>>): Sequence<TResult>; selectMany<TResult>(selector: Converter<TElement, Sequence<TResult>>): Sequence<TResult>;
where<TFiltered extends TElement>(predicate: FilterPredicate<TElement, TFiltered>): Sequence<TFiltered>; where<TFiltered extends TElement>(predicate: FilterPredicate<TElement, TFiltered>): Sequence<TFiltered>;
where(predicate: Predicate<TElement>): Sequence<TElement>; where(predicate: AnyPredicate<TElement>): Sequence<TElement>;
groupBy<TKey>(keySelector: Converter<TElement, TKey>, elementSelector?: undefined, keyComparer?: Equater<TKey>): Sequence<GroupedSequence<TKey, TElement>>; groupBy<TKey>(keySelector: Converter<TElement, TKey>, elementSelector?: undefined, keyComparer?: Equater<TKey>): Sequence<GroupedSequence<TKey, TElement>>;
groupBy<TKey, TResult>(keySelector: Converter<TElement, TKey>, elementSelector: Converter<TElement, TResult>, keyComparer?: Equater<TKey>): Sequence<GroupedSequence<TKey, TResult>>; groupBy<TKey, TResult>(keySelector: Converter<TElement, TKey>, elementSelector: Converter<TElement, TResult>, keyComparer?: Equater<TKey>): Sequence<GroupedSequence<TKey, TResult>>;
@@ -40,14 +44,14 @@ export interface Sequence<TElement> extends Iterable<TElement> {
concat(...sequences: Sequence<TElement>[]): Sequence<TElement>; concat(...sequences: Sequence<TElement>[]): Sequence<TElement>;
first(predicate?: Predicate<TElement>): TElement; first(predicate?: AnyPredicate<TElement>): TElement;
firstOrDefault(predicate?: Predicate<TElement>, def?: TElement): TElement | undefined; firstOrDefault(predicate?: AnyPredicate<TElement>, def?: TElement): TElement | undefined;
last(predicate?: Predicate<TElement>): TElement; last(predicate?: AnyPredicate<TElement>): TElement;
lastOrDefault(predicate?: Predicate<TElement>, def?: TElement): TElement | undefined; lastOrDefault(predicate?: AnyPredicate<TElement>, def?: TElement): TElement | undefined;
single(predicate?: Predicate<TElement>): TElement; single(predicate?: AnyPredicate<TElement>): TElement;
singleOrDefault(predicate?: Predicate<TElement>, def?: TElement): TElement | undefined; singleOrDefault(predicate?: AnyPredicate<TElement>, def?: TElement): TElement | undefined;
elementAt(index: number): TElement; elementAt(index: number): TElement;
elementAtOrDefault(index: number, def?: TElement): TElement | undefined; elementAtOrDefault(index: number, def?: TElement): TElement | undefined;
@@ -68,8 +72,8 @@ export interface Sequence<TElement> extends Iterable<TElement> {
orderDescending(comparer?: Comparer<TElement>): OrderedSequence<TElement>; orderDescending(comparer?: Comparer<TElement>): OrderedSequence<TElement>;
orderByDescending<TBy>(selector: Converter<TElement, TBy>, comparer?: Comparer<TBy>): OrderedSequence<TElement>; orderByDescending<TBy>(selector: Converter<TElement, TBy>, comparer?: Comparer<TBy>): OrderedSequence<TElement>;
partition(equater?: Equater<TElement>): Sequence<TElement[]>; partition(equater?: Equater<TElement>): Sequence<Sequence<TElement>>;
partitionBy<TBy>(selector: Converter<TElement, TBy>, equater?: Equater<TBy>): Sequence<TElement[]>; partitionBy<TBy>(selector: Converter<TElement, TBy>, equater?: Equater<TBy>): Sequence<Sequence<TElement>>;
distinct(equater?: Equater<TElement>): Sequence<TElement>; distinct(equater?: Equater<TElement>): Sequence<TElement>;
distinctBy<TBy>(selector: Converter<TElement, TBy>, equater?: Equater<TBy>): Sequence<TElement>; distinctBy<TBy>(selector: Converter<TElement, TBy>, equater?: Equater<TBy>): Sequence<TElement>;
@@ -83,19 +87,19 @@ export interface Sequence<TElement> extends Iterable<TElement> {
intersect(sequence: Sequence<TElement>, equater?: Equater<TElement>): Sequence<TElement>; intersect(sequence: Sequence<TElement>, equater?: Equater<TElement>): Sequence<TElement>;
intersectBy<TBy>(sequence: Sequence<TElement>, selector: Converter<TElement, TBy>, equater?: Equater<TBy>): Sequence<TElement>; intersectBy<TBy>(sequence: Sequence<TElement>, selector: Converter<TElement, TBy>, equater?: Equater<TBy>): Sequence<TElement>;
all(predicate: Predicate<TElement>): boolean; all(predicate: AnyPredicate<TElement>): boolean;
any(predicate: Predicate<TElement>): boolean; any(predicate: AnyPredicate<TElement>): boolean;
any(): boolean; any(): boolean;
none(predicate: Predicate<TElement>): boolean; none(predicate: AnyPredicate<TElement>): boolean;
none(): boolean; none(): boolean;
skip(n: number): Sequence<TElement>; skip(n: number): Sequence<TElement>;
skipLast(n: number): Sequence<TElement>; skipLast(n: number): Sequence<TElement>;
skipWhile(condition: Predicate<TElement>): Sequence<TElement>; skipWhile(condition: AnyPredicate<TElement>): Sequence<TElement>;
take(n: number): Sequence<TElement>; take(n: number): Sequence<TElement>;
takeLast(n: number): Sequence<TElement>; takeLast(n: number): Sequence<TElement>;
takeWhile(condition: Predicate<TElement>): Sequence<TElement>; takeWhile(condition: AnyPredicate<TElement>): Sequence<TElement>;
peek(action: Action<TElement>): Sequence<TElement>; peek(action: Action<TElement>): Sequence<TElement>;
@@ -107,7 +111,8 @@ export interface Sequence<TElement> extends Iterable<TElement> {
reversed(): Sequence<TElement>; reversed(): Sequence<TElement>;
chunked(size: number): Sequence<Sequence<TElement>>; chunked(size: number, asArray?: false): Sequence<Sequence<TElement>>;
chunked(size: number, asArray: true): Sequence<TElement[]>;
random(options?: RandomOptions<TElement>): TElement | undefined; random(options?: RandomOptions<TElement>): TElement | undefined;
@@ -115,9 +120,12 @@ export interface Sequence<TElement> extends Iterable<TElement> {
awaited(): AsyncSequence<Awaited<TElement>>; awaited(): AsyncSequence<Awaited<TElement>>;
asArray(): TElement[];
toArray(): TElement[]; toArray(): TElement[];
toMap<TKey>(keySelector: Converter<TElement, TKey>): Map<TKey, TElement>;
toMap<TKey, TValue>(keySelector: Converter<TElement, TKey>, valueSelector: Converter<TElement, TValue>): Map<TKey, TValue>; toMap<TKey, TValue>(keySelector: Converter<TElement, TKey>, valueSelector: Converter<TElement, TValue>): Map<TKey, TValue>;
toSet(): Set<TElement>; toSet(): Set<TElement>;
toObject<TKey extends PropertyKey>(keySelector: Converter<TElement, TKey>): Record<TKey, TElement>;
toObject<TKey extends PropertyKey, TValue>(keySelector: Converter<TElement, TKey>, valueSelector: Converter<TElement, TValue>): Record<TKey, TValue>; toObject<TKey extends PropertyKey, TValue>(keySelector: Converter<TElement, TKey>, valueSelector: Converter<TElement, TValue>): Record<TKey, TValue>;
collect<TResult>(collector: Collector<TElement, any, TResult>): TResult; collect<TResult>(collector: Collector<TElement, any, TResult>): TResult;

View File

@@ -2,6 +2,7 @@ import { AsyncSequence } from "./async/types.js";
import { Sequence } from "./sync/types.js"; import { Sequence } from "./sync/types.js";
export type Predicate<T> = (obj: T) => boolean; export type Predicate<T> = (obj: T) => boolean;
export type AnyPredicate<T> = (obj: T) => unknown;
export type FilterPredicate<TElement, TFiltered extends TElement> = (obj: TElement) => obj is TFiltered; export type FilterPredicate<TElement, TFiltered extends TElement> = (obj: TElement) => obj is TFiltered;
export type Converter<TFrom, TTo> = (obj: TFrom) => TTo; export type Converter<TFrom, TTo> = (obj: TFrom) => TTo;
export type BiConverter<TFromFirst, TFromSecond, TTo> = (first: TFromFirst, second: TFromSecond) => TTo; export type BiConverter<TFromFirst, TFromSecond, TTo> = (first: TFromFirst, second: TFromSecond) => TTo;
@@ -20,7 +21,9 @@ export type MaybeAsyncFunction<TFunc extends (...args: any) => any> = TFunc exte
export type MaybeAsyncSequence<T> = Sequence<T> | AsyncSequence<T>; export type MaybeAsyncSequence<T> = Sequence<T> | AsyncSequence<T>;
export type AsyncPredicate<T> = AsyncFunction<Predicate<T>>; export type AsyncPredicate<T> = AsyncFunction<Predicate<T>>;
export type AsyncAnyPredicate<T> = AsyncFunction<AnyPredicate<T>>;
export type MaybeAsyncPredicate<T> = MaybeAsyncFunction<Predicate<T>>; export type MaybeAsyncPredicate<T> = MaybeAsyncFunction<Predicate<T>>;
export type MaybeAsyncAnyPredicate<T> = MaybeAsyncFunction<AnyPredicate<T>>;
export type AsyncConverter<TFrom, TTo> = AsyncFunction<Converter<TFrom, TTo>>; export type AsyncConverter<TFrom, TTo> = AsyncFunction<Converter<TFrom, TTo>>;
export type MaybeAsyncConverter<TFrom, TTo> = MaybeAsyncFunction<Converter<TFrom, TTo>>; export type MaybeAsyncConverter<TFrom, TTo> = MaybeAsyncFunction<Converter<TFrom, TTo>>;
export type AsyncBiConverter<TFromFirst, TFromSecond, TTo> = AsyncFunction<BiConverter<TFromFirst, TFromSecond, TTo>>; export type AsyncBiConverter<TFromFirst, TFromSecond, TTo> = AsyncFunction<BiConverter<TFromFirst, TFromSecond, TTo>>;