| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // package safe_bool_observer -- безопасное булево значение с наблюдателями
- package safe_bool_observer
- import (
- "sync"
- . "wartank/kernel/helpers"
- . "wartank/kernel/kernel_types"
- )
- // БезопБулНаблюд -- безопасное булево значение с наблюдателями
- type БезопБулНаблюд struct {
- знач bool
- слвНаблюд map[string]func(bool) // Словарь наблюдателей
- блок sync.RWMutex
- }
- // НовБезопБулНаблюд -- возвращает новое безопасное булево значение с наблюдателями
- func НовБезопБулНаблюд(ключ string, фнНаблюд func(bool)) ИБезопБулНаблюд {
- сам := &БезопБулНаблюд{
- слвНаблюд: map[string]func(bool){},
- }
- сам.Зарегать(ключ, фнНаблюд)
- return сам
- }
- // Уст -- устанавливает хранимое значение
- func (сам *БезопБулНаблюд) Уст() {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- сам.знач = true
- for _, фнНаблюд := range сам.слвНаблюд {
- фнНаблюд(true)
- }
- }
- // Сброс -- сбрасывает хранимое значение
- func (сам *БезопБулНаблюд) Сброс() {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- сам.знач = false
- for _, фнНаблюд := range сам.слвНаблюд {
- фнНаблюд(false)
- }
- }
- // Получ -- возвращает хранимое значение
- func (сам *БезопБулНаблюд) Получ() bool {
- сам.блок.RLock()
- defer сам.блок.RUnlock()
- return сам.знач
- }
- // Зарегать -- зарегистрировать наблюдателя
- func (сам *БезопБулНаблюд) Зарегать(ключ string, фнНаблюд func(bool)) {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- Паника(ключ == "", "БезопБулНаблюд.Зарегать(): ключ пустой")
- Паника(фнНаблюд == nil, "БезопБулНаблюд.Зарегать(): фнНаблюд == nil")
- сам.слвНаблюд[ключ] = фнНаблюд
- }
- // Разрегать -- удалить регистрацию наблюдателя
- func (сам *БезопБулНаблюд) Разрегать(ключ string) {
- сам.блок.Lock()
- defer сам.блок.Unlock()
- delete(сам.слвНаблюд, ключ)
- }
|