o
    Nh
                     @   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                       sR   e Zd ZdZddee f fddZdedee	df d	e
ee	f f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__ I/home/air/yokohama/back/venv/lib/python3.10/site-packages/pyee/asyncio.pyr   '   s   zAsyncIOEventEmitter.__init__fargs.kwargsc              
      s   z	||i |}W n t y" } z d| W Y d }~d S d }~ww t|r= jr5ttt| jd}nttt|}nt|trHtt|}nd S  fdd}|	|  j
| d S )Nerror)r   c                    s8    j |  |  rd S |  }|r d| d S d S )Nr   )r   remove	cancelled	exceptionemit)r   excr   r   r   callbackE   s   z/AsyncIOEventEmitter._emit_run.<locals>.callback)	Exceptionr"   r   r   r   r   r   
isinstancer   add_done_callbackr   add)r   r   r   r   coror#   futr%   r   r$   r   	_emit_run,   s    


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