Advertisement
Guest User

Untitled

a guest
Sep 25th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. #![allow(dead_code)]
  2.  
  3. use std::f32::INFINITY;
  4. use std::sync::Arc;
  5. use std::thread;
  6. use std::sync::mpsc::channel;
  7.  
  8. struct Store {
  9. name: String,
  10. items: Vec<Item>,
  11. }
  12.  
  13. #[derive(Debug)]
  14. struct Item {
  15. name: &'static str,
  16. price: f32,
  17. }
  18.  
  19. impl Store {
  20. fn new(name: String) -> Store {
  21. Store {
  22. name: name,
  23. items: vec![],
  24. }
  25. }
  26.  
  27. fn add_item(&mut self, item: Item) {
  28. self.items.push(item);
  29. }
  30.  
  31. fn price(&self, item_name: &str) -> f32 {
  32. for item in &self.items {
  33. if item.name == item_name {
  34. return item.price;
  35. }
  36. }
  37.  
  38. panic!("no such item {:?}", item_name);
  39. }
  40.  
  41. fn total_price(&self, shopping_list: &[&str]) -> f32 {
  42. shopping_list.iter()
  43. .map(|name| self.price(name))
  44. .fold(0.0, |a, b| a + b)
  45. }
  46. }
  47.  
  48. fn build_stores() -> Vec<Store> {
  49. let mut stores = vec![];
  50.  
  51. let mut store = Store::new(format!("Rustmart"));
  52. store.add_item(Item { name: "chocolate", price: 5.0 });
  53. store.add_item(Item { name: "socks", price: 23.0 });
  54. store.add_item(Item { name: "plush Mozilla dinosaur", price: 13.0 });
  55. stores.push(store);
  56.  
  57. let mut store = Store::new(format!("Rarget"));
  58. store.add_item(Item { name: "chocolate", price: 2.5 });
  59. store.add_item(Item { name: "socks", price: 20.0 });
  60. store.add_item(Item { name: "plush Mozilla dinosaur", price: 20.0 });
  61. stores.push(store);
  62.  
  63. stores
  64. }
  65.  
  66. fn main() {
  67. let stores = build_stores();
  68.  
  69. let shopping_list = vec!["chocolate", "plush Mozilla dinosaur"];
  70. let shopping_list = Arc::new(shopping_list);
  71.  
  72. let (tx, rx) = channel::<(String, f32)>();
  73. let mut handles = vec![];
  74. for store in stores {
  75. let tx = tx.clone();
  76. let shopping_list = shopping_list.clone();
  77. handles.push(thread::spawn(move || {
  78. let sum = store.total_price(&shopping_list);
  79. tx.send((store.name, sum)).unwrap();
  80. }));
  81. }
  82.  
  83. let mut best_store = None;
  84. let mut best_price = INFINITY;
  85. for _ in &handles {
  86. let (recv_store, recv_price) = rx.recv().unwrap();
  87. if recv_price < best_price {
  88. best_store = Some(recv_store);
  89. best_price = recv_price;
  90. }
  91. }
  92.  
  93. for handle in handles {
  94. handle.join().unwrap();
  95. }
  96.  
  97. println!("--> Go to {}!", best_store.unwrap());
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement