timer.go 825 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package utils
  2. import (
  3. "time"
  4. )
  5. var _ Timer = (*timer)(nil)
  6. type Timer interface {
  7. i()
  8. Reset(t time.Duration)
  9. Stop() bool
  10. TimeRemaining() time.Duration
  11. Calc() *time.Timer
  12. Canceled()
  13. }
  14. type timer struct {
  15. timer *time.Timer
  16. end time.Time
  17. Cancel chan struct{}
  18. }
  19. func NewTimer(t time.Duration) Timer {
  20. return &timer{time.NewTimer(t), time.Now().Add(t), make(chan struct{})}
  21. }
  22. func (s *timer) i() {}
  23. func (s *timer) Reset(t time.Duration) {
  24. if !s.timer.Stop() {
  25. select {
  26. case <-s.timer.C:
  27. default:
  28. }
  29. }
  30. s.timer.Reset(t)
  31. s.end = time.Now().Add(t)
  32. }
  33. func (s *timer) Stop() bool {
  34. return s.timer.Stop()
  35. }
  36. func (s *timer) TimeRemaining() time.Duration {
  37. return s.end.Sub(time.Now())
  38. }
  39. func (s *timer) Calc() *time.Timer {
  40. return s.timer
  41. }
  42. func (s *timer) Canceled() {
  43. s.Cancel <- struct{}{}
  44. }