humidity_core/historical/
mod.rs1use 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}