diff options
Diffstat (limited to 'rust/triangle/src/lib.rs')
| -rw-r--r-- | rust/triangle/src/lib.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/rust/triangle/src/lib.rs b/rust/triangle/src/lib.rs new file mode 100644 index 0000000..f4486fe --- /dev/null +++ b/rust/triangle/src/lib.rs | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | use std::ops::Add; | ||
| 2 | |||
| 3 | pub struct Triangle<T>([T; 3]); | ||
| 4 | |||
| 5 | impl<T> Triangle<T> | ||
| 6 | where | ||
| 7 | T: Add<Output = T> + PartialOrd + Copy, | ||
| 8 | { | ||
| 9 | pub fn build(sides: [T; 3]) -> Option<Triangle<T>> { | ||
| 10 | Some(Triangle(sides)) | ||
| 11 | .filter(|_| sides[0] + sides[1] > sides[2]) | ||
| 12 | .filter(|_| sides[1] + sides[2] > sides[0]) | ||
| 13 | .filter(|_| sides[0] + sides[2] > sides[1]) | ||
| 14 | } | ||
| 15 | |||
| 16 | pub fn is_equilateral(&self) -> bool { | ||
| 17 | self.0[0] == self.0[1] && self.0[1] == self.0[2] | ||
| 18 | } | ||
| 19 | |||
| 20 | pub fn is_scalene(&self) -> bool { | ||
| 21 | self.0[0] != self.0[1] && self.0[1] != self.0[2] && self.0[0] != self.0[2] | ||
| 22 | } | ||
| 23 | |||
| 24 | pub fn is_isosceles(&self) -> bool { | ||
| 25 | !(self.is_equilateral() || self.is_scalene()) | ||
| 26 | } | ||
| 27 | } | ||
