TestBindingObservable.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #nullable enable
  2. using System;
  3. using Avalonia.Data;
  4. namespace Avalonia.Benchmarks
  5. {
  6. internal class TestBindingObservable<T> : IObservable<BindingValue<T?>>, IDisposable
  7. {
  8. private T? _value;
  9. private IObserver<BindingValue<T?>>? _observer;
  10. public TestBindingObservable(T? initialValue = default) => _value = initialValue;
  11. public IDisposable Subscribe(IObserver<BindingValue<T?>> observer)
  12. {
  13. if (_observer is object)
  14. throw new InvalidOperationException("The observable can only be subscribed once.");
  15. _observer = observer;
  16. observer.OnNext(_value);
  17. return this;
  18. }
  19. public void Dispose() => _observer = null;
  20. public void OnNext(T? value) => _observer?.OnNext(value);
  21. public void PublishCompleted()
  22. {
  23. _observer?.OnCompleted();
  24. _observer = null;
  25. }
  26. protected void PublishError(Exception error)
  27. {
  28. _observer?.OnError(error);
  29. _observer = null;
  30. }
  31. }
  32. }