@Nullable
  private static <T> Set<T> merge(@Nullable Set<T> first, @Nullable Set<T> second, @NotNull Supplier<Set<T>> initializer) {
    if (second == null || second.isEmpty()) return first;
    if (first == null || first.isEmpty()) return second;
    final Set<T> result = initializer.get();
    result.addAll(first);
    result.addAll(second);
    return result;
  }
@Nullable
  private static <T> Set<T> merge(@Nullable Set<T> first, @Nullable Set<T> second, @NotNull Supplier<Set<T>> initializer)