Files
el/engrams/el-stdlib/src/optional.rs
T
Will Anderson a42429012e rename crates/ to engrams/; add el-compiler el package with bootstrap artifact
- crates/ → engrams/ (Rust engrams live here)
- el-compiler/ added: el self-hosting compiler as an el package
  - src/{compiler,lexer,parser,codegen}.el
  - bootstrap/el-compiler.elc (114KB, Rust-compiled seed)
- el.toml Cargo.toml workspace paths updated
- neuron-rs cross-repo path deps fixed (were pointing to products/ instead of foundation/)
2026-04-29 03:27:32 -05:00

61 lines
2.1 KiB
Rust

//! T? operations: unwrap_or, map, flat_map, is_some, is_none.
use el_types::{Type, TypeEnv};
use super::fn_type;
pub fn register(env: &mut TypeEnv) {
let opt_unk = Type::Optional(Box::new(Type::Unknown));
let mapper = Type::Fn { params: vec![Type::Unknown], return_type: Box::new(Type::Unknown) };
env.register_fn("optional_unwrap_or", fn_type(vec![opt_unk.clone(), Type::Unknown], Type::Unknown));
env.register_fn("optional_unwrap_or_else", fn_type(
vec![opt_unk.clone(), Type::Fn { params: vec![], return_type: Box::new(Type::Unknown) }],
Type::Unknown,
));
env.register_fn("optional_map", fn_type(vec![opt_unk.clone(), mapper.clone()], opt_unk.clone()));
env.register_fn("optional_flat_map", fn_type(vec![opt_unk.clone(), mapper.clone()], opt_unk.clone()));
env.register_fn("optional_is_some", fn_type(vec![opt_unk.clone()], Type::Bool));
env.register_fn("optional_is_none", fn_type(vec![opt_unk.clone()], Type::Bool));
env.register_fn("optional_filter", fn_type(
vec![opt_unk.clone(), Type::Fn { params: vec![Type::Unknown], return_type: Box::new(Type::Bool) }],
opt_unk.clone(),
));
// some(T) -> T?
env.register_fn("some", fn_type(vec![Type::Unknown], opt_unk));
// none() -> T?
env.register_fn("none", fn_type(vec![], Type::Optional(Box::new(Type::Unknown))));
}
#[cfg(test)]
mod tests {
use super::*;
fn env() -> TypeEnv {
let mut e = TypeEnv::with_builtins();
register(&mut e);
e
}
#[test]
fn test_optional_is_some_registered() {
assert!(env().lookup_fn("optional_is_some").is_some());
}
#[test]
fn test_optional_is_none_registered() {
assert!(env().lookup_fn("optional_is_none").is_some());
}
#[test]
fn test_optional_unwrap_or_registered() {
assert!(env().lookup_fn("optional_unwrap_or").is_some());
}
#[test]
fn test_some_and_none_registered() {
let e = env();
assert!(e.lookup_fn("some").is_some());
assert!(e.lookup_fn("none").is_some());
}
}