Add ObserveClear, ObserveReverse, ObserverSort
This commit is contained in:
parent
c0c9cd48d7
commit
90e6a54218
@ -40,11 +40,26 @@ public static class ObservableCollectionR3Extensions
|
||||
return new ObservableCollectionMove<T>(source, cancellationToken);
|
||||
}
|
||||
|
||||
public static Observable<Unit> ObserveReset<T>(this IObservableCollection<T> source, CancellationToken cancellationToken = default)
|
||||
public static Observable<SortOperation<T>> ObserveReset<T>(this IObservableCollection<T> source, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return new ObservableCollectionReset<T>(source, cancellationToken);
|
||||
}
|
||||
|
||||
public static Observable<Unit> ObserveClear<T>(this IObservableCollection<T> source, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return new ObservableCollectionClear<T>(source, cancellationToken);
|
||||
}
|
||||
|
||||
public static Observable<Unit> ObserveReverse<T>(this IObservableCollection<T> source, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return new ObservableCollectionReverse<T>(source, cancellationToken);
|
||||
}
|
||||
|
||||
public static Observable<(int Index, int Count, IComparer<T> Comparer)> ObserveSort<T>(this IObservableCollection<T> source, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return new ObservableCollectionSort<T>(source, cancellationToken);
|
||||
}
|
||||
|
||||
public static Observable<int> ObserveCountChanged<T>(this IObservableCollection<T> source, bool notifyCurrentCount = false, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return new ObservableCollectionCountChanged<T>(source, notifyCurrentCount, cancellationToken);
|
||||
@ -188,16 +203,39 @@ sealed class ObservableCollectionMove<T>(IObservableCollection<T> collection, Ca
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ObservableCollectionReset<T>(IObservableCollection<T> collection, CancellationToken cancellationToken)
|
||||
: Observable<Unit>
|
||||
: Observable<SortOperation<T>>
|
||||
{
|
||||
protected override IDisposable SubscribeCore(Observer<Unit> observer)
|
||||
protected override IDisposable SubscribeCore(Observer<SortOperation<T>> observer)
|
||||
{
|
||||
return new _ObservableCollectionReset(collection, observer, cancellationToken);
|
||||
}
|
||||
|
||||
sealed class _ObservableCollectionReset(
|
||||
IObservableCollection<T> collection,
|
||||
Observer<SortOperation<T>> observer,
|
||||
CancellationToken cancellationToken)
|
||||
: ObservableCollectionObserverBase<T, SortOperation<T>>(collection, observer, cancellationToken)
|
||||
{
|
||||
protected override void Handler(in NotifyCollectionChangedEventArgs<T> eventArgs)
|
||||
{
|
||||
if (eventArgs.Action == NotifyCollectionChangedAction.Reset)
|
||||
{
|
||||
observer.OnNext(eventArgs.SortOperation);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ObservableCollectionClear<T>(IObservableCollection<T> collection, CancellationToken cancellationToken)
|
||||
: Observable<Unit>
|
||||
{
|
||||
protected override IDisposable SubscribeCore(Observer<Unit> observer)
|
||||
{
|
||||
return new _ObservableCollectionClear(collection, observer, cancellationToken);
|
||||
}
|
||||
|
||||
sealed class _ObservableCollectionClear(
|
||||
IObservableCollection<T> collection,
|
||||
Observer<Unit> observer,
|
||||
CancellationToken cancellationToken)
|
||||
@ -205,7 +243,7 @@ sealed class ObservableCollectionReset<T>(IObservableCollection<T> collection, C
|
||||
{
|
||||
protected override void Handler(in NotifyCollectionChangedEventArgs<T> eventArgs)
|
||||
{
|
||||
if (eventArgs.Action == NotifyCollectionChangedAction.Reset)
|
||||
if (eventArgs.Action == NotifyCollectionChangedAction.Reset && eventArgs.SortOperation.IsNull)
|
||||
{
|
||||
observer.OnNext(Unit.Default);
|
||||
}
|
||||
@ -213,6 +251,52 @@ sealed class ObservableCollectionReset<T>(IObservableCollection<T> collection, C
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ObservableCollectionReverse<T>(IObservableCollection<T> collection, CancellationToken cancellationToken) : Observable<Unit>
|
||||
{
|
||||
protected override IDisposable SubscribeCore(Observer<Unit> observer)
|
||||
{
|
||||
return new _ObservableCollectionReverse(collection, observer, cancellationToken);
|
||||
}
|
||||
|
||||
sealed class _ObservableCollectionReverse(
|
||||
IObservableCollection<T> collection,
|
||||
Observer<Unit> observer,
|
||||
CancellationToken cancellationToken)
|
||||
: ObservableCollectionObserverBase<T, Unit>(collection, observer, cancellationToken)
|
||||
{
|
||||
protected override void Handler(in NotifyCollectionChangedEventArgs<T> eventArgs)
|
||||
{
|
||||
if (eventArgs.Action == NotifyCollectionChangedAction.Reset && eventArgs.SortOperation.IsReverse)
|
||||
{
|
||||
observer.OnNext(Unit.Default);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ObservableCollectionSort<T>(IObservableCollection<T> collection, CancellationToken cancellationToken) : Observable<(int Index, int Count, IComparer<T> Comparer)>
|
||||
{
|
||||
protected override IDisposable SubscribeCore(Observer<(int Index, int Count, IComparer<T> Comparer)> observer)
|
||||
{
|
||||
return new _ObservableCollectionSort(collection, observer, cancellationToken);
|
||||
}
|
||||
|
||||
sealed class _ObservableCollectionSort(
|
||||
IObservableCollection<T> collection,
|
||||
Observer<(int Index, int Count, IComparer<T> Comparer)> observer,
|
||||
CancellationToken cancellationToken)
|
||||
: ObservableCollectionObserverBase<T, (int Index, int Count, IComparer<T> Comparer)>(collection, observer, cancellationToken)
|
||||
{
|
||||
protected override void Handler(in NotifyCollectionChangedEventArgs<T> eventArgs)
|
||||
{
|
||||
if (eventArgs.Action == NotifyCollectionChangedAction.Reset && eventArgs.SortOperation.IsSort)
|
||||
{
|
||||
observer.OnNext(eventArgs.SortOperation.AsTuple());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sealed class ObservableCollectionCountChanged<T>(IObservableCollection<T> collection, bool notifyCurrentCount, CancellationToken cancellationToken)
|
||||
: Observable<int>
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace ObservableCollections
|
||||
@ -16,6 +17,9 @@ namespace ObservableCollections
|
||||
public bool IsReverse => Comparer == ReverseSentinel.Instance;
|
||||
public bool IsNull => Comparer == null;
|
||||
|
||||
[MemberNotNullWhen(true, nameof(Comparer))]
|
||||
public bool IsSort => !IsNull && !IsReverse;
|
||||
|
||||
public SortOperation(int index, int count, IComparer<T>? comparer)
|
||||
{
|
||||
Index = index;
|
||||
@ -23,6 +27,11 @@ namespace ObservableCollections
|
||||
Comparer = comparer ?? NullComparerSentinel.Instance;
|
||||
}
|
||||
|
||||
public (int Index, int Count, IComparer<T> Comparer) AsTuple()
|
||||
{
|
||||
return (Index, Count, Comparer!);
|
||||
}
|
||||
|
||||
public static SortOperation<T> CreateReverse(int index, int count)
|
||||
{
|
||||
return new SortOperation<T>(index, count, ReverseSentinel.Instance);
|
||||
|
@ -157,7 +157,7 @@ namespace ObservableCollections.Tests
|
||||
// list.AddRange(new[] { 10, 21, 30, 44 });
|
||||
|
||||
// var filter1 = new TestFilter<int>((x, v) => x % 2 == 0);
|
||||
// view1.AttachFilter(filter1);
|
||||
// view1.AttachFilter((x, v) => x % 2 == 0));
|
||||
|
||||
// filter1.CalledOnCollectionChanged[0].Action.Should().Be(NotifyCollectionChangedAction.Add);
|
||||
// filter1.CalledOnCollectionChanged[0].NewValue.Should().Be(10);
|
||||
|
Loading…
x
Reference in New Issue
Block a user