1 | import { AsyncIterableX } from './asynciterablex';
|
2 | import { sleep } from './_sleep';
|
3 | import { throwIfAborted } from '../aborterror';
|
4 | class 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 | */
|
36 | export function generateTime(initialState, condition, iterate, resultSelector, timeSelector) {
|
37 | return new GenerateTimeAsyncIterable(initialState, condition, iterate, resultSelector, timeSelector);
|
38 | }
|
39 |
|
40 | //# sourceMappingURL=generatetime.mjs.map
|