blob: 5d4301a7e88a6d9bd71a8019c42a0a6f77a035ba [file] [log] [blame]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package gsort provides primitives for sorting slices of any type.
package gsort
import (
"sort"
"constraints"
)
// orderedSlice is a slice of values of some ordered type.
type orderedSlice[Elem constraints.Ordered] []Elem
// orderedSlice implements sort.Interface.
func (s orderedSlice[Elem]) Len() int { return len(s) }
func (s orderedSlice[Elem]) Less(i, j int) bool {
if s[i] < s[j] {
return true
}
isNaN := func(f Elem) bool { return f != f }
if isNaN(s[i]) && !isNaN(s[j]) {
return true
}
return false
}
func (s orderedSlice[Elem]) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// OrderedSlice sorts a slice of any ordered type in ascending order.
func OrderedSlice[Elem constraints.Ordered](s []Elem) {
sort.Sort(orderedSlice[Elem](s))
}
// sliceFn implements sort.Interface for a slice of any type with an
// explicit less-than function.
type sliceFn[Elem any] struct {
s []Elem
less func(Elem, Elem) bool
}
func (s sliceFn[Elem]) Len() int { return len(s.s) }
func (s sliceFn[Elem]) Less(i, j int) bool { return s.less(s.s[i], s.s[j]) }
func (s sliceFn[Elem]) Swap(i, j int) { s.s[i], s.s[j] = s.s[j], s.s[i] }
// SliceFn sorts a slice of any type according to a less-than function.
func SliceFn[Elem any](s []Elem, less func(Elem, Elem) bool) {
sort.Sort(sliceFn[Elem]{s, less})
}