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 enum CtxItem { Kept(AlphaVar, T), Replaced(Thunk, T), } #[derive(Debug, Clone)] pub struct Context(Rc)>>); #[derive(Debug, Clone)] pub struct NormalizationContext(Context<()>); #[derive(Debug, Clone)] pub struct TypecheckContext(Context); impl Context { pub fn new() -> Self { Context(Rc::new(Vec::new())) } pub 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.under_binder(x)))); Context(Rc::new(vec)) } pub 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 fn lookup(&self, var: &V