numeric_arrays/
numeric_arrays.rs1use wolfram_library_link::{self as wll, NumericArray, NumericArrayKind};
2
3#[wll::export]
14fn sum_int_numeric_array(na: &NumericArray) -> i64 {
15 #[rustfmt::skip]
16 let sum: i64 = match na.kind() {
17 NumericArrayKind::Bit8(na) => na.as_slice().into_iter().copied().map(i64::from).sum(),
18 NumericArrayKind::Bit16(na) => na.as_slice().into_iter().copied().map(i64::from).sum(),
19 NumericArrayKind::Bit32(na) => na.as_slice().into_iter().copied().map(i64::from).sum(),
20 NumericArrayKind::Bit64(na) => na.as_slice().into_iter().sum(),
21 NumericArrayKind::UBit8(na) => na.as_slice().into_iter().copied().map(i64::from).sum(),
22 NumericArrayKind::UBit16(na) => na.as_slice().into_iter().copied().map(i64::from).sum(),
23 NumericArrayKind::UBit32(na) => na.as_slice().into_iter().copied().map(i64::from).sum(),
24 NumericArrayKind::UBit64(na) => {
25 match i64::try_from(na.as_slice().into_iter().sum::<u64>()) {
26 Ok(sum) => sum,
27 Err(_) => panic!("NumericArray UnsignedInteger64 sum overflows i64"),
28 }
29 },
30
31 NumericArrayKind::Real32(_)
32 | NumericArrayKind::Real64(_)
33 | NumericArrayKind::ComplexReal64(_) => panic!(
34 "sum_int_numeric_array cannot handle non-integer data type: {:?}",
35 na.data_type()
36 ),
37 };
38
39 sum
40}
41
42#[wll::export]
43fn sum_real_numeric_array(na: &NumericArray) -> f64 {
44 let sum: f64 = match na.kind() {
45 NumericArrayKind::Real32(na) => {
46 na.as_slice().into_iter().copied().map(f64::from).sum()
47 },
48 NumericArrayKind::Real64(na) => na.as_slice().into_iter().copied().sum(),
49 _ => panic!(
50 "sum_real_numeric_array cannot handle non-real data type: {:?}",
51 na.data_type()
52 ),
53 };
54
55 sum
56}