1use std::collections::HashMap;
7use std::sync::LazyLock;
8
9static STDLIB: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
11 let mut m = HashMap::new();
12 m.insert("imath", include_str!("../stdlib/imath.seq"));
13 m.insert("fmath", include_str!("../stdlib/fmath.seq"));
14 m.insert("json", include_str!("../stdlib/json.seq"));
15 m.insert("yaml", include_str!("../stdlib/yaml.seq"));
16 m.insert("http", include_str!("../stdlib/http.seq"));
17 m.insert("stack-utils", include_str!("../stdlib/stack-utils.seq"));
18 m.insert("map", include_str!("../stdlib/map.seq"));
19 m.insert("list", include_str!("../stdlib/list.seq"));
20 m.insert("son", include_str!("../stdlib/son.seq"));
21 m.insert("signal", include_str!("../stdlib/signal.seq"));
22 m.insert("zipper", include_str!("../stdlib/zipper.seq"));
23 m.insert("loops", include_str!("../stdlib/loops.seq"));
24 m.insert("control", include_str!("../stdlib/control.seq"));
25 m
26});
27
28pub fn get_stdlib(name: &str) -> Option<&'static str> {
30 STDLIB.get(name).copied()
31}
32
33pub fn has_stdlib(name: &str) -> bool {
35 STDLIB.contains_key(name)
36}
37
38pub fn stdlib_module_names() -> Vec<&'static str> {
40 let mut names: Vec<&'static str> = STDLIB.keys().copied().collect();
41 names.sort_unstable();
42 names
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn test_imath_stdlib_exists() {
51 assert!(has_stdlib("imath"));
52 let content = get_stdlib("imath").unwrap();
53 assert!(content.contains("abs"));
54 }
55
56 #[test]
57 fn test_fmath_stdlib_exists() {
58 assert!(has_stdlib("fmath"));
59 let content = get_stdlib("fmath").unwrap();
60 assert!(content.contains("f.abs"));
61 }
62
63 #[test]
64 fn test_loops_stdlib_exists() {
65 assert!(has_stdlib("loops"));
66 let content = get_stdlib("loops").unwrap();
67 assert!(content.contains("times"));
68 assert!(content.contains("each-integer"));
69 assert!(content.contains("integer-fold"));
70 }
71
72 #[test]
73 fn test_control_stdlib_exists() {
74 assert!(has_stdlib("control"));
75 let content = get_stdlib("control").unwrap();
76 assert!(content.contains("when"));
77 assert!(content.contains("unless"));
78 }
79
80 #[test]
81 fn test_nonexistent_stdlib() {
82 assert!(!has_stdlib("nonexistent"));
83 assert!(get_stdlib("nonexistent").is_none());
84 }
85}