/* __ __ __ __ __ ___ * \ \ / / \ \ / / __/ * \ \/ / /\ \ \/ / / * \____/__/ \__\____/__/.ɪᴏ * ᶜᵒᵖʸʳᶦᵍʰᵗ ᵇʸ ᵛᵃᵛʳ ⁻ ˡᶦᶜᵉⁿˢᵉᵈ ᵘⁿᵈᵉʳ ᵗʰᵉ ᵃᵖᵃᶜʰᵉ ˡᶦᶜᵉⁿˢᵉ ᵛᵉʳˢᶦᵒⁿ ᵗʷᵒ ᵈᵒᵗ ᶻᵉʳᵒ */ package io.vavr.concurrent; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.*; final class ExecutorServices { private static final ExecutorService TRIVIAL_EXECUTOR_SERVICE = new TrivialExecutorService(); private static final ExecutorService REJECTING_EXECUTOR_SERVICE = new RejectingExecutorService(); private ExecutorServices() { } static ExecutorService trivialExecutorService() { return TRIVIAL_EXECUTOR_SERVICE; } static ExecutorService rejectingExecutorService() { return REJECTING_EXECUTOR_SERVICE; } private static final class TrivialExecutorService extends AbstractExecutorService { @Override public <T> java.util.concurrent.Future<T> submit(Callable<T> task) { try { return new ImmediatelyDoneFuture<>(task.call()); } catch (Exception x) { throw new IllegalStateException("Error calling task.", x); } } private static class ImmediatelyDoneFuture<T> implements java.util.concurrent.Future<T> { final T value; ImmediatelyDoneFuture(T value) { this.value = value; } @Override public boolean cancel(boolean mayInterruptIfRunning) { return false; } @Override public boolean isCancelled() { return false; } @Override public boolean isDone() { return true; } @Override public T get() { return value; } @Override public T get(long timeout, TimeUnit unit) { return value; } } } private static final class RejectingExecutorService extends AbstractExecutorService { @Override public <T> java.util.concurrent.Future<T> submit(Callable<T> task) { throw new RejectedExecutionException(); } } private static abstract class AbstractExecutorService implements ExecutorService { private boolean shutdown = false; @Override public abstract <T> java.util.concurrent.Future<T> submit(Callable<T> task); @Override public java.util.concurrent.Future<?> submit(Runnable task) { return submit(task, null); } @Override public <T> java.util.concurrent.Future<T> submit(Runnable task, T result) { return submit(() -> { task.run(); return result; }); } @Override public void execute(Runnable command) { command.run(); } @Override public void shutdown() { shutdown = true; } @Override public List<Runnable> shutdownNow() { shutdown(); return Collections.emptyList(); } @Override public boolean isShutdown() { return shutdown; } @Override public boolean isTerminated() { return isShutdown(); } @Override public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { return true; } @Override public <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { throw new UnsupportedOperationException(); } @Override public <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException { throw new UnsupportedOperationException(); } @Override public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException { throw new UnsupportedOperationException(); } @Override public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { throw new UnsupportedOperationException(); } } }