o
    tdf
                  	   @   s  d dl Z d dlZd dlZd dlmZmZmZ d dlmZmZ d dl	m
Z
mZmZmZmZmZmZmZ d dlmZ edZedZdefd	d
Zdee dee fddZdede jdeeef fddZdee de
eeef  fddZdedefddZeedddZdeeef defddZdeeef de
eeef  fdd Z deeef deeef fd!d"Z!d#ee d$eegef deeee f fd%d&Z"G d'd( d(e#Z$d)d* Z%d0d,d-Z&d.d/ Z'dS )1    N)OrderedDictCounterdefaultdict)	FrameTypeTracebackType)IteratorListTupleIterableCallableUnionTypeVarMapping)ASTTextTR
max_lengthc                 C   sN   t | |kr%|t | d }|t | | }| d | | | | d   } | S )N   )len)seqr   middlerightleft r   Y/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/stack_data/utils.pytruncate   s
   r   itreturnc                 C   s   t t| S N)listr   fromkeys)r   r   r   r   unique_in_order   s   r!   atoknodec                 C   sd   t |ttddrt| |j\}}t| |jd \}}||fS | j|dd\\}}\}}||d fS )z
    Returns a pair of numbers representing a half open range
    (i.e. suitable as arguments to the `range()` builtin)
    of line numbers of the given AST nodes.
    
match_caser   F)padded   )
isinstancegetattrast
line_rangepatternbodyZget_text_positions)r"   r#   start_end_startend_r   r   r   r+      s   r+   lstc                 #   s    t |  tj|  fdddD ]L\}|rOtdgt fdd}tD ]"|fddd urD|fdd |fd	d q+ntd
tE d H  qd S )Nc                    s    |  dkS )N   r   x)countsr   r   <lambda>/       z"highlight_unique.<locals>.<lambda>keyFc                    s,   z|  }W n
 t y   Y d S w d |< |S )NT)
ValueError)fi)highlightedr   r   highlight_index4   s   
z)highlight_unique.<locals>.highlight_indexc                      s
     S r   indexr   groupitemr   r   r8   =   s   
 c                      s     d S Nr'   rA   r   )firstrD   rE   r   r   r8   ?   s    c                      s   d d d d   S )Nr%   rA   r   rC   r   r   r8   @   s    T)r   	itertoolsgroupbyr   r   setrepeatzip)r3   Z	is_commonr@   r   )r7   rG   rD   r?   rE   r   highlight_unique,   s    
rM   r6   c                 C   s   | S r   r   r5   r   r   r   identityG   s   rN   )mapperr;   c                c   s|    t t|| }tjt| t|dd dD ]%\}}t| \}}|r+t||E d H  qt| \}	}
|t |t |	V  qd S )Nc                 S   s   | d d S rF   r   )tr   r   r   r8   O   r9   z#collapse_repeated.<locals>.<lambda>r:   )r   maprH   rI   rL   rM   )r3   Z	collapserrO   r;   ZkeyedZis_highlightedrD   Zoriginal_groupZhighlighted_groupZkeyed_groupr2   r   r   r   collapse_repeatedK   s   rR   frame_or_tbc                 C   s$   t t| tjtjf t| tjfS r   )assert_r(   typesr   r   rS   r   r   r   is_frameY   s   rW   c                 c   s2    | }|r|V  t |r|j}n|j}|sd S d S r   )rW   f_backtb_next)rS   currentr   r   r   
iter_stack^   s   r[   c                 C   s   t | r	| | jfS | j| jfS r   )rW   f_linenotb_frame	tb_linenorV   r   r   r   frame_and_linenoh   s   
r_   iterablekey_funcc                 C   s(   t t}| D ]}||| | q|S )a  
    Create a dictionary from an iterable such that the keys are the result of evaluating a key function on elements
    of the iterable and the values are lists of elements all of which correspond to the key.

    >>> def si(d): return sorted(d.items())
    >>> si(group_by_key_func("a bb ccc d ee fff".split(), len))
    [(1, ['a', 'd']), (2, ['bb', 'ee']), (3, ['ccc', 'fff'])]
    >>> si(group_by_key_func([-1, 0, 1, 3, 6, 8, 9, 2], lambda x: x % 2))
    [(0, [0, 6, 8, 2]), (1, [-1, 1, 3, 9])]
    )r   r   append)r`   ra   resultrE   r   r   r   group_by_key_funco   s   rd   c                   @   s$   e Zd ZdZdd Zdd ZeZdS )cached_propertyz
    A property that is only computed once per instance and then replaces itself
    with an ordinary attribute. Deleting the attribute resets the property.

    Based on https://github.com/pydanny/cached-property/blob/master/cached_property.py
    c                 C   s   |j | _ || _d S r   )__doc__func)selfrg   r   r   r   __init__   s   
zcached_property.__init__c                 C   s(   |d u r| S |  | }|j| j j< |S r   )rg   __dict____name__)rh   obj_clsvaluer   r   r   cached_property_wrapper   s   z'cached_property.cached_property_wrapperN)rk   
__module____qualname__rf   ri   ro   __get__r   r   r   r   re      s
    re   c                    sp   dd l }ddlm} G  fdddt|d}|dd}z|||| }W | S  ty7   |}Y | S w )Nr   )get_lexer_by_namec                       s   e Zd Z fddZ  ZS )z'_pygmented_with_ranges.<locals>.MyLexerc                 3   sR    d t  |D ]\}}t fddD r|j} t|7  ||fV  q	d S )Nr   c                 3   s,    | ]\}}|   ko|k n  V  qd S r   r   ).0r.   r1   lengthr   r   	<genexpr>   s   * zE_pygmented_with_ranges.<locals>.MyLexer.get_tokens.<locals>.<genexpr>)super
get_tokensanyZExecutingNoder   )rh   textttypern   )	__class__rangesru   r   ry      s   z2_pygmented_with_ranges.<locals>.MyLexer.get_tokens)rk   rp   rq   ry   __classcell__r   r~   )r}   r   MyLexer   s    r   python3F)stripnl)pygmentsZpygments.lexersrs   type	highlight	Exception
splitlines)	formattercoder~   r   rs   r   lexerr?   r   r   r   _pygmented_with_ranges   s   
	r    c                 C   s   | st |trt|}|d S r   )r(   strAssertionError)	conditionerrorr   r   r   rT      s
   
rT   c                 C   s$   zt | W S    dt| j  Y S )Nz<unprintable %s object>)r   r   rk   )rn   r   r   r   some_str   s   
r   )r   )(r*   rH   rU   collectionsr   r   r   r   r   typingr   r   r	   r
   r   r   r   r   Z	asttokensr   r   r   intr   r!   ASTr+   boolrM   rN   rR   rW   r[   r_   rd   objectre   r   rT   r   r   r   r   r   <module>   s.    ( "&"
0
