base-golang/pkg/ticker/ticker.go

53 lines
685 B
Go
Raw Permalink Normal View History

2024-07-23 10:23:43 +08:00
package ticker
import (
"context"
"time"
)
var _ Ticker = (*ticker)(nil)
type Ticker interface {
worker()
Process(fun func())
Stop()
}
type ticker struct {
ticker *time.Ticker
ctx context.Context
cancel context.CancelFunc
f func()
}
func New(d time.Duration) Ticker {
ctx, cancelFunc := context.WithCancel(context.Background())
return &ticker{
ticker: time.NewTicker(d),
ctx: ctx,
cancel: cancelFunc,
}
}
func (t *ticker) worker() {
for {
select {
case <-t.ticker.C:
t.f()
case <-t.ctx.Done():
return
}
}
}
func (t *ticker) Process(fun func()) {
t.f = fun
go t.worker()
}
func (t *ticker) Stop() {
t.ticker.Stop()
t.cancel()
}