numeric_arrays/
numeric_arrays.rs

1use wolfram_library_link::{self as wll, NumericArray, NumericArrayKind};
2
3/// This function is loaded by evaluating:
4///
5/// ```wolfram
6/// LibraryFunctionLoad[
7///     "/path/to/libnumeric_arrays.dylib",
8///     "sum_int_numeric_array",
9///     {NumericArray},
10///     Integer
11/// ]
12/// ```
13#[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}