Source code for app.portfolio.collections.ordered_view.mutable_set

# SPDX-License-Identifier: GPLv3-or-later
# Copyright © 2025 pygaindalf Rui Pinheiro

from collections.abc import Hashable, Iterable, MutableSet
from collections.abc import Set as AbstractSet
from typing import Self, override
from typing import get_origin as typing_get_origin

from pydantic_core import CoreSchema, core_schema

from .frozen_set import OrderedViewSet


[docs] class OrderedViewMutableSet[T: Hashable](OrderedViewSet[T], MutableSet[T]):
[docs] @classmethod def get_immutable_type(cls, source: type[Self] | None = None) -> type[AbstractSet[T]]: from .frozen_set import OrderedViewSet klass = source or cls return OrderedViewSet[klass.get_content_type()]
@override def _initialize_container(self, data: Iterable[T] | None = None) -> None: if getattr(self, "_set", None) is not None: msg = "Container is already initialized." raise ValueError(msg) self._set = set() if data is None else set(data)
[docs] @override def add(self, value: T) -> None: if isinstance(self._set, frozenset): msg = f"Cannot modify frozen {type(self).__name__}." raise TypeError(msg) self._set.add(value) self.clear_sort_cache()
[docs] @override def discard(self, value: T) -> None: if isinstance(self._set, frozenset): msg = f"Cannot modify frozen {type(self).__name__}." raise TypeError(msg) self._set.discard(value) self.clear_sort_cache()
[docs] @override def clear(self) -> None: if isinstance(self._set, frozenset): msg = f"Cannot modify frozen {type(self).__name__}." raise TypeError(msg) self._set.clear() self.clear_sort_cache()
# MARK: Pydantic
[docs] @classmethod @override def get_core_schema(cls, source, handler) -> CoreSchema: # noqa: ANN001 return core_schema.set_schema(core_schema.is_instance_schema(cls.get_content_type(source)))
[docs] @classmethod @override def serialize(cls, value: Self) -> tuple[T, ...]: # pyright: ignore[reportIncompatibleMethodOverride] return tuple(value.sorted)
# MARK: JournalledOrderedViewSet @classmethod @override def __subclasshook__(cls, subclass: type) -> bool: spr = super().__subclasshook__(subclass) if spr is not NotImplemented and spr: return True mro = subclass.__mro__ for klass in mro: origin = typing_get_origin(klass) or klass if origin is cls: return True from ..journalled.set.ordered_view_set import JournalledOrderedViewSet return bool(issubclass(subclass, JournalledOrderedViewSet))