o
    <g3                     @   s   d dl mZmZmZmZ d dlmZmZmZ d dl	m
Z
 g dZG dd dZG dd deZG d	d
 d
eZdd Zd dddZdS )    )CallableIterableIteratorMapping)isliceteezip_longest)Promise)BaseChoiceIteratorBlankChoiceIteratorCallableChoiceIteratorflatten_choicesnormalize_choicesc                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )r
   z*Base class for lazy iterators for choices.c                    s4   t |trtdd t| |t dD S t |S )Nc                 s   s    | ]	\}}||kV  qd S N ).0abr   r   G/var/www/html/venv/lib/python3.10/site-packages/django/utils/choices.py	<genexpr>       z,BaseChoiceIterator.__eq__.<locals>.<genexpr>)	fillvalue)
isinstancer   allr   objectsuper__eq__)selfother	__class__r   r   r      s   
zBaseChoiceIterator.__eq__c                 C   sD   |dk r
t | | S ztt| ||d W S  ty!   tdd w )Nr      zindex out of range)listnextr   StopIteration
IndexError)r   indexr   r   r   __getitem__   s   
zBaseChoiceIterator.__getitem__c                 C   s   t d)Nz8BaseChoiceIterator subclasses must implement __iter__().)NotImplementedErrorr   r   r   r   __iter__    s   zBaseChoiceIterator.__iter__)__name__
__module____qualname____doc__r   r'   r*   __classcell__r   r   r   r   r
      s
    	r
   c                   @       e Zd ZdZdd Zdd ZdS )r   z)Iterator to lazily inject a blank choice.c                 C   s   || _ || _d S r   )choicesblank_choice)r   r1   r2   r   r   r   __init__)   s   
zBlankChoiceIterator.__init__c                 c   s@    t | j\}}tdd t|D s| jE d H  |E d H  d S )Nc                 s   s    | ]	\}}|d v V  qdS )) NNr   )r   value_r   r   r   r   /   r   z/BlankChoiceIterator.__iter__.<locals>.<genexpr>)r   r1   anyr   r2   )r   r1   r   r   r   r   r*   -   s
   zBlankChoiceIterator.__iter__Nr+   r,   r-   r.   r3   r*   r   r   r   r   r   &   s    r   c                   @   r0   )r   z=Iterator to lazily normalize choices generated by a callable.c                 C   s
   || _ d S r   )func)r   r9   r   r   r   r3   7   s   
zCallableChoiceIterator.__init__c                 c   s    t |  E d H  d S r   )r   r9   r)   r   r   r   r*   :   s   zCallableChoiceIterator.__iter__Nr8   r   r   r   r   r   4   s    r   c                 c   s<    | pdD ]\}}t |ttfr|E dH  q||fV  qdS )z*Flatten choices by removing nested values.r   N)r   r"   tuple)r1   value_or_grouplabel_or_nestedr   r   r   r   >   s   r   depthc             	      sZ  ddl m} |   td r   | S   td r   | S   td r(   | S   td r3   | S    |d r?  | jS   td rP  dk rQ |  } nE  t	d r]  dk r^ n8  t
d rs  dk rttdd | D st n"  td r  dkr t| S  td r  dk r|  } n 	 | S z
 fdd| D W S  ttfy   |  Y S w )	z=Normalize choices values consistently for fields and widgets.r   )ChoicesTyper      c                 s   s     | ]}t |tttfV  qd S r   )r   r	   bytesstr)r   xr   r   r   r   ]   s    
z$normalize_choices.<locals>.<genexpr>c                    s$   g | ]\}}|t | d  dfqS )r!   r=   )r   )r   kvr=   r   r   
<listcomp>m   s   $ z%normalize_choices.<locals>.<listcomp>)django.db.models.enumsr?   r
   r	   rA   rB   r1   r   itemsr   r   r7   r   r   	TypeError
ValueError)r5   r>   r?   r   r=   r   r   G   sL   

r   N)collections.abcr   r   r   r   	itertoolsr   r   r   django.utils.functionalr	   __all__r
   r   r   r   r   r   r   r   r   <module>   s    	
	