using System.Collections; using System.Collections.Generic; namespace KitsuneCafe.System.Collections { public class BiDictionary : IDictionary.Left, BiDictionary.Right>, IDictionary.Right, BiDictionary.Left> { public record Left(TKey Value) { public static implicit operator Left(TKey key) => new(key); public static implicit operator TKey(Left left) => left.Value; } public record Right(TValue Value) { public static implicit operator Right(TValue value) => new(value); public static implicit operator TValue(Right right) => right.Value; } private readonly Dictionary forward = new(); private readonly Dictionary reverse = new(); public ICollection Keys => ((IDictionary)forward).Keys; public ICollection Values => ((IDictionary)forward).Values; public int Count => ((ICollection>)forward).Count; public bool IsReadOnly => ((ICollection>)forward).IsReadOnly; ICollection IDictionary.Keys => ((IDictionary)reverse).Keys; ICollection IDictionary.Values => ((IDictionary)reverse).Values; public Left this[Right key] { get => ((IDictionary)reverse)[key]; set => ((IDictionary)reverse)[key] = value; } public Right this[Left key] { get => ((IDictionary)forward)[key]; set => ((IDictionary)forward)[key] = value; } public void Add(Left key, Right value) { ((IDictionary)forward).Add(key, value); } public bool ContainsKey(Left key) { return ((IDictionary)forward).ContainsKey(key); } public bool Remove(Left key) { return ((IDictionary)forward).Remove(key); } public bool TryGetValue(Left key, out Right value) { return ((IDictionary)forward).TryGetValue(key, out value); } public void Add(KeyValuePair item) { ((ICollection>)forward).Add(item); } public void Clear() { ((ICollection>)forward).Clear(); } public bool Contains(KeyValuePair item) { return ((ICollection>)forward).Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { ((ICollection>)forward).CopyTo(array, arrayIndex); } public bool Remove(KeyValuePair item) { return ((ICollection>)forward).Remove(item); } public IEnumerator> GetEnumerator() { return ((IEnumerable>)forward).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)forward).GetEnumerator(); } public void Add(Right key, Left value) { ((IDictionary)reverse).Add(key, value); } public bool ContainsKey(Right key) { return ((IDictionary)reverse).ContainsKey(key); } public bool Remove(Right key) { return ((IDictionary)reverse).Remove(key); } public bool TryGetValue(Right key, out Left value) { return ((IDictionary)reverse).TryGetValue(key, out value); } public void Add(KeyValuePair item) { ((ICollection>)reverse).Add(item); } public bool Contains(KeyValuePair item) { return ((ICollection>)reverse).Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { ((ICollection>)reverse).CopyTo(array, arrayIndex); } public bool Remove(KeyValuePair item) { return ((ICollection>)reverse).Remove(item); } IEnumerator> IEnumerable>.GetEnumerator() { return ((IEnumerable>)reverse).GetEnumerator(); } } }