package org.eclipse.viatra.solver.data.map; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.function.BiFunction; import java.util.function.BiPredicate; public class CursorAsIterator implements Iterator { private final Cursor internal; private final BiFunction entryTransformation; private final BiPredicate filtering; D lastValidElement; public CursorAsIterator(Cursor internal, BiFunction entryTransformation, BiPredicate filtering) { this.internal = internal; this.entryTransformation = entryTransformation; this.filtering = filtering; moveToNext(); } public CursorAsIterator(Cursor internal, BiFunction entryTransformation) { this.internal = internal; this.entryTransformation = entryTransformation; this.filtering = ((k,v)->true); moveToNext(); } private void moveToNext() { internal.move(); while(!internal.isTerminated() && !filtering.test(internal.getKey(), internal.getValue())) { internal.move(); } if(!internal.isTerminated()) { lastValidElement = entryTransformation.apply(internal.getKey(), internal.getValue()); } } @Override public boolean hasNext() { return !internal.isTerminated(); } @Override public D next() { if(hasNext()) { D last = lastValidElement; moveToNext(); return last; } else { throw new NoSuchElementException(); } } }