timer.go 974 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. Hang() bool
  13. Canceled()
  14. }
  15. type timer struct {
  16. timer *time.Timer
  17. end time.Time
  18. hang bool
  19. Cancel chan struct{}
  20. }
  21. func NewTimer(t time.Duration) Timer {
  22. return &timer{time.NewTimer(t), time.Now().Add(t), false, make(chan struct{})}
  23. }
  24. func (s *timer) i() {}
  25. func (s *timer) Reset(t time.Duration) {
  26. if !s.timer.Stop() {
  27. select {
  28. case <-s.timer.C:
  29. default:
  30. }
  31. }
  32. s.timer.Reset(t)
  33. s.end = time.Now().Add(t)
  34. if t.Seconds() > 4 {
  35. s.hang = true
  36. } else {
  37. s.hang = false
  38. }
  39. }
  40. func (s *timer) Stop() bool {
  41. return s.timer.Stop()
  42. }
  43. func (s *timer) TimeRemaining() time.Duration {
  44. return s.end.Sub(time.Now())
  45. }
  46. func (s *timer) Calc() *time.Timer {
  47. return s.timer
  48. }
  49. func (s *timer) Hang() bool {
  50. return s.hang
  51. }
  52. func (s *timer) Canceled() {
  53. s.Cancel <- struct{}{}
  54. }