42 lines
970 B
Go
42 lines
970 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
|
|
pendingToAdd := false
|
|
for i, intvl := range intvls.Intervals {
|
|
if i == 0 {
|
|
lastLow = intvl.Low
|
|
lastHigh = intvl.High
|
|
continue
|
|
}
|
|
if isLowInBetween(intvl.Low, intvl.High, lastLow, lastHigh) || isHighInBetween(intvl.Low, intvl.High, lastLow, lastHigh) {
|
|
if intvl.Low < lastLow {
|
|
lastLow = intvl.Low
|
|
}
|
|
if intvl.High > lastHigh {
|
|
lastHigh = intvl.High
|
|
}
|
|
pendingToAdd = true
|
|
continue
|
|
}
|
|
list = append(list, &Interval{Low: lastLow, High: lastHigh})
|
|
lastLow = intvl.Low
|
|
lastHigh = intvl.High
|
|
pendingToAdd = false
|
|
}
|
|
if pendingToAdd == true {
|
|
list = append(list, &Interval{Low: lastLow, High: lastHigh})
|
|
}
|
|
return list
|
|
}
|