A question on Stackoverflow got me thinking of a beautiful way of reporting a value of an object in C# repeatedly, something like polling a sensor. Typically, polling is pull-based, but having been reading Intro to Rx for the second time lately, and being convinced of its push-base structural and syntactic eunoia, I’ve created a solution based on Rx listed below.
using System;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
namespace rxtest
{
class FrequencyMeter
{
Random rand = new Random();
public int Hz
{
get { return 60+rand.Next(3); }
}
}
class Program
{
static void Main(string[] args)
{
var obs = Observable.Generate<FrequencyMeter, int>(
new FrequencyMeter(), //state
x => !Console.KeyAvailable, // while no key is pressed
x => x, // no change in the state
x => x.Hz, // how to get the value
x => TimeSpan.FromMilliseconds(250), //how often
Scheduler.Default)
.DistinctUntilChanged() //show only when changed
;
using (var _ = obs.Subscribe(x => Console.WriteLine(x)))
{
var ticks = Observable.Interval(TimeSpan.FromSeconds(0.5))
.Subscribe(x=>Console.WriteLine("tick")); //an example only
Console.WriteLine("Interrupt with a keypress");
Console.ReadKey();
}
}
}
}
producing an output similar to that:
Interrupt with a keypress 62 60 62 tick 61 60 tick 62 61 tick 60 62 61 tick 62
Now, with Rx available in C++ that would be interesting what will be left of the eunoia.