use crate::{subst::shift, term::Term};
#[derive(Debug, Clone)]
pub enum CtxEntry {
Var(Term),
Let(Term, Term),
}
impl CtxEntry {
pub fn ty(&self) -> &Term {
match self {
CtxEntry::Var(a) | CtxEntry::Let(a, _) => a,
}
}
}
pub type Ctx = Vec<CtxEntry>;
pub fn ctx_lookup(ctx: &Ctx, i: usize) -> Option<CtxEntry> {
let entry = ctx.get(i)?;
let n = (i + 1) as u64;
Some(match entry {
CtxEntry::Var(a) => CtxEntry::Var(shift(a, n)),
CtxEntry::Let(a, v) => CtxEntry::Let(shift(a, n), shift(v, n)),
})
}
pub fn push_var(ctx: &mut Ctx, ty: Term) {
ctx.insert(0, CtxEntry::Var(ty));
}
pub fn push_let(ctx: &mut Ctx, ty: Term, val: Term) {
ctx.insert(0, CtxEntry::Let(ty, val));
}