v1.0.0
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
package queueMemory
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"reflect"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Pool struct {
|
||||
Values [][]byte
|
||||
Lock sync.RWMutex
|
||||
}
|
||||
|
||||
func New() *Pool {
|
||||
return &Pool{}
|
||||
}
|
||||
|
||||
func (k *Pool) LPush(value ...interface{}) error {
|
||||
k.Lock.Lock()
|
||||
defer k.Lock.Unlock()
|
||||
for i := 0; i < len(value); i++ {
|
||||
v, _ := json.Marshal(value[i])
|
||||
k.Values = append([][]byte{v}, k.Values...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *Pool) RPush(value ...interface{}) error {
|
||||
k.Lock.Lock()
|
||||
defer k.Lock.Unlock()
|
||||
for i := 0; i < len(value); i++ {
|
||||
v, _ := json.Marshal(value[i])
|
||||
k.Values = append(k.Values, v)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *Pool) Delete(value interface{}) error {
|
||||
k.Lock.Lock()
|
||||
defer k.Lock.Unlock()
|
||||
var index int64
|
||||
v, _ := json.Marshal(value)
|
||||
|
||||
for i, item := range k.Values {
|
||||
if reflect.DeepEqual(item, v) {
|
||||
index = int64(i)
|
||||
k.removeIndex(index)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 取出值
|
||||
func (k *Pool) GetByIndex(index int64, v interface{}) error {
|
||||
k.Lock.RLock()
|
||||
defer k.Lock.RUnlock()
|
||||
if int64(len(k.Values)) >= index {
|
||||
json.Unmarshal(k.Values[index], v)
|
||||
return nil
|
||||
} else {
|
||||
return errors.New("index non-existent")
|
||||
}
|
||||
}
|
||||
|
||||
// 左-取出并删除
|
||||
func (k *Pool) LPop(v interface{}) error {
|
||||
if err := k.GetByIndex(0, v); err != nil {
|
||||
return err
|
||||
} else {
|
||||
k.removeIndex(0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 右-取出并删除
|
||||
func (k *Pool) RPop(v interface{}) error {
|
||||
index := int64(len(k.Values) - 1)
|
||||
if err := k.GetByIndex(index, v); err != nil {
|
||||
return err
|
||||
} else {
|
||||
k.removeIndex(index)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *Pool) removeIndex(index int64) error {
|
||||
k.Lock.Lock()
|
||||
defer k.Lock.Unlock()
|
||||
k.Values = append(k.Values[:index], k.Values[index+1:]...)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (k *Pool) Length() (int64, error) {
|
||||
return int64(len(k.Values)), nil
|
||||
}
|
||||
|
||||
func (k *Pool) Flush() error {
|
||||
k.Lock.Lock()
|
||||
defer k.Lock.Unlock()
|
||||
k.Values = nil
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user