public IValue visitRelation(ISet o) throws RuntimeException {
List<IValue> elements = new ArrayList<IValue>(o.size());
for (IValue e : o) {
elements.add(e.accept(this));
}
ISetWriter writer = vf.relationWriter(calcLub(elements));
writer.insertAll(elements);
return writer.done();
}
@Override
public IValue visitListRelation(IList o) throws RuntimeException {
List<IValue> elements = new ArrayList<IValue>(o.length());
for (IValue e : o) {
elements.add(e.accept(this));
}
IListWriter writer = vf.listRelationWriter(calcLub(elements));
writer.appendAll(elements);
return writer.done();
}
@Override
public IValue visitSet(ISet o) throws RuntimeException {
List<IValue> elements = new ArrayList<IValue>(o.size());
for (IValue e : o) {
elements.add(e.accept(this));
}
ISetWriter writer = vf.setWriter(calcLub(elements));
writer.insertAll(elements);
return writer.done();
}
@Override
public IValue visitTuple(ITuple o) throws RuntimeException {
IValue[] elements = new IValue[o.arity()];
Type[] types = new Type[o.arity()];
for (int i = 0; i < elements.length; i++) {
elements[i] = o.get(i).accept(this);
types[i] = elements[i].getType();
}
return vf.tuple(tf.tupleType(types), elements);
}
@Override
public IValue visitNode(INode o) throws RuntimeException {
IValue[] children = new IValue[o.arity()];
for (int i = 0; i < children.length; i++) {
children[i] = o.get(i).accept(this);
}
if (o.mayHaveKeywordParameters()) {
IWithKeywordParameters<? extends INode> okw = o.asWithKeywordParameters();
Map<String, IValue> oldKwParams = okw.getParameters();
Map<String, IValue> kwParams = new HashMap<>(oldKwParams.size());
for (String key : oldKwParams.keySet()) {
kwParams.put(key, oldKwParams.get(key).accept(this));
}
return vf.node(o.getName(), children, kwParams);
}
return vf.node(o.getName(), children);
}
@Override
public IValue visitMap(IMap o) throws RuntimeException {
Iterator<Entry<IValue,IValue>> entries = o.entryIterator();
Map<IValue, IValue> newEntries = new HashMap<>(o.size());
while (entries.hasNext()) {
Entry<IValue, IValue> ent = entries.next();
newEntries.put(ent.getKey().accept(this), ent.getValue().accept(this));
}
IMapWriter writer = vf.mapWriter(calcLub(newEntries.keySet()), calcLub(newEntries.values()));
writer.putAll(newEntries);
return writer.done();
}
@Override
public IValue visitConstructor(IConstructor o)
throws RuntimeException {