o
    Df                     @  sf   d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZ dgZG d	d deZd
S )z"
Completer for a regular grammar.
    )annotations)Iterable)CompleteEvent	Completer
Completion)Document   )Match_CompiledGrammarGrammarCompleterc                   @  s8   e Zd ZdZddd	ZdddZdddZdddZdS )r   af  
    Completer which can be used for autocompletion according to variables in
    the grammar. Each variable can have a different autocompleter.

    :param compiled_grammar: `GrammarCompleter` instance.
    :param completers: `dict` mapping variable names of the grammar to the
                       `Completer` instances to be used for each variable.
    compiled_grammarr
   
completersdict[str, Completer]returnNonec                 C  s   || _ || _d S N)r   r   )selfr   r    r   l/home/ubuntu/webapp/venv/lib/python3.10/site-packages/prompt_toolkit/contrib/regular_languages/completion.py__init__   s   
zGrammarCompleter.__init__documentr   complete_eventr   Iterable[Completion]c                 c  s4    | j |j}|r| | ||E d H  d S d S r   )r   match_prefixtext_before_cursor_remove_duplicates_get_completions_for_match)r   r   r   mr   r   r   get_completions#   s   
z GrammarCompleter.get_completionsmatchr	   c                 c  s    |  D ]M}|j}|j}| j|}|rR|j}| j||}t|t	|}	|
|	|D ]%}
|dt	||
j  |
j }t| j|||t	|j |
j|
jdV  q,qdS )z
        Yield all the possible completions for this input string.
        (The completer assumes that the cursor position was at the end of the
        input string.)
        N)textstart_positiondisplaydisplay_meta)	end_nodesvarnamestartr   getvaluer   unescaper   lenr   r!   r    r   escapestringr"   r#   )r   r   r   match_variabler%   r&   	completerr    unwrapped_textr   
completionnew_textr   r   r   r   -   s,   
z+GrammarCompleter._get_completions_for_matchitemsc                 c  s@    ddd}t  }|D ]}||}||vr|| |V  qdS )	z
        Remove duplicates, while keeping the order.
        (Sometimes we have duplicates, because the there several matches of the
        same grammar, each yielding similar completions.)
        r0   r   r   tuple[str, int]c                 S  s   | j | jfS r   )r    r!   )r0   r   r   r   hash_completionZ   s   z<GrammarCompleter._remove_duplicates.<locals>.hash_completionN)r0   r   r   r3   )setadd)r   r2   r4   yielded_so_farr0   
hash_valuer   r   r   r   S   s   

z#GrammarCompleter._remove_duplicatesN)r   r
   r   r   r   r   )r   r   r   r   r   r   )r   r	   r   r   r   r   )r2   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r      s    
	


&N)r<   
__future__r   typingr   prompt_toolkit.completionr   r   r   prompt_toolkit.documentr   compilerr	   r
   __all__r   r   r   r   r   <module>   s    