package org.eclipse.viatra.solver.data.util; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.function.Function; import java.util.function.Predicate; public final class CollectionsUtil { private CollectionsUtil() { throw new UnsupportedOperationException(); } public static Iterator map(Iterator source, Function transformation) { return new Iterator() { @Override public boolean hasNext() { return source.hasNext(); } @Override public T next() { return transformation.apply(source.next()); } }; } public static Iterable map(Iterable source, Function transformation) { return (()->map(source.iterator(),transformation)); } public static Iterator filter(Iterator source, Predicate condition) { return new Iterator() { T internalNext = move(); boolean internalHasNext; private T move() { internalHasNext = source.hasNext(); if(internalHasNext) { internalNext = source.next(); } while(internalHasNext && !condition.test(internalNext)) { internalHasNext = source.hasNext(); if(internalHasNext) { internalNext = source.next(); } } return internalNext; } @Override public boolean hasNext() { return internalHasNext; } @Override public T next() { if(!internalHasNext) { throw new NoSuchElementException(); } else { T result = internalNext; move(); return result; } } }; } public static Iterable filter(Iterable source, Predicate condition) { return (()->filter(source.iterator(),condition)); } }