diff options
author | Ian Ray <iiian.develops@gmail.com> | 2023-07-07 07:01:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-07 10:01:53 -0400 |
commit | 6f20438ae42b2c27a5dc3da91b64298b63e3910f (patch) | |
tree | c954106b4d1a393d82a32b4b67588314d02836dc /dive/filetree/order_strategy.go | |
parent | d5e8a9296882f113e3990daca5e6b16109f512b8 (diff) |
feat: add support for alternative ordering strategies (#424)
Diffstat (limited to 'dive/filetree/order_strategy.go')
-rw-r--r-- | dive/filetree/order_strategy.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/dive/filetree/order_strategy.go b/dive/filetree/order_strategy.go new file mode 100644 index 0000000..1838dd8 --- /dev/null +++ b/dive/filetree/order_strategy.go @@ -0,0 +1,61 @@ +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 +} |