aboutsummaryrefslogtreecommitdiff
path: root/cursed/mutex.go
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-08-20 09:58:46 -0400
committerXe Iaso <me@xeiaso.net>2023-08-20 09:58:46 -0400
commit0f035f34b46be55152ef430f9be66e1ce13eb680 (patch)
tree2bb852c81504e640fa9506e5c1300c9988dbe36d /cursed/mutex.go
parent6812fc366ed53ed256daea93c48e095587e6c290 (diff)
downloadx-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.go22
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() }
+}