| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| var isArray_1 = require("./util/isArray"); |
| var isObject_1 = require("./util/isObject"); |
| var isFunction_1 = require("./util/isFunction"); |
| var UnsubscriptionError_1 = require("./util/UnsubscriptionError"); |
| var Subscription = (function () { |
| function Subscription(unsubscribe) { |
| this.closed = false; |
| this._parentOrParents = null; |
| this._subscriptions = null; |
| if (unsubscribe) { |
| this._unsubscribe = unsubscribe; |
| } |
| } |
| Subscription.prototype.unsubscribe = function () { |
| var errors; |
| if (this.closed) { |
| return; |
| } |
| var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; |
| this.closed = true; |
| this._parentOrParents = null; |
| this._subscriptions = null; |
| if (_parentOrParents instanceof Subscription) { |
| _parentOrParents.remove(this); |
| } |
| else if (_parentOrParents !== null) { |
| for (var index = 0; index < _parentOrParents.length; ++index) { |
| var parent_1 = _parentOrParents[index]; |
| parent_1.remove(this); |
| } |
| } |
| if (isFunction_1.isFunction(_unsubscribe)) { |
| try { |
| _unsubscribe.call(this); |
| } |
| catch (e) { |
| errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e]; |
| } |
| } |
| if (isArray_1.isArray(_subscriptions)) { |
| var index = -1; |
| var len = _subscriptions.length; |
| while (++index < len) { |
| var sub = _subscriptions[index]; |
| if (isObject_1.isObject(sub)) { |
| try { |
| sub.unsubscribe(); |
| } |
| catch (e) { |
| errors = errors || []; |
| if (e instanceof UnsubscriptionError_1.UnsubscriptionError) { |
| errors = errors.concat(flattenUnsubscriptionErrors(e.errors)); |
| } |
| else { |
| errors.push(e); |
| } |
| } |
| } |
| } |
| } |
| if (errors) { |
| throw new UnsubscriptionError_1.UnsubscriptionError(errors); |
| } |
| }; |
| Subscription.prototype.add = function (teardown) { |
| var subscription = teardown; |
| if (!teardown) { |
| return Subscription.EMPTY; |
| } |
| switch (typeof teardown) { |
| case 'function': |
| subscription = new Subscription(teardown); |
| case 'object': |
| if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') { |
| return subscription; |
| } |
| else if (this.closed) { |
| subscription.unsubscribe(); |
| return subscription; |
| } |
| else if (!(subscription instanceof Subscription)) { |
| var tmp = subscription; |
| subscription = new Subscription(); |
| subscription._subscriptions = [tmp]; |
| } |
| break; |
| default: { |
| throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); |
| } |
| } |
| var _parentOrParents = subscription._parentOrParents; |
| if (_parentOrParents === null) { |
| subscription._parentOrParents = this; |
| } |
| else if (_parentOrParents instanceof Subscription) { |
| if (_parentOrParents === this) { |
| return subscription; |
| } |
| subscription._parentOrParents = [_parentOrParents, this]; |
| } |
| else if (_parentOrParents.indexOf(this) === -1) { |
| _parentOrParents.push(this); |
| } |
| else { |
| return subscription; |
| } |
| var subscriptions = this._subscriptions; |
| if (subscriptions === null) { |
| this._subscriptions = [subscription]; |
| } |
| else { |
| subscriptions.push(subscription); |
| } |
| return subscription; |
| }; |
| Subscription.prototype.remove = function (subscription) { |
| var subscriptions = this._subscriptions; |
| if (subscriptions) { |
| var subscriptionIndex = subscriptions.indexOf(subscription); |
| if (subscriptionIndex !== -1) { |
| subscriptions.splice(subscriptionIndex, 1); |
| } |
| } |
| }; |
| Subscription.EMPTY = (function (empty) { |
| empty.closed = true; |
| return empty; |
| }(new Subscription())); |
| return Subscription; |
| }()); |
| exports.Subscription = Subscription; |
| function flattenUnsubscriptionErrors(errors) { |
| return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []); |
| } |
| //# sourceMappingURL=Subscription.js.map |