package edu.stanford.nlp.sempre;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import fig.basic.LispTree;
import fig.basic.LogInfo;
import fig.basic.Pair;
/**
* Represent a binary using a list of pairs.
*
* @author ppasupat
*/
public class PairListValue extends Value {
public final List<Pair<Value, Value>> pairs;
public PairListValue(LispTree tree) {
pairs = new ArrayList<>();
for (int i = 1; i < tree.children.size(); i++)
pairs.add(new Pair<>(
Values.fromLispTree(tree.child(i).child(0)),
Values.fromLispTree(tree.child(i).child(1))));
}
public PairListValue(List<Pair<Value, Value>> pairs) { this.pairs = pairs; }
protected static final LispTree NULL_LEAF = LispTree.proto.newLeaf(null);
public LispTree toLispTree() {
LispTree tree = LispTree.proto.newList();
tree.addChild("pairs");
for (Pair<Value, Value> pair : pairs) {
Value first = pair.getFirst(), second = pair.getSecond();
tree.addChild(LispTree.proto.newList(
first == null ? NULL_LEAF : first.toLispTree(), second == null ? NULL_LEAF : second.toLispTree()));
}
return tree;
}
public void log() {
for (Pair<Value, Value> pair : pairs)
LogInfo.logs("%s | %s", pair.getFirst(), pair.getSecond());
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PairListValue that = (PairListValue) o;
return pairs.equals(that.pairs);
}
@Override public int hashCode() { return pairs.hashCode(); }
// Sorted on string representation
public PairListValue getSorted() {
List<Pair<Value, Value>> sorted = new ArrayList<>(pairs);
Collections.sort(sorted,
(Pair<Value, Value> p1, Pair<Value, Value> p2) -> getQuickStringOfPair(p1).compareTo(getQuickStringOfPair(p2)));
return new PairListValue(sorted);
}
private static String getQuickStringOfPair(Pair<Value, Value> pair) {
Value v1 = pair.getFirst(), v2 = pair.getSecond();
return (v1 == null ? "null" : v1.sortString()) + " " + (v2 == null ? "null" : v2.sortString());
}
}