diff --git a/src/Primitives.Shared/LinqExtensions.cs b/src/Primitives.Shared/LinqExtensions.cs index ec09a3be..cfc1b884 100644 --- a/src/Primitives.Shared/LinqExtensions.cs +++ b/src/Primitives.Shared/LinqExtensions.cs @@ -11,19 +11,10 @@ namespace ReactiveUI.Primitives; /// Miscellaneous Primitives extensions. public static partial class LinqExtensions { - /// Disposal-tracking operators for a disposable. + /// Disposal operators for a disposable. /// The disposable. extension(IDisposable disposable) { - /// Disposes the IDisposable with the disposables instance. - /// The disposables. - /// An IDisposable. - public IDisposable DisposeWith(MultipleDisposable disposables) - { - disposables?.Add(disposable); - return disposable; - } - /// Disposes the with. /// A SingleDisposable. public SingleDisposable DisposeWith() => @@ -76,4 +67,22 @@ public IObservable> Buffer(int count, int skip) return new BufferCountSignal(source, count, skip); } } + + /// Disposal-tracking operators for a disposable. + /// The disposable type. + /// The disposable. + extension(T disposable) + where T : IDisposable + { + /// Disposes the IDisposable with the disposables instance. + /// The disposables. + /// The original disposable. + public T DisposeWith(MultipleDisposable disposables) + { + ArgumentExceptionHelper.ThrowIfNull(disposables); + + disposables.Add(disposable); + return disposable; + } + } } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-android/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-android/PublicAPI.txt index 0ba3c32f..aa6ead83 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-android/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-android/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-ios/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-ios/PublicAPI.txt index e5f27e18..f59aa979 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-ios/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-ios/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-maccatalyst/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-maccatalyst/PublicAPI.txt index e9f45d52..20249c17 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-maccatalyst/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-maccatalyst/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-macos/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-macos/PublicAPI.txt index 2a4f244f..d2918a63 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-macos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-macos/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-tvos/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-tvos/PublicAPI.txt index 3f3b4414..ae2a41e0 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-tvos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0-tvos/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0/PublicAPI.txt index 179b85c0..d088608d 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net10.0/PublicAPI.txt @@ -419,9 +419,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-android/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-android/PublicAPI.txt index 0ba3c32f..aa6ead83 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-android/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-android/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-ios/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-ios/PublicAPI.txt index e5f27e18..f59aa979 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-ios/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-ios/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-maccatalyst/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-maccatalyst/PublicAPI.txt index e9f45d52..20249c17 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-maccatalyst/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-maccatalyst/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-macos/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-macos/PublicAPI.txt index 2a4f244f..d2918a63 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-macos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-macos/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-tvos/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-tvos/PublicAPI.txt index 3f3b4414..ae2a41e0 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-tvos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0-tvos/PublicAPI.txt @@ -420,9 +420,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0/PublicAPI.txt index 179b85c0..d088608d 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net11.0/PublicAPI.txt @@ -419,9 +419,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net462/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net462/PublicAPI.txt index e7478d5e..070cfc80 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net462/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net462/PublicAPI.txt @@ -404,9 +404,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net472/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net472/PublicAPI.txt index e7478d5e..070cfc80 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net472/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net472/PublicAPI.txt @@ -404,9 +404,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net48/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net48/PublicAPI.txt index e7478d5e..070cfc80 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net48/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net48/PublicAPI.txt @@ -404,9 +404,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net481/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net481/PublicAPI.txt index e7478d5e..070cfc80 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net481/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net481/PublicAPI.txt @@ -404,9 +404,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net8.0/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net8.0/PublicAPI.txt index a9c41568..976c3125 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net8.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net8.0/PublicAPI.txt @@ -404,9 +404,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net9.0/PublicAPI.txt b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net9.0/PublicAPI.txt index 179b85c0..d088608d 100644 --- a/src/ReactiveUI.Primitives.Reactive/PublicAPI/net9.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives.Reactive/PublicAPI/net9.0/PublicAPI.txt @@ -419,9 +419,12 @@ namespace ReactiveUI.Primitives.Reactive extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net10.0-android/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net10.0-android/PublicAPI.txt index b16fe07a..26f92652 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net10.0-android/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net10.0-android/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net10.0-ios/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net10.0-ios/PublicAPI.txt index cc866a6f..48f1a4ed 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net10.0-ios/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net10.0-ios/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net10.0-maccatalyst/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net10.0-maccatalyst/PublicAPI.txt index c058b769..5b8612fb 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net10.0-maccatalyst/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net10.0-maccatalyst/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net10.0-macos/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net10.0-macos/PublicAPI.txt index b23f9924..12a7248e 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net10.0-macos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net10.0-macos/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net10.0-tvos/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net10.0-tvos/PublicAPI.txt index 0a150d7d..24255aee 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net10.0-tvos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net10.0-tvos/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net10.0/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net10.0/PublicAPI.txt index 64543723..c08a6987 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net10.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net10.0/PublicAPI.txt @@ -77,9 +77,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net11.0-android/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net11.0-android/PublicAPI.txt index b16fe07a..26f92652 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net11.0-android/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net11.0-android/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net11.0-ios/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net11.0-ios/PublicAPI.txt index cc866a6f..48f1a4ed 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net11.0-ios/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net11.0-ios/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net11.0-maccatalyst/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net11.0-maccatalyst/PublicAPI.txt index c058b769..5b8612fb 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net11.0-maccatalyst/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net11.0-maccatalyst/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net11.0-macos/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net11.0-macos/PublicAPI.txt index b23f9924..12a7248e 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net11.0-macos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net11.0-macos/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net11.0-tvos/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net11.0-tvos/PublicAPI.txt index 0a150d7d..24255aee 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net11.0-tvos/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net11.0-tvos/PublicAPI.txt @@ -78,9 +78,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net11.0/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net11.0/PublicAPI.txt index 64543723..c08a6987 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net11.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net11.0/PublicAPI.txt @@ -77,9 +77,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net462/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net462/PublicAPI.txt index ac9a9af4..aae2ab68 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net462/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net462/PublicAPI.txt @@ -62,9 +62,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net472/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net472/PublicAPI.txt index ac9a9af4..aae2ab68 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net472/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net472/PublicAPI.txt @@ -62,9 +62,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net48/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net48/PublicAPI.txt index ac9a9af4..aae2ab68 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net48/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net48/PublicAPI.txt @@ -62,9 +62,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net481/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net481/PublicAPI.txt index ac9a9af4..aae2ab68 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net481/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net481/PublicAPI.txt @@ -62,9 +62,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net8.0/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net8.0/PublicAPI.txt index a1516308..38a03e3a 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net8.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net8.0/PublicAPI.txt @@ -62,9 +62,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/ReactiveUI.Primitives/PublicAPI/net9.0/PublicAPI.txt b/src/ReactiveUI.Primitives/PublicAPI/net9.0/PublicAPI.txt index 64543723..c08a6987 100644 --- a/src/ReactiveUI.Primitives/PublicAPI/net9.0/PublicAPI.txt +++ b/src/ReactiveUI.Primitives/PublicAPI/net9.0/PublicAPI.txt @@ -77,9 +77,12 @@ namespace ReactiveUI.Primitives extension(System.IDisposable disposable) { public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith() { } - public System.IDisposable DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } public ReactiveUI.Primitives.Disposables.SingleDisposable DisposeWith(System.Action? action) { } } + extension(T disposable) where T : System.IDisposable + { + public T DisposeWith(ReactiveUI.Primitives.Disposables.MultipleDisposable disposables) { } + } extension(System.IObservable source) { public System.IObservable CastTo() { } diff --git a/src/tests/ReactiveUI.Primitives.Reactive.Tests/LinqExtensionsTests.cs b/src/tests/ReactiveUI.Primitives.Reactive.Tests/LinqExtensionsTests.cs index 21349d75..d466e48c 100644 --- a/src/tests/ReactiveUI.Primitives.Reactive.Tests/LinqExtensionsTests.cs +++ b/src/tests/ReactiveUI.Primitives.Reactive.Tests/LinqExtensionsTests.cs @@ -5,6 +5,7 @@ using System.Reactive; using System.Reactive.Linq; using ReactiveUI.Primitives.Advanced; +using ReactiveUI.Primitives.Disposables; using ReactiveUI.Primitives.Reactive.Signals; using ReactiveLinqExtensions = ReactiveUI.Primitives.Reactive.LinqExtensions; @@ -22,6 +23,37 @@ public class LinqExtensionsTests /// The string value used by nullable object subscription tests. private const string SubscribeSafeValue = "value"; + /// Verifies DisposeWith preserves the concrete type and tracks the original disposable. + /// A task representing the asynchronous operation. + [Test] + public async Task DisposeWithReturnsConcreteDisposableAndTracksIt() + { + var disposalCount = 0; + ActionDisposable disposable = new(() => disposalCount++); + MultipleDisposable disposables = []; + + var result = disposable.DisposeWith(disposables); + + await Assert.That(result).IsSameReferenceAs(disposable); + await Assert.That(result.IsDisposed).IsFalse(); + await Assert.That(disposables.Contains(disposable)).IsTrue(); + disposables.Dispose(); + await Assert.That(disposalCount).IsEqualTo(1); + } + + /// Verifies DisposeWith rejects a null disposable collection. + /// A task representing the asynchronous operation. + [Test] + public async Task DisposeWithThrowsForNullMultipleDisposable() + { + using ActionDisposable disposable = new(static () => { }); + + var exception = Assert.Throws(() => + disposable.DisposeWith((MultipleDisposable)null!)); + + await Assert.That(exception.ParamName).IsEqualTo("disposables"); + } + /// Verifies fluent SubscribeSafe accepts nullable object values with Rx imports present. /// A task representing the asynchronous operation. [Test] diff --git a/src/tests/ReactiveUI.Primitives.Tests/LinqExtensionsTests.cs b/src/tests/ReactiveUI.Primitives.Tests/LinqExtensionsTests.cs new file mode 100644 index 00000000..ddbcace8 --- /dev/null +++ b/src/tests/ReactiveUI.Primitives.Tests/LinqExtensionsTests.cs @@ -0,0 +1,42 @@ +// Copyright (c) 2019-2026 ReactiveUI Association Incorporated. All rights reserved. +// ReactiveUI Association Incorporated licenses this file to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using ReactiveUI.Primitives.Disposables; + +namespace ReactiveUI.Primitives.Tests; + +/// Verifies miscellaneous Primitives extension contracts. +public class LinqExtensionsTests +{ + /// Verifies DisposeWith preserves the concrete type and tracks the original disposable. + /// A task representing the asynchronous operation. + [Test] + public async Task DisposeWithReturnsConcreteDisposableAndTracksIt() + { + var disposalCount = 0; + ActionDisposable disposable = new(() => disposalCount++); + MultipleDisposable disposables = []; + + var result = disposable.DisposeWith(disposables); + + await Assert.That(result).IsSameReferenceAs(disposable); + await Assert.That(result.IsDisposed).IsFalse(); + await Assert.That(disposables.Contains(disposable)).IsTrue(); + disposables.Dispose(); + await Assert.That(disposalCount).IsEqualTo(1); + } + + /// Verifies DisposeWith rejects a null disposable collection. + /// A task representing the asynchronous operation. + [Test] + public async Task DisposeWithThrowsForNullMultipleDisposable() + { + using ActionDisposable disposable = new(static () => { }); + + var exception = Assert.Throws(() => + disposable.DisposeWith((MultipleDisposable)null!)); + + await Assert.That(exception.ParamName).IsEqualTo("disposables"); + } +}