From ccc35b2a00c50766c846de8ace5c9f42165832a1 Mon Sep 17 00:00:00 2001 From: yusing Date: Thu, 16 Oct 2025 10:08:25 +0800 Subject: [PATCH] refactor: remove functional.Set wrapper --- goutils | 2 +- internal/notif/dispatcher.go | 18 +++++------ internal/utils/functional/set.go | 51 -------------------------------- 3 files changed, 10 insertions(+), 61 deletions(-) delete mode 100644 internal/utils/functional/set.go diff --git a/goutils b/goutils index 9d482a23..425d3686 160000 --- a/goutils +++ b/goutils @@ -1 +1 @@ -Subproject commit 9d482a238dd75543c5582d1778c0dea484952f43 +Subproject commit 425d3686419597ef5e1060f4083b12763a1ce14e diff --git a/internal/notif/dispatcher.go b/internal/notif/dispatcher.go index 7dcfe9f2..d9fafc2a 100644 --- a/internal/notif/dispatcher.go +++ b/internal/notif/dispatcher.go @@ -7,18 +7,18 @@ import ( "sync" "time" + "github.com/puzpuzpuz/xsync/v4" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - F "github.com/yusing/godoxy/internal/utils/functional" "github.com/yusing/goutils/task" ) type ( Dispatcher struct { task *task.Task - providers F.Set[Provider] + providers *xsync.Map[Provider, struct{}] logCh chan *LogMessage - retryMsg F.Set[*RetryMessage] + retryMsg *xsync.Map[*RetryMessage, struct{}] retryTicker *time.Ticker } LogMessage struct { @@ -44,9 +44,9 @@ const ( func StartNotifDispatcher(parent task.Parent) *Dispatcher { dispatcher = &Dispatcher{ task: parent.Subtask("notification", true), - providers: F.NewSet[Provider](), + providers: xsync.NewMap[Provider, struct{}](), logCh: make(chan *LogMessage, 100), - retryMsg: F.NewSet[*RetryMessage](), + retryMsg: xsync.NewMap[*RetryMessage, struct{}](), retryTicker: time.NewTicker(retryInterval), } go dispatcher.start() @@ -66,7 +66,7 @@ func Notify(msg *LogMessage) { } func (disp *Dispatcher) RegisterProvider(cfg *NotificationConfig) { - disp.providers.Add(cfg.Provider) + disp.providers.Store(cfg.Provider, struct{}{}) } func (disp *Dispatcher) start() { @@ -115,7 +115,7 @@ func (disp *Dispatcher) dispatch(msg *LogMessage) { Provider: p, NextRetry: time.Now().Add(calculateBackoffDelay(0)), } - disp.retryMsg.Add(msg) + disp.retryMsg.Store(msg, struct{}{}) l.Debug().Err(err).EmbedObject(msg).Msg("notification failed, scheduling retry") } else { l.Debug().Str("provider", p.GetName()).Msg("notification sent successfully") @@ -136,7 +136,7 @@ func (disp *Dispatcher) processRetries() { for msg := range disp.retryMsg.Range { if now.After(msg.NextRetry) { readyMessages = append(readyMessages, msg) - disp.retryMsg.Remove(msg) + disp.retryMsg.Delete(msg) } } @@ -176,7 +176,7 @@ func (disp *Dispatcher) retry(messages []*RetryMessage) { // Schedule next retry with exponential backoff msg.NextRetry = time.Now().Add(calculateBackoffDelay(msg.Trials)) - disp.retryMsg.Add(msg) + disp.retryMsg.Store(msg, struct{}{}) log.Debug().EmbedObject(msg).Msg("notification retry failed, scheduled for later") } diff --git a/internal/utils/functional/set.go b/internal/utils/functional/set.go deleted file mode 100644 index 353a4eeb..00000000 --- a/internal/utils/functional/set.go +++ /dev/null @@ -1,51 +0,0 @@ -package functional - -import ( - "github.com/puzpuzpuz/xsync/v4" -) - -type Set[T comparable] struct { - m *xsync.Map[T, struct{}] -} - -func NewSet[T comparable]() Set[T] { - return Set[T]{m: xsync.NewMap[T, struct{}]()} -} - -func (set Set[T]) Add(v T) { - set.m.Store(v, struct{}{}) -} - -func (set Set[T]) Remove(v T) { - set.m.Delete(v) -} - -func (set Set[T]) Clear() { - set.m.Clear() -} - -func (set Set[T]) Contains(v T) bool { - _, ok := set.m.Load(v) - return ok -} - -func (set Set[T]) Range(f func(T) bool) { - set.m.Range(func(k T, _ struct{}) bool { - return f(k) - }) -} - -func (set Set[T]) RangeAll(f func(T)) { - set.m.Range(func(k T, _ struct{}) bool { - f(k) - return true - }) -} - -func (set Set[T]) Size() int { - return set.m.Size() -} - -func (set Set[T]) IsEmpty() bool { - return set.m == nil || set.m.Size() == 0 -}