001package org.reactivestreams.tck.support;
002
003import org.reactivestreams.example.unicast.AsyncIterablePublisher;
004
005import java.util.Iterator;
006import java.util.concurrent.Executor;
007
008public class InfiniteHelperPublisher<T> extends AsyncIterablePublisher<T> {
009
010    public InfiniteHelperPublisher(final Function<Integer, T> create, final Executor executor) {
011        super(new Iterable<T>() {
012          @Override public Iterator<T> iterator() {
013            return new Iterator<T>() {
014              private int at = 0;
015
016              @Override public boolean hasNext() { return true; }
017              @Override public T next() {
018                try {
019                  return create.apply(at++); // Wraps around on overflow
020                } catch (Throwable t) {
021                  throw new IllegalStateException(
022                    String.format("Failed to create element in %s for id %s!", getClass().getSimpleName(), at - 1), t);
023                }
024              }
025              @Override public void remove() { throw new UnsupportedOperationException(); }
026            };
027          }
028        }, executor);
029    }
030}