using System; using System.Threading.Tasks; using Cysharp.Threading.Tasks; namespace Ca2d.Toolkit { public static class AsDisposableExtension { public static AsDisposable AsDisposable(Action callback) { return new AsDisposable(callback); } public static AsAsyncDisposable AsAsyncDisposable(Func callback) { return new AsAsyncDisposable(callback); } public static AsDisposable AsDisposable(this T target, Action callback) { return new AsDisposable(callback, target); } public static AsAsyncDisposable AsAsyncDisposable(this T target, Func callback) { return new AsAsyncDisposable(callback, target); } } public readonly struct AsDisposable : IDisposable { private readonly Action m_callback; public AsDisposable(Action callback) { m_callback = callback; } public static implicit operator AsDisposable(Action callback) { return new AsDisposable(callback); } public void Dispose() { Guard.IgnoreException(m_callback); } } public readonly struct AsDisposable : IDisposable { private readonly Action m_callback; private readonly TParam m_param; public AsDisposable(TParam param, Action callback) { m_param = param; m_callback = callback; } public AsDisposable(Action callback, TParam param) { m_param = param; m_callback = callback; } public void Dispose() { Guard.IgnoreException(m_callback, m_param); } } public readonly struct AsAsyncDisposable : IAsyncDisposable { private readonly Func m_callback; public AsAsyncDisposable(Func callback) { m_callback = callback; } public static implicit operator AsAsyncDisposable(Func callback) { return new AsAsyncDisposable(callback); } public async ValueTask DisposeAsync() { if (m_callback == null) return; await Guard.IgnoreException(m_callback); } } public readonly struct AsAsyncDisposable : IAsyncDisposable { private readonly Func m_callback; private readonly TParam m_param; public AsAsyncDisposable(TParam param, Func callback) { m_param = param; m_callback = callback; } public AsAsyncDisposable(Func callback, TParam param) { m_param = param; m_callback = callback; } public async ValueTask DisposeAsync() { if (m_callback == null) return; await Guard.IgnoreException(m_callback, m_param); } } }