/
prec.go
60 lines (51 loc) · 1.1 KB
/
prec.go
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
package main
type Prec struct {
Sets []map[string]int
NameToSet map[string]int
}
func NewPrec() *Prec {
return &Prec{NameToSet: make(map[string]int)}
}
func (p *Prec) AddSet(precs ...string) {
set := make(map[string]int)
setIndex, i := len(p.Sets), 0
for _, prec := range precs {
set[prec] = i
p.NameToSet[prec] = setIndex
i++
}
p.Sets = append(p.Sets, set)
}
func (p *Prec) InAnySet(name string) bool {
_, ok := p.NameToSet[name]
return ok
}
func (p *Prec) InSameSet(n, n2 string) bool {
ok, ok2 := p.InAnySet(n), p.InAnySet(n2)
if !ok || !ok2 {
return false
}
set1, set2 := p.NameToSet[n], p.NameToSet[n2]
return set1 == set2
}
func (p *Prec) GreaterThan(greater, lesser string) bool {
if !p.InSameSet(greater, lesser) {
return false
}
set := p.Sets[p.NameToSet[greater]]
return set[greater] > set[lesser]
}
func (p *Prec) LessThanItem(greater string) (l []string) {
if len(p.Sets) == 0 {
return nil
}
setIndex := p.NameToSet[greater]
set := p.Sets[setIndex]
ref := set[greater]
for name, value := range set {
if value < ref {
l = append(l, name)
}
}
return l
}