Исходный код 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]