package com.nurkiewicz.lazyseq; import java.util.ArrayList; import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; /** * @author Tomasz Nurkiewicz * @since 5/8/13, 9:09 PM */ class FixedCons<E> extends LazySeq<E> { private final E head; private final LazySeq<E> tail; public FixedCons(E head, LazySeq<E> tail) { this.head = Objects.requireNonNull(head); this.tail = Objects.requireNonNull(tail); } @Override public E head() { return head; } @Override public LazySeq<E> tail() { return tail; } @Override protected boolean isTailDefined() { return true; } @Override public <R> LazySeq<R> map(Function<? super E, ? extends R> mapper) { return cons(mapper.apply(head), tail.map(mapper)); } @Override public LazySeq<E> filter(Predicate<? super E> predicate) { if (predicate.test(head)) { return cons(head, tail.filter(predicate)); } else { return tail.filter(predicate); } } @Override public <R> LazySeq<R> flatMap(Function<? super E, ? extends Iterable<? extends R>> mapper) { final ArrayList<R> result = new ArrayList<>(); mapper.apply(head).forEach(result::add); return concat(result, tail.flatMap(mapper)); } @Override protected LazySeq<E> takeUnsafe(long maxSize) { if (maxSize > 1) { return cons(head, tail.takeUnsafe(maxSize - 1)); } else { return LazySeq.of(head); } } @Override public boolean isEmpty() { return false; } }