api3_common/util/
median.rs1use super::sort;
2use crate::abi::U256;
3
4pub 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
16pub 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}