summaryrefslogtreecommitdiff
path: root/dhall/src/semantics
diff options
context:
space:
mode:
authorNadrieril Feneanar2020-03-18 00:01:11 +0000
committerGitHub2020-03-18 00:01:11 +0000
commitf42ab8acdaa4dee753b7daccfed1ca3c8738095a (patch)
tree9fba7dd6d865884c0651af2dd7e01b243a0f25f0 /dhall/src/semantics
parent71fddc59b5b427f52dd2f0cd76f788eb995a4e2e (diff)
parent40441abd2d6c2938244fa1bb2ca26ee9b8e4ab27 (diff)
Merge pull request #146 from Nadrieril/never_never
Use stable toolchain 🎉
Diffstat (limited to '')
-rw-r--r--dhall/src/semantics/nze/normalize.rs27
-rw-r--r--dhall/src/semantics/tck/typecheck.rs4
2 files changed, 15 insertions, 16 deletions
diff --git a/dhall/src/semantics/nze/normalize.rs b/dhall/src/semantics/nze/normalize.rs
index 08e3e87..79d55e8 100644
--- a/dhall/src/semantics/nze/normalize.rs
+++ b/dhall/src/semantics/nze/normalize.rs
@@ -58,20 +58,21 @@ pub(crate) fn squash_textlit(
ret
}
-pub(crate) fn merge_maps<K, V, F, Err>(
+pub(crate) fn merge_maps<K, V, F>(
map1: &HashMap<K, V>,
map2: &HashMap<K, V>,
mut f: F,
-) -> Result<HashMap<K, V>, Err>
+) -> HashMap<K, V>
where
- F: FnMut(&K, &V, &V) -> Result<V, Err>,
+ F: FnMut(&K, &V, &V) -> V,
K: std::hash::Hash + Eq + Clone,
V: Clone,
{
let mut kvs = HashMap::new();
for (x, v2) in map2 {
let newv = if let Some(v1) = map1.get(x) {
- f(x, v1, v2)?
+ // Collision: the key is present in both maps
+ f(x, v1, v2)
} else {
v2.clone()
};
@@ -81,7 +82,7 @@ where
// Insert only if key not already present
kvs.entry(x.clone()).or_insert_with(|| v1.clone());
}
- Ok(kvs)
+ kvs
}
// Small helper enum to avoid repetition
@@ -175,29 +176,29 @@ fn apply_binop<'a>(o: BinOp, x: &'a Nir, y: &'a Nir) -> Option<Ret<'a>> {
Ret::NirRef(y)
}
(RecursiveRecordMerge, RecordLit(kvs1), RecordLit(kvs2)) => {
- let kvs = merge_maps::<_, _, _, !>(kvs1, kvs2, |_, v1, v2| {
- Ok(Nir::from_partial_expr(ExprKind::BinOp(
+ let kvs = merge_maps(kvs1, kvs2, |_, v1, v2| {
+ Nir::from_partial_expr(ExprKind::BinOp(
RecursiveRecordMerge,
v1.clone(),
v2.clone(),
- )))
- })?;
+ ))
+ });
Ret::NirKind(RecordLit(kvs))
}
(RecursiveRecordTypeMerge, RecordType(kts_x), RecordType(kts_y)) => {
- let kts = merge_maps::<_, _, _, !>(
+ let kts = merge_maps(
kts_x,
kts_y,
// If the Label exists for both records, then we hit the recursive case.
|_, l: &Nir, r: &Nir| {
- Ok(Nir::from_partial_expr(ExprKind::BinOp(
+ Nir::from_partial_expr(ExprKind::BinOp(
RecursiveRecordTypeMerge,
l.clone(),
r.clone(),
- )))
+ ))
},
- )?;
+ );
Ret::NirKind(RecordType(kts))
}
diff --git a/dhall/src/semantics/tck/typecheck.rs b/dhall/src/semantics/tck/typecheck.rs
index 365df25..173b76d 100644
--- a/dhall/src/semantics/tck/typecheck.rs
+++ b/dhall/src/semantics/tck/typecheck.rs
@@ -346,9 +346,7 @@ fn type_one_layer(
// Union the two records, prefering
// the values found in the RHS.
- let kts = merge_maps::<_, _, _, !>(kts_x, kts_y, |_, _, r_t| {
- Ok(r_t.clone())
- })?;
+ let kts = merge_maps(kts_x, kts_y, |_, _, r_t| r_t.clone());
let u = max(x.ty().ty(), y.ty().ty());
Nir::from_kind(NirKind::RecordType(kts)).to_type(u)