using Cysharp.Threading.Tasks;
using System;
using System.Threading;
namespace UVC.Util
{
public class Debounce : IDisposable
{
private CancellationTokenSource cts = new CancellationTokenSource();
///
/// 마지막 호출 된 함수 한번 실행. milliseconds 이후 실행 되어 추가로 호추 되면 이전 함수 취소 함.
/// Debounce debounce = new Debounce();
/// debounce.DebounceAction(1000, repository.SaveToolBarData, data);
///
/// param Type
///
///
///
public void DebounceAction(int milliseconds, Action action, T param)
{
resetCancellationToken();
UniTask.Delay(TimeSpan.FromMilliseconds(milliseconds), cancellationToken: cts.Token, ignoreTimeScale: false).ContinueWith(() =>
{
action.Invoke(param);
});
}
///
/// 마지막 호출 된 함수 한번 실행. milliseconds 이후 실행 되어 추가로 호추 되면 이전 함수 취소 함.
/// Debounce debounce = new Debounce();
/// debounce.DebounceUniTask(1000, repository.SaveToolBarData, data);
///
/// param Type
///
///
///
public void DebounceUniTask(int milliseconds, Func action, T param)
{
resetCancellationToken();
UniTask.Delay(TimeSpan.FromMilliseconds(milliseconds), cancellationToken: cts.Token, ignoreTimeScale: false).ContinueWith(() =>
{
action.Invoke(param).Forget();
});
}
private void resetCancellationToken()
{
cts.Cancel();
cts = new CancellationTokenSource();
}
public void Dispose()
{
cts.Cancel();
cts.Dispose();
}
}
}