docs: protected OptionalThing<RunnerResult> synchronizedNeighborPreparing(Iterator<NeighborConcurrentGroup> groupIte,
              Supplier<OptionalThing<RunnerResult>> runner) { // in preparing lock
          if (groupIte.hasNext()) {
              final NeighborConcurrentGroup group = groupIte.next();
              synchronized (group.getGroupPreparingLock()) {
                  return synchronizedNeighborPreparing(groupIte, runner);
              }
          } else {
              return runner.get();
          }
      }