diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs index 4f096cfff89b79951b91c0f05d50d2f91c1849b2..d8c3f080ce732ef9348f8f4929ec52e8d0007856 100644 --- a/oracle/src/default_combine_data.rs +++ b/oracle/src/default_combine_data.rs @@ -27,13 +27,13 @@ where let count = values.len() as u32; let minimum_count = MinimumCount::get(); - if count < minimum_count { + if count < minimum_count || count == 0 { return prev_value; } - values.sort_by(|a, b| a.value.cmp(&b.value)); - - let median_index = count / 2; - Some(values[median_index as usize].clone()) + let mid_index = count / 2; + // Won't panic as `values` ensured not empty. + let (_, value, _) = values.select_nth_unstable_by(mid_index as usize, |a, b| a.value.cmp(&b.value)); + Some(value.clone()) } } diff --git a/traits/src/data_provider.rs b/traits/src/data_provider.rs index 4b3483df3e840c8a1e2450db2d481978e802eb9a..650d3982cfd64d1da4fd61d39512c8b82bef5b24 100644 --- a/traits/src/data_provider.rs +++ b/traits/src/data_provider.rs @@ -30,10 +30,9 @@ pub fn median<T: Ord + Clone>(mut items: Vec<T>) -> Option<T> { let mid_index = items.len() / 2; - items.sort(); - - // Won't panic as guarded items not empty case. - Some(items[mid_index as usize].clone()) + // Won't panic as `items` ensured not empty. + let (_, item, _) = items.select_nth_unstable(mid_index); + Some(item.clone()) } #[macro_export]