using System.Collections; using System; using System.Collections.Generic; namespace DCFApixels.DragonECS { public interface IConfigContainer { int Count { get; } bool Has(); T Get(); bool TryGet(out T value); IEnumerable GetAllConfigs(); } public interface IConfigContainerWriter { int Count { get; } void Set(T value); bool Has(); T Get(); bool TryGet(out T value); void Remove(); IEnumerable GetAllConfigs(); } public static class ConfigContainerExtensions { public static T GetOrDefault(this IConfigContainer self, T defaultValue) { if (self.TryGet(out T value)) { return value; } return defaultValue; } } public class DefaultConfigContainerBase : IConfigContainer, IConfigContainerWriter, IEnumerable { private Dictionary _storage = new Dictionary(); public DefaultConfigContainerBase() { } public DefaultConfigContainerBase(IEnumerable range) { foreach (var item in range) { _storage.Add(item.GetType(), item); } } public DefaultConfigContainerBase(params object[] range) { foreach (var item in range) { _storage.Add(item.GetType(), item); } } public int Count { get { return _storage.Count; } } public T Get() { return (T)_storage[typeof(T)]; } public bool Has() { return _storage.ContainsKey(typeof(T)); } public void Remove() { _storage.Remove(typeof(T)); } protected void SetInternal(T value) { _storage[typeof(T)] = value; } void IConfigContainerWriter.Set(T value) { SetInternal(value); } public bool TryGet(out T value) { bool result = _storage.TryGetValue(typeof(T), out object rawValue); value = rawValue == null ? default : (T)rawValue; return result; } public IEnumerable GetAllConfigs() { return _storage.Values; } public IEnumerator GetEnumerator() { return _storage.Values.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetAllConfigs().GetEnumerator(); } } public static class DefaultConfigContainerBaseExtensions { public static TContainer Set(this TContainer self, T value) where TContainer : IConfigContainerWriter { self.Set(value); return self; } } }