// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. namespace System.Reactive.Linq.ObservableImpl { internal static class Do { internal sealed class OnNext : Producer { private readonly IObservable _source; private readonly Action _onNext; public OnNext(IObservable source, Action onNext) { _source = source; _onNext = onNext; } protected override _ CreateSink(IObserver observer) => new(_onNext, observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private readonly Action _onNext; public _(Action onNext, IObserver observer) : base(observer) { _onNext = onNext; } public override void OnNext(TSource value) { try { _onNext(value); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnNext(value); } } } internal sealed class Observer : Producer { private readonly IObservable _source; private readonly IObserver _observer; public Observer(IObservable source, IObserver observer) { _source = source; _observer = observer; } protected override _ CreateSink(IObserver observer) => new(_observer, observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private readonly IObserver _doObserver; public _(IObserver doObserver, IObserver observer) : base(observer) { _doObserver = doObserver; } public override void OnNext(TSource value) { try { _doObserver.OnNext(value); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnNext(value); } public override void OnError(Exception error) { try { _doObserver.OnError(error); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnError(error); } public override void OnCompleted() { try { _doObserver.OnCompleted(); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnCompleted(); } } } internal sealed class Actions : Producer { private readonly IObservable _source; private readonly Action _onNext; private readonly Action _onError; private readonly Action _onCompleted; public Actions(IObservable source, Action onNext, Action onError, Action onCompleted) { _source = source; _onNext = onNext; _onError = onError; _onCompleted = onCompleted; } protected override _ CreateSink(IObserver observer) => new(this, observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { // CONSIDER: This sink has a parent reference that can be considered for removal. private readonly Actions _parent; public _(Actions parent, IObserver observer) : base(observer) { _parent = parent; } public override void OnNext(TSource value) { try { _parent._onNext(value); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnNext(value); } public override void OnError(Exception error) { try { _parent._onError(error); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnError(error); } public override void OnCompleted() { try { _parent._onCompleted(); } catch (Exception ex) { ForwardOnError(ex); return; } ForwardOnCompleted(); } } } } }