diff --git a/cache/reload/reload.go b/cache/reload/reload.go index e73f7e3..60d6c3a 100644 --- a/cache/reload/reload.go +++ b/cache/reload/reload.go @@ -23,7 +23,7 @@ func GetGlobeMutex() *sync.Mutex { return mut } -var reloadQueues = safety.NewSlice(make([]Queue, 0)) +var reloadQueues = safety.NewSlice[Queue]() var reloadQueueHookFns = safety.NewVar[[]func(queue Queue) (Queue, bool)](nil) diff --git a/safety/rwmap.go b/safety/rwmap.go index 4a84153..c1091c1 100644 --- a/safety/rwmap.go +++ b/safety/rwmap.go @@ -38,10 +38,14 @@ func (v *RWMap[K, V]) Del(keys ...K) { } } -func (v *RWMap[K, V]) Raw() map[K]V { +func (v *RWMap[K, V]) Copy() map[K]V { v.mux.RLock() defer v.mux.RUnlock() - return v.m + var m = make(map[K]V) + for k, val := range v.m { + m[k] = val + } + return m } func (v *RWMap[K, V]) Len() int { diff --git a/safety/slice.go b/safety/slice.go index 84b5a41..bb6e63f 100644 --- a/safety/slice.go +++ b/safety/slice.go @@ -3,37 +3,37 @@ package safety import "sync" type Slice[T any] struct { - *Var[[]T] - mu sync.Mutex + Var []T + mu sync.RWMutex } -func NewSlice[T any](a []T) *Slice[T] { +func NewSlice[T any](a ...[]T) *Slice[T] { + var s []T + if len(a) > 0 { + s = a[0] + } return &Slice[T]{ - NewVar(a), - sync.Mutex{}, + s, + sync.RWMutex{}, } } func (r *Slice[T]) Append(t ...T) { r.mu.Lock() defer r.mu.Unlock() - ts := append(r.Var.Load(), t...) - r.Store(ts) + r.Var = append(r.Var, t...) } -func (r *Slice[T]) Set(index int, val T) { - v := r.Var.Load() - if index >= len(v) { - return - } +func (r *Slice[T]) Store(a []T) { r.mu.Lock() defer r.mu.Unlock() - v[index] = val + r.Var = a } func (r *Slice[T]) Load() (a []T) { - v := r.Var.Load() - a = make([]T, len(v)) - copy(a, v) + r.mu.RLock() + defer r.mu.RUnlock() + a = make([]T, len(r.Var)) + copy(a, r.Var) return } diff --git a/safety/slice_test.go b/safety/slice_test.go index d9b928c..a38db10 100644 --- a/safety/slice_test.go +++ b/safety/slice_test.go @@ -19,7 +19,7 @@ func TestSlice_Append(t *testing.T) { tests := []testCase[int]{ { name: "t1", - r: *NewSlice([]int{}), + r: *NewSlice[int](), args: args[int]{number.Range(1, 10, 1)}, }, } diff --git a/stream/stream.go b/stream/stream.go index 9de04a1..eebee32 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -7,8 +7,7 @@ import ( ) func ParallelFilterAndMap[R, T any](a Stream[T], fn func(T) (R, bool), c int) Stream[R] { - var x []R - rr := safety.NewSlice(x) + rr := safety.NewSlice[R]() a.ParallelForEach(func(t T) { y, ok := fn(t) if ok { @@ -84,7 +83,7 @@ func (r Stream[T]) ParallelForEach(fn func(T), c int) { } func (r Stream[T]) ParallelFilterAndMap(fn func(T) (T, bool), c int) Stream[T] { - rr := safety.NewSlice([]T{}) + rr := safety.NewSlice[T]() r.ParallelForEach(func(t T) { v, ok := fn(t) if ok {