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