diff --git a/types/src/bool.rs b/types/src/bool.rs index 88bc9a6..893a4f1 100644 --- a/types/src/bool.rs +++ b/types/src/bool.rs @@ -2,14 +2,19 @@ * Eryn Wells */ +use std::any::Any; use std::fmt; -use object::Obj; -use preds; +use std::ops::Deref; +use object::{Obj, Object}; /// The Scheme boolean type. It can be `True` or `False`. +#[derive(Debug, PartialEq)] pub enum Bool { True, False } -impl Obj for Bool { } +impl Object for Bool { + fn as_any(&self) -> &Any { self } + fn as_bool(&self) -> Option<&Bool> { Some(self) } +} impl fmt::Display for Bool { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -20,25 +25,29 @@ impl fmt::Display for Bool { } } -impl preds::IsBool for Bool { - fn is_bool(&self) -> bool { true } +impl PartialEq for Bool { + fn eq(&self, rhs: &Obj) -> bool { + match rhs { + Obj::Null => false, + Obj::Ptr(ref inner) => { + if let Some(rhs_bool) = inner.deref().as_bool() { + self == rhs_bool + } else { + false + } + } + } + } } #[cfg(test)] mod tests { - use object::Object; - use predicates::{IsBool, IsChar}; - - #[test] - fn bools_are_bools() { - assert_eq!(Object::Bool(false).is_bool(), true); - assert_eq!(Object::Bool(false).is_char(), false); - } + use super::Bool; #[test] fn equal_bools_are_equal() { - assert_eq!(Object::Bool(true), Object::Bool(true)); - assert_eq!(Object::Bool(false), Object::Bool(false)); - assert_ne!(Object::Bool(true), Object::Bool(false)); + assert_eq!(Bool::True, Bool::True); + assert_eq!(Bool::False, Bool::False); + assert_ne!(Bool::True, Bool::False); } } diff --git a/types/src/lib.rs b/types/src/lib.rs index f46d08d..95037dc 100644 --- a/types/src/lib.rs +++ b/types/src/lib.rs @@ -1,7 +1,9 @@ +mod bool; mod object; mod pair; mod sym; +pub use bool::Bool; pub use object::Obj; pub use pair::Pair; pub use sym::Sym; diff --git a/types/src/object.rs b/types/src/object.rs index 76735d9..0b988ba 100644 --- a/types/src/object.rs +++ b/types/src/object.rs @@ -32,6 +32,8 @@ pub trait Object: { /// Cast this Object to an Any. fn as_any(&self) -> &Any; + /// Cast this Object to a Bool if possible. + fn as_bool(&self) -> Option<&Bool> { None } /// Cast this Object to a Pair if possible. fn as_pair(&self) -> Option<&Pair> { None } /// Cast this Object to a Sym if possible.