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 }