dive/dive/filetree/order_strategy.go

62 lines
1 KiB
Go

package filetree
import (
"sort"
)
type SortOrder int
const (
ByName = iota
BySizeDesc
NumSortOrderConventions
)
type OrderStrategy interface {
orderKeys(files map[string]*FileNode) []string
}
func GetSortOrderStrategy(sortOrder SortOrder) OrderStrategy {
switch sortOrder {
case ByName:
return orderByNameStrategy{}
case BySizeDesc:
return orderBySizeDescStrategy{}
}
return orderByNameStrategy{}
}
type orderByNameStrategy struct{}
func (orderByNameStrategy) orderKeys(files map[string]*FileNode) []string {
var keys []string
for key := range files {
keys = append(keys, key)
}
sort.Strings(keys)
return keys
}
type orderBySizeDescStrategy struct{}
func (orderBySizeDescStrategy) orderKeys(files map[string]*FileNode) []string {
var keys []string
for key := range files {
keys = append(keys, key)
}
sort.Slice(keys, func(i, j int) bool {
ki, kj := keys[i], keys[j]
ni, nj := files[ki], files[kj]
if ni.GetSize() == nj.GetSize() {
return ki < kj
}
return ni.GetSize() > nj.GetSize()
})
return keys
}