use crate::tick::Tick;
#[derive(Debug, Clone)]
pub struct HistoryBuffer {
buffer: Vec<Option<Tick>>,
capacity: usize,
head: usize,
len: usize,
}
impl HistoryBuffer {
pub fn new(capacity: usize) -> Self {
let mut buffer = Vec::with_capacity(capacity);
for _ in 0..capacity {
buffer.push(None);
}
HistoryBuffer {
buffer,
capacity,
head: 0,
len: 0,
}
}
pub fn push(&mut self, tick: Tick) {
self.buffer[self.head] = Some(tick);
self.head = (self.head + 1) % self.capacity;
if self.len < self.capacity {
self.len += 1;
}
}
pub fn latest(&self) -> Option<&Tick> {
if self.len == 0 {
return None;
}
let idx = if self.head == 0 {
self.capacity - 1
} else {
self.head - 1
};
self.buffer[idx].as_ref()
}
pub fn query(&self, n: usize) -> Vec<&Tick> {
let count = n.min(self.len);
let mut result = Vec::with_capacity(count);
let start = if self.len < self.capacity {
0
} else {
self.head
};
for i in 0..count {
let idx = (start + self.len - count + i) % self.capacity;
if let Some(ref tick) = self.buffer[idx] {
result.push(tick);
}
}
result
}
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn capacity(&self) -> usize {
self.capacity
}
}