/// <summary>
        /// Read pages until the <paramref name="limit"/> number of items have been read (or the pages are exhausted) and return the result.
        /// </summary>
        /// <param name="readMethodDelegateAsync">A method that returns one page at the time</param>
        /// <param name="limit">The maximum number of items to return.</param>
        /// <param name="token">Propagates notification that operations should be canceled</param>
        /// <typeparam name="TModel">The type of the items.</typeparam>
        public static async Task <IEnumerable <TModel> > ReadPagesAsync <TModel>(
            PageEnvelopeEnumeratorAsync <TModel> .ReadMethodDelegate readMethodDelegateAsync, int limit = int.MaxValue, CancellationToken token = default)
        {
            var result     = new List <TModel>();
            var enumerator = new PageEnvelopeEnumeratorAsync <TModel>(readMethodDelegateAsync, token);
            var count      = 0;

            while (count < limit && await enumerator.MoveNextAsync())
            {
                result.Add(enumerator.Current);
                count++;
            }
            return(result);
        }
 /// <summary>
 /// Create a new PageEnvelopeEnumerable which will get its values by calling the <paramref name="readMethodDelegate"/> method.
 /// </summary>
 /// <param name="readMethodDelegate">A method that returns a new page of answers for a specific offset.</param>
 /// <param name="token">Propagates notification that operations should be canceled</param>
 public PageEnvelopeEnumerableAsync(PageEnvelopeEnumeratorAsync <T> .ReadMethodDelegate readMethodDelegate, CancellationToken token = default)
 {
     _enumerator = new PageEnvelopeEnumeratorAsync <T>(readMethodDelegate, token);
 }