ticker.go 685 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package ticker
  2. import (
  3. "context"
  4. "time"
  5. )
  6. var _ Ticker = (*ticker)(nil)
  7. type Ticker interface {
  8. worker()
  9. Process(fun func())
  10. Stop()
  11. }
  12. type ticker struct {
  13. ticker *time.Ticker
  14. ctx context.Context
  15. cancel context.CancelFunc
  16. f func()
  17. }
  18. func New(d time.Duration) Ticker {
  19. ctx, cancelFunc := context.WithCancel(context.Background())
  20. return &ticker{
  21. ticker: time.NewTicker(d),
  22. ctx: ctx,
  23. cancel: cancelFunc,
  24. }
  25. }
  26. func (t *ticker) worker() {
  27. for {
  28. select {
  29. case <-t.ticker.C:
  30. t.f()
  31. case <-t.ctx.Done():
  32. return
  33. }
  34. }
  35. }
  36. func (t *ticker) Process(fun func()) {
  37. t.f = fun
  38. go t.worker()
  39. }
  40. func (t *ticker) Stop() {
  41. t.ticker.Stop()
  42. t.cancel()
  43. }