From 0130404a1dc663d4aa68d780c9bcb23a4243e68d Mon Sep 17 00:00:00 2001 From: Mitja Felicijan Date: Fri, 21 Jun 2024 17:28:03 +0200 Subject: Added additional filters --- filters.go | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 filters.go (limited to 'filters.go') 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 +} + -- cgit v1.2.3