humidity_core/historical/
mod.rs

1use crate::serde;
2
3pub struct Historical<const SIZE: usize, T> {
4    elements: [Option<T>; SIZE],
5    len: usize,
6}
7
8impl<const SIZE: usize, T> Default for Historical<SIZE, T>
9where
10    T: serde::Serializable,
11{
12    fn default() -> Self {
13        Self::new()
14    }
15}
16
17impl<const SIZE: usize, T> Historical<SIZE, T>
18where
19    T: serde::Serializable,
20{
21    const EMPTY: Option<T> = Option::None;
22
23    pub const fn new() -> Self {
24        Self { elements: [Self::EMPTY; SIZE], len: 0 }
25    }
26
27    pub fn store(&mut self, elem: T) {
28        self.elements[self.next()] = Some(elem);
29    }
30
31    pub fn sync(&self) -> Syncer<T> {
32        Syncer::new(&self.elements[..self.len])
33    }
34
35    fn next(&mut self) -> usize {
36        let next = self.len;
37        self.len += 1;
38        if self.len == SIZE {
39            self.len = 0;
40        }
41        next
42    }
43}
44
45pub struct Syncer<'out, T> {
46    elements: &'out [Option<T>],
47    pos: usize,
48}
49
50impl<'out, T> Syncer<'out, T>
51where
52    T: serde::Serializable,
53{
54    fn new(elements: &'out [Option<T>]) -> Self {
55        Self { elements, pos: 0 }
56    }
57
58    pub fn write(&mut self, out: &mut [u8]) -> Result<usize, serde::Error> {
59        if self.pos >= self.elements.len() {
60            return Ok(0);
61        }
62        let elem = &self.elements[self.pos];
63        if let Some(elem) = elem {
64            self.pos += 1;
65            return serde::serialize(elem, out);
66        }
67        Ok(0)
68    }
69}