Skip to content

Commit 47b78e5

Browse files
dharmabclaude
andauthored
Use sets package from dharmab/collections (#684)
## Summary - Replace `map[AircraftTag]bool` with `sets.Set[AircraftTag]` in `pkg/encyclopedia/aircraft.go`, converting ~76 map literal initializations to `sets.Of(...)` and methods to use `sets.Contains`/`sets.All` - Replace `map[uint64]struct{}` inner maps in `mergeTracker` with `sets.Set[uint64]`, and change `friendliesMergedWith` to return `sets.Set[uint64]` instead of `[]uint64` - Replace `map[uint64]struct{}` visited sets in `pkg/radar` (nearby.go, grouping.go, merged.go) and `map[string]struct{}` platform deduplication in group.go with `sets.Set` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent f366508 commit 47b78e5

6 files changed

Lines changed: 169 additions & 402 deletions

File tree

pkg/controller/merged.go

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package controller
22

33
import (
44
"context"
5-
"maps"
65
"slices"
76
"sync"
87

8+
"github.com/dharmab/collections/sets"
99
"github.com/dharmab/skyeye/pkg/brevity"
1010
"github.com/dharmab/skyeye/pkg/spatial"
1111
"github.com/dharmab/skyeye/pkg/trackfiles"
@@ -14,13 +14,13 @@ import (
1414

1515
// mergeTracker tracks hostile IDs and the friendly IDs they have merged with.
1616
type mergeTracker struct {
17-
merged map[uint64]map[uint64]struct{}
17+
merged map[uint64]sets.Set[uint64]
1818
lock sync.RWMutex
1919
}
2020

2121
func newMergeTracker() *mergeTracker {
2222
return &mergeTracker{
23-
merged: make(map[uint64]map[uint64]struct{}),
23+
merged: make(map[uint64]sets.Set[uint64]),
2424
}
2525
}
2626

@@ -30,10 +30,10 @@ func (t *mergeTracker) merge(hostileID, friendID uint64) {
3030
defer t.lock.Unlock()
3131
friendIDs, ok := t.merged[hostileID]
3232
if !ok {
33-
friendIDs = make(map[uint64]struct{})
33+
friendIDs = sets.New[uint64]()
3434
t.merged[hostileID] = friendIDs
3535
}
36-
friendIDs[friendID] = struct{}{}
36+
sets.Add(friendIDs, friendID)
3737
}
3838

3939
// isMerged checks if the given hostile has merged with the given friendly.
@@ -44,24 +44,23 @@ func (t *mergeTracker) isMerged(hostileID, friendID uint64) bool {
4444
if !ok {
4545
return false
4646
}
47-
_, ok = friendIDs[friendID]
48-
return ok
47+
return sets.Contains(friendIDs, friendID)
4948
}
5049

5150
// friendliesMergedWith returns the unique friendly IDs that have merged with the given hostile IDs.
52-
func (t *mergeTracker) friendliesMergedWith(hostileIDs ...uint64) []uint64 {
51+
func (t *mergeTracker) friendliesMergedWith(hostileIDs ...uint64) sets.Set[uint64] {
5352
t.lock.RLock()
5453
defer t.lock.RUnlock()
5554

56-
uniqueFriendIDs := make(map[uint64]struct{})
55+
uniqueFriendIDs := sets.New[uint64]()
5756
for _, hostileID := range hostileIDs {
5857
if friendIDs, ok := t.merged[hostileID]; ok {
59-
for id := range friendIDs {
60-
uniqueFriendIDs[id] = struct{}{}
58+
for id := range sets.All(friendIDs) {
59+
sets.Add(uniqueFriendIDs, id)
6160
}
6261
}
6362
}
64-
return slices.Collect(maps.Keys(uniqueFriendIDs))
63+
return uniqueFriendIDs
6564
}
6665

6766
// separate records that the given hostile and friendly IDs have exited the merge.
@@ -72,8 +71,8 @@ func (t *mergeTracker) separate(hostileID, friendID uint64) {
7271
if !ok {
7372
return
7473
}
75-
delete(friendIDs, friendID)
76-
if len(friendIDs) == 0 {
74+
sets.Remove(friendIDs, friendID)
75+
if sets.Len(friendIDs) == 0 {
7776
delete(t.merged, hostileID)
7877
}
7978
}
@@ -87,8 +86,8 @@ func (t *mergeTracker) remove(id uint64) {
8786
delete(t.merged, id)
8887
} else {
8988
for hostileID, friendIDs := range t.merged {
90-
delete(friendIDs, id)
91-
if len(friendIDs) == 0 {
89+
sets.Remove(friendIDs, id)
90+
if sets.Len(friendIDs) == 0 {
9291
delete(t.merged, hostileID)
9392
}
9493
}
@@ -109,7 +108,7 @@ func (t *mergeTracker) keep(idsToKeep ...uint64) {
109108
func (t *mergeTracker) reset() {
110109
t.lock.Lock()
111110
defer t.lock.Unlock()
112-
t.merged = make(map[uint64]map[uint64]struct{})
111+
t.merged = make(map[uint64]sets.Set[uint64])
113112
}
114113

115114
// broadcastMerges updates the merge tracker and broadcasts merged calls for any new merges.
@@ -148,15 +147,15 @@ func (c *Controller) broadcastMerges(ctx context.Context) {
148147
// updateMergesForGroup updates the merge tracker for the given hostile group and friendly contacts.
149148
// Friendlies which are newly merged with the hostile group are returned.
150149
func (c *Controller) updateMergesForGroup(hostileGroup brevity.Group, friendlies []*trackfiles.Trackfile) []*trackfiles.Trackfile {
151-
friendIDs := make(map[uint64]struct{})
150+
friendIDs := sets.New[uint64]()
152151
for _, friendly := range friendlies {
153-
friendIDs[friendly.Contact.ID] = struct{}{}
152+
sets.Add(friendIDs, friendly.Contact.ID)
154153
}
155154

156155
newMergedFriendlies := make([]*trackfiles.Trackfile, 0)
157156
for _, hostileID := range hostileGroup.ObjectIDs() {
158-
for _, oldMergedFriendly := range c.merges.friendliesMergedWith(hostileID) {
159-
if _, ok := friendIDs[oldMergedFriendly]; !ok {
157+
for oldMergedFriendly := range sets.All(c.merges.friendliesMergedWith(hostileID)) {
158+
if !sets.Contains(friendIDs, oldMergedFriendly) {
160159
c.merges.separate(hostileID, oldMergedFriendly)
161160
}
162161
}
@@ -223,7 +222,7 @@ func (c *Controller) createMergedCall(friendlies []*trackfiles.Trackfile) brevit
223222

224223
// fillInMergeDetails sets the group's merged-with count, and if it is greater than 0, declares the group to be a FURBALL.
225224
func (c *Controller) fillInMergeDetails(group brevity.Group) {
226-
count := len(c.merges.friendliesMergedWith(group.ObjectIDs()...))
225+
count := sets.Len(c.merges.friendliesMergedWith(group.ObjectIDs()...))
227226
group.SetMergedWith(count)
228227
if group.MergedWith() > 0 {
229228
group.SetDeclaration(brevity.Furball)

0 commit comments

Comments
 (0)