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eee B 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/d0Z$d.S )1zl
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   Q/home/ubuntu/vllm_env/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   objc                 C   s   t | ts
t | ts| gS | S r   )r0   r.   r   )r3   r   r   r   as_iter6   s   r4   first)checkr    typ.r6   )r5   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 )NFr5   r   r8   c                 3   s    | ]}t | V  qd S r   )r0   ).0vr7   r   r   	<genexpr>H   s    zis_list_of.<locals>.<genexpr>)r0   r1   r'   r8   r   )r    r7   r6   r   r;   r   
is_list_of<   s   
r=   itemsc                 C      d S r   r   r>   r   r   r   common_prefixM      rA   c                 C   r?   r   r   r@   r   r   r   rA   Q   rB   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   rA   U   s   lst
chunk_sizec                 c   s.    t dt| |D ]}| |||  V  q	dS )z,Yield successive chunk_size chunks from lst.r   N)rE   r'   )rJ   rK   ir   r   r   
chunk_listi   s   rM   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   )r9   sublistrI   r   r   r   
<listcomp>q   s    z$flatten_2d_lists.<locals>.<listcomp>r   )rN   r   r   r   flatten_2d_listso   s   rQ   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>   )rR   r   groupsr    r   r   r   full_groupbyt   s   rU   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)r3   rV   rW   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   r4   objecttypetupler=   rA   intrM   rQ   rU   r-   r\   r   r   r   r   <module>   s<    


 &" &