var cps = require('../lib/cps.js'); var alienAdd = function(a, b, cb) { setTimeout(function() { cb(null, a + b); }, 0); }; var asyncFib = function(n, cb) { if (n < 0) { throw new Error('fib input error'); // return cb(new Error('fib input error')); } if (n == 0) {return cb(null, 1);} if (n == 1) {return cb(null, 1);} var a = 1, b = 1, i = 2; cps.seq([ function(_, cb) { cps.pwhile( function(cb) { cb(null, i <= n); }, function(cb) { cps.seq([ function(_, cb) { alienAdd(a, b, cb); }, function(res, cb) { a = b; b = res; alienAdd(i, 1, cb); }, function(res, cb) { i = res; cb(); } ], cb); }, cb ); }, function(_, cb) { cb(null, b); } ], cb); }; module.exports = asyncFib;