indicator 0.4.4

Abstractions for stream aggregation, we call them `Indicator` s.
Documentation
use indicator::prelude::*;
use rust_decimal::Decimal;
use rust_decimal_macros::dec;
use time::{macros::datetime, UtcOffset};

fn main() {
    let period = Period::seconds(UtcOffset::UTC, 2);
    let cache = Periodic::with_circular_n::<3, TickValue<_>>(period).build_cache();
    let mut sms = Decimal::ZERO;
    let mut op = cache.map(|w| {
        assert!(w.is_inline());
        let outdated = w.change().outdated().map(|t| t.value).unwrap_or_default();
        debug_assert!(w.len() != 0);
        sms += w[0].value - outdated;
        let l = Decimal::new(w.len() as i64, 0);
        sms / l
    });

    for x in [
        TickValue::new(datetime!(2022-09-22 00:00:00 +00:00), dec!(1)),
        TickValue::new(datetime!(2022-09-22 00:00:01 +00:00), dec!(2)),
        TickValue::new(datetime!(2022-09-22 00:00:02 +00:00), dec!(3)),
        TickValue::new(datetime!(2022-09-22 00:00:03 +00:00), dec!(4)),
        TickValue::new(datetime!(2022-09-22 00:00:04 +00:00), dec!(5)),
        TickValue::new(datetime!(2022-09-22 00:00:05 +00:00), dec!(6)),
    ] {
        println!("{}", op.next(x));
    }
}