package main

import (
	"fmt"
)

type T int16
type Pt struct{ X, Y int }

func main() {
	var a = []int{1, 2, 3}
	// insert 0 at index 1
	a = SliceInsert(a, 1, 0)
	// insert -1 at index 2
	a = SliceInsert(a, 2, -1)
	// [1 0 -1 2 3]
	fmt.Println(a)

	var a1 = []string{"1", "2", "3"}
	a1 = SliceInsert(a1, 1, "0")
	a1 = SliceInsert(a1, 2, "-1")
	fmt.Println(a1)

	var a2 = []Pt{{1, 2}, {3, 4}}
	a2 = SliceInsert(a2, 1, Pt{0, 0})
	a2 = SliceInsert(a2, 2, Pt{-1, -1})
	fmt.Println(a2)
}

// SliceInsert insert value at index in a
func SliceInsert[T any](a []T, index int, value T) []T {
	return append(a[:index], append([]T{value}, a[index:]...)...)
}
