diff --git a/README.md b/README.md index 47b3463..cd05581 100644 --- a/README.md +++ b/README.md @@ -680,6 +680,45 @@ import optional "github.com/duke-git/lancet/v2/datastructure/optional" [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/datastructure/optional.md)] +

9. EventBus is an event bus used for handling events within an application.        Index

+ +```go +import "github.com/duke-git/lancet/v2/eventbus" +``` + +#### 函数列表: + +- **NewEventBus** : Create an EventBus instance. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#NewEventBus)] + [[play](https://go.dev/play/p/todo)] +- **Subscribe** : subscribes to an event with a specific event topic and listener function. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#Subscribe)] + [[play](https://go.dev/play/p/todo)] +- **Unsubscribe** : unsubscribes from an event with a specific event topic and listener function. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#Unsubscribe)] + [[play](https://go.dev/play/p/todo)] +- **Publish** : publishes an event with a specific event topic and data payload. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#Publish)] + [[play](https://go.dev/play/p/todo)] +- **ClearListeners** : clears all the listeners. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#ClearListeners)] + [[play](https://go.dev/play/p/todo)] +- **ClearListenersByTopic** : clears all the listeners by topic. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#ClearListenersByTopic)] + [[play](https://go.dev/play/p/todo)] +- **GetListenersCount** : returns the number of listeners for a specific event topic. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#GetListenersCount)] + [[play](https://go.dev/play/p/todo)] +- **GetAllListenersCount** : returns the total number of all listeners. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#GetAllListenersCount)] + [[play](https://go.dev/play/p/todo)] +- **GetEvents** : returns all the events topics. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#GetEvents)] + [[play](https://go.dev/play/p/todo)] +- **SetErrorHandler** : sets the error handler function. + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/eventbus.md#SetErrorHandler)] + [[play](https://go.dev/play/p/todo)] +

9. Fileutil package implements some basic functions for file operations.        index

```go diff --git a/README_zh-CN.md b/README_zh-CN.md index 9b0e700..af6fb41 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -679,7 +679,46 @@ import hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap" - **Hashmap** : 哈希映射。 [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/datastructure/hashmap.md)] -

9. fileutil 包含文件基本操作。       回到目录

+

9. EventbBus是一个事件总线,用于在应用程序中处理事件。       回到目录

+ +```go +import "github.com/duke-git/lancet/v2/eventbus" +``` + +#### 函数列表: + +- **NewEventBus** : 创建EventBus实例。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#NewEventBus)] + [[play](https://go.dev/play/p/todo)] +- **Subscribe** : 订阅具有特定事件主题和监听函数的事件。支持异步,事件优先级,事件过滤器。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#Subscribe)] + [[play](https://go.dev/play/p/todo)] +- **Unsubscribe** : 取消订阅具有特定事件主题的事件。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#Unsubscribe)] + [[play](https://go.dev/play/p/todo)] +- **Publish** : 发布一个带有特定事件主题和数据负载的事件。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#Publish)] + [[play](https://go.dev/play/p/todo)] +- **ClearListeners** : 清空所有事件监听器。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#ClearListeners)] + [[play](https://go.dev/play/p/todo)] +- **ClearListenersByTopic** : 清空特定事件监听器。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#ClearListenersByTopic)] + [[play](https://go.dev/play/p/todo)] +- **GetListenersCount** : 获取特定事件的监听器数量。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#GetListenersCount)] + [[play](https://go.dev/play/p/todo)] +- **GetAllListenersCount** : 获取所有事件的监听器数量。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#GetAllListenersCount)] + [[play](https://go.dev/play/p/todo)] +- **GetEvents** : 获取所有事件的topic。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#GetEvents)] + [[play](https://go.dev/play/p/todo)] +- **SetErrorHandler** : 设置事件的错误处理函数。 + [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/eventbus.md#SetErrorHandler)] + [[play](https://go.dev/play/p/todo)] + +

10. fileutil 包含文件基本操作。       回到目录

```go import "github.com/duke-git/lancet/v2/fileutil" @@ -779,7 +818,7 @@ import "github.com/duke-git/lancet/v2/fileutil" [[play](https://go.dev/play/p/iLRrDBhE38E)] -

10. formatter 格式化器包含一些数据格式化处理方法。       回到目录

+

11. formatter 格式化器包含一些数据格式化处理方法。       回到目录

```go import "github.com/duke-git/lancet/v2/formatter" @@ -809,7 +848,7 @@ import "github.com/duke-git/lancet/v2/formatter" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/formatter.md#ParseBinaryBytes)] [[play](https://go.dev/play/p/69v1tTT62x8)] -

11. function 函数包控制函数执行流程,包含部分函数式编程。       回到目录

+

12. function 函数包控制函数执行流程,包含部分函数式编程。       回到目录

```go import "github.com/duke-git/lancet/v2/function" @@ -874,7 +913,7 @@ import "github.com/duke-git/lancet/v2/function" -

12. maputil 包括一些操作 map 的函数。       回到目录

+

13. maputil 包括一些操作 map 的函数。       回到目录

```go import "github.com/duke-git/lancet/v2/maputil" @@ -1045,7 +1084,7 @@ import "github.com/duke-git/lancet/v2/maputil" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/maputil.md#GetOrDefault)] [[play](https://go.dev/play/p/99QjSYSBdiM)] -

13. mathutil 包实现了一些数学计算的函数。       回到目录

+

14. mathutil 包实现了一些数学计算的函数。       回到目录

```go import "github.com/duke-git/lancet/v2/mathutil" @@ -1156,7 +1195,7 @@ import "github.com/duke-git/lancet/v2/mathutil" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/mathutil.md#Combination)] [[play](https://go.dev/play/p/ENFQRDQUFi9)] -

14. netutil 网络包支持获取 ip 地址,发送 http 请求。       回到目录

+

15. netutil 网络包支持获取 ip 地址,发送 http 请求。       回到目录

```go import "github.com/duke-git/lancet/v2/netutil" @@ -1229,7 +1268,7 @@ import "github.com/duke-git/lancet/v2/netutil" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/netutil.md#IsTelnetConnected)] [[play](https://go.dev/play/p/yiLCGtQv_ZG)] -

15. pointer 包支持一些指针类型的操作。       回到目录

+

16. pointer 包支持一些指针类型的操作。       回到目录

```go import "github.com/duke-git/lancet/v2/pointer" @@ -1253,7 +1292,7 @@ import "github.com/duke-git/lancet/v2/pointer" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/pointer.md#UnwrapOrDefault)] [[play](https://go.dev/play/p/ZnGIHf8_o4E)] -

16. random 随机数生成器包,可以生成随机[]bytes, int, string。       回到目录

+

17. random 随机数生成器包,可以生成随机[]bytes, int, string。       回到目录

```go import "github.com/duke-git/lancet/v2/random" @@ -1319,7 +1358,7 @@ import "github.com/duke-git/lancet/v2/random" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/random.md#RandNumberOfLength)] [[play](https://go.dev/play/p/oyZbuV7bu7b)] -

17. retry 重试执行函数直到函数运行成功或被 context cancel。       回到目录

+

18. retry 重试执行函数直到函数运行成功或被 context cancel。       回到目录

```go import "github.com/duke-git/lancet/v2/retry" @@ -1353,7 +1392,7 @@ import "github.com/duke-git/lancet/v2/retry" -

18. slice 包含操作切片的方法集合。        回到目录

+

19. slice 包含操作切片的方法集合。        回到目录

```go import "github.com/duke-git/lancet/v2/slice" @@ -1615,7 +1654,7 @@ import "github.com/duke-git/lancet/v2/slice" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/slice.md#ConcatBy)] [[play](https://go.dev/play/p/6QcUpcY4UMW)] -

19. stream 流,该包仅验证简单的 stream 实现,功能有限。       回到目录

+

20. stream 流,该包仅验证简单的 stream 实现,功能有限。       回到目录

```go import "github.com/duke-git/lancet/v2/stream" @@ -1711,7 +1750,7 @@ import "github.com/duke-git/lancet/v2/stream" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/stream.md#LastIndexOf)] [[play](https://go.dev/play/p/CjeoNw2eac_G)] -

20. structs 提供操作 struct, tag, field 的相关函数。       回到目录

+

21. structs 提供操作 struct, tag, field 的相关函数。       回到目录

```go import "github.com/duke-git/lancet/v2/structs" @@ -1748,7 +1787,7 @@ import "github.com/duke-git/lancet/v2/structs" - **IsTargetType** : 判断属性是否是目标类型。 [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/struct.md#IsTargetType)] -

21. strutil 包含字符串处理的相关函数。       回到目录

+

22. strutil 包含字符串处理的相关函数。       回到目录

```go import "github.com/duke-git/lancet/v2/strutil" @@ -1898,7 +1937,7 @@ import "github.com/duke-git/lancet/v2/strutil" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/strutil.md#ExtractContent)] [[play](https://go.dev/play/p/Ay9UIk7Rum9)] -

22. system 包含 os, runtime, shell command 的相关函数。       回到目录

+

23. system 包含 os, runtime, shell command 的相关函数。       回到目录

```go import "github.com/duke-git/lancet/v2/system" @@ -1948,7 +1987,7 @@ import "github.com/duke-git/lancet/v2/system" -

23. Tuple 包实现一个元组数据类型。       回到目录

+

24. Tuple 包实现一个元组数据类型。       回到目录

```go import "github.com/duke-git/lancet/v2/tuple" @@ -2065,7 +2104,7 @@ import "github.com/duke-git/lancet/v2/tuple" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/tuple.md#Unzip10)] [[play](https://go.dev/play/p/-taQB6Wfre_z)] -

24. validator 验证器包,包含常用字符串格式验证函数。       回到目录

+

25. validator 验证器包,包含常用字符串格式验证函数。       回到目录

```go import "github.com/duke-git/lancet/v2/validator" @@ -2200,7 +2239,7 @@ import "github.com/duke-git/lancet/v2/validator" [[doc](https://github.com/duke-git/lancet/blob/main/docs/api/packages/validator.md#IsChinaUnionPay)] [[play](https://go.dev/play/p/yafpdxLiymu)] -

25. xerror 包实现一些错误处理函数。       回到目录

+

26. xerror 包实现一些错误处理函数。       回到目录

```go import "github.com/duke-git/lancet/v2/xerror" diff --git a/docs/api/packages/eventbus.md b/docs/api/packages/eventbus.md new file mode 100644 index 0000000..7e0a293 --- /dev/null +++ b/docs/api/packages/eventbus.md @@ -0,0 +1,401 @@ +# EventBus + +EventbBus是一个事件总线,用于在应用程序中处理事件。 + +
+ +## 源码: + +- [https://github.com/duke-git/lancet/blob/main/eventbus/eventbus.go](https://github.com/duke-git/lancet/blob/main/eventbus/eventbus.go) + +
+ +## 用法: + +```go +import ( + "github.com/duke-git/lancet/v2/eventbus" +) +``` + +
+ +## 目录 + +- [NewEventBus](#NewEventBus) +- [Subscribe](#Subscribe) +- [Unsubscribe](#Unsubscribe) +- [Publish](#Publish) +- [ClearListeners](#ClearListeners) +- [ClearListenersByTopic](#ClearListenersByTopic) +- [GetListenersCount](#GetListenersCount) +- [GetAllListenersCount](#GetAllListenersCount) +- [GetEvents](#GetEvents) +- [SetErrorHandler](#SetErrorHandler) + + +
+ +## 文档 + +### NewEventBus + +

创建EventBus实例。

+ +函数签名: + +```go +func NewEventBus[T any]() *EventBus[T] +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 1 +} +``` + +### Subscribe + +

订阅具有特定事件主题和监听函数的事件。支持异步,事件优先级,事件过滤器。

+ +函数签名: + +```go +func (eb *EventBus[T]) Subscribe(topic string, listener func(eventData T), async bool, priority int, filter func(eventData T) bool) +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + filter := func(eventData int) bool { + return eventData == 1 + } + + eb.Subscribe("event1", listener, false, 0, filter) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + eb.Publish(Event[int]{Topic: "event1", Payload: 2}) + + fmt.Println(receivedData) + + // Output: + // 1 +} +``` + +### Unsubscribe + +

取消订阅具有特定事件主题的事件。

+ +函数签名: + +```go +func (eb *EventBus[T]) Unsubscribe(topic string, listener func(eventData T)) +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.Unsubscribe("event1", listener) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} +``` + +### Publish + +

发布一个带有特定事件主题和数据负载的事件。

+ +函数签名: + +```go +func (eb *EventBus[T]) Publish(event Event[T]) +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) { + fmt.Println(eventData) + }, false, 0, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // 1 +} +``` + +### ClearListeners + +

清空所有事件监听器。

+ +函数签名: + +```go +func (eb *EventBus[T]) ClearListeners() +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.ClearListeners() + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} +``` + +### ClearListenersByTopic + +

清空特定事件监听器。

+ +函数签名: + +```go +func (eb *EventBus[T]) ClearListenersByTopic(topic string) +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.ClearListenersByTopic("event1") + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} +``` + +### GetListenersCount + +

获取特定事件的监听器数量。

+ +函数签名: + +```go +func (eb *EventBus[T]) GetListenersCount(topic string) int +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + + count := eb.GetListenersCount("event1") + + fmt.Println(count) + + // Output: + // 2 +} +``` + +### GetAllListenersCount + +

获取所有事件的监听器数量。

+ +函数签名: + +```go +func (eb *EventBus[T]) GetAllListenersCount() int +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) + + count := eb.GetAllListenersCount() + + fmt.Println(count) + + // Output: + // 2 +} +``` + +### GetEvents + +

获取所有事件的topic。

+ +函数签名: + +```go +func (eb *EventBus[T]) GetEvents() []string +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) + + events := eb.GetEvents() + + for _, event := range events { + fmt.Println(event) + } + + // Output: + // event1 + // event2 +} +``` + +### SetErrorHandler + +

设置事件的错误处理函数。

+ +函数签名: + +```go +func (eb *EventBus[T]) SetErrorHandler(handler func(err error)) +``` + +示例:[运行](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.SetErrorHandler(func(err error) { + fmt.Println(err) + }) + + eb.Subscribe("event1", func(eventData int) { + panic("error") + }, false, 0, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // error +} +``` \ No newline at end of file diff --git a/docs/en/api/packages/eventbus.md b/docs/en/api/packages/eventbus.md new file mode 100644 index 0000000..08a27ff --- /dev/null +++ b/docs/en/api/packages/eventbus.md @@ -0,0 +1,401 @@ +# EventBus + +EventBus is an event bus used for handling events within an application. + +
+ +## Source: + +- [https://github.com/duke-git/lancet/blob/main/eventbus/eventbus.go](https://github.com/duke-git/lancet/blob/main/eventbus/eventbus.go) + +
+ +## Usage: + +```go +import ( + "github.com/duke-git/lancet/v2/eventbus" +) +``` + +
+ +## Index + +- [NewEventBus](#NewEventBus) +- [Subscribe](#Subscribe) +- [Unsubscribe](#Unsubscribe) +- [Publish](#Publish) +- [ClearListeners](#ClearListeners) +- [ClearListenersByTopic](#ClearListenersByTopic) +- [GetListenersCount](#GetListenersCount) +- [GetAllListenersCount](#GetAllListenersCount) +- [GetEvents](#GetEvents) +- [SetErrorHandler](#SetErrorHandler) + + +
+ +## Documentation + +### NewEventBus + +

Create an EventBus instance.

+ +Signature: + +```go +func NewEventBus[T any]() *EventBus[T] +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 1 +} +``` + +### Subscribe + +

Subscribes to an event with a specific event topic and listener function.

+ +Signature: + +```go +func (eb *EventBus[T]) Subscribe(topic string, listener func(eventData T), async bool, priority int, filter func(eventData T) bool) +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + filter := func(eventData int) bool { + return eventData == 1 + } + + eb.Subscribe("event1", listener, false, 0, filter) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + eb.Publish(Event[int]{Topic: "event1", Payload: 2}) + + fmt.Println(receivedData) + + // Output: + // 1 +} +``` + +### Unsubscribe + +

Unsubscribes from an event with a specific event topic and listener function.

+ +Signature: + +```go +func (eb *EventBus[T]) Unsubscribe(topic string, listener func(eventData T)) +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.Unsubscribe("event1", listener) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} +``` + +### Publish + +

Publishes an event with a specific event topic and data payload.

+ +Signature: + +```go +func (eb *EventBus[T]) Publish(event Event[T]) +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) { + fmt.Println(eventData) + }, false, 0, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // 1 +} +``` + +### ClearListeners + +

Clears all the listeners.

+ +Signature: + +```go +func (eb *EventBus[T]) ClearListeners() +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.ClearListeners() + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} +``` + +### ClearListenersByTopic + +

Clears all the listeners by topic.

+ +Signature: + +```go +func (eb *EventBus[T]) ClearListenersByTopic(topic string) +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.ClearListenersByTopic("event1") + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} +``` + +### GetListenersCount + +

Returns the number of listeners for a specific event topic.

+ +Signature: + +```go +func (eb *EventBus[T]) GetListenersCount(topic string) int +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + + count := eb.GetListenersCount("event1") + + fmt.Println(count) + + // Output: + // 2 +} +``` + +### GetAllListenersCount + +

Returns the total number of all listeners.

+ +Signature: + +```go +func (eb *EventBus[T]) GetAllListenersCount() int +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) + + count := eb.GetAllListenersCount() + + fmt.Println(count) + + // Output: + // 2 +} +``` + +### GetEvents + +

Returns all the events topics.

+ +Signature: + +```go +func (eb *EventBus[T]) GetEvents() []string +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) + + events := eb.GetEvents() + + for _, event := range events { + fmt.Println(event) + } + + // Output: + // event1 + // event2 +} +``` + +### SetErrorHandler + +

Sets the error handler function.

+ +Signature: + +```go +func (eb *EventBus[T]) SetErrorHandler(handler func(err error)) +``` + +Example:[Run](todo) + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/eventbus" +) + +func main() { + eb := eventbus.NewEventBus[int]() + + eb.SetErrorHandler(func(err error) { + fmt.Println(err) + }) + + eb.Subscribe("event1", func(eventData int) { + panic("error") + }, false, 0, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // error +} +``` \ No newline at end of file diff --git a/eventbus/eventbus.go b/eventbus/eventbus.go index d6377e0..93b55fc 100644 --- a/eventbus/eventbus.go +++ b/eventbus/eventbus.go @@ -33,6 +33,7 @@ type EventListener[T any] struct { } // NewEventBus creates a new EventBus. +// Play: todo func NewEventBus[T any]() *EventBus[T] { return &EventBus[T]{ listeners: sync.Map{}, @@ -40,6 +41,7 @@ func NewEventBus[T any]() *EventBus[T] { } // Subscribe subscribes to an event with a specific event topic and listener function. +// Play: todo func (eb *EventBus[T]) Subscribe(topic string, listener func(eventData T), async bool, priority int, filter func(eventData T) bool) { eb.mu.Lock() defer eb.mu.Unlock() @@ -63,6 +65,7 @@ func (eb *EventBus[T]) Subscribe(topic string, listener func(eventData T), async } // Unsubscribe unsubscribes from an event with a specific event topic and listener function. +// Play: todo func (eb *EventBus[T]) Unsubscribe(topic string, listener func(eventData T)) { eb.mu.Lock() defer eb.mu.Unlock() @@ -86,6 +89,7 @@ func (eb *EventBus[T]) Unsubscribe(topic string, listener func(eventData T)) { } // Publish publishes an event with a specific event topic and data payload. +// Play: todo func (eb *EventBus[T]) Publish(event Event[T]) { eb.mu.RLock() defer eb.mu.RUnlock() @@ -126,6 +130,7 @@ func (eb *EventBus[T]) SetErrorHandler(handler func(err error)) { } // ClearListeners clears all the listeners. +// Play: todo func (eb *EventBus[T]) ClearListeners() { eb.mu.Lock() defer eb.mu.Unlock() @@ -134,6 +139,7 @@ func (eb *EventBus[T]) ClearListeners() { } // ClearListenersByTopic clears all the listeners by topic. +// Play: todo func (eb *EventBus[T]) ClearListenersByTopic(topic string) { eb.mu.Lock() defer eb.mu.Unlock() @@ -142,6 +148,7 @@ func (eb *EventBus[T]) ClearListenersByTopic(topic string) { } // GetListenersCount returns the number of listeners for a specific event topic. +// Play: todo func (eb *EventBus[T]) GetListenersCount(topic string) int { eb.mu.RLock() defer eb.mu.RUnlock() @@ -156,6 +163,7 @@ func (eb *EventBus[T]) GetListenersCount(topic string) int { } // GetAllListenersCount returns the total number of listeners. +// Play: todo func (eb *EventBus[T]) GetAllListenersCount() int { eb.mu.RLock() defer eb.mu.RUnlock() @@ -170,6 +178,7 @@ func (eb *EventBus[T]) GetAllListenersCount() int { } // GetEvents returns all the events topics. +// Play: todo func (eb *EventBus[T]) GetEvents() []string { eb.mu.RLock() defer eb.mu.RUnlock() diff --git a/eventbus/eventbus_example_test.go b/eventbus/eventbus_example_test.go new file mode 100644 index 0000000..870b019 --- /dev/null +++ b/eventbus/eventbus_example_test.go @@ -0,0 +1,229 @@ +package eventbus + +import ( + "fmt" + "sync" + "time" +) + +func ExampleEventBus_Subscribe() { + eb := NewEventBus[string]() + eb.Subscribe("event1", func(eventData string) { + fmt.Println(eventData) + }, false, 0, nil) + + eb.Publish(Event[string]{Topic: "event1", Payload: "hello"}) + + // Output: + // hello +} + +func ExampleEventBus_Unsubscribe() { + eb := NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.Unsubscribe("event1", listener) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} + +func ExampleEventBus_Subscribe_WithFilter() { + eb := NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + filter := func(eventData int) bool { + return eventData == 1 + } + + eb.Subscribe("event1", listener, false, 0, filter) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + eb.Publish(Event[int]{Topic: "event1", Payload: 2}) + + fmt.Println(receivedData) + + // Output: + // 1 +} + +func ExampleEventBus_Subscribe_WithPriority() { + eb := NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) { + fmt.Println(eventData) + }, false, 0, nil) + + eb.Subscribe("event1", func(eventData int) { + fmt.Println(eventData) + }, false, 1, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // 1 + // 1 +} + +func ExampleEventBus_Subscribe_Async() { + eb := NewEventBus[int]() + + var wg sync.WaitGroup + wg.Add(1) + + eb.Subscribe("event1", func(eventData int) { + time.Sleep(100 * time.Millisecond) + fmt.Println(eventData) + wg.Done() + }, true, 1, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + wg.Wait() + + // Output: + // 1 +} + +func ExampleEventBus_Publish() { + eb := NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) { + fmt.Println(eventData) + }, false, 0, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // 1 +} + +func ExampleEventBus() { + eb := NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 1 +} + +func ExampleEventBus_ClearListeners() { + eb := NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.ClearListeners() + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} + +func ExampleEventBus_ClearListenersByTopic() { + eb := NewEventBus[int]() + + receivedData := 0 + listener := func(eventData int) { + receivedData = eventData + } + + eb.Subscribe("event1", listener, false, 0, nil) + eb.ClearListenersByTopic("event1") + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + fmt.Println(receivedData) + + // Output: + // 0 +} + +func ExampleEventBus_GetListenersCount() { + eb := NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + + count := eb.GetListenersCount("event1") + + fmt.Println(count) + + // Output: + // 2 +} + +func ExampleEventBus_SetErrorHandler() { + eb := NewEventBus[int]() + + eb.SetErrorHandler(func(err error) { + fmt.Println(err) + }) + + eb.Subscribe("event1", func(eventData int) { + panic("error") + }, false, 0, nil) + + eb.Publish(Event[int]{Topic: "event1", Payload: 1}) + + // Output: + // error +} + +func ExampleEventBus_GetAllListenersCount() { + + eb := NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) + + count := eb.GetAllListenersCount() + + fmt.Println(count) + + // Output: + // 2 +} + +func ExampleEventBus_GetEvents() { + eb := NewEventBus[int]() + + eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) + eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) + + events := eb.GetEvents() + + for _, event := range events { + fmt.Println(event) + } + + // Output: + // event1 + // event2 +}