Source File: go-coreutils/sort/main.go

package main

import (
  "fmt"
  "bufio"
  "os"
  "slices"
  "flag"
  "strings"
  "strconv"
)

type Opts struct {
  IgnoreCase bool
  Numeric bool
}

func parse_opts() Opts {
  var opts Opts

  flag.BoolVar(&opts.IgnoreCase, "f", false, "ignore case")
  flag.BoolVar(&opts.Numeric, "n", false, "numeric sort")

  flag.Parse()

  return opts
}

func numeric_sort(a string, b string) int {
  a_int, a_err := strconv.Atoi(a)
  b_int, b_err := strconv.Atoi(b)

  if a_err != nil || b_err != nil {
    return strings.Compare(a, b)
  } else {
    return a_int - b_int
  }
}

func ignore_case_sort(a string, b string) int {
  return strings.Compare(strings.ToLower(a), strings.ToLower(b))
}

func main() {
  lines := make([]string, 0, 100)
  opts := parse_opts()

  scan := bufio.NewScanner(os.Stdin)

  for scan.Scan() {
    line := scan.Text()
    lines = append(lines, line)
  }

  if opts.Numeric {
    slices.SortFunc(lines, numeric_sort)
  } else if opts.IgnoreCase{
    slices.SortFunc(lines, ignore_case_sort)
  } else {
    slices.Sort(lines)
  }

  for _, line := range lines {
    fmt.Println(line)
  }
}