import { AsyncIterableX } from '../asynciterablex.js'; import { MonoTypeOperatorAsyncFunction } from '../../interfaces.js'; /** @ignore */ export class WithAbortAsyncIterable extends AsyncIterableX { private _source: AsyncIterable; private _signal: AbortSignal; constructor(source: AsyncIterable, signal: AbortSignal) { super(); this._source = source; this._signal = signal; } withAbort(signal: AbortSignal) { return new WithAbortAsyncIterable(this._source, signal); } [Symbol.asyncIterator](): AsyncIterator { // @ts-ignore return this._source[Symbol.asyncIterator](this._signal); } } /** * Wraps the existing async-iterable sequence with an abort signal for cancellation. * * @template TSource The type of the elements in the source sequence. * @param {AbortSignal} signal The abort signal used for cancellation. * @returns {MonoTypeOperatorAsyncFunction} An async-iterable that can be cancelled by the abort signal. */ export function withAbort(signal: AbortSignal): MonoTypeOperatorAsyncFunction { return function withAbortOperatorFunction( source: AsyncIterable ): AsyncIterableX { return new WithAbortAsyncIterable(source, signal); }; } /** * Wraps an existing async-iterable with a new async-iterable which support cancellation. * * @template TSource The type of the elements in the source sequence. * @param {AsyncIterable} source The source sequence to wrap with the abort signal. * @param {AbortSignal} [signal] The abort signal used for cancellation. * @returns {AsyncIterable} The source sequence wrapped with an abort signal for cancellation. */ export function wrapWithAbort( source: AsyncIterable, signal?: AbortSignal ): AsyncIterable { return signal ? new WithAbortAsyncIterable(source, signal) : source; }