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