summaryrefslogtreecommitdiffstats
path: root/dive/filetree/order_strategy.go
diff options
context:
space:
mode:
authorIan Ray <iiian.develops@gmail.com>2023-07-07 07:01:53 -0700
committerGitHub <noreply@github.com>2023-07-07 10:01:53 -0400
commit6f20438ae42b2c27a5dc3da91b64298b63e3910f (patch)
treec954106b4d1a393d82a32b4b67588314d02836dc /dive/filetree/order_strategy.go
parentd5e8a9296882f113e3990daca5e6b16109f512b8 (diff)
feat: add support for alternative ordering strategies (#424)
Diffstat (limited to 'dive/filetree/order_strategy.go')
-rw-r--r--dive/filetree/order_strategy.go61
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
+}