mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-25 10:18:59 +02:00
feat: trie implementation
This commit is contained in:
44
internal/utils/trie/trie.go
Normal file
44
internal/utils/trie/trie.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package trie
|
||||
|
||||
import "github.com/puzpuzpuz/xsync/v3"
|
||||
|
||||
type Root struct {
|
||||
*Node
|
||||
cached *xsync.MapOf[string, *Node]
|
||||
}
|
||||
|
||||
func NewTrie() *Root {
|
||||
return &Root{
|
||||
Node: &Node{
|
||||
children: xsync.NewMapOf[string, *Node](),
|
||||
},
|
||||
cached: xsync.NewMapOf[string, *Node](),
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Root) getNode(key *Key, newFunc func() any) *Node {
|
||||
if key.hasWildcard {
|
||||
panic("should not call Load or Store on a key with any wildcard: " + key.full)
|
||||
}
|
||||
node, _ := r.cached.LoadOrCompute(key.full, func() *Node {
|
||||
return r.Node.loadOrStore(key, newFunc)
|
||||
})
|
||||
return node
|
||||
}
|
||||
|
||||
// LoadOrStore loads or stores the value for the key
|
||||
// Returns the value loaded/stored
|
||||
func (r *Root) LoadOrStore(key *Key, newFunc func() any) any {
|
||||
return r.getNode(key, newFunc).value.Load()
|
||||
}
|
||||
|
||||
// LoadAndStore loads or stores the value for the key
|
||||
// Returns the old value if exists, nil otherwise
|
||||
func (r *Root) LoadAndStore(key *Key, val any) any {
|
||||
return r.getNode(key, func() any { return val }).value.Swap(val)
|
||||
}
|
||||
|
||||
// Store stores the value for the key
|
||||
func (r *Root) Store(key *Key, val any) {
|
||||
r.getNode(key, func() any { return val }).value.Store(val)
|
||||
}
|
||||
Reference in New Issue
Block a user