namespace InnovEnergy.Lib.Protocols.DBus.Utils;

public class DisposableStack : IDisposable
{
    private readonly Stack<IDisposable> _Disposables = new Stack<IDisposable>();

    private void Dispose(Boolean disposing)
    {
        if (!disposing) 
            return;

        while (_Disposables.Count > 0)
            _Disposables.Pop().Dispose();
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    internal IDisposable AddDisposable(IDisposable disposable)
    {
        _Disposables.Push(disposable);
        return disposable;
    }

    internal IDisposable AddDisposeAction(Action dispose)
    {
        return AddDisposable(new Disposable(dispose));
    }

    private class Disposable : IDisposable
    {
        private readonly Action _Dispose;
        public Disposable(Action dispose) => _Dispose = dispose;
        public void Dispose() => _Dispose();
    }
}