use singletonset::SingletonSet;
fn main() {
let mut set = SingletonSet::new();
assert!(set.is_empty());
assert_eq!(set.as_mut() as &u8, &0);
assert_eq!(set.len(), 1);
*set.as_mut() = 10u8;
*set.as_mut() = 5u8;
*set.as_mut() = 2u8;
assert_eq!(set.as_ref() as &u8, &2);
*set.get_mut::<u8>() *= 2;
*(set.get_mut() as &mut u8) *= 2;
*(set.as_mut() as &mut u8) *= 2;
assert_eq!(set.as_ref() as &u8, &16);
*set.get_or_insert_mut(14u8) *= 2;
assert_eq!(set.as_ref() as &u8, &32);
*set.as_mut_or_insert(35u16) *= 2;
assert_eq!(set.as_ref() as &u16, &70);
set.insert("Foo".to_string());
set.get_mut::<String>().push_str(", bar");
(set.as_mut() as &mut String).push_str(", baz");
set.with_ref(|msg: &String| assert_eq!(msg, &"Foo, bar, baz".to_string()));
assert_eq!(set.len(), 3);
assert_eq!(set.try_get::<u8>(), Some(&32));
assert!(!set.contains::<f64>());
#[derive(Debug, PartialEq)]
struct Foo(String);
let ret = set.with_mut_or_else(
|| Foo("Default".to_string()),
|val| {
*val = Foo("Wild!".to_string());
42
},
);
assert_eq!(ret, 42);
set.with_mut_or_else(
|| Foo("Default".to_string()),
|val| *val = Foo("Wilder!".to_string()),
);
assert_eq!(set.as_ref() as &Foo, &Foo("Wilder!".to_string()));
for t in set.types() {
match t.as_name() {
"u8" => {
println!("Set holds a u8: {}", set.as_ref() as &u8);
}
"u16" => {
println!("Set holds a u16: {}", set.as_ref() as &u16);
}
"u32" => {
println!("Set holds a u32: {}", set.as_ref() as &u32);
}
"str" => {
println!("Set holds a &str: '{}'", set.as_ref() as &&str);
}
"String" => {
println!("Set holds a String: '{}'", set.as_ref() as &String);
}
_ => {
println!("Set holds another type of value, a {}", t);
}
}
}
}