using System.Collections; namespace Xorog.UniversalExtensions.Entities; public class ObservableList : IList { private List _items = new(); public event EventHandler>? ItemsChanged; public T this[int index] { get => _items[index]; set { _items[index] = value; } } public int Count => _items.Count; public bool IsReadOnly => false; public void Add(T item) { _items.Add(item); _ = Task.Run(() => { this.ItemsChanged?.Invoke(null, new ObservableListUpdate { List = this, NewItems = new List() { item }, RemovedItems = null }); }); } public void Insert(int index, T item) { _items.Insert(index, item); _ = Task.Run(() => { this.ItemsChanged?.Invoke(null, new ObservableListUpdate { List = this, NewItems = new List() { item }, RemovedItems = null }); }); } public void Clear() { _items.Clear(); _ = Task.Run(() => { this.ItemsChanged?.Invoke(null, new ObservableListUpdate { List = this, NewItems = null, RemovedItems = _items.ToList() }); }); } public void RemoveAt(int index) { ObservableListUpdate e = new ObservableListUpdate { List = this, NewItems = null, RemovedItems = new List() { _items.ElementAt(index) } }; _items.RemoveAt(index); _ = Task.Run(() => { this.ItemsChanged?.Invoke(null, e); }); } public bool Remove(T item) { var v = _items.Remove(item); _ = Task.Run(() => { this.ItemsChanged?.Invoke(null, new ObservableListUpdate { List = this, NewItems = null, RemovedItems = new List() { item } }); }); return v; } public bool Contains(T item) => _items.Contains(item); public void CopyTo(T[] array, int arrayIndex) => _items.CopyTo(array, arrayIndex); public IEnumerator GetEnumerator() => _items.GetEnumerator(); public int IndexOf(T item) => _items.IndexOf(item); IEnumerator IEnumerable.GetEnumerator() => _items.GetEnumerator(); }