1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use std::rc::Rc; #[derive(Debug, Eq, PartialEq)] pub enum List<T> { Cons(Rc<T>, Rc<List<T>>), Nil, } pub fn cons<T>(x: T, xs: Rc<List<T>>) -> Rc<List<T>> { Rc::new(List::Cons(Rc::new(x), xs)) } pub fn nil<T>() -> Rc<List<T>> { Rc::new(List::Nil) } pub fn iter<T>(xs: Rc<List<T>>) -> Iter<T> { Iter(xs) } pub struct Iter<T>(Rc<List<T>>); impl<T> Iterator for Iter<T> { type Item = Rc<T>; fn next(&mut self) -> Option<Self::Item> { let (tail, result) = match &*self.0 { &List::Nil => { (self.0.clone(), None) } &List::Cons(ref x, ref xs) => { (xs.clone(), Some(x.clone())) } }; self.0 = tail; result } } #[cfg(test)] mod tests { use std::rc::Rc; use super::{nil, cons, List, iter}; #[test] fn test_cons() { let mut my_list = vec![nil(); 4]; my_list[2] = cons(99, my_list[1].clone()); my_list[3] = cons(100, my_list[2].clone()); println!("{:?}", my_list[3]); assert_eq!(my_list[3], cons(100, cons(99, nil()))); } #[test] fn test_collect() { let xs: Rc<List<u32>> = cons(100, cons(99, nil())); let v = iter(xs).collect::<Vec<_>>(); println!("{:?}", v); assert_eq!(v, vec![Rc::new(100), Rc::new(99)]); } }