package org.enumerable.lambda.enumerable; import java.util.Iterator; import java.util.NoSuchElementException; import org.enumerable.lambda.Fn1; import org.enumerable.lambda.Fn2; import org.enumerable.lambda.enumerable.collection.EnumerableModule; /** * An {@link Iterable} that represents a ascending range of integers. Includes * the {@link EnumerableModule} by extension. */ public class Range extends EnumerableModule<Integer> { public final int start, end; public final boolean exclusive; public Range(int start, int end) { this(start, end, false); } public Range(int start, int end, boolean exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; } public <R> Range each(Fn1<? super Integer, R> block) { return (Range) super.each(block); } public <R> Range eachWithIndex(Fn2<? super Integer, Integer, R> block) { return (Range) super.eachWithIndex(block); } public <R> Range reverseEach(Fn1<? super Integer, R> block) { return (Range) super.reverseEach(block); } public int[] toArray() { int[] array = new int[(exclusive ? end : end + 1) - start]; int i = 0; for (Integer integer : this) array[i++] = integer; return array; } public Iterator<Integer> iterator() { return new Iterator<Integer>() { int x = start; public boolean hasNext() { return exclusive ? x < end : x <= end; } public Integer next() { if (!hasNext()) throw new NoSuchElementException(); return x++; } public void remove() { throw new UnsupportedOperationException(); } }; } }