package org.neo4j.helpers.collection; import java.util.Iterator; /** * For each item in the supplied iterator (called "surface item") there's * instantiated an iterator from that item which is iterated before moving * on to the next surface item. * * @param <T> the type of items. * @param <U> the type of items in the surface item iterator */ public abstract class NestingIterable<T, U> implements Iterable<T> { private Iterable<U> source; public NestingIterable( Iterable<U> source ) { this.source = source; } public Iterator<T> iterator() { return new NestingIterator<T, U>( source.iterator() ) { @Override protected Iterator<T> createNestedIterator( U item ) { return NestingIterable.this.createNestedIterator( item ); } }; } protected abstract Iterator<T> createNestedIterator( U item ); }