@@ -7,9 +7,13 @@ namespace SpotifyAPI.Web
77{
88 public class SimplePaginator : IPaginator
99 {
10- protected virtual bool ShouldContinue < T > ( List < T > results , Paging < T > page )
10+ protected virtual Task < bool > ShouldContinue < T > ( List < T > results , Paging < T > page )
1111 {
12- return true ;
12+ return Task . FromResult ( true ) ;
13+ }
14+ protected virtual Task < bool > ShouldContinue < T , TNext > ( List < T > results , Paging < T , TNext > page )
15+ {
16+ return Task . FromResult ( true ) ;
1317 }
1418
1519 public async Task < List < T > > Paginate < T > ( Paging < T > firstPage , IAPIConnector connector )
@@ -20,7 +24,7 @@ public async Task<List<T>> Paginate<T>(Paging<T> firstPage, IAPIConnector connec
2024 var page = firstPage ;
2125 var results = new List < T > ( ) ;
2226 results . AddRange ( firstPage . Items ) ;
23- while ( page . Next != null && ShouldContinue ( results , page ) )
27+ while ( page . Next != null && await ShouldContinue ( results , page ) . ConfigureAwait ( false ) )
2428 {
2529 page = await connector . Get < Paging < T > > ( new Uri ( page . Next , UriKind . Absolute ) ) . ConfigureAwait ( false ) ;
2630 results . AddRange ( page . Items ) ;
@@ -36,5 +40,34 @@ public async Task<List<T>> Paginate<T>(Func<Task<Paging<T>>> getFirstPage, IAPIC
3640 var firstPage = await getFirstPage ( ) . ConfigureAwait ( false ) ;
3741 return await Paginate ( firstPage , connector ) . ConfigureAwait ( false ) ;
3842 }
43+
44+ public async Task < List < T > > Paginate < T , TNext > (
45+ Paging < T , TNext > firstPage , Func < TNext , Paging < T , TNext > > mapper , IAPIConnector connector
46+ )
47+ {
48+ Ensure . ArgumentNotNull ( firstPage , nameof ( firstPage ) ) ;
49+ Ensure . ArgumentNotNull ( mapper , nameof ( mapper ) ) ;
50+ Ensure . ArgumentNotNull ( connector , nameof ( connector ) ) ;
51+
52+ var page = firstPage ;
53+ var results = new List < T > ( ) ;
54+ results . AddRange ( firstPage . Items ) ;
55+ while ( page . Next != null && await ShouldContinue ( results , page ) . ConfigureAwait ( false ) )
56+ {
57+ var next = await connector . Get < TNext > ( new Uri ( page . Next , UriKind . Absolute ) ) . ConfigureAwait ( false ) ;
58+ page = mapper ( next ) ;
59+ results . AddRange ( page . Items ) ;
60+ }
61+
62+ return results ;
63+ }
64+
65+ public async Task < List < T > > Paginate < T , TNext > ( Func < Task < Paging < T , TNext > > > getFirstPage , Func < TNext , Paging < T , TNext > > mapper , IAPIConnector connector )
66+ {
67+ Ensure . ArgumentNotNull ( getFirstPage , nameof ( getFirstPage ) ) ;
68+
69+ var firstPage = await getFirstPage ( ) . ConfigureAwait ( false ) ;
70+ return await Paginate ( firstPage , mapper , connector ) . ConfigureAwait ( false ) ;
71+ }
3972 }
4073}
0 commit comments