aboutsummaryrefslogtreecommitdiff
path: root/src/type/conversion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/type/conversion.rs')
-rw-r--r--src/type/conversion.rs62
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(());