-
Notifications
You must be signed in to change notification settings - Fork 267
/
tuple.go
61 lines (49 loc) · 1.36 KB
/
tuple.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 datastore
import (
"errors"
v0 "github.com/authzed/authzed-go/proto/authzed/api/v0"
)
var errClosedIterator = errors.New("unable to iterate: iterator closed")
// NewSliceTupleIterator creates a datastore.TupleIterator instance from a materialized slice of tuples.
func NewSliceTupleIterator(tuples []*v0.RelationTuple) TupleIterator {
return &sliceTupleIterator{tuples: tuples}
}
type sliceTupleIterator struct {
tuples []*v0.RelationTuple
closed bool
err error
}
// Next implements TupleIterator
func (sti *sliceTupleIterator) Next() *v0.RelationTuple {
if sti.closed {
sti.err = errClosedIterator
return nil
}
if len(sti.tuples) > 0 {
first := sti.tuples[0]
sti.tuples = sti.tuples[1:]
return first
}
return nil
}
// Err implements TupleIterator
func (sti *sliceTupleIterator) Err() error {
return sti.err
}
// Close implements TupleIterator
func (sti *sliceTupleIterator) Close() {
if sti.closed {
panic("tuple iterator double closed")
}
sti.tuples = nil
sti.closed = true
}
// BuildFinalizerFunction creates a function which can be used as a finalizer to make sure that
// tuples are getting closed before they are garbage collected.
func BuildFinalizerFunction() func(iter *sliceTupleIterator) {
return func(iter *sliceTupleIterator) {
if !iter.closed {
panic("Tuple iterator garbage collected before Close() was called")
}
}
}