|
|
@@ -11,12 +11,12 @@ namespace Discord |
|
|
|
public int PageSize { get; } |
|
|
|
|
|
|
|
private readonly ulong? _start; |
|
|
|
private readonly uint? _count; |
|
|
|
private readonly int? _count; |
|
|
|
private readonly Func<PageInfo, CancellationToken, Task<IReadOnlyCollection<T>>> _getPage; |
|
|
|
private readonly Action<PageInfo, IReadOnlyCollection<T>> _nextPage; |
|
|
|
|
|
|
|
public PagedAsyncEnumerable(int pageSize, Func<PageInfo, CancellationToken, Task<IReadOnlyCollection<T>>> getPage, Action<PageInfo, IReadOnlyCollection<T>> nextPage = null, |
|
|
|
ulong? start = null, uint? count = null) |
|
|
|
ulong? start = null, int? count = null) |
|
|
|
{ |
|
|
|
PageSize = pageSize; |
|
|
|
_start = start; |
|
|
@@ -42,15 +42,31 @@ namespace Discord |
|
|
|
|
|
|
|
public async Task<bool> MoveNext(CancellationToken cancelToken) |
|
|
|
{ |
|
|
|
if (_info.Remaining == 0) |
|
|
|
return false; |
|
|
|
|
|
|
|
var data = await _source._getPage(_info, cancelToken); |
|
|
|
Current = new Page<T>(_info, data); |
|
|
|
|
|
|
|
_info.Page++; |
|
|
|
_info.Remaining -= (uint)Current.Count; |
|
|
|
_info.PageSize = _info.Remaining != null ? (int)Math.Min(_info.Remaining.Value, (ulong)_source.PageSize) : _source.PageSize; |
|
|
|
_source?._nextPage(_info, data); |
|
|
|
if (_info.Remaining != null) |
|
|
|
{ |
|
|
|
if (Current.Count >= _info.Remaining) |
|
|
|
_info.Remaining = 0; |
|
|
|
else |
|
|
|
_info.Remaining -= Current.Count; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
if (Current.Count == 0) |
|
|
|
_info.Remaining = 0; |
|
|
|
} |
|
|
|
_info.PageSize = _info.Remaining != null ? (int)Math.Min(_info.Remaining.Value, _source.PageSize) : _source.PageSize; |
|
|
|
|
|
|
|
if (_info.Remaining != 0) |
|
|
|
_source?._nextPage(_info, data); |
|
|
|
|
|
|
|
return _info.Remaining > 0; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
public void Dispose() { Current = null; } |
|
|
|