"""Map from Type1[T] to Type2[T], where T is specific to the key.""" from __future__ import annotations import typing import pyrsistent _T = typing.TypeVar("_T") _K = typing.TypeVar("_K") _V = typing.TypeVar("_V") _TCallable = typing.TypeVar("_TCallable", bound=typing.Callable[..., object]) _TCallable_co = typing.TypeVar( "_TCallable_co", bound=typing.Callable[..., object], covariant=True ) class Magma(typing.Protocol[_TCallable_co]): """Helper protocol for combining two values in a DependentMapping.""" def __call__( self: Magma[typing.Callable[..., _V]], __lhs: _V, __rhs: _V ) -> _V: """Combine stored values.""" class DependentMapping(typing.Protocol[_TCallable]): """Perform type manipulations so advanced, Mypy doesn't allow them.""" # Various other methods redacted for space def __iter__( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.Iterator[_K]: """Iterate over the keys in the mapping.""" def items( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.ItemsView[_K, _V]: """Return an iterable of the key-value pairs stored in the mapping.""" def iteritems( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.Iterable[tuple[_K, _V]]: """Return an iterable of the key-value pairs stored in the mapping.""" def iterkeys( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.Iterable[_K]: """Return an iterable of the keys stored in the mapping.""" def itervalues( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.Iterable[_V]: """Return an iterable of the values stored in the mapping.""" def keys( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.KeysView[_K]: """Return an iterable of the keys stored in the mapping.""" # Methods redacted for space def values( self: DependentMapping[typing.Callable[[_K], _V]] ) -> typing.ValuesView[_V]: """Return an iterable of the values stored in the mapping.""" _AnyMap = DependentMapping[typing.Any] MAPPING: _AnyMap = typing.cast("_AnyMap", pyrsistent.pmap())