@Override
    public Tuple2<Integer, Integer> reduce(
        Tuple2<Integer, Integer> value1, Tuple2<Integer, Integer> value2) throws Exception {
      state.update(state.value() + 1);
      globalCounts.put(value1.f0, state.value());

      return new Tuple2<>(value1.f0, value1.f1 + value2.f1);
    }
    @Override
    public void apply(
        Integer key, TimeWindow window, Iterable<Integer> values, Collector<Integer> out)
        throws Exception {
      for (Integer i : values) {
        // we need to update this state before emitting elements. Else, the test's main
        // thread will have received all output elements before the state is updated and
        // the checks may fail
        state.update(state.value() + 1);
        globalCounts.put(key, state.value());

        out.collect(i);
      }
    }
  @Override
  public TriggerResult onElement(Object element, long timestamp, W window, TriggerContext ctx)
      throws Exception {

    OperatorState<Boolean> first = ctx.getKeyValueState("first", true);

    if (first.value()) {
      long start = timestamp - (timestamp % interval);
      long nextFireTimestamp = start + interval;

      ctx.registerEventTimeTimer(nextFireTimestamp);

      first.update(false);
      return TriggerResult.CONTINUE;
    }
    return TriggerResult.CONTINUE;
  }
    @Override
    public void run(SourceContext<String> ctx) throws Exception {
      final Object lockingObject = ctx.getCheckpointLock();

      while (isRunning && index.value() < numElements) {
        char first = (char) ((index.value() % 40) + 40);

        stringBuilder.setLength(0);
        stringBuilder.append(first);

        String result = randomString(stringBuilder, rnd);

        synchronized (lockingObject) {
          index.update(index.value() + step);
          ctx.collect(result);
        }
      }
    }
 @Override
 public PrefixCount map(String value) throws IOException {
   count.update(count.value() + 1);
   return new PrefixCount(value.substring(0, 1), value, 1L);
 }
 @Override
 public PrefixCount map(PrefixCount value) throws Exception {
   count.update(count.value() + 1);
   return value;
 }