import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * Los enteros desde from (incluido) hasta to (excluido), de step en step.
 * No guarda los números: el iterador los calcula a medida que se piden.
 */
public class NumberRange implements Iterable<Integer> {

    private final int from;
    private final int to;
    private final int step;

    public NumberRange(int from, int to, int step) {
        if (step <= 0) {
            throw new IllegalArgumentException("step debe ser positivo: " + step);
        }
        this.from = from;
        this.to = to;
        this.step = step;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new RangeIterator();
    }

    /** Clase interna: cada iterador tiene su propio cursor y ve los campos del rango. */
    private class RangeIterator implements Iterator<Integer> {

        private int next = from;

        @Override
        public boolean hasNext() {
            return next < to;
        }

        @Override
        public Integer next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            int current = next;
            next += step;
            return current;
        }
    }
}
