use crate::digits::iter_digits;
use crate::integer::{Base, IntegerImpl};
use crate::UnsignedInteger;
use core::fmt;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct Segmented<T>(pub T);
impl<T> From<T> for Segmented<T>
where
T: UnsignedInteger,
{
fn from(value: T) -> Self {
Segmented(value)
}
}
impl<T> fmt::Binary for Segmented<T>
where
T: UnsignedInteger,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt_seven_segment::<_, <T::Impl as IntegerImpl>::BaseTwo>(self.0.into_impl(), f)
}
}
impl<T> fmt::Display for Segmented<T>
where
T: UnsignedInteger,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt_seven_segment::<_, <T::Impl as IntegerImpl>::BaseTen>(self.0.into_impl(), f)
}
}
fn fmt_seven_segment<T: IntegerImpl, B: Base<T>>(n: T, f: &mut fmt::Formatter<'_>) -> fmt::Result {
iter_digits::<_, B>(n).try_for_each(|digit| write!(f, "{}", DIGITS[digit]))
}
const DIGITS: [&str; 10] = [
"\u{1FBF0}",
"\u{1FBF1}",
"\u{1FBF2}",
"\u{1FBF3}",
"\u{1FBF4}",
"\u{1FBF5}",
"\u{1FBF6}",
"\u{1FBF7}",
"\u{1FBF8}",
"\u{1FBF9}",
];