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  }