commit 5e6cdda72bd09a8c4baa80f91aac34c6e5f0c3a0 parent 5efd600a7378b4bb15e17d9560d686af6278d15f Author: n0tr1v <n0tr1v@protonmail.com> Date: Thu, 21 Dec 2023 11:45:15 -0500 mtx/rwmtx Diffstat:
| M | pkg/utils/rwmtx/rwmtx.go | | | 62 | ++++++++++++++++++++++++++++++++++++++++++++++++++++---------- |
1 file changed, 52 insertions(+), 10 deletions(-)
diff --git a/pkg/utils/rwmtx/rwmtx.go b/pkg/utils/rwmtx/rwmtx.go @@ -1,32 +1,64 @@ package rwmtx -import "sync" +import ( + "sync" +) -type RWMtx[T any] struct { - sync.RWMutex +type Mtx[T any] struct { + sync.Mutex v T } -func New[T any](v T) RWMtx[T] { - return RWMtx[T]{v: v} +func NewMtx[T any](v T) Mtx[T] { + return Mtx[T]{v: v} } -func (m *RWMtx[T]) Get() T { - m.RLock() - defer m.RUnlock() +func (m *Mtx[T]) Get() T { + m.Lock() + defer m.Unlock() return m.v } -func (m *RWMtx[T]) Set(v T) { +func (m *Mtx[T]) Set(v T) { m.Lock() defer m.Unlock() m.v = v } -func (m *RWMtx[T]) Val() *T { +func (m *Mtx[T]) With(clb func(v *T)) { + _ = m.WithE(func(tx *T) error { + clb(tx) + return nil + }) +} + +func (m *Mtx[T]) WithE(clb func(v *T) error) error { + m.Lock() + defer m.Unlock() + return clb(&m.v) +} + +func (m *Mtx[T]) Val() *T { return &m.v } +//---------------------- + +type RWMtx[T any] struct { + sync.RWMutex + v T +} + +func New[T any](v T) RWMtx[T] { + return RWMtx[T]{v: v} +} + +func (m *RWMtx[T]) Get() T { + m.RLock() + defer m.RUnlock() + return m.v +} + func (m *RWMtx[T]) RWith(clb func(v *T)) { _ = m.RWithE(func(tx *T) error { clb(tx) @@ -40,6 +72,12 @@ func (m *RWMtx[T]) RWithE(clb func(v *T) error) error { return clb(&m.v) } +func (m *RWMtx[T]) Set(v T) { + m.Lock() + defer m.Unlock() + m.v = v +} + func (m *RWMtx[T]) With(clb func(v *T)) { _ = m.WithE(func(tx *T) error { clb(tx) @@ -52,3 +90,7 @@ func (m *RWMtx[T]) WithE(clb func(v *T) error) error { defer m.Unlock() return clb(&m.v) } + +func (m *RWMtx[T]) Val() *T { + return &m.v +}