package org.threadly.concurrent.future;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CancellationException;
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;
@SuppressWarnings("javadoc")
public class TestFutureImp implements ListenableFuture<Object> {
public final Object result = new Object();
protected boolean canceled = false;
protected List<Runnable> listeners = new ArrayList<>(1);
private final boolean runListeners;
public TestFutureImp(boolean runListeners) {
this.runListeners = runListeners;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
canceled = true;
return true;
}
@Override
public boolean isCancelled() {
return canceled;
}
@Override
public boolean isDone() {
return true;
}
@Override
public Object get() throws ExecutionException {
if (canceled) {
throw new CancellationException();
}
return result;
}
@Override
public Object get(long timeout, TimeUnit unit) throws TimeoutException {
if (canceled) {
throw new CancellationException();
}
return result;
}
@Override
public void addListener(Runnable listener) {
if (runListeners) {
listener.run();
} else {
listeners.add(listener);
}
}
@Override
public void addListener(Runnable listener, Executor executor) {
addListener(listener);
}
@Override
public void addCallback(FutureCallback<? super Object> callback) {
addCallback(callback, null);
}
@Override
public void addCallback(FutureCallback<? super Object> callback, Executor executor) {
addListener(new RunnableFutureCallbackAdapter<>(this, callback), executor);
}
@Override
public <R> ListenableFuture<R> map(Function<Object, ? extends R> mapper) {
return map(mapper, null);
}
@Override
public <R> ListenableFuture<R> map(Function<Object, ? extends R> mapper, Executor executor) {
return FutureUtils.transform(this, mapper, executor);
}
@Override
public <R> ListenableFuture<R> flatMap(Function<? super Object, ListenableFuture<R>> mapper) {
return flatMap(mapper, null);
}
@Override
public <R> ListenableFuture<R> flatMap(Function<? super Object, ListenableFuture<R>> mapper,
Executor executor) {
return FutureUtils.flatTransform(this, mapper, executor);
}
}