Created
January 28, 2015 00:48
-
-
Save mattpodwysocki/0e077c69c0de2007981f to your computer and use it in GitHub Desktop.
CompositeDisposable
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Represents a group of disposable resources that are disposed together. | |
* @constructor | |
*/ | |
var CompositeDisposable = Rx.CompositeDisposable = function () { | |
var disposables = []; | |
if (Array.isArray(arguments[0])) { | |
disposables = arguments[0]; | |
} else { | |
for(var i = 0, len = arguments.length; i < len; i++) { disposables.push(arguments[i]); } | |
} | |
this.disposables = disposables; | |
this.isDisposed = false; | |
this.length = this.disposables.length; | |
}; | |
var CompositeDisposablePrototype = CompositeDisposable.prototype; | |
/** | |
* Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. | |
* @param {Mixed} item Disposable to add. | |
*/ | |
CompositeDisposablePrototype.add = function (item) { | |
if (this.isDisposed) { | |
item.dispose(); | |
} else { | |
this.disposables.push(item); | |
this.length++; | |
} | |
}; | |
/** | |
* Removes and disposes the first occurrence of a disposable from the CompositeDisposable. | |
* @param {Mixed} item Disposable to remove. | |
* @returns {Boolean} true if found; false otherwise. | |
*/ | |
CompositeDisposablePrototype.remove = function (item) { | |
var shouldDispose = false; | |
if (!this.isDisposed) { | |
var idx = this.disposables.indexOf(item); | |
if (idx !== -1) { | |
shouldDispose = true; | |
this.disposables.splice(idx, 1); | |
this.length--; | |
item.dispose(); | |
} | |
} | |
return shouldDispose; | |
}; | |
/** | |
* Disposes all disposables in the group and removes them from the group. | |
*/ | |
CompositeDisposablePrototype.dispose = function () { | |
if (!this.isDisposed) { | |
this.isDisposed = true; | |
for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); } | |
this.disposables = []; | |
this.length = 0; | |
for (i = 0, len = currentDisposables.length; i < len; i++) { | |
currentDisposables[i].dispose(); | |
} | |
} | |
}; | |
/** | |
* Converts the existing CompositeDisposable to an array of disposables | |
* @returns {Array} An array of disposable objects. | |
*/ | |
CompositeDisposablePrototype.toArray = function () { | |
for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); } | |
return currentDisposables; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment