github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xsort/xsort.go (about) 1 package xsort 2 3 import ( 4 "reflect" 5 "sort" 6 ) 7 8 type Lesser interface { 9 Less(other interface{}) bool 10 } 11 12 type Interface struct { 13 swapper func(x, y int) 14 lesser func(x, y int) bool 15 value reflect.Value 16 } 17 18 func NewInterface(value interface{}) (v *Interface) { 19 v = &Interface{ 20 value: reflect.ValueOf(value), 21 swapper: reflect.Swapper(value), 22 } 23 return 24 } 25 26 func (i *Interface) Len() int { 27 return i.value.Len() 28 } 29 30 func (i *Interface) Less(x, y int) bool { 31 if i.lesser == nil { 32 a := i.value.Index(x).Interface().(Lesser) 33 b := i.value.Index(y).Interface() 34 return a.Less(b) 35 } else { 36 return i.lesser(x, y) 37 } 38 } 39 40 func (i *Interface) Swap(x, y int) { 41 i.swapper(x, y) 42 } 43 44 func Sort(v interface{}) { 45 sort.Sort(NewInterface(v)) 46 } 47 48 func SortFunc(v interface{}, less func(x, y int) bool) { 49 value := NewInterface(v) 50 value.lesser = less 51 sort.Sort(value) 52 }