github.com/best4tires/kit@v1.0.5/reflex/sort.go (about)

     1  package reflex
     2  
     3  import (
     4  	"sort"
     5  
     6  	"github.com/best4tires/kit/srv"
     7  )
     8  
     9  func sortLess[T any](t1, t2 T, scs srv.SortComponents) bool {
    10  	for _, sc := range scs {
    11  		if sc.Order == srv.SortNone {
    12  			continue
    13  		}
    14  		v1, ok1 := findFieldValue(t1, sc.Name)
    15  		v2, ok2 := findFieldValue(t2, sc.Name)
    16  		switch {
    17  		case !ok1 && !ok2:
    18  			// equal regarding this sort-component
    19  			continue
    20  		case ok1 && !ok2:
    21  			// consider to be less
    22  			return sc.Order.IfLess(true)
    23  		case !ok1 && ok2:
    24  			// consider to be greater
    25  			return sc.Order.IfLess(false)
    26  		default:
    27  			vc := CompareAny(v1, v2)
    28  			switch {
    29  			case vc == 0:
    30  				// equal regarding this sort-component
    31  				continue
    32  			case vc < 0:
    33  				// less
    34  				return sc.Order.IfLess(true)
    35  			default: // > 0
    36  				//greater
    37  				return sc.Order.IfLess(false)
    38  			}
    39  		}
    40  	}
    41  	// all equal
    42  	return false
    43  }
    44  
    45  func Sort[T any](ts []T, scs srv.SortComponents) {
    46  	if len(scs) == 0 {
    47  		return
    48  	}
    49  	sort.SliceStable(ts, func(i, j int) bool {
    50  		return sortLess(ts[i], ts[j], scs)
    51  	})
    52  }