@SafeVarargs
  @Contract(pure = true)
  public static @Unmodifiable @NotNull <T> List<T> append(@NotNull List<? extends T> list, T @NotNull ... values) {
    //noinspection unchecked
    if (values.length == 0) {
      return (List<T>)list;
    }

    return new AbstractList<T>() {
      @Override
      public T get(int index) {
        return index < list.size() ? list.get(index) : values[index - list.size()];
      }

      @Override
      public int size() {
        return list.size() + values.length;
      }
    };
  }
@SafeVarargs
  @Contract(pure = true)
  public static @Unmodifiable @NotNull <T> List<T> append(@NotNull List<? extends T> list, T @NotNull ... values)