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   H/home/ubuntu/.local/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
    