package com.codepoetics.protonpack; import java.util.Optional; import java.util.Spliterator; import java.util.function.Consumer; import java.util.function.Function; class UnfoldSpliterator<T> implements Spliterator<T> { static <T> UnfoldSpliterator<T> over(T seed, Function<T, Optional<T>> generator) { return new UnfoldSpliterator<>(seed, generator); } private Optional<T> current; private final Function<T, Optional<T>> generator; private UnfoldSpliterator(T seed, Function<T, Optional<T>> generator) { this.current = Optional.of(seed); this.generator = generator; } @Override public boolean tryAdvance(Consumer<? super T> action) { current.ifPresent(action); current = current.flatMap(generator); return current.isPresent(); } @Override public Spliterator<T> trySplit() { return null; } @Override public long estimateSize() { return Long.MAX_VALUE; } @Override public int characteristics() { return Spliterator.IMMUTABLE & Spliterator.NONNULL & Spliterator.ORDERED; } }