use std::collections::HashMap; use std::rc::Rc; use dhall_syntax::{Label, V}; use crate::core::thunk::Thunk; use crate::core::value::Value; use crate::core::var::{AlphaVar, Shift, Subst}; use crate::error::TypeError; use crate::phase::{Type, Typed}; #[derive(Debug, Clone)] pub(crate) enum CtxItem { Kept(AlphaVar, T), Replaced(Thunk, T), } #[derive(Debug, Clone)] pub(crate) struct Context(Rc)>>); #[derive(Debug, Clone)] pub(crate) struct NormalizationContext(Context<()>); #[derive(Debug, Clone)] pub(crate) struct TypecheckContext(Context); impl Context { pub(crate) fn new() -> Self { Context(Rc::new(Vec::new())) } pub(crate) fn insert_kept(&self, x: &Label, t: T) -> Self where T: Shift + Clone, { let mut vec = self.0.as_ref().clone(); vec.push((x.clone(), CtxItem::Kept(x.into(), t.shift(1, &x.into())))); Context(Rc::new(vec)) } pub(crate) fn insert_replaced(&self, x: &Label, th: Thunk, t: T) -> Self where T: Clone, { let mut vec = self.0.as_ref().clone(); vec.push((x.clone(), CtxItem::Replaced(th, t))); Context(Rc::new(vec)) } pub(crate) fn lookup(&self, var: &V