1use std::ops::{Add, Div, Mul, Range, RangeFrom, RangeInclusive, RangeToInclusive, Sub};
3
4pub trait Restrict<RangeType> {
9 fn restrict(self, range: RangeType) -> Self;
16}
17
18impl<T> Restrict<RangeInclusive<T>> for T
19where
20 T: PartialOrd,
21{
22 fn restrict(self, range: RangeInclusive<T>) -> T {
23 let (start, end) = range.into_inner();
24 if self > end {
25 return end;
26 }
27 if self < start {
28 return start;
29 }
30 self
31 }
32}
33
34impl<T> Restrict<RangeToInclusive<T>> for T
35where
36 T: PartialOrd,
37{
38 fn restrict(self, range: RangeToInclusive<T>) -> T {
39 if self > range.end {
40 return range.end;
41 }
42 self
43 }
44}
45
46impl<T> Restrict<RangeFrom<T>> for T
47where
48 T: PartialOrd,
49{
50 fn restrict(self, range: RangeFrom<T>) -> T {
51 if self < range.start {
52 return range.start;
53 }
54 self
55 }
56}
57
58pub trait Remap
60where
61 Self: Sized,
62{
63 fn remap(self, from: Range<Self>, onto: Range<Self>) -> Self;
71}
72
73impl<T> Remap for T
74where
75 T: Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + Copy,
76{
77 fn remap(self, from: Range<Self>, onto: Range<Self>) -> Self {
78 let from_size = from.end - from.start;
79 let onto_size = onto.end - onto.start;
80 ((self - from.start) * onto_size / from_size) + onto.start
81 }
82}