Debounce.res
1// Debounce module - schedules function execution with cancel capability
2// Usage: let handle = Debounce.make(fn, delay)
3// handle->Debounce.cancel // to cancel pending execution
4
5type t = {
6 mutable timeoutId: option<int>,
7}
8
9@val external setTimeout: (unit => unit, int) => int = "setTimeout"
10@val external clearTimeout: int => unit = "clearTimeout"
11
12// Immediately schedule fn to run after delay milliseconds
13// Returns a handle that can be used to cancel the execution
14let make = (fn: unit => unit, delay: int): t => {
15 let state = {
16 timeoutId: None,
17 }
18
19 let id = setTimeout(() => {
20 fn()
21 state.timeoutId = None
22 }, delay)
23
24 state.timeoutId = Some(id)
25 state
26}
27
28// Cancel a pending execution
29// Safe to call even if already executed or cancelled
30let cancel = (state: t): unit => {
31 switch state.timeoutId {
32 | Some(id) =>
33 clearTimeout(id)
34 state.timeoutId = None
35 | None => ()
36 }
37}