From 0e47633bf0671a49b4825498dc7f2cfd9a3212f2 Mon Sep 17 00:00:00 2001 From: Dong Date: Wed, 9 Sep 2026 23:12:12 +0200 Subject: [PATCH 1/3] Update README with additional Signal.Interval options --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 90507f9e..a67a8f95 100644 --- a/README.md +++ b/README.md @@ -1512,7 +1512,7 @@ dotnet add xyz.Reactive/xyz.Reactive.csproj package ReactiveUI.Primitives.Maui.R | `Observable.Using(...)` | `Signal.Use(...)` | Resource scoped to subscription. | | `Observable.Timer(dueTime)` | `Signal.After(dueTime)` | Emits `long` tick `0`. | | `Observable.Timer(dueTime, period)` | `Signal.After(dueTime, period)` | Periodic `long` ticks. | -| `Observable.Interval(period)` | `Signal.Pulse(period)` or `Signal.Every(period)` | Repeating ticks. | +| `Observable.Interval(period)` | `Signal.Pulse(period)` , `Signal.Every(period)` or `Signal.Interval(period)` | Repeating ticks. | | `ToObservable()` from enumerable | `Signal.FromEnumerable(values)`, `values.ToSignal()`, or `values.ToObservable()` | Cancellation-token overloads are available. | | task conversion | `Signal.FromTask(task)` | Function-based task signals also exist. | From 132ad6f9d4f6de552cb861d76ae42685c6fc07f2 Mon Sep 17 00:00:00 2001 From: Dong Date: Wed, 9 Sep 2026 23:17:17 +0200 Subject: [PATCH 2/3] Fix formatting in README.md for Observable.Interval --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a67a8f95..b10b5159 100644 --- a/README.md +++ b/README.md @@ -1512,7 +1512,7 @@ dotnet add xyz.Reactive/xyz.Reactive.csproj package ReactiveUI.Primitives.Maui.R | `Observable.Using(...)` | `Signal.Use(...)` | Resource scoped to subscription. | | `Observable.Timer(dueTime)` | `Signal.After(dueTime)` | Emits `long` tick `0`. | | `Observable.Timer(dueTime, period)` | `Signal.After(dueTime, period)` | Periodic `long` ticks. | -| `Observable.Interval(period)` | `Signal.Pulse(period)` , `Signal.Every(period)` or `Signal.Interval(period)` | Repeating ticks. | +| `Observable.Interval(period)` | `Signal.Pulse(period)` , `Signal.Every(period)` or `Signal.Interval(period)` | Repeating ticks. | | `ToObservable()` from enumerable | `Signal.FromEnumerable(values)`, `values.ToSignal()`, or `values.ToObservable()` | Cancellation-token overloads are available. | | task conversion | `Signal.FromTask(task)` | Function-based task signals also exist. | From 30e03fdead5aa93e4e83f6daa3bbd842337de9dd Mon Sep 17 00:00:00 2001 From: Glenn Watson <5834289+glennawatson@users.noreply.github.com> Date: Sat, 12 Sep 2026 16:15:21 +1000 Subject: [PATCH 3/3] docs(readme): name the Rx-compatible alias for every factory The factory mapping listed only the Primitives name for most rows, so a reader migrating from System.Reactive could not tell that the Rx name is available too. Generate, If, Case, Concat, Merge, Switch and OnErrorResumeNext had no row at all. Co-authored-by: Dong --- README.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b10b5159..64b38ed5 100644 --- a/README.md +++ b/README.md @@ -1499,22 +1499,29 @@ dotnet add xyz.Reactive/xyz.Reactive.csproj package ReactiveUI.Primitives.Maui.R | System.Reactive | ReactiveUI.Primitives | Notes | |-------------------------------------|----------------------------------------------------------------------------------|----------------------------------------------------------------| -| `Observable.Return(value)` | `Signal.Emit(value)` | Emits one value and completes. | -| `Observable.Empty()` | `Signal.None()` | Completes immediately. | -| `Observable.Never()` | `Signal.Silent()` or `Signal.Silent(witness)` | Non-terminating signal; witness overload helps type inference. | -| `Observable.Throw(ex)` | `Signal.Fail(ex)` | Emits terminal error. | -| `Observable.Range(start, count)` | `Signal.Sequence(start, count)` | Optional scheduler overload exists. | -| `Observable.Repeat(value)` | `Signal.Loop(value)` | Indefinite repeat. | -| `Observable.Repeat(value, count)` | `Signal.Loop(value, count)` | Fixed repeat. | -| `Observable.Defer(factory)` | `Signal.Lazy(factory)` | Create source per subscription. | +| `Observable.Return(value)` | `Signal.Emit(value)` or `Signal.Return(value)` | Emits one value and completes. | +| `Observable.Empty()` | `Signal.None()` or `Signal.Empty()` | Completes immediately. | +| `Observable.Never()` | `Signal.Silent()`, `Signal.Silent(witness)`, or `Signal.Never()` | Non-terminating signal; witness overload helps type inference. | +| `Observable.Throw(ex)` | `Signal.Fail(ex)` or `Signal.Throw(ex)` | Emits terminal error. | +| `Observable.Range(start, count)` | `Signal.Sequence(start, count)` or `Signal.Range(start, count)` | Optional scheduler overload exists. | +| `Observable.Repeat(value)` | `Signal.Loop(value)` or `Signal.Repeat(value)` | Indefinite repeat. | +| `Observable.Repeat(value, count)` | `Signal.Loop(value, count)` or `Signal.Repeat(value, count)` | Fixed repeat. | +| `Observable.Defer(factory)` | `Signal.Lazy(factory)` or `Signal.Defer(factory)` | Create source per subscription. | | `Observable.FromAsync(...)` | `Signal.FromAsync(...)` | Invoke a task factory per subscription. | | `Observable.Create(...)` | `Signal.Create(...)` or `Signal.CreateSafe(...)` | Prefer `CreateSafe` for general custom sources. | -| `Observable.Using(...)` | `Signal.Use(...)` | Resource scoped to subscription. | -| `Observable.Timer(dueTime)` | `Signal.After(dueTime)` | Emits `long` tick `0`. | -| `Observable.Timer(dueTime, period)` | `Signal.After(dueTime, period)` | Periodic `long` ticks. | -| `Observable.Interval(period)` | `Signal.Pulse(period)` , `Signal.Every(period)` or `Signal.Interval(period)` | Repeating ticks. | +| `Observable.Using(...)` | `Signal.Use(...)` or `Signal.Using(...)` | Resource scoped to subscription. | +| `Observable.Timer(dueTime)` | `Signal.After(dueTime)` or `Signal.Timer(dueTime)` | Emits `long` tick `0`. `Timer` also takes a `DateTimeOffset`. | +| `Observable.Timer(dueTime, period)` | `Signal.After(dueTime, period)` or `Signal.Timer(dueTime, period)` | Periodic `long` ticks. | +| `Observable.Interval(period)` | `Signal.Pulse(period)`, `Signal.Every(period)`, or `Signal.Interval(period)` | Repeating ticks. | | `ToObservable()` from enumerable | `Signal.FromEnumerable(values)`, `values.ToSignal()`, or `values.ToObservable()` | Cancellation-token overloads are available. | | task conversion | `Signal.FromTask(task)` | Function-based task signals also exist. | +| `Observable.Generate(...)` | `Signal.Generate(state, condition, iterate, selector)` | Unfolds a state into a sequence. | +| `Observable.If(condition, then)` | `Signal.If(condition, then)` or `Signal.If(condition, then, else)` | Chooses a source per subscription. | +| `Observable.Case(selector, map)` | `Signal.Case(selector, sources)` or `Signal.Case(selector, sources, default)` | Chooses a source by key per subscription. | +| `Observable.Concat(sources)` | `Signal.Concat(sources)` | Subscribes to each source in turn. | +| `Observable.Merge(sources)` | `Signal.Merge(sources)` | Subscribes to every source at once. | +| `Observable.Switch(sources)` | `Signal.Switch(sources)` | Follows the most recent inner source. | +| `Observable.OnErrorResumeNext(...)` | `Signal.OnErrorResumeNext(sources)` | Continues with the next source after an error. | ### Subject/state mapping