136136
137137from abc import ABC , abstractmethod
138138from collections .abc import Callable
139- from typing import Generic , Self , TypeVar
139+ from typing import Generic , Self
140140
141141from ._exceptions import Error
142+ from ._generic import MappedMessageT_co , ReceiverMessageT_co
142143
143- _T_co = TypeVar ("_T_co" , covariant = True )
144- _U_co = TypeVar ("_U_co" , covariant = True )
145144
146-
147- class Receiver (ABC , Generic [_T_co ]):
145+ class Receiver (ABC , Generic [ReceiverMessageT_co ]):
148146 """An endpoint to receive messages."""
149147
150- async def __anext__ (self ) -> _T_co :
148+ async def __anext__ (self ) -> ReceiverMessageT_co :
151149 """Await the next message in the async iteration over received messages.
152150
153151 Returns:
@@ -177,7 +175,7 @@ async def ready(self) -> bool:
177175 """
178176
179177 @abstractmethod
180- def consume (self ) -> _T_co :
178+ def consume (self ) -> ReceiverMessageT_co :
181179 """Return the latest message once `ready()` is complete.
182180
183181 `ready()` must be called before each call to `consume()`.
@@ -198,7 +196,7 @@ def __aiter__(self) -> Self:
198196 """
199197 return self
200198
201- async def receive (self ) -> _T_co :
199+ async def receive (self ) -> ReceiverMessageT_co :
202200 """Receive a message.
203201
204202 Returns:
@@ -225,7 +223,9 @@ async def receive(self) -> _T_co:
225223 raise ReceiverStoppedError (self ) from exc
226224 return received
227225
228- def map (self , mapping_function : Callable [[_T_co ], _U_co ], / ) -> Receiver [_U_co ]:
226+ def map (
227+ self , mapping_function : Callable [[ReceiverMessageT_co ], MappedMessageT_co ], /
228+ ) -> Receiver [MappedMessageT_co ]:
229229 """Apply a mapping function on the received message.
230230
231231 Tip:
@@ -243,13 +243,13 @@ def map(self, mapping_function: Callable[[_T_co], _U_co], /) -> Receiver[_U_co]:
243243 return _Mapper (receiver = self , mapping_function = mapping_function )
244244
245245
246- class ReceiverError (Error , Generic [_T_co ]):
246+ class ReceiverError (Error , Generic [ReceiverMessageT_co ]):
247247 """An error that originated in a [Receiver][frequenz.channels.Receiver].
248248
249249 All exceptions generated by receivers inherit from this exception.
250250 """
251251
252- def __init__ (self , message : str , receiver : Receiver [_T_co ]):
252+ def __init__ (self , message : str , receiver : Receiver [ReceiverMessageT_co ]):
253253 """Initialize this error.
254254
255255 Args:
@@ -258,14 +258,14 @@ def __init__(self, message: str, receiver: Receiver[_T_co]):
258258 error happened.
259259 """
260260 super ().__init__ (message )
261- self .receiver : Receiver [_T_co ] = receiver
261+ self .receiver : Receiver [ReceiverMessageT_co ] = receiver
262262 """The receiver where the error happened."""
263263
264264
265- class ReceiverStoppedError (ReceiverError [_T_co ]):
265+ class ReceiverStoppedError (ReceiverError [ReceiverMessageT_co ]):
266266 """A stopped [`Receiver`][frequenz.channels.Receiver] was used."""
267267
268- def __init__ (self , receiver : Receiver [_T_co ]):
268+ def __init__ (self , receiver : Receiver [ReceiverMessageT_co ]):
269269 """Initialize this error.
270270
271271 Args:
@@ -275,7 +275,9 @@ def __init__(self, receiver: Receiver[_T_co]):
275275 super ().__init__ (f"Receiver { receiver } was stopped" , receiver )
276276
277277
278- class _Mapper (Receiver [_U_co ], Generic [_T_co , _U_co ]):
278+ class _Mapper (
279+ Receiver [MappedMessageT_co ], Generic [ReceiverMessageT_co , MappedMessageT_co ]
280+ ):
279281 """Apply a transform function on a channel receiver.
280282
281283 Has two generic types:
@@ -285,18 +287,23 @@ class _Mapper(Receiver[_U_co], Generic[_T_co, _U_co]):
285287 """
286288
287289 def __init__ (
288- self , * , receiver : Receiver [_T_co ], mapping_function : Callable [[_T_co ], _U_co ]
290+ self ,
291+ * ,
292+ receiver : Receiver [ReceiverMessageT_co ],
293+ mapping_function : Callable [[ReceiverMessageT_co ], MappedMessageT_co ],
289294 ) -> None :
290295 """Initialize this receiver mapper.
291296
292297 Args:
293298 receiver: The input receiver.
294299 mapping_function: The function to apply on the input data.
295300 """
296- self ._receiver : Receiver [_T_co ] = receiver
301+ self ._receiver : Receiver [ReceiverMessageT_co ] = receiver
297302 """The input receiver."""
298303
299- self ._mapping_function : Callable [[_T_co ], _U_co ] = mapping_function
304+ self ._mapping_function : Callable [[ReceiverMessageT_co ], MappedMessageT_co ] = (
305+ mapping_function
306+ )
300307 """The function to apply on the input data."""
301308
302309 async def ready (self ) -> bool :
@@ -314,7 +321,7 @@ async def ready(self) -> bool:
314321
315322 # We need a noqa here because the docs have a Raises section but the code doesn't
316323 # explicitly raise anything.
317- def consume (self ) -> _U_co : # noqa: DOC502
324+ def consume (self ) -> MappedMessageT_co : # noqa: DOC502
318325 """Return a transformed message once `ready()` is complete.
319326
320327 Returns:
0 commit comments