package spimedb.graph.travel; import com.google.common.collect.Iterables; import org.jetbrains.annotations.NotNull; import spimedb.graph.MapGraph; import java.util.Arrays; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; /** * runs a set of travels sharing a common 'seen' experience. * this effectively performs a set of union of the vertex * events since 'seen' is keyed by vertices. */ abstract public class UnionTravel<V, E, D> implements Iterable<V>, Consumer<V> { private final Iterable<CrossComponentTravel<V, E, D>> subTravels; private final Map<V, D> seen = new ConcurrentHashMap<V, D>(); public UnionTravel(MapGraph<V, E> g, V... keys) { this(g, Arrays.asList(keys)); } public UnionTravel(MapGraph<V, E> g, Iterable<V> keys) { subTravels = Iterables.transform(keys, x -> { CrossComponentTravel<V, E, D> t = get(x, g, seen); if (t.seen != seen) throw new RuntimeException("subTravels should have been constructed to share seen"); return t; }); } protected abstract CrossComponentTravel<V,E,D> get(V start, MapGraph<V, E> graph, Map<V, D> seen); @NotNull @Override public Iterator<V> iterator() { //TODO implement a custom iterator that provides intermediate results subTravels.forEach(s -> { //attach travellers // if (hasTravellers()) { // for (Traveller<V, E> t : travellers) { // s.addTraveller(t); // } // } s.forEachRemaining(this); }); return seen.keySet().iterator(); } @Override public void accept(V v) { } }