o
    mi	                     @   sJ   d Z ddlZddlmZ ddlmZ ejG dd dZG dd dZdS )	z
A parse tree.
    N)Iterable)replacec                   @   sB   e Zd ZU dZeed< ejedZ	eed f ed< dZ
eed< dS )TreeNodezj
    Private class that creates the tree data structure from the orthography profile for
    parsing.
    char)default_factorychildrenFsentinelN)__name__
__module____qualname____doc__str__annotations__dataclassesfielddictr   r   bool r   r   G/home/kim/smarthome/.venv/lib/python3.10/site-packages/segments/tree.pyr   
   s
   
 r   c                
   @   sb   e Zd ZdZdee fddZefdedee fddZ	d	e
ded
edeee ef fddZdS )Treez
    The parse tree.

    >>> t = Tree('abcdefg')
    >>> t.parse('abcde')
    ['a', 'b', 'c', 'd', 'e']
    >>> t = Tree(['ab', 'c', 'de'])
    >>> t.parse('abcde')
    ['ab', 'c', 'de']
    	graphemesc                 C   s0   dd }t ddd| _|D ]}|| j| qd S )Nc                 S   s&   |D ]}| j |t|} qd| _d S )NT)r   
setdefaultr   r   )nodeliner   r   r   r   _multigraph!   s   
z"Tree.__init__.<locals>._multigraph T)r   )r   root)selfr   r   Zgraphemer   r   r   __init__    s
   zTree.__init__r   returnc                 C   st   |  | j|d\}}||d }|r8|||d  |dd }|  | j|d\}}|| ||d }|s|S )zSegment `line` into graphemes.r   N   )_parser   appendextend)r   r   errorresidxremrir   r   r   parse+   s   
z
Tree.parser   r&   c           	      C   s   t |dkr
g |fS g }d}|}|}|t |k rK|j|| }|d7 }|s'n$|jrE| |||d || \}}|d| g}|| |t |k s|rO|}||fS )z
        :param root: Tree node.
        :param line: String to parse.
        :param idx: Global counter of characters parsed.
        :return: (list of parsed graphemes, incremented character count)
        r   r    N)lenr   getr   r!   r#   )	r   r   r   r&   r*   currr   ZcidxZsubparser   r   r   r!   8   s&   
zTree._parseN)r	   r
   r   r   r   r   r   r   listr*   r   inttupler!   r   r   r   r   r      s
    
*r   )	r   r   collections.abcr   Zsegments.errorsr   	dataclassr   r   r   r   r   r   <module>   s    
