diff --git a/docs/api/packages/enum.md b/docs/api/packages/enum.md new file mode 100644 index 0000000..03627fc --- /dev/null +++ b/docs/api/packages/enum.md @@ -0,0 +1,850 @@ +# Enum + +Enum实现一个简单枚举工具包。 + +
+ +## 源码: + +- [https://github.com/duke-git/lancet/blob/main/enum/enum.go](https://github.com/duke-git/lancet/blob/main/enum/enum.go) + + + +## 用法: + +```go +import ( + "github.com/duke-git/lancet/v2/enum" +) +``` + + + +## 目录 + +- [NewItem](#NewItem) +- [NewItemsFromPairs](#NewItemsFromPairs) +- [Value](#Value) +- [Name](#Name) +- [Valid](#Valid) +- [MarshalJSON](#MarshalJSON) +- [NewRegistry](#NewRegistry) +- [Add](#Add) +- [Remove](#Remove) +- [Update](#Update) +- [GetByValue](#GetByValue) +- [GetByName](#GetByName) +- [Items](#Items) +- [Contains](#Contains) +- [Size](#Size) +- [Range](#Range) +- [SortedItems](#SortedItems) +- [Filter](#Filter) + + + +## 文档 + +### NewItem + +创建枚举项。
+ +函数签名: + +```go +func NewItem[T comparable](value T, name string) *Item[T] +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + fmt.Println(item1.Name(), item1.Value()) + fmt.Println(item2.Name(), item2.Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### NewItemsFromPairs + +从Pair结构体的切片创建枚举项。
+ +函数签名: + +```go +func NewItemsFromPairs[T comparable](pairs ...Pair[T]) []*Item[T] +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + items := enum.NewItemsFromPairs( + enum.Pair[Status]{Value: Active, Name: "Active"}, + enum.Pair[Status]{Value: Inactive, Name: "Inactive"}, + ) + + fmt.Println(items[0].Name(), items[0].Value()) + fmt.Println(items[1].Name(), items[1].Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Value + +返回枚举项的值。
+ +函数签名: + +```go +func (it *Item[T]) Value() T +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + items := enum.NewItemsFromPairs( + enum.Pair[Status]{Value: Active, Name: "Active"}, + enum.Pair[Status]{Value: Inactive, Name: "Inactive"}, + ) + + fmt.Println(items[0].Name(), items[0].Value()) + fmt.Println(items[1].Name(), items[1].Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Name + +返回枚举项的名称。
+ +函数签名: + +```go +func (it *Item[T]) Name() string +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + items := enum.NewItemsFromPairs( + enum.Pair[Status]{Value: Active, Name: "Active"}, + enum.Pair[Status]{Value: Inactive, Name: "Inactive"}, + ) + + fmt.Println(items[0].Name(), items[0].Value()) + fmt.Println(items[1].Name(), items[1].Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Valid + +检查枚举项是否有效。如果提供了自定义检查函数,将使用该函数验证值。
+ +函数签名: + +```go +func (it *Item[T]) Valid(checker ...func(T) bool) bool +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + item := enum.NewItem(Active, "Active") + fmt.Println(item.Valid()) + + invalidItem := enum.NewItem(Unknown, "") + fmt.Println(invalidItem.Valid()) + + // Output: + // true + // false +} +``` + +### MarshalJSON + +枚举项实现json.Marshaler 接口。
+ +函数签名: + +```go +func (it *Item[T]) MarshalJSON() ([]byte, error) +func (it *Item[T]) UnmarshalJSON(data []byte) error +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + item := enum.NewItem(Active, "Active") + data, _ := item.MarshalJSON() + fmt.Println(string(data)) + + var unmarshaledItem Item[Status] + _ = unmarshaledItem.UnmarshalJSON(data) + fmt.Println(unmarshaledItem.Name(), unmarshaledItem.Value()) + + // Output: + // {"name":"Active","value":1} + // Active 1 +} +``` + +### NewRegistry + +Registry 定义了一个通用的枚举注册表结构体。
+ +函数签名: + +```go +func NewRegistry[T comparable](items ...*Item[T]) *Registry[T] +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + registry.Add(item1, item2) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("Found by value:", item.Name()) + } + + if item, found := registry.GetByName("Inactive"); found { + fmt.Println("Found by name:", item.Value()) + } + + // Output: + // Found by value: Active + // Found by name: 2 +} +``` + +### Add + +向枚举注册表添加枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) Add(items ...*Item[T]) +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + registry.Add(item1, item2) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("Found by value:", item.Name()) + } + + if item, found := registry.GetByName("Inactive"); found { + fmt.Println("Found by name:", item.Value()) + } + + // Output: + // Found by value: Active + // Found by name: 2 +} +``` + +### Remove + +在枚举注册表中删除枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) Remove(value T) bool +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + + registry.Add(item1) + fmt.Println("Size before removal:", registry.Size()) + + removed := registry.Remove(Active) + fmt.Println("Removed:", removed) + fmt.Println("Size after removal:", registry.Size()) + + // Output: + // Size before removal: 1 + // Removed: true + // Size after removal: 0 +} +``` + +### Update + +在枚举注册表中更新枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) Update(value T, newName string) bool +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + + registry.Add(item1) + updated := registry.Update(Active, "Activated") + fmt.Println("Updated:", updated) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("New name:", item.Name()) + } + + // Output: + // Updated: true + // New name: Activated +} +``` + +### GetByValue + +在枚举注册表中通过值获取枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) GetByValue(value T) (*Item[T], bool) +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + + registry.Add(item1, item2) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("Found name by value:", item.Name()) + } + + // Output: + // Found name by value: Active +} +``` + +### GetByName + +在枚举注册表中通过名称获取枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) GetByName(name string) (*Item[T], bool) +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item := enum.NewItem(Active, "Active") + + registry.Add(item) + + if item, found := registry.GetByName("Active"); found { + fmt.Println("Found value by name:", item.Value()) + } + + // Output: + // Found value by name: 1 +} +``` + +### Items + +返回枚举注册表中的枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) Items() []*Item[T] +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + registry.Add(item1, item2) + + for _, item := range registry.Items() { + fmt.Println(item.Name(), item.Value()) + } + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Contains + +检查注册表中是否存在具有给定值的枚举项。
+ +函数签名: + +```go +func (r *Registry[T]) Contains(value T) bool +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item := enum.NewItem(Active, "Active") + registry.Add(item) + + fmt.Println(registry.Contains(Active)) + fmt.Println(registry.Contains(Inactive)) + + // Output: + // true + // false +} +``` + +### Size + +返回注册表中枚举项的数目。
+ +函数签名: + +```go +func (r *Registry[T]) Size() int +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + fmt.Println("Initial size:", registry.Size()) + + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + registry.Add(item1, item2) + + fmt.Println("Size after adding items:", registry.Size()) + + registry.Remove(Active) + fmt.Println("Size after removing an item:", registry.Size()) + + // Output: + // Initial size: 0 + // Size after adding items: 2 + // Size after removing an item: 1 +} +``` + +### Range + +遍历注册表中的所有枚举项,并应用给定的函数。
+ +函数签名: + +```go +func (r *Registry[T]) Range(fn func(*Item[T]) bool) +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + registry.Add(item1, item2) + + registry.Range(func(item *Item[Status]) bool { + fmt.Println(item.Name(), item.Value()) + return true // continue iteration + }) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### SortedItems + +返回按给定比较函数排序的所有枚举项的切片。
+ +函数签名: + +```go +func (r *Registry[T]) SortedItems(less func(*Item[T], *Item[T]) bool) []*Item[T] +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Inactive, "Inactive") + item2 := enum.NewItem(Active, "Active") + registry.Add(item1, item2) + + for _, item := range registry.SortedItems(func(i1, i2 *Item[Status]) bool { + return i1.value < i2.value + }) { + fmt.Println(item.Name(), item.Value()) + } + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Filter + +返回满足给定谓词函数的枚举项切片。
+ +函数签名: + +```go +func (r *Registry[T]) Filter(predicate func(*Item[T]) bool) []*Item[T] +``` + +示例:[运行](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + registry.Add(item1, item2) + + activeItems := registry.Filter(func(item *Item[Status]) bool { + return item.Value() == Active + }) + + for _, item := range activeItems { + fmt.Println(item.Name(), item.Value()) + } + + // Output: + // Active 1 +} +``` \ No newline at end of file diff --git a/docs/en/api/packages/enum.md b/docs/en/api/packages/enum.md new file mode 100644 index 0000000..8b13aba --- /dev/null +++ b/docs/en/api/packages/enum.md @@ -0,0 +1,850 @@ +# Enum + +Package enum provides a simple enum implementation. + + + +## Source: + +- [https://github.com/duke-git/lancet/blob/main/enum/enum.go](https://github.com/duke-git/lancet/blob/main/enum/enum.go) + + + +## Usage: + +```go +import ( + "github.com/duke-git/lancet/v2/enum" +) +``` + + + +## Index + +- [NewItem](#NewItem) +- [NewItemsFromPairs](#NewItemsFromPairs) +- [Value](#Value) +- [Name](#Name) +- [Valid](#Valid) +- [MarshalJSON](#MarshalJSON) +- [NewRegistry](#NewRegistry) +- [Add](#Add) +- [Remove](#Remove) +- [Update](#Update) +- [GetByValue](#GetByValue) +- [GetByName](#GetByName) +- [Items](#Items) +- [Contains](#Contains) +- [Size](#Size) +- [Range](#Range) +- [SortedItems](#SortedItems) +- [Filter](#Filter) + + + +## Documentation + +### NewItem + +Creates a new enum item.
+ +Signature: + +```go +func NewItem[T comparable](value T, name string) *Item[T] +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + fmt.Println(item1.Name(), item1.Value()) + fmt.Println(item2.Name(), item2.Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### NewItemsFromPairs + +Creates enum items from a slice of Pair structs.
+ +Signature: + +```go +func NewItemsFromPairs[T comparable](pairs ...Pair[T]) []*Item[T] +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + items := enum.NewItemsFromPairs( + enum.Pair[Status]{Value: Active, Name: "Active"}, + enum.Pair[Status]{Value: Inactive, Name: "Inactive"}, + ) + + fmt.Println(items[0].Name(), items[0].Value()) + fmt.Println(items[1].Name(), items[1].Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Value + +Returns the value of the enum item.
+ +Signature: + +```go +func (it *Item[T]) Value() T +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + items := enum.NewItemsFromPairs( + enum.Pair[Status]{Value: Active, Name: "Active"}, + enum.Pair[Status]{Value: Inactive, Name: "Inactive"}, + ) + + fmt.Println(items[0].Name(), items[0].Value()) + fmt.Println(items[1].Name(), items[1].Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Name + +Returns the name of the enum item.
+ +Signature: + +```go +func (it *Item[T]) Name() string +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + items := enum.NewItemsFromPairs( + enum.Pair[Status]{Value: Active, Name: "Active"}, + enum.Pair[Status]{Value: Inactive, Name: "Inactive"}, + ) + + fmt.Println(items[0].Name(), items[0].Value()) + fmt.Println(items[1].Name(), items[1].Value()) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Valid + +Checks if the enum item is valid. If a custom check function is provided, it will be used to validate the value.
+ +Signature: + +```go +func (it *Item[T]) Valid(checker ...func(T) bool) bool +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + item := enum.NewItem(Active, "Active") + fmt.Println(item.Valid()) + + invalidItem := enum.NewItem(Unknown, "") + fmt.Println(invalidItem.Valid()) + + // Output: + // true + // false +} +``` + +### MarshalJSON + +Implementation of json.Marshaler interface.
+ +Signature: + +```go +func (it *Item[T]) MarshalJSON() ([]byte, error) +func (it *Item[T]) UnmarshalJSON(data []byte) error +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + item := enum.NewItem(Active, "Active") + data, _ := item.MarshalJSON() + fmt.Println(string(data)) + + var unmarshaledItem Item[Status] + _ = unmarshaledItem.UnmarshalJSON(data) + fmt.Println(unmarshaledItem.Name(), unmarshaledItem.Value()) + + // Output: + // {"name":"Active","value":1} + // Active 1 +} +``` + +### NewRegistry + +Creates a new enum registry.
+ +Signature: + +```go +func NewRegistry[T comparable](items ...*Item[T]) *Registry[T] +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + registry.Add(item1, item2) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("Found by value:", item.Name()) + } + + if item, found := registry.GetByName("Inactive"); found { + fmt.Println("Found by name:", item.Value()) + } + + // Output: + // Found by value: Active + // Found by name: 2 +} +``` + +### Add + +Adds enum items to the registry.
+ +Signature: + +```go +func (r *Registry[T]) Add(items ...*Item[T]) +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + registry.Add(item1, item2) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("Found by value:", item.Name()) + } + + if item, found := registry.GetByName("Inactive"); found { + fmt.Println("Found by name:", item.Value()) + } + + // Output: + // Found by value: Active + // Found by name: 2 +} +``` + +### Remove + +Removes an enum item from the registry by its value.
+ +Signature: + +```go +func (r *Registry[T]) Remove(value T) bool +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + + registry.Add(item1) + fmt.Println("Size before removal:", registry.Size()) + + removed := registry.Remove(Active) + fmt.Println("Removed:", removed) + fmt.Println("Size after removal:", registry.Size()) + + // Output: + // Size before removal: 1 + // Removed: true + // Size after removal: 0 +} +``` + +### Update + +Updates the name of an enum item in the registry by its value.
+ +Signature: + +```go +func (r *Registry[T]) Update(value T, newName string) bool +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + + registry.Add(item1) + updated := registry.Update(Active, "Activated") + fmt.Println("Updated:", updated) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("New name:", item.Name()) + } + + // Output: + // Updated: true + // New name: Activated +} +``` + +### GetByValue + +Retrieves an enum item by its value.
+ +Signature: + +```go +func (r *Registry[T]) GetByValue(value T) (*Item[T], bool) +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + + registry.Add(item1, item2) + + if item, found := registry.GetByValue(Active); found { + fmt.Println("Found name by value:", item.Name()) + } + + // Output: + // Found name by value: Active +} +``` + +### GetByName + +Retrieves an enum item by its name.
+ +Signature: + +```go +func (r *Registry[T]) GetByName(name string) (*Item[T], bool) +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item := enum.NewItem(Active, "Active") + + registry.Add(item) + + if item, found := registry.GetByName("Active"); found { + fmt.Println("Found value by name:", item.Value()) + } + + // Output: + // Found value by name: 1 +} +``` + +### Items + +Returns a slice of all enum items in the registry.
+ +Signature: + +```go +func (r *Registry[T]) Items() []*Item[T] +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + + registry.Add(item1, item2) + + for _, item := range registry.Items() { + fmt.Println(item.Name(), item.Value()) + } + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Contains + +Checks if an enum item with the given value exists in the registry.
+ +Signature: + +```go +func (r *Registry[T]) Contains(value T) bool +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item := enum.NewItem(Active, "Active") + registry.Add(item) + + fmt.Println(registry.Contains(Active)) + fmt.Println(registry.Contains(Inactive)) + + // Output: + // true + // false +} +``` + +### Size + +Returns the number of enum items in the registry.
+ +Signature: + +```go +func (r *Registry[T]) Size() int +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + fmt.Println("Initial size:", registry.Size()) + + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + registry.Add(item1, item2) + + fmt.Println("Size after adding items:", registry.Size()) + + registry.Remove(Active) + fmt.Println("Size after removing an item:", registry.Size()) + + // Output: + // Initial size: 0 + // Size after adding items: 2 + // Size after removing an item: 1 +} +``` + +### Range + +Iterates over all enum items in the registry and applies the given function.
+ +Signature: + +```go +func (r *Registry[T]) Range(fn func(*Item[T]) bool) +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + registry.Add(item1, item2) + + registry.Range(func(item *Item[Status]) bool { + fmt.Println(item.Name(), item.Value()) + return true // continue iteration + }) + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### SortedItems + +Returns a slice of all enum items sorted by the given less function.
+ +Signature: + +```go +func (r *Registry[T]) SortedItems(less func(*Item[T], *Item[T]) bool) []*Item[T] +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Inactive, "Inactive") + item2 := enum.NewItem(Active, "Active") + registry.Add(item1, item2) + + for _, item := range registry.SortedItems(func(i1, i2 *Item[Status]) bool { + return i1.value < i2.value + }) { + fmt.Println(item.Name(), item.Value()) + } + + // Output: + // Active 1 + // Inactive 2 +} +``` + +### Filter + +Returns a slice of enum items that satisfy the given predicate function.
+ +Signature: + +```go +func (r *Registry[T]) Filter(predicate func(*Item[T]) bool) []*Item[T] +``` + +Example:[Run](https://go.dev/play/p/todo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/enum" +) + +type Status int + +const ( + Unknown Status = iota + Active + Inactive +) + +func main() { + registry := enum.NewRegistry[Status]() + item1 := enum.NewItem(Active, "Active") + item2 := enum.NewItem(Inactive, "Inactive") + registry.Add(item1, item2) + + activeItems := registry.Filter(func(item *Item[Status]) bool { + return item.Value() == Active + }) + + for _, item := range activeItems { + fmt.Println(item.Name(), item.Value()) + } + + // Output: + // Active 1 +} +``` \ No newline at end of file