forked from ungerik/go-start
-
Notifications
You must be signed in to change notification settings - Fork 0
/
indexedsliceiterator.go
41 lines (35 loc) · 1.03 KB
/
indexedsliceiterator.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
package model
import (
"fmt"
"reflect"
"github.com/ungerik/go-start/errs"
"github.com/ungerik/go-start/reflection"
)
func NewIndexedSliceIterator(slice interface{}, indices []int) *IndexedSliceIterator {
v := reflect.ValueOf(slice)
if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
panic(fmt.Errorf("Expected slice or array, got %T", slice))
}
return &IndexedSliceIterator{slice: v, indices: indices}
}
type IndexedSliceIterator struct {
slice reflect.Value
indices []int
index int
err error
}
func (self *IndexedSliceIterator) Next(resultRef interface{}) bool {
if self.err != nil || self.index >= len(self.indices) {
return false
}
if self.indices[self.index] >= self.slice.Len() {
self.err = errs.Format("Index %d from indices greater or equal than length of slice %d", self.indices[self.index], self.slice.Len())
return false
}
reflection.SmartCopy(self.slice.Index(self.indices[self.index]), resultRef)
self.index++
return false
}
func (self *IndexedSliceIterator) Err() error {
return self.err
}