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  }