brumby 0.7.3

Derivatives and multiples pricing for racing and sports.
use std::fmt::{Display, Formatter};
use std::ops::RangeInclusive;

pub struct DisplaySlice<'a, D: Display> {
    items: &'a [D]
}
impl<'a, D: Display> Display for DisplaySlice<'a, D> where D: Display {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "[")?;
        let len = self.items.len();
        for (index, item) in self.items.iter().enumerate() {
            write!(f, "{item}")?;
            if index != len - 1 {
                write!(f, ", ")?;
            }
        }
        write!(f, "]")?;
        Ok(())
    }
}

impl<'a, D: Display> From<&'a [D]> for DisplaySlice<'a, D> {
    fn from(items: &'a [D]) -> Self {
        DisplaySlice { items }
    }
}

pub struct DisplayRangeInclusive<'a, D: Display> {
    range: &'a RangeInclusive<D>
}

impl<'a, D: Display> From<&'a RangeInclusive<D>> for DisplayRangeInclusive<'a, D> {
    fn from(range: &'a RangeInclusive<D>) -> Self {
        DisplayRangeInclusive { range }
    }
}

impl<'a, D: Display> Display for DisplayRangeInclusive<'a, D> {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}-{}", self.range.start(), self.range.end())
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn display_slice() {
        let data = vec![4, 5, 6, 8];
        assert_eq!("[4, 5, 6, 8]", format!("{}", DisplaySlice::from(&*data)));

        let data: Vec<usize> = vec![];
        assert_eq!("[]", format!("{}", DisplaySlice::from(&*data)));
    }
}