package main

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	inBytes, err := os.ReadFile(os.Args[1])
	if err != nil {
		fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
		os.Exit(1)
	}

	inLines := strings.Split(strings.TrimSpace(string(inBytes)), "\n")
	inInts := make([]int64, len(inLines))

	for i, line := range inLines {
		v, err := strconv.ParseInt(line, 0, 64)
		if err != nil {
			fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
			os.Exit(1)
		}

		inInts[i] = v
	}

	if err := insertionSort(inInts); err != nil {
		fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
		os.Exit(1)
	}

	for _, i := range inInts {
		fmt.Printf("%v\n", i)
	}
}

func insertionSort(inInts []int64) error {
	if len(inInts) < 2 {
		return nil
	}

	for j := 1; j < len(inInts); j += 1 {
		key := inInts[j]
		fmt.Fprintf(os.Stderr, "%+v (save %v from %v)\n", inInts, key, j)

		i := j - 1

		for ; i > -1 && inInts[i] > key; i -= 1 {
			inInts[i+1] = inInts[i]

			fmt.Fprintf(os.Stderr, "%+v (j=%v i=%v)\n", inInts, j, i)
		}

		inInts[i+1] = key
		fmt.Fprintf(os.Stderr, "%+v (insert %v at %v)\n", inInts, key, i+1)
	}

	return nil
}
