Files
nginx-ui/internal/helper/debouncer.go

58 lines
1.1 KiB
Go

package helper
import (
"sync"
"time"
)
// Debouncer handles debounced execution of functions
type Debouncer struct {
timer *time.Timer
mutex sync.Mutex
duration time.Duration
isFirst bool
}
// NewDebouncer creates a new debouncer with the specified duration
func NewDebouncer(duration time.Duration) *Debouncer {
return &Debouncer{
duration: duration,
isFirst: true,
}
}
// Trigger executes the callback function with debouncing logic
// For the first call, it executes immediately
// For subsequent calls, it debounces with the configured duration
func (d *Debouncer) Trigger(callback func()) {
d.mutex.Lock()
defer d.mutex.Unlock()
if d.isFirst {
d.isFirst = false
go callback() // Execute immediately for first call
return
}
// Stop existing timer if any
if d.timer != nil {
d.timer.Stop()
}
// Set new timer for debounced execution
d.timer = time.AfterFunc(d.duration, func() {
go callback()
})
}
// Stop cancels any pending debounced execution
func (d *Debouncer) Stop() {
d.mutex.Lock()
defer d.mutex.Unlock()
if d.timer != nil {
d.timer.Stop()
d.timer = nil
}
}