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
use super::*;

impl<T> Debug for Point<T>
where
    T: Debug,
{
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("Point").field("x", &self.x).field("y", &self.y).finish()
    }
}

impl<T> Display for Point<T>
where
    T: Display,
{
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "({}, {})", self.x, self.y)
    }
}

impl<T: Zero> Default for Point<T> {
    fn default() -> Self {
        Self { x: T::zero(), y: T::zero() }
    }
}

impl<T> From<&Point<T>> for Point<T>
where
    T: Clone,
{
    fn from(point: &Point<T>) -> Self {
        Self { x: point.x.clone(), y: point.y.clone() }
    }
}

impl<T> From<Point<&T>> for Point<T>
where
    T: Clone,
{
    fn from(point: Point<&T>) -> Self {
        Self { x: point.x.clone(), y: point.y.clone() }
    }
}

impl<T> From<(T, T)> for Point<T> {
    fn from((x, y): (T, T)) -> Self {
        Self { x, y }
    }
}

impl<T> From<[T; 2]> for Point<T> {
    fn from([x, y]: [T; 2]) -> Self {
        Self { x, y }
    }
}

impl<T> Point<T> {
    /// Construct new points
    pub fn new(x: T, y: T) -> Self {
        Self { x, y }
    }
}