docs: function promisen(task) {
      if (arguments.length > 1) return waterfall(arguments);
      if (task instanceof Function) return executable;
      if (!arguments.length) return resolve;
      return constant;
  
      // return the constant value
      function constant() {
        return resolve(task);
      }
  
      // return a result from the function
      function executable(value) {
        var result;
        try {
          result = resolve(task.apply(this, arguments));
        } catch (e) {
          result = reject(e);
        }
        return result;
      }
    }