Files
octokit.net/Octokit.Reactive/Helpers/ConnectionExtensions.cs
2013-10-18 22:26:36 -07:00

30 lines
999 B
C#

using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
namespace Octokit.Reactive.Internal
{
internal static class ConnectionExtensions
{
public static IObservable<T> GetAndFlattenAllPages<T>(this IConnection connection, Uri url)
{
return GetPages(url, nextPageUrl => connection.GetAsync<List<T>>(nextPageUrl).ToObservable());
}
static IObservable<T> GetPages<T>(Uri uri,
Func<Uri, IObservable<IResponse<List<T>>>> getPageFunc)
{
return getPageFunc(uri).Expand(resp =>
{
var nextPageUrl = resp.ApiInfo.GetNextPageUrl();
return nextPageUrl == null
? Observable.Empty<IResponse<List<T>>>()
: Observable.Defer(() => getPageFunc(nextPageUrl));
})
.Where(resp => resp != null)
.SelectMany(resp => resp.BodyAsObject);
}
}
}