o
    QDi!                     @   s>   d dl Z d dlZd dlmZmZ d dlmZ G dd dZdS )    N)IterableIterator)Optionalc                   @   s   e Zd ZU g Zee ed< ddee deddfddZ	d	eddfd
dZ
d	eddfddZdedee fddZdedeee ee f fddZdedeeee ee f  fddZdedee fddZdS )HashRingnodes    replicasreturnNc                 C   s*   || _ i | _g | _|D ]}| | qd S N)r	   ringsorted_keysadd_node)selfr   r	   noder   r   O/var/www/Datamplify/venv/lib/python3.10/site-packages/django_redis/hash_ring.py__init__
   s   zHashRing.__init__r   c                 C   s`   | j | t| jD ]}| d| }t|  }|| j|< | j	| q| j	
  d S N:)r   appendranger	   hashlibsha256encode	hexdigestr   r   sort)r   r   x_key_hashr   r   r   r      s   
zHashRing.add_nodec                 C   sP   | j | t| jD ]}t| d|   }| j|= | j	| qd S r   )
r   remover   r	   r   r   r   r   r   r   )r   r   r   r   r   r   r   remove_node   s   zHashRing.remove_nodekeyc                 C   s   |  |\}}|S r   )get_node_pos)r   r!   nir   r   r   get_node%   s   zHashRing.get_nodec                 C   sd   t | jdkr	dS t|  }t| j|}t|d | j	t | j
 d }| j| j|  |fS )Nr   NN   )lenr   r   r   r   r   bisectr   minr	   r   )r   r!   r   idxr   r   r   r"   )   s   zHashRing.get_node_posc                 c   sL    t | jdkrdV  | |\}}| j|d  D ]
}|| j| fV  qd S )Nr   r&   )r(   r   r"   r   )r   r!   r   poskr   r   r   
iter_nodes2   s   zHashRing.iter_nodesc                 C   s
   |  |S r   )r%   )r   r!   r   r   r   __call__:   s   
zHashRing.__call__)r   r   )__name__
__module____qualname__r   liststr__annotations__r   intr   r   r    r   r%   tupler"   r   r.   r/   r   r   r   r   r      s   
 "&	r   )r)   r   collections.abcr   r   typingr   r   r   r   r   r   <module>   s
    