import collections
from _typeshed import Self
from typing import Any, Generic, Iterable, Iterator, Mapping, TypeVar, overload

_KT = TypeVar("_KT")
_VT = TypeVar("_VT")

class frozendict(Mapping[_KT, _VT], Generic[_KT, _VT]):

    dict_cls: type[dict[Any, Any]] = ...
    @overload
    def __init__(self, **kwargs: _VT) -> None: ...
    @overload
    def __init__(self, mapping: Mapping[_KT, _VT]) -> None: ...
    @overload
    def __init__(self, iterable: Iterable[tuple[_KT, _VT]]) -> None: ...
    def __getitem__(self, key: _KT) -> _VT: ...
    def __contains__(self, key: object) -> bool: ...
    def copy(self: Self, **add_or_replace: _VT) -> Self: ...
    def __iter__(self) -> Iterator[_KT]: ...
    def __len__(self) -> int: ...
    def __hash__(self) -> int: ...

class FrozenOrderedDict(frozendict[_KT, _VT]):

    dict_cls: type[collections.OrderedDict[Any, Any]] = ...
