text: import initialParams from './internal/initialParams';
  import slice from './internal/slice';
  import wrapAsync from './internal/wrapAsync';
  
  /**
   * Wraps the async function in another function that always completes with a
   * result object, even when it errors.
   *
   * The result object has either the property `error` or `value`.
   *
   * @name reflect
   * @static
   * @memberOf module:Utils
   * @method
   * @category Util
   * @param {AsyncFunction} fn - The async function you want to wrap
   * @returns {Function} - A function that always passes null to it's callback as
   * the error. The second argument to the callback will be an `object` with
   * either an `error` or a `value` property.
   * @example
   *
   * async.parallel([
   *     async.reflect(function(callback) {
   *         // do some stuff ...
   *         callback(null, 'one');
   *     }),
   *     async.reflect(function(callback) {
   *         // do some more stuff but error ...
   *         callback('bad stuff happened');
   *     }),
   *     async.reflect(function(callback) {
   *         // do some more stuff ...
   *         callback(null, 'two');
   *     })
   * ],
   * // optional callback
   * function(err, results) {
   *     // values
   *     // results[0].value = 'one'
   *     // results[1].error = 'bad stuff happened'
   *     // results[2].value = 'two'
   * });
   */
  export default function reflect(fn) {
      var _fn = wrapAsync(fn);
      return initialParams(function reflectOn(args, reflectCallback) {
          args.push(function callback(error, cbArg) {
              if (error) {
                  reflectCallback(null, { error: error });
              } else {
                  var value;
                  if (arguments.length <= 2) {
                      value = cbArg
                  } else {
                      value = slice(arguments, 1);
                  }
                  reflectCallback(null, { value: value });
              }
          });
  
          return _fn.apply(this, args);
      });
  }
  