# Zafiro Reactive Shortcuts Use these Zafiro extension methods to replace standard, more verbose Reactive and DynamicData patterns. ## General Observable Helpers | Standard Pattern | Zafiro Shortcut | | :--- | :--- | | `Replay(1).RefCount()` | `ReplayLastActive()` | | `Select(_ => Unit.Default)` | `ToSignal()` | | `Select(b => !b)` | `Not()` | | `Where(b => b).ToSignal()` | `Trues()` | | `Where(b => !b).ToSignal()` | `Falses()` | | `Select(x => x is null)` | `Null()` | | `Select(x => x is not null)` | `NotNull()` | | `Select(string.IsNullOrWhiteSpace)` | `NullOrWhitespace()` | | `Select(s => !string.IsNullOrWhiteSpace(s))` | `NotNullOrEmpty()` | ## Result & Maybe Extensions | Standard Pattern | Zafiro Shortcut | | :--- | :--- | | `Where(r => r.IsSuccess).Select(r => r.Value)` | `Successes()` | | `Where(r => r.IsFailure).Select(r => r.Error)` | `Failures()` | | `Where(m => m.HasValue).Select(m => m.Value)` | `Values()` | | `Where(m => !m.HasValue).ToSignal()` | `Empties()` | ## Lifecycle Management | Description | Method | | :--- | :--- | | Dispose previous item before emitting new one | `DisposePrevious()` | | Manage lifecycle within a disposable | `DisposeWith(disposables)` | ## Command & Interaction | Description | Method | | :--- | :--- | | Add metadata/text to a ReactiveCommand | `Enhance(text, name)` | | Automatically show errors in UI | `HandleErrorsWith(notificationService)` | > [!TIP] > Always check `Zafiro.Reactive.ObservableMixin` and `Zafiro.CSharpFunctionalExtensions.ObservableExtensions` before writing custom Rx logic.