wordcut_engine/
edge.rs

1#[derive(Clone, PartialEq, Eq, Copy, Debug, Serialize, Deserialize)]
2pub enum EdgeType {
3    Init,
4    Dict,
5    Unk,
6    Pat,
7}
8
9#[derive(Clone, Copy, Debug, PartialEq)]
10pub struct Edge {
11    pub w: usize,
12    pub unk: usize,
13    pub p: usize,
14    pub etype: EdgeType,
15}
16
17impl Edge {
18    pub fn is_unk(&self) -> bool {
19        self.etype == EdgeType::Unk
20    }
21
22    pub fn better_than(&self, o: &Edge) -> bool {
23        if self.etype == EdgeType::Pat && o.etype == EdgeType::Unk {
24            return true;
25        }
26
27        if self.etype == EdgeType::Unk && o.etype == EdgeType::Pat {
28            return false;
29        }
30        if self.unk < o.unk {
31            return true;
32        }
33
34        if self.unk > o.unk {
35            return false;
36        }
37
38        if self.w < o.w {
39            return true;
40        }
41
42        if self.w > o.w {
43            return false;
44        }
45
46        if o.is_unk() && !self.is_unk() {
47            return true;
48        }
49
50        false
51    }
52
53    pub fn better(a: &Option<Edge>, b: &Option<Edge>) -> bool {
54        if a.is_none() {
55            return false;
56        }
57
58        if b.is_none() {
59            return true;
60        }
61
62        a.unwrap().better_than(&b.unwrap())
63    }
64}