diff options
Diffstat (limited to 'dhall')
-rw-r--r-- | dhall/src/lib.rs | 1 | ||||
-rw-r--r-- | dhall/src/semantics/nze/normalize.rs | 27 | ||||
-rw-r--r-- | dhall/src/semantics/tck/typecheck.rs | 4 | ||||
-rw-r--r-- | dhall/src/syntax/ast/expr.rs | 6 |
4 files changed, 19 insertions, 19 deletions
diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index d7d7f05..058411c 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -1,5 +1,4 @@ #![doc(html_root_url = "https://docs.rs/dhall/0.3.0")] -#![feature(never_type)] #![allow( clippy::int_plus_one, // Comes from pest_consume macro clippy::module_inception, 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) diff --git a/dhall/src/syntax/ast/expr.rs b/dhall/src/syntax/ast/expr.rs index ce0a3d2..8023771 100644 --- a/dhall/src/syntax/ast/expr.rs +++ b/dhall/src/syntax/ast/expr.rs @@ -257,10 +257,12 @@ impl Expr { } } -pub fn trivial_result<T>(x: Result<T, !>) -> T { +// Empty enum to indicate that no error can occur +enum X {} +fn trivial_result<T>(x: Result<T, X>) -> T { match x { Ok(x) => x, - Err(e) => e, + Err(e) => match e {}, } } |