package browser import ( "sort" "strings" ) // SortMode defines how entries should be sorted. type SortMode int const ( SortModeNameAsc SortMode = iota // Name ascending (A-Z) SortModeNameDesc // Name descending (Z-A) SortModeDateAsc // Date ascending (oldest first) SortModeDateDesc // Date descending (newest first) // Total sort modes: 4 ) // sortEntries sorts entries in-place according to the given SortMode. // Directories and files are interleaved naturally. Case-insensitive // comparison is used for name-based sorting. Equal keys are broken // by name (ascending). func sortEntries(entries []Entry, mode SortMode) { if len(entries) <= 1 { return } cmp := comparator(mode) sort.SliceStable(entries, func(i, j int) bool { return cmp(entries[i], entries[j]) < 0 }) } // comparator returns a comparison function for the given SortMode. // Returns negative if a < b, zero if equal, positive if a > b. func comparator(mode SortMode) func(a, b Entry) int { switch mode { case SortModeNameAsc: return func(a, b Entry) int { if c := strings.Compare(strings.ToLower(a.Name), strings.ToLower(b.Name)); c != 0 { return c } return strings.Compare(a.Name, b.Name) } case SortModeNameDesc: return func(a, b Entry) int { if c := strings.Compare(strings.ToLower(b.Name), strings.ToLower(a.Name)); c != 0 { return c } return strings.Compare(b.Name, a.Name) } case SortModeDateAsc: return func(a, b Entry) int { if c := a.ModTime.Compare(b.ModTime); c != 0 { return c } return strings.Compare(strings.ToLower(a.Name), strings.ToLower(b.Name)) } case SortModeDateDesc: return func(a, b Entry) int { if c := b.ModTime.Compare(a.ModTime); c != 0 { return c } return strings.Compare(strings.ToLower(a.Name), strings.ToLower(b.Name)) } default: // Invalid mode: no-op (preserve order) return func(a, b Entry) int { return 0 } } }