package org.rascalmpl.interpreter.cursors; import java.util.Iterator; import java.util.Random; import org.rascalmpl.value.IList; import org.rascalmpl.value.IListRelation; import org.rascalmpl.value.IValue; import org.rascalmpl.value.exceptions.FactTypeUseException; import org.rascalmpl.value.type.Type; public class ListCursor extends Cursor implements IList { public ListCursor(IList list) { super(list); } public ListCursor(IList list, Context ctx) { super(list, ctx); } IList getList() { return (IList)getWrappedValue(); } @Override public Iterator<IValue> iterator() { return new Iterator<IValue>() { private int i = 0; private Iterator<IValue> iter = getList().iterator(); @Override public boolean hasNext() { return iter.hasNext(); } @Override public IValue next() { iter.next(); return ListCursor.this.get(i++); } @Override public void remove() { } }; } @Override public Type getElementType() { return getList().getElementType(); } @Override public int length() { return getList().length(); } @Override public IList reverse() { return new ListCursor(getList().reverse(), getCtx()); } @Override public IList shuffle(Random rand) { return new ListCursor(getList().shuffle(rand), getCtx()); } @Override public IList append(IValue e) { return new ListCursor(getList().append(e), getCtx()); } @Override public IList insert(IValue e) { return new ListCursor(getList().insert(e), getCtx()); } @Override public IList concat(IList o) { return new ListCursor(getList().concat(o), getCtx()); } @Override public IList put(int i, IValue e) throws FactTypeUseException, IndexOutOfBoundsException { return new ListCursor(getList().put(i, e), getCtx()); } @Override public IList replace(int first, int second, int end, IList repl) throws FactTypeUseException, IndexOutOfBoundsException { return new ListCursor(getList().replace(first, second, end, repl), getCtx()); } @Override public IValue get(int i) throws IndexOutOfBoundsException { ListContext ctx = new ListContext(getCtx(), i, getList()); return CursorFactory.makeCursor(getList().get(i), ctx); } @Override public IList sublist(int offset, int length) { Context ctx = new SubListContext(getCtx(), offset, length, getList()); return new ListCursor(getList().sublist(offset, length), ctx); } @Override public boolean isEmpty() { return getList().isEmpty(); } @Override public boolean contains(IValue e) { return getList().contains(e); } @Override public IList delete(IValue e) { return new ListCursor(getList().delete(e), getCtx()); } @Override public IList delete(int i) { return new ListCursor(getList().delete(i), getCtx()); } @Override public IList product(IList l) { return new ListCursor(getList().product(l), getCtx()); } @Override public IList intersect(IList l) { return new ListCursor(getList().intersect(l), getCtx()); } @Override public IList subtract(IList l) { return new ListCursor(getList().subtract(l), getCtx()); } @Override public boolean isSubListOf(IList l) { return getList().isSubListOf(l); } @Override public boolean isRelation() { return getList().isRelation(); } @Override public IListRelation<IList> asRelation() { // wrap in cursor? return getList().asRelation(); } }