| package utils | |
| import ( | |
| "sync/atomic" | |
| "time" | |
| ) | |
| type AtomicTime struct { | |
| v atomic.Value | |
| } | |
| func NewAtomicTime(t time.Time) *AtomicTime { | |
| a := &AtomicTime{} | |
| a.Set(t) | |
| return a | |
| } | |
| func (t *AtomicTime) Set(new time.Time) { | |
| t.v.Store(new) | |
| } | |
| func (t *AtomicTime) Get() time.Time { | |
| return t.v.Load().(time.Time) | |
| } | |
| type Atomic[T any] struct { | |
| v atomic.Value | |
| } | |
| func (a *Atomic[T]) Load() T { | |
| value := a.v.Load() | |
| if value == nil { | |
| var zero T | |
| return zero | |
| } | |
| return value.(T) | |
| } | |
| func (a *Atomic[T]) Store(value T) { | |
| a.v.Store(value) | |
| } | |
| func (a *Atomic[T]) Swap(new T) T { | |
| old := a.v.Swap(new) | |
| if old == nil { | |
| var zero T | |
| return zero | |
| } | |
| return old.(T) | |
| } | |
| func (a *Atomic[T]) CompareAndSwap(old, new T) bool { | |
| return a.v.CompareAndSwap(old, new) | |
| } | |