1use std::fmt::Debug;
2
3use crate::Vertice;
4
5pub trait Edge<T: PartialOrd + Debug + Debug> {
6 fn ver_a(&self) -> &Vertice<T>; fn ver_b(&self) -> &Vertice<T>; fn distance(&self) -> &usize;
11
12 fn is_loop(&self) -> bool {
13 self.ver_a() == self.ver_b()
14 }
15}
16
17#[derive(PartialEq, Eq, Hash)]
27pub struct SymmetricEdge<T: PartialOrd + Debug + Debug> {
28 ver_a: Vertice<T>,
30
31 ver_b: Vertice<T>,
33
34 distance: usize,
35}
36
37impl<T: PartialOrd + Debug + Debug> SymmetricEdge<T> {
38 pub fn new(a: Vertice<T>, b: Vertice<T>) -> Self {
39 if a.0 < b.0 {
40 Self {
41 ver_a: a,
42 ver_b: b,
43 distance: 1,
44 }
45 } else {
46 Self {
47 ver_a: b,
48 ver_b: a,
49 distance: 1,
50 }
51 }
52 }
53}
54
55impl<T: PartialOrd + Debug + Debug> Edge<T> for SymmetricEdge<T> {
56 fn ver_a(&self) -> &Vertice<T> {
57 &self.ver_a
58 }
59
60 fn ver_b(&self) -> &Vertice<T> {
61 &self.ver_b
62 }
63
64 fn distance(&self) -> &usize {
65 &self.distance
66 }
67}
68
69#[derive(PartialEq, Eq, Hash)]
81pub struct AsymmetricEdge<T: PartialOrd + Debug> {
82 ver_a: Vertice<T>,
83 ver_b: Vertice<T>,
84 distance: usize,
85}
86
87impl<T: PartialOrd + Debug> AsymmetricEdge<T> {
88 pub fn new(from: Vertice<T>, to: Vertice<T>) -> Self {
89 Self {
90 ver_a: from,
91 ver_b: to,
92 distance: 1,
93 }
94 }
95
96 pub fn with_distance(distance: usize, from: Vertice<T>, to: Vertice<T>) -> Self {
97 Self {
98 ver_a: from,
99 ver_b: to,
100 distance,
101 }
102 }
103}
104
105impl<T: PartialOrd + Debug> Edge<T> for AsymmetricEdge<T> {
106 fn ver_a(&self) -> &Vertice<T> {
107 &self.ver_a
108 }
109
110 fn ver_b(&self) -> &Vertice<T> {
111 &self.ver_b
112 }
113
114 fn distance(&self) -> &usize {
115 &self.distance
116 }
117}