o
    <‘ðiß	  ã                   @   sL   d dl Z d dlmZmZmZmZ d dlmZ edƒZG dd„ dee ƒZ	dS )é    N)ÚAnyÚGenericÚListÚTypeVar)ÚNumberÚTc                	   @   sª   e Zd ZdZdd„ Zdededdfdd	„Zd
d„ Zdedede	e
eef  fdd„Zdede	e
eef  fdd„Zdefdd„Zdd„ Zdd„ Zde
eef fdd„ZdS )ÚWeightedListz$
    Thread-safe weighted list.
    c                 C   s   g | _ t ¡ | _d S ©N)Ú_itemsÚ	threadingÚRLockÚ_lock©Úself© r   úS/root/parts/websockify/install/lib/python3.10/site-packages/redis/data_structure.pyÚ__init__   s   zWeightedList.__init__ÚitemÚweightÚreturnNc                 C   sŠ   | j �8 dt| jƒ}}||k r*|| d }| j| d |k r"|}n|d }||k s| j |||f¡ W d  ƒ dS 1 s>w   Y  dS )z.Add item with weight, maintaining sorted orderr   é   é   N)r   Úlenr
   Úinsert)r   r   r   ÚleftÚrightÚmidr   r   r   Úadd   s   û"özWeightedList.addc                 C   sf   | j �& t| jƒD ]\}\}}||kr$| j |¡ |  W  d  ƒ S q	tdƒ‚1 s,w   Y  dS )zRemove first occurrence of itemNzItem not found)r   Ú	enumerater
   ÚpopÚ
ValueError)r   r   ÚiÚstored_itemr   r   r   r   Úremove    s   üûzWeightedList.removeÚ
min_weightÚ
max_weightc                 C   sh   | j �' g }| jD ]\}}||  kr|kr n q	| ||f¡ q	|W  d  ƒ S 1 s-w   Y  dS )z!Get all items within weight rangeN)r   r
   Úappend)r   r$   r%   Úresultr   r   r   r   r   Úget_by_weight_range)   s   €$ûz WeightedList.get_by_weight_rangeÚnc                 C   sB   | j � dd„ | jd|… D ƒW  d  ƒ S 1 sw   Y  dS )z$Get top N the highest weighted itemsc                 S   s   g | ]\}}||f‘qS r   r   )Ú.0r   r   r   r   r   Ú
<listcomp>7   s    z*WeightedList.get_top_n.<locals>.<listcomp>N©r   r
   )r   r)   r   r   r   Ú	get_top_n4   s   $ÿzWeightedList.get_top_nÚ
new_weightc                 C   sF   | j � 	 |  |¡}|  ||¡ |W  d   ƒ S 1 sw   Y  d S r	   )r   r#   r   )r   r   r.   Ú
old_weightr   r   r   Úupdate_weight9   s   
$üzWeightedList.update_weightc                 c   sN   � | j � | j ¡ }W d  ƒ n1 sw   Y  |D ]	\}}||fV  qdS )z"Iterate in descending weight orderN)r   r
   Úcopy)r   Ú
items_copyr   r   r   r   r   Ú__iter__@   s   €ÿÿÿzWeightedList.__iter__c                 C   s4   | j � t| jƒW  d   ƒ S 1 sw   Y  d S r	   )r   r   r
   r   r   r   r   Ú__len__J   s   $ÿzWeightedList.__len__c                 C   s@   | j � | j| \}}||fW  d   ƒ S 1 sw   Y  d S r	   r,   )r   Úindexr   r   r   r   r   Ú__getitem__N   s   $þzWeightedList.__getitem__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úfloatr   r#   r   Útupler   r(   Úintr-   r0   r3   r4   r6   r   r   r   r   r   	   s"    	ÿÿ
þ
r   )
r   Útypingr   r   r   r   Úredis.typingr   r   r   r   r   r   r   Ú<module>   s
    