'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) => {
          args.push((err, res) => (err != null ? reject(err) : resolve(res)));
          fn.apply(this, args);
        });
      }
    },
    '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 {
        args.pop();
        fn.apply(this, args).then((r) => cb(null, r), cb);
      }
    },
    'name',
    { value: fn.name }
  );
};