package common import ( "time" "sync" ) /* Debouncer */ type Debouncer struct { Ch chan struct{} quit chan struct{} dur time.Duration mtx sync.Mutex timer *time.Timer } func NewDebouncer(dur time.Duration) *Debouncer { var timer *time.Timer var ch = make(chan struct{}) var quit = make(chan struct{}) var mtx sync.Mutex fire := func() { go func() { select { case ch <- struct{}{}: case <-quit: } }() mtx.Lock(); defer mtx.Unlock() timer.Reset(dur) } timer = time.AfterFunc(dur, fire) return &Debouncer{Ch:ch, dur:dur, quit:quit, mtx:mtx, timer:timer} } func (d *Debouncer) Reset() { d.mtx.Lock(); defer d.mtx.Unlock() d.timer.Reset(d.dur) } func (d *Debouncer) Stop() bool { d.mtx.Lock(); defer d.mtx.Unlock() close(d.quit) return d.timer.Stop() }