
    0WRi!                     D    d dl Z d dlZd dlmZmZ d dlmZ  G d d      Zy)    N)IterableIterator)Optionalc                       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y)HashRingnodesreplicasreturnNc                 ^    || _         i | _        g | _        |D ]  }| j                  |        y N)r	   ringsorted_keysadd_node)selfr   r	   nodes       t/var/www/html/navyabakers_fullstack/navyabakers_prod/venv_new/lib/python3.12/site-packages/django_redis/hash_ring.py__init__zHashRing.__init__
   s3    %$&	&( 	 DMM$	     r   c                 f   | j                   j                  |       t        | j                        D ]d  }| d| }t	        j
                  |j                               j                         }|| j                  |<   | j                  j                  |       f | j                  j                          y N:)r   appendranger	   hashlibsha256encode	hexdigestr   r   sort)r   r   x_key_hashs        r   r   zHashRing.add_node   s    

$t}}% 	+AV1QC=DNN4;;=1;;=E#DIIe##E*	+ 	r   c                 *   | j                   j                  |       t        | j                        D ]`  }t	        j
                  | d| j                               j                         }| j                  |= | j                  j                  |       b y r   )
r   remover   r	   r   r   r   r   r   r   )r   r   r   r!   s       r   remove_nodezHashRing.remove_node   sv    

$t}}% 	+ANNdV1QC=#7#7#9:DDFE		% ##E*	+r   keyc                 .    | j                  |      \  }}|S r   )get_node_pos)r   r%   nis       r   get_nodezHashRing.get_node%   s      %1r   c                 v   t        | j                        dk(  ryt        j                  |j	                               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    tyy>Qszz|,668mmD,,e4#'DMMC

O;q@Ayy))#./44r   c              #      K   t        | j                        dk(  rd | j                  |      \  }}| j                  |d  D ]  }|| j                  |   f  y w)Nr   r,   )r.   r   r'   r   )r   r%   r   posks        r   
iter_nodeszHashRing.iter_nodes2   s^     tyy>Q%%c*	c!!#$' 	"ATYYq\/!	"s   AAc                 $    | j                  |      S r   )r*   )r   r%   s     r   __call__zHashRing.__call__:   s    }}S!!r   )    )__name__
__module____qualname__r   liststr__annotations__r   intr   r   r$   r   r*   tupler'   r   r5   r7   r8   r   r   r   r      s    E49 hsm  C  $  
 S 
 T 
 + + +C HSM 5 5hsmXc].J(K 5"c "huXc]HSM5Q/R&S ""C "HSM "r   r   )r/   r   collections.abcr   r   typingr   r   r8   r   r   <module>rD      s      . 4" 4"r   