From: Bjørn Erik Pedersen Date: Mon, 11 Nov 2019 17:14:45 +0000 (+0100) Subject: tpl/collections: Add collections.Reverse X-Git-Tag: v0.60.0~44 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=90d0cdf236b54000bfe444ba3a00236faaa28790;p=brevno-suite%2Fhugo tpl/collections: Add collections.Reverse Fixes #6499 --- diff --git a/tpl/collections/collections.go b/tpl/collections/collections.go index df8aaa6c..0f0fd7ff 100644 --- 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: diff --git a/tpl/collections/collections_test.go b/tpl/collections/collections_test.go index 8946da80..3830a750 100644 --- 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)