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: _);
}
댓글 0