use crate::term::make as mk_term;
use crate::term::RichTerm;
pub fn modules() -> [StdlibModule; 2] {
[StdlibModule::Std, StdlibModule::Internals]
}
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub enum StdlibModule {
Std,
Internals,
}
impl StdlibModule {
pub fn file_name(&self) -> &'static str {
match self {
StdlibModule::Std => "<stdlib/std.ncl>",
StdlibModule::Internals => "<stdlib/internals.ncl>",
}
}
pub fn name(&self) -> &'static str {
match self {
StdlibModule::Std => "std",
StdlibModule::Internals => "internals",
}
}
pub fn content(&self) -> &'static str {
match self {
StdlibModule::Std => include_str!("../stdlib/std.ncl"),
StdlibModule::Internals => include_str!("../stdlib/internals.ncl"),
}
}
}
pub struct UnknownStdlibModule;
macro_rules! generate_accessor {
($value:ident) => {
pub fn $value() -> RichTerm {
mk_term::var(format!("${}", stringify!($value)))
}
};
}
pub mod internals {
use super::*;
pub fn dynamic() -> RichTerm {
mk_term::var("$dyn")
}
generate_accessor!(num);
generate_accessor!(bool);
generate_accessor!(string);
generate_accessor!(array);
generate_accessor!(array_dyn);
generate_accessor!(func);
generate_accessor!(func_dom);
generate_accessor!(func_codom);
generate_accessor!(func_dyn);
generate_accessor!(forall_var);
generate_accessor!(forall);
generate_accessor!(fail);
generate_accessor!(enums);
generate_accessor!(enum_fail);
generate_accessor!(record);
generate_accessor!(dict_type);
generate_accessor!(dict_contract);
generate_accessor!(dict_dyn);
generate_accessor!(record_extend);
generate_accessor!(forall_tail);
generate_accessor!(dyn_tail);
generate_accessor!(empty_tail);
generate_accessor!(stdlib_contract_equal);
generate_accessor!(rec_default);
generate_accessor!(rec_force);
}