package io.trane.future;
import java.time.Duration;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
class NoFuture<T> implements Future<T> {
@Override
public void raise(final Throwable ex) {
}
@Override
public Future<T> interruptible() {
return this;
}
@SuppressWarnings("unchecked")
@Override
public <R> Future<R> map(final Function<? super T, ? extends R> f) {
return (Future<R>) this;
}
@SuppressWarnings("unchecked")
@Override
public <R> Future<R> flatMap(final Function<? super T, ? extends Future<R>> f) {
return (Future<R>) this;
}
@SuppressWarnings("unchecked")
@Override
public <R> Future<R> transform(final Transformer<? super T, ? extends R> t) {
return (Future<R>) this;
}
@SuppressWarnings("unchecked")
@Override
public <R> Future<R> transformWith(final Transformer<? super T, ? extends Future<R>> t) {
return (Future<R>) this;
}
@SuppressWarnings("unchecked")
@Override
public <U, R> Future<R> biMap(final Future<U> other, final BiFunction<? super T, ? super U, ? extends R> f) {
return (Future<R>) this;
}
@SuppressWarnings("unchecked")
@Override
public <U, R> Future<R> biFlatMap(final Future<U> other,
final BiFunction<? super T, ? super U, ? extends Future<R>> f) {
return (Future<R>) this;
}
@Override
public Future<T> ensure(final Runnable r) {
return this;
}
@Override
public Future<T> onSuccess(final Consumer<? super T> c) {
return this;
}
@Override
public Future<T> onFailure(final Consumer<Throwable> c) {
return this;
}
@Override
public Future<T> respond(final Responder<? super T> r) {
return this;
}
@Override
public Future<T> rescue(final Function<Throwable, ? extends Future<T>> f) {
return this;
}
@Override
public boolean isDefined() {
return false;
}
@Override
public T get(final Duration timeout) throws CheckedFutureException {
join(timeout);
throw new TimeoutException();
}
@Override
public void join(final Duration timeout) throws CheckedFutureException {
try {
Thread.sleep(timeout.toMillis());
} catch (final InterruptedException e) {
throw new CheckedFutureException(e);
}
}
@SuppressWarnings("unchecked")
@Override
public Future<Void> voided() {
return (Future<Void>) this;
}
@Override
public Future<T> delayed(final Duration delay, final ScheduledExecutorService scheduler) {
return this;
}
@Override
public void proxyTo(final Promise<T> p) {
}
@Override
public Future<T> within(final Duration timeout, final ScheduledExecutorService scheduler,
final Throwable exception) {
return this;
}
}