remake safety slice

This commit is contained in:
xing 2024-06-12 00:14:07 +08:00
parent 39c9dc1b09
commit eb7ccd4f2d
5 changed files with 26 additions and 23 deletions

View File

@ -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)

View File

@ -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 {

View File

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

View File

@ -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)},
},
}

View File

@ -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 {