use crate::syntax::{
abs::desugar::DesugarState,
core::{Tele, TermInfo, Val},
};
pub use self::{error::*, meta::*, state::*};
mod error;
mod meta;
mod state;
pub type TCM<T = TCS> = Result<T, TCE>;
pub type TCMS<T> = TCM<(T, TCS)>;
impl TCS {
pub fn under<T>(self, tele: &mut Tele, f: impl FnOnce(TCS) -> TCMS<T>) -> TCMS<T> {
let mut tcs = self;
let gamma_init_len = tcs.gamma.len();
tcs.gamma.append(tele);
let (res, mut tcs) = f(tcs)?;
let mut tele_recover = tcs.gamma.split_off(gamma_init_len);
tele.append(&mut tele_recover);
Ok((res, tcs))
}
pub fn considerate_of(desugar: &DesugarState) -> Self {
let mut tcs = TCS::default();
tcs.reserve_local_variables(desugar.decls.len());
tcs
}
}
pub type TermTCM = TCMS<TermInfo>;
pub type ValTCM = TCMS<Val>;