text: 'use strict'
  
  exports.fromCallback = function (fn) {
    return Object.defineProperty(function (...args) {
      if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
      else {
        return new Promise((resolve, reject) => {
          fn.apply(
            this,
            args.concat([(err, res) => err ? reject(err) : resolve(res)])
          )
        })
      }
    }, 'name', { value: fn.name })
  }
  
  exports.fromPromise = function (fn) {
    return Object.defineProperty(function (...args) {
      const cb = args[args.length - 1]
      if (typeof cb !== 'function') return fn.apply(this, args)
      else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
    }, 'name', { value: fn.name })
  }
  