package collection
import "sync"
var rwMutex sync.RWMutex
type Item interface {
any
}
type Array[T Item] []T
type Fn[T Item] func(int, T, Array[T])
type FnBool[T Item] func(int, T, Array[T]) bool
type FnValue[T Item] func(int, T, Array[T]) T
func (a Array[T]) ForEach(fn Fn[T]) {
for index, item := range a {
fn(index, item, a)
}
}
func (a Array[T]) Filter(fn FnBool[T]) *Array[T] {
tempArray := make(Array[T], 0)
for index, item := range a {
if ok := fn(index, item, a); ok {
tempArray = append(tempArray, item)
}
}
return &tempArray
}
func (a Array[T]) Map(fn FnValue[T]) *Array[T] {
tempArray := make(Array[T], len(a))
for index, item := range a {
item := fn(index, item, a)
tempArray = append(tempArray, item)
}
return &tempArray
}
func (a *Array[T]) Pop() T {
rwMutex.Lock()
defer rwMutex.Unlock()
if len(*a) == 0 {
panic("Array长度为0")
}
last := (*a)[len(*a)-1]
*a = (*a)[:len(*a)-1]
return last
}
func (a *Array[T]) Push(items ...T) int {
rwMutex.Lock()
defer rwMutex.Unlock()
*a = append(*a, items...)
return len(items)
}
func (a *Array[T]) Shift() T {
rwMutex.Lock()
defer rwMutex.Unlock()
if len(*a) == 0 {
panic("Array长度为0")
}
head := (*a)[0]
*a = (*a)[1:len(*a)]
return head
}
func (a Array[T]) Size() int {
return len(a)
}
func (a Array[T]) IsEmpty() bool {
return len(a) == 0
}