mwchase

LC:NN upload 6: no future(s)

Apr 9th, 2017
833
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 3.81 KB | None | 0 0
  1. +extern crate futures;
  2. +extern crate futures_cpupool;
  3. +extern crate void;
  4. +
  5. +use std::borrow::Borrow;
  6.  use std::collections::HashMap;
  7. -use std::sync::{Arc,RwLock};
  8. -use std::thread;
  9. +use std::sync::{Arc, RwLock};
  10.  
  11. -fn poll_for(mapping: Arc<RwLock<HashMap<i32, Arc<RwLock<i32>>>>>, key: i32) -> Arc<RwLock<i32>> {
  12. -    loop {
  13. -        match mapping.read().unwrap().get(&key) {
  14. -            Some(i) => return i.clone(),
  15. -            None => ()
  16. -        }
  17. +use futures::future::{BoxFuture, Future, lazy, ok, Shared, SharedItem, SharedError};
  18. +
  19. +type MyShared = Shared<Future<Item=i32, Error=void::Void>>;
  20. +
  21. +struct CachingMap(Arc<RwLock<HashMap<i32, MyShared>>>);
  22. +
  23. +impl Clone for CachingMap {
  24. +    fn clone(&self) -> CachingMap {
  25. +        CachingMap(self.0.clone())
  26.      }
  27.  }
  28.  
  29. -fn q(mapping: Arc<RwLock<HashMap<i32, Arc<RwLock<i32>>>>>, key: i32) -> i32 {
  30. -    println!("Running for {:?}", key);
  31. -    {
  32. -        match mapping.read().unwrap().get(&key) {
  33. -            Some(i) => return *i.read().unwrap(),
  34. -            None => ()
  35. +impl CachingMap {
  36. +    fn new() -> CachingMap {
  37. +        CachingMap(Arc::new(RwLock::new(HashMap::new())))
  38. +    }
  39. +
  40. +    fn q_basis() -> CachingMap {
  41. +        let caching_map = CachingMap::new();
  42. +        let clone = caching_map.0.clone();
  43. +        let mut mapping = clone.write().unwrap();
  44. +        mapping.insert(1, ok(1).shared());
  45. +        mapping.insert(2, ok(1).shared());
  46. +        caching_map
  47. +    }
  48. +
  49. +    fn q(&self, key: i32) -> MyShared {
  50. +        {
  51. +            match self.0.read().unwrap().get(&key) {
  52. +                Some(value) => return value.clone(),
  53. +                None => (),
  54. +            }
  55.          }
  56. -    }
  57. -    {
  58. -        println!("Generating for {:?}", key);
  59. -        let lock = Arc::new(RwLock::new(0));
  60. -        let mut val = lock.write().unwrap();
  61. +
  62.          {
  63.              use std::collections::hash_map::Entry::*;
  64. -            let mut mutable_mapping = mapping.write().unwrap();
  65. -            match mutable_mapping.entry(key) {
  66. -                Occupied(entry) => return *entry.get().read().unwrap(),
  67. -                Vacant(entry) => {entry.insert(lock.clone());}
  68. +            let mut mapping = self.0.write().unwrap();
  69. +            match mapping.entry(key) {
  70. +                Occupied(entry) => entry.get(),
  71. +                Vacant(entry) => entry.insert(self.calculate_q(key))
  72.              }
  73. -            println!("Inserted for {:?}", key);
  74.          }
  75. -        {
  76. -            let _mapping = mapping.clone();
  77. -            thread::spawn(move || {
  78. -                q(_mapping, key - 1);
  79. -            });
  80. -        }
  81. -        {
  82. -            let prev = poll_for(mapping.clone(), key - 1);
  83. -            let prev_prev = poll_for(mapping.clone(), key - 2);
  84. -            let first = poll_for(mapping.clone(), key - *prev.read().unwrap());
  85. -            let second = poll_for(mapping.clone(), key - *prev_prev.read().unwrap());
  86. -            *val = *first.read().unwrap() + *second.read().unwrap();
  87. -        }
  88. -        *val
  89. +    }
  90. +
  91. +    fn calculate_q(&self, key: i32) -> MyShared {
  92. +        let prev = lazy(|| self.q(key - 1));
  93. +        let prev_prev = lazy(|| self.q(key - 2));
  94. +        let first = prev.map(|q| self.q(key - q.unwrap()).wait());
  95. +        let second = prev_prev.map(|q| self.q(key - q.unwrap()).wait());
  96. +        first.join(second).map(|(first, second)| first.unwrap() + second.unwrap()).shared()
  97.      }
  98.  }
  99.  
  100.  fn main() {
  101. -    let mut mapping = HashMap::new();
  102. -    mapping.insert(1, Arc::new(RwLock::new(1)));
  103. -    mapping.insert(2, Arc::new(RwLock::new(1)));
  104. -    let mapping = Arc::new(RwLock::new(mapping));
  105. -    println!("{:?}", q(mapping.clone(), 10));
  106. -    println!("{:?}", q(mapping.clone(), 10));
  107. +    let cache = CachingMap::q_basis();
  108. +    //println!("{:?}", cache.q(10));
  109. +    //println!("{:?}", cache.q(10));
  110.  }
Advertisement
Add Comment
Please, Sign In to add comment