diff options
Diffstat (limited to 'src/type/conversion.rs')
-rw-r--r-- | src/type/conversion.rs | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/src/type/conversion.rs b/src/type/conversion.rs index baeab90..d0bc1dd 100644 --- a/src/type/conversion.rs +++ b/src/type/conversion.rs @@ -16,8 +16,8 @@ impl Type { /// Preferrably this should also work with generics: /// ```rust /// use myslip::r#type::{Type::*, util::*}; - /// assert!(List(vec![Integer, Boolean, Integer]).aka(&vecof(vt("T")))); - /// assert!(List(vec![Integer, Boolean, vt("X")]).aka(&vecof(vt("T")))); + /// assert!(List(vec![Integer, Integer, Integer]).aka(&vecof(vt("T")))); + /// assert!(List(vec![Boolean, Boolean, Boolean]).aka(&vecof(vt("T")))); /// ``` /// /// But of course it also should know when to fail: @@ -26,6 +26,29 @@ impl Type { /// assert!(!List(vec![Integer, Boolean]).aka(&vecof(Integer))); /// assert!(!List(vec![Integer, Boolean]).aka(&vecof(Boolean))); /// ``` + /// + /// Generics might be dangerous: + /// ```rust + /// use myslip::r#type::{Type::*, util::*}; + /// assert!(arr(Boolean, Boolean).aka(&arr(vt("T"), vt("T")))); + /// assert!( + /// List(vec![Integer, Integer]) + /// .aka(&List(vec![vt("T"), vt("T")])) + /// ); + /// assert!( + /// List(vec![Integer, Boolean]) + /// .aka(&List(vec![vt("T"), vt("H")])) + /// ); + /// assert!( + /// !List(vec![Integer, Boolean]) + /// .aka(&List(vec![vt("T"), vt("T")])) + /// ); + /// assert!( + /// !List(vec![Integer, Boolean]) + /// .aka(&List(vec![vt("T"), vt("T")])) + /// ); + /// assert!(!List(vec![Integer, Boolean, vt("X")]).aka(&vecof(vt("T")))); + /// ``` pub fn aka(&self, known_as: &Type) -> bool { self.least_general_supertype(known_as) == *known_as } @@ -103,6 +126,41 @@ impl Type { /// /// assert_eq!(List(vec![Integer]).into_type(&Integer), Ok(Integer)); /// ``` + /// + /// Now this also needs to be able to hand generics: + /// ```rust + /// use myslip::r#type::{Type::*, util::*}; + /// assert_eq!( + /// arr(Boolean, Boolean) + /// .into_type(&arr(vt("T"), vt("T"))), + /// Ok(arr(Boolean, Boolean)) + /// ); + /// assert_eq!( + /// arr(Boolean, Integer) + /// .into_type(&arr(vt("T"), vt("H"))), + /// Ok(arr(Boolean, Integer)) + /// ); + /// assert_eq!( + /// arr(Boolean, Integer) + /// .into_type(&arr(vt("T"), vt("T"))), + /// Err(()) + /// ); + /// assert_eq!( + /// List(vec![Integer, Integer]) + /// .into_type(&List(vec![vt("T"), vt("T")])), + /// Ok(List(vec![Integer, Integer])) + /// ); + /// assert!( + /// List(vec![Integer, Boolean]) + /// .into_type(&List(vec![vt("T"), vt("T")])) + /// .is_err() + /// ); + /// assert!( + /// List(vec![Integer, Boolean, vt("X")]) + /// .into_type(&vecof(vt("T"))) + /// .is_err() + /// ); + /// ``` pub fn into_type(self, other: &Type) -> Result<Type, ()> { if !self.aka(other) { return Err(()); |