inditech 0.1.0

A set of technical indicators for time series analysis
Documentation
use crate::named::Named;
use crate::Slider;
use num_traits::Float;

pub struct Frame<F> {
    indicators: Vec<Box<dyn Frameable<F>>>,
}

impl<F> Frame<F>
where
    F: Float + Default,
{
    pub fn new() -> Self {
        Self { indicators: vec![] }
    }

    pub fn add(&mut self, indicator: Box<dyn Frameable<F>>) {
        self.indicators.push(indicator);
    }

    pub fn push(&mut self, value: F) {
        self.indicators
            .iter_mut()
            .for_each(|indicator| indicator.push(value));
    }

    pub fn last(&self) -> Vec<F> {
        self.indicators
            .iter()
            .map(|indicator| indicator.last().unwrap_or_default())
            .collect()
    }

    pub fn names(&self) -> Vec<String> {
        self.indicators
            .iter()
            .map(|indicator| indicator.name())
            .collect()
    }
}

pub trait Frameable<F>: Slider<F> + Named
where
    F: Float + Default,
{
}

impl<F, T> Frameable<F> for T
where
    F: Float + Default,
    T: Slider<F> + Named,
{
}