diff options
author | Nadrieril | 2020-03-17 23:47:35 +0000 |
---|---|---|
committer | Nadrieril | 2020-03-17 23:47:58 +0000 |
commit | 4b29fa3a9e329814c98df3463841eeb288f1630c (patch) | |
tree | 4c933c9228e74e9b12351ea797c38d161eb6fe80 /dhall/src/semantics/nze | |
parent | 71fddc59b5b427f52dd2f0cd76f788eb995a4e2e (diff) |
Remove never_type feature
Diffstat (limited to 'dhall/src/semantics/nze')
-rw-r--r-- | dhall/src/semantics/nze/normalize.rs | 27 |
1 files changed, 14 insertions, 13 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)) } |