kvs/kv/codec.go
2023-04-19 21:09:07 +08:00

129 lines
2.6 KiB
Go

package kv
import (
"github.com/tursom/GoCollections/exceptions"
"github.com/tursom/GoCollections/lang"
)
type (
Codec[V1, V2 any] interface {
lang.Object
Encode(v2 V2) V1
Decode(v1 V1) V2
}
codecStore[K1, K2, V1, V2 any] struct {
lang.BaseObject
kvs Store[K1, V1]
kCodec Codec[K1, K2]
vCodec Codec[V1, V2]
}
kCodecStore[K1, K2, V any] struct {
lang.BaseObject
kvs Store[K1, V]
codec Codec[K1, K2]
}
vCodecStore[K, V1, V2 any] struct {
lang.BaseObject
kvs Store[K, V1]
codec Codec[V1, V2]
}
invertCodec[V1, V2 any] struct {
lang.BaseObject
codec Codec[V2, V1]
}
)
func InvertCodec[V1, V2 any](codec Codec[V2, V1]) Codec[V1, V2] {
return &invertCodec[V1, V2]{codec: codec}
}
func CodecStore[K1, K2, V1, V2 any](
kvs Store[K1, V1],
kCodec Codec[K1, K2],
vCodec Codec[V1, V2],
) Store[K2, V2] {
return &codecStore[K1, K2, V1, V2]{
kvs: kvs,
kCodec: kCodec,
vCodec: vCodec,
}
}
func KCodecStore[K1, K2, V any](
kvs Store[K1, V],
codec Codec[K1, K2],
) Store[K2, V] {
return &kCodecStore[K1, K2, V]{
kvs: kvs,
codec: codec,
}
}
func VCodecStore[K, V1, V2 any](
kvs Store[K, V1],
codec Codec[V1, V2],
) Store[K, V2] {
return &vCodecStore[K, V1, V2]{
kvs: kvs,
codec: codec,
}
}
func (c *codecStore[K1, K2, V1, V2]) Put(key K2, value V2) exceptions.Exception {
return c.kvs.Put(c.kCodec.Encode(key), c.vCodec.Encode(value))
}
func (c *codecStore[K1, K2, V1, V2]) Get(key K2) (V2, exceptions.Exception) {
value, exception := c.kvs.Get(c.kCodec.Encode(key))
if exception != nil {
return lang.Nil[V2](), exception
}
return c.vCodec.Decode(value), nil
}
func (c *codecStore[K1, K2, V1, V2]) Delete(key K2) exceptions.Exception {
return c.kvs.Delete(c.kCodec.Encode(key))
}
func (c *kCodecStore[K1, K2, V]) Put(key K2, value V) exceptions.Exception {
return c.kvs.Put(c.codec.Encode(key), value)
}
func (c *kCodecStore[K1, K2, V]) Get(key K2) (V, exceptions.Exception) {
return c.kvs.Get(c.codec.Encode(key))
}
func (c *kCodecStore[K1, K2, V]) Delete(key K2) exceptions.Exception {
return c.kvs.Delete(c.codec.Encode(key))
}
func (c *vCodecStore[K, V1, V2]) Put(key K, value V2) exceptions.Exception {
return c.kvs.Put(key, c.codec.Encode(value))
}
func (c *vCodecStore[K, V1, V2]) Get(key K) (V2, exceptions.Exception) {
get, exception := c.kvs.Get(key)
if exception != nil {
return lang.Nil[V2](), exception
}
return c.codec.Decode(get), nil
}
func (c *vCodecStore[K, V1, V2]) Delete(key K) exceptions.Exception {
return c.kvs.Delete(key)
}
func (i *invertCodec[V1, V2]) Encode(v2 V2) V1 {
return i.codec.Decode(v2)
}
func (i *invertCodec[V1, V2]) Decode(v1 V1) V2 {
return i.codec.Encode(v1)
}