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)
 | |
|   })
 | |
| }
 |