33 lines
793 B
Go
33 lines
793 B
Go
package interval
|
|
|
|
func (intvls *intervals) Merge() []*Interval {
|
|
if intvls.MergeList == nil {
|
|
intvls.MergeList = intvls.calculateMerged()
|
|
}
|
|
return intvls.MergeList
|
|
}
|
|
|
|
func (intvls *intervals) calculateMerged() []*Interval {
|
|
intvls.Sort()
|
|
list := []*Interval{}
|
|
var lastLow int
|
|
var lastHigh int
|
|
for i, intvl := range intvls.Intervals {
|
|
if i == 0 {
|
|
lastLow = intvl.Low
|
|
lastHigh = intvl.High
|
|
continue
|
|
}
|
|
if inBetweenInclusive(intvl.Low, lastLow, lastHigh) {
|
|
// because the intervals are previously sorted, we just need to take care of the High value
|
|
if intvl.High > lastHigh {
|
|
lastHigh = intvl.High
|
|
}
|
|
continue
|
|
}
|
|
list = append(list, &Interval{Low: lastLow, High: lastHigh})
|
|
}
|
|
list = append(list, &Interval{Low: lastLow, High: lastHigh})
|
|
return list
|
|
}
|