package edu.stanford.nlp.sempre.tables.lambdadcs;
import edu.stanford.nlp.sempre.*;
import edu.stanford.nlp.sempre.AggregateFormula.Mode;
import edu.stanford.nlp.sempre.tables.lambdadcs.LambdaDCSException.Type;
import fig.basic.LispTree;
/**
* Mapping denotation: a mapping from variable assignment to values.
*
* Share the implementation with BinaryDenotation by using PairList.
*
* @author ppasupat
*/
public class MappingDenotation<PL extends PairList> implements Unarylike {
protected final String domainVar;
protected final PL pairList;
protected MappingDenotation(String domainVar, PL pairList) {
this.domainVar = domainVar;
this.pairList = pairList;
}
@Override
public String toString() {
return toLispTree().toString();
}
@Override
public LispTree toLispTree() {
return LispTree.proto.L("mapping", domainVar, pairList.toLispTree());
}
@Override
public ListValue toValue() {
throw new LambdaDCSException(Type.notUnary, "Expected Unary; Mapping found: %s", this);
}
@Override
public String getDomainVar() {
return domainVar;
}
public BinaryDenotation<PL> asBinary() {
return new BinaryDenotation<PL>(pairList);
}
@Override public UnaryDenotation domain() { return pairList.domain(); }
@Override public UnaryDenotation range() { return pairList.range(); }
@Override public UnaryDenotation get(Value key) { return pairList.get(key); }
@Override public UnaryDenotation inverseGet(Value value) { return pairList.inverseGet(value); }
@Override public Unarylike aggregate(Mode mode) {
return new MappingDenotation<>(domainVar, pairList.aggregate(mode));
}
@Override public Unarylike filter(UnaryDenotation upperBound, UnaryDenotation domainUpperBound) {
return new MappingDenotation<>(domainVar, pairList.filter(upperBound, domainUpperBound));
}
}