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.
		
		
		
		
			
				
					56 lines
				
				1.0 KiB
			
		
		
			
		
	
	
					56 lines
				
				1.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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)
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								}
							 |