a
    ҏi
                     @   sb   d dl 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 dgZG dd deZdS )    )AbstractEventLoopensure_futureFutureiscoroutine)AnyCallablecastDictOptionalSetTuple)EventEmitterAsyncIOEventEmitterc                       sN   e Zd ZdZd
ee d fddZeee	df e
ee	f ddd	Z  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loopc                    s    t t|   || _t | _d S )N)superr   __init___loopset_waiting)selfr   	__class__ </home/Claro/venv/lib/python3.9/site-packages/pyee/asyncio.pyr   '   s    zAsyncIOEventEmitter.__init__.)fargskwargsc              
      s   z||i |}W n0 t yB } z d| W Y d }~nzd }~0 0 t|rx jrhttt| jd}qttt|}nt|trtt|}nd S  fdd}|	|  j
| d S )Nerrorr   c                    s4    j |  |  rd S |  }|r0 d| d S )Nr   )r   removeZ	cancelled	exceptionemit)r   excr   r   r   callbackE   s    z/AsyncIOEventEmitter._emit_run.<locals>.callback)	Exceptionr!   r   r   r   r   r   
isinstancer   Zadd_done_callbackr   add)r   r   r   r   coror"   Zfutr$   r   r#   r   	_emit_run,   s    "


zAsyncIOEventEmitter._emit_run)N)__name__
__module____qualname____doc__r
   r   r   r   r   r   r	   strr)   __classcell__r   r   r   r   r      s   

N)Zasyncior   r   r   r   typingr   r   r   r	   r
   r   r   Z	pyee.baser   __all__r   r   r   r   r   <module>   s   $