package cache

import (
	"sync"
)

// SliceCache结构体代表基于切片的缓存，内部使用切片存储元素，并通过读写锁保证并发安全
type SliceCache struct {
	data []interface{}
	rwmu sync.RWMutex
}

// NewSliceCache创建并返回一个新的基于切片的缓存实例
func NewSliceCache() *SliceCache {
	return &SliceCache{
		data: make([]interface{}, 0),
	}
}

// Add方法用于向切片缓存中添加元素，写操作加写锁保证并发安全
func (sc *SliceCache) Add(element interface{}) {
	sc.rwmu.Lock()
	sc.data = append(sc.data, element)
	sc.rwmu.Unlock()
}

// GetAll方法用于获取切片缓存中的所有元素，读操作加读锁允许并发读
func (sc *SliceCache) GetAll() []interface{} {
	sc.rwmu.RLock()
	result := make([]interface{}, len(sc.data))
	copy(result, sc.data)
	sc.rwmu.RUnlock()
	return result
}

// Remove方法用于从切片缓存中删除指定元素，写操作加写锁保证并发安全
func (sc *SliceCache) Remove(element interface{}) bool {
	sc.rwmu.Lock()
	for i, e := range sc.data {
		if e == element {
			sc.data = append(sc.data[:i], sc.data[i+1:]...)
			sc.rwmu.Unlock()
			return true
		}
	}
	sc.rwmu.Unlock()
	return false
}
