o
    Vh                     @  sd   d dl mZ d dlmZ d dlmZ d dlmZ er)d dlmZ eeedgdf Z	G dd dZ
dS )	    )annotations)TYPE_CHECKING)Callable)cast)EventEventDispatcherNc                   @  sh   e Zd Zd#ddZd$d%d
dZ	d$d&ddZd'ddZd$d(ddZ	d)d*ddZd+dd Z	d,d!d"Z
dS )-r   returnNonec                 C  s   i | _ i | _d S N)
_listeners_sorted)self r   p/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/cleo/events/event_dispatcher.py__init__   s   
zEventDispatcher.__init__Neventr   
event_name
str | Nonec                 C  s8   |d u r	t |j}td| |}|r| ||| |S )Nlist[Listener])type__name__r   get_listeners_do_dispatch)r   r   r   	listenersr   r   r   dispatch   s   
zEventDispatcher.dispatch*list[Listener] | dict[str, list[Listener]]c                 C  sZ   |d ur|| j vrg S || jvr| | | j| S | j D ]}|| jvr)| | q| jS r
   )r   r   _sort_listenersr   r   r   r   r   r      s   






zEventDispatcher.get_listenersstrlistenerListener
int | Nonec                 C  sH   || j vrd S | j |  D ]\}}|D ]}||kr |    S qqd S r
   )r   items)r   r   r   priorityr   vr   r   r   get_listener_priority0   s   
z%EventDispatcher.get_listener_priorityboolc                 C  s&   |d urt | j|S t| j S r
   )r&   r   getanyvaluesr   r   r   r   has_listeners;   s   zEventDispatcher.has_listenersr   r#   intc                 C  s^   || j vr
i | j |< || j | vrg | j | |< | j | | | || jv r-| j|= d S d S r
   )r   appendr   )r   r   r   r#   r   r   r   add_listener@   s   


zEventDispatcher.add_listenerr   r   c                 C  s(   |D ]}|  r d S ||||  qd S r
   )is_propagation_stopped)r   r   r   r   r   r   r   r   r   N   s
   zEventDispatcher._do_dispatchc                 C  s<   | j | }g  }| j|< t|ddD ]	}|||  qdS )zW
        Sorts the internal list of listeners for the given event by priority.
        T)reverseN)r   r   sortedextend)r   r   prioritized_listenerssorted_listenersr#   r   r   r   r   W   s
   
zEventDispatcher._sort_listeners)r   r	   r
   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r    r   r!   )r   r   r   r&   )r   )r   r   r   r    r#   r+   r   r	   )r   r   r   r   r   r   r   r	   )r   r   r   r	   )r   
__module____qualname__r   r   r   r%   r*   r-   r   r   r   r   r   r   r      s    


	)
__future__r   typingr   r   r   cleo.events.eventr   r   r    r   r   r   r   r   <module>   s    