dispatcher.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package door
  2. import "time"
  3. type Updater interface {
  4. Update() string
  5. }
  6. type Dispatcher struct {
  7. UpdateList []Updater
  8. UpdateInterval *time.Ticker
  9. door *Door
  10. }
  11. func (d *Dispatcher) register(u Updater) {
  12. d.UpdateList = append(d.UpdateList, u)
  13. }
  14. func removeFromSlice(UpdateList []Updater, toRemove Updater) []Updater {
  15. len := len(UpdateList)
  16. for i, obs := range UpdateList {
  17. if toRemove == obs {
  18. UpdateList[len-1], UpdateList[i] = UpdateList[i], UpdateList[len-1]
  19. return UpdateList[:len-1]
  20. }
  21. }
  22. return UpdateList
  23. }
  24. func (d *Dispatcher) unregister(u Updater) {
  25. d.UpdateList = removeFromSlice(d.UpdateList, u)
  26. }
  27. func (d *Dispatcher) Start(duration time.Duration, door *Door) {
  28. d.door = door
  29. d.UpdateInterval = time.NewTicker(duration)
  30. go d.TickerRoutine()
  31. }
  32. func (d *Dispatcher) TickerRoutine() {
  33. for range d.UpdateInterval.C {
  34. d.Update()
  35. }
  36. }
  37. func (d *Dispatcher) Stop() {
  38. d.UpdateInterval.Stop()
  39. }
  40. func (d *Dispatcher) Update() bool {
  41. var result bool
  42. for _, ob := range d.UpdateList {
  43. var output string = ob.Update()
  44. if output != "" {
  45. d.door.Write(SavePos + output + RestorePos)
  46. result = true
  47. }
  48. }
  49. return result
  50. }