tmrustplayground/cache/
mod.rs

1/// 계산에 대한 동작을 설정하고 반환 값을 캐시하는 구조체입니다.
2///
3///  # Example
4/// ``` rust
5/// use tmrustplayground::cache::Cache;
6///
7/// let mut cache = Cache::new(|value| value + 10);
8///
9/// assert_eq!(15, cache.value(5)); // 값이 일치합니다.
10/// assert_eq!(20, cache.value(10)); // 값이 일치하지 않습니다. 이미 초기 계산 결과가 있으므로 캐시된 값을 반환합니다.
11/// ```
12///
13/// # Panics
14///
15/// # Errors
16///
17/// # Safety
18///
19pub struct Cache<T>
20    where T: Fn(u32) -> u32 {
21    calculate: T,
22    value: Option<u32>,
23}
24
25impl<T> Cache<T>
26    where T: Fn(u32) -> u32 {
27    pub fn new(calculate: T) -> Cache<T> {
28        Cache {
29            calculate,
30            value: None
31        }
32    }
33
34    pub fn value(&mut self, arg: u32) -> u32 {
35        match self.value {
36            Some(value) => value,
37            None => {
38                let value = (self.calculate)(arg);
39                self.value = Some(value);
40
41                value
42            }
43        }
44    }
45}
46
47// impl<T> Iterator for Cache<T>
48//     where T: Fn(u32) -> u32 {
49//     type Item = u32;
50//
51//     fn next(&mut self) -> Option<Self::Item> {
52//         let value = self.value.unwrap_or_else(|| 0);
53//         let new_value = self.value(value);
54//
55//         if new_value == 0 {
56//             None
57//         } else {
58//             Some(new_value)
59//         }
60//     }
61// }