docs: public static <T, R> R reduce(final Iterable<T> iterable, final R initial, final BiFunction<R, ? super T, R> accumulator) {
          checkNotNull(iterable, "reduce must have a non null iterable");
          checkNotNull(accumulator, "reduce must have a non null function");
  
          R returnValue = initial;
          for (T r : iterable) {
              returnValue = accumulator.apply(returnValue, r);
          }
          return returnValue;
      }