diff options
Diffstat (limited to 'dhall/src')
-rw-r--r-- | dhall/src/imports.rs | 7 | ||||
-rw-r--r-- | dhall/src/lib.rs | 2 | ||||
-rw-r--r-- | dhall/src/normalize.rs | 72 |
3 files changed, 46 insertions, 35 deletions
diff --git a/dhall/src/imports.rs b/dhall/src/imports.rs index 32ddfd7..6d8d670 100644 --- a/dhall/src/imports.rs +++ b/dhall/src/imports.rs @@ -1,11 +1,12 @@ -use dhall_core::{Expr, Import, ImportLocation, ImportMode, FilePrefix, X}; - +use dhall_core::{Expr, FilePrefix, Import, ImportLocation, ImportMode, X}; // fn resolve_import(import: Import) -> Expr<X, Import> { // } -pub fn resolve_imports<'i, S: Clone>(expr: &Expr<'i, S, Import>) -> Expr<'i, S, X> { +pub fn resolve_imports<'i, S: Clone>( + expr: &Expr<'i, S, Import>, +) -> Expr<'i, S, X> { let no_import = |_: &Import| -> X { panic!("ahhh import") }; expr.map_embed(&no_import) } diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index 54f0983..4e56264 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -4,5 +4,5 @@ mod normalize; pub use crate::normalize::*; -pub mod typecheck; pub mod imports; +pub mod typecheck; diff --git a/dhall/src/normalize.rs b/dhall/src/normalize.rs index b46722a..9dd384a 100644 --- a/dhall/src/normalize.rs +++ b/dhall/src/normalize.rs @@ -145,37 +145,47 @@ where }, // Normalize everything else before matching - e => match e.map_shallow(normalize, |_| unreachable!(), |x| x.clone()) { - BinOp(BoolAnd, box BoolLit(x), box BoolLit(y)) => BoolLit(x && y), - BinOp(BoolOr, box BoolLit(x), box BoolLit(y)) => BoolLit(x || y), - BinOp(BoolEQ, box BoolLit(x), box BoolLit(y)) => BoolLit(x == y), - BinOp(BoolNE, box BoolLit(x), box BoolLit(y)) => BoolLit(x != y), - BinOp(NaturalPlus, box NaturalLit(x), box NaturalLit(y)) => { - NaturalLit(x + y) - } - BinOp(NaturalTimes, box NaturalLit(x), box NaturalLit(y)) => { - NaturalLit(x * y) - } - BinOp(TextAppend, box TextLit(x), box TextLit(y)) => { - TextLit(x + &y) - } - BinOp(ListAppend, box ListLit(t1, xs), box ListLit(t2, ys)) => { - // Drop type annotation if the result is nonempty - let t = if xs.len() == 0 && ys.len() == 0 { - t1.or(t2) - } else { - None - }; - let xs = xs.into_iter(); - let ys = ys.into_iter(); - ListLit(t, xs.chain(ys).collect()) + e => { + match e.map_shallow(normalize, |_| unreachable!(), |x| x.clone()) { + BinOp(BoolAnd, box BoolLit(x), box BoolLit(y)) => { + BoolLit(x && y) + } + BinOp(BoolOr, box BoolLit(x), box BoolLit(y)) => { + BoolLit(x || y) + } + BinOp(BoolEQ, box BoolLit(x), box BoolLit(y)) => { + BoolLit(x == y) + } + BinOp(BoolNE, box BoolLit(x), box BoolLit(y)) => { + BoolLit(x != y) + } + BinOp(NaturalPlus, box NaturalLit(x), box NaturalLit(y)) => { + NaturalLit(x + y) + } + BinOp(NaturalTimes, box NaturalLit(x), box NaturalLit(y)) => { + NaturalLit(x * y) + } + BinOp(TextAppend, box TextLit(x), box TextLit(y)) => { + TextLit(x + &y) + } + BinOp(ListAppend, box ListLit(t1, xs), box ListLit(t2, ys)) => { + // Drop type annotation if the result is nonempty + let t = if xs.len() == 0 && ys.len() == 0 { + t1.or(t2) + } else { + None + }; + let xs = xs.into_iter(); + let ys = ys.into_iter(); + ListLit(t, xs.chain(ys).collect()) + } + Merge(_x, _y, _t) => unimplemented!(), + Field(box RecordLit(kvs), x) => match kvs.get(x) { + Some(r) => r.clone(), + None => Field(bx(RecordLit(kvs)), x), + }, + e => e, } - Merge(_x, _y, _t) => unimplemented!(), - Field(box RecordLit(kvs), x) => match kvs.get(x) { - Some(r) => r.clone(), - None => Field(bx(RecordLit(kvs)), x), - }, - e => e, - }, + } } } |