
    &i                     x    d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZ eZdgZ G d de          ZdS )    )AbstractEventLoopensure_futureFutureiscoroutinewait)AnyCallablecastDictOptionalSetTuple)EventEmitterAsyncIOEventEmitterc            
            e Zd ZdZddedee         ddf fdZdedede	d	e	de
f
 fd
Zdededee	df         d	eee	f         ddf
dZdeddfdZdeddfdZedede
fd            Z xZS )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          t          |                                            || _        t	                      | _        d S N)superr   __init___loopset_waiting)r   r   	__class__s     L/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/pyee/asyncio.pyr   zAsyncIOEventEmitter.__init__)   s6    !4((1133326
%(UU    eventargskwargsc                 >     t                      j        |g|R i |S )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#   zAsyncIOEventEmitter.emit.   s+    0 uww|E3D333F333r   f.c                     	  ||i |}t          |          rT j        r*t          t          t          |           j                  }nPt          t          t          |                    }n-t          |t                    rt          t          |          }nd S dt          dd f fd}|                    |            j        	                    |           d S # t          $ r!}                     d|           Y d }~d S d }~ww xY w)N)r   r$   r   c                     j                             |            |                                 rd S |                                 }|r                    d|           d S d S )Nerror)r   discard	cancelled	exceptionr#   )r$   excr   s     r   callbackz/AsyncIOEventEmitter._emit_run.<locals>.callbacka   sg    %%a(((;;== F/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_runzAsyncIOEventEmitter._emit_runH   s:   	#4*6**D 4   : 9  -T#t__4:NNNCC'S$88CCD&)) 3oo,F ,t , , , , , , !!(+++Mc"""""9  	$ 	$ 	$IIgs#########	$s   C 
D%DDc                 P   K   | j         rt          | j                    d{V  dS dS )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_completez%AsyncIOEventEmitter.wait_for_completen   sD      ( = 	&t}%%%%%%%%%%%	& 	&r   c                     | j         D ]>}|                                s(|                                s|                                 ?| j                                          dS )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   r2   s     r   r9   zAsyncIOEventEmitter.cancel   s\    & = 	 	C88:: cmmoo 

r   c                     | j          S )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   r5   s    r   completezAsyncIOEventEmitter.complete   s    , =  r   r   )__name__
__module____qualname____doc__Selfr   r   r   strr   boolr#   r	   r   r   r3   r6   r9   propertyr<   __classcell__)r   s   @r   r   r      sx        6+ +t +8,=#> +$ + + + + + +
444 4 	4
 
4 4 4 4 4 44$#$#$# CHo$# S#X	$#
 
$# $# $# $#L&d &t & & & &.T d    0 !t ! ! ! ! X! ! ! ! !r   N)asyncior   r   r   r   r   typingr   r	   r
   r   r   r   r   	pyee.baser   rA   __all__r    r   r   <module>rK      s    P O O O O O O O O O O O O O B B B B B B B B B B B B B B B B B B " " " " " "
 
!f! f! f! f! f!, f! f! f! f! f!r   