package org.rdfhdt.hdt.iterator.utils;
import java.util.Comparator;
import java.util.Iterator;
import java.util.PriorityQueue;
public class MultiMerge<T> implements Iterator<T> {
PriorityQueue<Source<T>> queue = new PriorityQueue<>();
private static class Source<T> implements Comparable<Source<T>>{
Comparator<T> comparator;
Iterator<T> it;
T entry;
Source(Iterator<T> it, Comparator<T> comparator) {
this.it = it;
this.comparator = comparator;
}
public boolean read() {
if(it.hasNext()) {
entry = it.next();
return true;
} else {
return false;
}
}
@Override
public int compareTo(Source<T> o) {
return comparator.compare(this.entry, (T) o.entry);
}
}
public MultiMerge(Iterator<Iterator<T>> it, Comparator<T> comparator){
while(it.hasNext()) {
Iterator<T> inner = it.next();
if(inner.hasNext()) {
Source<T> s = new Source<T>(inner, comparator);
if(s.read()) {
queue.add(s);
}
}
}
}
@Override
public boolean hasNext() {
return !queue.isEmpty();
}
@Override
public T next() {
Source<T> item = queue.remove();
T out = item.entry;
if(item.read()) {
queue.add(item);
}
return out;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}