rant/
util.rs

1use crate::RantValue;
2
3/// Sorts `a` and `b` in ascending order and returns them as a `(min, max)` tuple.
4#[inline]
5pub fn minmax<T: PartialEq + PartialOrd>(a: T, b: T) -> (T, T) {
6  if a <= b { (a, b) } else { (b, a) }
7}
8
9/// Clamps `val` between `a` and `b`.
10#[inline]
11pub fn clamp<T: PartialEq + PartialOrd>(val: T, a: T, b: T) -> T {
12  let (min, max) = minmax(a, b);
13  if val >= min && val <= max {
14    val
15  } else if val < min {
16    min
17  } else {
18    max
19  }
20}
21
22/// Clamps `val` between 0 and 1.
23#[inline]
24pub fn saturate(val: f64) -> f64 {
25  if val < 0. {
26    0.
27  } else if val > 1. {
28    1.
29  } else {
30    val
31  }
32}
33
34/// Converts `true` to `1` and `false` to `0`.
35#[inline(always)]
36pub fn bi64(val: bool) -> i64 {
37  if val { 1 } else { 0 }
38}
39
40/// Converts `true` to `1.0` and `false` to `0.0`.
41#[inline(always)]
42pub fn bf64(val: bool) -> f64 {
43  if val { 1.0 } else { 0.0 }
44}
45
46#[inline]
47pub fn max_rant_value<'a>(mut iter: impl Iterator<Item = &'a RantValue>) -> Option<&'a RantValue> {
48  if let Some(mut max) = iter.next() {
49    for val in iter {
50      if val >= max {
51        max = val;
52      }
53    }
54    Some(max)
55  } else {
56    None
57  }
58}
59
60#[inline]
61pub fn min_rant_value<'a>(mut iter: impl Iterator<Item = &'a RantValue>) -> Option<&'a RantValue> {
62  if let Some(mut min) = iter.next() {
63    for val in iter {
64      if val < min {
65        min = val;
66      }
67    }
68    Some(min)
69  } else {
70    None
71  }
72}