safe_bool_observer.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // package safe_bool_observer -- безопасное булево значение с наблюдателями
  2. package safe_bool_observer
  3. import (
  4. "sync"
  5. . "wartank/kernel/helpers"
  6. . "wartank/kernel/kernel_types"
  7. )
  8. // БезопБулНаблюд -- безопасное булево значение с наблюдателями
  9. type БезопБулНаблюд struct {
  10. знач bool
  11. слвНаблюд map[string]func(bool) // Словарь наблюдателей
  12. блок sync.RWMutex
  13. }
  14. // НовБезопБулНаблюд -- возвращает новое безопасное булево значение с наблюдателями
  15. func НовБезопБулНаблюд(ключ string, фнНаблюд func(bool)) ИБезопБулНаблюд {
  16. сам := &БезопБулНаблюд{
  17. слвНаблюд: map[string]func(bool){},
  18. }
  19. сам.Зарегать(ключ, фнНаблюд)
  20. return сам
  21. }
  22. // Уст -- устанавливает хранимое значение
  23. func (сам *БезопБулНаблюд) Уст() {
  24. сам.блок.Lock()
  25. defer сам.блок.Unlock()
  26. сам.знач = true
  27. for _, фнНаблюд := range сам.слвНаблюд {
  28. фнНаблюд(true)
  29. }
  30. }
  31. // Сброс -- сбрасывает хранимое значение
  32. func (сам *БезопБулНаблюд) Сброс() {
  33. сам.блок.Lock()
  34. defer сам.блок.Unlock()
  35. сам.знач = false
  36. for _, фнНаблюд := range сам.слвНаблюд {
  37. фнНаблюд(false)
  38. }
  39. }
  40. // Получ -- возвращает хранимое значение
  41. func (сам *БезопБулНаблюд) Получ() bool {
  42. сам.блок.RLock()
  43. defer сам.блок.RUnlock()
  44. return сам.знач
  45. }
  46. // Зарегать -- зарегистрировать наблюдателя
  47. func (сам *БезопБулНаблюд) Зарегать(ключ string, фнНаблюд func(bool)) {
  48. сам.блок.Lock()
  49. defer сам.блок.Unlock()
  50. Паника(ключ == "", "БезопБулНаблюд.Зарегать(): ключ пустой")
  51. Паника(фнНаблюд == nil, "БезопБулНаблюд.Зарегать(): фнНаблюд == nil")
  52. сам.слвНаблюд[ключ] = фнНаблюд
  53. }
  54. // Разрегать -- удалить регистрацию наблюдателя
  55. func (сам *БезопБулНаблюд) Разрегать(ключ string) {
  56. сам.блок.Lock()
  57. defer сам.блок.Unlock()
  58. delete(сам.слвНаблюд, ключ)
  59. }