tpl/collections: Add collections.Reverse - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 90d0cdf236b54000bfe444ba3a00236faaa28790
DIR parent 95ef93be667afb480184175a319584fd651abf03
HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date: Mon, 11 Nov 2019 18:14:45 +0100
tpl/collections: Add collections.Reverse
Fixes #6499
Diffstat:
M tpl/collections/collections.go | 23 +++++++++++++++++++++++
M tpl/collections/collections_test.go | 19 +++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
---
DIR diff --git a/tpl/collections/collections.go b/tpl/collections/collections.go
@@ -417,6 +417,29 @@ func (ns *Namespace) Querify(params ...interface{}) (string, error) {
return qs.Encode(), nil
}
+// Reverse creates a copy of slice and reverses it.
+func (ns *Namespace) Reverse(slice interface{}) (interface{}, error) {
+ if slice == nil {
+ return nil, nil
+ }
+ v := reflect.ValueOf(slice)
+
+ switch v.Kind() {
+ case reflect.Slice:
+ default:
+ return nil, errors.New("argument must be a slice")
+ }
+
+ sliceCopy := reflect.MakeSlice(v.Type(), v.Len(), v.Len())
+
+ for i := v.Len() - 1; i >= 0; i-- {
+ element := sliceCopy.Index(i)
+ element.Set(v.Index(v.Len() - 1 - i))
+ }
+
+ return sliceCopy.Interface(), nil
+}
+
// Seq creates a sequence of integers. It's named and used as GNU's seq.
//
// Examples:
DIR diff --git a/tpl/collections/collections_test.go b/tpl/collections/collections_test.go
@@ -211,6 +211,25 @@ func TestDictionary(t *testing.T) {
}
}
+func TestReverse(t *testing.T) {
+ t.Parallel()
+ c := qt.New(t)
+ ns := New(&deps.Deps{})
+
+ s := []string{"a", "b", "c"}
+ reversed, err := ns.Reverse(s)
+ c.Assert(err, qt.IsNil)
+ c.Assert(reversed, qt.DeepEquals, []string{"c", "b", "a"}, qt.Commentf(fmt.Sprint(reversed)))
+ c.Assert(s, qt.DeepEquals, []string{"a", "b", "c"})
+
+ reversed, err = ns.Reverse(nil)
+ c.Assert(err, qt.IsNil)
+ c.Assert(reversed, qt.IsNil)
+ _, err = ns.Reverse(43)
+ c.Assert(err, qt.Not(qt.IsNil))
+
+}
+
func TestEchoParam(t *testing.T) {
t.Parallel()
c := qt.New(t)