using System.Threading.Tasks;
using System.Reactive.Linq;
using System.Reactive.Concurrency;
public static IObservable<TResult> Generate<TResult>(
Func<Task<TResult>> initialState,
Func<TResult, bool> condition,
Func<TResult, Task<TResult>> iterate,
Func<TResult, TResult> resultSelector,
IScheduler scheduler = null)
scheduler ??= Scheduler.Immediate;
return Observable.Create<TResult>(observer =>
return scheduler.ScheduleAsync(async (self, cancellationToken) =>
var state = await initialState();
observer.OnNext(resultSelector(state));
state = await iterate(state);