package jetbrains.mps.make.unittest; /*Generated by MPS */ import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import java.util.Map; import java.util.List; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.internal.make.runtime.util.GraphAnalyzer; public class Graph<V> { private Set<V> vertices = SetSequence.fromSet(new HashSet<V>()); private Map<V, List<V>> fwEdges = MapSequence.fromMap(new HashMap<V, List<V>>()); private Map<V, List<V>> bkEdges = MapSequence.fromMap(new HashMap<V, List<V>>()); private _FunctionTypes._return_P1_E0<? extends Comparable<?>, ? super V> sorter; private boolean asc; public Graph() { } public void addEdges(V from, V... to) { List<V> fw = MapSequence.fromMap(fwEdges).get(from); if (fw == null) { fw = ListSequence.fromList(new ArrayList<V>()); MapSequence.fromMap(fwEdges).put(from, fw); } SetSequence.fromSet(vertices).addElement(from); for (V next : to) { ListSequence.fromList(fw).addElement(next); List<V> bk = MapSequence.fromMap(bkEdges).get(next); if (bk == null) { bk = ListSequence.fromList(new ArrayList<V>()); MapSequence.fromMap(bkEdges).put(next, bk); } ListSequence.fromList(bk).addElement(from); SetSequence.fromSet(vertices).addElement(next); } } public void sort(_FunctionTypes._return_P1_E0<? extends Comparable<?>, ? super V> sorter, boolean asc) { this.sorter = sorter; this.asc = asc; } public Iterable<V> getVertices() { return (sorter != null ? SetSequence.fromSet(vertices).sort(sorter, asc) : vertices); } public GraphAnalyzer<V> getCycleDetector() { return new GraphAnalyzer<V>() { @Override public Iterable<V> forwardEdges(V v) { return MapSequence.fromMap(fwEdges).get(v); } @Override public Iterable<V> vertices() { return getVertices(); } @Override public Iterable<V> backwardEdges(V v) { return MapSequence.fromMap(bkEdges).get(v); } }; } }