NodeSortComparator returns a comparator function for sorting tree nodes based on the given sort order and case sensitivity. sortOrder must be one of: "mixed", "filesFirst", "foldersFirst".
(sortOrder string, caseSensitive bool)
| 75 | // based on the given sort order and case sensitivity. |
| 76 | // sortOrder must be one of: "mixed", "filesFirst", "foldersFirst". |
| 77 | func NodeSortComparator[T any](sortOrder string, caseSensitive bool) func(a, b *Node[T]) int { |
| 78 | strCmp := strings.Compare |
| 79 | if !caseSensitive { |
| 80 | strCmp = func(a, b string) int { |
| 81 | return strings.Compare(strings.ToLower(a), strings.ToLower(b)) |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | // dirVsFileOrder is the return value when a is a directory and b is a file. |
| 86 | // -1 means directories come first, 1 means files come first. |
| 87 | dirVsFileOrder := 0 |
| 88 | switch sortOrder { |
| 89 | case "foldersFirst": |
| 90 | dirVsFileOrder = -1 |
| 91 | case "filesFirst": |
| 92 | dirVsFileOrder = 1 |
| 93 | } |
| 94 | |
| 95 | if dirVsFileOrder != 0 { |
| 96 | return func(a, b *Node[T]) int { |
| 97 | aIsDir := !a.IsFile() |
| 98 | bIsDir := !b.IsFile() |
| 99 | if aIsDir != bIsDir { |
| 100 | if aIsDir { |
| 101 | return dirVsFileOrder |
| 102 | } |
| 103 | return -dirVsFileOrder |
| 104 | } |
| 105 | return strCmp(a.path, b.path) |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | // "mixed": sort by path only |
| 110 | return func(a, b *Node[T]) int { |
| 111 | return strCmp(a.path, b.path) |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | func (self *Node[T]) ForEachFile(cb func(*T) error) error { |
| 116 | if self.IsFile() { |