| 87 | |
| 88 | |
| 89 | class StableSet(MutableSet[T]): |
| 90 | _inner: dict[T, None] |
| 91 | |
| 92 | def __init__(self, /, iterable: Iterable[T] = ()): |
| 93 | self._inner = dict.fromkeys(iterable) |
| 94 | |
| 95 | def __contains__(self, element: object) -> bool: |
| 96 | return element in self._inner |
| 97 | |
| 98 | def __iter__(self) -> Iterator[T]: |
| 99 | return iter(self._inner.keys()) |
| 100 | |
| 101 | def __len__(self) -> int: |
| 102 | return len(self._inner) |
| 103 | |
| 104 | def __repr__(self) -> str: |
| 105 | type_name = type(self).__name__ |
| 106 | if self._inner: |
| 107 | values = repr(list(self._inner.keys())) |
| 108 | else: |
| 109 | values = "" |
| 110 | return f"{type_name}({values})" |
| 111 | |
| 112 | def add(self, element: T) -> None: |
| 113 | self._inner[element] = None |
| 114 | |
| 115 | def discard(self, element: T) -> None: |
| 116 | self._inner.pop(element, None) |
| 117 | |
| 118 | def copy(self) -> StableSet[T]: |
| 119 | return StableSet(self) |
| 120 | |
| 121 | def __or__(self, other: Iterable[T2]) -> StableSet[T | T2]: |
| 122 | return super().__or__(other) # type: ignore |
| 123 | |
| 124 | def __ior__(self, other: Iterable[T2]) -> StableSet[T | T2]: |
| 125 | return super().__ior__(other) # type: ignore |
| 126 | |
| 127 | def update(self, *sets: Iterable[T]) -> None: |
| 128 | for s in sets: |
| 129 | self |= s |
| 130 | |
| 131 | def union(*sets: Iterable[T]) -> StableSet[T]: |
| 132 | res: StableSet[T] = StableSet() |
| 133 | res.update(*sets) |
| 134 | return res |
no outgoing calls
no test coverage detected