Just a few questions #19
Replies: 2 comments
|
Signals implementation existed long before R3 in another project. Just a rename though. It existed in ReactiveMarbles and been around for years. |
|
Hey @fedeAlterio Thanks for the detailed write-up - taking the points in turn. Why a fresh implementation rather than contributing to R3/R3Async. Different design center, not a competing one. Primitives is the ReactiveUI ecosystem's own low-level layer and it continues a Signal lineage that predates R3 in our repos (links below) — zero-dependency primitives, broad multi-targeting/AOT, and tight ReactiveUI integration. That's a different remit from R3, so carrying our own lineage forward was the natural path. Where interop matters we've built it explicitly - there's a dedicated Attribution / "Signals existed long before R3." The Signal model isn't derived from R3 or R3Async; it predates both in public ReactiveMarbles history:
Naming "Signals." The term is overloaded — in Angular/SolidJS it means auto dependency-tracking. Here "Signal" is our long-standing name (2021–2023, above) for the Rx Observable/Observer abstraction, not the auto-tracking UI-signal semantics. It's an established name across our projects and predates the recent UI-framework usage in our code.
Re-entrance detection. Good point. Our async operators detect logical re-entrancy with |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Why opt for a fresh implementation instead of contributing to the existing R3/R3Async repositories? R3 already represents a modern reimplementation that addresses essentially all the limitations of classic Rx.NET, so it might have been a natural place natural place for further improvements or performance optimizations.
Regarding naming, “Signals” in the UI ecosystem is generally associated with automatic dependency tracking (for example, Angular, React or JS frameworks or in my own SignalsDotnet project), though I’m not entirely convinced that applies in this case.
One additional point: I noticed that SignalAsync implementation appear to draw inspiration from R3Async. A brief acknowledgment of that influence would likely not make a significant difference for the project itself, but it would have made a meaningful difference for me, since the implementation is not trivial, and it took some time.
Also, I noticed the use of ConfigureAwait(false). I don't Think this is a good choice, for reason I explained in R3Async readme.
Another thing. I think the way you check for re-entrance is wrong. I used async locals because they are restored between awaits, this is the only reliable way to do that. Checking for thread Ids in async code is not meaningful
but I would love to talk about that further 🙂
All reactions