
    Yh                     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     >/var/www/html/env/lib/python3.13/site-packages/pyee/asyncio.pyr   AsyncIOEventEmitter.__init__)   s    !41326
%(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3D3F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{{}IIgs+ 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::NC'S$8CD&))3o,F ,t , !!(+MMc"9  	$IIgs##	$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88::cmmoo

 ! 	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
 
44$#$#$# CHo$# 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    