summaryrefslogtreecommitdiffstats
path: root/examples/prompts/history/slow-history.py
blob: 5b6a7a2f549a660c5fd07772c8014e6261ef1698 (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
#!/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("You said: %s" % text)


if __name__ == "__main__":
    main()