package edu.stanford.nlp.sempre.tables;
import java.util.*;
import edu.stanford.nlp.sempre.Value;
import edu.stanford.nlp.sempre.Values;
import fig.basic.LispTree;
/**
* Represent a list of infinitely many values.
*
* The list is represented by a List of Objects.
*
* @author ppasupat
*/
public class InfiniteListValue extends Value {
final List<Object> representation;
final int hashCode;
public InfiniteListValue(List<Object> representation) {
this.representation = representation;
this.hashCode = representation.hashCode();
}
public InfiniteListValue(String s) {
this(LispTree.proto.parseFromString(s));
}
public InfiniteListValue(LispTree tree) {
this.representation = new ArrayList<>();
for (LispTree child : tree.children) {
try {
Value value = Values.fromLispTree(child);
representation.add(value);
} catch (Exception e) {
representation.add(child.toString());
}
}
this.hashCode = representation.hashCode();
}
@Override
public LispTree toLispTree() {
LispTree tree = LispTree.proto.newList();
for (Object x : representation) {
if (x instanceof Value)
tree.addChild(((Value) x).toLispTree());
else
tree.addChild(x.toString());
}
return tree;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
InfiniteListValue that = (InfiniteListValue) o;
return representation.equals(that.representation);
}
@Override
public int hashCode() {
return hashCode;
}
}