From 83c069e2349cb96c505a1aab53e91286e8e2975b Mon Sep 17 00:00:00 2001 From: jake Date: Tue, 24 Jun 2025 19:14:37 +0800 Subject: [PATCH 1/3] Update slice_concurrent.go --- slice/slice_concurrent.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/slice/slice_concurrent.go b/slice/slice_concurrent.go index b49b55a..2cd0d9b 100644 --- a/slice/slice_concurrent.go +++ b/slice/slice_concurrent.go @@ -125,6 +125,8 @@ func ReduceConcurrent[T any](slice []T, initial T, reducer func(index int, item func FilterConcurrent[T any](slice []T, predicate func(index int, item T) bool, numThreads int) []T { result := make([]T, 0) var wg sync.WaitGroup + var mu sync.Mutex + workerChan := make(chan struct{}, numThreads) @@ -137,7 +139,9 @@ func FilterConcurrent[T any](slice []T, predicate func(index int, item T) bool, defer wg.Done() if predicate(i, v) { + mu.Lock() result = append(result, v) + mu.Unlock() } <-workerChan From 93c777a4186993738cd0b2d8d7356c9a7d26a27a Mon Sep 17 00:00:00 2001 From: jake Date: Mon, 22 Sep 2025 10:04:23 +0800 Subject: [PATCH 2/3] Update mathutil.go fix: return 0 when Average is called with empty slice --- mathutil/mathutil.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mathutil/mathutil.go b/mathutil/mathutil.go index eac0239..c617360 100644 --- a/mathutil/mathutil.go +++ b/mathutil/mathutil.go @@ -238,6 +238,9 @@ func Sum[T constraints.Integer | constraints.Float](numbers ...T) T { // Average return average value of numbers. // Play: https://go.dev/play/p/Vv7LBwER-pz func Average[T constraints.Integer | constraints.Float](numbers ...T) float64 { + if len(numbers) == 0 { + return 0 + } var sum float64 for _, num := range numbers { sum += float64(num) From 8fe56b6dc7d78b4590d4e8429b5d1a8eb496012d Mon Sep 17 00:00:00 2001 From: chentong Date: Sun, 28 Sep 2025 20:10:12 +0800 Subject: [PATCH 3/3] fix(eventbus): update error handler to include topic information (#333) * fix(eventbus): update error handler to include topic information - Modified error handler signature to accept topic string and error - Updated panic recovery logic to pass event topic to error handler - Adjusted SetErrorHandler method parameter signature - Updated example test to demonstrate new error handler usage - Enhanced error handling test to verify topic information * fix(eventbus): unit test --- eventbus/eventbus.go | 6 +++--- eventbus/eventbus_example_test.go | 6 +++--- eventbus/eventbus_test.go | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/eventbus/eventbus.go b/eventbus/eventbus.go index 8fe9b25..e616a7f 100644 --- a/eventbus/eventbus.go +++ b/eventbus/eventbus.go @@ -21,7 +21,7 @@ type EventBus[T any] struct { // listeners map[string][]*EventListener[T] listeners sync.Map mu sync.RWMutex - errorHandler func(err error) + errorHandler func(topic string, err error) } // EventListener is the struct that holds the listener function and its priority. @@ -117,7 +117,7 @@ func (eb *EventBus[T]) Publish(event Event[T]) { func (eb *EventBus[T]) publishToListener(listener *EventListener[T], event Event[T]) { defer func() { if r := recover(); r != nil && eb.errorHandler != nil { - eb.errorHandler(fmt.Errorf("%v", r)) + eb.errorHandler(event.Topic, fmt.Errorf("%v", r)) } }() @@ -126,7 +126,7 @@ func (eb *EventBus[T]) publishToListener(listener *EventListener[T], event Event // SetErrorHandler sets the error handler function. // Play: https://go.dev/play/p/gmB0gnFe5mc -func (eb *EventBus[T]) SetErrorHandler(handler func(err error)) { +func (eb *EventBus[T]) SetErrorHandler(handler func(topic string, err error)) { eb.errorHandler = handler } diff --git a/eventbus/eventbus_example_test.go b/eventbus/eventbus_example_test.go index cac6d8c..e6fc749 100644 --- a/eventbus/eventbus_example_test.go +++ b/eventbus/eventbus_example_test.go @@ -189,8 +189,8 @@ func ExampleEventBus_GetListenersCount() { func ExampleEventBus_SetErrorHandler() { eb := NewEventBus[int]() - eb.SetErrorHandler(func(err error) { - fmt.Println(err) + eb.SetErrorHandler(func(topic string, err error) { + fmt.Println(topic, err) }) eb.Subscribe("event1", func(eventData int) { @@ -200,7 +200,7 @@ func ExampleEventBus_SetErrorHandler() { eb.Publish(Event[int]{Topic: "event1", Payload: 1}) // Output: - // error + // event1 error } func ExampleEventBus_GetAllListenersCount() { diff --git a/eventbus/eventbus_test.go b/eventbus/eventbus_test.go index dc90ca4..7d232bc 100644 --- a/eventbus/eventbus_test.go +++ b/eventbus/eventbus_test.go @@ -114,7 +114,8 @@ func TestEventBus_ErrorHandler(t *testing.T) { eb := NewEventBus[string]() - eb.SetErrorHandler(func(err error) { + eb.SetErrorHandler(func(topic string, err error) { + assert.Equal("event1", topic) assert.Equal("error", err.Error()) })