wp-go/helper/slice/sort.go

63 lines
929 B
Go
Raw Normal View History

2023-01-21 11:31:23 +00:00
package slice
2023-02-28 11:19:24 +00:00
import (
"golang.org/x/exp/constraints"
"sort"
)
const (
ASC = iota
DESC
)
2023-01-21 11:31:23 +00:00
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
}
2023-02-28 11:19:24 +00:00
// Sort fn 中i>j 为降序,反之为升序
2023-01-21 11:31:23 +00:00
func Sort[T any](arr []T, fn func(i, j T) bool) (r []T) {
r = make([]T, len(arr))
copy(r, arr)
2023-01-21 11:31:23 +00:00
slice := anyArr[T]{
data: r,
fn: fn,
}
sort.Sort(slice)
return
}
2023-02-28 11:19:24 +00:00
func Sorts[T constraints.Ordered](a []T, order int) {
slice := anyArr[T]{
data: a,
fn: func(i, j T) bool {
if order == DESC {
return i > j
}
return i < j
},
}
sort.Sort(slice)
}