| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // package safe_bool_react -- потокобезопасный булевый признак с реакцией на своё изменение.
- package safe_bool_react
- import (
- "fmt"
- "os"
- "strings"
- "sync"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
- )
- // safeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение.
- type safeBoolReact struct {
- sync.RWMutex
- dict map[string]func(bool) // Словарь обратных вызовов
- val bool
- }
- // NewSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение.
- func NewSafeBoolReact() mKs.ISafeBoolReact {
- sf := &safeBoolReact{
- dict: map[string]func(bool){},
- }
- return sf
- }
- // NewSafeBoolReactFromStr -- возвращает новое потокобезопасное булево с реакцией из строки.
- func NewSafeBoolReactFromStr(strVal string) mL0.IResult[mKs.ISafeBoolReact] {
- sf := NewSafeBoolReact()
- res := sf.FromStr(strVal)
- if res.IsErr() {
- err := fmt.Errorf("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
- return mL0.NewErr[mKs.ISafeBoolReact](err)
- }
- return mL0.NewRes(sf)
- }
- // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое с реакцией из окружения.
- func NewSafeBoolGetenv(env string) mL0.IResult[mKs.ISafeBoolReact] {
- sf := NewSafeBoolReact()
- res := sf.Getenv(env)
- if res.IsErr() {
- err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
- return mL0.NewErr[mKs.ISafeBoolReact](err)
- }
- return mL0.NewRes(sf)
- }
- // Delete -- удаляет функцию обратного вызова из наблюдения.
- func (sf *safeBoolReact) Delete(key string) {
- sf.Lock()
- defer sf.Unlock()
- delete(sf.dict, key)
- }
- // Add -- добавляет функцию обратного вызова.
- func (sf *safeBoolReact) Add(key string, fn func(bool)) mL0.IResult[bool] {
- sf.Lock()
- defer sf.Unlock()
- if key == "" {
- return mL0.NewErr[bool](fmt.Errorf("safeBoolReact.Add(): key is empty"))
- }
- _, isOk := sf.dict[key]
- if isOk {
- return mL0.NewErr[bool](fmt.Errorf("safeBoolReact.Add(): key(%v) already exists", key))
- }
- sf.dict[key] = fn
- return mL0.NewRes(true)
- }
- // Get -- возвращает хранимый булевый признак.
- func (sf *safeBoolReact) Get() bool {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val
- }
- // Set -- устанавливает булевый признак.
- func (sf *safeBoolReact) Set() {
- sf.Lock()
- defer sf.Unlock()
- sf.val = true
- for _, fn := range sf.dict {
- fn(true)
- }
- }
- // Reset -- сбрасывает булевый признак.
- func (sf *safeBoolReact) Reset() {
- sf.Lock()
- defer sf.Unlock()
- sf.val = false
- for _, fn := range sf.dict {
- fn(false)
- }
- }
- // FromStr -- получает число из строки.
- func (sf *safeBoolReact) FromStr(strVal string) mL0.IResult[bool] {
- strVal = strings.ToLower(strVal)
- sf.Lock()
- defer sf.Unlock()
- switch strVal {
- case "true":
- sf.val = true
- case "false":
- sf.val = false
- default:
- return mL0.NewErr[bool](fmt.Errorf("safeBoolReact.FromStr(): val(%v) bad", strVal))
- }
- return mL0.NewRes(sf.val)
- }
- // Getenv -- получает значение из окружения.
- func (sf *safeBoolReact) Getenv(env string) mL0.IResult[bool] {
- strVal := os.Getenv(env)
- res := sf.FromStr(strVal)
- if res.IsErr() {
- err := fmt.Errorf("safeBoolReact.Getenv(): from env %v, err=\n\t%w", env, res.Err())
- return mL0.NewErr[bool](err)
- }
- return res
- }
|