use std::any::Any;
use std::sync::Arc;
pub fn abs_value(v: &Arc<dyn Any + Send + Sync>) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let Ok(arc_i32) = v.clone().downcast::<i32>() {
return Ok(Arc::new(arc_i32.abs()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_i64) = v.clone().downcast::<i64>() {
return Ok(Arc::new(arc_i64.abs()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u32) = v.clone().downcast::<u32>() {
return Ok(Arc::new(*arc_u32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u64) = v.clone().downcast::<u64>() {
return Ok(Arc::new(*arc_u64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f32) = v.clone().downcast::<f32>() {
return Ok(Arc::new(arc_f32.abs()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f64) = v.clone().downcast::<f64>() {
return Ok(Arc::new(arc_f64.abs()) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported type for absolute value: {}",
std::any::type_name_of_val(&**v)
))
}
pub fn min_values(
v1: &Arc<dyn Any + Send + Sync>,
v2: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let (Ok(arc_i32_1), Ok(arc_i32_2)) =
(v1.clone().downcast::<i32>(), v2.clone().downcast::<i32>())
{
return Ok(Arc::new((*arc_i32_1).min(*arc_i32_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i64_1), Ok(arc_i64_2)) =
(v1.clone().downcast::<i64>(), v2.clone().downcast::<i64>())
{
return Ok(Arc::new((*arc_i64_1).min(*arc_i64_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u32_1), Ok(arc_u32_2)) =
(v1.clone().downcast::<u32>(), v2.clone().downcast::<u32>())
{
return Ok(Arc::new((*arc_u32_1).min(*arc_u32_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u64_1), Ok(arc_u64_2)) =
(v1.clone().downcast::<u64>(), v2.clone().downcast::<u64>())
{
return Ok(Arc::new((*arc_u64_1).min(*arc_u64_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f32_1), Ok(arc_f32_2)) =
(v1.clone().downcast::<f32>(), v2.clone().downcast::<f32>())
{
return Ok(Arc::new((*arc_f32_1).min(*arc_f32_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64_1), Ok(arc_f64_2)) =
(v1.clone().downcast::<f64>(), v2.clone().downcast::<f64>())
{
return Ok(Arc::new((*arc_f64_1).min(*arc_f64_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i32), Ok(arc_i64)) = (v1.clone().downcast::<i32>(), v2.clone().downcast::<i64>()) {
return Ok(Arc::new((*arc_i32 as i64).min(*arc_i64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i64), Ok(arc_i32)) = (v1.clone().downcast::<i64>(), v2.clone().downcast::<i32>()) {
return Ok(Arc::new((*arc_i64).min(*arc_i32 as i64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u32), Ok(arc_u64)) = (v1.clone().downcast::<u32>(), v2.clone().downcast::<u64>()) {
return Ok(Arc::new((*arc_u32 as u64).min(*arc_u64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u64), Ok(arc_u32)) = (v1.clone().downcast::<u64>(), v2.clone().downcast::<u32>()) {
return Ok(Arc::new((*arc_u64).min(*arc_u32 as u64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i32), Ok(arc_f32)) = (v1.clone().downcast::<i32>(), v2.clone().downcast::<f32>()) {
return Ok(Arc::new((*arc_i32 as f32).min(*arc_f32)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f32), Ok(arc_i32)) = (v1.clone().downcast::<f32>(), v2.clone().downcast::<i32>()) {
return Ok(Arc::new((*arc_f32).min(*arc_i32 as f32)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i32), Ok(arc_f64)) = (v1.clone().downcast::<i32>(), v2.clone().downcast::<f64>()) {
return Ok(Arc::new((*arc_i32 as f64).min(*arc_f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64), Ok(arc_i32)) = (v1.clone().downcast::<f64>(), v2.clone().downcast::<i32>()) {
return Ok(Arc::new((*arc_f64).min(*arc_i32 as f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i64), Ok(arc_f64)) = (v1.clone().downcast::<i64>(), v2.clone().downcast::<f64>()) {
return Ok(Arc::new((*arc_i64 as f64).min(*arc_f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64), Ok(arc_i64)) = (v1.clone().downcast::<f64>(), v2.clone().downcast::<i64>()) {
return Ok(Arc::new((*arc_f64).min(*arc_i64 as f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f32), Ok(arc_f64)) = (v1.clone().downcast::<f32>(), v2.clone().downcast::<f64>()) {
return Ok(Arc::new((*arc_f32 as f64).min(*arc_f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64), Ok(arc_f32)) = (v1.clone().downcast::<f64>(), v2.clone().downcast::<f32>()) {
return Ok(Arc::new((*arc_f64).min(*arc_f32 as f64)) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported types for minimum: {} and {}",
std::any::type_name_of_val(&**v1),
std::any::type_name_of_val(&**v2)
))
}
pub fn max_values(
v1: &Arc<dyn Any + Send + Sync>,
v2: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let (Ok(arc_i32_1), Ok(arc_i32_2)) =
(v1.clone().downcast::<i32>(), v2.clone().downcast::<i32>())
{
return Ok(Arc::new((*arc_i32_1).max(*arc_i32_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i64_1), Ok(arc_i64_2)) =
(v1.clone().downcast::<i64>(), v2.clone().downcast::<i64>())
{
return Ok(Arc::new((*arc_i64_1).max(*arc_i64_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u32_1), Ok(arc_u32_2)) =
(v1.clone().downcast::<u32>(), v2.clone().downcast::<u32>())
{
return Ok(Arc::new((*arc_u32_1).max(*arc_u32_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u64_1), Ok(arc_u64_2)) =
(v1.clone().downcast::<u64>(), v2.clone().downcast::<u64>())
{
return Ok(Arc::new((*arc_u64_1).max(*arc_u64_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f32_1), Ok(arc_f32_2)) =
(v1.clone().downcast::<f32>(), v2.clone().downcast::<f32>())
{
return Ok(Arc::new((*arc_f32_1).max(*arc_f32_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64_1), Ok(arc_f64_2)) =
(v1.clone().downcast::<f64>(), v2.clone().downcast::<f64>())
{
return Ok(Arc::new((*arc_f64_1).max(*arc_f64_2)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i32), Ok(arc_i64)) = (v1.clone().downcast::<i32>(), v2.clone().downcast::<i64>()) {
return Ok(Arc::new((*arc_i32 as i64).max(*arc_i64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i64), Ok(arc_i32)) = (v1.clone().downcast::<i64>(), v2.clone().downcast::<i32>()) {
return Ok(Arc::new((*arc_i64).max(*arc_i32 as i64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u32), Ok(arc_u64)) = (v1.clone().downcast::<u32>(), v2.clone().downcast::<u64>()) {
return Ok(Arc::new((*arc_u32 as u64).max(*arc_u64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_u64), Ok(arc_u32)) = (v1.clone().downcast::<u64>(), v2.clone().downcast::<u32>()) {
return Ok(Arc::new((*arc_u64).max(*arc_u32 as u64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i32), Ok(arc_f32)) = (v1.clone().downcast::<i32>(), v2.clone().downcast::<f32>()) {
return Ok(Arc::new((*arc_i32 as f32).max(*arc_f32)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f32), Ok(arc_i32)) = (v1.clone().downcast::<f32>(), v2.clone().downcast::<i32>()) {
return Ok(Arc::new((*arc_f32).max(*arc_i32 as f32)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i32), Ok(arc_f64)) = (v1.clone().downcast::<i32>(), v2.clone().downcast::<f64>()) {
return Ok(Arc::new((*arc_i32 as f64).max(*arc_f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64), Ok(arc_i32)) = (v1.clone().downcast::<f64>(), v2.clone().downcast::<i32>()) {
return Ok(Arc::new((*arc_f64).max(*arc_i32 as f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_i64), Ok(arc_f64)) = (v1.clone().downcast::<i64>(), v2.clone().downcast::<f64>()) {
return Ok(Arc::new((*arc_i64 as f64).max(*arc_f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64), Ok(arc_i64)) = (v1.clone().downcast::<f64>(), v2.clone().downcast::<i64>()) {
return Ok(Arc::new((*arc_f64).max(*arc_i64 as f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f32), Ok(arc_f64)) = (v1.clone().downcast::<f32>(), v2.clone().downcast::<f64>()) {
return Ok(Arc::new((*arc_f32 as f64).max(*arc_f64)) as Arc<dyn Any + Send + Sync>);
}
if let (Ok(arc_f64), Ok(arc_f32)) = (v1.clone().downcast::<f64>(), v2.clone().downcast::<f32>()) {
return Ok(Arc::new((*arc_f64).max(*arc_f32 as f64)) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported types for maximum: {} and {}",
std::any::type_name_of_val(&**v1),
std::any::type_name_of_val(&**v2)
))
}
pub fn round_value(
value: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let Ok(arc_i32) = value.clone().downcast::<i32>() {
return Ok(Arc::new(*arc_i32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_i64) = value.clone().downcast::<i64>() {
return Ok(Arc::new(*arc_i64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u32) = value.clone().downcast::<u32>() {
return Ok(Arc::new(*arc_u32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u64) = value.clone().downcast::<u64>() {
return Ok(Arc::new(*arc_u64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f32) = value.clone().downcast::<f32>() {
return Ok(Arc::new(arc_f32.round() as i64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f64) = value.clone().downcast::<f64>() {
return Ok(Arc::new(arc_f64.round() as i64) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported type for rounding: {}",
std::any::type_name_of_val(&**value)
))
}
pub fn floor_value(
value: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let Ok(arc_i32) = value.clone().downcast::<i32>() {
return Ok(Arc::new(*arc_i32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_i64) = value.clone().downcast::<i64>() {
return Ok(Arc::new(*arc_i64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u32) = value.clone().downcast::<u32>() {
return Ok(Arc::new(*arc_u32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u64) = value.clone().downcast::<u64>() {
return Ok(Arc::new(*arc_u64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f32) = value.clone().downcast::<f32>() {
return Ok(Arc::new(arc_f32.floor() as i64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f64) = value.clone().downcast::<f64>() {
return Ok(Arc::new(arc_f64.floor() as i64) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported type for floor: {}",
std::any::type_name_of_val(&**value)
))
}
pub fn ceil_value(
value: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let Ok(arc_i32) = value.clone().downcast::<i32>() {
return Ok(Arc::new(*arc_i32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_i64) = value.clone().downcast::<i64>() {
return Ok(Arc::new(*arc_i64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u32) = value.clone().downcast::<u32>() {
return Ok(Arc::new(*arc_u32) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u64) = value.clone().downcast::<u64>() {
return Ok(Arc::new(*arc_u64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f32) = value.clone().downcast::<f32>() {
return Ok(Arc::new(arc_f32.ceil() as i64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f64) = value.clone().downcast::<f64>() {
return Ok(Arc::new(arc_f64.ceil() as i64) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported type for ceil: {}",
std::any::type_name_of_val(&**value)
))
}
pub fn sqrt_value(
value: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
if let Ok(arc_i32) = value.clone().downcast::<i32>() {
let val = *arc_i32 as f64;
if val < 0.0 {
return Err(format!("Square root of negative number: {}", val));
}
return Ok(Arc::new(val.sqrt()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_i64) = value.clone().downcast::<i64>() {
let val = *arc_i64 as f64;
if val < 0.0 {
return Err(format!("Square root of negative number: {}", val));
}
return Ok(Arc::new(val.sqrt()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u32) = value.clone().downcast::<u32>() {
let val = *arc_u32 as f64;
return Ok(Arc::new(val.sqrt()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_u64) = value.clone().downcast::<u64>() {
let val = *arc_u64 as f64;
return Ok(Arc::new(val.sqrt()) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f32) = value.clone().downcast::<f32>() {
let val = *arc_f32;
if val < 0.0 {
return Err(format!("Square root of negative number: {}", val));
}
return Ok(Arc::new(val.sqrt() as f64) as Arc<dyn Any + Send + Sync>);
}
if let Ok(arc_f64) = value.clone().downcast::<f64>() {
let val = *arc_f64;
if val < 0.0 {
return Err(format!("Square root of negative number: {}", val));
}
return Ok(Arc::new(val.sqrt()) as Arc<dyn Any + Send + Sync>);
}
Err(format!(
"Unsupported type for square root: {}",
std::any::type_name_of_val(&**value)
))
}
pub fn log_values(
value: &Arc<dyn Any + Send + Sync>,
base: &Arc<dyn Any + Send + Sync>,
) -> Result<Arc<dyn Any + Send + Sync>, String> {
let value_f64 = match value.clone().downcast::<i32>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<i64>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<u32>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<u64>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<f32>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<f64>() {
Ok(arc) => *arc,
Err(_) => {
return Err(format!(
"Unsupported type for logarithm value: {}",
std::any::type_name_of_val(&**value)
));
}
},
},
},
},
},
};
let base_f64 = match base.clone().downcast::<i32>() {
Ok(arc) => *arc as f64,
Err(_) => match base.clone().downcast::<i64>() {
Ok(arc) => *arc as f64,
Err(_) => match base.clone().downcast::<u32>() {
Ok(arc) => *arc as f64,
Err(_) => match base.clone().downcast::<u64>() {
Ok(arc) => *arc as f64,
Err(_) => match base.clone().downcast::<f32>() {
Ok(arc) => *arc as f64,
Err(_) => match base.clone().downcast::<f64>() {
Ok(arc) => *arc,
Err(_) => {
return Err(format!(
"Unsupported type for logarithm base: {}",
std::any::type_name_of_val(&**base)
));
}
},
},
},
},
},
};
if value_f64 <= 0.0 {
return Err(format!("Logarithm value must be positive: {}", value_f64));
}
if base_f64 <= 0.0 || base_f64 == 1.0 {
return Err(format!(
"Logarithm base must be positive and not equal to 1: {}",
base_f64
));
}
let result = value_f64.ln() / base_f64.ln();
Ok(Arc::new(result) as Arc<dyn Any + Send + Sync>)
}
pub fn exp_value(value: &Arc<dyn Any + Send + Sync>) -> Result<Arc<dyn Any + Send + Sync>, String> {
let value_f64 = match value.clone().downcast::<i32>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<i64>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<u32>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<u64>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<f32>() {
Ok(arc) => *arc as f64,
Err(_) => match value.clone().downcast::<f64>() {
Ok(arc) => *arc,
Err(_) => {
return Err(format!(
"Unsupported type for exponential: {}",
std::any::type_name_of_val(&**value)
));
}
},
},
},
},
},
};
let result = value_f64.exp();
Ok(Arc::new(result) as Arc<dyn Any + Send + Sync>)
}