o
    㥵i-                     @  s   d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZmZmZmZ edZeeeeef ef ZeG dd	 d	ee ZdddZdddZG dd dee ZdS )    )annotationsN)	dataclass)	AnyDictGenericIteratorListOptionalPatternTupleTypeVar)cast)AnyConvertor	ConvertorStringConvertorcompile_pathTc                   @  s:   e Zd ZU ded< dZded< dZded< dZded	< dS )
TreeNodestr
charactersNzOptional[Pattern]
re_patternzOptional[List[TreeNode]]
next_nodeszOptional[RouteType[T]]route)__name__
__module____qualname____annotations__r   r   r    r   r   D/home/ubuntu/.local/lib/python3.10/site-packages/kui/routing/tree.pyr      s
   
 r   xr   yreturnc                 C  sP   d}t tt| t|D ]}| | || kr| d|   S q| d|d  S )z3
    find the longest common prefix of x and y
    N   )rangeminlen)r   r    ir   r   r   find_common_prefix   s   r(   pointTreeNode[T]path_formatparam_convertorsDict[str, Convertor]c                 C  s  |s| S | j du rt | _ td|}|dur| }|d|d  }|| }t|j}t|tr<|t	|kr<t
dt|trQ|t	|krQ|| dkrQt
ddd | j pXd	D D ]!}|j|k|j|kkrkt
d
|j|kr|t|||d |  S q[t||d}	| j d|	 t|	||d |S |d}|dkrt	|}dd | j pd	D D ]}t|j|d| }
|
dkrq|j|
krt||t	|
d |  S | j |}t|
g d}|| j |< |jt	|
d |_ttt |j d| |d| |
krt|||d |  S t|t	|
| d}	ttt |j d|	 t|	||d |  S t|d| d}	| j d|	 t|	||d |S )z
    Construct the node corresponding to the specified path and return.

    The order of child nodes under the same node is determined by the order of addition.
    Nz^{\w+}r#   z;`AnyConvertor` is only allowed to appear at the end of path/z+Only `/` is allowed after `StringConvertor`c                 s      | ]
}|j d ur|V  qd S Nr   .0noder   r   r   	<genexpr>A       zappend.<locals>.<genexpr>r   z^The same regular matching is used in the same position, but the parameter names are different.)r   r   r   {r"   c                 s      | ]
}|j d u r|V  qd S r0   r1   r2   r   r   r   r5   T   r6    )r   r   )r   )r   listrematchendcompileregex
isinstancer   r&   
ValueErrorr   r   r   appendr   insertfindr(   indextyping_castr   )r)   r+   r,   matchedlength
param_name	convertorr   r4   new_nodeprefix
node_indexprefix_noder   r   r   rB   "   sp   






rB   c                   @  s4   e Zd ZdddZdd	d
ZdddZdddZdS )	RadixTreer!   Nonec                 C  s   t t d| _d S )Nr.   )r   r   root)selfr   r   r   __init__o   s   zRadixTree.__init__pathr   endpointr   c                 C  s^   |d dkr
t dt|\}}t| j|dd  |}|jd ur't d| |||f|_d S )Nr   r.   zpath must start with "/"r#   zRouting conflict: )rA   r   rB   rQ   r   )rR   rT   rU   r+   r,   r)   r   r   r   rB   r   s   
zRadixTree.append7Tuple[RouteType[T], Dict[str, Any]] | Tuple[None, None]c           
      C  s   || j fg}i }|r|| \}}|jd u r"||jsqt|j}nt|j|}|d u r.q| }|||j< t|}|t|krM|j	d u rHdS |j	|fS ||d  }|j
pWd}dd |D D ]	}	|||	f q_dd |D D ]	}	|||	f qp|s
dS )N)NNr   c                 s  r/   r0   r1   r3   childr   r   r   r5          z#RadixTree.search.<locals>.<genexpr>c                 s  r8   r0   r1   rW   r   r   r   r5      rY   )rQ   popr   
startswithr   r&   r;   r<   groupr   r   rB   )
rR   rT   stackparamsr)   rH   none_or_matchresultchildrenr4   r   r   r   search}   s4   




zRadixTree.searchIterator[Tuple[str, T]]c                 c  s^    | j g}|r-| }|jpdD ]}|| q|jd u rq|j\}}}||fV  |sd S d S )Nr   )rQ   rZ   r   rB   r   )rR   r]   r)   r4   r+   _rU   r   r   r   iterator   s   

zRadixTree.iteratorN)r!   rP   )rT   r   rU   r   r!   rP   )rT   r   r!   rV   )r!   rc   )r   r   r   rS   rB   rb   re   r   r   r   r   rO   n   s
    


$rO   )r   r   r    r   r!   r   )r)   r*   r+   r   r,   r-   r!   r*   )
__future__r   r;   dataclassesr   typingr   r   r   r   r   r	   r
   r   r   r   rF   baize.routingr   r   r   r   r   r   	RouteTyper   r(   rB   rO   r   r   r   r   <module>   s    ,

L