package org.archive.wayback.util.iterator;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;
public class SortedCompositeIterator<E> implements Iterator<E> {
private static final int DEFAULT_CAPACITY = 10;
PriorityQueue<IPeekableIterator<E>> q = null;
public SortedCompositeIterator(Comparator<E> comparator) {
this(DEFAULT_CAPACITY,comparator);
}
public SortedCompositeIterator(int capacity, Comparator<E> comparator) {
q = new PriorityQueue<IPeekableIterator<E>>(capacity,
new PeekableIteratorComparator<E>(comparator));
}
public void addAll(Collection<Iterator<E>> toAdd) {
for(Iterator<E> e : toAdd) {
addIterator(e);
}
}
public void addIterator(Iterator<E> itr) {
IPeekableIterator<E> i = null;
if(itr instanceof IPeekableIterator) {
i = (IPeekableIterator<E>) itr;
} else {
i = AbstractPeekableIterator.wrap(itr);
}
if(i.hasNext()) {
q.add(i);
}
}
public boolean hasNext() {
return (q.peek() != null);
}
public E next() {
IPeekableIterator<E> i = q.poll();
if(i == null) {
throw new NoSuchElementException("Call hasNext!");
}
E tmp = i.next();
if(i.hasNext()) {
q.add(i);
}
return tmp;
}
public void remove() {
throw new UnsupportedOperationException("No remove");
}
}