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() }