broke apart

This commit is contained in:
John Lancaster
2026-02-21 19:00:10 -06:00
parent 5985708233
commit 2405d670fb
3 changed files with 73 additions and 55 deletions

View File

@@ -0,0 +1,33 @@
from collections.abc import Callable, MutableSequence
from typing import Generic, TypeVar
from . import events as e
T = TypeVar("T")
class HookedContainer(Generic[T]):
_path: MutableSequence[int]
hook: Callable[[e.ChangeEvent[T]], None] | None
def __repr__(self):
return f"{self.__class__.__name__}({self._data!r})"
def __len__(self):
return len(self._data)
def __iter__(self):
return iter(self._data)
def __contains__(self, value):
return value in self._data
def __setitem__(self, s, value):
self._data[s] = value
if self.hook:
self.hook(e.SetItemEvent(index=s, item=value))
def __delitem__(self, s):
del self._data[s]
if self.hook:
self.hook(e.RemoveItemEvent(index=s, item=self._data[s]))

View File

@@ -0,0 +1,24 @@
from dataclasses import dataclass
from typing import Generic, TypeVar
T = TypeVar("T")
@dataclass(frozen=True)
class ChangeEvent(Generic[T]):
index: int
@dataclass(frozen=True)
class AddItemEvent(ChangeEvent[T]):
item: T
@dataclass(frozen=True)
class SetItemEvent(ChangeEvent[T]):
item: T
@dataclass(frozen=True)
class RemoveItemEvent(ChangeEvent[T]):
item: T

View File

@@ -1,7 +1,10 @@
from collections.abc import Callable, Iterable, MutableSequence, Sequence from collections.abc import Callable, Iterable, MutableSequence, Sequence
from dataclasses import dataclass from copy import copy
from enum import Enum, auto from enum import Enum, auto
from typing import Generic, TypeVar from typing import TypeVar
from . import events as e
from .common import HookedContainer
T = TypeVar("T") T = TypeVar("T")
@@ -12,74 +15,32 @@ class ListChange(Enum):
SET_ITEM = auto() SET_ITEM = auto()
@dataclass(frozen=True) class HookedList(HookedContainer[T], MutableSequence[T]):
class ChangeEvent(Generic[T]):
index: int
@dataclass(frozen=True)
class AddItemEvent(ChangeEvent[T]):
item: T
@dataclass(frozen=True)
class SetItemEvent(ChangeEvent[T]):
item: T
@dataclass(frozen=True)
class RemoveItemEvent(ChangeEvent[T]):
item: T
class HookedList(Generic[T], MutableSequence[T]):
_data: MutableSequence[T] _data: MutableSequence[T]
_path: MutableSequence[int] _path: MutableSequence[int]
hook: Callable[[ChangeEvent[T]], None] | None hook: Callable[[e.ChangeEvent[T]], None] | None
def __init__(self, iterable: Iterable[T], path: Sequence[int] | None = None, *, hook=None): def __init__(self, hook, existing: Iterable[T], path: Sequence[int] | None = None):
match iterable: self.hook = hook
match existing:
case MutableSequence() as seq: case MutableSequence() as seq:
self._data = seq self._data = seq
case Iterable() as it: case _ as it:
self._data = list(it) self._data = list(it)
self._path = list(path) if path is not None else [] self._path = list(path) if path is not None else []
self.hook = hook
def __repr__(self):
return f"{self.__class__.__name__}({self._data!r})"
def __iter__(self):
return iter(self._data)
def __contains__(self, value):
return value in self._data
def __len__(self):
return len(self._data)
def __getitem__(self, s): def __getitem__(self, s):
# print("Getting item:", s) # print("Getting item:", s)
match self._data[s]: match self._data[s]:
case HookedList() as hs:
hs.hook = self.hook
return hs
case MutableSequence() as seq: case MutableSequence() as seq:
return HookedList(seq, hook=self.hook) new_path = copy(self._path)
new_path.append(s)
# print(new_path)
return HookedList(self.hook, existing=seq, path=new_path)
case _ as item: case _ as item:
return item return item
def __setitem__(self, s, value):
self._data[s] = value
if self.hook:
self.hook(SetItemEvent(index=s, item=value))
def __delitem__(self, s):
del self._data[s]
if self.hook:
self.hook(RemoveItemEvent(index=s, item=self._data[s]))
def insert(self, index, value): def insert(self, index, value):
self._data.insert(index, value) self._data.insert(index, value)
if self.hook: if self.hook:
self.hook(AddItemEvent(index=index, item=value)) self.hook(e.AddItemEvent(index=index, item=value))