| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 
							
- var Promise = require('any-promise')
 
- var assert = require('assert')
 
- module.exports = thenify
 
- /**
 
-  * Turn async functions into promises
 
-  *
 
-  * @param {Function} fn
 
-  * @return {Function}
 
-  * @api public
 
-  */
 
- function thenify(fn, options) {
 
-   assert(typeof fn === 'function')
 
-   return createWrapper(fn, options)
 
- }
 
- /**
 
-  * Turn async functions into promises and backward compatible with callback
 
-  *
 
-  * @param {Function} fn
 
-  * @return {Function}
 
-  * @api public
 
-  */
 
- thenify.withCallback = function (fn, options) {
 
-   assert(typeof fn === 'function')
 
-   options = options || {}
 
-   options.withCallback = true
 
-   return createWrapper(fn, options)
 
- }
 
- function createCallback(resolve, reject, multiArgs) {
 
-   // default to true
 
-   if (multiArgs === undefined) multiArgs = true
 
-   return function(err, value) {
 
-     if (err) return reject(err)
 
-     var length = arguments.length
 
-     if (length <= 2 || !multiArgs) return resolve(value)
 
-     if (Array.isArray(multiArgs)) {
 
-       var values = {}
 
-       for (var i = 1; i < length; i++) values[multiArgs[i - 1]] = arguments[i]
 
-       return resolve(values)
 
-     }
 
-     var values = new Array(length - 1)
 
-     for (var i = 1; i < length; ++i) values[i - 1] = arguments[i]
 
-     resolve(values)
 
-   }
 
- }
 
- function createWrapper(fn, options) {
 
-   options = options || {}
 
-   var name = fn.name;
 
-   name = (name || '').replace(/\s|bound(?!$)/g, '')
 
-   var newFn = function () {
 
-     var self = this
 
-     var len = arguments.length
 
-     if (options.withCallback) {
 
-       var lastType = typeof arguments[len - 1]
 
-       if (lastType === 'function') return fn.apply(self, arguments)
 
-     }
 
-     var args = new Array(len + 1)
 
-     for (var i = 0; i < len; ++i) args[i] = arguments[i]
 
-     var lastIndex = i
 
-     return new Promise(function (resolve, reject) {
 
-       args[lastIndex] = createCallback(resolve, reject, options.multiArgs)
 
-       fn.apply(self, args)
 
-     })
 
-   }
 
-   Object.defineProperty(newFn, 'name', { value: name })
 
-   return newFn
 
- }
 
 
  |