diff --git a/src/Core/NetPad.Domain/Utilities/DelegateUtil.cs b/src/Core/NetPad.Domain/Utilities/DelegateUtil.cs index 3281779b..6aec002a 100644 --- a/src/Core/NetPad.Domain/Utilities/DelegateUtil.cs +++ b/src/Core/NetPad.Domain/Utilities/DelegateUtil.cs @@ -6,16 +6,48 @@ namespace NetPad.Utilities; public static class DelegateUtil { - public static Action Debounce(this Action func, int milliseconds = 300) + public static Action Debounce(this Action func, int milliseconds = 300, bool immediate = false) { CancellationTokenSource? cancelTokenSource = null; + Task? task = null; + + return () => + { + cancelTokenSource?.Cancel(); + cancelTokenSource = new CancellationTokenSource(); + + if (immediate && (task == null || task.IsCompleted)) + { + func(); + } + + task = Task.Delay(milliseconds, cancelTokenSource.Token) + .ContinueWith(t => + { + if (t.IsCompletedSuccessfully) + { + func(); + } + }, TaskScheduler.Default); + }; + } + + public static Action Debounce(this Action func, int milliseconds = 300, bool immediate = false) + { + CancellationTokenSource? cancelTokenSource = null; + Task? task = null; return arg => { cancelTokenSource?.Cancel(); cancelTokenSource = new CancellationTokenSource(); - Task.Delay(milliseconds, cancelTokenSource.Token) + if (immediate && (task == null || task.IsCompleted)) + { + func(arg); + } + + task = Task.Delay(milliseconds, cancelTokenSource.Token) .ContinueWith(t => { if (t.IsCompletedSuccessfully)