diff options
| author | Xe Iaso <me@xeiaso.net> | 2023-08-20 09:58:46 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2023-08-20 09:58:46 -0400 |
| commit | 0f035f34b46be55152ef430f9be66e1ce13eb680 (patch) | |
| tree | 2bb852c81504e640fa9506e5c1300c9988dbe36d /cursed/mutex.go | |
| parent | 6812fc366ed53ed256daea93c48e095587e6c290 (diff) | |
| download | x-0f035f34b46be55152ef430f9be66e1ce13eb680.tar.xz x-0f035f34b46be55152ef430f9be66e1ce13eb680.zip | |
cursed: add Mutex type
Signed-off-by: Xe Iaso <me@xeiaso.net>
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() } +} |
