a
    ݌xd                     @   sv   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 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SetTupleTypeVarUnionc                   @   s   e Zd ZdZdS )PyeeExceptionzAn exception internal to pyee.N)__name__
__module____qualname____doc__ r   r   A/var/www/html/Ranjet/env/lib/python3.9/site-packages/pyee/base.pyr      s   r   Handler)nameboundc                   @   s  e Zd ZdZddddZeeef dddZeeef ddd	d
Z	d.ee
e eeeegef f dddZeeegef dddZeeedddZeeedddZeeedf eeef ddddZee dddZeeddddZeeedf eeef edd d!Zeeeedd"d#Zd/eeedd$d%Zeeddd&d'Zeeddd(d)Zd0e
e ddd*d+Zeee dd,d-Z dS )1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::

          @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.
    N)returnc                 C   s   t  | _t | _d S N)dict_eventsr   _lockselfr   r   r   __init__5   s    zEventEmitter.__init__c                 C   s   | j  }|d= |S )Nr   )__dict__copyr   stater   r   r   __getstate__<   s    
zEventEmitter.__getstate__)r$   r   c                 C   s   | j | t | _d S r   )r!   updater   r   r#   r   r   r   __setstate__A   s    zEventEmitter.__setstate__)eventfr   c                 C   s"   |du r|  |S | ||S dS )a`  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::

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

        Or directly::

            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_listenerr   r(   r)   r   r   r   onE   s    
zEventEmitter.on)r(   r   c                    s   t t d fdd}|S )aM  Returns a decorator which will register the decorated function to
        the event name ``event``::

            @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``.
        r)   r   c                    s     | |  | S r   _add_event_handlerr)   r(   r   r   r   r-   o   s    z#EventEmitter.listens_to.<locals>.on)r   )r   r(   r-   r   r2   r   r*   c   s    zEventEmitter.listens_toc                 C   s   |  ||| |S )a5  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``.
        r/   r,   r   r   r   r+   u   s    zEventEmitter.add_listener)r(   kvc                 C   s\   |  d|| | j4 || jvr,t | j|< || j| |< W d    n1 sN0    Y  d S )NZnew_listener)emitr   r   r   )r   r(   r3   r4   r   r   r   r0      s
    
zEventEmitter._add_event_handler.)r)   argskwargsr   c                 C   s   ||i | d S r   r   )r   r)   r6   r7   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.)setr   keysr   r   r   r   event_names   s    zEventEmitter.event_names)r(   errorr   c                 C   s*   |dkr&t |tr|ntd| d S )Nr<   z%Uncaught, unspecified 'error' event: )
isinstance	Exceptionr   )r   r(   r<   r   r   r   _emit_handle_potential_error   s    
z)EventEmitter._emit_handle_potential_error)r(   r6   r7   r   c                 C   sb   d}| j ( t| j|t  }W d    n1 s80    Y  |D ]}| ||| d}qF|S )NFT)r   listr   getr   valuesr8   )r   r(   r6   r7   handledfuncsr)   r   r   r   _call_handlers   s    6zEventEmitter._call_handlersc                 O   s.   |  |||}|s*| ||r$|d nd |S )a^  Emit ``event``, passing ``*args`` and ``**kwargs`` to each attached
        function. Returns ``True`` if any functions are attached to ``event``;
        otherwise returns ``False``.

        Example::

            ee.emit('data', '00101001')

        Assuming ``data`` is an attached function, this will call
        ``data('00101001')'``.
        r   N)rE   r?   )r   r(   r6   r7   rC   r   r   r   r5      s    zEventEmitter.emitc                    s.   t t d fdd}|du r"|S ||S dS )zmThe same as ``ee.on``, except that the listener is automatically
        removed after being called.
        r.   c                    s,   t t t d fdd} |  S )N)r6   r7   r   c                     sj   j F  jv r.j  v r.  nW d    d S W d    n1 sR0    Y  | i |S r   )r   r   _remove_listener)r6   r7   )r(   r)   r   r   r   g   s
    .z.EventEmitter.once.<locals>._wrapper.<locals>.g)r   r0   )r)   rG   r2   r1   r   _wrapper   s    z#EventEmitter.once.<locals>._wrapperN)r   )r   r(   r)   rH   r   r2   r   once   s    	zEventEmitter.oncec                 C   s*   | j | | t| j | s&| j |= dS )zNaked unprotected removal.N)r   poplenr,   r   r   r   rF      s    zEventEmitter._remove_listenerc                 C   s6   | j  | || W d   n1 s(0    Y  dS )z*Removes the function ``f`` from ``event``.N)r   rF   r,   r   r   r   remove_listener   s    zEventEmitter.remove_listenerc                 C   sH   | j . |durt | j|< nt | _W d   n1 s:0    Y  dS )zzRemove all listeners attached to ``event``.
        If ``event`` is ``None``, remove all listeners on all events.
        N)r   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``.)r@   r   rA   r   r:   rM   r   r   r   	listeners  s    zEventEmitter.listeners)N)N)N)!r   r   r   r   r    r   strr   r%   r'   r	   r   r   r   r-   r*   r+   r0   r   r   r8   r
   r;   r?   boolrE   r5   rI   rF   rL   rN   r   rO   r   r   r   r   r      sN    

	

 !
r   N)collectionsr   	threadingr   typingr   r   r   r   r   r	   r
   r   r   r   r>   r   r   r   r   r   r   r   <module>   s
   0