64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package machine
|
|
|
|
import (
|
|
"gitea.neur0tx.site/Neur0toxine/vegapokerbot/internal/handler/fsm/fsmcontract"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
userMachines = newStore[int64, fsmcontract.Machine]()
|
|
pollMachines = newStore[int64, fsmcontract.Machine]()
|
|
)
|
|
|
|
type store[K comparable, V any] struct {
|
|
m map[K]V
|
|
l sync.RWMutex
|
|
}
|
|
|
|
func newStore[K comparable, V any]() *store[K, V] {
|
|
return &store[K, V]{m: map[K]V{}}
|
|
}
|
|
|
|
func (s *store[K, V]) Store(k K, v V) {
|
|
defer s.l.Unlock()
|
|
s.l.Lock()
|
|
s.m[k] = v
|
|
}
|
|
|
|
func (s *store[K, V]) Load(k K) (v V, ok bool) {
|
|
defer s.l.RUnlock()
|
|
s.l.RLock()
|
|
v, ok = s.m[k]
|
|
return
|
|
}
|
|
|
|
func ForUser(id int64) fsmcontract.Machine {
|
|
val, ok := userMachines.Load(id)
|
|
if !ok {
|
|
machine := newUserMachine()
|
|
userMachines.Store(id, machine)
|
|
return machine
|
|
}
|
|
return val
|
|
}
|
|
|
|
func ForPoll(id int64) fsmcontract.Machine {
|
|
val, ok := pollMachines.Load(id)
|
|
if !ok {
|
|
machine := newPollMachine()
|
|
pollMachines.Store(id, machine)
|
|
return machine
|
|
}
|
|
return val
|
|
}
|
|
|
|
func newUserMachine() fsmcontract.Machine {
|
|
// todo implement this
|
|
panic("not implemented yet")
|
|
}
|
|
|
|
func newPollMachine() fsmcontract.Machine {
|
|
// todo implement this
|
|
panic("not implemented yet")
|
|
}
|