safe_bool_react.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // package safe_bool_react -- потокобезопасный булевый признак с реакцией на своё изменение
  2. package safe_bool_react
  3. import (
  4. "sync"
  5. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  6. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  7. )
  8. // safeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение
  9. type safeBoolReact struct {
  10. sync.RWMutex
  11. dict map[string]func(bool) // Словарь обратных вызовов
  12. val bool
  13. }
  14. // NewSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение
  15. func NewSafeBoolReact() ISafeBoolReact {
  16. sf := &safeBoolReact{
  17. dict: map[string]func(bool){},
  18. }
  19. return sf
  20. }
  21. // Delete -- удаляет функцию обратного вызова из наблюдения
  22. func (sf *safeBoolReact) Delete(key string) {
  23. sf.Lock()
  24. defer sf.Unlock()
  25. delete(sf.dict, key)
  26. }
  27. // Add -- добавляет функцию обратного вызова
  28. func (sf *safeBoolReact) Add(key string, fn func(bool)) {
  29. sf.Lock()
  30. defer sf.Unlock()
  31. Hassert(key != "", "safeBoolReact.Add(): key is empty")
  32. _, isOk := sf.dict[key]
  33. Hassert(!isOk, "safeBoolReact.Add(): key already exists")
  34. sf.dict[key] = fn
  35. }
  36. // Get -- возвращает хранимый булевый признак
  37. func (sf *safeBoolReact) Get() bool {
  38. sf.RLock()
  39. defer sf.RUnlock()
  40. return sf.val
  41. }
  42. // Set -- устанавливает булевый признак
  43. func (sf *safeBoolReact) Set() {
  44. sf.Lock()
  45. defer sf.Unlock()
  46. sf.val = true
  47. for _, fn := range sf.dict {
  48. fn(true)
  49. }
  50. }
  51. // Reset -- сбрасывает булевый признак
  52. func (sf *safeBoolReact) Reset() {
  53. sf.Lock()
  54. defer sf.Unlock()
  55. sf.val = false
  56. for _, fn := range sf.dict {
  57. fn(false)
  58. }
  59. }