ceci-core
Version:
A Go-inspired async library based on ES6 generators
174 lines (145 loc) • 3.9 kB
JavaScript
var cc = require('./core');
var top = function(deferred) {
deferred.then(null, function(ex) { console.log(ex.stack); });
};
var join = function(items) {
return cc.go(wrapGenerator.mark(function callee$1$0() {
var result, i;
return wrapGenerator(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
result = [];
i = 0;
case 2:
if (!(i < items.length)) {
context$2$0.next = 10;
break;
}
context$2$0.next = 5;
return items[i];
case 5:
context$2$0.t0 = context$2$0.sent;
result.push(context$2$0.t0);
case 7:
++i;
context$2$0.next = 2;
break;
case 10:
return context$2$0.abrupt("return", result);
case 11:
case "end":
return context$2$0.stop();
}
}, callee$1$0, this);
}));
};
var lift = function(fn, context) {
return function() {
var args = Array.prototype.slice.call(arguments);
return cc.go(wrapGenerator.mark(function callee$2$0() {
return wrapGenerator(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
context$3$0.next = 2;
return join(args);
case 2:
context$3$0.t1 = context$3$0.sent;
return context$3$0.abrupt("return", fn.apply(context, context$3$0.t1));
case 4:
case "end":
return context$3$0.stop();
}
}, callee$2$0, this);
}));
};
};
var chain = function(initial) {
var args = Array.prototype.slice.call(arguments, 1);
return cc.go(wrapGenerator.mark(function callee$1$0() {
var val, form, i;
return wrapGenerator(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
val = initial;
i = 0;
case 2:
if (!(i < args.length)) {
context$2$0.next = 11;
break;
}
form = args[i];
context$2$0.next = 6;
return val;
case 6:
val = context$2$0.sent;
if (typeof form == 'function')
val = form(val);
else if (Array.isArray(form) && typeof form[0] == 'function')
val = form[0].apply(null, [].concat(form[1], [val], form.slice(2)));
else if (Array.isArray(form) && typeof form[0] == 'string')
val = val[form[0]].apply(val, form.slice(1));
else
val = form;
case 8:
++i;
context$2$0.next = 2;
break;
case 11:
context$2$0.next = 13;
return val;
case 13:
return context$2$0.abrupt("return", context$2$0.sent);
case 14:
case "end":
return context$2$0.stop();
}
}, callee$1$0, this);
}));
};
var sleep = function(ms) {
var result = cc.defer();
var t = setTimeout(function() {
clearTimeout(t);
result.resolve();
}, ms);
return result;
};
var ncallback = function(deferred) {
return function(err, val) {
if (err)
deferred.reject(new Error(err));
else
deferred.resolve(val);
};
};
var nbind = function(fn, context) {
var boundArgs = Array.prototype.slice.call(arguments, 2);
return function() {
var args = Array.prototype.slice.call(arguments);
var result = cc.defer();
fn.apply(context, boundArgs.concat(args, ncallback(result)));
return result;
};
};
var nodeify = function(deferred, callback) {
if (callback === undefined)
return deferred;
else {
deferred.then(function(val) {
callback(null, val)
}, function(err) {
callback(err);
});
}
};
module.exports = {
top : top,
join : join,
lift : lift,
chain : chain,
sleep : sleep,
ncallback: ncallback,
nbind : nbind,
nodeify : nodeify
};
;