namespace AsyncEvent { public class AsyncEventHandler { private readonly List> _handlers; private readonly Action> _add; private readonly Action> _remove; public IReadOnlyList> Handlers { get; } public AsyncEventHandler(Action>? add = null, Action>? remove = null) { _handlers = new List>(); Handlers = _handlers.AsReadOnly(); _add = add ?? AddInternal; _remove = remove ?? RemoveInternal; } public void Add(Func handler) { _add.Invoke(handler); } public void Remove(Func handler) { _remove.Invoke(handler); } private void AddInternal(Func handler) { _handlers.Add(handler); } private void RemoveInternal(Func handler) { _handlers.Remove(handler); } public async Task InvokeAsync(TSender sender, TArg args) { foreach(var handler in _handlers) { await handler(sender, args); } } public static AsyncEventHandler operator +(AsyncEventHandler obj, Func handler) { obj.Add(handler); return obj; } public static AsyncEventHandler operator -(AsyncEventHandler obj, Func handler) { obj.Remove(handler); return obj; } } public class AsyncEventHandler : AsyncEventHandler { public AsyncEventHandler(Action>? add = null, Action>? remove = null) : base(add, remove) { } } public class AsyncEventHandler : AsyncEventHandler { public AsyncEventHandler(Action>? add = null, Action>? remove = null) : base(add, remove) { } } }