use crate::lib::{Value, Number};
use crate::internal::{number_nan, value_nan, value_to_option_number};
pub fn x_ceil_x(n: Number, precision: isize) -> Number {
if n.is_u64() {
if precision < 0 {
let f = n.as_f64().unwrap();
let x = 10_f64.powi(precision as i32);
let result = (f * x).ceil() / x;
return Number::from(result as u64);
} else {
return n;
}
}
if n.is_i64() {
if precision < 0 {
let f = n.as_f64().unwrap();
let x = 10_f64.powi(precision as i32);
let result = (f * x).ceil() / x;
return Number::from(result as i64);
} else {
return n;
}
}
if precision == 0 {
let result = n.as_f64().unwrap().ceil();
if result < 0.0 {
return Number::from(result as i64);
} else {
return Number::from(result as u64);
}
}
let f = n.as_f64().unwrap();
let x = 10_f64.powi(precision as i32);
let result = (f * x).ceil() / x;
if precision < 0 {
if result < 0.0 {
return Number::from(result as i64);
} else {
return Number::from(result as u64);
}
}
Number::from_f64(result).unwrap_or_else(number_nan)
}
pub fn x_ceil(number: Number, precision: isize) -> Value {
Value::Number(x_ceil_x(number, precision))
}
pub fn ceil(number: Value, precision: isize) -> Value {
match value_to_option_number(number) {
Some(n) => x_ceil(n, precision),
None => value_nan(),
}
}
#[macro_export]
macro_rules! x_ceil_x {
() => {
$crate::internal::number_nan()
};
($a:expr $(,)*) => {
$crate::x_ceil_x($a, 0)
};
($a:expr, $b:expr $(,)*) => {
$crate::x_ceil_x($a, $b)
};
($a:expr, $b:expr, $($rest:tt)*) => {
$crate::x_ceil_x($a, $b)
};
}
#[macro_export]
macro_rules! ceil {
() => {
$crate::internal::value_nan()
};
($a:expr $(,)*) => {
$crate::ceil($a, 0)
};
($a:expr, $b:expr $(,)*) => {
$crate::ceil($a, $b)
};
($a:expr, $b:expr, $($rest:tt)*) => {
$crate::ceil($a, $b)
};
}