aboutsummaryrefslogtreecommitdiff
path: root/ttwhy/scanners/terminal_concepts.cppm
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-06-20 11:54:06 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-06-20 11:54:06 +0200
commit912e7b10facdd3b2565423206ae25b1d6e4f7dd9 (patch)
treee744bc76893e8b1faa216b1aae93c7ec6e933a04 /ttwhy/scanners/terminal_concepts.cppm
parent280190248bfbadaec4575932dc956401f7bb6390 (diff)
downloadttwhy-912e7b10facdd3b2565423206ae25b1d6e4f7dd9.tar.xz
ttwhy-912e7b10facdd3b2565423206ae25b1d6e4f7dd9.zip
lib: add xterm policy
Diffstat (limited to 'ttwhy/scanners/terminal_concepts.cppm')
-rw-r--r--ttwhy/scanners/terminal_concepts.cppm27
1 files changed, 27 insertions, 0 deletions
diff --git a/ttwhy/scanners/terminal_concepts.cppm b/ttwhy/scanners/terminal_concepts.cppm
new file mode 100644
index 0000000..e82a8d0
--- /dev/null
+++ b/ttwhy/scanners/terminal_concepts.cppm
@@ -0,0 +1,27 @@
+module;
+
+#include <concepts>
+#include <span>
+
+export module ttwhy.scanners:terminal_concepts;
+
+import :terminal_events;
+
+namespace ttwhy
+{
+
+ export template<typename Candidate>
+ concept scanner = requires(Candidate a, std::span<char const> buffer) {
+ { a.process(buffer) } -> std::same_as<void>;
+ { a.timeout() } -> std::same_as<void>;
+ { a.is_pending() } -> std::same_as<bool>;
+ };
+
+ export template<typename Sink>
+ concept ansi_sink = requires(Sink sink) {
+ { sink(std::declval<ttwhy::scanners::character_event>()) } -> std::same_as<void>;
+ { sink(std::declval<ttwhy::scanners::control_event>()) } -> std::same_as<void>;
+ { sink(std::declval<ttwhy::scanners::navigation_event>()) } -> std::same_as<void>;
+ };
+
+} // namespace ttwhy