77import queue
88import weakref
99from collections import defaultdict
10+ from collections .abc import Awaitable , Iterable , Sequence
1011from functools import wraps
1112from threading import Lock , Thread
1213from typing import (
5657from redux .serialization_mixin import SerializationMixin
5758
5859if TYPE_CHECKING :
59- from collections .abc import Awaitable , Callable
60+ from collections .abc import Callable
6061
6162
6263class Store (Generic [State , Action , Event ], SerializationMixin ):
6364 """Redux store for managing state and side effects."""
6465
6566 def __init__ (
6667 self ,
67- reducer : ReducerType [State , Action , Event ],
68+ reducer : ReducerType [State , Action | InitAction , Event | None ],
6869 options : StoreOptions [Action , Event ] | None = None ,
6970 ) -> None :
7071 """Create a new store."""
@@ -77,18 +78,19 @@ def __init__(
7778
7879 self ._state : State | None = None
7980 self ._listeners : set [
80- Callable [[State ], Any ] | weakref .ref [Callable [[State ], Any ]]
81+ Callable [[State ], AwaitableOrNot [None ]]
82+ | weakref .ref [Callable [[State ], AwaitableOrNot [None ]]]
8183 ] = set ()
8284 self ._event_handlers : defaultdict [
83- type [Event ],
85+ type [Event | FinishEvent ],
8486 set [EventHandler | weakref .ref [EventHandler ]],
8587 ] = defaultdict (set )
8688
87- self ._actions : list [Action ] = []
88- self ._events : list [Event ] = []
89+ self ._actions : list [Action | InitAction ] = []
90+ self ._events : list [Event | FinishEvent ] = []
8991
9092 self ._event_handlers_queue = queue .Queue [
91- tuple [EventHandler [Event ], Event ] | None
93+ tuple [EventHandler [Event | FinishEvent ], Event | FinishEvent ] | None
9294 ]()
9395 self ._workers = [
9496 self .store_options .side_effect_runner_class (
@@ -105,11 +107,11 @@ def __init__(
105107 if self .store_options .auto_init :
106108 if self .store_options .scheduler :
107109 self .store_options .scheduler (
108- lambda : self .dispatch (cast ( 'Action' , InitAction () )),
110+ lambda : self .dispatch (InitAction ()),
109111 interval = False ,
110112 )
111113 else :
112- self .dispatch (cast ( 'Action' , InitAction () ))
114+ self .dispatch (InitAction ())
113115
114116 if self .store_options .scheduler :
115117 self .store_options .scheduler (self .run , interval = True )
@@ -139,7 +141,7 @@ def _run_actions(self: Store[State, Action, Event]) -> None:
139141 self ._call_listeners (self ._state )
140142
141143 if isinstance (action , FinishAction ):
142- self ._dispatch ([cast ( 'Event' , FinishEvent () )])
144+ self ._dispatch ([FinishEvent ()])
143145
144146 def _run_event_handlers (self : Store [State , Action , Event ]) -> None :
145147 while len (self ._events ) > 0 :
@@ -199,17 +201,17 @@ def dispatch(
199201 actions = [
200202 action
201203 for actions in parameters
202- for action in (actions if isinstance (actions , list ) else [actions ])
204+ for action in (actions if isinstance (actions , Iterable ) else [actions ])
203205 ]
204206 self ._dispatch (actions )
205207
206208 def _dispatch (
207209 self : Store [State , Action , Event ],
208- items : list [Action | Event ],
210+ items : Sequence [Action | Event | InitAction | FinishEvent | None ],
209211 ) -> None :
210212 for item in items :
211213 if isinstance (item , BaseAction ):
212- action = cast ( 'Action' , item )
214+ action = item
213215 for action_middleware in self ._action_middlewares :
214216 action_ = action_middleware (action )
215217 if action_ is None :
@@ -218,7 +220,7 @@ def _dispatch(
218220 else :
219221 self ._actions .append (action )
220222 if isinstance (item , BaseEvent ):
221- event = cast ( 'Event' , item )
223+ event = item
222224 for event_middleware in self ._event_middlewares :
223225 event_ = event_middleware (event )
224226 if event_ is None :
@@ -267,10 +269,10 @@ def subscribe_event(
267269 else :
268270 handler_ref = weakref .ref (handler )
269271
270- self ._event_handlers [cast ('Any ' , event_type )].add (handler_ref )
272+ self ._event_handlers [cast ('Event ' , event_type )].add (handler_ref )
271273
272274 def unsubscribe () -> None :
273- self ._event_handlers [cast ('Any ' , event_type )].discard (handler_ref )
275+ self ._event_handlers [cast ('Event ' , event_type )].discard (handler_ref )
274276
275277 return SubscribeEventCleanup (unsubscribe = unsubscribe , handler = handler )
276278
@@ -305,9 +307,9 @@ def autorun(
305307 def autorun_decorator (
306308 func : Callable [
307309 Concatenate [SelectorOutput , Args ],
308- ReturnType ,
310+ AwaitableOrNot [ ReturnType ] ,
309311 ],
310- ) -> AutorunReturnType [ReturnType | None , Args ]:
312+ ) -> AutorunReturnType [ReturnType , Args ]:
311313 return self .store_options .autorun_class (
312314 store = self ,
313315 selector = selector ,
0 commit comments