AnnotationIterator(ListIterator<Annotation> baseIt, IdentityHashMap<SpanNode, SpanNode> nodes) { this.base = new PeekableListIterator<Annotation>(baseIt); this.nodes = nodes; }
@Override public void remove() { if (!nextCalled) { throw new IllegalStateException(); } base.remove(); nextCalled = false; } }
@Override public boolean hasNext() { if (stack.isEmpty()) { return false; } PeekableListIterator<SpanNode> iterator = stack.peek(); if (!iterator.hasNext()) { stack.pop(); return hasNext(); } SpanNode node = iterator.peek(); if (!iterator.traversed) { //we set the traversed flag on our way down iterator.traversed = true; stack.push(new PeekableListIterator<SpanNode>(node.childIterator())); return hasNext(); } return true; }
@Override public SpanNode next() { if (stack.isEmpty() || !hasNext()) { iteratorFromLastCallToNext = null; throw new NoSuchElementException("No next element available."); } stack.peek().traversed = false; iteratorFromLastCallToNext = stack.peek(); return stack.peek().next(); }
@Override public boolean hasNext() { if (stack.isEmpty()) { return false; } PeekableListIterator<SpanNode> iterator = stack.peek(); if (!iterator.hasNext()) { stack.pop(); return hasNext(); } return true; } }
@Override public Annotation next() { if (hasNext()) { nextCalled = true; return base.next(); } else { throw new NoSuchElementException(); } }
RecursiveNodeIterator(ListIterator<SpanNode> it) { stack.push(new PeekableListIterator<SpanNode>(it)); }
SerialIterator(List<ListIterator<SpanNode>> iterators) { //the first iterator must be on top of the stack: for (int i = iterators.size() - 1; i > -1; i--) { stack.push(new PeekableListIterator<SpanNode>(iterators.get(i))); } }