AnonymousObserver.cs 4.0 KB

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