Generic, converting, set-to-set proxy.
| 1849 | |
| 1850 | |
| 1851 | class _AssociationSet(_AssociationSingleItem[_T], MutableSet[_T]): |
| 1852 | class="st">""class="st">"Generic, converting, set-to-set proxy."class="st">"" |
| 1853 | |
| 1854 | col: MutableSet[_T] |
| 1855 | |
| 1856 | def __len__(self) -> int: |
| 1857 | return len(self.col) |
| 1858 | |
| 1859 | def __bool__(self) -> bool: |
| 1860 | if self.col: |
| 1861 | return True |
| 1862 | else: |
| 1863 | return False |
| 1864 | |
| 1865 | def __contains__(self, __o: object) -> bool: |
| 1866 | for member in self.col: |
| 1867 | if self._get(member) == __o: |
| 1868 | return True |
| 1869 | return False |
| 1870 | |
| 1871 | def __iter__(self) -> Iterator[_T]: |
| 1872 | class="st">"""Iterate over proxied values. |
| 1873 | |
| 1874 | For the actual domain objects, iterate over .col instead or just use |
| 1875 | the underlying collection directly from its property on the parent. |
| 1876 | |
| 1877 | class="st">""" |
| 1878 | for member in self.col: |
| 1879 | yield self._get(member) |
| 1880 | return |
| 1881 | |
| 1882 | def add(self, __element: _T, /) -> None: |
| 1883 | if __element not in self: |
| 1884 | self.col.add(self._create(__element)) |
| 1885 | |
| 1886 | class="cm"># for discard and remove, choosing a more expensive check strategy rather |
| 1887 | class="cm"># than call self.creator() |
| 1888 | def discard(self, __element: _T, /) -> None: |
| 1889 | for member in self.col: |
| 1890 | if self._get(member) == __element: |
| 1891 | self.col.discard(member) |
| 1892 | break |
| 1893 | |
| 1894 | def remove(self, __element: _T, /) -> None: |
| 1895 | for member in self.col: |
| 1896 | if self._get(member) == __element: |
| 1897 | self.col.discard(member) |
| 1898 | return |
| 1899 | raise KeyError(__element) |
| 1900 | |
| 1901 | def pop(self) -> _T: |
| 1902 | if not self.col: |
| 1903 | raise KeyError(class="st">"pop from an empty set") |
| 1904 | member = self.col.pop() |
| 1905 | return self._get(member) |
| 1906 | |
| 1907 | def update(self, *s: Iterable[_T]) -> None: |
| 1908 | for iterable in s: |