// Debounced Signal - Timer-based signal debouncing (requires JS runtime)
//
///|
/// Debounce signal updates using setTimeout
pub fn[T] debounced(
sig : @resource.Signal[T],
delay_ms : Int,
) -> @resource.Signal[T] {
let result = @resource.Signal::new(sig.peek())
let timer_id : Ref[@global.Timer?] = Ref(None)
let first_run = Ref(true)
let _ = @resource.render_effect(fn() {
let value = sig.get()
if first_run.val {
first_run.val = false
} else {
// Cancel previous timer
match timer_id.val {
Some(id) => @global.clearTimeout(id)
None => ()
}
// Set new timer
timer_id.val = Some(
@global.setTimeout(fn() { result.set(value) }, delay_ms),
)
}
})
result
}