}
private IValue traverseTupleOnce(IValue subject, CaseBlockList casesOrRules,
DIRECTION direction, PROGRESS progress, FIXEDPOINT fixedpoint, TraverseResult tr) {
IValue result;
ITuple tuple = (ITuple) subject;
int arity = tuple.arity();
IValue args[] = new IValue[arity];
boolean hasMatched = false;
boolean hasChanged = false;
for (int i = 0; i < arity; i++){
tr.changed = false;
tr.matched = false;
args[i] = traverseOnce(tuple.get(i), casesOrRules, direction, progress, fixedpoint, tr);
hasMatched |= tr.matched;
hasChanged |= tr.changed;
}
result = eval.getValueFactory().tuple(args);