ó
    X=Œj  ã                   óp   • S SK JrJrJrJrJr  S SKJrJrJ	r	J
r
JrJrJr  S SKJr  \rS/r " S S\5      rg)é    )ÚAbstractEventLoopÚensure_futureÚFutureÚiscoroutineÚwait)ÚAnyÚCallableÚcastÚDictÚOptionalÚSetÚTuple)ÚEventEmitterÚAsyncIOEventEmitterc            
       óÜ   ^ • \ rS rSrSrSS\S\\   SS4U 4S jjjrS\S\	S	\
S
\
S\4
U 4S jjrS\S\S	\\
S4   S
\\	\
4   SS4
S jrS\SS4S jrS\SS4S jr\S\S\4S j5       rSrU =r$ )r   é   aØ  An event emitter class which can run asyncio coroutines in addition to
synchronous blocking functions. For example:

```py
@ee.on('event')
async def async_handler(*args, **kwargs):
    await returns_a_future()
```

On emit, the event emitter  will automatically schedule the coroutine using
`asyncio.ensure_future` and the configured event loop (defaults to
`asyncio.get_event_loop()`).

Unlike the case with the EventEmitter, all exceptions raised by
event handlers are automatically emitted on the `error` event. This is
important for asyncio coroutines specifically but is also handled for
synchronous functions for consistency.

When `loop` is specified, the supplied event loop will be used when
scheduling work with `ensure_future`. Otherwise, the default asyncio
event loop is used.

For asyncio coroutine event handlers, calling emit is non-blocking.
In other words, you do not have to await any results from emit, and the
coroutine is scheduled in a fire-and-forget fashion.
NÚselfÚloopÚreturnc                 óT   >• [         [        U ]  5         Xl        [	        5       U l        g ©N)Úsuperr   Ú__init__Ú_loopÚsetÚ_waiting)r   r   Ú	__class__s     €ÚP/Users/stevendouglas/BidBrain/.venv/lib/python3.13/site-packages/pyee/asyncio.pyr   ÚAsyncIOEventEmitter.__init__)   s   ø€ ÜÔ! 4Ñ1Ô3Ø26Œ
Ü%(£Uˆ�ó    ÚeventÚargsÚkwargsc                 ó,   >• [         TU ]  " U/UQ70 UD6$ )a'  Emit `event`, passing `*args` and `**kwargs` to each attached
function or coroutine. Returns `True` if any functions are attached to
`event`; otherwise returns `False`.

Example:

```py
ee.emit('data', '00101001')
```

Assuming `data` is an attached function, this will call
`data('00101001')'`.

When executing coroutine handlers, their respective futures will be
stored in a "waiting" state. These futures may be waited on or
canceled with `wait_for_complete` and `cancel`, respectively; and
their status may be checked via the `complete` property.
)r   Úemit)r   r!   r"   r#   r   s       €r   r%   ÚAsyncIOEventEmitter.emit.   s   ø€ ô0 ‰wŠ|˜EÐ3 DÒ3¨FÑ3Ð3r    Úf.c                 óì  ^ •  U" U0 UD6n[        U5      (       aN  T R                  (       a#  [        [        [        U5      T R                  S9nOA[        [        [        U5      5      nO'[        U[        5      (       a  [        [        U5      nOg S[        SS 4U 4S jjnUR                  U5        T R                  R                  U5        g ! [         a  nT R                  SU5         S nAg S nAff = f)N)r   r'   r   c                 ó¼   >• TR                   R                  U 5        U R                  5       (       a  g U R                  5       nU(       a  TR	                  SU5        g g )NÚerror)r   ÚdiscardÚ	cancelledÚ	exceptionr%   )r'   Úexcr   s     €r   ÚcallbackÚ/AsyncIOEventEmitter._emit_run.<locals>.callbacka   sD   ø€ Ø—‘×%Ñ% aÔ(à—;‘;—=‘=Øà/0¯{©{«}�ÞØ—I‘I˜g sÕ+ð r    r*   )r   r   r   r
   r   Ú
isinstancer   Úadd_done_callbackr   ÚaddÚ	Exceptionr%   )r   r'   r"   r#   ÚcoroÚfutr/   r.   s   `       r   Ú	_emit_runÚAsyncIOEventEmitter._emit_runH   sÆ   ø€ ð	#Ù˜4Ð* 6Ñ*ˆDô ˜4× Ñ Ø—:—:ô  -¬T´#°t«_À4Ç:Á:ÑN‘Cä'¬¬S°$«Ó8‘Cä˜D¤&×)Ñ)Üœ3 “o‘àð,œFð , t÷ ,ð ×!Ñ! (Ô+Ø�M‰M×Ñ˜cÕ"øô9 ó 	$Ø�I‰I�g˜s×#Ñ#ûð	$ús   ƒC Ã
C3ÃC.Ã.C3c              ƒ   ón   #   • U R                   (       a  [        U R                   5      I Sh  v•N   gg N7f)a¶  Waits for all pending tasks to complete. For example:

```py
@ee.on('event')
async def async_handler(*args, **kwargs):
    await returns_a_future()

# Triggers execution of async_handler
ee.emit('data', '00101001')

await ee.wait_for_complete()

# async_handler has completed execution
```

This is useful if you're attempting a graceful shutdown of your
application and want to ensure all coroutines have completed execution
beforehand.
N)r   r   ©r   s    r   Úwait_for_completeÚ%AsyncIOEventEmitter.wait_for_completen   s(   é € ð( �=�=Ü�t—}‘}Ó%×%Ñ%ð Ù%ùs   ‚*5¬3­5c                 óÚ   • U R                    HA  nUR                  5       (       a  M  UR                  5       (       a  M1  UR                  5         MC     U R                   R	                  5         g)a’  Cancel all pending tasks. For example:

```py
@ee.on('event')
async def async_handler(*args, **kwargs):
    await returns_a_future()

# Triggers execution of async_handler
ee.emit('data', '00101001')

ee.cancel()

# async_handler execution has been canceled
```

This is useful if you're attempting to shut down your application and
attempts at a graceful shutdown via `wait_for_complete` have failed.
N)r   Údoner,   ÚcancelÚclear)r   r6   s     r   r?   ÚAsyncIOEventEmitter.cancel…   sB   € ð& —=”=ˆCØ—8‘8—:“: c§m¡m§o£oØ—
‘
–ñ !ð 	�‰×ÑÕr    c                 ó$   • U R                   (       + $ )a®  When true, there are no pending tasks, and execution is complete.
For example:

```py
@ee.on('event')
async def async_handler(*args, **kwargs):
    await returns_a_future()

# Triggers execution of async_handler
ee.emit('data', '00101001')

# async_handler is still running, so this prints False
print(ee.complete)

await ee.wait_for_complete()

# async_handler has completed execution, so this prints True
print(ee.complete)
```
)r   r:   s    r   ÚcompleteÚAsyncIOEventEmitter.complete�   s   € ð, —=‘=Ô Ð r    )r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚSelfr   r   r   Ústrr   Úboolr%   r	   r   r   r7   r;   r?   ÚpropertyrC   Ú__static_attributes__Ú__classcell__)r   s   @r   r   r      sì   ø† ññ6+�tð + 8Ð,=Ñ#>ð +È$÷ +ð +ð
4Øð4àð4ð ð4ð ð	4ð
 
÷4ð4$#Øð$#àð$#ð �C˜�H‰oð$#ð �S˜#�X‘ð	$#ð
 
ô$#ðL& dð &¨tô &ð.�Tð ˜dô ð0 ð!�tð ! ó !ó ö!r    N)Úasyncior   r   r   r   r   Útypingr   r	   r
   r   r   r   r   Ú	pyee.baser   rJ   Ú__all__r   © r    r   Ú<module>rU      s5   ð÷ PÕ Oß B× BÑ Bå "à
€à Ð
!€ôf!˜,õ f!r    