using System.Collections; using System.Collections.Specialized; using PkmnLib.Static.Utils; namespace PkmnLib.Dynamic.AI.Explicit; public class FunctionHandlerDictionary : IDictionary, IReadOnlyDictionary where TValue : class { private readonly OrderedDictionary _backingDictionary = new(); /// public IEnumerator> GetEnumerator() => _backingDictionary.Cast() .Select(entry => new KeyValuePair((StringKey)entry.Key, (TValue)entry.Value)) .GetEnumerator(); /// IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); /// public void Add(KeyValuePair item) => _backingDictionary.Add(item.Key, item.Value); /// public void Clear() => _backingDictionary.Clear(); /// public bool Contains(KeyValuePair item) { if (_backingDictionary.Contains(item.Key)) { var value = _backingDictionary[item.Key]; return EqualityComparer.Default.Equals((TValue)value, item.Value); } return false; } /// public void CopyTo(KeyValuePair[] array, int arrayIndex) { if (array == null) throw new ArgumentNullException(nameof(array)); if (arrayIndex < 0 || arrayIndex + Count > array.Length) throw new ArgumentOutOfRangeException(nameof(arrayIndex)); foreach (var item in this) { array[arrayIndex++] = item; } } /// public bool Remove(KeyValuePair item) { if (_backingDictionary.Contains(item.Key)) { var value = _backingDictionary[item.Key]; if (EqualityComparer.Default.Equals((TValue)value, item.Value)) { _backingDictionary.Remove(item.Key); return true; } } return false; } /// public int Count => _backingDictionary.Count; /// public bool IsReadOnly => false; /// public void Add(StringKey key, TValue value) => _backingDictionary.Add(key, value); /// public bool ContainsKey(StringKey key) => _backingDictionary.Contains(key); /// public bool Remove(StringKey key) { if (!_backingDictionary.Contains(key)) return false; _backingDictionary.Remove(key); return true; } /// public bool TryGetValue(StringKey key, out TValue value) { if (_backingDictionary.Contains(key)) { value = (TValue)_backingDictionary[key]; return true; } value = null!; return false; } /// public TValue this[StringKey key] { get => (TValue)_backingDictionary[key]; set => _backingDictionary[key] = value; } /// IEnumerable IReadOnlyDictionary.Keys => Keys; /// IEnumerable IReadOnlyDictionary.Values => Values; /// public ICollection Keys => _backingDictionary.Keys.Cast().ToList(); /// public ICollection Values => _backingDictionary.Values.Cast().ToList(); }