UNPKG

2.08 kBJavaScriptView Raw
1import { AsyncIterableX } from './asynciterablex';
2import { sleep } from './_sleep';
3import { throwIfAborted } from '../aborterror';
4class GenerateTimeAsyncIterable extends AsyncIterableX {
5 constructor(initialState, condition, iterate, resultSelector, timeSelector) {
6 super();
7 this._initialState = initialState;
8 this._condition = condition;
9 this._iterate = iterate;
10 this._resultSelector = resultSelector;
11 this._timeSelector = timeSelector;
12 }
13 async *[Symbol.asyncIterator](signal) {
14 throwIfAborted(signal);
15 for (let i = this._initialState; await this._condition(i, signal); i = await this._iterate(i, signal)) {
16 const time = await this._timeSelector(i, signal);
17 await sleep(time, signal);
18 yield await this._resultSelector(i, signal);
19 }
20 }
21}
22/**
23 * Generates an async-iterable sequence by running a time-based state-driven loop producing the sequence's elements.
24 *
25 * @export
26 * @template TState The type of the state used in the generator loop.
27 * @template TResult The type of the elements in the produced sequence.
28 * @param {TState} initialState The initial state.
29 * @param {((value: TState, signal?: AbortSignal) => boolean | Promise<boolean>)} condition Condition to terminate generation (upon returning false).
30 * @param {((value: TState, signal?: AbortSignal) => TState | Promise<TState>)} iterate Iteration step function.
31 * @param {((value: TState, signal?: AbortSignal) => TResult | Promise<TResult>)} resultSelector Selector function for results produced in
32 * the sequence.
33 * @param {((value: TState, signal?: AbortSignal) => number | Promise<number>)} timeSelector Selector function for how much time to wait.
34 * @returns {AsyncIterableX<TResult>} The generated async-iterable sequence.
35 */
36export function generateTime(initialState, condition, iterate, resultSelector, timeSelector) {
37 return new GenerateTimeAsyncIterable(initialState, condition, iterate, resultSelector, timeSelector);
38}
39
40//# sourceMappingURL=generatetime.mjs.map