reactor-core-ts 3.2.2 → 3.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +5 -0
  2. package/dist/core/demand.d.ts +4 -0
  3. package/dist/core/demand.d.ts.map +1 -1
  4. package/dist/core/demand.js +12 -4
  5. package/dist/core/demand.js.map +1 -1
  6. package/dist/internal/deep-value.d.ts +9 -0
  7. package/dist/internal/deep-value.d.ts.map +1 -0
  8. package/dist/internal/deep-value.js +159 -0
  9. package/dist/internal/deep-value.js.map +1 -0
  10. package/dist/internal/iterable-transform.d.ts +8 -1
  11. package/dist/internal/iterable-transform.d.ts.map +1 -1
  12. package/dist/internal/iterable-transform.js +7 -5
  13. package/dist/internal/iterable-transform.js.map +1 -1
  14. package/dist/internal/iteration-demand.d.ts +18 -0
  15. package/dist/internal/iteration-demand.d.ts.map +1 -0
  16. package/dist/internal/iteration-demand.js +34 -0
  17. package/dist/internal/iteration-demand.js.map +1 -0
  18. package/dist/internal/publisher-terminal.d.ts +25 -0
  19. package/dist/internal/publisher-terminal.d.ts.map +1 -0
  20. package/dist/internal/publisher-terminal.js +128 -0
  21. package/dist/internal/publisher-terminal.js.map +1 -0
  22. package/dist/publisher/flux.d.ts.map +1 -1
  23. package/dist/publisher/flux.js +22 -12
  24. package/dist/publisher/flux.js.map +1 -1
  25. package/dist/publisher/mono.d.ts.map +1 -1
  26. package/dist/publisher/mono.js +2 -1
  27. package/dist/publisher/mono.js.map +1 -1
  28. package/dist/publisher/operators/aggregate.d.ts.map +1 -1
  29. package/dist/publisher/operators/aggregate.js +136 -143
  30. package/dist/publisher/operators/aggregate.js.map +1 -1
  31. package/dist/publisher/operators/buffer-lift.d.ts +5 -0
  32. package/dist/publisher/operators/buffer-lift.d.ts.map +1 -0
  33. package/dist/publisher/operators/buffer-lift.js +197 -0
  34. package/dist/publisher/operators/buffer-lift.js.map +1 -0
  35. package/dist/publisher/operators/compat/flux.d.ts.map +1 -1
  36. package/dist/publisher/operators/compat/flux.js +86 -35
  37. package/dist/publisher/operators/compat/flux.js.map +1 -1
  38. package/dist/publisher/operators/coordination.d.ts.map +1 -1
  39. package/dist/publisher/operators/coordination.js +3 -4
  40. package/dist/publisher/operators/coordination.js.map +1 -1
  41. package/dist/publisher/operators/lifecycle.d.ts.map +1 -1
  42. package/dist/publisher/operators/lifecycle.js +64 -21
  43. package/dist/publisher/operators/lifecycle.js.map +1 -1
  44. package/dist/publisher/operators/lift.d.ts +2 -0
  45. package/dist/publisher/operators/lift.d.ts.map +1 -1
  46. package/dist/publisher/operators/lift.js +173 -3
  47. package/dist/publisher/operators/lift.js.map +1 -1
  48. package/dist/publisher/operators/selection.d.ts +5 -0
  49. package/dist/publisher/operators/selection.d.ts.map +1 -1
  50. package/dist/publisher/operators/selection.js +11 -2
  51. package/dist/publisher/operators/selection.js.map +1 -1
  52. package/dist/publisher/operators/terminal-mono.d.ts +12 -0
  53. package/dist/publisher/operators/terminal-mono.d.ts.map +1 -0
  54. package/dist/publisher/operators/terminal-mono.js +244 -0
  55. package/dist/publisher/operators/terminal-mono.js.map +1 -0
  56. package/dist/publisher/operators/terminal.d.ts.map +1 -1
  57. package/dist/publisher/operators/terminal.js +12 -25
  58. package/dist/publisher/operators/terminal.js.map +1 -1
  59. package/dist/publisher/operators/time.d.ts.map +1 -1
  60. package/dist/publisher/operators/time.js +2 -0
  61. package/dist/publisher/operators/time.js.map +1 -1
  62. package/dist/subscription/iterable-subscription.d.ts.map +1 -1
  63. package/dist/subscription/iterable-subscription.js +5 -2
  64. package/dist/subscription/iterable-subscription.js.map +1 -1
  65. package/package.json +1 -1
  66. package/dist/internal/iterable-terminal.d.ts +0 -12
  67. package/dist/internal/iterable-terminal.d.ts.map +0 -1
  68. package/dist/internal/iterable-terminal.js +0 -49
  69. package/dist/internal/iterable-terminal.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"mono.js","names":[],"sources":["../../src/publisher/mono.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Flux, Mono and operator implementation modules.\n */\nimport type {Context} from \"@/context/context.js\";\nimport type {ContextView} from \"@/context/context-view.js\";\nimport {CompositeError} from \"@/errors/classes.js\";\nimport {throwIfNullish} from \"@/errors/helpers.js\";\nimport {firstValueFrom, raceWithAbort} from \"@/internal/abort.js\";\nimport {AsyncQueue} from \"@/internal/async-queue.js\";\nimport {closeAsyncIterator, EMPTY_ITERABLE, isAsyncIterable, neverIterable, toAsyncIterator} from \"@/internal/iterable.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {addCancelCallback, type CancelCallbacks, runCancelCallbacks, scheduleDelay} from \"@/publisher/helpers.js\";\nimport type {MonoSinkCallback, PublisherInput, SourceFactory} from \"@/publisher/types.js\";\nimport {Schedulers} from \"@/schedulers/schedulers.js\";\nimport type {DurationInput, Scheduler} from \"@/schedulers/types.js\";\n\n/** Zero-or-one Reactive Streams publisher with Reactor-style Mono operators. */\nexport class Mono<T> extends Flux<T> {\n /** Creates a Mono from a lazy source factory. */\n public constructor(sourceFactory: SourceFactory<T>) {\n super((signal, context) => {\n const source = sourceFactory(signal, context);\n if (!isAsyncIterable<T>(source)) {\n return (function* () {\n if (signal.aborted) {\n return;\n }\n const iterator = source[Symbol.iterator]();\n try {\n const first = iterator.next();\n if (!first.done) {\n yield first.value;\n }\n } finally {\n iterator.return?.();\n }\n })();\n }\n return (async function* () {\n const iterator = toAsyncIterator(source);\n try {\n const first = await raceWithAbort(iterator.next(), signal);\n if (!first.done) {\n yield first.value;\n }\n } finally {\n await iterator.return?.();\n }\n })();\n });\n }\n\n /** Creates a Mono that emits exactly one non-nullish value. */\n public static override just<T>(value: T): Mono<T> {\n throwIfNullish(value, \"value\");\n return new Mono(function* () {\n yield value;\n });\n }\n\n /** Creates a Mono that completes without a value. */\n public static override empty<T = never>(): Mono<T> {\n return EMPTY_MONO as Mono<T>;\n }\n\n /** Creates a Mono that never emits or completes until cancelled. */\n public static override never<T = never>(): Mono<T> {\n return NEVER_MONO as Mono<T>;\n }\n\n /** Creates a Mono that terminates with the provided error. */\n public static override error<T = never>(error: unknown | (() => unknown)): Mono<T> {\n return new Mono(async function* () {\n throw typeof error === \"function\" ? (error as () => unknown)() : error;\n });\n }\n\n /** Defers Mono source creation until subscription time. */\n public static override defer<T>(supplier: () => PublisherInput<T>): Mono<T> {\n return new Mono((signal, context) => Flux.from(supplier()).next().iterate(signal, context));\n }\n\n /** Defers Mono source creation and exposes the subscriber context. */\n public static override deferContextual<T>(supplier: (context: ContextView) => PublisherInput<T>): Mono<T> {\n return new Mono((signal, context) => Flux.from(supplier(context.readOnly())).next().iterate(signal, context));\n }\n\n /** Relays the first Mono that emits any signal. */\n public static override first<T>(...sources: readonly PublisherInput<T>[]): Mono<T> {\n return Mono.firstWithSignal(...sources);\n }\n\n /** Adapts a source and keeps at most its first value. */\n public static override from<T>(input: PublisherInput<T>): Mono<T> {\n if (input instanceof Mono) {\n return input;\n }\n return Flux.from(input).next();\n }\n\n /** Creates a Mono from a promise-like value. */\n public static fromPromise<T>(promise: PromiseLike<T>): Mono<T> {\n return new Mono(async function* (signal) {\n const value = await raceWithAbort(Promise.resolve(promise), signal);\n if (value !== undefined && value !== null) {\n yield value;\n }\n });\n }\n\n /** Creates a Mono from a CompletionStage-like promise. */\n public static fromCompletionStage<T>(stage: PromiseLike<T> | (() => PromiseLike<T>)): Mono<T> {\n return typeof stage === \"function\" ? Mono.defer(() => Mono.fromPromise((stage as () => PromiseLike<T>)())) : Mono.fromPromise(stage);\n }\n\n /** Creates a Mono from a Future-like promise. */\n public static fromFuture<T>(future: PromiseLike<T> | (() => PromiseLike<T>), _suppressCancel?: boolean): Mono<T> {\n return typeof future === \"function\" ? Mono.defer(() => Mono.fromPromise((future as () => PromiseLike<T>)())) : Mono.fromPromise(future);\n }\n\n /** Adapts a publisher directly, preserving only its first value for Mono semantics. */\n public static fromDirect<T>(input: PublisherInput<T>): Mono<T> {\n return new Mono((signal, context) => Flux.from(input).iterate(signal, context));\n }\n\n /** Creates a Mono from a synchronous supplier. */\n public static fromSupplier<T>(supplier: () => T | null | undefined): Mono<T> {\n return new Mono(function* () {\n const value = supplier();\n if (value !== undefined && value !== null) {\n yield value;\n }\n });\n }\n\n /** Creates a Mono from a synchronous callable. */\n public static fromCallable<T>(callable: () => T | null | undefined): Mono<T> {\n return Mono.fromSupplier(callable);\n }\n\n /** Runs a callback and completes after it returns. */\n public static fromRunnable(runnable: () => void): Mono<void> {\n return new Mono(function* () {\n runnable();\n });\n }\n\n /** Creates a valued Mono for non-nullish input or an empty Mono otherwise. */\n public static justOrEmpty<T>(value: T | null | undefined): Mono<T> {\n return value === null || value === undefined ? Mono.empty<T>() : Mono.just(value);\n }\n\n /** Ignores every value from a source and completes when the source completes. */\n public static ignoreElements<T>(source: PublisherInput<T>): Mono<T> {\n return Flux.from(source).then() as unknown as Mono<T>;\n }\n\n /** Compares two sources element-by-element. */\n public static sequenceEqual<T>(\n left: PublisherInput<T>,\n right: PublisherInput<T>,\n comparator: (left: T, right: T) => boolean = Object.is\n ): Mono<boolean> {\n return new Mono(async function* (signal, context) {\n const leftIterator = toAsyncIterator(Flux.from(left).iterate(signal, context));\n const rightIterator = toAsyncIterator(Flux.from(right).iterate(signal, context));\n const nexts: [\n Promise<IteratorResult<T>>,\n Promise<IteratorResult<T>>\n ] = new Array<Promise<IteratorResult<T>>>(2) as [\n Promise<IteratorResult<T>>,\n Promise<IteratorResult<T>>\n ];\n try {\n for (; ;) {\n nexts[0] = raceWithAbort(leftIterator.next(), signal);\n nexts[1] = raceWithAbort(rightIterator.next(), signal);\n const [leftNext, rightNext] = await Promise.all(nexts);\n if (leftNext.done || rightNext.done) {\n yield Boolean(leftNext.done && rightNext.done);\n return;\n }\n if (!comparator(leftNext.value, rightNext.value)) {\n yield false;\n return;\n }\n }\n } finally {\n await closeAsyncIterator(leftIterator);\n await closeAsyncIterator(rightIterator);\n }\n });\n }\n\n /** Creates a Mono by bridging callback-style producers through a sink. */\n public static override create<T>(callback: MonoSinkCallback<T>): Mono<T> {\n throwIfNullish(callback, \"callback\");\n return new Mono(signal => {\n const queue = new AsyncQueue<T>(signal);\n let cancelled = false;\n let terminated = false;\n let cancelCallbacks: CancelCallbacks | undefined;\n const sink = {\n /** Emits one value and completes this Mono sink. */\n next(value: T) {\n this.success(value);\n },\n /** Completes this Mono sink without a value. */\n complete() {\n this.success();\n },\n /** Completes this Mono sink with an optional value. */\n success(value?: T) {\n if (terminated) {\n return;\n }\n terminated = true;\n if (value !== undefined && value !== null) {\n queue.push(value);\n }\n queue.complete();\n },\n /** Terminates this Mono sink with an error. */\n error(error: unknown) {\n if (terminated) {\n return;\n }\n terminated = true;\n queue.error(error);\n },\n /** Registers a callback invoked when the subscription is cancelled. */\n onCancel(cancelCallback: () => void) {\n cancelCallbacks = addCancelCallback(cancelCallbacks, cancelCallback);\n return sink;\n },\n /** Returns true after cancellation has been observed. */\n isCancelled() {\n return cancelled || signal.aborted;\n }\n };\n signal.addEventListener(\n \"abort\",\n () => {\n cancelled = true;\n runCancelCallbacks(cancelCallbacks);\n cancelCallbacks = undefined;\n queue.complete();\n },\n {once: true}\n );\n try {\n callback(sink);\n } catch (error) {\n queue.error(error);\n }\n return queue;\n });\n }\n\n /** Emits `0` after the provided delay. */\n public static delay(duration: DurationInput, scheduler: Scheduler = Schedulers.timeout()): Mono<number> {\n return new Mono(async function* (signal) {\n await scheduleDelay(scheduler, duration, signal);\n yield 0;\n });\n }\n\n /** Completes when all provided publishers complete. */\n public static when(...sources: readonly PublisherInput<unknown>[]): Mono<void> {\n if (sources.length === 0) {\n return Mono.empty<void>();\n }\n if (sources.length === 1) {\n return new Mono(async function* (signal, context) {\n await drainPublisherInput(sources[0]!, signal, context);\n });\n }\n return new Mono(async function* (signal, context) {\n await Promise.all(completionTasks(sources, signal, context));\n });\n }\n\n /** Completes when all provided publishers complete and delays failures until all terminate. */\n public static whenDelayError(...sources: readonly PublisherInput<unknown>[]): Mono<void> {\n if (sources.length === 0) {\n return Mono.empty<void>();\n }\n if (sources.length === 1) {\n return new Mono(async function* (signal, context) {\n await drainPublisherInputAsCompositeError(sources[0]!, signal, context);\n });\n }\n return new Mono(async function* (signal, context) {\n const errors: unknown[] = [];\n await Promise.all(completionDelayErrorTasks(sources, signal, context, errors));\n if (errors.length > 0) {\n throw new CompositeError(errors);\n }\n });\n }\n\n /** Relays the first source to signal value, completion or error. */\n public static override firstWithSignal<T>(...sources: readonly PublisherInput<T>[]): Mono<T> {\n if (sources.length === 0) {\n return Mono.empty<T>();\n }\n if (sources.length === 1) {\n return Mono.from(sources[0]!);\n }\n return new Mono(signal => {\n const queue = new AsyncQueue<T>(signal);\n let settled = false;\n for (const source of sources) {\n void (async () => {\n try {\n const value = await firstValueFrom(Flux.from(source), signal);\n if (!settled) {\n settled = true;\n if (value !== undefined) {\n queue.push(value);\n }\n queue.complete();\n }\n } catch (error) {\n if (!settled) {\n settled = true;\n queue.error(error);\n }\n }\n })();\n }\n return queue;\n });\n }\n\n /** Relays the first non-empty value from the provided sources. */\n public static override firstWithValue<T>(...sources: readonly PublisherInput<T>[]): Mono<T> {\n if (sources.length === 0) {\n return Mono.empty<T>();\n }\n if (sources.length === 1) {\n return Mono.from(sources[0]!);\n }\n return new Mono(signal => {\n const queue = new AsyncQueue<T>(signal);\n let remaining = sources.length;\n const errors: unknown[] = [];\n for (const source of sources) {\n void (async () => {\n try {\n const value = await firstValueFrom(Flux.from(source), signal);\n if (value !== undefined) {\n queue.push(value);\n queue.complete();\n } else {\n remaining -= 1;\n if (remaining === 0) {\n errors.length > 0 ? queue.error(new CompositeError(errors)) : queue.complete();\n }\n }\n } catch (error) {\n errors.push(error);\n remaining -= 1;\n if (remaining === 0) {\n queue.error(new CompositeError(errors));\n }\n }\n })();\n }\n return queue;\n });\n }\n\n /** Zips Monos by combining one value from each source. */\n public static override zip<T extends readonly unknown[], R = T>(\n sources: { [K in keyof T]: PublisherInput<T[K]> },\n combinator?: (values: T) => R\n ): Mono<R> {\n return Flux.zip(sources, combinator).next();\n }\n\n /** Zips Monos by combining one value from each source while delaying source failures. */\n public static zipDelayError<T extends readonly unknown[], R = T>(\n sources: { [K in keyof T]: PublisherInput<T[K]> },\n combinator?: (values: T) => R\n ): Mono<R> {\n const sourceCount = sources.length;\n if (sourceCount === 0) {\n return Mono.empty<R>();\n }\n if (sourceCount === 1) {\n return singleZipDelayError(sources[0]!, combinator);\n }\n return new Mono(async function* (signal, context) {\n const values = new Array<unknown>(sourceCount);\n const errors: unknown[] = [];\n const tasks = new Array<Promise<void>>(sourceCount);\n for (let index = 0; index < sourceCount; index += 1) {\n tasks[index] = (async () => {\n try {\n values[index] = await firstValueFrom(Flux.from(sources[index]!), signal);\n } catch (error) {\n errors.push(error);\n }\n })();\n }\n await Promise.all(tasks);\n if (errors.length > 0) {\n throw new CompositeError(errors);\n }\n for (let index = 0; index < sourceCount; index += 1) {\n if (values[index] === undefined) {\n return;\n }\n }\n const tuple = values as unknown as T;\n yield combinator ? combinator(tuple) : (tuple as unknown as R);\n });\n }\n\n /** Uses a resource for the duration of a derived Mono and cleans it up afterwards. */\n public static override using<T, D>(\n resourceSupplier: () => D,\n sourceFactory: (resource: D) => PublisherInput<T>,\n resourceCleanup?: (resource: D) => void\n ): Mono<T> {\n return Flux.using(resourceSupplier, sourceFactory, resourceCleanup).next();\n }\n\n /** Uses an asynchronously supplied resource and runs asynchronous cleanup publishers. */\n public static override usingWhen<T, D>(\n resourceSupplier: PublisherInput<D>,\n sourceFactory: (resource: D) => PublisherInput<T>,\n asyncComplete?: (resource: D) => PublisherInput<unknown>,\n asyncError?: (resource: D, error: unknown) => PublisherInput<unknown>,\n asyncCancel?: (resource: D) => PublisherInput<unknown>\n ): Mono<T> {\n return Flux.usingWhen(resourceSupplier, sourceFactory, asyncComplete, asyncError, asyncCancel).next();\n }\n\n /** Resolves to the Mono value, or undefined when empty. */\n public async block(): Promise<T | undefined> {\n return this.toPromise();\n }\n}\n\n/** Shared stateless empty Mono instance. */\nconst EMPTY_MONO = new Mono<never>(() => EMPTY_ITERABLE);\n\n/** Shared stateless never Mono instance. */\nconst NEVER_MONO = new Mono<never>(signal => neverIterable(signal));\n\n/** Zips one source without allocating multi-source coordination state. */\nfunction singleZipDelayError<T extends readonly unknown[], R>(\n source: PublisherInput<T[0]>,\n combinator: ((values: T) => R) | undefined\n): Mono<R> {\n return new Mono(async function* (signal) {\n let value: T[0] | undefined;\n try {\n value = await firstValueFrom(Flux.from(source), signal);\n } catch (error) {\n throw new CompositeError([error]);\n }\n if (value === undefined) {\n return;\n }\n const tuple = [value] as unknown as T;\n yield combinator ? combinator(tuple) : (tuple as unknown as R);\n });\n}\n\n/** Creates completion tasks for publishers whose values are ignored. */\nfunction completionTasks(\n sources: readonly PublisherInput<unknown>[],\n signal: AbortSignal,\n context: Context\n): Promise<void>[] {\n const tasks = new Array<Promise<void>>(sources.length);\n for (let index = 0; index < sources.length; index += 1) {\n tasks[index] = drainPublisherInput(sources[index]!, signal, context);\n }\n return tasks;\n}\n\n/** Creates completion tasks that collect failures until every publisher has terminated. */\nfunction completionDelayErrorTasks(\n sources: readonly PublisherInput<unknown>[],\n signal: AbortSignal,\n context: Context,\n errors: unknown[]\n): Promise<void>[] {\n const tasks = new Array<Promise<void>>(sources.length);\n for (let index = 0; index < sources.length; index += 1) {\n tasks[index] = drainPublisherInputDelayError(sources[index]!, signal, context, errors);\n }\n return tasks;\n}\n\n/** Consumes a publisher and ignores every value. */\nasync function drainPublisherInput(source: PublisherInput<unknown>, signal: AbortSignal, context: Context): Promise<void> {\n for await (const _ of Flux.from(source).iterate(signal, context)) {\n // values are intentionally ignored\n }\n}\n\n/** Consumes one publisher and wraps its failure like delayed-error composition. */\nasync function drainPublisherInputAsCompositeError(\n source: PublisherInput<unknown>,\n signal: AbortSignal,\n context: Context\n): Promise<void> {\n try {\n await drainPublisherInput(source, signal, context);\n } catch (error) {\n throw new CompositeError([error]);\n }\n}\n\n/** Consumes a publisher and records its failure instead of throwing immediately. */\nasync function drainPublisherInputDelayError(\n source: PublisherInput<unknown>,\n signal: AbortSignal,\n context: Context,\n errors: unknown[]\n): Promise<void> {\n try {\n await drainPublisherInput(source, signal, context);\n } catch (error) {\n errors.push(error);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mono.js","names":[],"sources":["../../src/publisher/mono.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Flux, Mono and operator implementation modules.\n */\nimport type {Context} from \"@/context/context.js\";\nimport type {ContextView} from \"@/context/context-view.js\";\nimport {CompositeError} from \"@/errors/classes.js\";\nimport {throwIfNullish} from \"@/errors/helpers.js\";\nimport {firstValueFrom, raceWithAbort} from \"@/internal/abort.js\";\nimport {AsyncQueue} from \"@/internal/async-queue.js\";\nimport {closeAsyncIterator, EMPTY_ITERABLE, isAsyncIterable, neverIterable, toAsyncIterator} from \"@/internal/iterable.js\";\nimport {drainPublisher} from \"@/internal/publisher-terminal.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {addCancelCallback, type CancelCallbacks, runCancelCallbacks, scheduleDelay} from \"@/publisher/helpers.js\";\nimport type {MonoSinkCallback, PublisherInput, SourceFactory} from \"@/publisher/types.js\";\nimport {Schedulers} from \"@/schedulers/schedulers.js\";\nimport type {DurationInput, Scheduler} from \"@/schedulers/types.js\";\n\n/** Zero-or-one Reactive Streams publisher with Reactor-style Mono operators. */\nexport class Mono<T> extends Flux<T> {\n /** Creates a Mono from a lazy source factory. */\n public constructor(sourceFactory: SourceFactory<T>) {\n super((signal, context) => {\n const source = sourceFactory(signal, context);\n if (!isAsyncIterable<T>(source)) {\n return (function* () {\n if (signal.aborted) {\n return;\n }\n const iterator = source[Symbol.iterator]();\n try {\n const first = iterator.next();\n if (!first.done) {\n yield first.value;\n }\n } finally {\n iterator.return?.();\n }\n })();\n }\n return (async function* () {\n const iterator = toAsyncIterator(source);\n try {\n const first = await raceWithAbort(iterator.next(), signal);\n if (!first.done) {\n yield first.value;\n }\n } finally {\n await iterator.return?.();\n }\n })();\n });\n }\n\n /** Creates a Mono that emits exactly one non-nullish value. */\n public static override just<T>(value: T): Mono<T> {\n throwIfNullish(value, \"value\");\n return new Mono(function* () {\n yield value;\n });\n }\n\n /** Creates a Mono that completes without a value. */\n public static override empty<T = never>(): Mono<T> {\n return EMPTY_MONO as Mono<T>;\n }\n\n /** Creates a Mono that never emits or completes until cancelled. */\n public static override never<T = never>(): Mono<T> {\n return NEVER_MONO as Mono<T>;\n }\n\n /** Creates a Mono that terminates with the provided error. */\n public static override error<T = never>(error: unknown | (() => unknown)): Mono<T> {\n return new Mono(async function* () {\n throw typeof error === \"function\" ? (error as () => unknown)() : error;\n });\n }\n\n /** Defers Mono source creation until subscription time. */\n public static override defer<T>(supplier: () => PublisherInput<T>): Mono<T> {\n return new Mono((signal, context) => Flux.from(supplier()).next().iterate(signal, context));\n }\n\n /** Defers Mono source creation and exposes the subscriber context. */\n public static override deferContextual<T>(supplier: (context: ContextView) => PublisherInput<T>): Mono<T> {\n return new Mono((signal, context) => Flux.from(supplier(context.readOnly())).next().iterate(signal, context));\n }\n\n /** Relays the first Mono that emits any signal. */\n public static override first<T>(...sources: readonly PublisherInput<T>[]): Mono<T> {\n return Mono.firstWithSignal(...sources);\n }\n\n /** Adapts a source and keeps at most its first value. */\n public static override from<T>(input: PublisherInput<T>): Mono<T> {\n if (input instanceof Mono) {\n return input;\n }\n return Flux.from(input).next();\n }\n\n /** Creates a Mono from a promise-like value. */\n public static fromPromise<T>(promise: PromiseLike<T>): Mono<T> {\n return new Mono(async function* (signal) {\n const value = await raceWithAbort(Promise.resolve(promise), signal);\n if (value !== undefined && value !== null) {\n yield value;\n }\n });\n }\n\n /** Creates a Mono from a CompletionStage-like promise. */\n public static fromCompletionStage<T>(stage: PromiseLike<T> | (() => PromiseLike<T>)): Mono<T> {\n return typeof stage === \"function\" ? Mono.defer(() => Mono.fromPromise((stage as () => PromiseLike<T>)())) : Mono.fromPromise(stage);\n }\n\n /** Creates a Mono from a Future-like promise. */\n public static fromFuture<T>(future: PromiseLike<T> | (() => PromiseLike<T>), _suppressCancel?: boolean): Mono<T> {\n return typeof future === \"function\" ? Mono.defer(() => Mono.fromPromise((future as () => PromiseLike<T>)())) : Mono.fromPromise(future);\n }\n\n /** Adapts a publisher directly, preserving only its first value for Mono semantics. */\n public static fromDirect<T>(input: PublisherInput<T>): Mono<T> {\n return new Mono((signal, context) => Flux.from(input).iterate(signal, context));\n }\n\n /** Creates a Mono from a synchronous supplier. */\n public static fromSupplier<T>(supplier: () => T | null | undefined): Mono<T> {\n return new Mono(function* () {\n const value = supplier();\n if (value !== undefined && value !== null) {\n yield value;\n }\n });\n }\n\n /** Creates a Mono from a synchronous callable. */\n public static fromCallable<T>(callable: () => T | null | undefined): Mono<T> {\n return Mono.fromSupplier(callable);\n }\n\n /** Runs a callback and completes after it returns. */\n public static fromRunnable(runnable: () => void): Mono<void> {\n return new Mono(function* () {\n runnable();\n });\n }\n\n /** Creates a valued Mono for non-nullish input or an empty Mono otherwise. */\n public static justOrEmpty<T>(value: T | null | undefined): Mono<T> {\n return value === null || value === undefined ? Mono.empty<T>() : Mono.just(value);\n }\n\n /** Ignores every value from a source and completes when the source completes. */\n public static ignoreElements<T>(source: PublisherInput<T>): Mono<T> {\n return Flux.from(source).then() as unknown as Mono<T>;\n }\n\n /** Compares two sources element-by-element. */\n public static sequenceEqual<T>(\n left: PublisherInput<T>,\n right: PublisherInput<T>,\n comparator: (left: T, right: T) => boolean = Object.is\n ): Mono<boolean> {\n return new Mono(async function* (signal, context) {\n const leftIterator = toAsyncIterator(Flux.from(left).iterate(signal, context));\n const rightIterator = toAsyncIterator(Flux.from(right).iterate(signal, context));\n const nexts: [\n Promise<IteratorResult<T>>,\n Promise<IteratorResult<T>>\n ] = new Array<Promise<IteratorResult<T>>>(2) as [\n Promise<IteratorResult<T>>,\n Promise<IteratorResult<T>>\n ];\n try {\n for (; ;) {\n nexts[0] = raceWithAbort(leftIterator.next(), signal);\n nexts[1] = raceWithAbort(rightIterator.next(), signal);\n const [leftNext, rightNext] = await Promise.all(nexts);\n if (leftNext.done || rightNext.done) {\n yield Boolean(leftNext.done && rightNext.done);\n return;\n }\n if (!comparator(leftNext.value, rightNext.value)) {\n yield false;\n return;\n }\n }\n } finally {\n await closeAsyncIterator(leftIterator);\n await closeAsyncIterator(rightIterator);\n }\n });\n }\n\n /** Creates a Mono by bridging callback-style producers through a sink. */\n public static override create<T>(callback: MonoSinkCallback<T>): Mono<T> {\n throwIfNullish(callback, \"callback\");\n return new Mono(signal => {\n const queue = new AsyncQueue<T>(signal);\n let cancelled = false;\n let terminated = false;\n let cancelCallbacks: CancelCallbacks | undefined;\n const sink = {\n /** Emits one value and completes this Mono sink. */\n next(value: T) {\n this.success(value);\n },\n /** Completes this Mono sink without a value. */\n complete() {\n this.success();\n },\n /** Completes this Mono sink with an optional value. */\n success(value?: T) {\n if (terminated) {\n return;\n }\n terminated = true;\n if (value !== undefined && value !== null) {\n queue.push(value);\n }\n queue.complete();\n },\n /** Terminates this Mono sink with an error. */\n error(error: unknown) {\n if (terminated) {\n return;\n }\n terminated = true;\n queue.error(error);\n },\n /** Registers a callback invoked when the subscription is cancelled. */\n onCancel(cancelCallback: () => void) {\n cancelCallbacks = addCancelCallback(cancelCallbacks, cancelCallback);\n return sink;\n },\n /** Returns true after cancellation has been observed. */\n isCancelled() {\n return cancelled || signal.aborted;\n }\n };\n signal.addEventListener(\n \"abort\",\n () => {\n cancelled = true;\n runCancelCallbacks(cancelCallbacks);\n cancelCallbacks = undefined;\n queue.complete();\n },\n {once: true}\n );\n try {\n callback(sink);\n } catch (error) {\n queue.error(error);\n }\n return queue;\n });\n }\n\n /** Emits `0` after the provided delay. */\n public static delay(duration: DurationInput, scheduler: Scheduler = Schedulers.timeout()): Mono<number> {\n return new Mono(async function* (signal) {\n await scheduleDelay(scheduler, duration, signal);\n yield 0;\n });\n }\n\n /** Completes when all provided publishers complete. */\n public static when(...sources: readonly PublisherInput<unknown>[]): Mono<void> {\n if (sources.length === 0) {\n return Mono.empty<void>();\n }\n if (sources.length === 1) {\n return new Mono(async function* (signal, context) {\n await drainPublisherInput(sources[0]!, signal, context);\n });\n }\n return new Mono(async function* (signal, context) {\n await Promise.all(completionTasks(sources, signal, context));\n });\n }\n\n /** Completes when all provided publishers complete and delays failures until all terminate. */\n public static whenDelayError(...sources: readonly PublisherInput<unknown>[]): Mono<void> {\n if (sources.length === 0) {\n return Mono.empty<void>();\n }\n if (sources.length === 1) {\n return new Mono(async function* (signal, context) {\n await drainPublisherInputAsCompositeError(sources[0]!, signal, context);\n });\n }\n return new Mono(async function* (signal, context) {\n const errors: unknown[] = [];\n await Promise.all(completionDelayErrorTasks(sources, signal, context, errors));\n if (errors.length > 0) {\n throw new CompositeError(errors);\n }\n });\n }\n\n /** Relays the first source to signal value, completion or error. */\n public static override firstWithSignal<T>(...sources: readonly PublisherInput<T>[]): Mono<T> {\n if (sources.length === 0) {\n return Mono.empty<T>();\n }\n if (sources.length === 1) {\n return Mono.from(sources[0]!);\n }\n return new Mono(signal => {\n const queue = new AsyncQueue<T>(signal);\n let settled = false;\n for (const source of sources) {\n void (async () => {\n try {\n const value = await firstValueFrom(Flux.from(source), signal);\n if (!settled) {\n settled = true;\n if (value !== undefined) {\n queue.push(value);\n }\n queue.complete();\n }\n } catch (error) {\n if (!settled) {\n settled = true;\n queue.error(error);\n }\n }\n })();\n }\n return queue;\n });\n }\n\n /** Relays the first non-empty value from the provided sources. */\n public static override firstWithValue<T>(...sources: readonly PublisherInput<T>[]): Mono<T> {\n if (sources.length === 0) {\n return Mono.empty<T>();\n }\n if (sources.length === 1) {\n return Mono.from(sources[0]!);\n }\n return new Mono(signal => {\n const queue = new AsyncQueue<T>(signal);\n let remaining = sources.length;\n const errors: unknown[] = [];\n for (const source of sources) {\n void (async () => {\n try {\n const value = await firstValueFrom(Flux.from(source), signal);\n if (value !== undefined) {\n queue.push(value);\n queue.complete();\n } else {\n remaining -= 1;\n if (remaining === 0) {\n errors.length > 0 ? queue.error(new CompositeError(errors)) : queue.complete();\n }\n }\n } catch (error) {\n errors.push(error);\n remaining -= 1;\n if (remaining === 0) {\n queue.error(new CompositeError(errors));\n }\n }\n })();\n }\n return queue;\n });\n }\n\n /** Zips Monos by combining one value from each source. */\n public static override zip<T extends readonly unknown[], R = T>(\n sources: { [K in keyof T]: PublisherInput<T[K]> },\n combinator?: (values: T) => R\n ): Mono<R> {\n return Flux.zip(sources, combinator).next();\n }\n\n /** Zips Monos by combining one value from each source while delaying source failures. */\n public static zipDelayError<T extends readonly unknown[], R = T>(\n sources: { [K in keyof T]: PublisherInput<T[K]> },\n combinator?: (values: T) => R\n ): Mono<R> {\n const sourceCount = sources.length;\n if (sourceCount === 0) {\n return Mono.empty<R>();\n }\n if (sourceCount === 1) {\n return singleZipDelayError(sources[0]!, combinator);\n }\n return new Mono(async function* (signal, context) {\n const values = new Array<unknown>(sourceCount);\n const errors: unknown[] = [];\n const tasks = new Array<Promise<void>>(sourceCount);\n for (let index = 0; index < sourceCount; index += 1) {\n tasks[index] = (async () => {\n try {\n values[index] = await firstValueFrom(Flux.from(sources[index]!), signal);\n } catch (error) {\n errors.push(error);\n }\n })();\n }\n await Promise.all(tasks);\n if (errors.length > 0) {\n throw new CompositeError(errors);\n }\n for (let index = 0; index < sourceCount; index += 1) {\n if (values[index] === undefined) {\n return;\n }\n }\n const tuple = values as unknown as T;\n yield combinator ? combinator(tuple) : (tuple as unknown as R);\n });\n }\n\n /** Uses a resource for the duration of a derived Mono and cleans it up afterwards. */\n public static override using<T, D>(\n resourceSupplier: () => D,\n sourceFactory: (resource: D) => PublisherInput<T>,\n resourceCleanup?: (resource: D) => void\n ): Mono<T> {\n return Flux.using(resourceSupplier, sourceFactory, resourceCleanup).next();\n }\n\n /** Uses an asynchronously supplied resource and runs asynchronous cleanup publishers. */\n public static override usingWhen<T, D>(\n resourceSupplier: PublisherInput<D>,\n sourceFactory: (resource: D) => PublisherInput<T>,\n asyncComplete?: (resource: D) => PublisherInput<unknown>,\n asyncError?: (resource: D, error: unknown) => PublisherInput<unknown>,\n asyncCancel?: (resource: D) => PublisherInput<unknown>\n ): Mono<T> {\n return Flux.usingWhen(resourceSupplier, sourceFactory, asyncComplete, asyncError, asyncCancel).next();\n }\n\n /** Resolves to the Mono value, or undefined when empty. */\n public async block(): Promise<T | undefined> {\n return this.toPromise();\n }\n}\n\n/** Shared stateless empty Mono instance. */\nconst EMPTY_MONO = new Mono<never>(() => EMPTY_ITERABLE);\n\n/** Shared stateless never Mono instance. */\nconst NEVER_MONO = new Mono<never>(signal => neverIterable(signal));\n\n/** Zips one source without allocating multi-source coordination state. */\nfunction singleZipDelayError<T extends readonly unknown[], R>(\n source: PublisherInput<T[0]>,\n combinator: ((values: T) => R) | undefined\n): Mono<R> {\n return new Mono(async function* (signal) {\n let value: T[0] | undefined;\n try {\n value = await firstValueFrom(Flux.from(source), signal);\n } catch (error) {\n throw new CompositeError([error]);\n }\n if (value === undefined) {\n return;\n }\n const tuple = [value] as unknown as T;\n yield combinator ? combinator(tuple) : (tuple as unknown as R);\n });\n}\n\n/** Creates completion tasks for publishers whose values are ignored. */\nfunction completionTasks(\n sources: readonly PublisherInput<unknown>[],\n signal: AbortSignal,\n context: Context\n): Promise<void>[] {\n const tasks = new Array<Promise<void>>(sources.length);\n for (let index = 0; index < sources.length; index += 1) {\n tasks[index] = drainPublisherInput(sources[index]!, signal, context);\n }\n return tasks;\n}\n\n/** Creates completion tasks that collect failures until every publisher has terminated. */\nfunction completionDelayErrorTasks(\n sources: readonly PublisherInput<unknown>[],\n signal: AbortSignal,\n context: Context,\n errors: unknown[]\n): Promise<void>[] {\n const tasks = new Array<Promise<void>>(sources.length);\n for (let index = 0; index < sources.length; index += 1) {\n tasks[index] = drainPublisherInputDelayError(sources[index]!, signal, context, errors);\n }\n return tasks;\n}\n\n/** Consumes a publisher and ignores every value. */\nasync function drainPublisherInput(source: PublisherInput<unknown>, signal: AbortSignal, context: Context): Promise<void> {\n await drainPublisher(Flux.from(source), signal, context);\n}\n\n/** Consumes one publisher and wraps its failure like delayed-error composition. */\nasync function drainPublisherInputAsCompositeError(\n source: PublisherInput<unknown>,\n signal: AbortSignal,\n context: Context\n): Promise<void> {\n try {\n await drainPublisherInput(source, signal, context);\n } catch (error) {\n throw new CompositeError([error]);\n }\n}\n\n/** Consumes a publisher and records its failure instead of throwing immediately. */\nasync function drainPublisherInputDelayError(\n source: PublisherInput<unknown>,\n signal: AbortSignal,\n context: Context,\n errors: unknown[]\n): Promise<void> {\n try {\n await drainPublisherInput(source, signal, context);\n } catch (error) {\n errors.push(error);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/publisher/operators/aggregate.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAQzC,OAAO,QAAQ,qBAAqB,CAAC;IACjC,kEAAkE;IAClE,UAAU,IAAI,CAAC,CAAC;QACZ,2FAA2F;QAC3F,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAEhC,yFAAyF;QACzF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpC,0EAA0E;QAC1E,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAExE,2FAA2F;QAC3F,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5D,wFAAwF;QACxF,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvD,4EAA4E;QAC5E,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnE,yEAAyE;QACzE,WAAW,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAEzB,uEAAuE;QACvE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAEtB,uEAAuE;QACvE,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,qEAAqE;QACrE,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,qEAAqE;QACrE,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpC,iFAAiF;QACjF,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhB,uGAAuG;QACvG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElC,mGAAmG;QACnG,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5B;CACJ"}
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../../src/publisher/operators/aggregate.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAWzC,OAAO,QAAQ,qBAAqB,CAAC;IACjC,kEAAkE;IAClE,UAAU,IAAI,CAAC,CAAC;QACZ,2FAA2F;QAC3F,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAEhC,yFAAyF;QACzF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpC,0EAA0E;QAC1E,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAExE,2FAA2F;QAC3F,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5D,wFAAwF;QACxF,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEvD,4EAA4E;QAC5E,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnE,yEAAyE;QACzE,WAAW,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAEzB,uEAAuE;QACvE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAEtB,uEAAuE;QACvE,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,qEAAqE;QACrE,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,qEAAqE;QACrE,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpC,iFAAiF;QACjF,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhB,uGAAuG;QACvG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElC,mGAAmG;QACnG,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5B;CACJ"}
@@ -1,20 +1,21 @@
1
- import { isAsyncIterable } from "../../internal/iterable.js";
1
+ import { UNBOUNDED_DEMAND } from "../../core/demand.js";
2
2
  import { NoSuchElementError } from "../../errors/classes.js";
3
3
  import { AsyncQueue } from "../../internal/async-queue.js";
4
- import { collectIterable, countIterable } from "../../internal/iterable-terminal.js";
5
4
  import { Flux } from "../flux.js";
6
- import { Mono } from "../mono.js";
5
+ import { liftOneToOne } from "./lift.js";
6
+ import { liftBuffer } from "./buffer-lift.js";
7
+ import { NO_TERMINAL_VALUE, terminalMono } from "./terminal-mono.js";
7
8
  //#region src/publisher/operators/aggregate.ts
8
9
  /**
9
10
  * @packageDocumentation
10
11
  * Flux, Mono and operator implementation modules.
11
12
  */
12
13
  /** Sentinel used when a terminal operation completes without emitting. */
13
- var NO_VALUE = Symbol("no-value");
14
+ var NO_VALUE = NO_TERMINAL_VALUE;
14
15
  Flux.prototype.buffer = function buffer(size) {
15
16
  if (!Number.isInteger(size) || size <= 0) throw new RangeError("buffer size must be a strictly positive integer");
16
17
  const source = this;
17
- return new Flux(async function* (signal, context) {
18
+ return liftBuffer(source, async function* (signal, context) {
18
19
  let bucket = [];
19
20
  for await (const value of source.iterate(signal, context)) {
20
21
  bucket.push(value);
@@ -24,11 +25,11 @@ Flux.prototype.buffer = function buffer(size) {
24
25
  }
25
26
  }
26
27
  if (bucket.length > 0) yield bucket;
27
- });
28
+ }, size);
28
29
  };
29
30
  Flux.prototype.window = function window(size) {
30
31
  const buffers = this.buffer(size);
31
- return new Flux((signal, context) => {
32
+ return liftOneToOne(buffers, (signal, context) => {
32
33
  const queue = new AsyncQueue(signal);
33
34
  (async () => {
34
35
  try {
@@ -39,172 +40,164 @@ Flux.prototype.window = function window(size) {
39
40
  }
40
41
  })();
41
42
  return queue;
42
- });
43
+ }, () => ({ onNext: (values) => Flux.fromIterable(values) }));
43
44
  };
44
45
  Flux.prototype.scan = function scan(seedOrAccumulator, accumulator) {
45
46
  const source = this;
46
- return new Flux(async function* (signal, context) {
47
- if (accumulator) {
48
- let current = seedOrAccumulator;
47
+ if (accumulator) return new Flux(async function* (signal, context) {
48
+ let current = seedOrAccumulator;
49
+ yield current;
50
+ for await (const value of source.iterate(signal, context)) {
51
+ current = accumulator(current, value);
52
+ yield current;
53
+ }
54
+ });
55
+ const reduceValues = seedOrAccumulator;
56
+ return liftOneToOne(source, async function* (signal, context) {
57
+ let initialized = false;
58
+ let current;
59
+ for await (const value of source.iterate(signal, context)) if (!initialized) {
60
+ current = value;
61
+ initialized = true;
49
62
  yield current;
50
- for await (const value of source.iterate(signal, context)) {
51
- current = accumulator(current, value);
52
- yield current;
53
- }
54
63
  } else {
55
- let initialized = false;
56
- let current;
57
- const acc = seedOrAccumulator;
58
- for await (const value of source.iterate(signal, context)) if (!initialized) {
59
- current = value;
60
- initialized = true;
61
- yield current;
62
- } else {
63
- current = acc(current, value);
64
- yield current;
65
- }
64
+ current = reduceValues(current, value);
65
+ yield current;
66
66
  }
67
+ }, () => {
68
+ let initialized = false;
69
+ let current;
70
+ return {
71
+ /** Produces the next running accumulation. */
72
+ onNext(value) {
73
+ current = initialized ? reduceValues(current, value) : value;
74
+ initialized = true;
75
+ return current;
76
+ } };
67
77
  });
68
78
  };
69
79
  Flux.prototype.reduce = function reduce(seedOrAccumulator, accumulator) {
70
- return terminalMono(this, (values) => accumulator ? reduceSeed(values, seedOrAccumulator, accumulator) : reduceNoSeed(values, seedOrAccumulator));
80
+ if (accumulator) {
81
+ const seed = seedOrAccumulator;
82
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
83
+ let current = seed;
84
+ return {
85
+ /** Folds one source value into the seeded result. */
86
+ onNext(value) {
87
+ current = accumulator(current, value);
88
+ return false;
89
+ },
90
+ result: () => current
91
+ };
92
+ });
93
+ }
94
+ const reduceValues = seedOrAccumulator;
95
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
96
+ let initialized = false;
97
+ let current;
98
+ return {
99
+ /** Uses the first value as the seed and folds later values. */
100
+ onNext(value) {
101
+ current = initialized ? reduceValues(current, value) : value;
102
+ initialized = true;
103
+ return false;
104
+ },
105
+ result: () => initialized ? current : NO_VALUE
106
+ };
107
+ });
71
108
  };
72
109
  Flux.prototype.collectList = function collectList() {
73
- return terminalMono(this, collectIterable);
110
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
111
+ const values = [];
112
+ return {
113
+ /** Appends one value to the collected list. */
114
+ onNext(value) {
115
+ values.push(value);
116
+ return false;
117
+ },
118
+ result: () => values
119
+ };
120
+ });
74
121
  };
75
122
  Flux.prototype.count = function count() {
76
- return terminalMono(this, countIterable);
123
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
124
+ let count = 0;
125
+ return {
126
+ /** Counts one source value. */
127
+ onNext() {
128
+ count += 1;
129
+ return false;
130
+ },
131
+ result: () => count
132
+ };
133
+ });
77
134
  };
78
135
  Flux.prototype.any = function any(predicate) {
79
- return terminalMono(this, (values) => anyValue(values, predicate));
136
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
137
+ let matched = false;
138
+ return {
139
+ /** Tests one value and finishes on the first match. */
140
+ onNext(value) {
141
+ matched = predicate(value);
142
+ return matched;
143
+ },
144
+ result: () => matched
145
+ };
146
+ });
80
147
  };
81
148
  Flux.prototype.all = function all(predicate) {
82
- return terminalMono(this, (values) => allValue(values, predicate));
149
+ return terminalMono(this, UNBOUNDED_DEMAND, () => {
150
+ let matched = true;
151
+ return {
152
+ /** Tests one value and finishes on the first mismatch. */
153
+ onNext(value) {
154
+ matched = predicate(value);
155
+ return !matched;
156
+ },
157
+ result: () => matched
158
+ };
159
+ });
83
160
  };
84
161
  Flux.prototype.hasElement = function hasElement(value) {
85
162
  return this.any((next) => Object.is(next, value));
86
163
  };
87
164
  Flux.prototype.next = function next() {
88
- return terminalMono(this, firstValue);
165
+ return terminalMono(this, 1, () => {
166
+ let result = NO_VALUE;
167
+ return {
168
+ /** Captures the first value and finishes immediately. */
169
+ onNext(value) {
170
+ result = value;
171
+ return true;
172
+ },
173
+ result: () => result
174
+ };
175
+ });
89
176
  };
90
177
  Flux.prototype.single = function single(defaultValue) {
91
178
  const hasDefault = arguments.length > 0;
92
- return terminalMono(this, (values) => singleValue(values, false, hasDefault, defaultValue));
179
+ return singleTerminal(this, false, hasDefault, defaultValue);
93
180
  };
94
181
  Flux.prototype.singleOrEmpty = function singleOrEmpty() {
95
- return terminalMono(this, (values) => singleValue(values, true));
182
+ return singleTerminal(this, true, false);
96
183
  };
97
- /** Creates a Mono from a terminal iterable computation while preserving sync sources. */
98
- function terminalMono(source, evaluate) {
99
- return new Mono((signal, context) => {
100
- const values = source.iterate(signal, context);
101
- return isAsyncIterable(values) ? emitAsync(() => evaluate(values)) : emitSync(() => evaluate(values));
184
+ /** Creates a bounded terminal Mono that validates a source has at most one value. */
185
+ function singleTerminal(source, emptyIsAllowed, hasDefault = false, defaultValue) {
186
+ return terminalMono(source, 2, () => {
187
+ let seen = false;
188
+ let value;
189
+ return {
190
+ /** Captures one value and rejects a second source value. */
191
+ onNext(next) {
192
+ if (seen) throw new Error("Source emitted more than one item");
193
+ seen = true;
194
+ value = next;
195
+ return false;
196
+ },
197
+ result: () => singleResult(seen ? value : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue)
198
+ };
102
199
  });
103
200
  }
104
- /** Emits a terminal sync value unless it represents an empty Mono. */
105
- function emitSync(producer) {
106
- return (function* () {
107
- const value = producer();
108
- if (value !== NO_VALUE) yield value;
109
- })();
110
- }
111
- /** Emits a terminal async value unless it represents an empty Mono. */
112
- function emitAsync(producer) {
113
- return (async function* () {
114
- const value = await producer();
115
- if (value !== NO_VALUE) yield value;
116
- })();
117
- }
118
- /** Reduces values with an explicit seed. */
119
- function reduceSeed(values, seed, accumulator) {
120
- if (isAsyncIterable(values)) return (async () => {
121
- let current = seed;
122
- for await (const value of values) current = accumulator(current, value);
123
- return current;
124
- })();
125
- let current = seed;
126
- for (const value of values) current = accumulator(current, value);
127
- return current;
128
- }
129
- /** Reduces values using the first value as the seed. */
130
- function reduceNoSeed(values, accumulator) {
131
- if (isAsyncIterable(values)) return (async () => {
132
- let initialized = false;
133
- let current;
134
- for await (const value of values) {
135
- current = initialized ? accumulator(current, value) : value;
136
- initialized = true;
137
- }
138
- return initialized ? current : NO_VALUE;
139
- })();
140
- let initialized = false;
141
- let current;
142
- for (const value of values) {
143
- current = initialized ? accumulator(current, value) : value;
144
- initialized = true;
145
- }
146
- return initialized ? current : NO_VALUE;
147
- }
148
- /** Returns true when any value matches the predicate. */
149
- function anyValue(values, predicate) {
150
- if (isAsyncIterable(values)) return (async () => {
151
- for await (const value of values) if (predicate(value)) return true;
152
- return false;
153
- })();
154
- for (const value of values) if (predicate(value)) return true;
155
- return false;
156
- }
157
- /** Returns true when every value matches the predicate. */
158
- function allValue(values, predicate) {
159
- if (isAsyncIterable(values)) return (async () => {
160
- for await (const value of values) if (!predicate(value)) return false;
161
- return true;
162
- })();
163
- for (const value of values) if (!predicate(value)) return false;
164
- return true;
165
- }
166
- /** Returns the first value and closes the source iterator early. */
167
- function firstValue(values) {
168
- if (isAsyncIterable(values)) return (async () => {
169
- const iterator = values[Symbol.asyncIterator]();
170
- try {
171
- const next = await iterator.next();
172
- return next.done ? NO_VALUE : next.value;
173
- } finally {
174
- await iterator.return?.();
175
- }
176
- })();
177
- const iterator = values[Symbol.iterator]();
178
- try {
179
- const next = iterator.next();
180
- return next.done ? NO_VALUE : next.value;
181
- } finally {
182
- iterator.return?.();
183
- }
184
- }
185
- /** Returns the only value, a default value or the empty sentinel. */
186
- function singleValue(values, emptyIsAllowed, hasDefault = false, defaultValue) {
187
- if (isAsyncIterable(values)) return (async () => singleResult(await collectSingle(values), emptyIsAllowed, hasDefault, defaultValue))();
188
- let seen = false;
189
- let result;
190
- for (const value of values) {
191
- if (seen) throw new Error("Source emitted more than one item");
192
- seen = true;
193
- result = value;
194
- }
195
- return singleResult(seen ? result : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue);
196
- }
197
- /** Collects exactly one async value or returns the empty sentinel. */
198
- async function collectSingle(values) {
199
- let seen = false;
200
- let result;
201
- for await (const value of values) {
202
- if (seen) throw new Error("Source emitted more than one item");
203
- seen = true;
204
- result = value;
205
- }
206
- return seen ? result : NO_VALUE;
207
- }
208
201
  /** Resolves single-value empty/default behavior. */
209
202
  function singleResult(value, emptyIsAllowed, hasDefault, defaultValue) {
210
203
  if (value !== NO_VALUE) return value;
@@ -1 +1 @@
1
- {"version":3,"file":"aggregate.js","names":[],"sources":["../../../src/publisher/operators/aggregate.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Flux, Mono and operator implementation modules.\n */\nimport {NoSuchElementError} from \"@/errors/classes.js\";\nimport {AsyncQueue} from \"@/internal/async-queue.js\";\nimport {type AnyIterable, isAsyncIterable} from \"@/internal/iterable.js\";\nimport {collectIterable, countIterable} from \"@/internal/iterable-terminal.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {Mono} from \"@/publisher/mono.js\";\n\n/** Sentinel used when a terminal operation completes without emitting. */\nconst NO_VALUE = Symbol(\"no-value\");\n\n/** Terminal operation result that may represent an empty Mono. */\ntype MaybeValue<T> = T | typeof NO_VALUE;\n\ndeclare module \"@/publisher/flux.js\" {\n /** Aggregate and terminal count-style operators added to Flux. */\n interface Flux<T> {\n /** Groups source values into arrays of `size`, with a final partial buffer when needed. */\n buffer(size: number): Flux<T[]>;\n\n /** Splits source values into finite Flux windows containing up to `size` values each. */\n window(size: number): Flux<Flux<T>>;\n\n /** Emits the seed and each accumulated value produced from the source. */\n scan<R>(seed: R, accumulator: (accumulated: R, value: T) => R): Flux<R>;\n\n /** Emits running accumulated values, using the first source value as the initial state. */\n scan(accumulator: (accumulated: T, value: T) => T): Flux<T>;\n\n /** Reduces source values into one value, using the first value as the initial state. */\n reduce(accumulator: (left: T, right: T) => T): Mono<T>;\n\n /** Reduces source values into one value starting from the provided seed. */\n reduce<R>(seed: R, accumulator: (left: R, right: T) => R): Mono<R>;\n\n /** Collects all source values into an array emitted after completion. */\n collectList(): Mono<T[]>;\n\n /** Counts source values and emits the final count after completion. */\n count(): Mono<number>;\n\n /** Emits true when at least one source value matches the predicate. */\n any(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true only when every source value matches the predicate. */\n all(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true when a source value matches `value` by `Object.is`. */\n hasElement(value: T): Mono<boolean>;\n\n /** Emits the first source value, or completes empty when the source has none. */\n next(): Mono<T>;\n\n /** Emits the only source value, an optional default for empty sources, or fails on multiple values. */\n single(defaultValue?: T): Mono<T>;\n\n /** Emits the only source value, completes empty for empty sources, or fails on multiple values. */\n singleOrEmpty(): Mono<T>;\n }\n}\n\nFlux.prototype.buffer = function buffer<T>(this: Flux<T>, size: number): Flux<T[]> {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(\"buffer size must be a strictly positive integer\");\n }\n const source = this;\n return new Flux(async function* (signal, context) {\n let bucket: T[] = [];\n for await (const value of source.iterate(signal, context)) {\n bucket.push(value);\n if (bucket.length === size) {\n yield bucket;\n bucket = [];\n }\n }\n if (bucket.length > 0) {\n yield bucket;\n }\n });\n};\n\nFlux.prototype.window = function window<T>(this: Flux<T>, size: number): Flux<Flux<T>> {\n const buffers = this.buffer(size);\n return new Flux((signal, context) => {\n const queue = new AsyncQueue<Flux<T>>(signal);\n void (async () => {\n try {\n for await (const values of buffers.iterate(signal, context)) {\n queue.push(Flux.fromIterable(values));\n }\n queue.complete();\n } catch (error) {\n queue.error(error);\n }\n })();\n return queue;\n });\n};\n\nFlux.prototype.scan = function scan<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((accumulated: T, value: T) => T),\n accumulator?: (accumulated: R, value: T) => R\n): Flux<R | T> {\n const source = this;\n return new Flux(async function* (signal, context) {\n if (accumulator) {\n let current = seedOrAccumulator as R;\n yield current;\n for await (const value of source.iterate(signal, context)) {\n current = accumulator(current, value);\n yield current;\n }\n } else {\n let initialized = false;\n let current: T | undefined;\n const acc = seedOrAccumulator as (accumulated: T, value: T) => T;\n for await (const value of source.iterate(signal, context)) {\n if (!initialized) {\n current = value;\n initialized = true;\n yield current;\n } else {\n current = acc(current as T, value);\n yield current;\n }\n }\n }\n });\n};\n\nFlux.prototype.reduce = function reduce<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((left: T, right: T) => T),\n accumulator?: (left: R, right: T) => R\n): Mono<R | T> {\n return terminalMono(this, values => accumulator\n ? reduceSeed(values, seedOrAccumulator as R, accumulator)\n : reduceNoSeed(values, seedOrAccumulator as (left: T, right: T) => T));\n};\n\nFlux.prototype.collectList = function collectList<T>(this: Flux<T>): Mono<T[]> {\n return terminalMono(this, collectIterable);\n};\n\nFlux.prototype.count = function count<T>(this: Flux<T>): Mono<number> {\n return terminalMono(this, countIterable);\n};\n\nFlux.prototype.any = function any<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, values => anyValue(values, predicate));\n};\n\nFlux.prototype.all = function all<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, values => allValue(values, predicate));\n};\n\nFlux.prototype.hasElement = function hasElement<T>(this: Flux<T>, value: T): Mono<boolean> {\n return this.any(next => Object.is(next, value));\n};\n\nFlux.prototype.next = function next<T>(this: Flux<T>): Mono<T> {\n return terminalMono(this, firstValue);\n};\n\nFlux.prototype.single = function single<T>(this: Flux<T>, defaultValue?: T): Mono<T> {\n const hasDefault = arguments.length > 0;\n return terminalMono(this, values => singleValue(values, false, hasDefault, defaultValue));\n};\n\nFlux.prototype.singleOrEmpty = function singleOrEmpty<T>(this: Flux<T>): Mono<T> {\n return terminalMono(this, values => singleValue<T>(values, true));\n};\n\n/** Creates a Mono from a terminal iterable computation while preserving sync sources. */\nfunction terminalMono<T, R>(\n source: Flux<T>,\n evaluate: (values: AnyIterable<T>) => MaybeValue<R> | Promise<MaybeValue<R>>\n): Mono<R> {\n return new Mono((signal, context) => {\n const values = source.iterate(signal, context);\n return isAsyncIterable<T>(values) ? emitAsync(() => evaluate(values)) : emitSync(() => evaluate(values) as MaybeValue<R>);\n });\n}\n\n/** Emits a terminal sync value unless it represents an empty Mono. */\nfunction emitSync<T>(producer: () => MaybeValue<T>): Iterable<T> {\n return (function* () {\n const value = producer();\n if (value !== NO_VALUE) {\n yield value as T;\n }\n })();\n}\n\n/** Emits a terminal async value unless it represents an empty Mono. */\nfunction emitAsync<T>(producer: () => MaybeValue<T> | Promise<MaybeValue<T>>): AsyncIterable<T> {\n return (async function* () {\n const value = await producer();\n if (value !== NO_VALUE) {\n yield value as T;\n }\n })();\n}\n\n/** Reduces values with an explicit seed. */\nfunction reduceSeed<T, R>(\n values: AnyIterable<T>,\n seed: R,\n accumulator: (left: R, right: T) => R\n): R | Promise<R> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n let current = seed;\n for await (const value of values) {\n current = accumulator(current, value);\n }\n return current;\n })();\n }\n let current = seed;\n for (const value of values) {\n current = accumulator(current, value);\n }\n return current;\n}\n\n/** Reduces values using the first value as the seed. */\nfunction reduceNoSeed<T>(\n values: AnyIterable<T>,\n accumulator: (left: T, right: T) => T\n): MaybeValue<T> | Promise<MaybeValue<T>> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n let initialized = false;\n let current: T | undefined;\n for await (const value of values) {\n current = initialized ? accumulator(current as T, value) : value;\n initialized = true;\n }\n return initialized ? current as T : NO_VALUE;\n })();\n }\n let initialized = false;\n let current: T | undefined;\n for (const value of values) {\n current = initialized ? accumulator(current as T, value) : value;\n initialized = true;\n }\n return initialized ? current as T : NO_VALUE;\n}\n\n/** Returns true when any value matches the predicate. */\nfunction anyValue<T>(values: AnyIterable<T>, predicate: (value: T) => boolean): boolean | Promise<boolean> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n for await (const value of values) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n })();\n }\n for (const value of values) {\n if (predicate(value)) {\n return true;\n }\n }\n return false;\n}\n\n/** Returns true when every value matches the predicate. */\nfunction allValue<T>(values: AnyIterable<T>, predicate: (value: T) => boolean): boolean | Promise<boolean> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n for await (const value of values) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n })();\n }\n for (const value of values) {\n if (!predicate(value)) {\n return false;\n }\n }\n return true;\n}\n\n/** Returns the first value and closes the source iterator early. */\nfunction firstValue<T>(values: AnyIterable<T>): MaybeValue<T> | Promise<MaybeValue<T>> {\n if (isAsyncIterable<T>(values)) {\n return (async () => {\n const iterator = values[Symbol.asyncIterator]();\n try {\n const next = await iterator.next();\n return next.done ? NO_VALUE : next.value;\n } finally {\n await iterator.return?.();\n }\n })();\n }\n const iterator = values[Symbol.iterator]();\n try {\n const next = iterator.next();\n return next.done ? NO_VALUE : next.value;\n } finally {\n iterator.return?.();\n }\n}\n\n/** Returns the only value, a default value or the empty sentinel. */\nfunction singleValue<T>(\n values: AnyIterable<T>,\n emptyIsAllowed: boolean,\n hasDefault = false,\n defaultValue?: T\n): MaybeValue<T> | Promise<MaybeValue<T>> {\n if (isAsyncIterable<T>(values)) {\n return (async () => singleResult(await collectSingle(values), emptyIsAllowed, hasDefault, defaultValue))();\n }\n let seen = false;\n let result: T | undefined;\n for (const value of values) {\n if (seen) {\n throw new Error(\"Source emitted more than one item\");\n }\n seen = true;\n result = value;\n }\n return singleResult(seen ? result as T : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue);\n}\n\n/** Collects exactly one async value or returns the empty sentinel. */\nasync function collectSingle<T>(values: AsyncIterable<T>): Promise<MaybeValue<T>> {\n let seen = false;\n let result: T | undefined;\n for await (const value of values) {\n if (seen) {\n throw new Error(\"Source emitted more than one item\");\n }\n seen = true;\n result = value;\n }\n return seen ? result as T : NO_VALUE;\n}\n\n/** Resolves single-value empty/default behavior. */\nfunction singleResult<T>(\n value: MaybeValue<T>,\n emptyIsAllowed: boolean,\n hasDefault: boolean,\n defaultValue: T | undefined\n): MaybeValue<T> {\n if (value !== NO_VALUE) {\n return value;\n }\n if (hasDefault) {\n return defaultValue as T;\n }\n if (emptyIsAllowed) {\n return NO_VALUE;\n }\n throw new NoSuchElementError();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"aggregate.js","names":[],"sources":["../../../src/publisher/operators/aggregate.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Flux, Mono and operator implementation modules.\n */\nimport {NoSuchElementError} from \"@/errors/classes.js\";\nimport {UNBOUNDED_DEMAND} from \"@/core/demand.js\";\nimport {AsyncQueue} from \"@/internal/async-queue.js\";\nimport {Flux} from \"@/publisher/flux.js\";\nimport {Mono} from \"@/publisher/mono.js\";\nimport {liftBuffer} from \"@/publisher/operators/buffer-lift.js\";\nimport {liftOneToOne} from \"@/publisher/operators/lift.js\";\nimport {NO_TERMINAL_VALUE, terminalMono} from \"@/publisher/operators/terminal-mono.js\";\n\n/** Sentinel used when a terminal operation completes without emitting. */\nconst NO_VALUE: typeof NO_TERMINAL_VALUE = NO_TERMINAL_VALUE;\n\n/** Terminal operation result that may represent an empty Mono. */\ntype MaybeValue<T> = T | typeof NO_VALUE;\n\ndeclare module \"@/publisher/flux.js\" {\n /** Aggregate and terminal count-style operators added to Flux. */\n interface Flux<T> {\n /** Groups source values into arrays of `size`, with a final partial buffer when needed. */\n buffer(size: number): Flux<T[]>;\n\n /** Splits source values into finite Flux windows containing up to `size` values each. */\n window(size: number): Flux<Flux<T>>;\n\n /** Emits the seed and each accumulated value produced from the source. */\n scan<R>(seed: R, accumulator: (accumulated: R, value: T) => R): Flux<R>;\n\n /** Emits running accumulated values, using the first source value as the initial state. */\n scan(accumulator: (accumulated: T, value: T) => T): Flux<T>;\n\n /** Reduces source values into one value, using the first value as the initial state. */\n reduce(accumulator: (left: T, right: T) => T): Mono<T>;\n\n /** Reduces source values into one value starting from the provided seed. */\n reduce<R>(seed: R, accumulator: (left: R, right: T) => R): Mono<R>;\n\n /** Collects all source values into an array emitted after completion. */\n collectList(): Mono<T[]>;\n\n /** Counts source values and emits the final count after completion. */\n count(): Mono<number>;\n\n /** Emits true when at least one source value matches the predicate. */\n any(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true only when every source value matches the predicate. */\n all(predicate: (value: T) => boolean): Mono<boolean>;\n\n /** Emits true when a source value matches `value` by `Object.is`. */\n hasElement(value: T): Mono<boolean>;\n\n /** Emits the first source value, or completes empty when the source has none. */\n next(): Mono<T>;\n\n /** Emits the only source value, an optional default for empty sources, or fails on multiple values. */\n single(defaultValue?: T): Mono<T>;\n\n /** Emits the only source value, completes empty for empty sources, or fails on multiple values. */\n singleOrEmpty(): Mono<T>;\n }\n}\n\nFlux.prototype.buffer = function buffer<T>(this: Flux<T>, size: number): Flux<T[]> {\n if (!Number.isInteger(size) || size <= 0) {\n throw new RangeError(\"buffer size must be a strictly positive integer\");\n }\n const source = this;\n return liftBuffer(\n source,\n async function* (signal, context) {\n let bucket: T[] = [];\n for await (const value of source.iterate(signal, context)) {\n bucket.push(value);\n if (bucket.length === size) {\n yield bucket;\n bucket = [];\n }\n }\n if (bucket.length > 0) {\n yield bucket;\n }\n },\n size\n );\n};\n\nFlux.prototype.window = function window<T>(this: Flux<T>, size: number): Flux<Flux<T>> {\n const buffers = this.buffer(size);\n return liftOneToOne(\n buffers,\n (signal, context) => {\n const queue = new AsyncQueue<Flux<T>>(signal);\n void (async () => {\n try {\n for await (const values of buffers.iterate(signal, context)) {\n queue.push(Flux.fromIterable(values));\n }\n queue.complete();\n } catch (error) {\n queue.error(error);\n }\n })();\n return queue;\n },\n () => ({onNext: values => Flux.fromIterable(values)})\n );\n};\n\nFlux.prototype.scan = function scan<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((accumulated: T, value: T) => T),\n accumulator?: (accumulated: R, value: T) => R\n): Flux<R | T> {\n const source = this;\n if (accumulator) {\n return new Flux(async function* (signal, context) {\n let current = seedOrAccumulator as R;\n yield current;\n for await (const value of source.iterate(signal, context)) {\n current = accumulator(current, value);\n yield current;\n }\n });\n }\n const reduceValues = seedOrAccumulator as (accumulated: T, value: T) => T;\n return liftOneToOne(\n source,\n async function* (signal, context) {\n let initialized = false;\n let current: T | undefined;\n for await (const value of source.iterate(signal, context)) {\n if (!initialized) {\n current = value;\n initialized = true;\n yield current;\n } else {\n current = reduceValues(current as T, value);\n yield current;\n }\n }\n },\n () => {\n let initialized = false;\n let current: T | undefined;\n return {\n /** Produces the next running accumulation. */\n onNext(value: T) {\n current = initialized ? reduceValues(current as T, value) : value;\n initialized = true;\n return current;\n }\n };\n }\n );\n};\n\nFlux.prototype.reduce = function reduce<T, R>(\n this: Flux<T>,\n seedOrAccumulator: R | ((left: T, right: T) => T),\n accumulator?: (left: R, right: T) => R\n): Mono<R | T> {\n if (accumulator) {\n const seed = seedOrAccumulator as R;\n return terminalMono<T, R | T>(this, UNBOUNDED_DEMAND, () => {\n let current = seed;\n return {\n /** Folds one source value into the seeded result. */\n onNext(value) {\n current = accumulator(current, value);\n return false;\n },\n result: () => current\n };\n });\n }\n const reduceValues = seedOrAccumulator as (left: T, right: T) => T;\n return terminalMono<T, R | T>(this, UNBOUNDED_DEMAND, () => {\n let initialized = false;\n let current: T | undefined;\n return {\n /** Uses the first value as the seed and folds later values. */\n onNext(value) {\n current = initialized ? reduceValues(current as T, value) : value;\n initialized = true;\n return false;\n },\n result: () => initialized ? current as T : NO_VALUE\n };\n });\n};\n\nFlux.prototype.collectList = function collectList<T>(this: Flux<T>): Mono<T[]> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n const values: T[] = [];\n return {\n /** Appends one value to the collected list. */\n onNext(value) {\n values.push(value);\n return false;\n },\n result: () => values\n };\n });\n};\n\nFlux.prototype.count = function count<T>(this: Flux<T>): Mono<number> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n let count = 0;\n return {\n /** Counts one source value. */\n onNext() {\n count += 1;\n return false;\n },\n result: () => count\n };\n });\n};\n\nFlux.prototype.any = function any<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n let matched = false;\n return {\n /** Tests one value and finishes on the first match. */\n onNext(value) {\n matched = predicate(value);\n return matched;\n },\n result: () => matched\n };\n });\n};\n\nFlux.prototype.all = function all<T>(this: Flux<T>, predicate: (value: T) => boolean): Mono<boolean> {\n return terminalMono(this, UNBOUNDED_DEMAND, () => {\n let matched = true;\n return {\n /** Tests one value and finishes on the first mismatch. */\n onNext(value) {\n matched = predicate(value);\n return !matched;\n },\n result: () => matched\n };\n });\n};\n\nFlux.prototype.hasElement = function hasElement<T>(this: Flux<T>, value: T): Mono<boolean> {\n return this.any(next => Object.is(next, value));\n};\n\nFlux.prototype.next = function next<T>(this: Flux<T>): Mono<T> {\n return terminalMono<T, T>(this, 1, () => {\n let result: MaybeValue<T> = NO_VALUE;\n return {\n /** Captures the first value and finishes immediately. */\n onNext(value) {\n result = value;\n return true;\n },\n result: () => result\n };\n });\n};\n\nFlux.prototype.single = function single<T>(this: Flux<T>, defaultValue?: T): Mono<T> {\n const hasDefault = arguments.length > 0;\n return singleTerminal(this, false, hasDefault, defaultValue);\n};\n\nFlux.prototype.singleOrEmpty = function singleOrEmpty<T>(this: Flux<T>): Mono<T> {\n return singleTerminal(this, true, false);\n};\n\n/** Creates a bounded terminal Mono that validates a source has at most one value. */\nfunction singleTerminal<T>(\n source: Flux<T>,\n emptyIsAllowed: boolean,\n hasDefault = false,\n defaultValue?: T\n): Mono<T> {\n return terminalMono<T, T>(source, 2, () => {\n let seen = false;\n let value: T | undefined;\n return {\n /** Captures one value and rejects a second source value. */\n onNext(next) {\n if (seen) {\n throw new Error(\"Source emitted more than one item\");\n }\n seen = true;\n value = next;\n return false;\n },\n result: () => singleResult(seen ? value as T : NO_VALUE, emptyIsAllowed, hasDefault, defaultValue)\n };\n });\n}\n\n/** Resolves single-value empty/default behavior. */\nfunction singleResult<T>(\n value: MaybeValue<T>,\n emptyIsAllowed: boolean,\n hasDefault: boolean,\n defaultValue: T | undefined\n): MaybeValue<T> {\n if (value !== NO_VALUE) {\n return value;\n }\n if (hasDefault) {\n return defaultValue as T;\n }\n if (emptyIsAllowed) {\n return NO_VALUE;\n }\n throw new NoSuchElementError();\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Flux } from "../flux.js";
2
+ import type { SourceFactory } from "../types.js";
3
+ /** Creates a fixed-size buffer operator that scales downstream demand upstream. */
4
+ export declare function liftBuffer<T>(source: Flux<T>, sourceFactory: SourceFactory<T[]>, size: number): Flux<T[]>;
5
+ //# sourceMappingURL=buffer-lift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffer-lift.d.ts","sourceRoot":"","sources":["../../../src/publisher/operators/buffer-lift.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,IAAI,EAAC,MAAM,qBAAqB,CAAC;AAEzC,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAKxD,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAEzG"}