/* * SK's Minecraft Launcher * Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors * Please see LICENSE.txt for license information. */ package com.skcraft.concurrency; import com.google.common.base.Function; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import java.util.concurrent.Callable; /** * An extension of {@link ListenableFuture} that provides convenience methods * to register functions that are triggered after upon the completion of * the underlying task. * * <p>Dependent functions are executed using the "default" executor which * is specified when {@code Deferred} is first created, unless * the async variants are used to register the function.</p> * * @param <I> The type returned */ public interface Deferred<I> extends ListenableFuture<I> { /** * Returns a new Deferred that represents the asynchronous computation * of the given action, which is only executed upon the normal completion * of this Deferred in the default executor. * * @param task The task * @param <O> The return type of the task * @return The new Deferred */ <O> Deferred<O> thenRun(Callable<O> task); /** * Returns a new Deferred that represents the asynchronous computation * of the given action, which is only executed upon the normal completion * of this Deferred in the provided executor. * * @param task The task * @param <O> The return type of the task * @return The new Deferred */ <O> Deferred<O> thenRunAsync(Callable<O> task, ListeningExecutorService executor); /** * Returns a new Deferred that represents the asynchronous execution * of the given action, which is only executed upon the normal completion * of this Deferred in the provided executor. * * @param task The task * @return The new Deferred */ Deferred<Void> thenRun(Runnable task); /** * Returns a new Deferred that represents the asynchronous execution * of the given action, which is only executed upon the normal completion * of this Deferred in the default executor. * * @param task The task * @return The new Deferred */ Deferred<Void> thenRunAsync(Runnable task, ListeningExecutorService executor); /** * Returns a new Deferred that represents the asynchronous execution * of the given action as a side effect that does not change the value * passed between the prior Deferred to any dependent Deferred instances. * * <p>The given action is only executed in the default executor upon the * normal completion of this Deferred.</p> * * @param task The task * @return The new Deferred */ Deferred<I> thenTap(Runnable task); /** * Returns a new Deferred that represents the asynchronous execution * of the given action as a side effect that does not change the value * passed between the prior Deferred to any dependent Deferred instances. * * <p>The given action is only executed in the provided executor upon the * normal completion of this Deferred.</p> * * @param task The task * @return The new Deferred */ Deferred<I> thenTapAsync(Runnable task, ListeningExecutorService executor); /** * Returns a new Deferred that represents the asynchronous execution * of the given function, which transforms the value of the previous * Deferred into a new value. * * <p>The given action is only executed in the default executor upon the * normal completion of this Deferred.</p> * * @param function The function * @return The new Deferred */ <O> Deferred<O> thenApply(Function<I, O> function); /** * Returns a new Deferred that represents the asynchronous execution * of the given function, which transforms the value of the previous * Deferred into a new value. * * <p>The given action is only executed in the provided executor upon the * normal completion of this Deferred.</p> * * @param function The function * @return The new Deferred */ <O> Deferred<O> thenApplyAsync(Function<I, O> function, ListeningExecutorService executor); /** * Adds callbacks that are executed asynchronously on success or failure * using the default executor. * * @param onSuccess The success callback * @param onFailure The failure callback * @return The Deferred */ Deferred<I> handle(Callback<I> onSuccess, Callback<Throwable> onFailure); /** * Adds callbacks that are executed asynchronously on success or failure. * * @param onSuccess The success callback * @param onFailure The failure callback * @param executor The executor * @return The Deferred */ Deferred<I> handleAsync(Callback<I> onSuccess, Callback<Throwable> onFailure, ListeningExecutorService executor); }