51 lines
1.2 KiB
JavaScript
51 lines
1.2 KiB
JavaScript
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; |