b4ae1981d6
This adds generic sort / sortRev functions for use in gmnhg templates which use sort.Sort to sort anything that implements sort.Interface (which includes lists of posts). The existing sortPosts function that used to sort posts in reverse order becomes an alias to sortRev for backwards compatibility.
36 lines
821 B
Go
36 lines
821 B
Go
package gmnhg
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
)
|
|
|
|
func sortWhatever(sortable interface{}, reverse bool) interface{} {
|
|
// convert slices to their sort.Interface counterparts
|
|
switch s := sortable.(type) {
|
|
case []int:
|
|
sortable = sort.IntSlice(s)
|
|
case []float64:
|
|
sortable = sort.Float64Slice(s)
|
|
case []string:
|
|
sortable = sort.StringSlice(s)
|
|
}
|
|
v := reflect.ValueOf(sortable)
|
|
cpy := reflect.MakeSlice(v.Type(), v.Len(), v.Cap())
|
|
reflect.Copy(cpy, v)
|
|
cpyAsInterface := v.Interface()
|
|
if !reverse {
|
|
sort.Sort(cpyAsInterface.(sort.Interface))
|
|
} else {
|
|
sort.Sort(sort.Reverse(cpyAsInterface.(sort.Interface)))
|
|
}
|
|
return cpyAsInterface
|
|
}
|
|
|
|
func Sort(sortable interface{}) interface{} {
|
|
return sortWhatever(sortable, false)
|
|
}
|
|
|
|
func SortRev(sortable interface{}) interface{} {
|
|
return sortWhatever(sortable, true)
|
|
}
|