private static void RunningAsyncCodeInWhere()
{
Demo.DisplayHeader("Running async code int the pipeline - order is not determenistic");
var svc = new PrimeCheckService();
//
// this wont Compile
//
//var subscription = Observable.Range(1, 10)
// .Where(async x => await svc.IsPrimeAsync(x))
// .SubscribeConsole("AsyncWhere");
//
// This compiles and runs - query syntax
//
IObservable<int> primes =
from number in Observable.Range(1, 10)
from isPrime in svc.IsPrimeAsync(number)
where isPrime
select number;
//
// The same, but in methods chain
//
primes =
Observable.Range(1, 10)
.SelectMany((number) => svc.IsPrimeAsync(number),
(number, isPrime) => new { number, isPrime })
.Where(x => x.isPrime)
.Select(x => x.number);
var exampleResetEvent = new AutoResetEvent(false);
primes
.DoLast(() => exampleResetEvent.Set(), delay: TimeSpan.FromSeconds(1))
.SubscribeConsole("primes");
exampleResetEvent.WaitOne();
}