@@ -62,6 +62,8 @@ class AbstractLinkSet( # noqa: PLW1641 (__hash__ is implemented)
6262 "_tracking_set" ,
6363 )
6464
65+ _allowed_write_only_ops : ClassVar [list [str ]] = []
66+
6567 # Set of (hashable) items to maintain distinctness.
6668 _tracking_set : dict [_MT_co , _MT_co ] | None
6769 # Mapping of `self._pyid(item)` to `item`
@@ -616,6 +618,22 @@ def _ensure_snapshot(self) -> None:
616618 assert self ._tracking_index is not None
617619 self ._index_snapshot = dict (self ._tracking_index )
618620
621+ def _ensure_snapshot_then_track (self , value : _MT_co ) -> None : # type: ignore [misc]
622+ self ._ensure_snapshot ()
623+ if self ._is_tracked (value ):
624+ return
625+ self ._track_item (value )
626+ self ._items .append (value )
627+
628+ def _ensure_snapshot_then_untrack (self , value : _MT_co ) -> _MT_co | None : # type: ignore [misc]
629+ self ._ensure_snapshot ()
630+ if not self ._is_tracked (value ):
631+ return None
632+
633+ self ._untrack_item (value )
634+ self ._items .remove (value )
635+ return value
636+
619637 def __gel_get_added__ (self ) -> list [_MT_co ]:
620638 match bool (self ._index_snapshot ), bool (self ._tracking_index ):
621639 case True , False :
@@ -752,7 +770,7 @@ def add(self, value: _MT_co) -> None: # type: ignore [misc]
752770 self .__gel_add__ (value )
753771
754772 def discard (self , value : _MT_co ) -> None : # type: ignore [misc]
755- """Remove item; raise ValueError if missing."""
773+ """Remove item; do nothing if missing."""
756774 self .__gel_remove__ (value )
757775
758776 def remove (self , value : _MT_co ) -> None : # type: ignore [misc]
@@ -854,22 +872,12 @@ class LinkSet(
854872
855873 def __gel_add__ (self , value : _MT_co ) -> None : # type: ignore [misc]
856874 value = self ._check_value (value )
857- self ._ensure_snapshot ()
858- if self ._is_tracked (value ):
859- return
860- self ._track_item (value )
861- self ._items .append (value )
875+ self ._ensure_snapshot_then_track (value )
862876
863877 def __gel_remove__ (self , value : _MT_co ) -> _MT_co | None : # type: ignore [misc]
864- """Remove item; raise ValueError if missing."""
878+ """Remove item; return None if missing."""
865879 value = self ._check_value (value )
866- self ._ensure_snapshot ()
867- if not self ._is_tracked (value ):
868- return None
869-
870- self ._untrack_item (value )
871- self ._items .remove (value )
872- return value
880+ return self ._ensure_snapshot_then_untrack (value )
873881
874882 def _check_value (self , value : Any ) -> _MT_co :
875883 cls = type (self )
@@ -997,7 +1005,7 @@ def __gel_add__(self, value: _PT_co | _BMT_co) -> None:
9971005 self ._items .append (proxy )
9981006
9991007 def __gel_remove__ (self , value : _PT_co | _BMT_co ) -> _PT_co | None :
1000- """Remove item; raise ValueError if missing."""
1008+ """Remove item; return None if missing."""
10011009
10021010 self ._ensure_snapshot ()
10031011
0 commit comments