1use crate::syntax::{
2 abs::desugar::DesugarState,
3 core::{Tele, TermInfo, Val},
4};
5
6pub use self::{error::*, meta::*, state::*};
7
8mod error;
10mod meta;
12mod state;
14
15pub type TCM<T = TCS> = Result<T, TCE>;
17
18pub type TCMS<T> = TCM<(T, TCS)>;
20
21impl TCS {
22 pub fn under<T>(self, tele: &mut Tele, f: impl FnOnce(TCS) -> TCMS<T>) -> TCMS<T> {
26 let mut tcs = self;
27 let gamma_init_len = tcs.gamma.len();
28 tcs.gamma.append(tele);
29 let (res, mut tcs) = f(tcs)?;
30 let mut tele_recover = tcs.gamma.split_off(gamma_init_len);
31 tele.append(&mut tele_recover);
32 Ok((res, tcs))
33 }
34
35 pub fn considerate_of(desugar: &DesugarState) -> Self {
36 let mut tcs = TCS::default();
37 tcs.reserve_local_variables(desugar.decls.len());
39 tcs
40 }
41}
42
43pub type TermTCM = TCMS<TermInfo>;
45
46pub type ValTCM = TCMS<Val>;