o
    fAh:!                     @   s   d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZmZmZ eZG dd deZG dd deZeded	ZG d
d dZdS )    )OrderedDict)Lock)AnyCallableDictListMappingOptionaloverloadSetTupleTypeVarUnionc                   @      e Zd ZdZdS )PyeeExceptionz@An exception internal to pyee. Deprecated in favor of PyeeError.N__name__
__module____qualname____doc__ r   r   R/var/www/html/brandlife/copilot/chat-env/lib/python3.10/site-packages/pyee/base.pyr          r   c                   @   r   )	PyeeErrorzAn error internal to pyee.Nr   r   r   r   r   r      r   r   Handler)boundc                   @   sZ  e Zd ZdZdeddfddZdedeeef fddZ	ded	eeef ddfd
dZ
edededeegef fddZededededefddZ	d2dededee deeeegef f fddZdededeegef fddZdedededefddZdedededefddZdededeedf deeef ddf
ddZdedee fdd Zdeded!eddfd"d#Zdededeedf deeef def
d$d%Zdededededef
d&d'Z	d2dededee defd(d)Zdedededdfd*d+Zdedededdfd,d-Zd2dedee ddfd.d/Z dedede!e fd0d1Z"dS )3EventEmittera  The base event emitter class. All other event emitters inherit from
    this class.

    Most events are registered with an emitter via the `on` and `once`
    methods, and fired with the `emit` method. However, pyee event emitters
    have two *special* events:

    - `new_listener`: Fires whenever a new listener is created. Listeners for
      this event do not fire upon their own creation.

    - `error`: When emitted raises an Exception by default, behavior can be
      overridden by attaching callback to the event.

      For example:

    ```py
    @ee.on('error')
    def on_error(message):
        logging.err(message)

    ee.emit('error', Exception('something blew up'))
    ```

    All callbacks are handled in a synchronous, blocking manner. As in node.js,
    raised exceptions are not automatically handled for you---you must catch
    your own exceptions, and treat them accordingly.
    selfreturnNc                 C   s   t  | _t | _d S N)dict_eventsr   _lockr   r   r   r   __init__>   s   zEventEmitter.__init__c                 C   s   | j  }|d= |S )Nr"   )__dict__copyr   stater   r   r   __getstate__E   s   
zEventEmitter.__getstate__r(   c                 C   s   | j | t | _d S r   )r%   updater   r"   r'   r   r   r   __setstate__J   s   zEventEmitter.__setstate__eventc                 C      d S r   r   r   r,   r   r   r   onN      zEventEmitter.onfc                 C   r-   r   r   r   r,   r1   r   r   r   r/   P   r0   c                 C   s   |du r	|  |S | ||S )au  Registers the function `f` to the event name `event`, if provided.

        If `f` isn't provided, this method calls `EventEmitter#listens_to`, and
        otherwise calls `EventEmitter#add_listener`. In other words, you may either
        use it as a decorator:

        ```py
        @ee.on('data')
        def data_handler(data):
            print(data)
        ```

        Or directly:

        ```py
        ee.on('data', data_handler)
        ```

        In both the decorated and undecorated forms, the event handler is
        returned. The upshot of this is that you can call decorated handlers
        directly, as well as use them in remove_listener calls.

        Note that this method's return type is a union type. If you are using
        mypy or pyright, you will probably want to use either
        `EventEmitter#listens_to` or `EventEmitter#add_listener`.
        N)
listens_toadd_listenerr2   r   r   r   r/   S   s   
c                    s   dt dt f fdd}|S )aV  Returns a decorator which will register the decorated function to
        the event name `event`:

        ```py
        @ee.listens_to("event")
        def data_handler(data):
            print(data)
        ```

        By only supporting the decorator use case, this method has improved
        type safety over `EventEmitter#on`.
        r1   r   c                    s     | |  | S r   _add_event_handlerr1   r,   r   r   r   r/      s   z#EventEmitter.listens_to.<locals>.onN)r   )r   r,   r/   r   r8   r   r3   u   s   zEventEmitter.listens_toc                 C   s   |  ||| |S )a:  Register the function `f` to the event name `event`:

        ```
        def data_handler(data):
            print(data)

        h = ee.add_listener("event", data_handler)
        ```

        By not supporting the decorator use case, this method has improved
        type safety over `EventEmitter#on`.
        Nr5   r2   r   r   r   r4      s   zEventEmitter.add_listenerkvc                 C   s^   |  d|| | j || jvrt | j|< || j| |< W d    d S 1 s(w   Y  d S )NZnew_listener)emitr"   r!   r   )r   r,   r9   r:   r   r   r   r6      s   
"zEventEmitter._add_event_handlerargs.kwargsc                 C   s   ||i | d S r   r   )r   r1   r<   r=   r   r   r   	_emit_run   s   zEventEmitter._emit_runc                 C   s   t | j S )z6Get a set of events that this emitter is listening to.N)setr!   keysr#   r   r   r   event_names   s   zEventEmitter.event_nameserrorc                 C   s(   |dkrt |tr|td| d S )NrB   z%Uncaught, unspecified 'error' event: )
isinstance	Exceptionr   )r   r,   rB   r   r   r   _emit_handle_potential_error   s
   
z)EventEmitter._emit_handle_potential_errorc                 C   sb   d}| j  t| j|t  }W d    n1 sw   Y  |D ]}| ||| d}q#|S )NFT)r"   listr!   getr   valuesr>   )r   r,   r<   r=   handledfuncsr1   r   r   r   _call_handlers   s   zEventEmitter._call_handlersc                 O   s.   |  |||}|s| ||r|d nd |S )ac  Emit `event`, passing `*args` and `**kwargs` to each attached
        function. 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')'`.
        r   N)rK   rE   )r   r,   r<   r=   rI   r   r   r   r;      s   zEventEmitter.emitc                    s,   dt dt f fdd}|du r|S ||S )zkThe same as `ee.on`, except that the listener is automatically
        removed after being called.
        r1   r   c                    s0   dt dt dt f fdd} |  S )Nr<   r=   r   c                     sl   j $  jv rj  v r  n		 W d    d S W d    n1 s*w   Y  | i |S r   )r"   r!   _remove_listener)r<   r=   )r,   r1   r   r   r   g   s   	z.EventEmitter.once.<locals>._wrapper.<locals>.g)r   r6   )r1   rM   r8   r7   r   _wrapper   s   z#EventEmitter.once.<locals>._wrapperN)r   )r   r,   r1   rN   r   r8   r   once   s   	zEventEmitter.oncec                 C   s.   | j | | t| j | s| j |= dS dS )zNaked unprotected removal.N)r!   poplenr2   r   r   r   rL     s   zEventEmitter._remove_listenerc                 C   s8   | j  | || W d   dS 1 sw   Y  dS )z&Removes the function `f` from `event`.N)r"   rL   r2   r   r   r   remove_listener
  s   "zEventEmitter.remove_listenerc                 C   sZ   | j   |durt | j|< nt | _W d   dS W d   dS 1 s&w   Y  dS )ztRemove all listeners attached to `event`.
        If `event` is `None`, remove all listeners on all events.
        N)r"   r   r!   r    r.   r   r   r   remove_all_listeners  s   
"z!EventEmitter.remove_all_listenersc                 C   s   t | j|t  S )z:Returns a list of all listeners registered to the `event`.N)rF   r!   rG   r   r@   r.   r   r   r   	listeners  s   zEventEmitter.listenersr   )#r   r   r   r   Selfr$   r   strr   r)   r+   r
   r   r   r/   r	   r   r3   r4   r6   r   r   r>   r   rA   rE   boolrK   r;   rO   rL   rR   rS   r   rT   r   r   r   r   r   !   s    "
 "







!
r   N)collectionsr   	threadingr   typingr   r   r   r   r   r	   r
   r   r   r   r   rU   rD   r   r   r   r   r   r   r   r   <module>   s   4