| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | using System;using System.Collections;using System.Collections.Generic;using System.Collections.Specialized;using System.ComponentModel;using System.Linq;namespace InABox.Core{    public class FluentList<T> : IEnumerable<T>    {        public delegate void FluentListChangedEvent(object sender, EventArgs args);        private int _enabled = 0;        private bool _changed = false;        private readonly List<T> _values = new List<T>();        public bool Enabled        {            get => _enabled == 0;            set            {                if (value)                    EndUpdate();                else                    BeginUpdate();            }        }        public T this[int i]        {            get => _values[i];            set            {                _values[i] = value;                Changed();            }        }        public int Count => _values.Count;        public IEnumerator<T> GetEnumerator()        {            return ((IEnumerable<T>)_values).GetEnumerator();        }        IEnumerator IEnumerable.GetEnumerator()        {            return ((IEnumerable<T>)_values).GetEnumerator();        }        public FluentList<T> Add(T value)        {            if (!_values.Contains(value))            {                _changed = true;                _values.Add(value);            }            return Changed();        }        public FluentList<T> AddRange(params T[] values)        {            foreach (var value in values)                if (!_values.Contains(value))                {                    _changed = true;                    _values.Add(value);                }            return Changed();        }        public FluentList<T> AddRange(IEnumerable<T> values)        {            foreach (var value in values)                if (!_values.Contains(value))                {                    _changed = true;                    _values.Add(value);                }            return Changed();        }        public FluentList<T> Remove(T value)        {            _changed = _values.Remove(value) || _changed;            return Changed();        }        public FluentList<T> RemoveAt(int index)        {            if (index > 0 && index < _values.Count)            {                _values.RemoveAt(index);                _changed = true;            }            return Changed();        }        public FluentList<T> RemoveRange(params T[] values)        {            foreach (var value in values)                _changed = _values.Remove(value) || _changed;            return Changed();        }        public FluentList<T> RemoveRange(IEnumerable<T> values)        {            foreach (var value in values)                _changed = _values.Remove(value) || _changed;            return Changed();        }        public FluentList<T> Clear()        {            if(_values.Count > 0)            {                _values.Clear();                _changed = true;            }            return Changed();        }        public event FluentListChangedEvent OnChanged;        public FluentList<T> BeginUpdate()        {            ++_enabled;            return this;        }        private FluentList<T> Changed()        {            if (_enabled == 0 && _changed)            {                _changed = false;                OnChanged?.Invoke(this, new EventArgs());            }            return this;        }        public FluentList<T> EndUpdate()        {            --_enabled;            return Changed();        }    }}
 |