package org.vertexium.util; import java.util.Iterator; public class OffsetAndSizeIterable<T> implements CloseableIterable<T> { private boolean doneCalled; private final Iterable<T> iterable; private final int offset; private final Integer size; public OffsetAndSizeIterable(Iterable<T> iterable, int offset, Integer size) { this.iterable = iterable; this.offset = offset; this.size = size; } @Override public Iterator<T> iterator() { Iterator<T> it = iterable.iterator(); return new CloseableIterator<T>() { private int currentOffset; private T next; private T current; @Override public boolean hasNext() { loadNext(); if (next == null) { close(); } return next != null; } @Override public T next() { loadNext(); this.current = this.next; this.next = null; return this.current; } @Override public void close() { CloseableUtils.closeQuietly(it); callClose(); } private void loadNext() { if (this.next != null) { return; } while (it.hasNext()) { T n = it.next(); if (isInRange()) { currentOffset++; this.next = n; break; } else { currentOffset++; } } } private boolean isInRange() { return currentOffset >= offset && (size == null || currentOffset < offset + size); } }; } private void callClose() { if (!doneCalled) { doneCalled = true; close(); } } @Override public void close() { } }