mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2026-05-06 22:12:23 +08:00
58 lines
1.1 KiB
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
|
|
}
|
|
}
|