56 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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)
 | 
						|
  })
 | 
						|
}
 |