using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; using System; namespace Octokit.AsyncPaginationExtension { internal class PaginatedList : IPaginatedList { private readonly LazyList>> _pages; private readonly int _pageSize; internal PaginatedList(Func>> getPage, int pageSize) { _pages = new(i => getPage(new() { StartPage = i, PageSize = pageSize, })); _pageSize = pageSize; } private async Task Get(int index) { var page = await _pages[index / _pageSize].ConfigureAwait(false); index %= _pageSize; return page.Count > index ? page[index] : default; } public Task this[int index] => index >= 0 ? Get(index) : throw new ArgumentOutOfRangeException(nameof(index), index, "The index must be positive."); public async IAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = new()) { var pageNum = 0; while (await _pages[pageNum++].ConfigureAwait(false) is { Count: > 0 } page) { foreach (var t in page) { yield return t; } } } } }