2020-05-08 23:46:05 +08:00
|
|
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
2022-11-28 02:20:29 +08:00
|
|
|
// SPDX-License-Identifier: MIT
|
2020-05-08 23:46:05 +08:00
|
|
|
|
|
|
|
package util
|
|
|
|
|
|
|
|
import (
|
2023-04-12 18:16:45 +08:00
|
|
|
"sync"
|
2020-05-08 23:46:05 +08:00
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// StopTimer is a utility function to safely stop a time.Timer and clean its channel
|
|
|
|
func StopTimer(t *time.Timer) bool {
|
|
|
|
stopped := t.Stop()
|
|
|
|
if !stopped {
|
|
|
|
select {
|
|
|
|
case <-t.C:
|
|
|
|
default:
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return stopped
|
|
|
|
}
|
2023-04-12 18:16:45 +08:00
|
|
|
|
|
|
|
func Debounce(d time.Duration) func(f func()) {
|
|
|
|
type debouncer struct {
|
|
|
|
mu sync.Mutex
|
|
|
|
t *time.Timer
|
|
|
|
}
|
|
|
|
db := &debouncer{}
|
|
|
|
|
|
|
|
return func(f func()) {
|
|
|
|
db.mu.Lock()
|
|
|
|
defer db.mu.Unlock()
|
|
|
|
|
|
|
|
if db.t != nil {
|
|
|
|
db.t.Stop()
|
|
|
|
}
|
|
|
|
var trigger *time.Timer
|
|
|
|
trigger = time.AfterFunc(d, func() {
|
|
|
|
db.mu.Lock()
|
|
|
|
defer db.mu.Unlock()
|
|
|
|
if trigger == db.t {
|
|
|
|
f()
|
|
|
|
db.t = nil
|
|
|
|
}
|
|
|
|
})
|
|
|
|
db.t = trigger
|
|
|
|
}
|
|
|
|
}
|