You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.0 KiB
55 lines
1.0 KiB
'use strict' |
|
|
|
var nextTick = nextTickArgs |
|
process.nextTick(upgrade, 42) // pass 42 and see if upgrade is called with it |
|
|
|
module.exports = thunky |
|
|
|
function thunky (fn) { |
|
var state = run |
|
return thunk |
|
|
|
function thunk (callback) { |
|
state(callback || noop) |
|
} |
|
|
|
function run (callback) { |
|
var stack = [callback] |
|
state = wait |
|
fn(done) |
|
|
|
function wait (callback) { |
|
stack.push(callback) |
|
} |
|
|
|
function done (err) { |
|
var args = arguments |
|
state = isError(err) ? run : finished |
|
while (stack.length) finished(stack.shift()) |
|
|
|
function finished (callback) { |
|
nextTick(apply, callback, args) |
|
} |
|
} |
|
} |
|
} |
|
|
|
function isError (err) { // inlined from util so this works in the browser |
|
return Object.prototype.toString.call(err) === '[object Error]' |
|
} |
|
|
|
function noop () {} |
|
|
|
function apply (callback, args) { |
|
callback.apply(null, args) |
|
} |
|
|
|
function upgrade (val) { |
|
if (val === 42) nextTick = process.nextTick |
|
} |
|
|
|
function nextTickArgs (fn, a, b) { |
|
process.nextTick(function () { |
|
fn(a, b) |
|
}) |
|
}
|
|
|