@Contract(pure = true)
  public static @Unmodifiable @NotNull <E> List<E> reverse(@NotNull List<? extends E> elements) {
    if (elements.isEmpty()) {
      return emptyList();
    }

    return new AbstractList<E>() {
      @Override
      public E get(int index) {
        return elements.get(elements.size() - 1 - index);
      }

      @Override
      public int size() {
        return elements.size();
      }
    };
  }
@Contract(pure = true)
  public static @Unmodifiable @NotNull <E> List<E> reverse(@NotNull List<? extends E> elements)