-
Notifications
You must be signed in to change notification settings - Fork 90
/
sort.go
50 lines (43 loc) · 1003 Bytes
/
sort.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package semver
import (
"github.com/blang/semver"
)
type SemverSortable interface {
Len() int
GetSemver(i int) *semver.Version
GetSequence(i int) int64
Swap(i, j int)
}
// Modified bubble sort: instead of comparing adjacent elements, compare the elements at the semvers only.
// Input is assumed to be sorted by sequence so non-semver elements are already in correct order.
func SortVersions(versions SemverSortable) {
endIndex := versions.Len()
keepSorting := true
for keepSorting {
keepSorting = false
for j := 0; j < endIndex-1; j++ {
vj := versions.GetSemver(j)
if vj == nil {
continue
}
isLessThan := false
for k := j + 1; k < endIndex; k++ {
vk := versions.GetSemver(k)
if vk == nil {
continue
}
isLessThan = vj.LT(*vk)
if vj.EQ(*vk) {
isLessThan = versions.GetSequence(j) < versions.GetSequence(k)
}
if isLessThan {
break
}
}
if isLessThan {
versions.Swap(j, j+1)
keepSorting = true
}
}
}
}