diff options
Diffstat (limited to 'filters.go')
| -rw-r--r-- | filters.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/filters.go b/filters.go new file mode 100644 index 0000000..bb57599 --- /dev/null +++ b/filters.go @@ -0,0 +1,69 @@ +package main + +import ( + "math/rand" + "reflect" + "time" +) + +// firstN returns the first n items of a slice. +func firstN(n int, items interface{}) interface{} { + v := reflect.ValueOf(items) + if v.Kind() != reflect.Slice { + panic("firstN: not a slice") + } + if v.Len() < n { + return items + } + return v.Slice(0, n).Interface() +} + +// lastN returns the last n items of any slice. +func lastN(n int, items interface{}) interface{} { + v := reflect.ValueOf(items) + if v.Kind() != reflect.Slice { + panic("lastN: not a slice") + } + l := v.Len() + if l < n { + return items + } + return v.Slice(l-n, l).Interface() +} + +// randomN returns n random items of any slice. +func randomN(n int, items interface{}) interface{} { + v := reflect.ValueOf(items) + if v.Kind() != reflect.Slice { + panic("randomN: not a slice") + } + l := v.Len() + if l < n { + return items + } + rand.Seed(time.Now().UnixNano()) + indices := rand.Perm(l)[:n] + result := reflect.MakeSlice(v.Type(), n, n) + for i, idx := range indices { + result.Index(i).Set(v.Index(idx)) + } + return result.Interface() +} + +// filterByType filters pages by their type. +func filterByType(pageType string, pages interface{}) interface{} { + v := reflect.ValueOf(pages) + if v.Kind() != reflect.Slice { + panic("filterByType: not a slice") + } + + var filtered []interface{} + for i := 0; i < v.Len(); i++ { + page := v.Index(i).Interface().(Page) + if page.Type == pageType { + filtered = append(filtered, page) + } + } + return filtered +} + |
