Code/Util/Singleton.cs
namespace Nodebox.Util;

public abstract class Singleton<T> : Component, IHotloadManaged where T : Singleton<T> {
    [SkipHotload]
    public static T Instance { get; private set; }

    protected override void OnAwake() {
        if (Instance.IsValid()) {
            Log.Warning($"Multiple Singletons found of type: {TypeLibrary.GetType<T>().Name}");
            Destroy();
            return;
        }

        if (Active) {
            Instance = (T)this;
        }
    }

    void IHotloadManaged.Destroyed(Dictionary<string, object> state) {
        state["IsActive"] = Instance == this;
    }

    void IHotloadManaged.Created(IReadOnlyDictionary<string, object> state) {
        if (state.GetValueOrDefault("IsActive") is true) {
            Instance = (T)this;
        }
    }

    protected override void OnDestroy() {
        if (Instance == this) {
            Instance = null;
        }
    }
}