55 List ,
66 Dict ,
77 Tuple ,
8- Mapping ,
98 NamedTuple ,
109 Any ,
1110 Set ,
1918from jsonpatch import make_patch
2019
2120from .element import AbstractElement
22- from .events import EventHandler
21+ from .events import EventHandler , EventTarget
2322from .utils import HasAsyncResources , async_resource , CannotAccessResource
2423from .hooks import LifeCycleHook
2524
@@ -40,7 +39,7 @@ class LayoutEvent(NamedTuple):
4039
4140class ElementState (NamedTuple ):
4241 model : Dict [str , Any ]
43- path : List [ int ]
42+ path : str
4443 element_obj : AbstractElement
4544 event_handler_ids : Set [str ]
4645 child_elements_ids : List [str ]
@@ -78,7 +77,7 @@ async def dispatch(self, event: LayoutEvent) -> None:
7877 if handler is not None :
7978 await handler (event .data )
8079
81- async def render (self ) -> Dict [ str , Any ] :
80+ async def render (self ) -> LayoutUpdate :
8281 while True :
8382 element = await self ._rendering_queue .get ()
8483 if element .id in self ._element_states :
@@ -91,7 +90,7 @@ async def _rendering_queue(self) -> AsyncIterator["_ElementQueue"]:
9190 yield queue
9291
9392 @async_resource
94- async def _element_states (self ) -> AsyncIterator [ElementState ]:
93+ async def _element_states (self ) -> AsyncIterator [Dict [ str , ElementState ] ]:
9594 root_element_state = self ._create_element_state (self .root , "" )
9695 try :
9796 yield {self .root .id : root_element_state }
@@ -144,19 +143,15 @@ async def _render_element(self, element_state: ElementState) -> Dict[str, Any]:
144143 return element_state .model
145144
146145 async def _render_model (
147- self , element_state : ElementState , model : Mapping [str , Any ]
146+ self , element_state : ElementState , model : Dict [str , Any ]
148147 ) -> Dict [str , Any ]:
149- model : Dict [str , Any ] = dict (model )
150-
151- event_handlers = self ._render_model_event_handlers (element_state , model )
148+ event_handlers = self ._render_model_event_targets (element_state , model )
152149 if event_handlers :
153150 model ["eventHandlers" ] = event_handlers
154-
155151 if "children" in model :
156152 model ["children" ] = await self ._render_model_children (
157153 element_state , model ["children" ]
158154 )
159-
160155 return model
161156
162157 async def _render_model_children (
@@ -166,7 +161,7 @@ async def _render_model_children(
166161 for index , child in enumerate (
167162 children if isinstance (children , (list , tuple )) else [children ]
168163 ):
169- if isinstance (child , Mapping ):
164+ if isinstance (child , dict ):
170165 resolved_children .append (await self ._render_model (element_state , child ))
171166 elif isinstance (child , AbstractElement ):
172167 child_path = f"{ element_state .path } /children/{ index } "
@@ -178,9 +173,9 @@ async def _render_model_children(
178173 resolved_children .append (str (child ))
179174 return resolved_children
180175
181- def _render_model_event_handlers (
182- self , element_state : ElementState , model : Mapping [str , Any ]
183- ) -> Dict [str , str ]:
176+ def _render_model_event_targets (
177+ self , element_state : ElementState , model : Dict [str , Any ]
178+ ) -> Dict [str , EventTarget ]:
184179 handlers : Dict [str , EventHandler ] = {}
185180 if "eventHandlers" in model :
186181 handlers .update (model ["eventHandlers" ])
@@ -281,9 +276,9 @@ class _ElementQueue:
281276
282277 __slots__ = "_queue" , "_pending"
283278
284- def __init__ (self ):
285- self ._queue = asyncio .Queue ()
286- self ._pending = set ()
279+ def __init__ (self ) -> None :
280+ self ._queue : "asyncio.Queue[AbstractElement]" = asyncio .Queue ()
281+ self ._pending : Set [ str ] = set ()
287282
288283 def put (self , element : AbstractElement ) -> None :
289284 if element .id not in self ._pending :
0 commit comments