summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/d5/tengo/v2/stdlib/rand.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/d5/tengo/v2/stdlib/rand.go')
-rw-r--r--vendor/github.com/d5/tengo/v2/stdlib/rand.go138
1 files changed, 138 insertions, 0 deletions
diff --git a/vendor/github.com/d5/tengo/v2/stdlib/rand.go b/vendor/github.com/d5/tengo/v2/stdlib/rand.go
new file mode 100644
index 00000000..5d21e1df
--- /dev/null
+++ b/vendor/github.com/d5/tengo/v2/stdlib/rand.go
@@ -0,0 +1,138 @@
+package stdlib
+
+import (
+ "math/rand"
+
+ "github.com/d5/tengo/v2"
+)
+
+var randModule = map[string]tengo.Object{
+ "int": &tengo.UserFunction{
+ Name: "int",
+ Value: FuncARI64(rand.Int63),
+ },
+ "float": &tengo.UserFunction{
+ Name: "float",
+ Value: FuncARF(rand.Float64),
+ },
+ "intn": &tengo.UserFunction{
+ Name: "intn",
+ Value: FuncAI64RI64(rand.Int63n),
+ },
+ "exp_float": &tengo.UserFunction{
+ Name: "exp_float",
+ Value: FuncARF(rand.ExpFloat64),
+ },
+ "norm_float": &tengo.UserFunction{
+ Name: "norm_float",
+ Value: FuncARF(rand.NormFloat64),
+ },
+ "perm": &tengo.UserFunction{
+ Name: "perm",
+ Value: FuncAIRIs(rand.Perm),
+ },
+ "seed": &tengo.UserFunction{
+ Name: "seed",
+ Value: FuncAI64R(rand.Seed),
+ },
+ "read": &tengo.UserFunction{
+ Name: "read",
+ Value: func(args ...tengo.Object) (ret tengo.Object, err error) {
+ if len(args) != 1 {
+ return nil, tengo.ErrWrongNumArguments
+ }
+ y1, ok := args[0].(*tengo.Bytes)
+ if !ok {
+ return nil, tengo.ErrInvalidArgumentType{
+ Name: "first",
+ Expected: "bytes",
+ Found: args[0].TypeName(),
+ }
+ }
+ res, err := rand.Read(y1.Value)
+ if err != nil {
+ ret = wrapError(err)
+ return
+ }
+ return &tengo.Int{Value: int64(res)}, nil
+ },
+ },
+ "rand": &tengo.UserFunction{
+ Name: "rand",
+ Value: func(args ...tengo.Object) (tengo.Object, error) {
+ if len(args) != 1 {
+ return nil, tengo.ErrWrongNumArguments
+ }
+ i1, ok := tengo.ToInt64(args[0])
+ if !ok {
+ return nil, tengo.ErrInvalidArgumentType{
+ Name: "first",
+ Expected: "int(compatible)",
+ Found: args[0].TypeName(),
+ }
+ }
+ src := rand.NewSource(i1)
+ return randRand(rand.New(src)), nil
+ },
+ },
+}
+
+func randRand(r *rand.Rand) *tengo.ImmutableMap {
+ return &tengo.ImmutableMap{
+ Value: map[string]tengo.Object{
+ "int": &tengo.UserFunction{
+ Name: "int",
+ Value: FuncARI64(r.Int63),
+ },
+ "float": &tengo.UserFunction{
+ Name: "float",
+ Value: FuncARF(r.Float64),
+ },
+ "intn": &tengo.UserFunction{
+ Name: "intn",
+ Value: FuncAI64RI64(r.Int63n),
+ },
+ "exp_float": &tengo.UserFunction{
+ Name: "exp_float",
+ Value: FuncARF(r.ExpFloat64),
+ },
+ "norm_float": &tengo.UserFunction{
+ Name: "norm_float",
+ Value: FuncARF(r.NormFloat64),
+ },
+ "perm": &tengo.UserFunction{
+ Name: "perm",
+ Value: FuncAIRIs(r.Perm),
+ },
+ "seed": &tengo.UserFunction{
+ Name: "seed",
+ Value: FuncAI64R(r.Seed),
+ },
+ "read": &tengo.UserFunction{
+ Name: "read",
+ Value: func(args ...tengo.Object) (
+ ret tengo.Object,
+ err error,
+ ) {
+ if len(args) != 1 {
+ return nil, tengo.ErrWrongNumArguments
+ }
+ y1, ok := args[0].(*tengo.Bytes)
+ if !ok {
+ return nil, tengo.ErrInvalidArgumentType{
+ Name: "first",
+ Expected: "bytes",
+ Found: args[0].TypeName(),
+ }
+ }
+ res, err := r.Read(y1.Value)
+ if err != nil {
+ ret = wrapError(err)
+ return
+ }
+ return &tengo.Int{Value: int64(res)}, nil
+ },
+ },
+ },
+ }
+}