4 g "github.com/anacrolix/generics"
8 func NewIndex(segments LengthIter) (ret Index) {
10 for l, ok := segments(); ok; l, ok = segments() {
11 ret.segments = append(ret.segments, Extent{start, l})
21 func NewIndexFromSegments(segments []Extent) Index {
22 return Index{segments}
25 func (me Index) iterSegments() func() (Extent, bool) {
26 var lastEnd g.Option[Int]
27 return func() (ret Extent, ok bool) {
28 if len(me.segments) == 0 {
32 me.segments = me.segments[1:]
33 ret.Start = cur.Start - lastEnd.UnwrapOr(cur.Start)
34 ret.Length = cur.Length
35 lastEnd.Set(cur.End())
41 // Returns true if the callback returns false early, or extents are found in the index for all parts
42 // of the given extent.
43 func (me Index) Locate(e Extent, output Callback) bool {
44 first := sort.Search(len(me.segments), func(i int) bool {
46 return _e.End() > e.Start
48 if first == len(me.segments) {
51 e.Start -= me.segments[first].Start
52 // The extent is before the first segment.
57 me.segments = me.segments[first:]
58 return ScanConsecutive(me.iterSegments(), e, func(i int, e Extent) bool {
59 return output(i+first, e)