/** * Decorates CompletionStageSupplier with Retry * * @param retry the retry context * @param scheduler execution service to use to schedule retries * @param supplier completion stage supplier * @param <T> type of completion stage result * @return decorated supplier */ static <T> Supplier<CompletionStage<T>> decorateCompletionStage( AsyncRetry retry, ScheduledExecutorService scheduler, Supplier<CompletionStage<T>> supplier ) { return () -> { final CompletableFuture<T> promise = new CompletableFuture<>(); @SuppressWarnings("unchecked") final Runnable block = new AsyncRetryBlock<>(scheduler, retry.context(), supplier, promise); block.run(); return promise; }; }