package cache

// New returns a new concurrent-safe LRU cache with input capacity
func New(capacity uint64) *LRUCache {
	return &LRUCache{
		lru: NewLRUCache(capacity),
	}
}

// Add new entry to Cache return true if entry removed
func (l *LRUCache) Add(k, v interface{}) {
	l.m.Lock()
	l.lru.Add(k, v)
	l.m.Unlock()
}

// Get looks up a key's value from the cache.
func (l *LRUCache) Get(key interface{}) (value interface{}) {
	l.m.Lock()
	defer l.m.Unlock()
	return l.lru.Get(key)
}

// GetOldest looks up old key's value from the cache.
func (l *LRUCache) getOldest() (key, value interface{}) {
	l.m.Lock()
	defer l.m.Unlock()
	return l.lru.getOldest()
}

// getNewest looks up a key's value from the cache.
func (l *LRUCache) getNewest() (key, value interface{}) {
	l.m.Lock()
	defer l.m.Unlock()
	return l.lru.getNewest()
}

// ContainsOrAdd checks if cache contains key if not adds to cache
func (l *LRUCache) ContainsOrAdd(key, value interface{}) bool {
	l.m.Lock()
	defer l.m.Unlock()
	if l.lru.Contains(key) {
		return true
	}
	l.lru.Add(key, value)
	return false
}

// Contains checks if cache contains key
func (l *LRUCache) Contains(key interface{}) bool {
	l.m.Lock()
	defer l.m.Unlock()
	return l.lru.Contains(key)
}

// Remove entry from cache
func (l *LRUCache) Remove(key interface{}) bool {
	l.m.Lock()
	defer l.m.Unlock()
	return l.lru.Remove(key)
}

// Clear is used to clear the cache.
func (l *LRUCache) Clear() {
	l.m.Lock()
	l.lru.Clear()
	l.m.Unlock()
}

// Len returns the number of items in the cache.
func (l *LRUCache) Len() uint64 {
	l.m.Lock()
	defer l.m.Unlock()
	return l.lru.Len()
}
