code: @Beta
    public static <V> ListenableFuture<V> nonCancellationPropagating(ListenableFuture<V> future) {
      if (future.isDone()) {
        return future;
      }
      NonCancellationPropagatingFuture<V> output = new NonCancellationPropagatingFuture<>(future);
      future.addListener(output, directExecutor());
      return output;
    }
docs: Returns a {@code ListenableFuture} whose result is set from the supplied future when it
  completes. Cancelling the supplied future will also cancel the returned future, but cancelling
  the returned future will have no effect on the supplied future.
  
  @since 15.0