BoundedIterable.java

package no.motif.iter;

import static no.motif.Singular.optional;

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

import no.motif.Singular;
import no.motif.single.Optional;

class BoundedIterable<T> implements Iterable<T>, Serializable {

    private final Iterable<T> elements;
    private final int maxAmount;

    BoundedIterable(int maxAmount, Iterable<T> elements) {
        this.maxAmount = maxAmount;
        this.elements = elements;}

    @Override public Iterator<T> iterator() {
        return new SimpleIterator<T>() {
            int returned = 0;
            final Iterator<T> iterator = elements.iterator();
            @Override protected Optional<T> nextIfAvailable() {
                return returned++ < maxAmount && iterator.hasNext()? optional(iterator.next()) : Singular.<T>none();
            }};
    }

}