package org.infinispan.stream.impl;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.function.Function;
import org.infinispan.Cache;
/**
* An Iterator implementation that allows for a Iterator that doesn't allow remove operations to
* implement remove by delegating the call to the provided cache to remove the previously read value. The key used
* to remove from the cache is determined by first applying the removeFunction to the value retrieved from the
* iterator.
*
* @author wburns
* @since 8.0
*/
public class RemovableIterator<K, C> implements Iterator<C> {
protected final Iterator<C> realIterator;
protected final Cache<K, ?> cache;
protected final Function<? super C, K> removeFunction;
protected C previousValue;
protected C currentValue;
public RemovableIterator(Iterator<C> realIterator, Cache<K, ?> cache,
Function<? super C, K> removeFunction) {
this.realIterator = realIterator;
this.cache = cache;
this.removeFunction = removeFunction;
}
protected C getNextFromIterator() {
if (realIterator.hasNext()) {
return realIterator.next();
} else {
return null;
}
}
@Override
public boolean hasNext() {
return currentValue != null || (currentValue = getNextFromIterator()) != null;
}
@Override
public C next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
previousValue = currentValue;
currentValue = null;
return previousValue;
}
@Override
public void remove() {
if (previousValue == null) {
throw new IllegalStateException();
}
cache.remove(removeFunction.apply(previousValue));
previousValue = null;
}
}