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 GetAndFlattenAllPages(this IConnection connection, Uri url) { return GetPages(url, nextPageUrl => connection.GetAsync>(nextPageUrl).ToObservable()); } static IObservable GetPages(Uri uri, Func>>> getPageFunc) { return getPageFunc(uri).Expand(resp => { var nextPageUrl = resp.ApiInfo.GetNextPageUrl(); return nextPageUrl == null ? Observable.Empty>>() : Observable.Defer(() => getPageFunc(nextPageUrl)); }) .Where(resp => resp != null) .SelectMany(resp => resp.BodyAsObject); } } }