summaryrefslogtreecommitdiffstats
path: root/examples/prompts/history/slow-history.py
blob: 10e45921e207e2ec3da2222c46c4f69f4cb5005f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python
"""
Simple example of a custom, very slow history, that is loaded asynchronously.

By wrapping it in `ThreadedHistory`, the history will load in the background
without blocking any user interaction.
"""

import time

from prompt_toolkit import PromptSession
from prompt_toolkit.history import History, ThreadedHistory


class SlowHistory(History):
    """
    Example class that loads the history very slowly...
    """

    def load_history_strings(self):
        for i in range(1000):
            time.sleep(1)  # Emulate slowness.
            yield f"item-{i}"

    def store_string(self, string):
        pass  # Don't store strings.


def main():
    print(
        "Asynchronous loading of history. Notice that the up-arrow will work "
        "for as far as the completions are loaded.\n"
        "Even when the input is accepted, loading will continue in the "
        "background and when the next prompt is displayed.\n"
    )
    our_history = ThreadedHistory(SlowHistory())

    # The history needs to be passed to the `PromptSession`. It can't be passed
    # to the `prompt` call because only one history can be used during a
    # session.
    session = PromptSession(history=our_history)

    while True:
        text = session.prompt("Say something: ")
        print(f"You said: {text}")


if __name__ == "__main__":
    main()