package com.revolsys.collection.iterator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import com.revolsys.util.Cancellable;
public class CancelIterable<T> extends AbstractIterator<T> {
public static <V> Iterable<V> i(final Cancellable cancellable, final Iterable<V> iterable) {
if (cancellable == null) {
return iterable;
} else {
return new CancelIterable<>(cancellable, iterable);
}
}
private final Cancellable cancellable;
private Iterator<T> iterator;
public CancelIterable(final Cancellable cancellable, final Iterable<T> iterable) {
this(cancellable, iterable.iterator());
}
public CancelIterable(final Cancellable cancellable, final Iterator<T> iterator) {
this.cancellable = cancellable;
this.iterator = iterator;
}
@Override
public void closeDo() {
try {
if (this.iterator instanceof AutoCloseable) {
final AutoCloseable closeable = (AutoCloseable)this.iterator;
try {
closeable.close();
} catch (final Exception e) {
}
}
} finally {
this.iterator = null;
}
}
@Override
protected T getNext() throws NoSuchElementException {
if (this.cancellable.isCancelled()) {
throw new NoSuchElementException();
} else if (this.iterator.hasNext()) {
return this.iterator.next();
} else {
throw new NoSuchElementException();
}
}
@Override
public Iterator<T> iterator() {
return this;
}
@Override
public void remove() {
this.iterator.remove();
}
}