@reactivex/ix-es5-esm
Version:
The Interactive Extensions for JavaScript
80 lines (78 loc) • 3.74 kB
JavaScript
import { __asyncGenerator, __await, __extends, __generator } from "tslib";
import { AsyncIterableX } from './asynciterablex.js';
import { identity } from '../util/identity.js';
import { wrapWithAbort } from './operators/withabort.js';
import { throwIfAborted } from '../aborterror.js';
import { safeRace } from '../util/safeRace.js';
// eslint-disable-next-line @typescript-eslint/no-empty-function
var NEVER_PROMISE = new Promise(function () { });
function wrapPromiseWithIndex(promise, index) {
return promise.then(function (value) { return ({ value: value, index: index }); });
}
/** @ignore */
var CombineLatestAsyncIterable = /** @class */ (function (_super) {
__extends(CombineLatestAsyncIterable, _super);
function CombineLatestAsyncIterable(sources) {
var _this = _super.call(this) || this;
_this._sources = sources;
return _this;
}
CombineLatestAsyncIterable.prototype[Symbol.asyncIterator] = function (signal) {
return __asyncGenerator(this, arguments, function _a() {
var length, iterators, nexts, hasValueAll, values, hasValues, active, i, iterator, next, _b, _c, value$, done$, index, iterator$;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
throwIfAborted(signal);
length = this._sources.length;
iterators = new Array(length);
nexts = new Array(length);
hasValueAll = false;
values = new Array(length);
hasValues = new Array(length);
active = length;
hasValues.fill(false);
for (i = 0; i < length; i++) {
iterator = wrapWithAbort(this._sources[i], signal)[Symbol.asyncIterator]();
iterators[i] = iterator;
nexts[i] = wrapPromiseWithIndex(iterator.next(), i);
}
_d.label = 1;
case 1:
if (!(active > 0)) return [3 /*break*/, 7];
next = safeRace(nexts);
return [4 /*yield*/, __await(next)];
case 2:
_b = _d.sent(), _c = _b.value, value$ = _c.value, done$ = _c.done, index = _b.index;
if (!done$) return [3 /*break*/, 3];
nexts[index] = NEVER_PROMISE;
active--;
return [3 /*break*/, 6];
case 3:
values[index] = value$;
hasValues[index] = true;
iterator$ = iterators[index];
nexts[index] = wrapPromiseWithIndex(iterator$.next(), index);
if (!(hasValueAll || (hasValueAll = hasValues.every(identity)))) return [3 /*break*/, 6];
return [4 /*yield*/, __await(values)];
case 4: return [4 /*yield*/, _d.sent()];
case 5:
_d.sent();
_d.label = 6;
case 6: return [3 /*break*/, 1];
case 7: return [2 /*return*/];
}
});
});
};
return CombineLatestAsyncIterable;
}(AsyncIterableX));
export { CombineLatestAsyncIterable };
export function combineLatest() {
var sources = [];
for (var _i = 0; _i < arguments.length; _i++) {
sources[_i] = arguments[_i];
}
return new CombineLatestAsyncIterable(sources);
}
//# sourceMappingURL=combinelatest.js.map