public static <M, WV> Window<M, Void, WV> tumblingWindow(Duration interval, SupplierFunction<? extends WV> initialValue,
      FoldLeftFunction<? super M, WV> aggregator, Serde<WV> windowValueSerde) {
    Trigger<M> defaultTrigger = new TimeTrigger<>(interval);
    return new WindowInternal<>(defaultTrigger, (SupplierFunction<WV>) initialValue, (FoldLeftFunction<M, WV>) aggregator,
        null, null, WindowType.TUMBLING, null, windowValueSerde, null);
  }
Creates a {@link Window} that windows values into fixed-size processing time based windows and aggregates
them applying the provided function.

<p>The below example computes the maximum value per-key over fixed size 10 second windows.

<pre> {@code
   MessageStream<String> stream = ...;
   SupplierFunction<Integer> initialValue = () -> 0;
   FoldLeftFunction<String, Integer, Integer> maxAggregator = (m, c) -> Math.max(parseInt(m), c);
   MessageStream<WindowPane<Void, Integer>> windowedStream = stream.window(
       Windows.tumblingWindow(Duration.ofSeconds(10), maxAggregator));
}
</pre>

@param interval the duration in processing time
@param initialValue the initial value supplier for the aggregator. Invoked when a new window is created.
@param aggregator the function to incrementally update the window value. Invoked when a new message
                  arrives for the window.
@param windowValueSerde the serde for the window value
@param <M> the type of the input message
@param <WV> the type of the {@link WindowPane} output value
@return the created {@link Window} function
samza-api/src/main/java/org/apache/samza/operators/windows/Windows.java