package org.infernus.idea.checkstyle.util;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProgressManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
public class Async {
private static final int FIFTY_MS = 50;
private Async() {}
@Nullable
public static <T> T asyncResultOf(@NotNull final Callable<T> callable,
@Nullable final T defaultValue) {
try {
return whenFinished(executeOnPooledThread(callable)).get();
} catch (Exception e) {
return defaultValue;
}
}
public static <T> Future<T> executeOnPooledThread(final Callable<T> callable) {
return ApplicationManager.getApplication().executeOnPooledThread(callable);
}
public static <T> Future<T> whenFinished(final Future<T> future) {
while (!future.isDone() && !future.isCancelled()) {
ProgressManager.checkCanceled();
waitFor(FIFTY_MS);
}
return future;
}
private static void waitFor(final int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
}
}
}