public virtual Response <T> WaitForCompletion <T>(UpdateStatus updateStatus, HasCompleted hasCompleted, Value <T> value, GetRawResponse getRawResponse, TimeSpan?suggestedInterval, CancellationToken cancellationToken)
        {
            while (true)
            {
                Response response = updateStatus(cancellationToken);

                if (hasCompleted())
                {
                    return(Response.FromValue(value(), getRawResponse()));
                }

                Thread.Sleep(_delayStrategy.GetNextDelay(response, suggestedInterval));
            }
        }
        public virtual async ValueTask <Response <T> > WaitForCompletionAsync <T>(UpdateStatusAsync updateStatusAsync, HasCompleted hasCompleted, Value <T> value, GetRawResponse getRawResponse, TimeSpan?suggestedInterval, CancellationToken cancellationToken)
        {
            while (true)
            {
                Response response = await updateStatusAsync(cancellationToken).ConfigureAwait(false);

                if (hasCompleted())
                {
                    return(Response.FromValue(value(), getRawResponse()));
                }

                await Task.Delay(_delayStrategy.GetNextDelay(response, suggestedInterval), cancellationToken).ConfigureAwait(false);
            }
        }