aboutsummaryrefslogtreecommitdiff
path: root/rust/triangle/src/lib.rs
blob: f4486fea7152c13ed56cef840b208b8f20c3c3e7 (plain) (blame)
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
use std::ops::Add;

pub struct Triangle<T>([T; 3]);

impl<T> Triangle<T>
where
    T: Add<Output = T> + PartialOrd + Copy,
{
    pub fn build(sides: [T; 3]) -> Option<Triangle<T>> {
        Some(Triangle(sides))
            .filter(|_| sides[0] + sides[1] > sides[2])
            .filter(|_| sides[1] + sides[2] > sides[0])
            .filter(|_| sides[0] + sides[2] > sides[1])
    }

    pub fn is_equilateral(&self) -> bool {
        self.0[0] == self.0[1] && self.0[1] == self.0[2]
    }

    pub fn is_scalene(&self) -> bool {
        self.0[0] != self.0[1] && self.0[1] != self.0[2] && self.0[0] != self.0[2]
    }

    pub fn is_isosceles(&self) -> bool {
        !(self.is_equilateral() || self.is_scalene())
    }
}