-
Notifications
You must be signed in to change notification settings - Fork 4
/
iterator.go
61 lines (51 loc) · 1.36 KB
/
iterator.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
package moysklad
import (
"encoding/json"
"sync"
)
// Iterator структура итератора
type Iterator[E any] struct {
el Slice[E]
idx int
mu sync.Mutex
}
// Len возвращает количество элементов
func (r *Iterator[E]) Len() int {
return len(r.el)
}
// HasNext возвращает true, если текущее значение счётчика меньше длины среза
func (r *Iterator[E]) HasNext() bool {
return r.idx < r.Len()
}
// Next возвращает следующий элемент среза или nil, если элемент отсутствует
func (r *Iterator[E]) Next() *E {
if r.HasNext() {
r.mu.Lock()
defer r.mu.Unlock()
row := r.el[r.idx]
r.idx += 1
return row
}
return nil
}
// Push добавляет элементы в срез
func (r *Iterator[E]) Push(elements ...*E) error {
r.mu.Lock()
defer r.mu.Unlock()
r.el = append(r.el, elements...)
return nil
}
// Stop сбрасывает текущее значение индекса
func (r *Iterator[E]) Stop() {
r.idx = 0
}
// Slice возвращает срез элементов
func (r *Iterator[E]) Slice() Slice[E] {
return r.el
}
func (r *Iterator[E]) MarshalJSON() ([]byte, error) {
return json.Marshal(r.el)
}
func (r *Iterator[E]) UnmarshalJSON(data []byte) error {
return json.Unmarshal(data, &r.el)
}