package org.vertexium.util; import java.util.Iterator; public abstract class ConvertingIterable<TSource, TDest> implements Iterable<TDest> { private Iterable<? extends TSource> iterable; private Iterator<? extends TSource> iterator; public ConvertingIterable(Iterable<? extends TSource> iterable) { this.iterable = iterable; } public ConvertingIterable(Iterator<? extends TSource> iterator) { this.iterator = iterator; } @Override public Iterator<TDest> iterator() { final Iterator<? extends TSource> it = iterator == null ? iterable.iterator() : iterator; return new CloseableIterator<TDest>() { @Override public boolean hasNext() { boolean hasNext = it.hasNext(); if (!hasNext) { close(); } return hasNext; } @Override public TDest next() { return convert(it.next()); } @Override public void remove() { it.remove(); } @Override public void close() { CloseableUtils.closeQuietly(it); } }; } protected abstract TDest convert(TSource o); }