diff --git a/src/async/impl.ts b/src/async/impl.ts index 7a53739..2ce5eb0 100644 --- a/src/async/impl.ts +++ b/src/async/impl.ts @@ -918,19 +918,19 @@ export class DelegatedAsyncSequence extends AsyncSequenceMarker implem return this.#sequence.boundsBy(selector, comparer); } - order(comparer?: MaybeAsyncComparisonOrComparer | undefined): AsyncSequence { + order(comparer?: MaybeAsyncComparisonOrComparer | undefined): OrderedAsyncSequence { return this.#sequence.order(comparer); } - orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer | undefined): AsyncSequence { + orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer | undefined): OrderedAsyncSequence { return this.#sequence.orderBy(selector, comparer); } - orderDescending(comparer?: MaybeAsyncComparisonOrComparer | undefined): AsyncSequence { + orderDescending(comparer?: MaybeAsyncComparisonOrComparer | undefined): OrderedAsyncSequence { return this.#sequence.orderDescending(comparer); } - orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer | undefined): AsyncSequence { + orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer | undefined): OrderedAsyncSequence { return this.#sequence.orderByDescending(selector, comparer); } @@ -1241,6 +1241,20 @@ export class WrappedObjectAsync extends BaseAsyncSequence { } } +export class WrappedPromise extends BaseAsyncSequence { + readonly #promise: Promise>; + + constructor(promise: Promise>) { + super(); + + this.#promise = promise; + } + + override async *iterator() { + yield* await this.#promise; + } +} + export class WrappedArrayAsync extends BaseAsyncSequence { readonly #array: ReadonlyArray>; diff --git a/src/async/index.ts b/src/async/index.ts index a02aaae..036b304 100644 --- a/src/async/index.ts +++ b/src/async/index.ts @@ -2,13 +2,17 @@ import { wrap as wrapSync } from "../sync/index.js"; import { Sequence } from "../sync/types.js"; import { MaybeAsyncGenerator, MaybeAsyncIterable, MaybePromiseLike } from "../types.js"; import { isAsyncIterable } from "../utils.js"; -import { WrappedSequence, WrappedAsyncIterable, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncSequence, GeneratorAsyncSequence, RangeAsyncSequence, RepeatForeverAsyncSequence, RepeatAsyncSequence, AsyncSequenceMarker, EMPTY, ConcatAsyncSequence } from "./impl.js"; +import { WrappedSequence, WrappedAsyncIterable, WrappedObjectAsync, WrappedArrayAsync, WrappedArrayLikeAsync, FunctionAsyncSequence, GeneratorAsyncSequence, RangeAsyncSequence, RepeatForeverAsyncSequence, RepeatAsyncSequence, AsyncSequenceMarker, EMPTY, ConcatAsyncSequence, WrappedPromise } from "./impl.js"; import { AsyncSequence } from "./types.js"; export function asAsync(sequence: Sequence>): AsyncSequence { return new WrappedSequence(sequence); } +export function wrapPromise(promise: Promise>): AsyncSequence { + return new WrappedPromise(promise); +} + export function wrap(iterable: MaybeAsyncIterable>): AsyncSequence { if (isAsyncSequence(iterable)) { return iterable; diff --git a/src/async/types.ts b/src/async/types.ts index f1b194a..6209a35 100644 --- a/src/async/types.ts +++ b/src/async/types.ts @@ -5,6 +5,7 @@ import { AsyncRandomOptions } from "../random/types.js"; import { MaybeAsyncAnyPredicate, MaybeAsyncConverter, MaybeAsyncBiConverter, MaybeAsyncAccumulator, MaybeAsyncAction, MaybeAsyncFunction, MaybePromise, MaybeAsyncIterable } from "../types.js"; export type AsyncSequencePipeline = MaybeAsyncFunction<(sequence: AsyncSequence) => TResult>; +export type AsyncSequenceElement> = TAsyncSequence extends AsyncSequence ? TElement : never; export interface AsyncSequence extends AsyncIterable { iterator(): AsyncIterator; @@ -68,11 +69,11 @@ export interface AsyncSequence extends AsyncIterable { bounds(comparer?: MaybeAsyncComparisonOrComparer): Promise<[min: TElement, max: TElement]>; boundsBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer): Promise<[min: TElement, max: TElement]>; - order(comparer?: MaybeAsyncComparisonOrComparer): AsyncSequence; - orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer): AsyncSequence; + order(comparer?: MaybeAsyncComparisonOrComparer): OrderedAsyncSequence; + orderBy(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer): OrderedAsyncSequence; - orderDescending(comparer?: MaybeAsyncComparisonOrComparer): AsyncSequence; - orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer): AsyncSequence; + orderDescending(comparer?: MaybeAsyncComparisonOrComparer): OrderedAsyncSequence; + orderByDescending(selector: MaybeAsyncConverter, comparer?: MaybeAsyncComparisonOrComparer): OrderedAsyncSequence; partition(equater?: MaybeAsyncEqualityComparisonOrComparer): AsyncSequence>; partitionBy(selector: MaybeAsyncConverter, equater?: MaybeAsyncEqualityComparisonOrComparer): AsyncSequence>; diff --git a/src/equality-comparer/sync.ts b/src/equality-comparer/sync.ts index cdca6c0..68ef536 100644 --- a/src/equality-comparer/sync.ts +++ b/src/equality-comparer/sync.ts @@ -126,7 +126,7 @@ class ThenEqualityComparer extends BaseEqualityComparer { } } -export const alwaysFalseEqualityComparer = new class AlwaysFalseEqualityComparer extends BaseEqualityComparer { +class AlwaysFalseEqualityComparer extends BaseEqualityComparer { public override equals(_a: any, _b: any): boolean { return false; } @@ -148,7 +148,9 @@ export const alwaysFalseEqualityComparer = new class AlwaysFalseEqualityComparer } }; -export const alwaysTrueEqualityComparer = new class AlwaysTrueEqualityComparer extends BaseEqualityComparer { +export const alwaysFalseEqualityComparer = new AlwaysFalseEqualityComparer(); + +class AlwaysTrueEqualityComparer extends BaseEqualityComparer { public override equals(_a: any, _b: any): boolean { return true; } @@ -168,7 +170,9 @@ export const alwaysTrueEqualityComparer = new class AlwaysTrueEqualityComparer e public override thenEqualsUsing(projection: Converter, equalityComparison?: EqualityComparisonOrComparer | undefined): EqualityComparer { return createEqualityComparerUsing(projection, equalityComparison); } -}; +} + +export const alwaysTrueEqualityComparer = new AlwaysTrueEqualityComparer(); export const looseEqualityComparer: EqualityComparer = new class LooseEqualityComparer extends BaseEqualityComparer { public override equals(a: any, b: any): boolean { diff --git a/src/sync/index.ts b/src/sync/index.ts index b903bb3..4c0d2b8 100644 --- a/src/sync/index.ts +++ b/src/sync/index.ts @@ -70,7 +70,9 @@ export function keys(o: object): Sequence { return array(Object.keys(o)); } -export function values(o: object): Sequence { +export function values(o: object): Sequence; +export function values(o: Record | ArrayLike): Sequence; +export function values(o: object) { return array(Object.values(o)); } diff --git a/src/sync/types.ts b/src/sync/types.ts index fc2cb02..f22f025 100644 --- a/src/sync/types.ts +++ b/src/sync/types.ts @@ -6,6 +6,7 @@ import { RandomOptions } from "../random/types.js"; import { AnyPredicate, Converter, TypePredicate, BiConverter, Accumulator, Action } from "../types.js"; export type SequencePipeline = (sequence: Sequence) => TResult; +export type SequenceElement> = TSequence extends Sequence ? TElement : never; export interface Sequence extends Iterable { iterator(): Iterator;