U
    -e8o                     @  s   d dl mZ d dlmZmZmZmZmZ dddddddZdddd	dd
dZ	G dd dZ
G dd dZG dd dZG dd dZG dd dZG dd dZereeeeeeeef f  eeeeeeeeef f  f ZdS )    )annotations)TYPE_CHECKINGIteratorSequenceTupleUnion_AnyOpList | Noneintlist[Editop])opssrc_lendest_lenreturnc           
      C  sH  | sg S t | d dkr*t| || jS g }| D ]~}|\}}}||ksP||kr\d}t|||krx|dkrxd}t|||kr|dkrd}t||dkrq2|t||| q2tdt |d D ]~}	||	d  j||	 jk s||	d  j	||	 j	k rd}t|||	d  j||	 jkr||	d  j	||	 j	krd	}t|q|S )
Nr      List of edit operations invalidinsertdeleteequal   z$List of edit operations out of orderzDuplicated edit operation)
lenOpcodes
as_editops_editops
ValueErrorappendEditoprangesrc_posdest_pos)
r   r   r   blocksop	edit_typer   r   msgi r$   b/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/rapidfuzz/distance/_initialize_py.py_list_to_editops	   s6    
20
r&   list[Opcode]c              	   C  s  | rt | d dkr&t| || jS g }| D ] }|\}}}}}	||ksR|	|kr^d}
t|
||k sn|	|k rzd}
t|
|dkr|| |	| ks||krd}
t|
|dkr||ks||	krd}
t|
|dkr||ks||	krd}
t|
|r:|d j|kr:|d j|kr:|d j|kr:||d _|	|d _q.|t	|||||	 q.|d j
dksr|d jdkr~d}
t|
|d j|ks|d j|krd	}
t|
tdt |d
 D ]F}||d
  j
|| jks||d
  j|| jkrd}
t|
q|S )Nr      r   >   r   replacer   r   z4List of edit operations does not start at position 0z7List of edit operations does not end at the string endsr   z)List of edit operations is not continuous)r   Editops
as_opcodes_opcodesr   tagsrc_enddest_endr   Opcode	src_start
dest_startr   )r   r   r   r   r    r!   r2   r/   r3   r0   r"   r#   r$   r$   r%   _list_to_opcodes8   sT    
 

  4r4   c                   @  sl   e Zd ZdZddddddZddddZd	d
dddZdddddZddddZddddZ	dS )MatchingBlockz1
    Triple describing matching subsequences
    r	   absizec                 C  s   || _ || _|| _d S Nr6   )selfr7   r8   r9   r$   r$   r%   __init__x   s    zMatchingBlock.__init__r   c                 C  s   dS Nr(   r$   r;   r$   r$   r%   __len__}   s    zMatchingBlock.__len__objectboolotherr   c                 C  s^   zBt |dkrW dS t|d | jko>|d | jko>|d | jkW S  tk
rX   Y dS X d S Nr(   Fr   r      )r   rB   r7   r8   r9   	TypeErrorr;   rD   r$   r$   r%   __eq__   s    0zMatchingBlock.__eq__r#   r   c                 C  s:   |dkr| j S |dkr| jS |dkr*| jS d}t|d S )N   r      r      rF   r*   z MatchingBlock index out of range)r7   r8   r9   
IndexErrorr;   r#   r"   r$   r$   r%   __getitem__   s    zMatchingBlock.__getitem__zIterator[int]c                 c  s   t dD ]}| | V  qd S r>   r   r;   r#   r$   r$   r%   __iter__   s    zMatchingBlock.__iter__strc                 C  s   d| j  d| j d| j dS )NzMatchingBlock(a=z, b=z, size=)r6   r?   r$   r$   r%   __repr__   s    zMatchingBlock.__repr__N
__name__
__module____qualname____doc__r<   r@   rI   rR   rU   rX   r$   r$   r$   r%   r5   s   s   	r5   c                   @  sl   e Zd ZdZddddddZdddd	Zd
ddddZdddddZddddZddddZ	dS )r   a  
    Tuple like object describing an edit operation.
    It is in the form (tag, src_pos, dest_pos)

    The tags are strings, with these meanings:

    +-----------+---------------------------------------------------+
    | tag       | explanation                                       |
    +===========+===================================================+
    | 'replace' | src[src_pos] should be replaced by dest[dest_pos] |
    +-----------+---------------------------------------------------+
    | 'delete'  | src[src_pos] should be deleted                    |
    +-----------+---------------------------------------------------+
    | 'insert'  | dest[dest_pos] should be inserted at src[src_pos] |
    +-----------+---------------------------------------------------+
    rV   r	   r.   r   r   c                 C  s   || _ || _|| _d S r:   r^   )r;   r.   r   r   r$   r$   r%   r<      s    zEditop.__init__r=   c                 C  s   dS r>   r$   r?   r$   r$   r%   r@      s    zEditop.__len__rA   rB   rC   c                 C  s^   zBt |dkrW dS t|d | jko>|d | jko>|d | jkW S  tk
rX   Y dS X d S rE   )r   rB   r.   r   r   rG   rH   r$   r$   r%   rI      s    zEditop.__eq__	int | strrJ   c                 C  s:   |dkr| j S |dkr| jS |dkr*| jS d}t|d S )NrK   rM   rO   zEditop index out of range)r.   r   r   rP   rQ   r$   r$   r%   rR      s    zEditop.__getitem__Iterator[int | str]c                 c  s   t dD ]}| | V  qd S r>   rS   rT   r$   r$   r%   rU      s    zEditop.__iter__c                 C  s   d| j d| j d| j dS )NzEditop(tag=z
, src_pos=z, dest_pos=rW   r^   r?   r$   r$   r%   rX      s    zEditop.__repr__NrY   r$   r$   r$   r%   r      s   r   c                   @  sJ  e Zd ZdZd<ddddddZed	d d
ddZd	dddZddddZddddZ	d dddZ
d dddZd ddddZddddd d!Zeddd"d#Zejddd$d%d#Zeddd&d'Zejddd$d(d'Zd)d*d+d,d-Zddd.d/Zd0dd1d2d3Zd0d4d1d5d6Zd7dd8d9Zddd:d;ZdS )=r+   zH
    List like object of Editops describing how to turn s1 into s2.
    Nr   r   r	   )editopsr   r   c                 C  s   || _ || _t|||| _d S r:   )_src_len	_dest_lenr&   r   )r;   ra   r   r   r$   r$   r%   r<      s    zEditops.__init__r   )opcodesr   c                 C  s   |  S )z
        Create Editops from Opcodes

        Parameters
        ----------
        opcodes : Opcodes
            opcodes to convert to editops

        Returns
        -------
        editops : Editops
            Opcodes converted to Editops
        )r   )clsrd   r$   r$   r%   from_opcodes   s    zEditops.from_opcodesr=   c           	   	   C  s  t t }| j|_| j|_g }d}d}d}|t| jk rV|| j| jk sZ|| j| jk r|t	d|| j| j|| j| j | j| j}| j| j}|}|}| j| j
}|t| jk r>| j| j
|kr>|| j| jkr>|| j| jkr>|dkr|d7 }|d7 }n&|dkr"|d7 }n|dkr4|d7 }|d7 }q|t	||||| q*|| jk sn|| jk r|t	d|| j|| j ||_|S )z
        Convert to Opcodes

        Returns
        -------
        opcodes : Opcodes
            Editops converted to Opcodes
        r   r   r)   r   r   r   )r   __new__rb   rc   r   r   r   r   r   r1   r.   r   r   r-   )	r;   xr   r   r   r#   Z	src_beginZ
dest_beginr.   r$   r$   r%   r,      sX    	
 

	





zEditops.as_opcodeslist[MatchingBlock]c                 C  s  g }d}d}| D ]}||j k s(||jk rdt|j | |j| }|dkrX|t||| |j }|j}|jdkr|d7 }|d7 }q|jdkr|d7 }q|jdkr|d7 }q|| jk s|| jk rt| j| | j| }|dkr|t||| |t| j| jd |S )z
        Convert to matching blocks

        Returns
        -------
        matching blocks : list[MatchingBlock]
            Editops converted to matching blocks
        r   r)   r   r   r   )r   r   minr   r5   r.   r   r   )r;   r   r   r   r    lengthr$   r$   r%   as_matching_blocks/  s.    	





zEditops.as_matching_blocksr
   c                 C  s   dd | j D S )zr
        Convert Editops to a list of tuples.

        This is the equivalent of ``[x for x in editops]``
        c                 S  s   g | ]}t |qS r$   tuple.0r    r$   r$   r%   
<listcomp>Y  s     z#Editops.as_list.<locals>.<listcomp>r   r?   r$   r$   r%   as_listS  s    zEditops.as_listc                 C  s.   t t }| j|_| j|_| jdd |_|S )z*
        performs copy of Editops
        N)r+   rg   rb   rc   r   r;   rh   r$   r$   r%   copy[  s
    
zEditops.copyc                 C  sh   g }| D ]:}|j }|dkr d}n|dkr,d}|t||j|j qtt}| j|_| j	|_
||_|S )a  
        Invert Editops, so it describes how to transform the destination string to
        the source string.

        Returns
        -------
        editops : Editops
            inverted Editops

        Examples
        --------
        >>> from rapidfuzz.distance import Levenshtein
        >>> Levenshtein.editops('spam', 'park')
        [Editop(tag=delete, src_pos=0, dest_pos=0),
         Editop(tag=replace, src_pos=3, dest_pos=2),
         Editop(tag=insert, src_pos=4, dest_pos=3)]

        >>> Levenshtein.editops('spam', 'park').inverse()
        [Editop(tag=insert, src_pos=0, dest_pos=0),
         Editop(tag=replace, src_pos=2, dest_pos=3),
         Editop(tag=delete, src_pos=3, dest_pos=4)]
        r   r   )r.   r   r   r   r   r+   rg   r   rb   r   rc   r   r;   r   r    r.   rh   r$   r$   r%   inversee  s    
zEditops.inverseNone)subsequencer   c                 C  s:  t t }| j|_| j|_t|t| kr6d}t|dgt| t|  |_d}d}d}|D ]}|t| kr|| j| kr| j| ||< ||  j|7  _|d7 }|d7 }qb|t| krd}t||jdkr|d7 }n|jdkr|d8 }|d7 }q^|t| kr6| j| ||< ||  j|7  _|d7 }|d7 }q|S )a#  
        remove a subsequence

        Parameters
        ----------
        subsequence : Editops
            subsequence to remove (has to be a subset of editops)

        Returns
        -------
        sequence : Editops
            a copy of the editops without the subsequence
        z subsequence is not a subsequenceNr   r   r   r   )	r+   rg   rb   rc   r   r   r   r   r.   )r;   ry   resultr"   offsetZop_posZ
result_posZsopr$   r$   r%   remove_subsequence  s<    






zEditops.remove_subsequencerV   source_stringdestination_stringr   c                 C  s   d}d}| j D ]r}||jk r2||| 7 }|d7 }q|jdkrT|||j 7 }|d7 }q|jdkrn|||j 7 }q|jdkr|d7 }q|t|k r||| 7 }|d7 }q|S )at  
        apply editops to source_string

        Parameters
        ----------
        source_string : str | bytes
            string to apply editops to
        destination_string : str | bytes
            string to use for replacements / insertions into source_string

        Returns
        -------
        mod_string : str
            modified source_string

         r   r   r)   r   r   )r   r   r.   r   r   )r;   r~   r   res_strr   r    r$   r$   r%   apply  s"    








zEditops.applyc                 C  s   | j S r:   rb   r?   r$   r$   r%   r     s    zEditops.src_lenvaluer   c                 C  s
   || _ d S r:   r   r;   r   r$   r$   r%   r     s    c                 C  s   | j S r:   rc   r?   r$   r$   r%   r     s    zEditops.dest_lenc                 C  s
   || _ d S r:   r   r   r$   r$   r%   r     s    rA   rB   rC   c                 C  s2   t |tsdS | j|jko0| j|jko0| j|jkS NF)
isinstancer+   r   r   r   rH   r$   r$   r%   rI     s    
zEditops.__eq__c                 C  s
   t | jS r:   )r   r   r?   r$   r$   r%   r@     s    zEditops.__len__zint | slicekeyr   c                 C  s   | j |= d S r:   rr   )r;   r   r$   r$   r%   __delitem__  s    zEditops.__delitem__zEditops | Editopc                 C  sn   t |tr| j| S |t| j\}}}|dk r>d}t|tt}| j|_| j	|_	| j||| |_|S )Nr   z6step sizes below 0 lead to an invalid order of editops)
r   r	   r   indicesr   r   r+   rg   rb   rc   )r;   r   startstopstepr"   rh   r$   r$   r%   rR   
  s    


zEditops.__getitem__zIterator[Editop]c                 c  s   | j E d H  d S r:   rr   r?   r$   r$   r%   rU     s    zEditops.__iter__c                 C  s.   dd dd | D  d| j d| j d S )Nz	Editops([, c                 s  s   | ]}t |V  qd S r:   reprro   r$   r$   r%   	<genexpr>  s     z#Editops.__repr__.<locals>.<genexpr>], src_len=, dest_len=rW   joinr   r   r?   r$   r$   r%   rX     s    ,zEditops.__repr__)Nr   r   )rZ   r[   r\   r]   r<   classmethodrf   r,   rl   rs   ru   rw   r|   r   propertyr   setterr   rI   r@   r   rR   rU   rX   r$   r$   r$   r%   r+      s8      
9$
'9)r+   c                   @  sp   e Zd ZdZddddddddZdddd	Zd
ddddZdddddZddddZddddZ	dS )r1   ai  
    Tuple like object describing an edit operation.
    It is in the form (tag, src_start, src_end, dest_start, dest_end)

    The tags are strings, with these meanings:

    +-----------+-----------------------------------------------------+
    | tag       | explanation                                         |
    +===========+=====================================================+
    | 'replace' | src[src_start:src_end] should be                    |
    |           | replaced by dest[dest_start:dest_end]               |
    +-----------+-----------------------------------------------------+
    | 'delete'  | src[src_start:src_end] should be deleted.           |
    |           | Note that dest_start==dest_end in this case.        |
    +-----------+-----------------------------------------------------+
    | 'insert'  | dest[dest_start:dest_end] should be inserted        |
    |           | at src[src_start:src_start].                        |
    |           | Note that src_start==src_end in this case.          |
    +-----------+-----------------------------------------------------+
    | 'equal'   | src[src_start:src_end] == dest[dest_start:dest_end] |
    +-----------+-----------------------------------------------------+

    Note
    ----
    Opcode is compatible with the tuples returned by difflib's SequenceMatcher to make them
    interoperable
    rV   r	   r.   r2   r/   r3   r0   c                 C  s"   || _ || _|| _|| _|| _d S r:   r   )r;   r.   r2   r/   r3   r0   r$   r$   r%   r<   ?  s
    zOpcode.__init__r=   c                 C  s   dS Nr   r$   r?   r$   r$   r%   r@   F  s    zOpcode.__len__rA   rB   rC   c                 C  sz   z^t |dkrW dS t|d | jkoZ|d | jkoZ|d | jkoZ|d | jkoZ|d | jkW S  tk
rt   Y dS X d S Nr   Fr   r   rF   r(      )r   rB   r.   r2   r/   r3   r0   rG   rH   r$   r$   r%   rI   I  s    zOpcode.__eq__r_   rJ   c                 C  sV   |dkr| j S |dkr| jS |dkr*| jS |dkr8| jS |dkrF| jS d}t|d S N>   r   >   r   >   rF   rL   >   r(   rN   >   r   r*   zOpcode index out of range)r.   r2   r/   r3   r0   rP   rQ   r$   r$   r%   rR   X  s    zOpcode.__getitem__r`   c                 c  s   t dD ]}| | V  qd S r   rS   rT   r$   r$   r%   rU   g  s    zOpcode.__iter__c                 C  s.   d| j d| j d| j d| j d| j dS )NzOpcode(tag=, src_start=
, src_end=, dest_start=, dest_end=rW   r   r?   r$   r$   r%   rX   k  s    ,zOpcode.__repr__NrY   r$   r$   r$   r%   r1   "  s   r1   c                   @  s*  e Zd ZdZd6ddddddZed	d d
ddZd	dddZddddZddddZ	d dddZ
d dddZddddddZeddddZejdd d!d"dZeddd#d$Zejdd d!d%d$Zd&d'd(d)d*Zddd+d,Zdd-d.d/d0Zd1dd2d3Zddd4d5ZdS )7r   a  
    List like object of Opcodes describing how to turn s1 into s2.
    The first Opcode has src_start == dest_start == 0, and remaining tuples
    have src_start == the src_end from the tuple preceding it,
    and likewise for dest_start == the previous dest_end.
    Nr   r   r	   )rd   r   r   c                 C  s   || _ || _t|||| _d S r:   )rb   rc   r4   r-   )r;   rd   r   r   r$   r$   r%   r<   z  s    zOpcodes.__init__r+   )ra   r   c                 C  s   |  S )z
        Create Opcodes from Editops

        Parameters
        ----------
        editops : Editops
            editops to convert to opcodes

        Returns
        -------
        opcodes : Opcodes
            Editops converted to Opcodes
        )r,   )re   ra   r$   r$   r%   from_editops  s    zOpcodes.from_editopsr=   c              	   C  s   t t }| j|_| j|_g }| D ]}|jdkrft|j|j D ]"}|t	d|j| |j
|  q@q"|jdkrt|j|j
 D ]}|t	d|j|j
|  qq"|jdkr"t|j|j D ]}|t	d|j| |j
 qq"||_|S )z
        Convert Opcodes to Editops

        Returns
        -------
        editops : Editops
            Opcodes converted to Editops
        r)   r   r   )r+   rg   rb   rc   r.   r   r/   r2   r   r   r3   r0   r   )r;   rh   r   r    jr$   r$   r%   r     s     	

"

zOpcodes.as_editopsri   c                 C  sj   g }| D ]F}|j dkrt|j|j |j|j }|dkr|t|j|j| q|t| j| j	d |S )z
        Convert to matching blocks

        Returns
        -------
        matching blocks : list[MatchingBlock]
            Opcodes converted to matching blocks
        r   r   )
r.   rj   r/   r2   r0   r3   r   r5   r   r   )r;   r   r    rk   r$   r$   r%   rl     s    	
zOpcodes.as_matching_blocksr'   c                 C  s   dd | j D S )z
        Convert Opcodes to a list of tuples, which is compatible
        with the opcodes of difflibs SequenceMatcher.

        This is the equivalent of ``[x for x in opcodes]``
        c                 S  s   g | ]}t |qS r$   rm   ro   r$   r$   r%   rq     s     z#Opcodes.as_list.<locals>.<listcomp>r-   r?   r$   r$   r%   rs     s    zOpcodes.as_listc                 C  s.   t t }| j|_| j|_| jdd |_|S )z*
        performs copy of Opcodes
        N)r   rg   rb   rc   r-   rt   r$   r$   r%   ru     s
    
zOpcodes.copyc              	   C  sp   g }| D ]B}|j }|dkr d}n|dkr,d}|t||j|j|j|j qtt}| j	|_
| j|_||_|S )a  
        Invert Opcodes, so it describes how to transform the destination string to
        the source string.

        Returns
        -------
        opcodes : Opcodes
            inverted Opcodes

        Examples
        --------
        >>> from rapidfuzz.distance import Levenshtein
        >>> Levenshtein.opcodes('spam', 'park')
        [Opcode(tag=delete, src_start=0, src_end=1, dest_start=0, dest_end=0),
         Opcode(tag=equal, src_start=1, src_end=3, dest_start=0, dest_end=2),
         Opcode(tag=replace, src_start=3, src_end=4, dest_start=2, dest_end=3),
         Opcode(tag=insert, src_start=4, src_end=4, dest_start=3, dest_end=4)]

        >>> Levenshtein.opcodes('spam', 'park').inverse()
        [Opcode(tag=insert, src_start=0, src_end=0, dest_start=0, dest_end=1),
         Opcode(tag=equal, src_start=0, src_end=2, dest_start=1, dest_end=3),
         Opcode(tag=replace, src_start=2, src_end=3, dest_start=3, dest_end=4),
         Opcode(tag=delete, src_start=3, src_end=4, dest_start=4, dest_end=4)]
        r   r   )r.   r   r1   r3   r0   r2   r/   r   rg   r   rb   r   rc   r-   rv   r$   r$   r%   rw     s     
zOpcodes.inverserV   r}   c                 C  sR   d}| j D ]B}|jdkr.|||j|j 7 }q
|jdkr
|||j|j 7 }q
|S )at  
        apply opcodes to source_string

        Parameters
        ----------
        source_string : str | bytes
            string to apply opcodes to
        destination_string : str | bytes
            string to use for replacements / insertions into source_string

        Returns
        -------
        mod_string : str
            modified source_string

        r   r   >   r   r)   )r-   r.   r2   r/   r3   r0   )r;   r~   r   r   r    r$   r$   r%   r     s    


zOpcodes.applyc                 C  s   | j S r:   r   r?   r$   r$   r%   r     s    zOpcodes.src_lenrx   r   c                 C  s
   || _ d S r:   r   r   r$   r$   r%   r     s    c                 C  s   | j S r:   r   r?   r$   r$   r%   r   "  s    zOpcodes.dest_lenc                 C  s
   || _ d S r:   r   r   r$   r$   r%   r   &  s    rA   rB   rC   c                 C  s2   t |tsdS | j|jko0| j|jko0| j|jkS r   )r   r   r   r   r-   rH   r$   r$   r%   rI   *  s    
zOpcodes.__eq__c                 C  s
   t | jS r:   )r   r-   r?   r$   r$   r%   r@   0  s    zOpcodes.__len__r1   r   c                 C  s$   t |tr| j| S d}t|d S )NzExpected index)r   r	   r-   rG   )r;   r   r"   r$   r$   r%   rR   3  s    

zOpcodes.__getitem__zIterator[Opcode]c                 c  s   | j E d H  d S r:   r   r?   r$   r$   r%   rU   :  s    zOpcodes.__iter__c                 C  s.   dd dd | D  d| j d| j d S )Nz	Opcodes([r   c                 s  s   | ]}t |V  qd S r:   r   ro   r$   r$   r%   r   ?  s     z#Opcodes.__repr__.<locals>.<genexpr>r   r   rW   r   r?   r$   r$   r%   rX   =  s    ,zOpcodes.__repr__)Nr   r   )rZ   r[   r\   r]   r<   r   r   r   rl   rs   ru   rw   r   r   r   r   r   rI   r@   rR   rU   rX   r$   r$   r$   r%   r   r  s4   	   
	
)r   c                   @  sp   e Zd ZdZddddddddZdddd	Zd
ddddZdddddZddddZddddZ	dS )ScoreAlignmentz
    Tuple like object describing the position of the compared strings in
    src and dest.

    It indicates that the score has been calculated between
    src[src_start:src_end] and dest[dest_start:dest_end]
    zint | floatr	   scorer2   r/   r3   r0   c                 C  s"   || _ || _|| _|| _|| _d S r:   r   )r;   r   r2   r/   r3   r0   r$   r$   r%   r<   L  s
    zScoreAlignment.__init__r=   c                 C  s   dS r   r$   r?   r$   r$   r%   r@   Z  s    zScoreAlignment.__len__rA   rB   rC   c                 C  sz   z^t |dkrW dS t|d | jkoZ|d | jkoZ|d | jkoZ|d | jkoZ|d | jkW S  tk
rt   Y dS X d S r   )r   rB   r   r2   r/   r3   r0   rG   rH   r$   r$   r%   rI   ]  s    zScoreAlignment.__eq__rJ   c                 C  sV   |dkr| j S |dkr| jS |dkr*| jS |dkr8| jS |dkrF| jS d}t|d S r   )r   r2   r/   r3   r0   rP   rQ   r$   r$   r%   rR   l  s    zScoreAlignment.__getitem__zIterator[int | float]c                 c  s   t dD ]}| | V  qd S r   rS   rT   r$   r$   r%   rU   {  s    zScoreAlignment.__iter__rV   c                 C  s.   d| j  d| j d| j d| j d| j dS )NzScoreAlignment(score=r   r   r   r   rW   r   r?   r$   r$   r%   rX     s    ,zScoreAlignment.__repr__NrY   r$   r$   r$   r%   r   C  s   r   N)
__future__r   typingr   r   r   r   r   r&   r4   r5   r   r+   r1   r   r   rV   r	   Z
_AnyOpListr$   r$   r$   r%   <module>   s$   /;):  NP RC