AnonymousObserver.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. namespace System.Reactive
  5. {
  6. /// <summary>
  7. /// Class to create an <see cref="IObserver{T}"/> instance from delegate-based implementations of the On* methods.
  8. /// </summary>
  9. /// <typeparam name="T">The type of the elements in the sequence.</typeparam>
  10. public sealed class AnonymousObserver<T> : ObserverBase<T>
  11. {
  12. private readonly Action<T> _onNext;
  13. private readonly Action<Exception> _onError;
  14. private readonly Action _onCompleted;
  15. /// <summary>
  16. /// Creates an observer from the specified OnNext, OnError, and OnCompleted actions.
  17. /// </summary>
  18. /// <param name="onNext">Observer's OnNext action implementation.</param>
  19. /// <param name="onError">Observer's OnError action implementation.</param>
  20. /// <param name="onCompleted">Observer's OnCompleted action implementation.</param>
  21. /// <exception cref="ArgumentNullException"><paramref name="onNext"/> or <paramref name="onError"/> or <paramref name="onCompleted"/> is null.</exception>
  22. public AnonymousObserver(Action<T> onNext, Action<Exception> onError, Action onCompleted)
  23. {
  24. if (onNext == null)
  25. throw new ArgumentNullException(nameof(onNext));
  26. if (onError == null)
  27. throw new ArgumentNullException(nameof(onError));
  28. if (onCompleted == null)
  29. throw new ArgumentNullException(nameof(onCompleted));
  30. _onNext = onNext;
  31. _onError = onError;
  32. _onCompleted = onCompleted;
  33. }
  34. /// <summary>
  35. /// Creates an observer from the specified OnNext action.
  36. /// </summary>
  37. /// <param name="onNext">Observer's OnNext action implementation.</param>
  38. /// <exception cref="ArgumentNullException"><paramref name="onNext"/> is null.</exception>
  39. public AnonymousObserver(Action<T> onNext)
  40. : this(onNext, Stubs.Throw, Stubs.Nop)
  41. {
  42. }
  43. /// <summary>
  44. /// Creates an observer from the specified OnNext and OnError actions.
  45. /// </summary>
  46. /// <param name="onNext">Observer's OnNext action implementation.</param>
  47. /// <param name="onError">Observer's OnError action implementation.</param>
  48. /// <exception cref="ArgumentNullException"><paramref name="onNext"/> or <paramref name="onError"/> is null.</exception>
  49. public AnonymousObserver(Action<T> onNext, Action<Exception> onError)
  50. : this(onNext, onError, Stubs.Nop)
  51. {
  52. }
  53. /// <summary>
  54. /// Creates an observer from the specified OnNext and OnCompleted actions.
  55. /// </summary>
  56. /// <param name="onNext">Observer's OnNext action implementation.</param>
  57. /// <param name="onCompleted">Observer's OnCompleted action implementation.</param>
  58. /// <exception cref="ArgumentNullException"><paramref name="onNext"/> or <paramref name="onCompleted"/> is null.</exception>
  59. public AnonymousObserver(Action<T> onNext, Action onCompleted)
  60. : this(onNext, Stubs.Throw, onCompleted)
  61. {
  62. }
  63. /// <summary>
  64. /// Calls the onNext action.
  65. /// </summary>
  66. /// <param name="value">Next element in the sequence.</param>
  67. protected override void OnNextCore(T value)
  68. {
  69. _onNext(value);
  70. }
  71. /// <summary>
  72. /// Calls the onError action.
  73. /// </summary>
  74. /// <param name="error">The error that has occurred.</param>
  75. protected override void OnErrorCore(Exception error)
  76. {
  77. _onError(error);
  78. }
  79. /// <summary>
  80. /// Calls the onCompleted action.
  81. /// </summary>
  82. protected override void OnCompletedCore()
  83. {
  84. _onCompleted();
  85. }
  86. internal IObserver<T> MakeSafe(IDisposable disposable)
  87. {
  88. return new AnonymousSafeObserver<T>(_onNext, _onError, _onCompleted, disposable);
  89. }
  90. }
  91. }