api3_common/util/
median.rs

1use super::sort;
2use crate::abi::U256;
3
4/// get the median from an array of U256
5pub fn median(array: &[U256]) -> U256 {
6    let len = array.len();
7    let array = sort(array);
8    let mid: usize = len / 2;
9    if len % 2 == 1 {
10        array[mid]
11    } else {
12        (array[mid - 1] + array[mid]) / 2
13    }
14}
15
16/// TODO: find a way to unify this with the non-wrapped one
17pub fn median_wrapped_u256(array: &[U256]) -> U256 {
18    let len = array.len();
19    let array = sort(array);
20    let mid: usize = len / 2;
21    if len % 2 == 1 {
22        array[mid]
23    } else {
24        (array[mid - 1] + array[mid]) / 2
25    }
26}
27
28#[test]
29fn ideal_median() {
30    let numbers = vec![U256::from(1_i128), U256::from(2_i128), U256::from(3_i128)];
31    let result = median(&numbers);
32    assert_eq!(result, U256::from(2_i128));
33}
34
35#[test]
36fn even_length() {
37    let numbers = vec![
38        U256::from(2_u128),
39        U256::from(3_u128),
40        U256::from(5_u128),
41        U256::from(9_u128),
42    ];
43    let result = median(&numbers);
44    assert_eq!(result, U256::from(4_i128));
45}