| 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 |
|
|