Skip to content

feat(advanced): expose the operator signals as public API - #182

Merged
glennawatson merged 1 commit into
mainfrom
feat/public-operator-signals
Sep 6, 2026
Merged

feat(advanced): expose the operator signals as public API#182
glennawatson merged 1 commit into
mainfrom
feat/public-operator-signals

Conversation

@glennawatson

Copy link
Copy Markdown
Contributor

What kind of change does this PR introduce?

Feature (public API surface).

What is the new behavior?

Every concrete operator signal under ReactiveUI.Primitives.Advanced is public, so callers can name the type they build instead of only the factory that returns it.

  • Eight signals become public: EmptySignal<T>, FinallySignal<T>, LoopSignal<T>, OnErrorResumeNextSignal<T>, RecoverSignal<T, TException>, ResumeSignal<T>, ThrowSignal<T> and EverySignal.
    • They stay in ReactiveUI.Primitives.Advanced, alongside LeadSignal, MergeSignal, ReturnSignal and TapSignal, which were already public.
    • Types that are genuine plumbing stay internal: the async state machines, the observer leases, RaceArms<T> and the helper statics.

DebuggerDisplay now names its own class, so a debugger row says what the object is and not only what it holds.

  • "LeadSignal: Value = {Value}, Source = {Source}" rather than "Value = {Value}, Source = {Source}".
  • Follows the four attributes that already did this.
  • The attributes that delegate to a DebuggerDisplay member are untouched, because that member builds the whole string itself.

What is the current behavior?

  • The eight signals are internal, so half the operator surface is reachable as a concrete type and half is not. A caller wanting Empty on a scheduler has a factory and no type.
  • DebuggerDisplay strings name their fields but not their class, so two different signals holding a source render identically.

What might this PR break?

None. The eight types have never shipped public, so no consumer can be depending on them, and they gain visibility in the namespace they already occupied rather than moving.

Checklist

  • I have read the Contribute guide
  • 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

Most of the diff is mechanical and generated. The hand-written parts are the eight signal files under src/Primitives.Shared/Advanced/, which carry the visibility change and their new DebuggerDisplay. Everything else is the class-name prefix applied across the existing attributes, plus the regenerated PublicAPI baselines.

The baseline records attributes, so the visibility change and the prefix cannot land as separate commits without an intermediate state that does not build. The Apple target-framework baselines were regenerated on a Windows host, which is the only one carrying those workloads.

- Make EmptySignal, FinallySignal, LoopSignal, OnErrorResumeNextSignal,
  RecoverSignal, ResumeSignal, ThrowSignal and EverySignal public. They sit
  beside LeadSignal, MergeSignal and TapSignal, which were already public, so
  a caller could reach half the operator surface as concrete types and not the
  rest. They have never shipped public and stay in ReactiveUI.Primitives.Advanced,
  so nothing moves and nothing breaks.
- Prefix every DebuggerDisplay with the name of its class, so a debugger row
  says what it is rather than only what it holds. Follows the four that already
  did this; the 49 that delegate to a DebuggerDisplay member are untouched,
  since those build their own string.
- Regenerate all 136 PublicAPI baselines. The baseline records attributes, so
  the two changes above cannot land separately without an intermediate state
  that does not build.
@sonarqubecloud

sonarqubecloud Bot commented Sep 6, 2026

Copy link
Copy Markdown

@glennawatson
glennawatson merged commit f2f2c89 into main Sep 6, 2026
11 checks passed
@glennawatson
glennawatson deleted the feat/public-operator-signals branch September 6, 2026 08:02
@codecov

codecov Bot commented Sep 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.19%. Comparing base (bbd7727) to head (d950382).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #182   +/-   ##
=======================================
  Coverage   98.18%   98.19%           
=======================================
  Files         711      711           
  Lines       22078    22078           
  Branches     2703     2703           
=======================================
+ Hits        21678    21680    +2     
  Misses        196      196           
+ Partials      204      202    -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.

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.

1 participant