use crate::types::Effect;
use std::collections::HashMap;
use std::sync::LazyLock;
mod adt;
mod arith;
mod callable;
mod concurrency;
mod diagnostics;
mod float;
mod fs;
mod io;
mod list;
mod macros;
mod map;
mod os;
mod stack;
mod tcp;
mod text;
mod udp;
#[cfg(test)]
mod tests;
type AddSigsFn = fn(&mut HashMap<String, Effect>);
type AddDocsFn = fn(&mut HashMap<&'static str, &'static str>);
const CATEGORIES: &[(&str, AddSigsFn, AddDocsFn)] = &[
("io", io::add_signatures, io::add_docs),
("fs", fs::add_signatures, fs::add_docs),
("arith", arith::add_signatures, arith::add_docs),
("stack", stack::add_signatures, stack::add_docs),
(
"concurrency",
concurrency::add_signatures,
concurrency::add_docs,
),
("callable", callable::add_signatures, callable::add_docs),
("tcp", tcp::add_signatures, tcp::add_docs),
("udp", udp::add_signatures, udp::add_docs),
("os", os::add_signatures, os::add_docs),
("text", text::add_signatures, text::add_docs),
("adt", adt::add_signatures, adt::add_docs),
("list", list::add_signatures, list::add_docs),
("map", map::add_signatures, map::add_docs),
("float", float::add_signatures, float::add_docs),
(
"diagnostics",
diagnostics::add_signatures,
diagnostics::add_docs,
),
];
pub fn builtin_signature(name: &str) -> Option<Effect> {
BUILTIN_SIGNATURES.get(name).cloned()
}
pub fn builtin_signatures() -> HashMap<String, Effect> {
BUILTIN_SIGNATURES.clone()
}
static BUILTIN_SIGNATURES: LazyLock<HashMap<String, Effect>> = LazyLock::new(|| {
let mut sigs = HashMap::new();
for (_, add_sigs, _) in CATEGORIES {
add_sigs(&mut sigs);
}
sigs
});
pub fn builtin_doc(name: &str) -> Option<&'static str> {
BUILTIN_DOCS.get(name).copied()
}
pub fn builtin_categories() -> Vec<(&'static str, Vec<String>)> {
CATEGORIES
.iter()
.map(|(name, add_sigs, _)| {
let mut sigs = HashMap::new();
add_sigs(&mut sigs);
let mut words: Vec<String> = sigs.into_keys().collect();
words.sort();
(*name, words)
})
.collect()
}
pub fn builtin_docs() -> &'static HashMap<&'static str, &'static str> {
&BUILTIN_DOCS
}
static BUILTIN_DOCS: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
let mut docs = HashMap::new();
for (_, _, add_docs) in CATEGORIES {
add_docs(&mut docs);
}
docs
});