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 }