diff --git a/sandbox/BlazorApp/BlazorApp.csproj b/sandbox/BlazorApp/BlazorApp.csproj index e5eafff..74041af 100644 --- a/sandbox/BlazorApp/BlazorApp.csproj +++ b/sandbox/BlazorApp/BlazorApp.csproj @@ -1,11 +1,12 @@ - - net6.0 - + + net6.0 + enable + - - - + + + diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ISynchronizedViewFilter.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ISynchronizedViewFilter.cs index 186eb1d..a33b6f4 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ISynchronizedViewFilter.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ISynchronizedViewFilter.cs @@ -7,7 +7,7 @@ namespace ObservableCollections bool IsMatch(T value, TView view); void WhenTrue(T value, TView view); void WhenFalse(T value, TView view); - void OnCollectionChanged(ChangedKind changedKind, T value, TView view); + void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs); } public enum ChangedKind @@ -35,14 +35,14 @@ namespace ObservableCollections public bool IsMatch(T value, TView view) => isMatch(value, view); public void WhenFalse(T value, TView view) => whenFalse?.Invoke(value, view); public void WhenTrue(T value, TView view) => whenTrue?.Invoke(value, view); - public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) => onCollectionChanged?.Invoke(changedKind, value, view); + public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) => onCollectionChanged?.Invoke(changedKind, value, view); class NullViewFilter : ISynchronizedViewFilter { public bool IsMatch(T value, TView view) => true; public void WhenFalse(T value, TView view) { } public void WhenTrue(T value, TView view) { } - public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) { } + public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { } } } @@ -68,12 +68,12 @@ namespace ObservableCollections return filter == SynchronizedViewFilter.Null; } - internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, (T value, TView view) value) + internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs eventArgs) { - InvokeOnAdd(filter, value.value, value.view); + InvokeOnAdd(filter, value.value, value.view, eventArgs); } - internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, T value, TView view) + internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { if (filter.IsMatch(value, view)) { @@ -83,27 +83,27 @@ namespace ObservableCollections { filter.WhenFalse(value, view); } - filter.OnCollectionChanged(ChangedKind.Add, value, view); + filter.OnCollectionChanged(ChangedKind.Add, value, view, eventArgs); } - internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, (T value, TView view) value) + internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs eventArgs) { - InvokeOnRemove(filter, value.value, value.view); + InvokeOnRemove(filter, value.value, value.view, eventArgs); } - internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, T value, TView view) + internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { - filter.OnCollectionChanged(ChangedKind.Remove, value, view); + filter.OnCollectionChanged(ChangedKind.Remove, value, view, eventArgs); } - internal static void InvokeOnMove(this ISynchronizedViewFilter filter, (T value, TView view) value) + internal static void InvokeOnMove(this ISynchronizedViewFilter filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs eventArgs) { - InvokeOnMove(filter, value.value, value.view); + InvokeOnMove(filter, value.value, value.view, eventArgs); } - internal static void InvokeOnMove(this ISynchronizedViewFilter filter, T value, TView view) + internal static void InvokeOnMove(this ISynchronizedViewFilter filter, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { - filter.OnCollectionChanged(ChangedKind.Move, value, view); + filter.OnCollectionChanged(ChangedKind.Move, value, view, eventArgs); } internal static void InvokeOnAttach(this ISynchronizedViewFilter filter, T value, TView view) diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/CloneCollection.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/CloneCollection.cs index 43bd988..0c830f6 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/CloneCollection.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/CloneCollection.cs @@ -3,6 +3,7 @@ using System.Buffers; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; +using System.Linq; namespace ObservableCollections.Internal { diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedView.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedView.cs index d0ca75c..43b8a98 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedView.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedView.cs @@ -122,7 +122,7 @@ namespace ObservableCollections.Internal var view = transform(value); var id = identitySelector(value); dict.Add((value, id), (value, view)); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } else { @@ -131,7 +131,7 @@ namespace ObservableCollections.Internal var view = transform(value); var id = identitySelector(value); dict.Add((value, id), (value, view)); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } } } @@ -143,7 +143,7 @@ namespace ObservableCollections.Internal var value = e.OldItem; var id = identitySelector(value); dict.Remove((value, id), out var v); - filter.InvokeOnRemove(v.Value, v.View); + filter.InvokeOnRemove(v.Value, v.View, e); } else { @@ -151,7 +151,7 @@ namespace ObservableCollections.Internal { var id = identitySelector(value); dict.Remove((value, id), out var v); - filter.InvokeOnRemove(v.Value, v.View); + filter.InvokeOnRemove(v.Value, v.View, e); } } } @@ -168,8 +168,8 @@ namespace ObservableCollections.Internal var id = identitySelector(value); dict.Add((value, id), (value, view)); - filter.InvokeOnRemove(oldView); - filter.InvokeOnAdd(value, view); + filter.InvokeOnRemove(oldView, e); + filter.InvokeOnAdd(value, view, e); } break; case NotifyCollectionChangedAction.Move: @@ -178,7 +178,7 @@ namespace ObservableCollections.Internal var oldValue = e.OldItem; if (dict.TryGetValue((oldValue, identitySelector(oldValue)), out var view)) { - filter.InvokeOnMove(view); + filter.InvokeOnMove(view, e); } } break; @@ -187,7 +187,7 @@ namespace ObservableCollections.Internal { foreach (var item in dict) { - filter.InvokeOnRemove(item.Value); + filter.InvokeOnRemove(item.Value, e); } } dict.Clear(); diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedViewViewComparer.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedViewViewComparer.cs index c543490..35b75cd 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedViewViewComparer.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/Internal/SortedViewViewComparer.cs @@ -128,7 +128,7 @@ namespace ObservableCollections.Internal var id = identitySelector(value); dict.Add((view, id), (value, view)); viewMap.Add(id, view); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } else { @@ -138,7 +138,7 @@ namespace ObservableCollections.Internal var id = identitySelector(value); dict.Add((view, id), (value, view)); viewMap.Add(id, view); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } } } @@ -152,7 +152,7 @@ namespace ObservableCollections.Internal if (viewMap.Remove(id, out var view)) { dict.Remove((view, id), out var v); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } else @@ -163,7 +163,7 @@ namespace ObservableCollections.Internal if (viewMap.Remove(id, out var view)) { dict.Remove((view, id), out var v); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } } @@ -177,7 +177,7 @@ namespace ObservableCollections.Internal if (viewMap.Remove(oldKey, out var oldView)) { dict.Remove((oldView, oldKey)); - filter.InvokeOnRemove(oldValue, oldView); + filter.InvokeOnRemove(oldValue, oldView, e); } var value = e.NewItem; @@ -186,7 +186,7 @@ namespace ObservableCollections.Internal dict.Add((view, id), (value, view)); viewMap.Add(id, view); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } break; case NotifyCollectionChangedAction.Move: @@ -196,7 +196,7 @@ namespace ObservableCollections.Internal var key = identitySelector(value); if (viewMap.TryGetValue(key, out var view)) { - filter.InvokeOnMove(value, view); + filter.InvokeOnMove(value, view, e); } } break; @@ -205,7 +205,7 @@ namespace ObservableCollections.Internal { foreach (var item in dict) { - filter.InvokeOnRemove(item.Value); + filter.InvokeOnRemove(item.Value, e); } } dict.Clear(); diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableDictionary.Views.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableDictionary.Views.cs index 96e6b8e..e3c63ef 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableDictionary.Views.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableDictionary.Views.cs @@ -121,14 +121,14 @@ namespace ObservableCollections { var v = selector(e.NewItem); dict.Add(e.NewItem.Key, (e.NewItem.Value, v)); - filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v); + filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v, e); } break; case NotifyCollectionChangedAction.Remove: { if (dict.Remove(e.OldItem.Key, out var v)) { - filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, v.Item1), v.Item2)); + filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, v.Item1), v.Item2), e); } } break; @@ -136,12 +136,12 @@ namespace ObservableCollections { if (dict.Remove(e.OldItem.Key, out var oldView)) { - filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, oldView.Item1), oldView.Item2)); + filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, oldView.Item1), oldView.Item2), e); } var v = selector(e.NewItem); dict[e.NewItem.Key] = (e.NewItem.Value, v); - filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v); + filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v, e); } break; case NotifyCollectionChangedAction.Reset: @@ -150,7 +150,7 @@ namespace ObservableCollections { foreach (var item in dict) { - filter.InvokeOnRemove((new KeyValuePair(item.Key, item.Value.Item1), item.Value.Item2)); + filter.InvokeOnRemove((new KeyValuePair(item.Key, item.Value.Item1), item.Value.Item2), e); } } diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.Views.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.Views.cs index cc215b2..8b18997 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.Views.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.Views.cs @@ -118,7 +118,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); dict.Add(e.NewItem, v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -126,7 +126,7 @@ namespace ObservableCollections { var v = (item, selector(item)); dict.Add(item, v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } break; @@ -135,7 +135,7 @@ namespace ObservableCollections { if (dict.Remove(e.OldItem, out var value)) { - filter.InvokeOnRemove(value.Item1, value.Item2); + filter.InvokeOnRemove(value.Item1, value.Item2, e); } } else @@ -144,7 +144,7 @@ namespace ObservableCollections { if (dict.Remove(item, out var value)) { - filter.InvokeOnRemove(value.Item1, value.Item2); + filter.InvokeOnRemove(value.Item1, value.Item2, e); } } } @@ -154,7 +154,7 @@ namespace ObservableCollections { foreach (var item in dict) { - filter.InvokeOnRemove(item.Value); + filter.InvokeOnRemove(item.Value, e); } } dict.Clear(); diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.cs index 328dfdb..d498ae7 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableHashSet.cs @@ -3,6 +3,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace ObservableCollections { diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableList.Views.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableList.Views.cs index 28e005c..69b832d 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableList.Views.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableList.Views.cs @@ -136,7 +136,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); list.Add(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -144,7 +144,7 @@ namespace ObservableCollections { var v = (item, selector(item)); list.Add(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } } @@ -155,7 +155,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); list.Insert(e.NewStartingIndex, v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -166,7 +166,7 @@ namespace ObservableCollections { var v = (span[i], selector(span[i])); newArray[i] = v; - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } list.InsertRange(e.NewStartingIndex, newArray); } @@ -177,7 +177,7 @@ namespace ObservableCollections { var v = list[e.OldStartingIndex]; list.RemoveAt(e.OldStartingIndex); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } else { @@ -185,7 +185,7 @@ namespace ObservableCollections for (int i = e.OldStartingIndex; i < len; i++) { var v = list[i]; - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } list.RemoveRange(e.OldStartingIndex, e.OldItems.Length); @@ -199,8 +199,8 @@ namespace ObservableCollections var oldItem = list[e.NewStartingIndex]; list[e.NewStartingIndex] = v; - filter.InvokeOnRemove(oldItem); - filter.InvokeOnAdd(v); + filter.InvokeOnRemove(oldItem, e); + filter.InvokeOnAdd(v, e); break; } case NotifyCollectionChangedAction.Move: @@ -209,7 +209,7 @@ namespace ObservableCollections list.RemoveAt(e.OldStartingIndex); list.Insert(e.NewStartingIndex, removeItem); - filter.InvokeOnMove(removeItem); + filter.InvokeOnMove(removeItem, e); } break; case NotifyCollectionChangedAction.Reset: @@ -217,7 +217,7 @@ namespace ObservableCollections { foreach (var item in list) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } list.Clear(); diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableQueue.Views.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableQueue.Views.cs index 0939e0a..92e4443 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableQueue.Views.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableQueue.Views.cs @@ -134,7 +134,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); queue.Enqueue(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -142,7 +142,7 @@ namespace ObservableCollections { var v = (item, selector(item)); queue.Enqueue(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } break; @@ -151,7 +151,7 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = queue.Dequeue(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } else { @@ -159,7 +159,7 @@ namespace ObservableCollections for (int i = 0; i < len; i++) { var v = queue.Dequeue(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } } break; @@ -168,7 +168,7 @@ namespace ObservableCollections { foreach (var item in queue) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } queue.Clear(); diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableRingBuffer.Views.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableRingBuffer.Views.cs index af5f857..745c916 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableRingBuffer.Views.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableRingBuffer.Views.cs @@ -141,7 +141,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); ringBuffer.AddFirst(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -149,7 +149,7 @@ namespace ObservableCollections { var v = (item, selector(item)); ringBuffer.AddFirst(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } } @@ -160,7 +160,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); ringBuffer.AddLast(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -168,7 +168,7 @@ namespace ObservableCollections { var v = (item, selector(item)); ringBuffer.AddLast(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } } @@ -181,14 +181,14 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = ringBuffer.RemoveFirst(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } else { for (int i = 0; i < e.OldItems.Length; i++) { var v = ringBuffer.RemoveFirst(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } } @@ -198,14 +198,14 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = ringBuffer.RemoveLast(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } else { for (int i = 0; i < e.OldItems.Length; i++) { var v = ringBuffer.RemoveLast(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } } @@ -215,7 +215,7 @@ namespace ObservableCollections { foreach (var item in ringBuffer) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } ringBuffer.Clear(); @@ -228,8 +228,8 @@ namespace ObservableCollections var oldItem = ringBuffer[e.NewStartingIndex]; ringBuffer[e.NewStartingIndex] = v; - filter.InvokeOnRemove(oldItem); - filter.InvokeOnAdd(v); + filter.InvokeOnRemove(oldItem, e); + filter.InvokeOnAdd(v, e); break; } case NotifyCollectionChangedAction.Move: diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableStack.Views.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableStack.Views.cs index 98157b6..9fba638 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableStack.Views.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/ObservableStack.Views.cs @@ -134,7 +134,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); stack.Push(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -142,7 +142,7 @@ namespace ObservableCollections { var v = (item, selector(item)); stack.Push(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } break; @@ -151,7 +151,7 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = stack.Pop(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } else { @@ -159,7 +159,7 @@ namespace ObservableCollections for (int i = 0; i < len; i++) { var v = stack.Pop(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } } break; @@ -168,7 +168,7 @@ namespace ObservableCollections { foreach (var item in stack) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } stack.Clear(); diff --git a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs index 2b71878..51ce375 100644 --- a/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs +++ b/src/ObservableCollections.Unity/Assets/Plugins/ObservableCollections/Runtime/RingBuffer.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace ObservableCollections { diff --git a/src/ObservableCollections/ISynchronizedViewFilter.cs b/src/ObservableCollections/ISynchronizedViewFilter.cs index ebbfe37..cd0fcfb 100644 --- a/src/ObservableCollections/ISynchronizedViewFilter.cs +++ b/src/ObservableCollections/ISynchronizedViewFilter.cs @@ -7,7 +7,7 @@ namespace ObservableCollections bool IsMatch(T value, TView view); void WhenTrue(T value, TView view); void WhenFalse(T value, TView view); - void OnCollectionChanged(ChangedKind changedKind, T value, TView view); + void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs); } public enum ChangedKind @@ -35,14 +35,14 @@ namespace ObservableCollections public bool IsMatch(T value, TView view) => isMatch(value, view); public void WhenFalse(T value, TView view) => whenFalse?.Invoke(value, view); public void WhenTrue(T value, TView view) => whenTrue?.Invoke(value, view); - public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) => onCollectionChanged?.Invoke(changedKind, value, view); + public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) => onCollectionChanged?.Invoke(changedKind, value, view); class NullViewFilter : ISynchronizedViewFilter { public bool IsMatch(T value, TView view) => true; public void WhenFalse(T value, TView view) { } public void WhenTrue(T value, TView view) { } - public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) { } + public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { } } } @@ -68,12 +68,12 @@ namespace ObservableCollections return filter == SynchronizedViewFilter.Null; } - internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, (T value, TView view) value) + internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs eventArgs) { - InvokeOnAdd(filter, value.value, value.view); + InvokeOnAdd(filter, value.value, value.view, eventArgs); } - internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, T value, TView view) + internal static void InvokeOnAdd(this ISynchronizedViewFilter filter, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { if (filter.IsMatch(value, view)) { @@ -83,27 +83,27 @@ namespace ObservableCollections { filter.WhenFalse(value, view); } - filter.OnCollectionChanged(ChangedKind.Add, value, view); + filter.OnCollectionChanged(ChangedKind.Add, value, view, eventArgs); } - internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, (T value, TView view) value) + internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs eventArgs) { - InvokeOnRemove(filter, value.value, value.view); + InvokeOnRemove(filter, value.value, value.view, eventArgs); } - internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, T value, TView view) + internal static void InvokeOnRemove(this ISynchronizedViewFilter filter, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { - filter.OnCollectionChanged(ChangedKind.Remove, value, view); + filter.OnCollectionChanged(ChangedKind.Remove, value, view, eventArgs); } - internal static void InvokeOnMove(this ISynchronizedViewFilter filter, (T value, TView view) value) + internal static void InvokeOnMove(this ISynchronizedViewFilter filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs eventArgs) { - InvokeOnMove(filter, value.value, value.view); + InvokeOnMove(filter, value.value, value.view, eventArgs); } - internal static void InvokeOnMove(this ISynchronizedViewFilter filter, T value, TView view) + internal static void InvokeOnMove(this ISynchronizedViewFilter filter, T value, TView view, in NotifyCollectionChangedEventArgs eventArgs) { - filter.OnCollectionChanged(ChangedKind.Move, value, view); + filter.OnCollectionChanged(ChangedKind.Move, value, view, eventArgs); } internal static void InvokeOnAttach(this ISynchronizedViewFilter filter, T value, TView view) diff --git a/src/ObservableCollections/Internal/CloneCollection.cs b/src/ObservableCollections/Internal/CloneCollection.cs index fb72d60..7f3b5cc 100644 --- a/src/ObservableCollections/Internal/CloneCollection.cs +++ b/src/ObservableCollections/Internal/CloneCollection.cs @@ -3,6 +3,7 @@ using System.Buffers; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; +using System.Linq; namespace ObservableCollections.Internal { diff --git a/src/ObservableCollections/Internal/SortedView.cs b/src/ObservableCollections/Internal/SortedView.cs index 9dce18a..0411985 100644 --- a/src/ObservableCollections/Internal/SortedView.cs +++ b/src/ObservableCollections/Internal/SortedView.cs @@ -122,7 +122,7 @@ namespace ObservableCollections.Internal var view = transform(value); var id = identitySelector(value); dict.Add((value, id), (value, view)); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } else { @@ -131,7 +131,7 @@ namespace ObservableCollections.Internal var view = transform(value); var id = identitySelector(value); dict.Add((value, id), (value, view)); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } } } @@ -143,7 +143,7 @@ namespace ObservableCollections.Internal var value = e.OldItem; var id = identitySelector(value); dict.Remove((value, id), out var v); - filter.InvokeOnRemove(v.Value, v.View); + filter.InvokeOnRemove(v.Value, v.View, e); } else { @@ -151,7 +151,7 @@ namespace ObservableCollections.Internal { var id = identitySelector(value); dict.Remove((value, id), out var v); - filter.InvokeOnRemove(v.Value, v.View); + filter.InvokeOnRemove(v.Value, v.View, e); } } } @@ -168,8 +168,8 @@ namespace ObservableCollections.Internal var id = identitySelector(value); dict.Add((value, id), (value, view)); - filter.InvokeOnRemove(oldView); - filter.InvokeOnAdd(value, view); + filter.InvokeOnRemove(oldView, e); + filter.InvokeOnAdd(value, view, e); } break; case NotifyCollectionChangedAction.Move: @@ -178,7 +178,7 @@ namespace ObservableCollections.Internal var oldValue = e.OldItem; if (dict.TryGetValue((oldValue, identitySelector(oldValue)), out var view)) { - filter.InvokeOnMove(view); + filter.InvokeOnMove(view, e); } } break; @@ -187,7 +187,7 @@ namespace ObservableCollections.Internal { foreach (var item in dict) { - filter.InvokeOnRemove(item.Value); + filter.InvokeOnRemove(item.Value, e); } } dict.Clear(); diff --git a/src/ObservableCollections/Internal/SortedViewViewComparer.cs b/src/ObservableCollections/Internal/SortedViewViewComparer.cs index 3bf75b4..383c2eb 100644 --- a/src/ObservableCollections/Internal/SortedViewViewComparer.cs +++ b/src/ObservableCollections/Internal/SortedViewViewComparer.cs @@ -128,7 +128,7 @@ namespace ObservableCollections.Internal var id = identitySelector(value); dict.Add((view, id), (value, view)); viewMap.Add(id, view); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } else { @@ -138,7 +138,7 @@ namespace ObservableCollections.Internal var id = identitySelector(value); dict.Add((view, id), (value, view)); viewMap.Add(id, view); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } } } @@ -152,7 +152,7 @@ namespace ObservableCollections.Internal if (viewMap.Remove(id, out var view)) { dict.Remove((view, id), out var v); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } else @@ -163,7 +163,7 @@ namespace ObservableCollections.Internal if (viewMap.Remove(id, out var view)) { dict.Remove((view, id), out var v); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } } @@ -177,7 +177,7 @@ namespace ObservableCollections.Internal if (viewMap.Remove(oldKey, out var oldView)) { dict.Remove((oldView, oldKey)); - filter.InvokeOnRemove(oldValue, oldView); + filter.InvokeOnRemove(oldValue, oldView, e); } var value = e.NewItem; @@ -186,7 +186,7 @@ namespace ObservableCollections.Internal dict.Add((view, id), (value, view)); viewMap.Add(id, view); - filter.InvokeOnAdd(value, view); + filter.InvokeOnAdd(value, view, e); } break; case NotifyCollectionChangedAction.Move: @@ -196,7 +196,7 @@ namespace ObservableCollections.Internal var key = identitySelector(value); if (viewMap.TryGetValue(key, out var view)) { - filter.InvokeOnMove(value, view); + filter.InvokeOnMove(value, view, e); } } break; @@ -205,7 +205,7 @@ namespace ObservableCollections.Internal { foreach (var item in dict) { - filter.InvokeOnRemove(item.Value); + filter.InvokeOnRemove(item.Value, e); } } dict.Clear(); diff --git a/src/ObservableCollections/ObservableDictionary.Views.cs b/src/ObservableCollections/ObservableDictionary.Views.cs index fbeaed0..fff8918 100644 --- a/src/ObservableCollections/ObservableDictionary.Views.cs +++ b/src/ObservableCollections/ObservableDictionary.Views.cs @@ -121,14 +121,14 @@ namespace ObservableCollections { var v = selector(e.NewItem); dict.Add(e.NewItem.Key, (e.NewItem.Value, v)); - filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v); + filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v, e); } break; case NotifyCollectionChangedAction.Remove: { if (dict.Remove(e.OldItem.Key, out var v)) { - filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, v.Item1), v.Item2)); + filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, v.Item1), v.Item2), e); } } break; @@ -136,12 +136,12 @@ namespace ObservableCollections { if (dict.Remove(e.OldItem.Key, out var oldView)) { - filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, oldView.Item1), oldView.Item2)); + filter.InvokeOnRemove((new KeyValuePair(e.OldItem.Key, oldView.Item1), oldView.Item2), e); } var v = selector(e.NewItem); dict[e.NewItem.Key] = (e.NewItem.Value, v); - filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v); + filter.InvokeOnAdd(new KeyValuePair(e.NewItem.Key, e.NewItem.Value), v, e); } break; case NotifyCollectionChangedAction.Reset: @@ -150,7 +150,7 @@ namespace ObservableCollections { foreach (var item in dict) { - filter.InvokeOnRemove((new KeyValuePair(item.Key, item.Value.Item1), item.Value.Item2)); + filter.InvokeOnRemove((new KeyValuePair(item.Key, item.Value.Item1), item.Value.Item2), e); } } diff --git a/src/ObservableCollections/ObservableHashSet.Views.cs b/src/ObservableCollections/ObservableHashSet.Views.cs index c054052..f8dadbf 100644 --- a/src/ObservableCollections/ObservableHashSet.Views.cs +++ b/src/ObservableCollections/ObservableHashSet.Views.cs @@ -118,7 +118,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); dict.Add(e.NewItem, v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -126,7 +126,7 @@ namespace ObservableCollections { var v = (item, selector(item)); dict.Add(item, v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } break; @@ -135,7 +135,7 @@ namespace ObservableCollections { if (dict.Remove(e.OldItem, out var value)) { - filter.InvokeOnRemove(value.Item1, value.Item2); + filter.InvokeOnRemove(value.Item1, value.Item2, e); } } else @@ -144,7 +144,7 @@ namespace ObservableCollections { if (dict.Remove(item, out var value)) { - filter.InvokeOnRemove(value.Item1, value.Item2); + filter.InvokeOnRemove(value.Item1, value.Item2, e); } } } @@ -154,7 +154,7 @@ namespace ObservableCollections { foreach (var item in dict) { - filter.InvokeOnRemove(item.Value); + filter.InvokeOnRemove(item.Value, e); } } dict.Clear(); diff --git a/src/ObservableCollections/ObservableHashSet.cs b/src/ObservableCollections/ObservableHashSet.cs index b409515..4734174 100644 --- a/src/ObservableCollections/ObservableHashSet.cs +++ b/src/ObservableCollections/ObservableHashSet.cs @@ -3,6 +3,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace ObservableCollections { diff --git a/src/ObservableCollections/ObservableList.Views.cs b/src/ObservableCollections/ObservableList.Views.cs index 282c390..aae921f 100644 --- a/src/ObservableCollections/ObservableList.Views.cs +++ b/src/ObservableCollections/ObservableList.Views.cs @@ -136,7 +136,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); list.Add(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -144,7 +144,7 @@ namespace ObservableCollections { var v = (item, selector(item)); list.Add(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } } @@ -155,7 +155,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); list.Insert(e.NewStartingIndex, v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -166,7 +166,7 @@ namespace ObservableCollections { var v = (span[i], selector(span[i])); newArray[i] = v; - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } list.InsertRange(e.NewStartingIndex, newArray); } @@ -177,7 +177,7 @@ namespace ObservableCollections { var v = list[e.OldStartingIndex]; list.RemoveAt(e.OldStartingIndex); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } else { @@ -185,7 +185,7 @@ namespace ObservableCollections for (int i = e.OldStartingIndex; i < len; i++) { var v = list[i]; - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } list.RemoveRange(e.OldStartingIndex, e.OldItems.Length); @@ -199,8 +199,8 @@ namespace ObservableCollections var oldItem = list[e.NewStartingIndex]; list[e.NewStartingIndex] = v; - filter.InvokeOnRemove(oldItem); - filter.InvokeOnAdd(v); + filter.InvokeOnRemove(oldItem, e); + filter.InvokeOnAdd(v, e); break; } case NotifyCollectionChangedAction.Move: @@ -209,7 +209,7 @@ namespace ObservableCollections list.RemoveAt(e.OldStartingIndex); list.Insert(e.NewStartingIndex, removeItem); - filter.InvokeOnMove(removeItem); + filter.InvokeOnMove(removeItem, e); } break; case NotifyCollectionChangedAction.Reset: @@ -217,7 +217,7 @@ namespace ObservableCollections { foreach (var item in list) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } list.Clear(); diff --git a/src/ObservableCollections/ObservableQueue.Views.cs b/src/ObservableCollections/ObservableQueue.Views.cs index 31db2f8..76b245a 100644 --- a/src/ObservableCollections/ObservableQueue.Views.cs +++ b/src/ObservableCollections/ObservableQueue.Views.cs @@ -134,7 +134,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); queue.Enqueue(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -142,7 +142,7 @@ namespace ObservableCollections { var v = (item, selector(item)); queue.Enqueue(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } break; @@ -151,7 +151,7 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = queue.Dequeue(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } else { @@ -159,7 +159,7 @@ namespace ObservableCollections for (int i = 0; i < len; i++) { var v = queue.Dequeue(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } } break; @@ -168,7 +168,7 @@ namespace ObservableCollections { foreach (var item in queue) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } queue.Clear(); diff --git a/src/ObservableCollections/ObservableRingBuffer.Views.cs b/src/ObservableCollections/ObservableRingBuffer.Views.cs index b20a7b4..987bf55 100644 --- a/src/ObservableCollections/ObservableRingBuffer.Views.cs +++ b/src/ObservableCollections/ObservableRingBuffer.Views.cs @@ -141,7 +141,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); ringBuffer.AddFirst(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -149,7 +149,7 @@ namespace ObservableCollections { var v = (item, selector(item)); ringBuffer.AddFirst(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } } @@ -160,7 +160,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); ringBuffer.AddLast(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -168,7 +168,7 @@ namespace ObservableCollections { var v = (item, selector(item)); ringBuffer.AddLast(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } } @@ -181,14 +181,14 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = ringBuffer.RemoveFirst(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } else { for (int i = 0; i < e.OldItems.Length; i++) { var v = ringBuffer.RemoveFirst(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } } @@ -198,14 +198,14 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = ringBuffer.RemoveLast(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } else { for (int i = 0; i < e.OldItems.Length; i++) { var v = ringBuffer.RemoveLast(); - filter.InvokeOnRemove(v); + filter.InvokeOnRemove(v, e); } } } @@ -215,7 +215,7 @@ namespace ObservableCollections { foreach (var item in ringBuffer) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } ringBuffer.Clear(); @@ -228,8 +228,8 @@ namespace ObservableCollections var oldItem = ringBuffer[e.NewStartingIndex]; ringBuffer[e.NewStartingIndex] = v; - filter.InvokeOnRemove(oldItem); - filter.InvokeOnAdd(v); + filter.InvokeOnRemove(oldItem, e); + filter.InvokeOnAdd(v, e); break; } case NotifyCollectionChangedAction.Move: diff --git a/src/ObservableCollections/ObservableStack.Views.cs b/src/ObservableCollections/ObservableStack.Views.cs index 77ec33c..a4aaf79 100644 --- a/src/ObservableCollections/ObservableStack.Views.cs +++ b/src/ObservableCollections/ObservableStack.Views.cs @@ -134,7 +134,7 @@ namespace ObservableCollections { var v = (e.NewItem, selector(e.NewItem)); stack.Push(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } else { @@ -142,7 +142,7 @@ namespace ObservableCollections { var v = (item, selector(item)); stack.Push(v); - filter.InvokeOnAdd(v); + filter.InvokeOnAdd(v, e); } } break; @@ -151,7 +151,7 @@ namespace ObservableCollections if (e.IsSingleItem) { var v = stack.Pop(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } else { @@ -159,7 +159,7 @@ namespace ObservableCollections for (int i = 0; i < len; i++) { var v = stack.Pop(); - filter.InvokeOnRemove(v.Item1, v.Item2); + filter.InvokeOnRemove(v.Item1, v.Item2, e); } } break; @@ -168,7 +168,7 @@ namespace ObservableCollections { foreach (var item in stack) { - filter.InvokeOnRemove(item); + filter.InvokeOnRemove(item, e); } } stack.Clear(); diff --git a/src/ObservableCollections/RingBuffer.cs b/src/ObservableCollections/RingBuffer.cs index f8ac262..409bacc 100644 --- a/src/ObservableCollections/RingBuffer.cs +++ b/src/ObservableCollections/RingBuffer.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace ObservableCollections { diff --git a/tests/ObservableCollections.Tests/ViewContainer.cs b/tests/ObservableCollections.Tests/ViewContainer.cs index d6f26e3..947d689 100644 --- a/tests/ObservableCollections.Tests/ViewContainer.cs +++ b/tests/ObservableCollections.Tests/ViewContainer.cs @@ -54,7 +54,7 @@ namespace ObservableCollections.Tests return this.filter.Invoke(value, view); } - public void OnCollectionChanged(ChangedKind changedKind, T value, ViewContainer view) + public void OnCollectionChanged(ChangedKind changedKind, T value, ViewContainer view, in NotifyCollectionChangedEventArgs eventArgs) { CalledOnCollectionChanged.Add((changedKind, value, view)); } @@ -94,7 +94,7 @@ namespace ObservableCollections.Tests return this.filter.Invoke(value, view); } - public void OnCollectionChanged(ChangedKind changedKind, KeyValuePair value, ViewContainer view) + public void OnCollectionChanged(ChangedKind changedKind, KeyValuePair value, ViewContainer view, in NotifyCollectionChangedEventArgs> eventArgs) { CalledOnCollectionChanged.Add((changedKind, value, view)); }