diff options
Diffstat (limited to 'cursed/mutex.go')
| -rw-r--r-- | cursed/mutex.go | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/cursed/mutex.go b/cursed/mutex.go new file mode 100644 index 0000000..82fe58f --- /dev/null +++ b/cursed/mutex.go @@ -0,0 +1,22 @@ +package cursed + +import "sync" + +// Mutex is a generic locking container for Go much like Rust's std::sync::Mutex<T>. +// +// It differs from a normal sync.Mutex because it guards a value instead of just +// being something you lock and unlock to guard another value. When you are done with +// the value, call the function return to re-lock the mutex. +type Mutex[T any] struct { + val T + lock sync.Mutex +} + +func NewMutex[T any](val T) *Mutex[T] { + return &Mutex[T]{val: val} +} + +func (mu *Mutex[T]) Unlock() (T, func()) { + mu.lock.Lock() + return mu.val, func() { mu.lock.Unlock() } +} |
