package com.nurkiewicz.lazyseq; import java.util.*; import java.util.function.*; class Nil<E> extends LazySeq<E> { private static final Nil<?> NIL = new Nil<>(); @SuppressWarnings("unchecked") public static <E> Nil<E> instance() { return (Nil<E>) NIL; } @Override public E head() { throw new NoSuchElementException("head of empty stream"); } @Override public Optional<E> headOption() { return Optional.empty(); } @Override public LazySeq<E> tail() { throw new NoSuchElementException("tail of empty stream"); } @Override protected boolean isTailDefined() { return false; } @Override public E get(int index) { throw new IndexOutOfBoundsException(Integer.toString(index)); } @Override public <R> LazySeq<R> map(Function<? super E, ? extends R> mapper) { return instance(); } @Override public LazySeq<E> filter(Predicate<? super E> predicate) { return instance(); } @Override public <R> LazySeq<R> flatMap(Function<? super E, ? extends Iterable<? extends R>> mapper) { return instance(); } @Override protected LazySeq<E> takeUnsafe(long maxSize) { return instance(); } @Override protected LazySeq<E> dropUnsafe(long startInclusive) { return instance(); } @Override public void forEach(Consumer<? super E> action) { //no op } @Override public Optional<E> min(Comparator<? super E> comparator) { return Optional.empty(); } @Override public Optional<E> max(Comparator<? super E> comparator) { return Optional.empty(); } @Override public int size() { return 0; } @Override public boolean anyMatch(Predicate<? super E> predicate) { return false; } @Override public boolean allMatch(Predicate<? super E> predicate) { return true; } @Override public <S, R> LazySeq<R> zip(LazySeq<? extends S> second, BiFunction<? super E, ? super S, ? extends R> zipper) { return instance(); } @Override public LazySeq<E> takeWhile(Predicate<? super E> predicate) { return instance(); } @Override public LazySeq<E> dropWhile(Predicate<? super E> predicate) { return instance(); } @Override public LazySeq<List<E>> slidingUnsafe(int size) { return instance(); } @Override protected LazySeq<List<E>> groupedUnsafe(int size) { return instance(); } @Override public LazySeq<E> scan(E initial, BinaryOperator<E> fun) { return of(initial); } @Override public LazySeq<E> distinct() { return instance(); } @Override public boolean startsWith(Iterator<E> iterator) { return !iterator.hasNext(); } @Override public LazySeq<E> force() { return this; } @Override public boolean equals(Object o) { return o instanceof Nil; } @Override public int hashCode() { return 0; } @Override public boolean isEmpty() { return true; } }