brk_grouper 0.1.0-alpha.1

Groups used throughout BRK
Documentation
use brk_traversable::Traversable;
use rayon::prelude::*;

use super::{
    Filter, TimeFilter, DAYS_10Y, DAYS_12Y, DAYS_1D, DAYS_1M, DAYS_1W, DAYS_1Y, DAYS_2M, DAYS_2Y,
    DAYS_3M, DAYS_3Y, DAYS_4M, DAYS_4Y, DAYS_5M, DAYS_5Y, DAYS_6M, DAYS_6Y, DAYS_7Y, DAYS_8Y,
};

#[derive(Default, Clone, Traversable)]
pub struct ByMinAge<T> {
    pub _1d: T,
    pub _1w: T,
    pub _1m: T,
    pub _2m: T,
    pub _3m: T,
    pub _4m: T,
    pub _5m: T,
    pub _6m: T,
    pub _1y: T,
    pub _2y: T,
    pub _3y: T,
    pub _4y: T,
    pub _5y: T,
    pub _6y: T,
    pub _7y: T,
    pub _8y: T,
    pub _10y: T,
    pub _12y: T,
}

impl<T> ByMinAge<T> {
    pub fn new<F>(mut create: F) -> Self
    where
        F: FnMut(Filter) -> T,
    {
        Self {
            _1d: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_1D))),
            _1w: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_1W))),
            _1m: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_1M))),
            _2m: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_2M))),
            _3m: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_3M))),
            _4m: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_4M))),
            _5m: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_5M))),
            _6m: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_6M))),
            _1y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_1Y))),
            _2y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_2Y))),
            _3y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_3Y))),
            _4y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_4Y))),
            _5y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_5Y))),
            _6y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_6Y))),
            _7y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_7Y))),
            _8y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_8Y))),
            _10y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_10Y))),
            _12y: create(Filter::Time(TimeFilter::GreaterOrEqual(DAYS_12Y))),
        }
    }

    pub fn iter(&self) -> impl Iterator<Item = &T> {
        [
            &self._1d, &self._1w, &self._1m, &self._2m, &self._3m, &self._4m, &self._5m, &self._6m,
            &self._1y, &self._2y, &self._3y, &self._4y, &self._5y, &self._6y, &self._7y, &self._8y,
            &self._10y, &self._12y,
        ]
        .into_iter()
    }

    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
        [
            &mut self._1d,
            &mut self._1w,
            &mut self._1m,
            &mut self._2m,
            &mut self._3m,
            &mut self._4m,
            &mut self._5m,
            &mut self._6m,
            &mut self._1y,
            &mut self._2y,
            &mut self._3y,
            &mut self._4y,
            &mut self._5y,
            &mut self._6y,
            &mut self._7y,
            &mut self._8y,
            &mut self._10y,
            &mut self._12y,
        ]
        .into_iter()
    }

    pub fn par_iter_mut(&mut self) -> impl ParallelIterator<Item = &mut T>
    where
        T: Send + Sync,
    {
        [
            &mut self._1d,
            &mut self._1w,
            &mut self._1m,
            &mut self._2m,
            &mut self._3m,
            &mut self._4m,
            &mut self._5m,
            &mut self._6m,
            &mut self._1y,
            &mut self._2y,
            &mut self._3y,
            &mut self._4y,
            &mut self._5y,
            &mut self._6y,
            &mut self._7y,
            &mut self._8y,
            &mut self._10y,
            &mut self._12y,
        ]
        .into_par_iter()
    }
}