summaryrefslogtreecommitdiff
path: root/filters.go
diff options
context:
space:
mode:
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
+}
+