
    &th	                     t    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e          ZdS )    )ExecutorFutureThreadPoolExecutor)TracebackType)AnyCallableDictOptionalTupleType)EventEmitterExecutorEventEmitterc            	            e Zd ZdZddee         f fdZdedee	df         de
ee	f         fd	ZddeddfdZddZdee         dededee         fdZ x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:

    ```py
    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                     t          t          |                                            |r	|| _        d S t	                      | _        d S N)superr   __init__	_executorr   )selfr   	__class__s     a/var/www/html/mycamper/aliexpress-site/backend/venv/lib/python3.11/site-packages/pyee/executor.pyr   zExecutorEventEmitter.__init__/   sD    "D))22444 	2'/DNNN/11DNNN    fargs.kwargsc                 l       j         j        |g|R i |}|j        dt          dd f fd            }d S )Nr   returnc                     |                                  }t          |t                    r                    d|           d S ||d S )Nerror)	exception
isinstance	Exceptionemit)r   excr   s     r   	_callbackz1ExecutorEventEmitter._emit_run.<locals>._callback>   sM    +,;;==C#y)) 		'3'''''	 !r   )r   submitadd_done_callbackr   )r   r   r   r   futurer&   s   `     r   	_emit_runzExecutorEventEmitter._emit_run6   sm     /.qB4BBB6BB		!	 	D 	 	 	 	 	 
"	!	 	 	r   Twaitr   c                 <    | j                             |           dS )z)Call `shutdown` on the internal executor.)r+   N)r   shutdown)r   r+   s     r   r-   zExecutorEventEmitter.shutdownF   s#     	T*****r   c                     | S r    )r   s    r   	__enter__zExecutorEventEmitter.__enter__K   s    r   typevalue	tracebackc                 .    |                                   d S r   )r-   )r   r1   r2   r3   s       r   __exit__zExecutorEventEmitter.__exit__N   s     	r   r   )T)r   r   )__name__
__module____qualname____doc__r
   r   r   r   r   r   r	   strr*   boolr-   r0   r   r#   r   r5   __classcell__)r   s   @r   r   r      s          D2 2(!3 2 2 2 2 2 2 CHo S#X	    + +T +T + + + +
   O,5BO	$       r   N)concurrent.futuresr   r   r   typesr   typingr   r   r	   r
   r   r   	pyee.baser   __all__r   r/   r   r   <module>rB      s    D C C C C C C C C C       = = = = = = = = = = = = = = = = " " " " " "!
"E E E E E< E E E E Er   