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 }