package value
import (
)
func ( []reflect.Value) []reflect.Value {
if len() == 0 {
return
}
sort.SliceStable(, func(, int) bool { return isLess([], []) })
:= [:1]
for , := range [1:] {
if isLess([len()-1], ) {
= append(, )
}
}
return
}
func (, reflect.Value) bool {
switch .Type().Kind() {
case reflect.Bool:
return !.Bool() && .Bool()
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return .Int() < .Int()
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return .Uint() < .Uint()
case reflect.Float32, reflect.Float64:
, := .Float(), .Float()
return < || math.IsNaN() && !math.IsNaN()
case reflect.Complex64, reflect.Complex128:
, := .Complex(), .Complex()
, , , := real(), imag(), real(), imag()
if == || (math.IsNaN() && math.IsNaN()) {
return < || math.IsNaN() && !math.IsNaN()
}
return < || math.IsNaN() && !math.IsNaN()
case reflect.Ptr, reflect.UnsafePointer, reflect.Chan:
return .Pointer() < .Pointer()
case reflect.String:
return .String() < .String()
case reflect.Array:
for := 0; < .Len(); ++ {
if (.Index(), .Index()) {
return true
}
if (.Index(), .Index()) {
return false
}
}
return false
case reflect.Struct:
for := 0; < .NumField(); ++ {
if (.Field(), .Field()) {
return true
}
if (.Field(), .Field()) {
return false
}
}
return false
case reflect.Interface:
, := .Elem(), .Elem()
if !.IsValid() || !.IsValid() {
return !.IsValid() && .IsValid()
}
, := .Type(), .Type()
if == {
return (.Elem(), .Elem())
}
if .Kind() != .Kind() {
return .Kind() < .Kind()
}
if .String() != .String() {
return .String() < .String()
}
if .PkgPath() != .PkgPath() {
return .PkgPath() < .PkgPath()
}
return reflect.ValueOf(.Type()).Pointer() < reflect.ValueOf(.Type()).Pointer()
default:
panic(fmt.Sprintf("%T is not comparable", .Type()))
}
}