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