Pad/internal/browser/sort.go
Greg Pomerantz 6a43e3c0db Add e2e test harness for testing editor logic without Gio display
- internal/test/e2e/: FrameCapture, Harness, ElementAssertions, helpers
- internal/editor/logic.go: Add done channel and Done() method for graceful shutdown
- internal/editor/mock_setup.go: Mock filesystem for tests
- internal/browser/: Browser layout and search logic
- internal/io/: Worker pool for async tasks
- Update architecture docs and spec
2026-05-31 08:56:30 -04:00

73 lines
1.9 KiB
Go

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 }
}
}