IAsyncDisposable을 응용해 golang의 defer같은 스타일을 구현.

만들다보니 나중에 처리, 나중에 대기나 잡다한 비전을 일단 한객체로 우겨넣어버리니 부조리한 처리만 많아짐.

정리를 좀 하면 될지 모르겠음



struct Defer : IAsyncDisposable, IDisposable

{
    Func<ValueTask> d;
    ValueTask IAsyncDisposable.DisposeAsync() => d();
    void IDisposable.Dispose() => d().AsTask().Wait();
    public Defer(ValueTask vt) : this(fvt: () => vt){}
    public Defer(Task t) : this(fvt: () => new(t)){}
    public Defer(Action a) : this(fvt: () => { a(); return ValueTask.CompletedTask; }){}
    public Defer(Func<Task> f) : this(fvt: () => new(f())) {}
    public Defer(Func<ValueTask> fvt) => d = fvt;
    public static implicit operator Defer(ValueTask _) => new(vt: _);
    public static implicit operator Defer(Task _) => new(t: _);
    public static implicit operator Defer(Action _) => new(a: _);
    //public static implicit operator Defer(Func<Task> _) => new(f: _);
    public static implicit operator Defer(Func<ValueTask> _) => new(fvt: _);
}