package org.threadly.concurrent.future;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Function;
/**
* Implementation of the {@link ListenableScheduledFuture} interface. This design delegates
* between a {@link Delayed} instance and {@link ListenableFuture} instance.
*
* @since 1.0.0
* @param <T> The result object type returned by this future
*/
public class ScheduledFutureDelegate<T> implements ListenableScheduledFuture<T> {
protected final ListenableFuture<? extends T> futureImp;
protected final Delayed delayed;
/**
* Constructs a new {@link ScheduledFutureDelegate} with the provided instances to call to for
* each interface.
*
* @param futureImp implementation to call to for all Future calls
* @param delayed implementation to call to for getDelay and compareTo
*/
public ScheduledFutureDelegate(ListenableFuture<? extends T> futureImp, Delayed delayed) {
this.futureImp = futureImp;
this.delayed = delayed;
}
@Override
public long getDelay(TimeUnit unit) {
return delayed.getDelay(unit);
}
@Override
public int compareTo(Delayed o) {
return delayed.compareTo(o);
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return futureImp.cancel(mayInterruptIfRunning);
}
@Override
public boolean isCancelled() {
return futureImp.isCancelled();
}
@Override
public boolean isDone() {
return futureImp.isDone();
}
@Override
public T get() throws InterruptedException, ExecutionException {
return futureImp.get();
}
@Override
public T get(long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
return futureImp.get(timeout, unit);
}
@Override
public void addListener(Runnable listener) {
futureImp.addListener(listener);
}
@Override
public void addListener(Runnable listener, Executor executor) {
futureImp.addListener(listener, executor);
}
@Override
public void addCallback(FutureCallback<? super T> callback) {
futureImp.addCallback(callback);
}
@Override
public void addCallback(FutureCallback<? super T> callback, Executor executor) {
futureImp.addCallback(callback, executor);
}
@Override
public <R> ListenableFuture<R> map(Function<? super T, ? extends R> mapper) {
return futureImp.map(mapper);
}
@Override
public <R> ListenableFuture<R> map(Function<? super T, ? extends R> mapper, Executor executor) {
return futureImp.map(mapper, executor);
}
@Override
public <R> ListenableFuture<R> flatMap(Function<? super T, ListenableFuture<R>> mapper) {
return flatMap(mapper, null);
}
@Override
public <R> ListenableFuture<R> flatMap(Function<? super T, ListenableFuture<R>> mapper, Executor executor) {
return FutureUtils.flatTransform(this, mapper, executor);
}
}