package net.rubygrapefruit.docs.parser; import java.util.ArrayList; import java.util.Collection; import java.util.List; public abstract class LookaheadStream<T> { private final List<T> queue = new ArrayList<T>(); protected LookaheadStream() { } protected LookaheadStream(Iterable<? extends T> initialValues) { for (T initialValue : initialValues) { queue.add(initialValue); } } public T peek() { return peek(0); } public T peek(int depth) { while (queue.size() <= depth) { int size = queue.size(); readNext(queue); if (queue.size() == size) { return endOfStream(); } } return queue.get(depth); } public T next() { peek(0); if (!queue.isEmpty()) { return queue.remove(0); } return null; } /** * Returns the element that marks end of stream. */ protected T endOfStream() { return null; } /** * Returns the next available elements. */ protected abstract void readNext(Collection<T> elements); }