"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.throttle = exports.defaultThrottleConfig = void 0; var lift_1 = require("../util/lift"); var OperatorSubscriber_1 = require("./OperatorSubscriber"); var innerFrom_1 = require("../observable/innerFrom"); exports.defaultThrottleConfig = { leading: true, trailing: false, }; function throttle(durationSelector, config) { if (config === void 0) { config = exports.defaultThrottleConfig; } return lift_1.operate(function (source, subscriber) { var leading = config.leading, trailing = config.trailing; var hasValue = false; var sendValue = null; var throttled = null; var isComplete = false; var endThrottling = function () { throttled === null || throttled === void 0 ? void 0 : throttled.unsubscribe(); throttled = null; if (trailing) { send(); isComplete && subscriber.complete(); } }; var cleanupThrottling = function () { throttled = null; isComplete && subscriber.complete(); }; var startThrottle = function (value) { return (throttled = innerFrom_1.innerFrom(durationSelector(value)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling))); }; var send = function () { if (hasValue) { hasValue = false; var value = sendValue; sendValue = null; subscriber.next(value); !isComplete && startThrottle(value); } }; source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { hasValue = true; sendValue = value; !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value)); }, function () { isComplete = true; !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete(); })); }); } exports.throttle = throttle; //# sourceMappingURL=throttle.js.map