1
0
Fork 0
tallin/internal/counter/counter.go
2026-05-14 11:24:48 +03:00

53 lines
883 B
Go

package counter
import (
"bufio"
"io"
"sort"
)
const maxLineSize = 1024 * 1024
type Result struct {
Name string
Count int
}
func Count(r io.Reader) (map[string]int, error) {
counts := make(map[string]int)
scanner := bufio.NewScanner(r)
scanner.Buffer(make([]byte, 64*1024), maxLineSize)
for scanner.Scan() {
name := scanner.Text()
if name == "" {
continue
}
counts[name]++
}
if err := scanner.Err(); err != nil {
return nil, err
}
return counts, nil
}
func Sorted(counts map[string]int) []Result {
results := make([]Result, 0, len(counts))
for name, count := range counts {
results = append(results, Result{Name: name, Count: count})
}
sort.Slice(results, func(i, j int) bool {
if results[i].Count != results[j].Count {
return results[i].Count > results[j].Count
}
return results[i].Name < results[j].Name
})
return results
}