diff options
author | Nadrieril | 2020-03-13 22:03:14 +0000 |
---|---|---|
committer | Nadrieril | 2020-03-31 21:44:01 +0100 |
commit | 844dc3defdd7735742ad41eb6d1da8fe2e7f340b (patch) | |
tree | 4430f8e81cc8d451ed16c8b45d6f2ce8ed2f8c56 /dhall/src | |
parent | 7901220c7cc18b740ba2b1d7f786ebc1d97167db (diff) |
Revert "Start overengineering SimpleVal/Ty"
This reverts commit ee9ee1e0ae26bd7fe718a1f8cbe56370ccf969a7.
Diffstat (limited to '')
-rw-r--r-- | dhall/src/simple.rs | 151 |
1 files changed, 31 insertions, 120 deletions
diff --git a/dhall/src/simple.rs b/dhall/src/simple.rs index 6f44183..45fa656 100644 --- a/dhall/src/simple.rs +++ b/dhall/src/simple.rs @@ -37,125 +37,6 @@ pub enum STyKind { Union(BTreeMap<String, Option<SimpleType>>), } -pub trait SimpleValueFolder: Sized { - fn num(x: NumKind) -> Self; - fn text(x: String) -> Self; - fn optional(x: Option<Self>) -> Self; - fn list(x: impl Iterator<Item = Self>) -> Self; - fn record(values: impl Iterator<Item = (String, Self)>) -> Self; - fn union(variant: String, content: Option<Self>) -> Self; -} - -pub trait SimpleTypeFolder: Sized { - fn bool() -> Self; - fn natural() -> Self; - fn integer() -> Self; - fn double() -> Self; - fn text() -> Self; - fn optional(x: Self) -> Self; - fn list(x: Self) -> Self; - fn record(types: impl Iterator<Item = (String, Self)>) -> Self; - fn union(types: impl Iterator<Item = (String, Option<Self>)>) -> Self; -} - -pub(crate) fn fold_simple_value<T>(nir: &Nir) -> Option<T> -where - T: SimpleValueFolder, -{ - // TODO: check the type first and remove error handling - Some(match nir.kind() { - NirKind::Num(lit) => T::num(lit.clone()), - NirKind::TextLit(x) => T::text( - x.as_text() - .expect("Normal form should ensure the text is a string"), - ), - NirKind::EmptyOptionalLit(_) => T::optional(None), - NirKind::NEOptionalLit(x) => T::optional(Some(fold_simple_value(x)?)), - NirKind::EmptyListLit(_) => T::list(std::iter::empty()), - NirKind::NEListLit(xs) => T::list( - xs.iter() - .map(|v| fold_simple_value(v)) - .collect::<Option<Vec<_>>>()? - .into_iter(), - ), - NirKind::RecordLit(kvs) => T::record( - kvs.iter() - .map(|(k, v)| Some((k.into(), fold_simple_value(v)?))) - .collect::<Option<BTreeMap<_, _>>>()? - .into_iter(), - ), - NirKind::UnionLit(field, x, _) => { - T::union(field.into(), Some(fold_simple_value(x)?)) - } - NirKind::UnionConstructor(field, ty) - if ty.get(field).map(|f| f.is_some()) == Some(false) => - { - T::union(field.into(), None) - } - _ => return None, - }) -} - -pub(crate) fn fold_simple_type<T>(nir: &Nir) -> Option<T> -where - T: SimpleTypeFolder, -{ - // TODO: avoid unnecessary allocations - Some(match nir.kind() { - NirKind::BuiltinType(b) => match b { - Builtin::Bool => T::bool(), - Builtin::Natural => T::natural(), - Builtin::Integer => T::integer(), - Builtin::Double => T::double(), - Builtin::Text => T::text(), - _ => unreachable!(), - }, - NirKind::OptionalType(t) => T::optional(fold_simple_type(t)?), - NirKind::ListType(t) => T::list(fold_simple_type(t)?), - NirKind::RecordType(kts) => T::record( - kts.iter() - .map(|(k, v)| Some((k.into(), fold_simple_type(v)?))) - .collect::<Option<BTreeMap<_, _>>>()? - .into_iter(), - ), - NirKind::UnionType(kts) => T::union( - kts.iter() - .map(|(k, v)| { - Some(( - k.into(), - v.as_ref() - .map(|v| Ok(fold_simple_type(v)?)) - .transpose()?, - )) - }) - .collect::<Option<BTreeMap<_, _>>>()? - .into_iter(), - ), - _ => return None, - }) -} - -impl SimpleValueFolder for SimpleValue { - fn num(x: NumKind) -> Self { - SimpleValue::new(SValKind::Num(x)) - } - fn text(x: String) -> Self { - SimpleValue::new(SValKind::Text(x)) - } - fn optional(x: Option<Self>) -> Self { - SimpleValue::new(SValKind::Optional(x)) - } - fn list(xs: impl Iterator<Item = Self>) -> Self { - SimpleValue::new(SValKind::List(xs.collect())) - } - fn record(values: impl Iterator<Item = (String, Self)>) -> Self { - SimpleValue::new(SValKind::Record(values.collect())) - } - fn union(variant: String, content: Option<Self>) -> Self { - SimpleValue::new(SValKind::Union(variant, content)) - } -} - impl SimpleValue { pub(crate) fn new(kind: SValKind) -> Self { SimpleValue { @@ -163,7 +44,37 @@ impl SimpleValue { } } pub(crate) fn from_nir(nir: &Nir) -> Option<Self> { - fold_simple_value::<Self>(nir) + Some(SimpleValue::new(match nir.kind() { + NirKind::Num(lit) => SValKind::Num(lit.clone()), + NirKind::TextLit(x) => SValKind::Text( + x.as_text() + .expect("Normal form should ensure the text is a string"), + ), + NirKind::EmptyOptionalLit(_) => SValKind::Optional(None), + NirKind::NEOptionalLit(x) => { + SValKind::Optional(Some(Self::from_nir(x)?)) + } + NirKind::EmptyListLit(_) => SValKind::List(vec![]), + NirKind::NEListLit(xs) => SValKind::List( + xs.iter() + .map(|v| Self::from_nir(v)) + .collect::<Option<_>>()?, + ), + NirKind::RecordLit(kvs) => SValKind::Record( + kvs.iter() + .map(|(k, v)| Some((k.into(), Self::from_nir(v)?))) + .collect::<Option<_>>()?, + ), + NirKind::UnionLit(field, x, _) => { + SValKind::Union(field.into(), Some(Self::from_nir(x)?)) + } + NirKind::UnionConstructor(field, ty) + if ty.get(field).map(|f| f.is_some()) == Some(false) => + { + SValKind::Union(field.into(), None) + } + _ => return None, + })) } pub fn kind(&self) -> &SValKind { |