rrpack_basis/frames/
timed_frame.rs

1use super::TimedEvent;
2use derive_more::Deref;
3use serde::{Deserialize, Serialize};
4use std::collections::VecDeque;
5
6static DEFAULT_DEPTH: i64 = 60_000;
7
8#[derive(Debug, Clone, Serialize, Deserialize, Deref)]
9pub struct TimedFrame<T> {
10    depth_ms: i64,
11    #[deref]
12    frame: VecDeque<TimedEvent<T>>,
13}
14
15impl<T> Default for TimedFrame<T> {
16    fn default() -> Self {
17        Self::new(DEFAULT_DEPTH)
18    }
19}
20
21impl<T> TimedFrame<T> {
22    pub fn new(depth_ms: i64) -> Self {
23        Self {
24            depth_ms,
25            frame: VecDeque::new(),
26        }
27    }
28
29    pub fn insert_pop(&mut self, item: TimedEvent<T>) {
30        while let Some(front) = self.frame.front() {
31            if (item.timestamp.0 - front.timestamp.0) >= self.depth_ms {
32                self.frame.pop_front();
33            } else {
34                break;
35            }
36        }
37        self.frame.push_back(item);
38    }
39
40    pub fn depth_ms(&self) -> i64 {
41        self.depth_ms
42    }
43
44    pub fn clear(&mut self) {
45        self.frame.clear()
46    }
47}
48
49pub fn new_tf<T>(secs: i64) -> TimedFrame<T> {
50    TimedFrame::new((secs + 1) * 1_000)
51}