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}