summaryrefslogtreecommitdiff
path: root/dhall/src/semantics/nze/env.rs
diff options
context:
space:
mode:
authorNadrieril2020-02-09 22:30:32 +0000
committerNadrieril2020-02-09 22:30:32 +0000
commit35cc98dc767247f4881866de40c7d8dd82eba8a5 (patch)
tree586179e338232b9b389e1ec4d8c96f018d6ab70a /dhall/src/semantics/nze/env.rs
parentf6732982c522dd579d378ab4820001d5ae107c43 (diff)
Remove types from NzEnv
Diffstat (limited to 'dhall/src/semantics/nze/env.rs')
-rw-r--r--dhall/src/semantics/nze/env.rs42
1 files changed, 25 insertions, 17 deletions
diff --git a/dhall/src/semantics/nze/env.rs b/dhall/src/semantics/nze/env.rs
index ff52343..5b036f0 100644
--- a/dhall/src/semantics/nze/env.rs
+++ b/dhall/src/semantics/nze/env.rs
@@ -1,4 +1,4 @@
-use crate::semantics::{AlphaVar, Type, Value, ValueKind};
+use crate::semantics::{AlphaVar, Value, ValueKind};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum NzVar {
@@ -9,7 +9,7 @@ pub(crate) enum NzVar {
}
#[derive(Debug, Clone)]
-enum NzEnvItem {
+enum EnvItem<Type> {
// Variable is bound with given type
Kept(Type),
// Variable has been replaced by corresponding value
@@ -17,10 +17,12 @@ enum NzEnvItem {
}
#[derive(Debug, Clone)]
-pub(crate) struct NzEnv {
- items: Vec<NzEnvItem>,
+pub(crate) struct ValEnv<Type> {
+ items: Vec<EnvItem<Type>>,
}
+pub(crate) type NzEnv = ValEnv<()>;
+
impl NzVar {
pub fn new(idx: usize) -> Self {
NzVar::Bound(idx)
@@ -44,37 +46,43 @@ impl NzVar {
}
}
-impl NzEnv {
+impl<Type: Clone> ValEnv<Type> {
pub fn new() -> Self {
- NzEnv { items: Vec::new() }
+ ValEnv { items: Vec::new() }
+ }
+ pub fn discard_types(&self) -> ValEnv<()> {
+ let items = self
+ .items
+ .iter()
+ .map(|i| match i {
+ EnvItem::Kept(_) => EnvItem::Kept(()),
+ EnvItem::Replaced(val, _) => EnvItem::Replaced(val.clone(), ()),
+ })
+ .collect();
+ ValEnv { items }
}
pub fn insert_type(&self, ty: Type) -> Self {
let mut env = self.clone();
- env.items.push(NzEnvItem::Kept(ty));
+ env.items.push(EnvItem::Kept(ty));
env
}
pub fn insert_value(&self, e: Value, ty: Type) -> Self {
let mut env = self.clone();
- env.items.push(NzEnvItem::Replaced(e, ty));
+ env.items.push(EnvItem::Replaced(e, ty));
env
}
- pub fn insert_value_noty(&self, e: Value) -> Self {
- // TODO
- let ty = Value::const_sort();
- self.insert_value(e, ty)
- }
pub fn lookup_val(&self, var: &AlphaVar) -> ValueKind {
let idx = self.items.len() - 1 - var.idx();
match &self.items[idx] {
- NzEnvItem::Kept(_) => ValueKind::Var(NzVar::new(idx)),
- NzEnvItem::Replaced(x, _) => x.kind().clone(),
+ EnvItem::Kept(_) => ValueKind::Var(NzVar::new(idx)),
+ EnvItem::Replaced(x, _) => x.kind().clone(),
}
}
- pub fn lookup_ty(&self, var: &AlphaVar) -> Value {
+ pub fn lookup_ty(&self, var: &AlphaVar) -> Type {
let idx = self.items.len() - 1 - var.idx();
match &self.items[idx] {
- NzEnvItem::Kept(ty) | NzEnvItem::Replaced(_, ty) => ty.clone(),
+ EnvItem::Kept(ty) | EnvItem::Replaced(_, ty) => ty.clone(),
}
}
}