package de.invesdwin.util.collections.iterable;
import java.util.Iterator;
import java.util.NoSuchElementException;
import javax.annotation.concurrent.NotThreadSafe;
@NotThreadSafe
public class FlatteningIterator<E> implements ICloseableIterator<E> {
private final ICloseableIterator<? extends Iterator<? extends E>> delegate;
private ICloseableIterator<? extends E> curIterator;
public FlatteningIterator(final ICloseableIterator<? extends Iterator<? extends E>> delegate) {
this.delegate = delegate;
}
@Override
public boolean hasNext() {
try {
return getIterator().hasNext() || delegate.hasNext();
} catch (final NoSuchElementException e) {
return false;
}
}
@Override
public E next() {
return getIterator().next();
}
@SuppressWarnings("deprecation")
private ICloseableIterator<? extends E> getIterator() {
while (curIterator == null || !curIterator.hasNext()) {
curIterator = WrapperCloseableIterator.maybeWrap(delegate.next());
}
return curIterator;
}
@Override
public void close() {
if (curIterator != null) {
curIterator.close();
}
delegate.close();
}
}