// 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 sealed class SumDouble : Producer { private readonly IObservable _source; public SumDouble(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private double _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(double value) { _sum += value; } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumSingle : Producer { private readonly IObservable _source; public SumSingle(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private double _sum; // This is what LINQ to Objects does (accumulates into double that is)! public _(IObserver observer) : base(observer) { } public override void OnNext(float value) { _sum += value; // This is what LINQ to Objects does! } public override void OnCompleted() { ForwardOnNext((float)_sum); // This is what LINQ to Objects does! ForwardOnCompleted(); } } } internal sealed class SumDecimal : Producer { private readonly IObservable _source; public SumDecimal(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private decimal _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(decimal value) { _sum += value; } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumInt32 : Producer { private readonly IObservable _source; public SumInt32(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private int _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(int value) { try { checked { _sum += value; } } catch (Exception exception) { ForwardOnError(exception); } } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumInt64 : Producer { private readonly IObservable _source; public SumInt64(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private long _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(long value) { try { checked { _sum += value; } } catch (Exception exception) { ForwardOnError(exception); } } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumDoubleNullable : Producer { private readonly IObservable _source; public SumDoubleNullable(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private double _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(double? value) { if (value != null) { _sum += value.Value; } } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumSingleNullable : Producer { private readonly IObservable _source; public SumSingleNullable(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private double _sum; // This is what LINQ to Objects does (accumulates into double that is)! public _(IObserver observer) : base(observer) { } public override void OnNext(float? value) { if (value != null) { _sum += value.Value; // This is what LINQ to Objects does! } } public override void OnCompleted() { ForwardOnNext((float)_sum); // This is what LINQ to Objects does! ForwardOnCompleted(); } } } internal sealed class SumDecimalNullable : Producer { private readonly IObservable _source; public SumDecimalNullable(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private decimal _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(decimal? value) { if (value != null) { _sum += value.Value; } } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumInt32Nullable : Producer { private readonly IObservable _source; public SumInt32Nullable(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private int _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(int? value) { try { checked { if (value != null) { _sum += value.Value; } } } catch (Exception exception) { ForwardOnError(exception); } } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } internal sealed class SumInt64Nullable : Producer { private readonly IObservable _source; public SumInt64Nullable(IObservable source) { _source = source; } protected override _ CreateSink(IObserver observer) => new(observer); protected override void Run(_ sink) => sink.Run(_source); internal sealed class _ : IdentitySink { private long _sum; public _(IObserver observer) : base(observer) { } public override void OnNext(long? value) { try { checked { if (value != null) { _sum += value.Value; } } } catch (Exception exception) { ForwardOnError(exception); } } public override void OnCompleted() { ForwardOnNext(_sum); ForwardOnCompleted(); } } } }