github.com/MontFerret/ferret@v0.18.0/pkg/stdlib/collections/reverse.go (about) 1 package collections 2 3 import ( 4 "context" 5 6 "github.com/MontFerret/ferret/pkg/runtime/values/types" 7 8 "github.com/MontFerret/ferret/pkg/runtime/core" 9 "github.com/MontFerret/ferret/pkg/runtime/values" 10 ) 11 12 // REVERSE returns the reverse of a given string or array value. 13 // @param {String | Any[]} value - The string or array to reverse. 14 // @return {String | Any[]} - A reversed version of a given value. 15 func Reverse(_ context.Context, args ...core.Value) (core.Value, error) { 16 err := core.ValidateArgs(args, 1, 1) 17 18 if err != nil { 19 return values.EmptyString, err 20 } 21 22 err = core.ValidateType(args[0], types.Array, types.String) 23 24 if err != nil { 25 return values.None, err 26 } 27 28 switch col := args[0].(type) { 29 case values.String: 30 runes := []rune(string(col)) 31 size := len(runes) 32 33 // Reverse 34 for i := 0; i < size/2; i++ { 35 runes[i], runes[size-1-i] = runes[size-1-i], runes[i] 36 } 37 38 return values.NewString(string(runes)), nil 39 case *values.Array: 40 size := int(col.Length()) 41 result := values.NewArray(size) 42 43 for i := size - 1; i >= 0; i-- { 44 result.Push(col.Get(values.NewInt(i))) 45 } 46 47 return result, nil 48 49 default: 50 return values.None, nil 51 } 52 }