a
    ݌xd	                     @   sf   d dl mZmZmZ d dlmZ d dl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 )    )ExecutorFutureThreadPoolExecutor)TracebackType)AnyCallableDictOptionalTupleType)EventEmitterExecutorEventEmitterc                       s   e Zd ZdZded fddZeeedf e	e
ef ddd	ZdeddddZd dddZee eeee dddZ  ZS )r   a,  An event emitter class which runs handlers in a ``concurrent.futures``
    executor.

    By default, this class creates a default ``ThreadPoolExecutor``, but
    a custom executor may also be passed in explicitly to, for instance,
    use a ``ProcessPoolExecutor`` instead.

    This class runs all emitted events on the configured executor. Errors
    captured by the resulting Future are automatically emitted on the
    ``error`` event. This is unlike the EventEmitter, which have no error
    handling.

    The underlying executor may be shut down by calling the ``shutdown``
    method. Alternately you can treat the event emitter as a context manager::

        with ExecutorEventEmitter() as ee:
            # Underlying executor open

            @ee.on('data')
            def handler(data):
                print(data)

            ee.emit('event')

        # Underlying executor closed

    Since the function call is scheduled on an executor, emit is always
    non-blocking.

    No effort is made to ensure thread safety, beyond using an executor.
    N)executorc                    s&   t t|   |r|| _nt | _d S N)superr   __init__	_executorr   )selfr   	__class__ E/var/www/html/Ranjet/env/lib/python3.9/site-packages/pyee/executor.pyr   -   s    zExecutorEventEmitter.__init__.)fargskwargsc                    s8    j j|g|R i |}|jtd d fdd}d S )N)r   returnc                    s0   |   }t|tr  d| n|d ur,|d S )Nerror)	exception
isinstance	Exceptionemit)r   excr   r   r   	_callback<   s
    
z1ExecutorEventEmitter._emit_run.<locals>._callback)r   submitadd_done_callbackr   )r   r   r   r   futurer#   r   r"   r   	_emit_run4   s    zExecutorEventEmitter._emit_runT)waitr   c                 C   s   | j j|d dS )z+Call ``shutdown`` on the internal executor.)r(   N)r   shutdown)r   r(   r   r   r   r)   D   s    zExecutorEventEmitter.shutdown)r   c                 C   s   | S r   r   r"   r   r   r   	__enter__I   s    zExecutorEventEmitter.__enter__)typevalue	tracebackr   c                 C   s   |    d S r   )r)   )r   r+   r,   r-   r   r   r   __exit__L   s    zExecutorEventEmitter.__exit__)N)T)__name__
__module____qualname____doc__r   r   r   r
   r   r   strr'   boolr)   r*   r   r   r   r	   r.   __classcell__r   r   r   r   r      s    	


N)concurrent.futuresr   r   r   typesr   typingr   r   r   r	   r
   r   Z	pyee.baser   __all__r   r   r   r   r   <module>   s
    