
    $g                     P    d dl Z d dlZd dlmZmZmZmZmZmZ  G d d          Z	dS )    N)DictIterableIteratorListOptionalTuplec                       e Zd ZU g Zee         ed<   ddee         deddfdZ	deddfd	Z
deddfd
Zdedee         fdZdedeee         ee         f         fdZdedeeee         ee         f                  fdZdedee         fdZdS )HashRingnodes    replicasreturnNc                 d    || _         i | _        g | _        |D ]}|                     |           d S N)r   ringsorted_keysadd_node)selfr   r   nodes       V/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/django_redis/hash_ring.py__init__zHashRing.__init__	   sF    %$&	&( 	  	 DMM$	  	     r   c                 `   | j                             |           t          | j                  D ]e}| d| }t	          j        |                                                                          }|| j        |<   | j	                            |           f| j	        
                                 d S N:)r   appendranger   hashlibsha256encode	hexdigestr   r   sort)r   r   x_key_hashs        r   r   zHashRing.add_node   s    
$t}%% 	+ 	+A==Q==DN4;;==11;;==E#DIe##E****r   c                 &   | j                             |           t          | j                  D ]a}t	          j        | d|                                                                           }| j        |= | j	                            |           bd S r   )
r   remover   r   r   r    r!   r"   r   r   )r   r   r$   r&   s       r   remove_nodezHashRing.remove_node   s    
$t}%% 	+ 	+ANd==Q==#7#7#9#9::DDFFE	% ##E****	+ 	+r   keyc                 6    |                      |          \  }}|S r   )get_node_pos)r   r*   nis       r   get_nodezHashRing.get_node$   s      %%1r   c                 n   t          | j                  dk    rdS t          j        |                                                                          }t          j        | j        |          }t          |dz
  | j	        t          | j
                  z  dz
            }| j        | j        |                  |fS )Nr   NN   )lenr   r   r    r!   r"   bisectr   minr   r   )r   r*   r&   idxs       r   r,   zHashRing.get_node_pos(   s    ty>>Q:szz||,,6688mD,e44#'DMC
OO;q@AAy)#./44r   c              #      K   t          | j                  dk    rdV  |                     |          \  }}| j        |d          D ]}|| j        |         fV  d S )Nr   r1   )r3   r   r,   r   )r   r*   r   posks        r   
iter_nodeszHashRing.iter_nodes1   sz      ty>>Q%%c**	c!#$$' 	" 	"ATYq\/!!!!	" 	"r   c                 ,    |                      |          S r   )r/   )r   r*   s     r   __call__zHashRing.__call__9   s    }}S!!!r   )r   r   )__name__
__module____qualname__r   r   str__annotations__r   intr   r   r)   r   r/   r   r,   r   r:   r<   r   r   r   r
   r
      sY        E49   hsm  C  $        
 S 
 T 
  
  
  
 + + + + + +C HSM    5 5hsmXc].J(K 5 5 5 5"c "huXc]HSM5Q/R&S " " " ""C "HSM " " " " " "r   r
   )
r4   r   typingr   r   r   r   r   r   r
   r   r   r   <module>rD      sy      B B B B B B B B B B B B B B B B4" 4" 4" 4" 4" 4" 4" 4" 4" 4"r   