| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- 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
- }
|