All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mutiny.zero.internal.GeneratorPublisher Maven / Gradle / Ivy

Go to download

Mutiny Zero is a minimal API for creating reactive-streams compliant publishers

There is a newer version: 1.1.1
Show newest version
package mutiny.zero.internal;

import static java.util.Objects.requireNonNull;

import java.util.Iterator;
import java.util.concurrent.Flow;
import java.util.function.Function;
import java.util.function.Supplier;

public class GeneratorPublisher implements Flow.Publisher {

    private final Supplier stateSupplier;
    private final Function> generator;

    public GeneratorPublisher(Supplier stateSupplier, Function> generator) {
        this.stateSupplier = stateSupplier;
        this.generator = generator;
    }

    @Override
    public void subscribe(Flow.Subscriber subscriber) {
        requireNonNull(subscriber, "The subscriber cannot be null");
        Iterator iterator = generator.apply(stateSupplier.get());
        if (iterator == null) {
            subscriber.onSubscribe(new AlreadyCompletedSubscription());
            subscriber.onError(new IllegalArgumentException("The generator cannot produce a null iterator"));
        } else if (!iterator.hasNext()) {
            subscriber.onSubscribe(new AlreadyCompletedSubscription());
            subscriber.onComplete();
        } else {
            subscriber.onSubscribe(new IteratorSubscription<>(iterator, subscriber));
        }
    }

}