Code/Core/IMeta.cs
namespace Nodebox;

public interface IMeta {
    public Dictionary<string, object> Meta { get; }
}

public static class MetaExtensions {
    extension(IMeta meta) {
        public T GetMeta<T>(string key) => (T)meta.Meta[key];
        public T GetMetaOrDefault<T>(string key) => (T)meta.Meta.GetValueOrDefault(key);
        public T GetMetaOrDefault<T>(string key, T value) => (T)meta.Meta.GetValueOrDefault(key, value);
        public void SetMeta<T>(string key, T value) => meta.Meta[key] = value;
        public bool TryGetMeta<T>(string key, out T value) {
            var success = meta.Meta.TryGetValue(key, out var innerValue);
            value = (T)innerValue;
            return success;
        }
    }
}