Skip to content

Commit e250ece

Browse files
authored
internal/ui: clean up some iterator stuff (#153)
* internal/ui: significantly better iterator usage for advertised routes * internal/ui: more iterator cleanup * internal/ui: clean up iterator usage for peer routes * internal/ui: even more iterator cleanup * internal/ui: remove an unnecessary iterator usage
1 parent 24cf9ac commit e250ece

File tree

4 files changed

+95
-42
lines changed

4 files changed

+95
-42
lines changed

internal/ui/app.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package ui
22

33
import (
44
"context"
5-
"iter"
65
"log/slog"
76
"os"
87
"slices"
@@ -11,7 +10,6 @@ import (
1110
"deedles.dev/mk"
1211
"deedles.dev/trayscale/internal/tray"
1312
"deedles.dev/trayscale/internal/tsutil"
14-
"deedles.dev/xiter"
1513
"github.com/diamondburned/gotk4-adwaita/pkg/adw"
1614
"github.com/diamondburned/gotk4/pkg/gdk/v4"
1715
"github.com/diamondburned/gotk4/pkg/gio/v2"
@@ -129,11 +127,14 @@ func (a *App) updatePeers(status tsutil.Status) {
129127
}
130128

131129
peerMap := status.Status.Peer
132-
peers := slices.SortedFunc(iter.Seq[key.NodePublic](xiter.Filter(xiter.MapKeys(status.Status.Peer),
133-
func(peer key.NodePublic) bool {
134-
return !tsutil.IsMullvad(peerMap[peer])
135-
})),
136-
key.NodePublic.Compare)
130+
peers := make([]key.NodePublic, 0, len(status.Status.Peer))
131+
for k, p := range peerMap {
132+
if tsutil.IsMullvad(p) {
133+
continue
134+
}
135+
peers = append(peers, k)
136+
}
137+
slices.SortFunc(peers, key.NodePublic.Compare)
137138

138139
for key, page := range a.peerPages {
139140
if _, ok := peerMap[key]; !ok {

internal/ui/peerpage.go

+37-15
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"cmp"
55
"context"
66
_ "embed"
7-
"iter"
87
"log/slog"
98
"net/netip"
109
"slices"
@@ -225,23 +224,46 @@ func (page *PeerPage) Update(a *App, peer *ipnstate.PeerStatus, status tsutil.St
225224
slices.SortFunc(peer.TailscaleIPs, netip.Addr.Compare)
226225
page.addrRows.Update(peer.TailscaleIPs)
227226

228-
if peer.PrimaryRoutes != nil {
229-
page.routes = peer.PrimaryRoutes.AsSlice()
227+
routes := func(yield func(netip.Prefix) bool) {
228+
if peer.PrimaryRoutes == nil {
229+
return
230+
}
231+
for i := 0; i < peer.PrimaryRoutes.Len(); i++ {
232+
r := peer.PrimaryRoutes.At(i)
233+
if r.Bits() == 0 {
234+
continue
235+
}
236+
if !yield(r) {
237+
return
238+
}
239+
}
230240
}
231-
page.routes = slices.SortedFunc(iter.Seq[netip.Prefix](xiter.Filter(xiter.OfSlice(page.routes),
232-
func(p netip.Prefix) bool { return p.Bits() != 0 })),
241+
routes = xiter.Or(
242+
routes,
243+
xiter.Of(netip.Prefix{}),
244+
)
245+
246+
clear(page.routes)
247+
page.routes = page.routes[:0]
248+
page.routes = slices.AppendSeq(page.routes, routes)
249+
slices.SortFunc(
250+
page.routes,
233251
func(p1, p2 netip.Prefix) int {
234-
return cmp.Or(p1.Addr().Compare(p2.Addr()), p1.Bits()-p2.Bits())
235-
})
236-
if len(page.routes) == 0 {
237-
page.routes = append(page.routes, netip.Prefix{})
238-
}
239-
eroutes := make([]enum[netip.Prefix], 0, len(page.routes))
240-
for i, r := range page.routes {
241-
i = -1
242-
eroutes = append(eroutes, enumerate(i, r))
252+
return cmp.Or(
253+
p1.Addr().Compare(p2.Addr()),
254+
cmp.Compare(p1.Bits(), p2.Bits()),
255+
)
256+
},
257+
)
258+
259+
eroutes := func(yield func(enum[netip.Prefix]) bool) {
260+
for _, r := range page.routes {
261+
if !yield(enumerate(-1, r)) {
262+
return
263+
}
264+
}
243265
}
244-
page.routeRows.Update(eroutes)
266+
page.routeRows.UpdateFromSeq(eroutes, len(page.routes))
245267

246268
page.ExitNodeRow.SetVisible(peer.ExitNodeOption)
247269
page.ExitNodeRow.ActivatableWidget().(*gtk.Switch).SetState(peer.ExitNode)

internal/ui/rowmanager.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package ui
22

33
import (
4+
"iter"
45
"slices"
56

7+
"deedles.dev/xiter"
68
"github.com/diamondburned/gotk4/pkg/gtk/v4"
79
)
810

@@ -31,9 +33,14 @@ func (m *rowManager[Data]) resize(size int) {
3133
}
3234

3335
func (m *rowManager[Data]) Update(data []Data) {
34-
m.resize(len(data))
36+
m.UpdateFromSeq(slices.Values(data), len(data))
37+
}
38+
39+
func (m *rowManager[Data]) UpdateFromSeq(data iter.Seq[Data], size int) {
40+
m.resize(size)
3541

36-
for i, d := range data {
42+
edata := xiter.Enumerate(xiter.Seq[Data](data))
43+
for i, d := range edata {
3744
if i < len(m.rows) {
3845
m.rows[i].Update(d)
3946
continue

internal/ui/selfpage.go

+41-18
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"cmp"
55
"context"
66
_ "embed"
7-
"iter"
87
"log/slog"
98
"net/netip"
109
"slices"
@@ -354,12 +353,16 @@ func (page *SelfPage) init(a *App, peer *ipnstate.PeerStatus, status tsutil.Stat
354353
page.PreferredDERP.SetText(dm.Regions[r.PreferredDERP].RegionName)
355354

356355
page.DERPLatencies.SetVisible(true)
357-
namedLats := slices.SortedFunc(iter.Seq[xiter.Pair[string, time.Duration]](xiter.Map(xiter.ToPair(xiter.OfMap(r.RegionLatency)),
358-
func(p xiter.Pair[int, time.Duration]) xiter.Pair[string, time.Duration] {
359-
return xiter.P(dm.Regions[p.V1].RegionName, p.V2)
360-
})),
361-
func(p1, p2 xiter.Pair[string, time.Duration]) int { return cmp.Compare(p1.V2, p2.V2) })
362-
latencyRows.Update(namedLats)
356+
namedLats := func(yield func(latencyEntry) bool) {
357+
for id, latency := range r.RegionLatency {
358+
named := xiter.P(dm.Regions[id].RegionName, latency)
359+
if !yield(named) {
360+
return
361+
}
362+
}
363+
}
364+
sortedLats := slices.SortedFunc(namedLats, func(p1, p2 latencyEntry) int { return cmp.Compare(p1.V2, p2.V2) })
365+
latencyRows.Update(sortedLats)
363366
})
364367
}
365368

@@ -383,19 +386,39 @@ func (page *SelfPage) Update(a *App, peer *ipnstate.PeerStatus, status tsutil.St
383386
page.fileRows.Update(status.Files)
384387
page.FilesGroup.SetVisible(len(status.Files) > 0)
385388

386-
page.routes = slices.SortedFunc(iter.Seq[netip.Prefix](xiter.Filter(xiter.OfSlice(status.Prefs.AdvertiseRoutes),
387-
func(p netip.Prefix) bool { return p.Bits() != 0 })), // Filter
388-
func(p1, p2 netip.Prefix) int { // SortedFunc
389-
return cmp.Or(p1.Addr().Compare(p2.Addr()), p1.Bits()-p2.Bits())
390-
})
391-
if len(page.routes) == 0 {
392-
page.routes = append(page.routes, netip.Prefix{})
389+
routes := func(yield func(netip.Prefix) bool) {
390+
for _, r := range status.Prefs.AdvertiseRoutes {
391+
if r.Bits() == 0 {
392+
continue
393+
}
394+
if !yield(r) {
395+
return
396+
}
397+
}
393398
}
394-
eroutes := make([]enum[netip.Prefix], 0, len(page.routes))
395-
for i, r := range page.routes {
396-
eroutes = append(eroutes, enumerate(i, r))
399+
routes = xiter.Or(
400+
routes,
401+
xiter.Of(netip.Prefix{}),
402+
)
403+
404+
clear(page.routes)
405+
page.routes = page.routes[:0]
406+
page.routes = slices.AppendSeq(page.routes, routes)
407+
slices.SortFunc(page.routes, func(p1, p2 netip.Prefix) int {
408+
return cmp.Or(
409+
p1.Addr().Compare(p2.Addr()),
410+
cmp.Compare(p1.Bits(), p2.Bits()),
411+
)
412+
})
413+
414+
eroutes := func(yield func(enum[netip.Prefix]) bool) {
415+
for i, r := range page.routes {
416+
if !yield(enumerate(i, r)) {
417+
return
418+
}
419+
}
397420
}
398-
page.routeRows.Update(eroutes)
421+
page.routeRows.UpdateFromSeq(eroutes, len(page.routes))
399422
}
400423

401424
type addrRow struct {

0 commit comments

Comments
 (0)