from typing import Never, TypeIs, overload, override from .messages import Message from .midifiles import MetaMessage, UnknownMetaMessage from .midifiles.meta import _MetaMessage # pyright: ignore[reportPrivateUsage] class Frozen: @override def __setattr__(self, *_) -> Never: ... @override def __hash__(self) -> int: ... class FrozenMessage(Frozen, Message): ... class FrozenMetaMessage(Frozen, _MetaMessage): ... class FrozenUnknownMetaMessage(Frozen, UnknownMetaMessage): ... @overload def is_frozen(msg: UnknownMetaMessage) -> TypeIs[FrozenUnknownMetaMessage]: ... # pyright: ignore[reportOverlappingOverload] @overload def is_frozen(msg: _MetaMessage) -> TypeIs[FrozenMetaMessage]: ... @overload def is_frozen(msg: Message) -> TypeIs[FrozenMessage]: ... @overload def is_frozen(msg: object) -> TypeIs[Frozen]: """Return True if message is frozen, otherwise False.""" @overload def freeze_message[T: Frozen](msg: T) -> T: ... @overload def freeze_message(msg: Message) -> FrozenMessage: ... @overload def freeze_message(msg: UnknownMetaMessage) -> FrozenUnknownMetaMessage: ... @overload def freeze_message(msg: MetaMessage) -> FrozenMetaMessage: ... @overload def freeze_message(msg: None) -> None: ... @overload def freeze_message[T: Frozen]( msg: T | Message | UnknownMetaMessage | MetaMessage | None, ) -> T | FrozenMessage | FrozenUnknownMetaMessage | FrozenMetaMessage | None: """Freeze message. Returns a frozen version of the message. Frozen messages are immutable, hashable and can be used as dictionary keys. Will return None if called with None. This allows you to do things like:: msg = freeze_message(port.poll()) """ @overload def thaw_message(msg: FrozenUnknownMetaMessage) -> UnknownMetaMessage: ... @overload def thaw_message(msg: FrozenMetaMessage) -> MetaMessage: ... @overload def thaw_message(msg: FrozenMessage) -> Message: ... @overload def thaw_message( msg: FrozenMessage | FrozenUnknownMetaMessage | FrozenMetaMessage, ) -> Message | UnknownMetaMessage | MetaMessage: """Thaw message. Returns a mutable version of a frozen message. Will return None if called with None. """