shithub: hugo

Download patch

ref: 90d0cdf236b54000bfe444ba3a00236faaa28790
parent: 95ef93be667afb480184175a319584fd651abf03
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Mon Nov 11 13:14:45 EST 2019

tpl/collections: Add collections.Reverse

Fixes #6499

--- a/tpl/collections/collections.go
+++ b/tpl/collections/collections.go
@@ -417,6 +417,29 @@
 	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:
--- a/tpl/collections/collections_test.go
+++ b/tpl/collections/collections_test.go
@@ -211,6 +211,25 @@
 	}
 }
 
+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)