/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at . */
// @flow
/**
* This object provides the public module functions.
*/
export const Task = {
// XXX: Not sure if this works in all cases...
async: function(task: any) {
return function() {
return Task.spawn(task, this, arguments);
};
},
/**
* Creates and starts a new task.
* @param task A generator function
* @return A promise, resolved when the task terminates
*/
spawn: function(task: any, scope: any, args: any): Promise {
return new Promise(function(resolve, reject) {
const iterator = task.apply(scope, args);
const callNext = lastValue => {
const iteration = iterator.next(lastValue);
Promise.resolve(iteration.value)
.then(value => {
if (iteration.done) {
resolve(value);
} else {
callNext(value);
}
})
.catch(error => {
reject(error);
iterator.throw(error);
});
};
callNext(undefined);
});
},
};