@@ -2,10 +2,10 @@ package controller
22
33import (
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.
1616type mergeTracker struct {
17- merged map [uint64 ]map [uint64 ]struct {}
17+ merged map [uint64 ]sets. Set [uint64 ]
1818 lock sync.RWMutex
1919}
2020
2121func 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) {
109108func (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.
150149func (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.
225224func (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