nimona/go-nimona

View on GitHub
internal/kv/kv_memory.go

Summary

Maintainability
A
0 mins
Test Coverage
package kv

import (
    "fmt"
    "strings"

    "nimona.io/internal/xsync"
)

func NewMemoryStore[K, V any]() Store[K, V] {
    return &Memory[K, V]{
        items: &xsync.Map[string, V]{},
    }
}

type Memory[K, V any] struct {
    items *xsync.Map[string, V]
}

func (s *Memory[K, V]) Set(key K, value V) error {
    s.items.Store(keyToString(key), value)
    return nil
}

func (s *Memory[K, V]) Get(key K) (V, error) {
    value, ok := s.items.Load(keyToString(key))
    if !ok {
        return value, fmt.Errorf("not found")
    }
    return value, nil
}

func (s *Memory[K, V]) GetPrefix(key K) ([]V, error) {
    prefix := keyToString(key)
    values := []V{}
    s.items.Range(func(k string, v V) bool {
        if strings.HasPrefix(k, prefix) {
            values = append(values, v)
        }
        return true
    })
    return values, nil
}