]> Sergey Matveev's repositories - btrtrc.git/blob - segments/index.go
Drop support for go 1.20
[btrtrc.git] / segments / index.go
1 package segments
2
3 import (
4         "sort"
5 )
6
7 func NewIndex(segments LengthIter) (ret Index) {
8         var start Length
9         for l, ok := segments(); ok; l, ok = segments() {
10                 ret.segments = append(ret.segments, Extent{start, l})
11                 start += l
12         }
13         return
14 }
15
16 type Index struct {
17         segments []Extent
18 }
19
20 func (me Index) iterSegments() func() (Length, bool) {
21         return func() (Length, bool) {
22                 if len(me.segments) == 0 {
23                         return 0, false
24                 } else {
25                         l := me.segments[0].Length
26                         me.segments = me.segments[1:]
27                         return l, true
28                 }
29         }
30 }
31
32 func (me Index) Locate(e Extent, output Callback) bool {
33         first := sort.Search(len(me.segments), func(i int) bool {
34                 _e := me.segments[i]
35                 return _e.End() > e.Start
36         })
37         if first == len(me.segments) {
38                 return false
39         }
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)
44         })
45 }