Download internal/csync/value.go from SaylorTwift/crush: direct link, hf CLI and curl.
- Browser
- Download file 963 Bytes
-
https://huggingface.co/SaylorTwift/crush/resolve/main/internal/csync/value.go
- Command line
-
hf download hf://SaylorTwift/crush/internal/csync/value.go
-
curl -L -o value.go https://huggingface.co/SaylorTwift/crush/resolve/main/internal/csync/value.go
963 Bytes
| package csync | |
| import ( | |
| "reflect" | |
| "sync" | |
| ) | |
| // Value is a generic thread-safe wrapper for any value type. | |
| // | |
| // For slices, use [Slice]. For maps, use [Map]. Pointers are not supported. | |
| type Value[T any] struct { | |
| v T | |
| mu sync.RWMutex | |
| } | |
| // NewValue creates a new Value with the given initial value. | |
| // | |
| // Panics if t is a pointer, slice, or map. Use the dedicated types for those. | |
| func NewValue[T any](t T) *Value[T] { | |
| v := reflect.ValueOf(t) | |
| switch v.Kind() { | |
| case reflect.Pointer: | |
| panic("csync.Value does not support pointer types") | |
| case reflect.Slice: | |
| panic("csync.Value does not support slice types; use csync.Slice") | |
| case reflect.Map: | |
| panic("csync.Value does not support map types; use csync.Map") | |
| } | |
| return &Value[T]{v: t} | |
| } | |
| // Get returns the current value. | |
| func (v *Value[T]) Get() T { | |
| v.mu.RLock() | |
| defer v.mu.RUnlock() | |
| return v.v | |
| } | |
| // Set updates the value. | |
| func (v *Value[T]) Set(t T) { | |
| v.mu.Lock() | |
| defer v.mu.Unlock() | |
| v.v = t | |
| } | |