code: public SmartBinder fold(String newName, SmartHandle function) {
          if (Arrays.equals(signature().argNames(), function.signature().argNames())) {
              return fold(newName, function.handle());
          } else {
              return fold(newName, signature().changeReturn(function.signature().type().returnType()).permuteWith(function).handle());
          }
      }
docs: Pass all arguments to the given function and insert the resulting value
  as newName into the argument list.
  
  @param newName  the name of the new first argument where the fold
  function's result will be passed
  @param function a function which will receive all arguments and have its
  return value inserted into the call chain
  @return a new SmartBinder with the fold applied