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, ctx ...context.Context) Ticker { if len(ctx) < 1 { ctx = append(ctx, context.Background()) } c, cancelFunc := context.WithCancel(ctx[0]) return &ticker{ ticker: time.NewTicker(d), ctx: c, 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() }