mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-19 20:32:35 +02:00
44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package trie
|
|
|
|
import "github.com/puzpuzpuz/xsync/v4"
|
|
|
|
type Root struct {
|
|
*Node
|
|
cached *xsync.Map[string, *Node]
|
|
}
|
|
|
|
func NewTrie() *Root {
|
|
return &Root{
|
|
Node: &Node{
|
|
children: xsync.NewMap[string, *Node](),
|
|
},
|
|
cached: xsync.NewMap[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, bool) {
|
|
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)
|
|
}
|