/
ships.go
59 lines (50 loc) · 1.03 KB
/
ships.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
package main
import (
"sync"
"github.com/samuelventura/go-tree"
)
type shipsDso struct {
mutex *sync.Mutex
ships map[string]tree.Node
}
type Ships interface {
Get(name string) tree.Node
Del(name string, node tree.Node)
Add(name string, node tree.Node)
Count() int
}
func NewShips() Ships {
dso := &shipsDso{}
dso.mutex = &sync.Mutex{}
dso.ships = make(map[string]tree.Node)
return dso
}
func (dso *shipsDso) Get(name string) tree.Node {
dso.mutex.Lock()
defer dso.mutex.Unlock()
return dso.ships[name]
}
func (dso *shipsDso) Add(name string, node tree.Node) {
dso.mutex.Lock()
defer dso.mutex.Unlock()
curr, ok := dso.ships[name]
if ok {
delete(dso.ships, name)
curr.Close()
}
dso.ships[name] = node
}
func (dso *shipsDso) Del(name string, node tree.Node) {
dso.mutex.Lock()
defer dso.mutex.Unlock()
curr, ok := dso.ships[name]
if ok && curr.Name() == node.Name() {
delete(dso.ships, name)
curr.Close()
}
}
func (dso *shipsDso) Count() int {
dso.mutex.Lock()
defer dso.mutex.Unlock()
return len(dso.ships)
}