package edu.stanford.nlp.sempre.tables; import java.util.*; import com.google.common.base.Function; import edu.stanford.nlp.sempre.Formula; import fig.basic.LispTree; /** * Represent a binary with a restrict domain (scope). * * @author ppasupat */ public class ScopedFormula extends Formula { public final Formula head; public final Formula relation; public ScopedFormula(Formula head, Formula relation) { this.head = head; this.relation = relation; } @Override public LispTree toLispTree() { LispTree tree = LispTree.proto.newList(); tree.addChild("scoped"); tree.addChild(head.toLispTree()); tree.addChild(relation.toLispTree()); return tree; } @Override public void forEach(Function<Formula, Boolean> func) { if (!func.apply(this)) { head.forEach(func); relation.forEach(func); } } @Override public Formula map(Function<Formula, Formula> func) { Formula result = func.apply(this); return result == null ? new ScopedFormula(head.map(func), relation.map(func)) : result; } @Override public List<Formula> mapToList(Function<Formula, List<Formula>> func, boolean alwaysRecurse) { List<Formula> res = func.apply(this); if (res.isEmpty() || alwaysRecurse) { res.addAll(head.mapToList(func, alwaysRecurse)); res.addAll(relation.mapToList(func, alwaysRecurse)); } return res; } @SuppressWarnings({"equalshashcode"}) @Override public boolean equals(Object thatObj) { if (!(thatObj instanceof ScopedFormula)) return false; ScopedFormula that = (ScopedFormula) thatObj; if (!this.head.equals(that.head)) return false; if (!this.relation.equals(that.relation)) return false; return true; } @Override public int computeHashCode() { int hash = 0x7e2a16; hash = hash * 0xd3b2646c + head.hashCode(); hash = hash * 0xd3b2646c + relation.hashCode(); return hash; } }