/
cpair.go
72 lines (63 loc) · 1.35 KB
/
cpair.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
61
62
63
64
65
66
67
68
69
70
71
72
package cfparser
type CPair struct {
left *CPair
right *CPair
key string
val string
signal chan *CPair
}
// Convert pair's value to string.
func (pair *CPair) String() string {
return pair.val
}
// Convert pair's value to bool. Return true only when value is "true", "True" or "TRUE".
func (pair *CPair) Bool() bool {
switch pair.String() {
case "true":
return true
case "True":
return true
case "TRUE":
return true
}
return false
}
// When the pair change in the future, you will receive the modified pair immediately.
//
// The channel will create when you call this, and it's buffered channel with size of 1.
func (pair *CPair) Watch() chan *CPair {
if pair.signal == nil {
pair.signal = make(chan *CPair, 1)
}
return pair.signal
}
// Constructs pair and store it.
func put(pair *CPair, key string, val string) *CPair {
if pair == nil {
return &CPair{key: key, val: val}
}
if key < pair.key {
pair.left = put(pair.left, key, val)
} else if key > pair.key {
pair.right = put(pair.right, key, val)
} else {
pair.val = val
if pair.signal != nil {
pair.signal <- pair
}
}
return pair
}
// Find pair and get it.
func get(pair *CPair, key string) *CPair {
if pair == nil {
return nil
}
if key < pair.key {
return get(pair.left, key)
} else if key > pair.key {
return get(pair.right, key)
} else {
return pair
}
}