use chrono::{DateTime, Utc};
use rust_decimal::Decimal;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Series {
values: Vec<(DateTime<Utc>, Decimal)>,
}
impl Series {
#[must_use]
pub fn new(values: Vec<(DateTime<Utc>, Decimal)>) -> Self {
Self { values }
}
#[must_use]
pub fn empty() -> Self {
Self { values: Vec::new() }
}
#[must_use]
pub fn len(&self) -> usize {
self.values.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
#[must_use]
pub fn values(&self) -> &[(DateTime<Utc>, Decimal)] {
&self.values
}
#[must_use]
pub fn decimal_values(&self) -> Vec<Decimal> {
self.values.iter().map(|(_, v)| *v).collect()
}
#[must_use]
pub fn get(&self, index: usize) -> Option<(DateTime<Utc>, Decimal)> {
self.values.get(index).copied()
}
#[must_use]
pub fn last(&self) -> Option<(DateTime<Utc>, Decimal)> {
self.values.last().copied()
}
#[must_use]
pub fn first(&self) -> Option<(DateTime<Utc>, Decimal)> {
self.values.first().copied()
}
}
impl IntoIterator for Series {
type Item = (DateTime<Utc>, Decimal);
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.values.into_iter()
}
}
impl<'a> IntoIterator for &'a Series {
type Item = &'a (DateTime<Utc>, Decimal);
type IntoIter = std::slice::Iter<'a, (DateTime<Utc>, Decimal)>;
fn into_iter(self) -> Self::IntoIter {
self.values.iter()
}
}
#[cfg(test)]
#[path = "series_tests.rs"]
mod tests;