| | from __future__ import annotations |
| |
|
| | from typing import Iterable |
| |
|
| | from prompt_toolkit.document import Document |
| |
|
| | from .base import CompleteEvent, Completer, Completion |
| |
|
| | __all__ = ["DeduplicateCompleter"] |
| |
|
| |
|
| | class DeduplicateCompleter(Completer): |
| | """ |
| | Wrapper around a completer that removes duplicates. Only the first unique |
| | completions are kept. |
| | |
| | Completions are considered to be a duplicate if they result in the same |
| | document text when they would be applied. |
| | """ |
| |
|
| | def __init__(self, completer: Completer) -> None: |
| | self.completer = completer |
| |
|
| | def get_completions( |
| | self, document: Document, complete_event: CompleteEvent |
| | ) -> Iterable[Completion]: |
| | |
| | found_so_far: set[str] = set() |
| |
|
| | for completion in self.completer.get_completions(document, complete_event): |
| | text_if_applied = ( |
| | document.text[: document.cursor_position + completion.start_position] |
| | + completion.text |
| | + document.text[document.cursor_position :] |
| | ) |
| |
|
| | if text_if_applied == document.text: |
| | |
| | continue |
| |
|
| | if text_if_applied in found_so_far: |
| | continue |
| |
|
| | found_so_far.add(text_if_applied) |
| | yield completion |
| |
|