RosettaCodeData/Task/Parametric-polymorphism/Rust/parametric-polymorphism.rust

47 lines
1.2 KiB
Text
Raw Permalink Normal View History

2015-02-20 00:35:01 -05:00
struct TreeNode<T> {
value: T,
left: Option<Box<TreeNode<T>>>,
right: Option<Box<TreeNode<T>>>,
}
impl <T> TreeNode<T> {
2015-11-18 06:14:39 +00:00
fn my_map<U,F>(&self, f: &F) -> TreeNode<U> where
F: Fn(&T) -> U {
TreeNode {
value: f(&self.value),
left: match self.left {
None => None,
Some(ref n) => Some(Box::new(n.my_map(f))),
},
right: match self.right {
None => None,
Some(ref n) => Some(Box::new(n.my_map(f))),
},
}
2015-02-20 00:35:01 -05:00
}
}
fn main() {
2015-11-18 06:14:39 +00:00
let root = TreeNode {
value: 3,
left: Some(Box::new(TreeNode {
value: 55,
left: None,
right: None,
})),
right: Some(Box::new(TreeNode {
value: 234,
left: Some(Box::new(TreeNode {
value: 0,
left: None,
right: None,
})),
right: None,
})),
};
root.my_map(&|x| { println!("{}" , x)});
2015-02-20 00:35:01 -05:00
println!("---------------");
2015-11-18 06:14:39 +00:00
let new_root = root.my_map(&|x| *x as f64 * 333.333f64);
new_root.my_map(&|x| { println!("{}" , x) });
2015-02-20 00:35:01 -05:00
}