-/*****************************************************************************/
-
-function _processWrappers(wrappers, value) {
- for (var i=0; i<wrappers.length; i++)
- wrappers[i](value);
-}
-
-
-function _processWrappersAsync(wrappers, value) {
- var taskid = -1;
- function processAsyncOnce() {
- _processWrappers(wrappers, value);
- clearInterval(taskid);
- }
- taskid = setInterval(processAsyncOnce, 200);
-}
-
-
-
-/*****************************************************************************/
-
-cloudeebus.FutureResolver = function(future) {
- this.future = future;
- this.resolved = null;
- return this;
-};
-
-
-cloudeebus.FutureResolver.prototype.resolve = function(value, sync) {
- if (this.resolved)
- return;
-
- var then = (value && value.then && value.then.apply) ? value.then : null;
- if (then) {
- var self = this;
- var acceptCallback = function(arg) {
- self.resolve(arg, true);
- };
- var rejectCallback = function(arg) {
- self.reject(arg, true);
- };
- try {
- then.apply(value, [acceptCallback, rejectCallback]);
- }
- catch (e) {
- this.reject(e, true);
- }
- }
-
- this.accept(value, sync);
-};
-
-
-cloudeebus.FutureResolver.prototype.accept = function(value, sync) {
- if (this.resolved)
- return;
-
- var future = this.future;
- future.state = "accepted";
- future.result = value;
-
- this.resolved = true;
- if (sync)
- _processWrappers(future._acceptWrappers, value);
- else
- _processWrappersAsync(future._acceptWrappers, value);
-};
-
-
-cloudeebus.FutureResolver.prototype.reject = function(value, sync) {
- if (this.resolved)
- return;
-
- var future = this.future;
- future.state = "rejected";
- future.result = value;
-
- this.resolved = true;
- if (sync)
- _processWrappers(future._rejectWrappers, value);
- else
- _processWrappersAsync(future._rejectWrappers, value);
-};
-
-
-
-/*****************************************************************************/
-
-cloudeebus.Future = function(init) {
- this.state = "pending";
- this.result = null;
- this._acceptWrappers = [];
- this._rejectWrappers = [];
- this.resolver = new cloudeebus.FutureResolver(this);
- if (init) {
- try {
- init.apply(this, [this.resolver]);
- }
- catch (e) {
- this.resolver.reject(e, true);
- }
- }
- return this;
-};
-
-
-cloudeebus.Future.prototype.appendWrappers = function(acceptWrapper, rejectWrapper) {
- this._acceptWrappers.push(acceptWrapper);
- this._rejectWrappers.push(rejectWrapper);
- if (this.state == "accepted")
- _processWrappersAsync(this._acceptWrappers, this.result);
- if (this.state == "rejected")
- _processWrappersAsync(this._rejectWrappers, this.result);
-};
-
-
-cloudeebus.Future.prototype.then = function(acceptCB, rejectCB) {
- var future = new cloudeebus.Future();
- var resolver = future.resolver;
- var acceptWrapper, rejectWrapper;
-
- if (acceptCB)
- acceptWrapper = function(arg) {
- try {
- var value = acceptCB.apply(future, [arg]);
- resolver.resolve(value, true);
- }
- catch (e) {
- resolver.reject(e, true);
- }
- };
- else
- acceptWrapper = function(arg) {
- resolver.accept(arg, true);
- };
-
- if (rejectCB)
- rejectWrapper = function(arg) {
- try {
- var value = rejectCB.apply(future, [arg]);
- resolver.resolve(value, true);
- }
- catch (e) {
- resolver.reject(e, true);
- }
- };
- else
- rejectWrapper = function(arg) {
- resolver.reject(arg, true);
- };
-
- this.appendWrappers(acceptWrapper,rejectWrapper);
- return future;
-};
-
-