From d2924d7ac0055891ab73bbb0a46dccf373fb5051 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Wed, 12 Jun 2024 04:00:25 +0100 Subject: [PATCH] refactor!: remove extensions for Progress --- CHANGELOG.md | 3 +- X10D.Tests/src/Reactive/ProgressTests.cs | 67 ------------------ X10D/src/Reactive/ObservableDisposer.cs | 33 --------- X10D/src/Reactive/ProgressExtensions.cs | 89 ------------------------ X10D/src/Reactive/ProgressObservable.cs | 36 ---------- 5 files changed, 2 insertions(+), 226 deletions(-) delete mode 100644 X10D.Tests/src/Reactive/ProgressTests.cs delete mode 100644 X10D/src/Reactive/ObservableDisposer.cs delete mode 100644 X10D/src/Reactive/ProgressExtensions.cs delete mode 100644 X10D/src/Reactive/ProgressObservable.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ebdd98..c3d26dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 BigEndian/LittleEndian methods. - X10D: `Stream.GetHash<>` and `Stream.TryWriteHash<>` now throw ArgumentException in lieu of TypeInitializationException. -- X10D: `char.IsEmoji` no longer allocates for .NET 7. +- X10D: `char.IsEmoji` no longer allocates for .NET 7+. - X10D: `string.Repeat` is now more efficient. ### Removed @@ -49,6 +49,7 @@ TypeInitializationException. - X10D: Removed `Endianness` enum. - X10D: Removed `Span.Replace(T, T)` for .NET 8 target. - X10D: Removed .NET Standard 2.1 target. +- X10D: Removed extensions for `Progress`. These are already provided by [`Observable.FromEventPattern`](https://learn.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh229424(v=vs.103)). - X10D.Hosting: Removed .NET Standard 2.1 target. - X10D.DSharpPlus: Complete sunset of library. This library will not be updated to support DSharpPlus v5.0.0 (#83). - X10D.Unity: Complete sunset of library. This library will not be updated effective immediately (#86). diff --git a/X10D.Tests/src/Reactive/ProgressTests.cs b/X10D.Tests/src/Reactive/ProgressTests.cs deleted file mode 100644 index 5b8f180..0000000 --- a/X10D.Tests/src/Reactive/ProgressTests.cs +++ /dev/null @@ -1,67 +0,0 @@ -using NUnit.Framework; -using X10D.Reactive; - -namespace X10D.Tests.Reactive; - -[TestFixture] -internal class ProgressTests -{ - [Test] - public void OnProgressChanged_ShouldCallCompletionDelegate_GivenCompletionValue() - { - var subscriberWasCalled = false; - var completionWasCalled = false; - - var progress = new Progress(); - progress.OnProgressChanged(1.0f).Subscribe(_ => subscriberWasCalled = true, () => completionWasCalled = true); - - ((IProgress)progress).Report(0.5f); - ((IProgress)progress).Report(1.0f); - - Thread.Sleep(1000); - Assert.That(subscriberWasCalled); - Assert.That(completionWasCalled); - } - - [Test] - public void OnProgressChanged_ShouldCallSubscribers_OnProgressChanged() - { - var subscriberWasCalled = false; - - var progress = new Progress(); - progress.OnProgressChanged().Subscribe(_ => subscriberWasCalled = true); - - ((IProgress)progress).Report(0.5f); - - Thread.Sleep(1000); - Assert.That(subscriberWasCalled); - } - - [Test] - public void OnProgressChanged_ShouldCallSubscribers_OnProgressChanged_GivenCompletionValue() - { - var subscriberWasCalled = false; - - var progress = new Progress(); - progress.OnProgressChanged(1.0f).Subscribe(_ => subscriberWasCalled = true); - - ((IProgress)progress).Report(0.5f); - - Thread.Sleep(1000); - Assert.That(subscriberWasCalled); - } - - [Test] - public void OnProgressChanged_ShouldThrowArgumentNullException_GivenNullProgress() - { - Progress progress = null!; - Assert.Throws(() => progress.OnProgressChanged()); - } - - [Test] - public void OnProgressChanged_ShouldThrowArgumentNullException_GivenNullProgressAndCompletionValue() - { - Progress progress = null!; - Assert.Throws(() => progress.OnProgressChanged(1.0f)); - } -} diff --git a/X10D/src/Reactive/ObservableDisposer.cs b/X10D/src/Reactive/ObservableDisposer.cs deleted file mode 100644 index b935112..0000000 --- a/X10D/src/Reactive/ObservableDisposer.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace X10D.Reactive; - -/// -/// Represents a disposable that removes an observer from a collection of observers. -/// -internal readonly struct ObservableDisposer : IDisposable -{ - private readonly HashSet> _observers; - private readonly IObserver _observer; - private readonly Action? _additionalAction; - - /// - /// Initializes a new instance of the struct. - /// - /// A collection of observers from which to remove the specified observer. - /// The observer to remove from the collection. - /// The additional action to run on dispose. - public ObservableDisposer(HashSet> observers, IObserver observer, Action? additionalAction) - { - _observers = observers ?? throw new ArgumentNullException(nameof(observers)); - _observer = observer ?? throw new ArgumentNullException(nameof(observer)); - _additionalAction = additionalAction; - } - - /// - /// Removes the observer from the collection of observers. - /// - public void Dispose() - { - _observers.Remove(_observer); - _additionalAction?.Invoke(); - } -} diff --git a/X10D/src/Reactive/ProgressExtensions.cs b/X10D/src/Reactive/ProgressExtensions.cs deleted file mode 100644 index 93f696e..0000000 --- a/X10D/src/Reactive/ProgressExtensions.cs +++ /dev/null @@ -1,89 +0,0 @@ -namespace X10D.Reactive; - -/// -/// Provides extension methods for . -/// -public static class ProgressExtensions -{ - /// - /// Wraps the event of the current in an - /// object. - /// - /// The progress whose event to wrap. - /// The type of progress update value. - /// - /// An object that wraps the event of the current - /// . - /// - /// is . - public static IObservable OnProgressChanged(this Progress progress) - { - if (progress is null) - { - throw new ArgumentNullException(nameof(progress)); - } - - var progressObservable = new ProgressObservable(); - - void ProgressChangedHandler(object? sender, T args) - { - IObserver[] observers = progressObservable.Observers; - - for (var index = 0; index < observers.Length; index++) - { - observers[index].OnNext(args); - } - } - - progress.ProgressChanged += ProgressChangedHandler; - progressObservable.OnDispose = () => progress.ProgressChanged -= ProgressChangedHandler; - - return progressObservable; - } - - /// - /// Wraps the event of the current in an - /// object, and completes the observable when the progress reaches the specified value. - /// - /// The progress whose event to wrap. - /// The value that indicates completion. - /// The type of progress update value. - /// - /// An object that wraps the event of the current - /// . - /// - /// is . - public static IObservable OnProgressChanged(this Progress progress, T completeValue) - { - if (progress is null) - { - throw new ArgumentNullException(nameof(progress)); - } - - var progressObservable = new ProgressObservable(); - var comparer = EqualityComparer.Default; - - void ProgressChangedHandler(object? sender, T args) - { - IObserver[] observers = progressObservable.Observers; - - for (var index = 0; index < observers.Length; index++) - { - observers[index].OnNext(args); - } - - if (comparer.Equals(args, completeValue)) - { - for (var index = 0; index < observers.Length; index++) - { - observers[index].OnCompleted(); - } - } - } - - progress.ProgressChanged += ProgressChangedHandler; - progressObservable.OnDispose = () => progress.ProgressChanged -= ProgressChangedHandler; - - return progressObservable; - } -} diff --git a/X10D/src/Reactive/ProgressObservable.cs b/X10D/src/Reactive/ProgressObservable.cs deleted file mode 100644 index 32a0870..0000000 --- a/X10D/src/Reactive/ProgressObservable.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace X10D.Reactive; - -/// -/// Represents a concrete implementation of that tracks progress of a . -/// -internal sealed class ProgressObservable : IObservable -{ - private readonly HashSet> _observers = new(); - - /// - /// Gets the observers. - /// - /// The observers. - public IObserver[] Observers - { - get => _observers.ToArray(); - } - - internal Action? OnDispose { get; set; } - - /// - /// Subscribes the specified observer to the progress tracker. - /// - /// The observer. - /// An object which can be disposed to unsubscribe from progress tracking. - public IDisposable Subscribe(IObserver observer) - { - if (observer is null) - { - throw new ArgumentNullException(nameof(observer)); - } - - _observers.Add(observer); - return new ObservableDisposer(_observers, observer, OnDispose); - } -}