package org.rascalmpl.interpreter.cursors;
import java.util.Iterator;
import org.rascalmpl.value.ITuple;
import org.rascalmpl.value.IValue;
import org.rascalmpl.value.exceptions.FactTypeUseException;
public class TupleCursor extends Cursor implements ITuple {
public TupleCursor(IValue value) {
super(value);
}
public TupleCursor(IValue value, Context ctx) {
super(value, ctx);
}
private ITuple getTuple() {
return (ITuple)getWrappedValue();
}
@Override
public Iterator<IValue> iterator() {
return new Iterator<IValue>() {
int i = 0;
Iterator<IValue> iter = getTuple().iterator();
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public IValue next() {
return TupleCursor.this.get(i++);
}
@Override
public void remove() {
}
};
}
@Override
public IValue get(int i) throws IndexOutOfBoundsException {
Context ctx = new TupleIndexContext(getCtx(), i, getTuple());
return CursorFactory.makeCursor(getTuple().get(i), ctx);
}
@Override
public IValue get(String label) throws FactTypeUseException {
Context ctx = new TupleLabelContext(getCtx(), label, getTuple());
return CursorFactory.makeCursor(getTuple().get(label), ctx);
}
@Override
public ITuple set(int i, IValue arg) throws IndexOutOfBoundsException {
return new TupleCursor(getTuple().set(i, arg), getCtx());
}
@Override
public ITuple set(String label, IValue arg) throws FactTypeUseException {
return new TupleCursor(getTuple().set(label, arg), getCtx());
}
@Override
public int arity() {
return getTuple().arity();
}
@Override
public IValue select(int... fields) throws IndexOutOfBoundsException {
Context ctx = new TupleSelectContext(getCtx(), fields, getTuple());
return CursorFactory.makeCursor(getTuple().select(fields), ctx);
}
@Override
public IValue selectByFieldNames(String... fields)
throws FactTypeUseException {
Context ctx = new TupleSelectByFieldNamesContext(getCtx(), fields, getTuple());
return CursorFactory.makeCursor(getTuple().selectByFieldNames(fields), ctx);
}
}