package slice

import "sort"

type anyArr[T any] struct {
	data []T
	fn   func(i, j T) bool
}

func (r anyArr[T]) Len() int {
	return len(r.data)
}

func (r anyArr[T]) Swap(i, j int) {
	r.data[i], r.data[j] = r.data[j], r.data[i]
}

func (r anyArr[T]) Less(i, j int) bool {
	return r.fn(r.data[i], r.data[j])
}

func SortSelf[T any](arr []T, fn func(i, j T) bool) {
	slice := anyArr[T]{
		data: arr,
		fn:   fn,
	}
	sort.Sort(slice)
	return
}

func Sort[T any](arr []T, fn func(i, j T) bool) (r []T) {
	r = make([]T, 0, len(arr))
	for _, t := range arr {
		r = append(r, t)
	}
	slice := anyArr[T]{
		data: r,
		fn:   fn,
	}
	sort.Sort(slice)
	return
}
