
    $g                     r    d dl mZmZmZ ddlmZ dgZdedee         dee         fdZ G d	 d
          Z	dS )    )
CollectionOptionalList   )natural_comparison_keysuggestion_listinput_optionsreturnc                     i t          |           }t          t          |           dz            dz   }|D ]}|                    ||          }|||<    t	          fd          S )zGet list with suggestions for a given input.

    Given an invalid input string and list of valid options, returns a filtered list
    of valid options sorted based on their similarity with the input.
    g?r   Nc                 N                         | d          t          |           fS )Nr   )getr   )optionoptions_by_distances    _/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/graphql/pyutils/suggestion_list.py<lambda>z!suggestion_list.<locals>.<lambda>   s(    ##FA.."6**
     )key)LexicalDistanceintlenmeasuresorted)r	   r
   lexical_distance	thresholdr   distancer   s         @r   r   r      s     &v..CKK#%&&*I 3 3#++FI>>*2' 
 
 
 
   r   c                       e Zd ZU dZeed<   eed<   ee         ed<   eee                  ed<   defdZded	ed
e	e         fdZ
dS )r   a  Computes the lexical distance between strings A and B.

    The "distance" between two strings is given by counting the minimum number of edits
    needed to transform string A into string B. An edit can be an insertion, deletion,
    or substitution of a single character, or a swap of two adjacent characters.

    This distance can be useful for detecting typos in input or sorting.
    _input_input_lower_case_input_list_rowsr	   c                     || _         |                                | _        t          |          dz   }t	          t          t          | j                            | _        dg|z  dg|z  dg|z  g| _        d S )Nr   r   )	r   lowerr   r   listmapordr    r!   )selfr	   row_sizes      r   __init__zLexicalDistance.__init__0   si    !'v;;?C)? @ @AAcHnqcHnqcHnE


r   r   r   r   c           	         | j         |k    rdS |                                }| j        |k    rdS t          t	          t
          |                    | j        }}t          |          t          |          }}||k     r||}}||}}||z
  |k    rd S | j        }t          |dz             D ]}	|	|d         |	<   t          d|dz             D ]}
||
dz
  dz           }||
dz           }|
x}|d<   t          d|dz             D ]}	||
dz
           ||	dz
           k    rdnd}t          ||	         dz   ||	dz
           dz   ||	dz
           |z             }|
dk    r`|	dk    rZ||
dz
           ||	dz
           k    rB||
dz
           ||	dz
           k    r*||
dz
  dz           |	dz
           }t          ||dz             }||k     r|}|||	<   ||k    r d S ||dz           |         }||k    r|nd S )Nr   r         )r   r#   r   r$   r%   r&   r    r   r!   rangemin)r'   r   r   option_lower_caseaba_lenb_lenrowsjiup_rowcurrent_rowsmallest_cellcostcurrent_celldouble_diagonal_cellr   s                     r   r   zLexicalDistance.measure8   sf   ;&  1"LLNN !%6661C.//00$2B11vvs1vvu5==aqA %5E5=9$$4zuqy!! 	 	ADGAJJq%!)$$ 	 	A1q5A+&Fq1u+K-..MKN1eai(( . .a!eH!a%00qqa"1IMA&*1q5MD(    q55QUUqQx1QU8';';!a%AaRSeH@T@T+/Q!+<QU+C(#&|5IA5M#N#NL-//$0M!-A y((tt ) 	?5)#y00xxd:r   N)__name__
__module____qualname____doc__str__annotations__r   r   r)   r   r    r   r   r   r   !   s           KKKcS	?Fs F F F F5;c 5;c 5;hsm 5; 5; 5; 5; 5; 5;r   r   N)
typingr   r   r   natural_comparer   __all__rA   r   r   rC   r   r   <module>rG      s    - - - - - - - - - - 3 3 3 3 3 3
C *S/ d3i    2L; L; L; L; L; L; L; L; L; L;r   