@reactivex/ix-es5-esm
Version:
The Interactive Extensions for JavaScript
60 lines (58 loc) • 2.92 kB
JavaScript
import { __asyncGenerator, __await, __extends, __generator } from "tslib";
import { AsyncIterableX } from './asynciterablex.js';
import { throwIfAborted } from '../aborterror.js';
var GenerateAsyncIterable = /** @class */ (function (_super) {
__extends(GenerateAsyncIterable, _super);
function GenerateAsyncIterable(initialState, condition, iterate, resultSelector) {
var _this = _super.call(this) || this;
_this._initialState = initialState;
_this._condition = condition;
_this._iterate = iterate;
_this._resultSelector = resultSelector;
return _this;
}
GenerateAsyncIterable.prototype[Symbol.asyncIterator] = function (signal) {
return __asyncGenerator(this, arguments, function _a() {
var i;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
throwIfAborted(signal);
i = this._initialState;
_b.label = 1;
case 1: return [4 /*yield*/, __await(this._condition(i, signal))];
case 2:
if (!_b.sent()) return [3 /*break*/, 8];
return [4 /*yield*/, __await(this._resultSelector(i, signal))];
case 3: return [4 /*yield*/, __await.apply(void 0, [_b.sent()])];
case 4: return [4 /*yield*/, _b.sent()];
case 5:
_b.sent();
_b.label = 6;
case 6: return [4 /*yield*/, __await(this._iterate(i, signal))];
case 7:
i = _b.sent();
return [3 /*break*/, 1];
case 8: return [2 /*return*/];
}
});
});
};
return GenerateAsyncIterable;
}(AsyncIterableX));
/**
* Generates an async-iterable sequence by running a state-driven loop producing the sequence's elements.
*
* @template TState The type of the state used in the generator loop.
* @template TResult The type of the elements in the produced sequence.
* @param {TState} initialState The initial state.
* @param {((value: TState, signal?: AbortSignal) => boolean | Promise<boolean>)} condition Condition to terminate generation (upon returning false).
* @param {((value: TState, signal?: AbortSignal) => TState | Promise<TState>)} iterate Iteration step function.
* @param {((value: TState, signal?: AbortSignal) => TResult | Promise<TResult>)} resultSelector Selector function for results produced in
* the sequence.
* @returns {AsyncIterableX<TResult>} The generated async-iterable sequence.
*/
export function generate(initialState, condition, iterate, resultSelector) {
return new GenerateAsyncIterable(initialState, condition, iterate, resultSelector);
}
//# sourceMappingURL=generate.js.map