If.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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.Linq.ObservableImpl
  5. {
  6. internal sealed class If<TResult> : Producer<TResult, If<TResult>._>, IEvaluatableObservable<TResult>
  7. {
  8. private readonly Func<bool> _condition;
  9. private readonly IObservable<TResult> _thenSource;
  10. private readonly IObservable<TResult> _elseSource;
  11. public If(Func<bool> condition, IObservable<TResult> thenSource, IObservable<TResult> elseSource)
  12. {
  13. _condition = condition;
  14. _thenSource = thenSource;
  15. _elseSource = elseSource;
  16. }
  17. public IObservable<TResult> Eval() => _condition() ? _thenSource : _elseSource;
  18. protected override _ CreateSink(IObserver<TResult> observer) => new _(this, observer);
  19. protected override void Run(_ sink) => sink.Run();
  20. internal sealed class _ : IdentitySink<TResult>
  21. {
  22. private readonly If<TResult> _parent;
  23. public _(If<TResult> parent, IObserver<TResult> observer)
  24. : base(observer)
  25. {
  26. _parent = parent;
  27. }
  28. public void Run()
  29. {
  30. IObservable<TResult> result;
  31. try
  32. {
  33. result = _parent.Eval();
  34. }
  35. catch (Exception exception)
  36. {
  37. ForwardOnError(exception);
  38. return;
  39. }
  40. SetUpstream(result.SubscribeSafe(this));
  41. }
  42. }
  43. }
  44. }