Skip to main content

seqc/
stdlib_embed.rs

1//! Embedded Standard Library
2//!
3//! Contains stdlib modules embedded at compile time.
4//! This makes seqc fully self-contained - no need for external stdlib files.
5
6use std::collections::HashMap;
7use std::sync::LazyLock;
8
9/// Embedded stdlib files (name -> content)
10static 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
28/// Get an embedded stdlib module by name
29pub fn get_stdlib(name: &str) -> Option<&'static str> {
30    STDLIB.get(name).copied()
31}
32
33/// Check if a stdlib module exists (embedded)
34pub fn has_stdlib(name: &str) -> bool {
35    STDLIB.contains_key(name)
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    #[test]
43    fn test_imath_stdlib_exists() {
44        assert!(has_stdlib("imath"));
45        let content = get_stdlib("imath").unwrap();
46        assert!(content.contains("abs"));
47    }
48
49    #[test]
50    fn test_fmath_stdlib_exists() {
51        assert!(has_stdlib("fmath"));
52        let content = get_stdlib("fmath").unwrap();
53        assert!(content.contains("f.abs"));
54    }
55
56    #[test]
57    fn test_loops_stdlib_exists() {
58        assert!(has_stdlib("loops"));
59        let content = get_stdlib("loops").unwrap();
60        assert!(content.contains("times"));
61        assert!(content.contains("each-integer"));
62        assert!(content.contains("integer-fold"));
63    }
64
65    #[test]
66    fn test_control_stdlib_exists() {
67        assert!(has_stdlib("control"));
68        let content = get_stdlib("control").unwrap();
69        assert!(content.contains("when"));
70        assert!(content.contains("unless"));
71    }
72
73    #[test]
74    fn test_nonexistent_stdlib() {
75        assert!(!has_stdlib("nonexistent"));
76        assert!(get_stdlib("nonexistent").is_none());
77    }
78}