diff options
| author | Mitja Felicijan <mitja.felicijan@gmail.com> | 2024-06-21 17:28:03 +0200 |
|---|---|---|
| committer | Mitja Felicijan <mitja.felicijan@gmail.com> | 2024-06-21 17:28:03 +0200 |
| commit | 0130404a1dc663d4aa68d780c9bcb23a4243e68d (patch) | |
| tree | d57563d101f6bbf08f9bfd6b3214e311d64d4f22 /filters.go | |
| parent | 921b7e42fb26e0d9c5b50221eb8c6e5390f51908 (diff) | |
| download | jbmafp-0130404a1dc663d4aa68d780c9bcb23a4243e68d.tar.gz | |
Added additional filters
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 +} + |
