docs: function lift(normalFunction) {
    var args = slice.call(arguments, 1);
    var resolvedArgs = args.length === 0;
  
    var invoke = function() {
      var thisArg = this;
      var additionalArgs = slice.call(arguments);
  
      if (!resolvedArgs) {
        return promise.Promise.all(args).then(function(resolved) {
          args = resolved;
          resolvedArgs = true;
          return invoke.apply(thisArg, additionalArgs);
        });
      }
  
      return promise.Promise.all(additionalArgs).then(function(additionalArgs) {
        return normalFunction.apply(thisArg, args.concat(additionalArgs));
      });
    };
  
    return invoke;
  }