40 lines
972 B
Python
40 lines
972 B
Python
import dataclasses
|
|
from typing import TypeVar
|
|
|
|
from typing_extensions import override
|
|
|
|
|
|
@dataclasses.dataclass
|
|
class WithId:
|
|
id: int | None
|
|
|
|
|
|
T = TypeVar("T", bound=WithId)
|
|
|
|
|
|
class IndexedList(list[T]):
|
|
@override
|
|
def append(self, _item: T) -> None:
|
|
if _item.id is None:
|
|
_item.id = max((i.id or 0 for i in self), default=0) + 1
|
|
return super().append(_item)
|
|
|
|
def find_idx(self, _id: int) -> int:
|
|
try:
|
|
i, _ = next(filter(lambda it: it[1].id == _id, enumerate(self)))
|
|
except StopIteration:
|
|
raise ValueError(f"Could not find item with id {_id}")
|
|
return i
|
|
|
|
def get(self, _id: int) -> T:
|
|
i = self.find_idx(_id)
|
|
return self.__getitem__(i)
|
|
|
|
def delete(self, _id: int) -> None:
|
|
i = self.find_idx(_id)
|
|
return super().__delitem__(i)
|
|
|
|
def replace(self, _id: int, _obj: T) -> None:
|
|
i = self.find_idx(_id)
|
|
super().__setitem__(i, _obj)
|