1pub mod i32 {
2 use abs::abs;
3
4 #[derive(Clone)]
5 pub struct Point(i32, i32);
6
7 #[derive(Clone)]
8 pub struct Rect(std::ops::Range<Point>);
9
10 impl Rect {
11 pub fn width(&self) -> i32 {
12 let x1 = self.0.start.0;
13 let x2 = self.0.end.0;
14 abs(x1, x2)
15 }
16 pub fn height(&self) -> i32 {
17 let y1 = self.0.start.1;
18 let y2 = self.0.end.1;
19 abs(y1, y2)
20 }
21 pub fn area(&self) -> i32 {
22 self.width() * self.height()
23 }
24 }
25 #[cfg(test)]
26 mod tests {
27 use super::*;
28 #[test]
29 fn it_works() {
30 let a = Point(-2, 2);
31 let b = Point(-3, 5);
32 let r = Rect(a..b);
33 assert_eq!(r.width(), 1);
34 assert_eq!(r.height(), 3);
35 assert_eq!(r.area(), 3);
36 }
37 }
38}
39
40pub mod tuple {
41 use abs::abs;
42
43 #[derive(Clone)]
44 pub struct Point<T>(T, T)
45 where
46 T: Clone + PartialOrd + std::ops::Sub<Output = T>;
47
48 #[derive(Clone)]
49 pub struct Rect<T>(std::ops::Range<Point<T>>)
50 where
51 T: Clone + PartialOrd + std::ops::Sub<Output = T>;
52
53 impl<T> Rect<T>
54 where
55 T: Clone + PartialOrd + std::ops::Sub<Output = T> + std::ops::Mul<Output = T>,
56 {
57 pub fn width(&self) -> T {
58 let x1 = self.0.clone().start.0;
59 let x2 = self.0.clone().end.0;
60 abs(x1, x2)
61 }
62 pub fn height(&self) -> T {
63 let y1 = self.0.clone().start.1;
64 let y2 = self.0.clone().end.1;
65 abs(y1, y2)
66 }
67 pub fn area(&self) -> T {
68 self.width() * self.height()
69 }
70 }
71 #[cfg(test)]
72 mod tests {
73 use super::*;
74 #[test]
75 fn it_works() {
76 let a = Point(-2, 2);
77 let b = Point(-3, 5);
78 let r = Rect(a..b);
79 assert_eq!(r.width(), 1);
80 assert_eq!(r.height(), 3);
81 assert_eq!(r.area(), 3);
82 }
83 }
84}
85
86pub mod generic {
87 use abs::abs;
88
89 #[derive(Clone)]
90 pub struct Point<T>
91 where
92 T: Clone + PartialOrd + std::ops::Sub<Output = T>,
93 {
94 pub x: T,
95 pub y: T,
96 }
97
98 #[derive(Clone)]
99 pub struct Rect<T>
100 where
101 T: Clone + PartialOrd + std::ops::Sub<Output = T>,
102 {
103 range: std::ops::Range<Point<T>>,
104 }
105
106 impl<T> Rect<T>
107 where
108 T: Clone + PartialOrd + std::ops::Sub<Output = T> + std::ops::Mul<Output = T>,
109 {
110 pub fn width(&self) -> T {
111 let x1 = self.range.clone().start.x;
112 let x2 = self.range.clone().end.x;
113 abs(x1, x2)
114 }
115 pub fn height(&self) -> T {
116 let y1 = self.range.clone().start.y;
117 let y2 = self.range.clone().end.y;
118 abs(y1, y2)
119 }
120 pub fn area(&self) -> T {
121 self.width() * self.height()
122 }
123 }
124
125 #[cfg(test)]
126 mod tests {
127 use super::*;
128 #[test]
129 fn it_works() {
130 let a = Point { x: -2, y: 2 };
131 let b = Point { x: -3, y: 5 };
132 let r = Rect { range: a..b };
133 assert_eq!(r.width(), 1);
134 assert_eq!(r.height(), 3);
135 assert_eq!(r.area(), 3);
136 }
137 }
138}