tpl/collections: Add collections.Reverse
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 11 Nov 2019 17:14:45 +0000 (18:14 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 11 Nov 2019 17:33:22 +0000 (18:33 +0100)
Fixes #6499

tpl/collections/collections.go
tpl/collections/collections_test.go

index df8aaa6c7dbd54070e302d52b461548a7f6a2108..0f0fd7ffb645c5b13a3b5846b10dc7e42b835cdc 100644 (file)
@@ -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:
index 8946da80506b1a70a4c5fbd4aed115e7030a5feb..3830a750553a5f02b51be65dbc7067b73cb5d3fe 100644 (file)
@@ -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)