import type { PromiseOrValue } from "../../jsutils/PromiseOrValue.mjs"; interface QueueExecutorOptions { push: (item: PromiseOrValue) => PromiseOrValue; stop: (reason?: unknown) => PromiseOrValue; onStop: (cleanup: (reason?: unknown) => PromiseOrValue) => void; started: Promise; } /** * A Queue is a lightweight async-generator primitive inspired by Brian Kim's * Repeater (https://repeater.js.org, https://github.com/repeaterjs/repeater). * The ergonomics are similar, but this implementation favors clarity over * performance and gives producers flexibility to remain lazy, become eager, or * live somewhere in between. * * The constructor takes an executor function and an optional `initialCapacity`. * Executors receive `{ push, stop, onStop, started }` and may return `void` or * a promise if they perform asynchronous setup. They call `push` whenever * another item is ready, call `stop` when no more values will be produced * (optionally supplying an error), register stop-time cleanup via `onStop`, * and await `started` when setup should run only after iteration begins. * Because `push`, `stop`, and `onStop` are plain functions, executors can * hoist them into outside scopes or pass them to helpers. If the executor * throws or its returned promise rejects, the queue treats it as `stop(error)` * and propagates the failure. * * The `initialCapacity` argument (default `1`) governs backpressure. Capacity * is the maximum number of buffered items allowed before a push must wait. * When the backlog reaches capacity, `push` returns a promise that settles * once consumption releases space; otherwise it returns `undefined`. Setting * capacity to `1` yields a fully lazy queue (every push waits unless a prior * item has been consumed); higher capacities buffer that many items eagerly. * Capacity can be changed later via `setCapacity` and observed via * `getCapacity`. * * `subscribe(reducer)` returns an async generator whose batches feed a generator * of settled values into the reducer; whatever the reducer returns (other than * `undefined`) becomes the yielded value for that batch. Calling `return()` on * the subscription settles pending `next` calls thanks to `withConcurrent`, * providing direct abort semantics rather than leaving `next()` suspended. * * 'forEachBatch(reducer)` is a convenience method that subscribes with the * given reducer and runs it for each batch until the queue stops. * * Producers can stay lazy by awaiting `started`, using zero capacity, and * awaiting each `push`. Skipping those waits while raising capacity makes the * queue eager up to its configured limit. The `isStopped()` helper exposes * whether the queue has fully stopped, which can be useful when the reducer * function actually performs external work and wants to bail early without * awaiting another `next`. * * @internal */ export declare class Queue { private _capacity; private _backlog; private _waiters; private _entries; private _isStopped; private _stopRequested; private _stopCleanupCallbacks; private _stopCompletion; private _batchRequests; private _resolveStarted; constructor(executor: ({ push, stop, onStop, started, }: QueueExecutorOptions) => PromiseOrValue, initialCapacity?: number); subscribe(reducer?: (generator: Generator) => PromiseOrValue): AsyncGenerator; cancel(): PromiseOrValue; abort(reason?: unknown): PromiseOrValue; forEachBatch(reducer: (generator: Generator) => PromiseOrValue): Promise; setCapacity(nextCapacity: number): void; getCapacity(): number; isStopped(): boolean; private _normalizeCapacity; private _flush; private _reserve; private _release; private _onStop; private _runStopCleanup; private _iteratorLoop; private _waitForNextBatch; private _push; private _terminate; private _stop; private _deliverBatchIfReady; private _drainBatch; } export {};