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// }