package io.muoncore.api; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class ImmediateReturnFuture<X> implements MuonFuture<X> { private X theReturn; public ImmediateReturnFuture(X val) { this.theReturn = val; } @Override public Publisher<X> toPublisher() { return new ImmediatePublisher(); } @Override public boolean cancel(boolean mayInterruptIfRunning) { return false; } @Override public boolean isCancelled() { return false; } @Override public boolean isDone() { return true; } @Override public X get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return get(); } @Override public void then(PromiseFunction<X> onFulfilled) { new Thread(() -> onFulfilled.call(theReturn)); } @Override public X get() { return theReturn; } class ImmediatePublisher implements Publisher<X> { @Override public void subscribe(Subscriber<? super X> s) { s.onSubscribe(new DefaultPromiseSubscription(s)); } class DefaultPromiseSubscription implements Subscription { private Subscriber<? super X> sub; public DefaultPromiseSubscription(Subscriber<? super X> sub) { this.sub = sub; } @Override public void request(long n) { sub.onNext(theReturn); sub.onComplete(); } @Override public void cancel() { //noop } } } }