public static void ObservableFromEventPattern_IsTheEventObserverPatternImplementationOnSteroids(Form form) { Observable.FromEventPattern <MouseEventArgs>(form, nameof(form.MouseClick)) .Subscribe( mm => form.AppendToBox($"Clicked @ {mm.EventArgs.X} - {mm.EventArgs.Y}"), ex => form.AppendToBox(ex.Message)); }
public static void DispatcherScheduler_CanBeUsedToEmitAndConsume_OnTheUIThread(Form form) { //Execution Context: UI Thread //Execution Policy: Priority FIFO (non-blocking) //Clock: Machine Time Observable.Interval(TimeSpan.FromMilliseconds(250), new DispatcherScheduler(Dispatcher.CurrentDispatcher)) .Take(6) .Subscribe(i => form.AppendToBox($"Blipp{i}")); form.AppendToBox("Finished"); }
public static void Throttle_GuardsAgainstPeaks_IsGreatForUserInteraction(Form form) { var moves = Observable.FromEventPattern <EventArgs>(form, nameof(form.Move)); moves.Sample(TimeSpan.FromMilliseconds(500)) .Timestamp() .ObserveOn(SynchronizationContext.Current) .Subscribe(m => form.AppendToBox($"Still moving it around, last one @{m.Timestamp}")); moves.Throttle(TimeSpan.FromMilliseconds(750)) .Timestamp() .ObserveOn(SynchronizationContext.Current) .Subscribe(i => form.AppendToBox($"Blipped @{i.Timestamp}"), ex => form.AppendToBox(ex.Message)); }
public static void Aggregate_IsPowerful_ButBoundByCompletion(Form form) { var moves = Observable.FromEventPattern <MouseEventArgs>(form, nameof(form.MouseMove)); var doubleClicks = Observable.FromEventPattern <EventArgs>(form, nameof(form.DoubleClick)); moves.TakeUntil(doubleClicks) .Aggregate( (start: DateTime.Now, distance: 0, previous: new MouseEventArgs(MouseButtons.None, 0, 0, 0, 0)), (accumulator, current) => { accumulator.distance += Math.Abs(current.EventArgs.X - accumulator.previous.X); accumulator.previous = current.EventArgs; return(accumulator); }) .Subscribe( agg => form.AppendToBox($"Moused a total of {agg.distance} pixels over a time period of {DateTime.Now.Subtract(agg.start)}"), ex => form.AppendToBox(ex.Message)); }
public static void Scan_IsJustAggregate_WithAllIntermediateSteps(Form form) { var moves = Observable.FromEventPattern <MouseEventArgs>(form, nameof(form.MouseMove)); var doubleClicks = Observable.FromEventPattern <EventArgs>(form, nameof(form.DoubleClick)); var start = DateTime.Now; moves.TakeUntil(doubleClicks) .Scan( (start, distance: 0, previous: new MouseEventArgs(MouseButtons.None, 0, 0, 0, 0)), (accumulator, current) => { accumulator.distance += Math.Abs(current.EventArgs.X - accumulator.previous.X); accumulator.previous = current.EventArgs; return(accumulator); }) .Subscribe( agg => form.AppendToBox($"Moused a total of {agg.distance} pixels *so far*"), ex => form.AppendToBox(ex.Message), () => form.AppendToBox($"Moused over a time period of {DateTime.Now.Subtract(start)}")); }