Skip to content

feat(primitives): add multi-source CombineLatest support#62

Merged
glennawatson merged 1 commit into
mainfrom
ExtendCombineLatest_SyncLatest
Jun 20, 2026
Merged

feat(primitives): add multi-source CombineLatest support#62
glennawatson merged 1 commit into
mainfrom
ExtendCombineLatest_SyncLatest

Conversation

@ChrisPulman

@ChrisPulman ChrisPulman commented Jun 19, 2026

Copy link
Copy Markdown
Member

What kind of change does this PR introduce?

Feature update for ReactiveUI.Primitives observable operator parity.

What is the new behavior?

CombineLatest now supports 3 through 16 observable sources via the Rx naming extensions, backed by shared latest-value coordination with the same semantics as SyncLatest.

The Primitives naming surface also includes SyncLatest overloads for 3 through 16 observable sources, and shipped PublicAPI baselines are updated for ReactiveUI.Primitives and ReactiveUI.Primitives.Reactive.

Generated CombineLatest factory helpers are fully XML documented; the previous SST1600 documentation suppressions have been removed and fixed directly.

What is the current behavior?

Only the two-source CombineLatest/SyncLatest path had underlying support, so higher-arity Rx-named extensions did not have the required implementation.

Checklist

  • Tests have been added or updated (for bug fixes / features)
  • Docs have been added or updated (for bug fixes / features)
  • Changes target the main branch
  • PR title follows Conventional Commits

Additional information

Local verification:

  • dotnet build tests\ReactiveUI.Primitives.Tests\ReactiveUI.Primitives.Tests.csproj -c Debug -f net8.0 -v minimal -p:AndroidPrimitivesTargetFrameworks= -p:ApplePrimitivesTargetFrameworks= -p:TestTargetFrameworks=net8.0
  • dotnet build ReactiveUI.Primitives.Reactive\ReactiveUI.Primitives.Reactive.csproj -c Debug -f net8.0 -v minimal -p:AndroidPrimitivesTargetFrameworks= -p:ApplePrimitivesTargetFrameworks=
  • dotnet test tests\ReactiveUI.Primitives.Tests\ReactiveUI.Primitives.Tests.csproj -c Debug -f net8.0 -v minimal -p:AndroidPrimitivesTargetFrameworks= -p:ApplePrimitivesTargetFrameworks= -p:TestTargetFrameworks=net8.0 -- --coverage --coverage-output-format cobertura --coverage-output "..\..\..\..\.tmp\coverage-pr62-net8-sst1600.cobertura.xml" --no-ansi --no-progress
  • git diff --check

Coverage verification:

  • SignalOperatorMixins.CombineLatest.cs: generated CombineLatest factories covered by the fresh net8 primitives test report; remaining missed lines are existing coordinator error/completion branches.
  • SignalOperatorMixins.SyncLatest.MultiSource.cs: 100% line coverage in the fresh net8 primitives test report.
  • SignalOperatorParityMixins.RxNames.CombineLatest.cs: 100% line coverage in the fresh net8 primitives test report.
  • Mtpunittestmcp solution coverage reader reports 92.37% line coverage and 87.63% branch coverage across discovered Cobertura artifacts.

@ChrisPulman ChrisPulman force-pushed the ExtendCombineLatest_SyncLatest branch from d65d6b1 to 6b8bfe3 Compare June 20, 2026 00:10
@codecov

codecov Bot commented Jun 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.92935% with 17 lines in your changes missing coverage. Please review.
✅ Project coverage is 93.35%. Comparing base (f5cc442) to head (517f587).

Files with missing lines Patch % Lines
...tives.Shared/SignalOperatorMixins.CombineLatest.cs 97.48% 6 Missing and 3 partials ⚠️
...tives.Shared/SignalOperatorParityMixins.RxNames.cs 0.00% 8 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #62      +/-   ##
==========================================
+ Coverage   93.12%   93.35%   +0.22%     
==========================================
  Files         459      462       +3     
  Lines       16387    17208     +821     
  Branches     2043     2052       +9     
==========================================
+ Hits        15261    16065     +804     
- Misses        884      899      +15     
- Partials      242      244       +2     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ChrisPulman ChrisPulman force-pushed the ExtendCombineLatest_SyncLatest branch from 6b8bfe3 to 128c55e Compare June 20, 2026 00:42
@ChrisPulman ChrisPulman marked this pull request as ready for review June 20, 2026 00:52
"Major Code Smell",
"S107:Methods should not have too many parameters",
Justification = "Has more than 7 parameters - expected for arity-N CombineLatest factory surface.")]
internal static CombineLatestSignal<TResult> Create<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Get these documented. so No SST1600 suppression at all in the code base

Implementation:

- Add a shared multi-source CombineLatest coordinator for arities 3 through 16 with SyncLatest latest-value semantics.

- Add Primitives SyncLatest overloads for multi-source combinations and Rx CombineLatest parity overloads that delegate to SyncLatest.

- Preserve Rx Do overloads and null validation for parity helpers.

Public API:

- Regenerate shipped API baselines for ReactiveUI.Primitives and ReactiveUI.Primitives.Reactive across target frameworks.

Tests:

- Cover three-source latest-value behavior, delayed initial emission, completion behavior, all generated arities from 4 through 15, source-error forwarding, and widest overload source ordering with TUnit tests.

Documentation:

- Document generated CombineLatest factory methods with full XML docs so SST1600 and related XML documentation analyzer rules are fixed directly rather than suppressed.

CI:

- Extend Sonar CPD exclusions to the generated-style multi-source arity files so duplication gates ignore mechanical overload surface while coverage still tracks the executable lines.
@ChrisPulman ChrisPulman force-pushed the ExtendCombineLatest_SyncLatest branch from 128c55e to 517f587 Compare June 20, 2026 01:17
@sonarqubecloud

Copy link
Copy Markdown

@glennawatson glennawatson merged commit cda2956 into main Jun 20, 2026
14 checks passed
@glennawatson glennawatson deleted the ExtendCombineLatest_SyncLatest branch June 20, 2026 01:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants