You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							141 lines
						
					
					
						
							5.2 KiB
						
					
					
				
			
		
		
	
	
							141 lines
						
					
					
						
							5.2 KiB
						
					
					
				"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._ctorUnsubscribe = true; | 
						|
            this._unsubscribe = unsubscribe; | 
						|
        } | 
						|
    } | 
						|
    Subscription.prototype.unsubscribe = function () { | 
						|
        var errors; | 
						|
        if (this.closed) { | 
						|
            return; | 
						|
        } | 
						|
        var _a = this, _parentOrParents = _a._parentOrParents, _ctorUnsubscribe = _a._ctorUnsubscribe, _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)) { | 
						|
            if (_ctorUnsubscribe) { | 
						|
                this._unsubscribe = undefined; | 
						|
            } | 
						|
            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
 |