@Override
public <P, R> CompletionStage<R> supervise(final AutoCloseable service,
final Function<P, CompletionStage<R>> f,
@Nullable final P parameterObject) {
final CompletableFuture<R> result = new CompletableFuture<>();
try {
final CompletionStage<R> initialCompletionStage = f.apply(parameterObject);
initialCompletionStage.whenCompleteAsync((res, firstError) -> {
final boolean isErrorCase = firstError != null;
if (isErrorCase) {
final RetryContextImpl<P, R> retryOperationContext = createFirstRetryOperationContext(firstError, result, f, parameterObject, service);
handle(retryOperationContext);
} else {
result.complete(res);
}
}, executor);
} catch (final Throwable e) {
result.completeExceptionally(e);
}
return result;
}