11from asyncio import Event
22from collections import deque
3- from collections .abc import AsyncIterator
3+ from collections .abc import AsyncIterator , Iterator , Sequence
44from dataclasses import dataclass , field
5+ from typing import Any , overload
6+
7+
8+ # |
9+ # a
10+ # |
11+ # |
512
613
714@dataclass (frozen = True , unsafe_hash = False )
8- class AsyncQueque [ValueT ]:
15+ class AsyncQueque [ValueT ]( Sequence [ ValueT ]) :
916 _values : deque [ValueT ] = field (default_factory = deque )
1017 _offset_by_event : dict [Event , int ] = field (
1118 default_factory = dict , init = False
@@ -14,6 +21,25 @@ class AsyncQueque[ValueT]:
1421 def __len__ (self ) -> int :
1522 return len (self ._values )
1623
24+ def __bool__ (self ) -> bool :
25+ return bool (self ._values )
26+
27+ def __iter__ (self ) -> Iterator [ValueT ]:
28+ return iter (self ._values )
29+
30+ @overload
31+ def __getitem__ (self , index : int , / ) -> ValueT : ...
32+
33+ @overload
34+ def __getitem__ (
35+ self , slice_ : "slice[Any, Any, Any]" , /
36+ ) -> Sequence [ValueT ]: ...
37+
38+ def __getitem__ (
39+ self , value : "int | slice[Any, Any, Any]" , /
40+ ) -> Sequence [ValueT ] | ValueT :
41+ return self ._values [value ]
42+
1743 def push (self , value : ValueT ) -> None :
1844 self ._values .append (value )
1945
@@ -22,6 +48,10 @@ def push(self, value: ValueT) -> None:
2248
2349 async def __aiter__ (self ) -> AsyncIterator [ValueT ]:
2450 event = Event ()
51+
52+ if self ._values :
53+ event .set ()
54+
2555 self ._offset_by_event [event ] = - 1
2656
2757 while True :
@@ -34,7 +64,10 @@ async def __aiter__(self) -> AsyncIterator[ValueT]:
3464
3565 yield new_value
3666
37- def _refresh (self ) -> None :
67+ if self ._offset_by_event [event ] == len (self ._values ) - 1 :
68+ event .clear ()
69+
70+ def refresh (self ) -> None :
3871 min_offset = min (self ._offset_by_event .values ())
3972
4073 if min_offset >= 0 :
0 commit comments