- 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
73 lines
1.9 KiB
Go
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 }
|
|
}
|
|
}
|
|
|