-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrotator.go
80 lines (61 loc) · 1.15 KB
/
rotator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package rotator
import (
"errors"
"fmt"
"sync"
)
type Rotator[T any, C comparable] struct {
sync.Mutex
current int
keyFunc func(T) C
values []T
}
func New[T any, C comparable](keyFunc func(T) C) *Rotator[T, C] {
return &Rotator[T, C]{
current: 0,
values: make([]T, 0),
keyFunc: keyFunc,
}
}
func (k *Rotator[T, C]) Add(v ...T) error {
k.Lock()
defer k.Unlock()
k.values = append(k.values, v...)
return nil
}
func (k *Rotator[T, C]) Rotate() (T, error) {
var v T
k.Lock()
defer k.Unlock()
if len(k.values) == 0 {
return v, errors.New("no values to rotate")
}
v = k.values[k.current]
k.current = (k.current + 1) % len(k.values)
return v, nil
}
func (k *Rotator[T, C]) Get(key C) (T, bool) {
var v T
k.Lock()
defer k.Unlock()
for _, v := range k.values {
if k.keyFunc(v) == key {
return v, true
}
}
return v, false
}
func (k *Rotator[T, C]) Delete(key C) error {
for i, v := range k.values {
if k.keyFunc(v) == key {
k.Lock()
k.values = append(k.values[:i], k.values[i+1:]...)
k.Unlock()
return nil
}
}
return fmt.Errorf("key not found")
}
func (k *Rotator[T, C]) Len() int {
return len(k.values)
}