[types] Add Bools to the mix

This commit is contained in:
Eryn Wells 2018-08-26 09:52:17 -07:00
parent 4d5fcb69ee
commit d0441965eb
3 changed files with 29 additions and 16 deletions

View file

@ -2,14 +2,19 @@
* Eryn Wells <eryn@erynwells.me>
*/
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<Obj> 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);
}
}

View file

@ -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;

View file

@ -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.