Created
November 30, 2020 18:39
-
-
Save SteveSandersonMS/8a19d8e992f127bb2d2a315ec6c5a373 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class EventUtil | |
{ | |
// The repetition in here is because of the four combinations of handlers (sync/async * with/without arg) | |
public static Action AsNonRenderingEventHandler(Action callback) | |
=> new SyncReceiver(callback).Invoke; | |
public static Action<TValue> AsNonRenderingEventHandler<TValue>(Action<TValue> callback) | |
=> new SyncReceiver<TValue>(callback).Invoke; | |
public static Func<Task> AsNonRenderingEventHandler(Func<Task> callback) | |
=> new AsyncReceiver(callback).Invoke; | |
public static Func<TValue, Task> AsNonRenderingEventHandler<TValue>(Func<TValue, Task> callback) | |
=> new AsyncReceiver<TValue>(callback).Invoke; | |
record SyncReceiver(Action callback) : ReceiverBase { public void Invoke() => callback(); } | |
record SyncReceiver<T>(Action<T> callback) : ReceiverBase { public void Invoke(T arg) => callback(arg); } | |
record AsyncReceiver(Func<Task> callback) : ReceiverBase { public Task Invoke() => callback(); } | |
record AsyncReceiver<T>(Func<T, Task> callback) : ReceiverBase { public Task Invoke(T arg) => callback(arg); } | |
// By implementing IHandleEvent, we can override the event handling logic on a per-handler basis | |
// The logic here just calls the callback without triggering any re-rendering | |
record ReceiverBase : IHandleEvent | |
{ | |
public Task HandleEventAsync(EventCallbackWorkItem item, object arg) => item.InvokeAsync(arg); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment