use num_traits::One;
use rust_decimal::{Decimal, MathematicalOps};
pub trait DecimalExtensions {
fn to_parts(&self) -> (u32, u32, u32, u32);
fn pows(&self, exp: i64) -> Decimal;
fn is_whole(&self) -> bool;
}
impl DecimalExtensions for Decimal {
fn to_parts(&self) -> (u32, u32, u32, u32) {
let s = self.serialize();
(
s[0] as u32 | s[1] as u32 >> 8 | s[2] as u32 >> 16 | s[3] as u32 >> 24,
s[4] as u32 | s[5] as u32 >> 8 | s[6] as u32 >> 16 | s[7] as u32 >> 24,
s[8] as u32 | s[9] as u32 >> 8 | s[10] as u32 >> 16 | s[11] as u32 >> 24,
s[12] as u32 | s[13] as u32 >> 8 | s[14] as u32 >> 16 | s[15] as u32 >> 24,
)
}
fn pows(&self, exp: i64) -> Decimal {
if exp >= 0 {
return self.powi(exp);
}
let exp = exp.unsigned_abs();
let pow = self.powi(exp as i64);
Decimal::one() / pow
}
fn is_whole(&self) -> bool {
self.floor() == *self
}
}