static IObservable <IControl> BuildIndicator( IObservable <IBinaryMessage> fromSimulator, string messageType, string title, IObservable <Color> foreground, IObservable <Color> background) { var started = fromSimulator .TryParse(Started.MessageType, Started.ReadDataFrom) .Where(m => m.Command.Type == messageType).Select(_ => true); var ended = fromSimulator .TryParse(Ended.MessageType, Ended.ReadDataFrom) .Where(m => m.Command.Type == messageType).Select(_ => false); // stream of bool that is true from 250 ms after messageType started and false when messageType ends var indicator = started .Merge(ended) .Throttle(TimeSpan.FromMilliseconds(250)) .Merge(ended) .DistinctUntilChanged() .Select( building => building ? Busy.Create(title, background, foreground) : Control.Empty); return(indicator); }