[yew-devel] [PATCH yew-comp 02/20] rrd: refactor code for compute_min_max
Dominik Csapak
d.csapak at proxmox.com
Fri May 30 14:21:44 CEST 2025
using some simple combinators makes the code a bit shorter and more
readable. Using +/- INFINITY as marker for having no values, reduces the
code further since we don't have to handle the options in the loop.
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
src/rrd_graph_new.rs | 35 ++++++++++-------------------------
1 file changed, 10 insertions(+), 25 deletions(-)
diff --git a/src/rrd_graph_new.rs b/src/rrd_graph_new.rs
index 2c77a38..bfa7d1e 100644
--- a/src/rrd_graph_new.rs
+++ b/src/rrd_graph_new.rs
@@ -311,34 +311,19 @@ fn render_value(props: &RRDGraph, v: f64) -> String {
}
fn compute_min_max(props: &RRDGraph, data1: &[f64], data2: &[f64]) -> (f64, f64, f64) {
- let mut min_data: Option<f64> = None;
- let mut max_data: Option<f64> = None;
+ let mut min_data: f64 = f64::INFINITY;
+ let mut max_data: f64 = -f64::INFINITY;
- for data in [data1, data2] {
- for v in data.iter() {
- if !v.is_finite() {
- continue; // NaN, INFINITY
- }
- if let Some(min) = min_data {
- if *v < min {
- min_data = Some(*v);
- }
- } else {
- min_data = Some(*v);
- }
-
- if let Some(max) = max_data {
- if *v > max {
- max_data = Some(*v);
- }
- } else {
- max_data = Some(*v);
- }
- }
+ for v in data1.iter().chain(data2).filter(|v| v.is_finite()) {
+ min_data = min_data.min(*v);
+ max_data = max_data.max(*v);
}
- let mut max_data = max_data.unwrap_or(1.0);
- let mut min_data = min_data.unwrap_or(0.0);
+ // if one is infinite, the other must be too
+ if min_data.is_infinite() || max_data.is_infinite() {
+ min_data = 0.0;
+ max_data = 1.0;
+ }
if props.include_zero {
max_data = max_data.max(0.0);
--
2.39.5
More information about the yew-devel
mailing list