FlatMappingIterable.java

  1. package no.motif.iter;

  2. import java.io.Serializable;
  3. import java.util.Iterator;

  4. import no.motif.f.Fn;

  5. class FlatMappingIterable<I, O> implements Iterable<O>, Serializable {


  6.     private final Iterable<I> elements;
  7.     private final Fn<? super I, ? extends Iterable<O>> fn;

  8.     public FlatMappingIterable(Iterable<I> elements, Fn<? super I, ? extends Iterable<O>> fn) {
  9.         this.elements = elements;
  10.         this.fn = fn;
  11.     }

  12.     @Override
  13.     public Iterator<O> iterator() {
  14.         return new FlatMappingIterator();
  15.     }

  16.     private final class FlatMappingIterator extends ReadOnlyIterator<O> {
  17.         Iterator<I> iterator = elements.iterator();
  18.         Iterator<O> mapped = EmptyIterator.<O>instance();

  19.         @Override
  20.         public boolean hasNext() {
  21.             if (!mapped.hasNext() && iterator.hasNext()) {
  22.                 mapped = fn.$(iterator.next()).iterator();
  23.             }
  24.             return mapped.hasNext();
  25.         }

  26.         @Override
  27.         public O next() {
  28.             return mapped.next();
  29.         }
  30.     }

  31. }