This commit is contained in:
John Lancaster
2026-02-21 00:01:00 -06:00
parent 4ba1833811
commit a502381c1a

View File

@@ -6,6 +6,8 @@ from typing import Generic, TypeVar
from .set import DAGSet from .set import DAGSet
type dictset = defaultdict[T, set[T]]
T = TypeVar("T") T = TypeVar("T")
@@ -19,12 +21,15 @@ class DAG(Generic[T], MutableMapping[T, MutableSet[T]]):
a guarded view that keeps reverse in sync. a guarded view that keeps reverse in sync.
""" """
_succ: dictset[T]
_pred: dictset[T]
def __init__(self) -> None: def __init__(self) -> None:
self._succ: defaultdict[T, set[T]] = defaultdict(set) self._succ: dictset[T] = defaultdict(set)
self._pred: defaultdict[T, set[T]] = defaultdict(set) self._pred: dictset[T] = defaultdict(set)
@property @property
def reverse(self) -> defaultdict[T, set[T]]: def reverse(self) -> dictset[T]:
return self._pred return self._pred
# --- MutableMapping interface --- # --- MutableMapping interface ---
@@ -78,10 +83,6 @@ class DAG(Generic[T], MutableMapping[T, MutableSet[T]]):
self._succ[u].add(v) self._succ[u].add(v)
self._pred[v].add(u) self._pred[v].add(u)
# Touch keys so nodes appear if accessed later (optional but nice)
_ = self._succ[v]
_ = self._pred[u]
def remove_edge(self, u: T, v: T, *, missing_ok: bool = True) -> None: def remove_edge(self, u: T, v: T, *, missing_ok: bool = True) -> None:
if v in self._succ.get(u, ()): if v in self._succ.get(u, ()):
self._succ[u].remove(v) self._succ[u].remove(v)