rect/
lib.rs

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}