use voile_util::uid::DBI;
use crate::{
check::{
monad::{TCE, TCMS, TCS},
rules::simplify,
},
syntax::core::{Term, Val, ValData},
};
pub fn expect_data(tcs: TCS, term: Term) -> TCMS<ValData> {
let (val, tcs) = simplify(tcs, term)?;
match val {
Val::Data(d) => Ok((d, tcs)),
e => Err(TCE::not_data(e)),
}
}
pub fn is_eta_var_ref(tcs: TCS, term: &Term, ty: &Term) -> TCMS<Option<DBI>> {
match term {
Term::Whnf(Val::Var(dbi, v)) if v.is_empty() => Ok((Some(*dbi), tcs)),
_ => is_eta_var(tcs, term.clone(), ty.clone()),
}
}
pub fn is_eta_var(tcs: TCS, term: Term, ty: Term) -> TCMS<Option<DBI>> {
let (term, tcs) = simplify(tcs, term)?;
let (ty, tcs) = simplify(tcs, ty)?;
match (term, ty) {
(Val::Var(dbi, v), _) if v.is_empty() => Ok((Some(dbi), tcs)),
_ => unimplemented!(),
}
}