jackhammer

Utilities for Go
Log | Files | Refs | README | LICENSE

mutex.go (714B)


      1 package syncx
      2 
      3 import "sync"
      4 
      5 // Mutex protects a value with a mutex.
      6 type Mutex[T any] struct {
      7 	lock  sync.Mutex
      8 	value T
      9 }
     10 
     11 func NewMutex[T any](v T) *Mutex[T] {
     12 	return &Mutex[T]{value: v}
     13 }
     14 
     15 func (m *Mutex[T]) With(fn func(t T)) {
     16 	m.lock.Lock()
     17 	defer m.lock.Unlock()
     18 	fn(m.value)
     19 }
     20 
     21 func (m *Mutex[T]) Update(fn func(t T) T) {
     22 	m.lock.Lock()
     23 	defer m.lock.Unlock()
     24 	m.value = fn(m.value)
     25 }
     26 
     27 func (m *Mutex[T]) Set(value T) {
     28 	m.lock.Lock()
     29 	defer m.lock.Unlock()
     30 	m.value = value
     31 }
     32 
     33 func (m *Mutex[T]) Take() T {
     34 	m.lock.Lock()
     35 	defer m.lock.Unlock()
     36 	v := m.value
     37 	m.value = *new(T)
     38 	return v
     39 }
     40 
     41 func (m *Mutex[T]) Swap(t T) T {
     42 	m.lock.Lock()
     43 	defer m.lock.Unlock()
     44 	v := m.value
     45 	m.value = t
     46 	return v
     47 }