From affce8159cda2ed571305077fd06e5e81f917308 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Sat, 17 Aug 2024 18:27:59 +0530 Subject: [PATCH] refactor: use go 1.23 iterators --- cmd/guilds_tree.go | 21 ++++++++++++--------- cmd/messages_text.go | 10 +++++----- pkg/itertools/filter.go | 15 +++++++++++++++ pkg/itertools/map.go | 13 +++++++++++++ 4 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 pkg/itertools/filter.go create mode 100644 pkg/itertools/map.go diff --git a/cmd/guilds_tree.go b/cmd/guilds_tree.go index da14aa3..871dfc2 100644 --- a/cmd/guilds_tree.go +++ b/cmd/guilds_tree.go @@ -3,9 +3,11 @@ package cmd import ( "fmt" "log" + "slices" "sort" "strings" + "github.com/ayn2op/discordo/pkg/itertools" "github.com/diamondburned/arikawa/v3/discord" "github.com/diamondburned/arikawa/v3/gateway" "github.com/gdamore/tcell/v2" @@ -88,12 +90,11 @@ func (gt *GuildsTree) channelToString(c discord.Channel) string { s = c.Name // If the name of the channel is empty, use the recipients' tags if s == "" { - rs := make([]string, len(c.DMRecipients)) - for _, r := range c.DMRecipients { - rs = append(rs, r.Tag()) - } + recipients := itertools.Map(slices.Values(c.DMRecipients), func(r discord.User) string { + return r.Tag() + }) - s = strings.Join(rs, ", ") + s = strings.Join(slices.Collect(recipients), ", ") } case discord.GuildAnnouncement: s = "a-" + c.Name @@ -128,10 +129,12 @@ func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) *t } func (gt *GuildsTree) createChannelNodes(n *tview.TreeNode, cs []discord.Channel) { - for _, c := range cs { - if c.Type != discord.GuildCategory && !c.ParentID.IsValid() { - gt.createChannelNode(n, c) - } + orphanChannels := itertools.Filter(slices.Values(cs), func(c discord.Channel) bool { + return c.Type != discord.GuildCategory && !c.ParentID.IsValid() + }) + + for _, c := range slices.Collect(orphanChannels) { + gt.createChannelNode(n, c) } PARENT_CHANNELS: diff --git a/cmd/messages_text.go b/cmd/messages_text.go index 83310db..2666516 100644 --- a/cmd/messages_text.go +++ b/cmd/messages_text.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "log" + "slices" "strings" "time" @@ -59,8 +60,8 @@ func (mt *MessagesText) drawMsgs(cID discord.ChannelID) { return } - for i := len(ms) - 1; i >= 0; i-- { - mainFlex.messagesText.createMessage(ms[i]) + for _, m := range slices.Backward(ms) { + mainFlex.messagesText.createMessage(m) } } @@ -337,8 +338,7 @@ func (mt *MessagesText) delete() { mt.Clear() - for i := len(ms) - 1; i >= 0; i-- { - mainFlex.messagesText.createMessage(ms[i]) + for _, m := range slices.Backward(ms) { + mainFlex.messagesText.createMessage(m) } - } diff --git a/pkg/itertools/filter.go b/pkg/itertools/filter.go new file mode 100644 index 0000000..fa04471 --- /dev/null +++ b/pkg/itertools/filter.go @@ -0,0 +1,15 @@ +package itertools + +import "iter" + +func Filter[I any](in iter.Seq[I], predicate func(I) bool) iter.Seq[I] { + return func(yield func(I) bool) { + for i := range in { + if predicate(i) { + if !yield(i) { + return + } + } + } + } +} diff --git a/pkg/itertools/map.go b/pkg/itertools/map.go new file mode 100644 index 0000000..8a03c2b --- /dev/null +++ b/pkg/itertools/map.go @@ -0,0 +1,13 @@ +package itertools + +import "iter" + +func Map[I, O any](in iter.Seq[I], f func(I) O) iter.Seq[O] { + return func(yield func(O) bool) { + for i := range in { + if !yield(f(i)) { + return + } + } + } +}