@Contract(pure=true)
  public static <T> T @NotNull [] insert(T @NotNull [] array, int index, T value) {
    T[] result = newArray(getComponentType(array), array.length + 1);
    System.arraycopy(array, 0, result, 0, index);
    result[index] = value;
    System.arraycopy(array, index, result, index + 1, array.length - index);
    return result;
  }
@Contract(pure=true)
  public static <T> T @NotNull [] insert(T @NotNull [] array, int index, T value)