use super::TimedEvent;
use crate::core::types::Bar;
#[derive(Debug, Clone)]
pub struct EnrichedHistory {
pub bars: Vec<Bar>,
pub events: Vec<TimedEvent>,
}
impl EnrichedHistory {
pub fn new(bars: Vec<Bar>, events: Vec<TimedEvent>) -> Self {
Self { bars, events }
}
pub fn bar_count(&self) -> usize {
self.bars.len()
}
pub fn event_count(&self) -> usize {
self.events.len()
}
pub fn time_range(&self) -> Option<(i64, i64)> {
let first = self.bars.first()?.time;
let last = self.bars.last()?.time;
Some((first, last))
}
}
#[cfg(test)]
mod tests {
use super::EnrichedHistory;
use crate::core::types::Bar;
use crate::data_loader::TimedEvent;
fn make_bar(t: i64) -> Bar {
Bar::new(t, 1.0, 2.0, 0.5, 1.5, 100.0)
}
#[test]
fn empty_time_range_is_none() {
let h = EnrichedHistory::new(vec![], vec![]);
assert!(h.time_range().is_none());
}
#[test]
fn counts_and_range() {
let bars: Vec<Bar> = (0..5).map(|i| make_bar(i * 1000)).collect();
let events: Vec<TimedEvent> = bars.iter().cloned().map(TimedEvent::Bar).collect();
let h = EnrichedHistory::new(bars, events);
assert_eq!(h.bar_count(), 5);
assert_eq!(h.event_count(), 5);
assert_eq!(h.time_range(), Some((0, 4000)));
}
}