a42429012e
- 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/)
61 lines
2.1 KiB
Rust
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());
|
|
}
|
|
}
|