package org.jboss.windup.graph.iterables;
import org.jboss.windup.graph.model.WindupVertexFrame;
import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
/**
* An iterator that wraps up another {@link Iterator<WindupVertexFrame>} and does not return duplicates
*/
public class FramesSetIterator<T extends WindupVertexFrame> implements Iterator<T>
{
private final Iterator<T> wrappedIterator;
private Set<String> ids = new HashSet<>();
private T nextFrame = null;
public FramesSetIterator(Iterator<T> wrappedIterator) {
this.wrappedIterator = wrappedIterator;
fillInNextFrame();
}
@Override
public boolean hasNext()
{
return nextFrame!=null;
}
@Override
public T next()
{
T nextFrame = getAndSetNewFrame();
if(nextFrame == null) {
throw new NoSuchElementException();
} else {
return nextFrame;
}
}
private T getAndSetNewFrame() {
T frameToReturn = nextFrame;
nextFrame = null;
fillInNextFrame();
return frameToReturn;
}
private void fillInNextFrame() {
while(wrappedIterator.hasNext() && nextFrame==null) {
T frame = wrappedIterator.next();
String frameId = frame.asVertex().getId().toString();
if(!ids.contains(frameId)) {
ids.add(frameId);
nextFrame=frame;
}
}
}
@Override
public void remove() {
wrappedIterator.remove();
}
}