summaryrefslogtreecommitdiffstats
path: root/vendor/plotters/src/data/data_range.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/plotters/src/data/data_range.rs')
-rw-r--r--vendor/plotters/src/data/data_range.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/vendor/plotters/src/data/data_range.rs b/vendor/plotters/src/data/data_range.rs
new file mode 100644
index 000000000..445260b97
--- /dev/null
+++ b/vendor/plotters/src/data/data_range.rs
@@ -0,0 +1,42 @@
+use std::cmp::{Ordering, PartialOrd};
+use std::iter::IntoIterator;
+use std::ops::Range;
+
+use num_traits::{One, Zero};
+
+/// Build a range that fits the data
+///
+/// - `iter`: the iterator over the data
+/// - **returns** The resulting range
+///
+/// ```rust
+/// use plotters::data::fitting_range;
+///
+/// let data = [4, 14, -2, 2, 5];
+/// let range = fitting_range(&data);
+/// assert_eq!(range, std::ops::Range { start: -2, end: 14 });
+/// ```
+pub fn fitting_range<'a, T: 'a, I: IntoIterator<Item = &'a T>>(iter: I) -> Range<T>
+where
+ T: Zero + One + PartialOrd + Clone,
+{
+ let (mut lb, mut ub) = (None, None);
+
+ for value in iter.into_iter() {
+ if let Some(Ordering::Greater) = lb
+ .as_ref()
+ .map_or(Some(Ordering::Greater), |lbv: &T| lbv.partial_cmp(value))
+ {
+ lb = Some(value.clone());
+ }
+
+ if let Some(Ordering::Less) = ub
+ .as_ref()
+ .map_or(Some(Ordering::Less), |ubv: &T| ubv.partial_cmp(value))
+ {
+ ub = Some(value.clone());
+ }
+ }
+
+ lb.unwrap_or_else(Zero::zero)..ub.unwrap_or_else(One::one)
+}