package cache

import (
	"sync"
)

// Cache 结构体代表缓存
type Cache struct {
	data map[string]any
	rwmu sync.RWMutex
}

// NewCache 创建并返回一个新的缓存实例
func NewCache() *Cache {
	return &Cache{
		data: make(map[string]any),
	}
}

// Set 方法用于向缓存中设置键值对，写操作会加写锁保证并发安全
func (c *Cache) set(key string, value any) {
	c.rwmu.Lock()
	defer c.rwmu.Unlock()
	c.data[key] = value
}

// Get 方法用于从缓存中根据键获取对应的值，读操作会加读锁允许并发读
func (c *Cache) get(key string) any {
	c.rwmu.RLock()
	defer c.rwmu.RUnlock()
	value := c.data[key]
	return value
}

// Delete 方法用于从缓存中删除指定的键值对，写操作会加写锁保证并发安全
func (c *Cache) Delete(key string) {
	c.rwmu.Lock()
	defer c.rwmu.Unlock()
	delete(c.data, key)
}

// GetData 方法用于从缓存中根据键获取对应的值，读操作会加读锁允许并发读
func GetData[V any](c *Cache, key string) (value V, ok bool) {
	v := c.get(key)
	value, ok = v.(V)
	return
}

// SetData 方法用于向缓存中设置键值对，写操作会加写锁保证并发安全
func SetData(c *Cache, key string, value any) {
	c.set(key, value)
}
