// 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(сам.слвНаблюд, ключ) }