Skip to main content

seqc/
builtins.rs

1//! Built-in word signatures for Seq
2//!
3//! Defines the stack effects for all runtime built-in operations.
4//!
5//! The signatures and docs are split across per-category sub-modules under
6//! `builtins/`, each exposing an `add_signatures(&mut sigs)` and an
7//! `add_docs(&mut docs)` helper. This file composes them into the public
8//! `builtin_signatures()` and `builtin_docs()` maps.
9
10use crate::types::Effect;
11use std::collections::HashMap;
12use std::sync::LazyLock;
13
14mod adt;
15mod arith;
16mod callable;
17mod concurrency;
18mod diagnostics;
19mod float;
20mod fs;
21mod io;
22mod list;
23mod macros;
24mod map;
25mod os;
26mod stack;
27mod tcp;
28mod text;
29mod udp;
30
31#[cfg(test)]
32mod tests;
33
34/// Get the stack-effect signature for a built-in word.
35pub fn builtin_signature(name: &str) -> Option<Effect> {
36    BUILTIN_SIGNATURES.get(name).cloned()
37}
38
39/// Build the full map of built-in word signatures.
40///
41/// Clones the cached map so callers that wanted ownership (e.g. tests,
42/// `TypeChecker::register_external_words`) keep working unchanged.
43pub fn builtin_signatures() -> HashMap<String, Effect> {
44    BUILTIN_SIGNATURES.clone()
45}
46
47static BUILTIN_SIGNATURES: LazyLock<HashMap<String, Effect>> = LazyLock::new(|| {
48    let mut sigs = HashMap::new();
49    io::add_signatures(&mut sigs);
50    fs::add_signatures(&mut sigs);
51    arith::add_signatures(&mut sigs);
52    stack::add_signatures(&mut sigs);
53    concurrency::add_signatures(&mut sigs);
54    callable::add_signatures(&mut sigs);
55    tcp::add_signatures(&mut sigs);
56    udp::add_signatures(&mut sigs);
57    os::add_signatures(&mut sigs);
58    text::add_signatures(&mut sigs);
59    adt::add_signatures(&mut sigs);
60    list::add_signatures(&mut sigs);
61    map::add_signatures(&mut sigs);
62    float::add_signatures(&mut sigs);
63    diagnostics::add_signatures(&mut sigs);
64    sigs
65});
66
67/// Get documentation for a built-in word.
68pub fn builtin_doc(name: &str) -> Option<&'static str> {
69    BUILTIN_DOCS.get(name).copied()
70}
71
72/// Get all built-in word documentation (cached with LazyLock for performance).
73pub fn builtin_docs() -> &'static HashMap<&'static str, &'static str> {
74    &BUILTIN_DOCS
75}
76
77static BUILTIN_DOCS: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
78    let mut docs = HashMap::new();
79    io::add_docs(&mut docs);
80    fs::add_docs(&mut docs);
81    arith::add_docs(&mut docs);
82    stack::add_docs(&mut docs);
83    concurrency::add_docs(&mut docs);
84    callable::add_docs(&mut docs);
85    tcp::add_docs(&mut docs);
86    udp::add_docs(&mut docs);
87    os::add_docs(&mut docs);
88    text::add_docs(&mut docs);
89    adt::add_docs(&mut docs);
90    list::add_docs(&mut docs);
91    map::add_docs(&mut docs);
92    float::add_docs(&mut docs);
93    diagnostics::add_docs(&mut docs);
94    docs
95});