Source code for mode.types.signals

"""Type classes for :mod:`mode.signals`."""
import abc
import asyncio
import typing
from weakref import ReferenceType
from typing import (
    Any,
    Awaitable,
    Callable,
    Generic,
    MutableMapping,
    MutableSet,
    Optional,
    Type,
    TypeVar,
    Union,
)
from mypy_extensions import KwArg, NamedArg, VarArg

__all__ = [
    'BaseSignalT',
    'FilterReceiverMapping',
    'SignalHandlerT',
    'SignalHandlerRefT',
    'SignalT',
    'SyncSignalT',
    'T',
    'T_contra',
]

T = TypeVar('T')
T_contra = TypeVar('T_contra', contravariant=True)

SignalHandlerT = Union[
    Callable[
        [T, VarArg(), NamedArg('BaseSignalT', name='signal'), KwArg()],
        None,
    ],
    Callable[
        [T, VarArg(), NamedArg('BaseSignalT', name='signal'), KwArg()],
        Awaitable[None],
    ],
]

if typing.TYPE_CHECKING:
    SignalHandlerRefT = Union[
        Callable[[], SignalHandlerT],
        ReferenceType[SignalHandlerT]]
else:
    SignalHandlerRefT = Any

FilterReceiverMapping = MutableMapping[Any, MutableSet[SignalHandlerRefT]]


[docs]class BaseSignalT(Generic[T]): """Base type for all signals.""" name: str owner: Optional[Type] @abc.abstractmethod def __init__(self, *, name: str = None, owner: Type = None, loop: asyncio.AbstractEventLoop = None, default_sender: Any = None, receivers: MutableSet[SignalHandlerRefT] = None, filter_receivers: FilterReceiverMapping = None) -> None: ...
[docs] @abc.abstractmethod def clone(self, **kwargs: Any) -> 'BaseSignalT': ...
[docs] @abc.abstractmethod def with_default_sender(self, sender: Any = None) -> 'BaseSignalT': ...
[docs] @abc.abstractmethod def connect(self, fun: SignalHandlerT, **kwargs: Any) -> Callable: ...
[docs] @abc.abstractmethod def disconnect(self, fun: SignalHandlerT, *, sender: Any = None, weak: bool = True) -> None: ...
[docs]class SignalT(BaseSignalT[T]): """Base class for all async signals (using ``async def``).""" @abc.abstractmethod async def __call__(self, sender: T_contra, *args: Any, **kwargs: Any) -> None: ... @abc.abstractmethod async def send(self, sender: T_contra, *args: Any, **kwargs: Any) -> None: ...
[docs] @typing.no_type_check @abc.abstractmethod def clone(self, **kwargs: Any) -> 'SignalT': ...
[docs] @typing.no_type_check @abc.abstractmethod def with_default_sender(self, sender: Any = None) -> 'SignalT': ...
[docs]class SyncSignalT(BaseSignalT[T]): """Base class for all synchronous signals (using regular ``def``).""" @abc.abstractmethod def __call__(self, sender: T_contra, *args: Any, **kwargs: Any) -> None: ...
[docs] @abc.abstractmethod def send(self, sender: T_contra, *args: Any, **kwargs: Any) -> None: ...
[docs] @typing.no_type_check @abc.abstractmethod def clone(self, **kwargs: Any) -> 'SyncSignalT': ...
[docs] @typing.no_type_check @abc.abstractmethod def with_default_sender(self, sender: Any = None) -> 'SyncSignalT': ...