rrpack_basis/frames/
timed_frame.rs1use 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}