summaryrefslogtreecommitdiff
path: root/filters.go
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2024-06-21 17:28:03 +0200
committerMitja Felicijan <mitja.felicijan@gmail.com>2024-06-21 17:28:03 +0200
commit0130404a1dc663d4aa68d780c9bcb23a4243e68d (patch)
treed57563d101f6bbf08f9bfd6b3214e311d64d4f22 /filters.go
parent921b7e42fb26e0d9c5b50221eb8c6e5390f51908 (diff)
downloadjbmafp-0130404a1dc663d4aa68d780c9bcb23a4243e68d.tar.gz
Added additional filters
Diffstat (limited to 'filters.go')
-rw-r--r--filters.go69
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
+}
+