package uk.kludje.experimental.sequence; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.stream.IntStream; import java.util.stream.Stream; import java.util.stream.StreamSupport; public interface Sequence<T> extends Iterable<T> { int length(); T get(int index); default IntStream indices() { return IntStream.range(0, length()); } default Stream<T> stream() { return StreamSupport.stream(this.spliterator(), false); } @Override default Iterator<T> iterator() { return new SequenceIterator<>(this); } } final class SequenceIterator<E> implements Iterator<E> { private final Sequence<E> sequence; private int index = 0; public SequenceIterator(Sequence<E> seq) { this.sequence = seq; } @Override public boolean hasNext() { return index < sequence.length(); } @Override public E next() { if (!hasNext()) { throw new NoSuchElementException(); } return sequence.get(index++); } }