| 67 | |
| 68 | |
| 69 | class _CurrentState(Generic[_Type]): |
| 70 | __slots__ = "value", "dispatch" |
| 71 | |
| 72 | def __init__( |
| 73 | self, |
| 74 | initial_value: _Type | Callable[[], _Type], |
| 75 | ) -> None: |
| 76 | if callable(initial_value): |
| 77 | self.value = initial_value() |
| 78 | else: |
| 79 | self.value = initial_value |
| 80 | |
| 81 | hook = current_hook() |
| 82 | |
| 83 | def dispatch(new: _Type | Callable[[_Type], _Type]) -> None: |
| 84 | if callable(new): |
| 85 | next_value = new(self.value) |
| 86 | else: |
| 87 | next_value = new |
| 88 | if not strictly_equal(next_value, self.value): |
| 89 | self.value = next_value |
| 90 | hook.schedule_render() |
| 91 | |
| 92 | self.dispatch = dispatch |
| 93 | |
| 94 | |
| 95 | _EffectCleanFunc: TypeAlias = "Callable[[], None]" |