package cache

import (
	"sync"
	"time"
)

type Cache struct {
	ttl   time.Duration
	store sync.Map
}

func NewCache(ttl time.Duration) *Cache {
	return &Cache{
		ttl: ttl,
	}
}

func (c *Cache) Count() uint {
	var counter uint
	c.store.Range(func(_, _ any) bool {
		counter++
		return true
	})
	return counter
}

func (c *Cache) Set(key, value uint) {
	c.store.Store(key, value)
	time.AfterFunc(c.ttl, func() {
		c.store.Delete(key)
	})
}

func (c *Cache) Get(key uint) (uint, bool) {
	output, _ := c.store.Load(key)
	value, ok := output.(uint)
	return value, ok
}