Skip to content

Commit 62e63ed

Browse files
authored
progress: Secondary sort by start time (#271)
1 parent 4ba68d2 commit 62e63ed

File tree

2 files changed

+35
-30
lines changed

2 files changed

+35
-30
lines changed

progress/tracker_sort.go

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ func (sb SortBy) Sort(trackers []*Tracker) {
3434
case SortByMessage:
3535
sort.Sort(sortByMessage(trackers))
3636
case SortByMessageDsc:
37-
sort.Sort(sortByMessageDsc(trackers))
37+
sort.Sort(sortDsc{sortByMessage(trackers)})
3838
case SortByPercent:
3939
sort.Sort(sortByPercent(trackers))
4040
case SortByPercentDsc:
41-
sort.Sort(sortByPercentDsc(trackers))
41+
sort.Sort(sortDsc{sortByPercent(trackers)})
4242
case SortByValue:
4343
sort.Sort(sortByValue(trackers))
4444
case SortByValueDsc:
45-
sort.Sort(sortByValueDsc(trackers))
45+
sort.Sort(sortDsc{sortByValue(trackers)})
4646
default:
4747
// no sort
4848
}
@@ -54,32 +54,28 @@ func (sb sortByMessage) Len() int { return len(sb) }
5454
func (sb sortByMessage) Swap(i, j int) { sb[i], sb[j] = sb[j], sb[i] }
5555
func (sb sortByMessage) Less(i, j int) bool { return sb[i].message() < sb[j].message() }
5656

57-
type sortByMessageDsc []*Tracker
58-
59-
func (sb sortByMessageDsc) Len() int { return len(sb) }
60-
func (sb sortByMessageDsc) Swap(i, j int) { sb[i], sb[j] = sb[j], sb[i] }
61-
func (sb sortByMessageDsc) Less(i, j int) bool { return sb[i].message() > sb[j].message() }
62-
6357
type sortByPercent []*Tracker
6458

6559
func (sb sortByPercent) Len() int { return len(sb) }
6660
func (sb sortByPercent) Swap(i, j int) { sb[i], sb[j] = sb[j], sb[i] }
67-
func (sb sortByPercent) Less(i, j int) bool { return sb[i].PercentDone() < sb[j].PercentDone() }
68-
69-
type sortByPercentDsc []*Tracker
70-
71-
func (sb sortByPercentDsc) Len() int { return len(sb) }
72-
func (sb sortByPercentDsc) Swap(i, j int) { sb[i], sb[j] = sb[j], sb[i] }
73-
func (sb sortByPercentDsc) Less(i, j int) bool { return sb[i].PercentDone() > sb[j].PercentDone() }
61+
func (sb sortByPercent) Less(i, j int) bool {
62+
if sb[i].PercentDone() == sb[j].PercentDone() {
63+
return sb[i].timeStart.Before(sb[j].timeStart)
64+
}
65+
return sb[i].PercentDone() < sb[j].PercentDone()
66+
}
7467

7568
type sortByValue []*Tracker
7669

7770
func (sb sortByValue) Len() int { return len(sb) }
7871
func (sb sortByValue) Swap(i, j int) { sb[i], sb[j] = sb[j], sb[i] }
79-
func (sb sortByValue) Less(i, j int) bool { return sb[i].value < sb[j].value }
72+
func (sb sortByValue) Less(i, j int) bool {
73+
if sb[i].value == sb[j].value {
74+
return sb[i].timeStart.Before(sb[j].timeStart)
75+
}
76+
return sb[i].value < sb[j].value
77+
}
8078

81-
type sortByValueDsc []*Tracker
79+
type sortDsc struct{ sort.Interface }
8280

83-
func (sb sortByValueDsc) Len() int { return len(sb) }
84-
func (sb sortByValueDsc) Swap(i, j int) { sb[i], sb[j] = sb[j], sb[i] }
85-
func (sb sortByValueDsc) Less(i, j int) bool { return sb[i].value > sb[j].value }
81+
func (sd sortDsc) Less(i, j int) bool { return !sd.Interface.Less(i, j) }

progress/tracker_sort_test.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package progress
22

33
import (
44
"testing"
5+
"time"
56

67
"github.com/stretchr/testify/assert"
78
)
@@ -11,40 +12,48 @@ func TestSortBy(t *testing.T) {
1112
{Message: "Downloading File # 2", Total: 1000, value: 300},
1213
{Message: "Downloading File # 1", Total: 1000, value: 100},
1314
{Message: "Downloading File # 3", Total: 1000, value: 500},
15+
{Message: "Downloading File # 4", Total: 1000, value: 300, timeStart: time.Now()},
1416
}
1517

1618
SortByNone.Sort(trackers)
1719
assert.Equal(t, "Downloading File # 2", trackers[0].Message)
1820
assert.Equal(t, "Downloading File # 1", trackers[1].Message)
1921
assert.Equal(t, "Downloading File # 3", trackers[2].Message)
22+
assert.Equal(t, "Downloading File # 4", trackers[3].Message)
2023

2124
SortByMessage.Sort(trackers)
2225
assert.Equal(t, "Downloading File # 1", trackers[0].Message)
2326
assert.Equal(t, "Downloading File # 2", trackers[1].Message)
2427
assert.Equal(t, "Downloading File # 3", trackers[2].Message)
28+
assert.Equal(t, "Downloading File # 4", trackers[3].Message)
2529

2630
SortByMessageDsc.Sort(trackers)
27-
assert.Equal(t, "Downloading File # 3", trackers[0].Message)
28-
assert.Equal(t, "Downloading File # 2", trackers[1].Message)
29-
assert.Equal(t, "Downloading File # 1", trackers[2].Message)
31+
assert.Equal(t, "Downloading File # 4", trackers[0].Message)
32+
assert.Equal(t, "Downloading File # 3", trackers[1].Message)
33+
assert.Equal(t, "Downloading File # 2", trackers[2].Message)
34+
assert.Equal(t, "Downloading File # 1", trackers[3].Message)
3035

3136
SortByPercent.Sort(trackers)
3237
assert.Equal(t, "Downloading File # 1", trackers[0].Message)
3338
assert.Equal(t, "Downloading File # 2", trackers[1].Message)
34-
assert.Equal(t, "Downloading File # 3", trackers[2].Message)
39+
assert.Equal(t, "Downloading File # 4", trackers[2].Message)
40+
assert.Equal(t, "Downloading File # 3", trackers[3].Message)
3541

3642
SortByPercentDsc.Sort(trackers)
3743
assert.Equal(t, "Downloading File # 3", trackers[0].Message)
38-
assert.Equal(t, "Downloading File # 2", trackers[1].Message)
39-
assert.Equal(t, "Downloading File # 1", trackers[2].Message)
44+
assert.Equal(t, "Downloading File # 4", trackers[1].Message)
45+
assert.Equal(t, "Downloading File # 2", trackers[2].Message)
46+
assert.Equal(t, "Downloading File # 1", trackers[3].Message)
4047

4148
SortByValue.Sort(trackers)
4249
assert.Equal(t, "Downloading File # 1", trackers[0].Message)
4350
assert.Equal(t, "Downloading File # 2", trackers[1].Message)
44-
assert.Equal(t, "Downloading File # 3", trackers[2].Message)
51+
assert.Equal(t, "Downloading File # 4", trackers[2].Message)
52+
assert.Equal(t, "Downloading File # 3", trackers[3].Message)
4553

4654
SortByValueDsc.Sort(trackers)
4755
assert.Equal(t, "Downloading File # 3", trackers[0].Message)
48-
assert.Equal(t, "Downloading File # 2", trackers[1].Message)
49-
assert.Equal(t, "Downloading File # 1", trackers[2].Message)
56+
assert.Equal(t, "Downloading File # 4", trackers[1].Message)
57+
assert.Equal(t, "Downloading File # 2", trackers[2].Message)
58+
assert.Equal(t, "Downloading File # 1", trackers[3].Message)
5059
}

0 commit comments

Comments
 (0)