mirror of
https://github.com/miguelmota/cointop
synced 2024-11-14 18:12:57 +00:00
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package table
|
|
|
|
// Row row
|
|
type Row struct {
|
|
table *Table
|
|
values []interface{}
|
|
strValues []string
|
|
}
|
|
|
|
// Rows rows
|
|
type Rows []*Row
|
|
|
|
// Len count
|
|
func (r Rows) Len() int {
|
|
return len(r)
|
|
}
|
|
|
|
// Swap swap rows
|
|
func (r Rows) Swap(i, j int) {
|
|
r[i], r[j] = r[j], r[i]
|
|
}
|
|
|
|
// Less less
|
|
func (r Rows) Less(i, j int) bool {
|
|
sortOrder := r[i].table.sort
|
|
var k int
|
|
for k = 0; k < len(sortOrder)-1; k++ {
|
|
s := sortOrder[k]
|
|
if s.order == SortDesc {
|
|
if gt(r[i].values[s.index], r[j].values[s.index], s.sortFn) {
|
|
return true
|
|
}
|
|
if gt(r[j].values[s.index], r[i].values[s.index], s.sortFn) {
|
|
return false
|
|
}
|
|
} else {
|
|
if lt(r[i].values[s.index], r[j].values[s.index], s.sortFn) {
|
|
return true
|
|
}
|
|
if lt(r[j].values[s.index], r[i].values[s.index], s.sortFn) {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
s := sortOrder[k]
|
|
if s.order == SortDesc {
|
|
return gt(r[i].values[s.index], r[j].values[s.index], s.sortFn)
|
|
}
|
|
return lt(r[i].values[s.index], r[j].values[s.index], s.sortFn)
|
|
}
|
|
|
|
func gt(a interface{}, b interface{}, fn SortFn) bool {
|
|
return lt(b, a, fn)
|
|
}
|
|
|
|
func lt(a interface{}, b interface{}, fn SortFn) bool {
|
|
if fn != nil {
|
|
return fn(a, b)
|
|
}
|
|
switch a.(type) {
|
|
case int:
|
|
return a.(int) < b.(int)
|
|
case string:
|
|
return a.(string) < b.(string)
|
|
}
|
|
return false
|
|
}
|