using System; using System.Collections.Generic; using System.Threading.Tasks; using SpotifyAPI.Web.Http; namespace SpotifyAPI.Web { public class SimplePaginator : IPaginator { protected virtual Task ShouldContinue(List results, Paging page) { return Task.FromResult(true); } protected virtual Task ShouldContinue(List results, Paging page) { return Task.FromResult(true); } public async Task> Paginate(Paging firstPage, IAPIConnector connector) { Ensure.ArgumentNotNull(firstPage, nameof(firstPage)); Ensure.ArgumentNotNull(connector, nameof(connector)); var page = firstPage; var results = new List(); results.AddRange(firstPage.Items); while (page.Next != null && await ShouldContinue(results, page).ConfigureAwait(false)) { page = await connector.Get>(new Uri(page.Next, UriKind.Absolute)).ConfigureAwait(false); results.AddRange(page.Items); } return results; } public async Task> Paginate(Func>> getFirstPage, IAPIConnector connector) { Ensure.ArgumentNotNull(getFirstPage, nameof(getFirstPage)); var firstPage = await getFirstPage().ConfigureAwait(false); return await Paginate(firstPage, connector).ConfigureAwait(false); } public async Task> Paginate( Paging firstPage, Func> mapper, IAPIConnector connector ) { Ensure.ArgumentNotNull(firstPage, nameof(firstPage)); Ensure.ArgumentNotNull(mapper, nameof(mapper)); Ensure.ArgumentNotNull(connector, nameof(connector)); var page = firstPage; var results = new List(); results.AddRange(firstPage.Items); while (page.Next != null && await ShouldContinue(results, page).ConfigureAwait(false)) { var next = await connector.Get(new Uri(page.Next, UriKind.Absolute)).ConfigureAwait(false); page = mapper(next); results.AddRange(page.Items); } return results; } public async Task> Paginate(Func>> getFirstPage, Func> mapper, IAPIConnector connector) { Ensure.ArgumentNotNull(getFirstPage, nameof(getFirstPage)); var firstPage = await getFirstPage().ConfigureAwait(false); return await Paginate(firstPage, mapper, connector).ConfigureAwait(false); } } }