UNPKG

ceci-core

Version:

A Go-inspired async library based on ES6 generators

174 lines (145 loc) 3.9 kB
'use strict'; 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 };