klavier_core/
clipper.rs

1#[derive(Debug, Clone)]
2pub struct Clipper<T> where T: PartialOrd + Copy {
3    pub min: T,
4    pub max: T,
5}
6
7pub const fn for_i32(min: i32, max: i32) -> Clipper<i32> {
8    Clipper::<i32> { min, max, }
9}
10
11pub const fn for_i16(min: i16, max: i16) -> Clipper<i16> {
12    Clipper::<i16> { min, max, }
13}
14
15pub const fn for_f32(min: f32, max: f32) -> Clipper<f32> {
16    Clipper::<f32> { min, max, }
17}
18
19impl <T: PartialOrd + Copy> Clipper<T> {
20    pub fn clip(&self, value: T) -> T {
21        if value < self.min {
22            self.min
23        } else if self.max < value {
24            self.max
25        } else {
26            value
27        }
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use crate::clipper;
34
35    #[test]
36    fn can_i32_clipped() {
37        let clipper = clipper::for_i32(5, 10);
38        assert_eq!(clipper.clip(4), 5);
39        assert_eq!(clipper.clip(5), 5);
40        assert_eq!(clipper.clip(6), 6);
41        assert_eq!(clipper.clip(9), 9);
42        assert_eq!(clipper.clip(10), 10);
43        assert_eq!(clipper.clip(11), 10);
44    }
45
46    #[test]
47    fn can_f32_clipped() {
48        let clipper = clipper::for_f32(5f32, 10f32);
49        assert_eq!(clipper.clip(4f32), 5f32);
50        assert_eq!(clipper.clip(5f32), 5f32);
51        assert_eq!(clipper.clip(6f32), 6f32);
52        assert_eq!(clipper.clip(9f32), 9f32);
53        assert_eq!(clipper.clip(10f32), 10f32);
54        assert_eq!(clipper.clip(11f32), 10f32);
55    }
56}