package com.googlecode.totallylazy.collections; import com.googlecode.totallylazy.Option; import com.googlecode.totallylazy.iterators.ReadOnlyListIterator; import static com.googlecode.totallylazy.Option.none; import static com.googlecode.totallylazy.Option.some; public class ZipperListIterator<T> extends ReadOnlyListIterator<T> { private Zipper<T> zipper; private Option<Direction> lastDirection; public enum Direction {next, previous} public ZipperListIterator(Zipper<T> zipper) { this.zipper = zipper; lastDirection = none(); } @Override public boolean hasNext() { return !zipper.isLast(); } @Override public T next() { if (lastDirection.contains(Direction.next)) zipper = zipper.next(); lastDirection = some(Direction.next); return zipper.value(); } @Override public boolean hasPrevious() { return !zipper.isFirst(); } @Override public T previous() { if (lastDirection.contains(Direction.previous)) zipper = zipper.previous(); lastDirection = some(Direction.previous); return zipper.value(); } @Override public int nextIndex() { return zipper.index() + (lastDirection.contains(Direction.next) ? 1 : 0); } @Override public int previousIndex() { return zipper.index() - (lastDirection.contains(Direction.next) ? 0 : 1); } }