summaryrefslogtreecommitdiffstats
path: root/cache/cache.go
diff options
context:
space:
mode:
Diffstat (limited to 'cache/cache.go')
-rw-r--r--cache/cache.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/cache/cache.go b/cache/cache.go
new file mode 100644
index 0000000..fbc763e
--- /dev/null
+++ b/cache/cache.go
@@ -0,0 +1,54 @@
+// Copyright © 2022 siddharth ravikumar <s@ricketyspace.net>
+// SPDX-License-Identifier: ISC
+
+// A simple in-memory cache store.
+package cache
+
+import "time"
+
+// An item in the key-value cache store.
+type item struct {
+ value string
+ expires time.Time // Time when the key-value expires
+}
+
+// A key-value cache store.
+type Cache struct {
+ store map[string]item
+}
+
+// Returns a new empty cache store.
+func NewCache() *Cache {
+ c := new(Cache)
+ c.store = make(map[string]item)
+ return c
+}
+
+// Set the (key,value) item to the cache store. This item will be
+// considered expired after time `expires`.
+//
+// Cache.Get will return an empty string once `expires` is past the
+// current time.
+func (c *Cache) Set(key, value string, expires time.Time) {
+ c.store[key] = item{
+ value: value,
+ expires: expires,
+ }
+}
+
+// Get an (key,value) item from the cache store by key.
+//
+// An empty string will be returned when if the key does not exist or
+// if the item corresponding to the key has expired. An expired
+// (key,value) item will be removed from the cache store.
+func (c *Cache) Get(key string) string {
+ if _, ok := c.store[key]; !ok {
+ return ""
+ }
+ // Check if the item expired.
+ if time.Until(c.store[key].expires).Seconds() < 0 {
+ delete(c.store, key)
+ return ""
+ }
+ return c.store[key].value
+}