|  | "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 |