stevenrwalter

Untitled

Apr 20th, 2015
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.99 KB | None | 0 0
  1. use std::collections::LinkedList;
  2. use std::collections::HashMap;
  3. use std::convert::From;
  4. use std::iter::FromIterator;
  5. use std::iter::IntoIterator;
  6.  
  7. #[derive(Debug)]
  8. pub enum Element {
  9.     IntegerElem(i32),
  10.         DoubleElem(f64),
  11.     StringElem(String),
  12.     ListElem(LinkedList<Element>),
  13.     MapElem(HashMap<String,Element>)
  14. }
  15.  
  16. impl From<i32> for Element {
  17.     fn from(x: i32) -> Element {
  18.         Element::IntegerElem(x)
  19.     }
  20. }
  21.  
  22. impl From<f64> for Element {
  23.     fn from(x: f64) -> Element {
  24.         Element::DoubleElem(x)
  25.     }
  26. }
  27.  
  28. impl<'a> From<&'a str> for Element {
  29.     fn from(x: &str) -> Element {
  30.         Element::StringElem(x.to_string())
  31.     }
  32. }
  33.  
  34. impl<T: Into<Element>> FromIterator<T> for Element {
  35.     fn from_iter<U>(iterator: U) -> Self
  36.         where U: IntoIterator<Item=T>
  37.     {
  38.         let x = iterator.into_iter().map(|y| { y.into() });
  39.         Element::ListElem(x.collect())
  40.     }
  41. }
  42.  
  43. impl<'a, V: Into<Element>> From<HashMap<&'a str, V>> for Element {
  44.         fn from(mut input: HashMap<&str, V>) -> Self
  45.         {
  46.             let mut map : HashMap<String,Element> = HashMap::new();
  47.             while input.len() > 0 {
  48.                 let key = input.keys().next().unwrap().clone();
  49.                 let val = input.remove(key).unwrap();
  50.                 let elem = val.into();
  51.                 map.insert(key.to_string(), elem);
  52.             }
  53.             Element::MapElem(map)
  54.         }
  55. }
  56.  
  57. fn main () {
  58.     let five = Element::IntegerElem(5);
  59.     let foo : Element = "Foo".into();
  60.     let bar = Element::from("Bar");
  61.     let mut list = LinkedList::new();
  62.     list.push_back(five);
  63.     list.push_back(foo);
  64.     list.push_back(bar);
  65.     println!("{:?}", list);
  66.     let listelem = Element::from_iter(list);
  67.     println!("{:?}", listelem);
  68.  
  69.     let integers = vec![1,3,5];
  70.     let element = Element::from_iter(integers);
  71.     println!("{:?}", element);
  72.  
  73.         let mut int_map : HashMap<&str,i32> = HashMap::new();
  74.         int_map.insert("1", 1);
  75.         int_map.insert("2", 2);
  76.         let int_map_elem = Element::from(int_map);
  77.     println!("{:?}", int_map_elem);
  78. }
Advertisement
Add Comment
Please, Sign In to add comment