package tc.oc.commons.core.concurrent;
import java.util.function.Consumer;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.ListenableFuture;
import tc.oc.commons.core.util.Pair;
import tc.oc.commons.core.util.ThrowingBiConsumer;
/**
* An {@link java.util.concurrent.Executor} that executes tasks contingent
* on the availability of some contextual object at the time the task is run.
* If the context object is available, it is passed to the consumer/callback.
* If it is not available, the consumer/callback does not run.
*
* The methods that take a {@link ListenableFuture} parameter work the same
* way as the respective methods in {@link Flexecutor} i.e. they
* simply register the callback with the future to be called on this executor.
*/
public interface ContextualExecutor<C> {
void execute(Consumer<C> task);
<T> void callback(ListenableFuture<T> future, FutureCallback<Pair<C, T>> callback);
<T> void callback(ListenableFuture<T> future, ThrowingBiConsumer<C, T, Exception> callback);
}