public ListIterator<Integer> listIterator(int index) {
			resizeCachesIfPrimeIndexTooBig(index);
			final int ind = index;
			return new ListIterator<Integer>() {
				// the iterator over the actual collection
				private ListIterator<Integer> backingIterator = primeListCache.listIterator(ind);
				private int last = -1;

				@Override
				public boolean hasNext() {
					return true; // there are always more primes
				}

				@Override
				public Integer next() {
					if (!backingIterator.hasNext()) {
						// if we're out of primes, we need to resize and get a new iterator
						resizeCaches();
						backingIterator = primeListCache.listIterator();
						// fast forward to our old position.
						// TODO: optimize this
						while (backingIterator.next() != last);
					}
					return last = backingIterator.next();
				}

				@Override
				public void remove() {
					throw new UnsupportedOperationException("don't delete from this collection, yo. it's immutable!");
				}

				@Override
				public void add(Integer e) {
					throw new UnsupportedOperationException("don't add to this collection, yo. it's immutable!");
				}

				@Override
				public boolean hasPrevious() {
					return backingIterator.hasPrevious();
				}

				@Override
				public int nextIndex() {
					return backingIterator.nextIndex();
				}

				@Override
				public Integer previous() {
					return last = backingIterator.previous();
				}

				@Override
				public int previousIndex() {
					return backingIterator.previousIndex();
				}

				@Override
				public void set(Integer e) {
					throw new UnsupportedOperationException("don't modify this collection, yo. it's immutable!");
				}
			};
		}