from typing import Any, Generic, MutableMapping, Sequence, Set, TypeVar, Union
from ..typehints import DT, KT, RT, VT
from ..utils.to_key import to_key
from .base import Instance
IT = TypeVar("IT", bound="Instance[Any, Any, Any, Any]")
[docs]class MemoryChildrenMixin(MutableMapping[KT, IT], Generic[IT, KT, DT,VT, RT]):
parents: MutableMapping[KT, KT]
children: MutableMapping[KT, Set[KT]]
[docs] def add_child(self,
parent: Union[KT, Instance[KT, DT, VT, RT]],
child: Union[KT, Instance[KT, DT, VT, RT]]) -> None:
parent_key: KT = to_key(parent)
child_key: KT = to_key(child)
assert parent_key != child_key
if parent_key in self and child_key in self:
self.children.setdefault(parent_key, set()).add(child_key)
self.parents[child_key] = parent_key
else:
raise KeyError("Either the parent or child does not exist in this Provider")
[docs] def get_children(self,
parent: Union[KT, Instance[KT, DT, VT, RT]]) -> Sequence[IT]:
parent_key: KT = to_key(parent)
if parent_key in self.children:
children = [self[child_key] for child_key in self.children[parent_key]]
return children # type: ignore
return []
[docs] def get_children_keys(self, parent: Union[KT, Instance[KT, DT, VT, RT]]) -> Sequence[KT]:
parent_key: KT = to_key(parent)
if parent_key in self.children:
return list(self.children[parent_key])
return []
[docs] def get_parent(self, child: Union[KT, Instance[KT, DT, VT, RT]]) -> IT:
child_key: KT = to_key(child)
if child_key in self.parents:
parent_key = self.parents[child_key]
parent = self[parent_key]
return parent # type: ignore
raise KeyError(f"The instance with key {child_key} has no parent")
[docs] def discard_children(self, parent: Union[KT, Instance[KT, DT, VT, RT]]) -> None:
parent_key: KT = to_key(parent)
if parent_key in self.children:
children = self.children[parent_key]
self.children[parent_key] = set()
for child in children:
del self[child]