package org.rascalmpl.interpreter.cursors;
import java.util.Iterator;
import org.rascalmpl.value.IAnnotatable;
import org.rascalmpl.value.IList;
import org.rascalmpl.value.INode;
import org.rascalmpl.value.IValue;
import org.rascalmpl.value.IWithKeywordParameters;
import org.rascalmpl.value.exceptions.FactTypeUseException;
public class NodeCursor extends Cursor implements INode {
public NodeCursor(INode value) {
super(value);
}
public NodeCursor(INode value, Context ctx) {
super(value, ctx);
}
private INode getNode() {
return (INode)getWrappedValue();
}
@Override
public IValue get(int i) throws IndexOutOfBoundsException {
Context ctx = new NodeIndexContext(getCtx(), i, getNode());
return CursorFactory.makeCursor(getNode().get(i), ctx);
}
@Override
public INode set(int i, IValue newChild) throws IndexOutOfBoundsException {
return new NodeCursor(getNode().set(i, newChild), getCtx());
}
@Override
public int arity() {
return getNode().arity();
}
@Override
public String getName() {
return getNode().getName();
}
@Override
public Iterable<IValue> getChildren() {
return new Iterable<IValue>() {
@Override
public Iterator<IValue> iterator() {
return NodeCursor.this.iterator();
}
};
}
@Override
public Iterator<IValue> iterator() {
return new Iterator<IValue>() {
Iterator<IValue> iter = getNode().iterator();
int i = 0;
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public IValue next() {
return NodeCursor.this.get(i++);
}
@Override
public void remove() {
}
};
}
@Override
public INode replace(int first, int second, int end, IList repl)
throws FactTypeUseException, IndexOutOfBoundsException {
return new NodeCursor(getNode().replace(first, second, end, repl), getCtx());
}
@Override
public IAnnotatable<? extends INode> asAnnotatable() {
return getNode().asAnnotatable();
}
@Override
public boolean mayHaveKeywordParameters() {
return getNode().mayHaveKeywordParameters();
}
@Override
public IWithKeywordParameters<? extends INode> asWithKeywordParameters() {
return getNode().asWithKeywordParameters();
}
}