"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.repeatWhen = void 0; var innerFrom_1 = require("../observable/innerFrom"); var Subject_1 = require("../Subject"); var lift_1 = require("../util/lift"); var OperatorSubscriber_1 = require("./OperatorSubscriber"); function repeatWhen(notifier) { return lift_1.operate(function (source, subscriber) { var innerSub; var syncResub = false; var completions$; var isNotifierComplete = false; var isMainComplete = false; var checkComplete = function () { return isMainComplete && isNotifierComplete && (subscriber.complete(), true); }; var getCompletionSubject = function () { if (!completions$) { completions$ = new Subject_1.Subject(); innerFrom_1.innerFrom(notifier(completions$)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () { if (innerSub) { subscribeForRepeatWhen(); } else { syncResub = true; } }, function () { isNotifierComplete = true; checkComplete(); })); } return completions$; }; var subscribeForRepeatWhen = function () { isMainComplete = false; innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () { isMainComplete = true; !checkComplete() && getCompletionSubject().next(); })); if (syncResub) { innerSub.unsubscribe(); innerSub = null; syncResub = false; subscribeForRepeatWhen(); } }; subscribeForRepeatWhen(); }); } exports.repeatWhen = repeatWhen; //# sourceMappingURL=repeatWhen.js.map