Исходный код EJIO.ctk_extender.state.reactive

## /ctk_extender/state/reactive.py

from threading import Lock
from ..event import EventController
from .events import StateChangedEvent

__all__ = [
    'State',
]


[документация] class State[T]: """ Потокобезопасный контейнер одиночного реактивного состояния. Любая перезапись значения автоматически транслирует событие в EventController. """ __slots__ = ('_lock', '_value') def __init__(self, initial_value: T) -> None: """ :param initial_value: Начальное значение состояния. """ self._lock: Lock = Lock() self._value: T = initial_value @property def value(self) -> T: """Возвращает текущее значение состояния.""" with self._lock: return self._value @value.setter def value(self, new_value: T) -> None: """Устанавливает новое значение и генерирует событие изменения.""" changed: bool = False with self._lock: if self._value != new_value: self._value = new_value changed = True if changed: EventController.emit(StateChangedEvent(self, new_value)) def __repr__(self) -> str: with self._lock: return f"State({self._value!r})" def __del__(self) -> None: """Деструктор состояния. Разрывает ссылку на удерживаемый объект.""" with self._lock: self._value = None # type: ignore[assignment]