7 func NewIndex(segments LengthIter) (ret Index) {
9 for l, ok := segments(); ok; l, ok = segments() {
10 ret.segments = append(ret.segments, Extent{start, l})
20 func NewIndexFromSegments(segments []Extent) Index {
21 return Index{segments}
24 func (me Index) iterSegments() func() (Length, bool) {
25 return func() (Length, bool) {
26 if len(me.segments) == 0 {
29 l := me.segments[0].Length
30 me.segments = me.segments[1:]
36 // Returns true if the callback returns false early, or extents are found in the index for all parts
37 // of the given extent.
38 func (me Index) Locate(e Extent, output Callback) bool {
39 first := sort.Search(len(me.segments), func(i int) bool {
41 return _e.End() > e.Start
43 if first == len(me.segments) {
46 e.Start -= me.segments[first].Start
47 me.segments = me.segments[first:]
48 return Scan(me.iterSegments(), e, func(i int, e Extent) bool {
49 return output(i+first, e)