o
    :/i                     @   s  d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZmZmZ ddlmZmZmZ edZededZed	ZG d
d deeef ee Zdee dee fddZdddedee eee df B ded deee  fddZede	e defddZede	e	e  de	e fddZde	e	e eB  de	e eB fddZdee dedeee  fd d!Zd"eee  dee fd#d$Z d%ee d&eegef fd'd(Z!d)e"eef d*ed+edd,fd-d.Z#d,S )/zl
Contains helpers that are applied to collections.

This is similar in concept to the `collections` module.
    )defaultdict)Callable	GeneratorHashableIterableMappingSequence)GenericLiteralTypeVar)TypeIsassert_neveroverloadT_K)bound_Vc                   @   sj   e Zd ZdZdeeeg ef f fddZdedefddZ	ded	eg ef fd
dZ
dd Zdd ZdS )LazyDictz
    Evaluates dictionary items only when they are accessed.

    Adapted from: https://stackoverflow.com/a/47212782/5082708
    factoryc                 C   s   || _ i | _d S N)_factory_dict)selfr    r   h/lsinfo/ai/hellotax_ai/llm_service/venv_vllm/lib/python3.10/site-packages/vllm/utils/collection_utils.py__init__   s   
zLazyDict.__init__keyreturnc                 C   s8   || j vr|| jvrt|| j|  | j |< | j | S r   )r   r   KeyError)r   r   r   r   r   __getitem__    s
   


zLazyDict.__getitem__valuec                 C   s   || j |< d S r   )r   )r   r   r    r   r   r   __setitem__'   s   zLazyDict.__setitem__c                 C   
   t | jS r   )iterr   r   r   r   r   __iter__*      
zLazyDict.__iter__c                 C   r"   r   )lenr   r$   r   r   r   __len__-   r&   zLazyDict.__len__N)__name__
__module____qualname____doc__dictstrr   r   r   r   r!   r%   r(   r   r   r   r   r      s    r   
maybe_listr   c                 C   s   t | tr| S t| S )z5Convert iterable to list, unless it's already a list.)
isinstancelist)r/   r   r   r   as_list1   s   r2   first)checkr    typ.r4   )r3   allc                   sZ   t | tsdS |dkrt| dkpt | d  S |dkr't fdd| D S t| d S )NFr3   r   r6   c                 3   s    | ]}t | V  qd S r   )r0   ).0vr5   r   r   	<genexpr>B   s    zis_list_of.<locals>.<genexpr>)r0   r1   r'   r6   r   )r    r5   r4   r   r9   r   
is_list_of6   s   
r;   itemsc                 C      d S r   r   r<   r   r   r   common_prefixG      r?   c                 C   r=   r   r   r>   r   r   r   r?   K   r@   c                 C   s   t | dkrg S t | dkr| d S t| t d}|s |dd S tdt |d D ]!}|d| }| D ]}|d| |krI|d|d      S q3q)|S )z,Find the longest prefix common to all items.r      )r   N)r'   minrange)r<   shortest	match_lenmatchitemr   r   r   r?   O   s   lst
chunk_sizec                 c   s.    t dt| |D ]}| |||  V  q	dS )z,Yield successive chunk_size chunks from lst.r   N)rC   r'   )rH   rI   ir   r   r   
chunk_listc   s   rK   listsc                 C   s   dd | D S )z)Flatten a list of lists to a single list.c                 S   s   g | ]	}|D ]}|qqS r   r   )r7   sublistrG   r   r   r   
<listcomp>k   s    z$flatten_2d_lists.<locals>.<listcomp>r   )rL   r   r   r   flatten_2d_listsi   s   rO   valuesr   c                C   s8   t ttt f t}| D ]}||| | q| S )z[
    Unlike [`itertools.groupby`][], groups are not broken by
    non-contiguous data.
    )r   r   r1   r   appendr<   )rP   r   groupsr    r   r   r   full_groupbyn   s   rS   objkey1key2Nc                 C   sV   |  |}|  |}|dur|| |< n| |d |dur#|| |< dS | |d dS )zSwap values between two keys.N)getpop)rT   rU   rV   v1v2r   r   r   swap_dict_values{   s   


r[   )$r,   collectionsr   collections.abcr   r   r   r   r   r   typingr	   r
   r   typing_extensionsr   r   r   r   r   r   r.   r   r1   r2   objecttypetupler;   r?   intrK   rO   rS   r-   r[   r   r   r   r   <module>   s:    	

 &" &