import { AsyncIterableX } from '../asynciterablex.js'; import { create } from '../create.js'; import { OperatorAsyncFunction } from '../../interfaces.js'; import { throwIfAborted } from '../../aborterror.js'; class SharedAsyncIterable extends AsyncIterableX { private _it: AsyncIterator; constructor(it: AsyncIterator) { super(); this._it = { next(value) { return it.next(value); }, }; } [Symbol.asyncIterator](signal?: AbortSignal) { throwIfAborted(signal); return this._it; } } /** * Creates a buffer with a shared view over the source sequence, causing each iterator to fetch the next element * from the source sequence. * * @template TSource Source sequence element type. * @returns {OperatorAsyncFunction} Buffer enabling each enumerator to retrieve elements from the shared source sequence. */ export function share(): OperatorAsyncFunction; /** * Shares the source sequence within a selector function where each iterator can fetch the next element from the * source sequence. * * @template TSource Source sequence element type. * @template TResult Result sequence element type. * @param {(( * value: AsyncIterable, * signal?: AbortSignal * ) => AsyncIterable | Promise>)} [selector] Selector function with shared access * to the source sequence for each iterator. * @returns {OperatorAsyncFunction} Sequence resulting from applying the selector function to the * shared view over the source sequence. */ export function share( selector?: ( value: AsyncIterable, signal?: AbortSignal ) => AsyncIterable | Promise> ): OperatorAsyncFunction; /** * Shares the source sequence within a selector function where each iterator can fetch the next element from the * source sequence. * * @template TSource Source sequence element type. * @template TResult Result sequence element type. * @param {(( * value: AsyncIterable, * signal?: AbortSignal * ) => AsyncIterable | Promise>)} [selector] Selector function with shared access * to the source sequence for each iterator. * @returns {(OperatorAsyncFunction)} Sequence resulting from applying the selector function to the * shared view over the source sequence. */ export function share( selector?: ( value: AsyncIterable, signal?: AbortSignal ) => AsyncIterable | Promise> ): OperatorAsyncFunction { return function shareOperatorFunction( source: AsyncIterable ): AsyncIterableX { return selector ? create(async (signal) => { const it = await selector( new SharedAsyncIterable(source[Symbol.asyncIterator](signal)), signal ); return it[Symbol.asyncIterator](signal); }) : new SharedAsyncIterable(source[Symbol.asyncIterator]()); }; }