@SafeVarargs
  @Contract(pure = true)
  public static @NotNull <T> Iterable<T> concat(T[] @NotNull ... arrays) {
    return () -> {
      //noinspection unchecked
      Iterator<T>[] iterators = new Iterator[arrays.length];
      for (int i = 0; i < arrays.length; i++) {
        iterators[i] = iterate(arrays[i]);
      }
@SafeVarargs
  @Contract(pure = true)
  public static @NotNull <T> Iterable<T> concat(T[] @NotNull ... arrays) {
    return () -> {
      //noinspection unchecked
      Iterator<T>[] iterators = new Iterator[arrays.length];
      for (int i = 0; i < arrays.length; i++)