package edu.ucsd.arcum.interpreter.satisfier; import static edu.ucsd.arcum.ArcumPlugin.DEBUG; import java.util.*; import edu.ucsd.arcum.interpreter.ast.TraitSignature; import edu.ucsd.arcum.interpreter.query.EntityTuple; import edu.ucsd.arcum.util.StringUtil; public class BindingsSet implements Iterable<BindingMap> { private final SortedSet<BindingMap> set; private BindingsSet() { this.set = new TreeSet<BindingMap>(); } public BindingsSet union(BindingsSet that) { BindingsSet result = newEmptySet(); result.set.addAll(this.set); result.set.addAll(that.set); return result; } public static BindingsSet newEmptySet() { return new BindingsSet(); } public static BindingsSet newSet(BindingMap... maps) { BindingsSet result = new BindingsSet(); for (BindingMap map : maps) { result.addEntry(map); } return result; } public void addEntry(BindingMap theta) { set.add(theta); } @Override public String toString() { return String.format("{%s} = %d members", StringUtil.separate(this.set, String .format(";%n")), this.set.size()); } public Collection<List<EntityTuple>> extractAsEntityTuples(List<TraitSignature> types) { List<List<EntityTuple>> result = new ArrayList<List<EntityTuple>>(set.size()); for (BindingMap bindingMap : set) { List<EntityTuple> entityTuple = bindingMap.asEntityTuple(types); result.add(entityTuple); } if (DEBUG) { System.out.printf("Turned:%n%s%nInto:%n%s%n%n", this, StringUtil.separate( result, String.format("%n"))); } return result; } public int size() { return set.size(); } @Override public Iterator<BindingMap> iterator() { return set.iterator(); } public boolean isEquivalentTo(BindingsSet that) { return this.set.equals(that.set); } }