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 (me Index) iterSegments() func() (Length, bool) {
21 return func() (Length, bool) {
22 if len(me.segments) == 0 {
25 l := me.segments[0].Length
26 me.segments = me.segments[1:]
32 func (me Index) Locate(e Extent, output Callback) bool {
33 first := sort.Search(len(me.segments), func(i int) bool {
35 return _e.End() > e.Start
37 if first == len(me.segments) {
40 e.Start -= me.segments[first].Start
41 me.segments = me.segments[first:]
42 return Scan(me.iterSegments(), e, func(i int, e Extent) bool {
43 return output(i+first, e)