use default_impl::default_impl;
use traits::{Digits, FloatDigits};
pub mod traits;
macro_rules! piggyback {
($($x: ty),*) => {
$(
impl Digits for $x {
fn digits(&self) -> Box<[u8]> {
self.unsigned_abs().digits()
}
}
)*
};
}
#[inline(always)]
unsafe fn stringable_to_digits<T: ToString>(x: T) -> Box<[u8]> {
x.to_string()
.chars()
.map(|c| c.to_digit(10).unwrap())
.map(|x| x as u8)
.collect()
}
default_impl!(Digits, u8, u16, u32, u64, u128, usize);
piggyback!(i8, i16, i32, i64, i128, isize);
impl FloatDigits for f64 {
fn digits_left_of_dot(&self) -> Box<[u8]> {
if self.is_finite() {
unsafe { stringable_to_digits(self.trunc()) }
} else {
Box::new([]) }
}
fn digits_right_of_dot(&self) -> Box<[u8]> {
if self.is_finite() {
unsafe { stringable_to_digits(self.fract()) }
} else {
Box::new([]) }
}
}