From 742c4385220e510a108b776d36af3c8570fdbc1d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 22 Feb 2023 23:56:44 +0100 Subject: [PATCH 001/506] Fix builtins checks for nil args --- builtin/builtin.go | 15 +++++++++++---- checker/checker_test.go | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 4ea819a7f..ad9376962 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -34,7 +34,7 @@ var Builtins = map[int]*Function{ if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for len (expected 1, got %d)", len(args)) } - switch args[0].Kind() { + switch kind(args[0]) { case reflect.Array, reflect.Map, reflect.Slice, reflect.String, reflect.Interface: return integerType, nil } @@ -48,7 +48,7 @@ var Builtins = map[int]*Function{ if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for abs (expected 1, got %d)", len(args)) } - switch args[0].Kind() { + switch kind(args[0]) { case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: return args[0], nil } @@ -62,7 +62,7 @@ var Builtins = map[int]*Function{ if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for int (expected 1, got %d)", len(args)) } - switch args[0].Kind() { + switch kind(args[0]) { case reflect.Interface: return integerType, nil case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: @@ -80,7 +80,7 @@ var Builtins = map[int]*Function{ if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for float (expected 1, got %d)", len(args)) } - switch args[0].Kind() { + switch kind(args[0]) { case reflect.Interface: return floatType, nil case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: @@ -92,3 +92,10 @@ var Builtins = map[int]*Function{ }, }, } + +func kind(t reflect.Type) reflect.Kind { + if t == nil { + return reflect.Invalid + } + return t.Kind() +} diff --git a/checker/checker_test.go b/checker/checker_test.go index ba612a4c4..eba6a1f81 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -875,3 +875,21 @@ func TestCheck_Function_without_types(t *testing.T) { require.NotNil(t, tree.Node.(*ast.CallNode).Func) require.Equal(t, "add", tree.Node.(*ast.CallNode).Func.Name) } + +func TestCheck_dont_panic_on_nil_arguments_for_builtins(t *testing.T) { + tests := []string{ + "len(nil)", + "abs(nil)", + "int(nil)", + "float(nil)", + } + for _, test := range tests { + t.Run(test, func(t *testing.T) { + tree, err := parser.Parse(test) + require.NoError(t, err) + + _, err = checker.Check(tree, conf.New(nil)) + require.Error(t, err) + }) + } +} From 5613693f083dab319c8a98b62d7d35acd6880c94 Mon Sep 17 00:00:00 2001 From: blotus Date: Thu, 9 Mar 2023 13:48:26 +0100 Subject: [PATCH 002/506] runtime.Fetch: add string type assertion check before trying to check if the value is a method (#349) --- expr_test.go | 26 ++++++++++++++++++++++++++ vm/runtime/runtime.go | 8 +++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/expr_test.go b/expr_test.go index b80010fd5..a62e330e3 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1613,6 +1613,32 @@ func TestIssue271(t *testing.T) { require.Equal(t, 1.0, output) } +type Issue346Array []Issue346Type + +type Issue346Type struct { + Bar string +} + +func (i Issue346Array) Len() int { + return len(i) +} + +func TestIssue346(t *testing.T) { + code := `Foo[0].Bar` + + env := map[string]interface{}{ + "Foo": Issue346Array{ + {Bar: "bar"}, + }, + } + program, err := expr.Compile(code, expr.Env(env)) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, "bar", output) +} + func TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) { code := `{"value": "ok"}[vars.key]` env := map[string]interface{}{ diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 154a319fb..93ead17bf 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -18,9 +18,11 @@ func Fetch(from, i interface{}) interface{} { // Methods can be defined on any type. if v.NumMethod() > 0 { - method := v.MethodByName(i.(string)) - if method.IsValid() { - return method.Interface() + if methodName, ok := i.(string); ok { + method := v.MethodByName(methodName) + if method.IsValid() { + return method.Interface() + } } } From df2cccd267636baa18c7e19468ffa59c61222c9f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 9 Mar 2023 23:49:13 +0100 Subject: [PATCH 003/506] Fix nil key check in map (#351) --- checker/checker.go | 2 +- expr_test.go | 39 +++++++++++++++++++++++++++++++++++++++ vm/runtime/runtime.go | 20 +++++++++++++++----- 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 76e3d0be8..5ce9b31fa 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -417,7 +417,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { return anyType, info{} case reflect.Map: - if !prop.AssignableTo(base.Key()) && !isAny(prop) { + if prop != nil && !prop.AssignableTo(base.Key()) && !isAny(prop) { return v.error(node.Property, "cannot use %v to get an element from %v", prop, base) } t, c := deref(base.Elem()) diff --git a/expr_test.go b/expr_test.go index a62e330e3..0549dfe72 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1772,6 +1772,45 @@ func TestRun_NilCoalescingOperator(t *testing.T) { }) } +func TestEval_nil_in_maps(t *testing.T) { + env := map[string]interface{}{ + "m": map[interface{}]interface{}{nil: "bar"}, + "empty": map[interface{}]interface{}{}, + } + t.Run("nil key exists", func(t *testing.T) { + p, err := expr.Compile(`m[nil]`, expr.Env(env)) + assert.NoError(t, err) + + out, err := expr.Run(p, env) + assert.NoError(t, err) + assert.Equal(t, "bar", out) + }) + t.Run("no nil key", func(t *testing.T) { + p, err := expr.Compile(`empty[nil]`, expr.Env(env)) + assert.NoError(t, err) + + out, err := expr.Run(p, env) + assert.NoError(t, err) + assert.Equal(t, nil, out) + }) + t.Run("nil in m", func(t *testing.T) { + p, err := expr.Compile(`nil in m`, expr.Env(env)) + assert.NoError(t, err) + + out, err := expr.Run(p, env) + assert.NoError(t, err) + assert.Equal(t, true, out) + }) + t.Run("nil in empty", func(t *testing.T) { + p, err := expr.Compile(`nil in empty`, expr.Env(env)) + assert.NoError(t, err) + + out, err := expr.Run(p, env) + assert.NoError(t, err) + assert.Equal(t, false, out) + }) +} + // Mock types type mockEnv struct { diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 93ead17bf..b2eeb65d8 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -48,7 +48,12 @@ func Fetch(from, i interface{}) interface{} { } case reflect.Map: - value := v.MapIndex(reflect.ValueOf(i)) + var value reflect.Value + if i == nil { + value = v.MapIndex(reflect.Zero(v.Type().Key())) + } else { + value = v.MapIndex(reflect.ValueOf(i)) + } if value.IsValid() { return value.Interface() } else { @@ -221,11 +226,16 @@ func In(needle interface{}, array interface{}) bool { return false case reflect.Map: - n := reflect.ValueOf(needle) - if !n.IsValid() { - panic(fmt.Sprintf("cannot use %T as index to %T", needle, array)) + var value reflect.Value + if needle == nil { + value = v.MapIndex(reflect.Zero(v.Type().Key())) + } else { + n := reflect.ValueOf(needle) + if !n.IsValid() { + panic(fmt.Sprintf("cannot use %T as index to %T", needle, array)) + } + value = v.MapIndex(n) } - value := v.MapIndex(n) if value.IsValid() { return true } From e10a35d3dffdbd6ec83ca65b2f76d6a12ab373b8 Mon Sep 17 00:00:00 2001 From: hesining <37295940+hesining@users.noreply.github.com> Date: Sat, 11 Mar 2023 04:08:40 +0800 Subject: [PATCH 004/506] Add Wrap and Unwrap method to hold self error (#352) --- expr_test.go | 2 +- file/error.go | 11 +++++++++++ vm/vm.go | 3 +++ vm/vm_test.go | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/expr_test.go b/expr_test.go index 0549dfe72..cfe594a71 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1348,7 +1348,7 @@ func TestCompile_exposed_error(t *testing.T) { b, err := json.Marshal(err) require.NoError(t, err) - require.Equal(t, `{"Line":1,"Column":2,"Message":"invalid operation: == (mismatched types int and bool)","Snippet":"\n | 1 == true\n | ..^"}`, string(b)) + require.Equal(t, `{"Line":1,"Column":2,"Message":"invalid operation: == (mismatched types int and bool)","Snippet":"\n | 1 == true\n | ..^","Prev":null}`, string(b)) } func TestCompile_deref(t *testing.T) { diff --git a/file/error.go b/file/error.go index b7af3e6e2..1e7e81b94 100644 --- a/file/error.go +++ b/file/error.go @@ -10,6 +10,7 @@ type Error struct { Location Message string Snippet string + Prev error } func (e *Error) Error() string { @@ -44,6 +45,16 @@ func (e *Error) Bind(source *Source) *Error { return e } + +func (e *Error) Unwrap() error { + return e.Prev +} + +func (e *Error) Wrap(err error) { + e.Prev = err +} + + func (e *Error) format() string { if e.Location.Empty() { return e.Message diff --git a/vm/vm.go b/vm/vm.go index 46f7628f2..af4fc5bf7 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -61,6 +61,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) Location: program.Locations[vm.ip-1], Message: fmt.Sprintf("%v", r), } + if err, ok := r.(error); ok { + f.Wrap(err) + } err = f.Bind(program.Source) } }() diff --git a/vm/vm_test.go b/vm/vm_test.go index 0fc291bc2..6e32d4713 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -274,6 +274,10 @@ func TestRun_MethodWithError(t *testing.T) { out, err := vm.Run(program, env) require.EqualError(t, err, "error (1:1)\n | WillError(\"yes\")\n | ^") require.Equal(t, nil, out) + + selfErr := errors.Unwrap(err) + require.NotNil(t, err) + require.Equal(t, "error", selfErr.Error()) } func TestRun_FastMethods(t *testing.T) { From cf1f46a3959954f3d6c80161b2584ebbb5216b42 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 20 Mar 2023 21:13:35 +0100 Subject: [PATCH 005/506] Add todo --- ast/node.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ast/node.go b/ast/node.go index 018c95658..adb5ddee0 100644 --- a/ast/node.go +++ b/ast/node.go @@ -102,12 +102,14 @@ type ChainNode struct { type MemberNode struct { base - Node Node - Property Node - Name string - Optional bool - Deref bool - FieldIndex []int + Node Node + Property Node + Name string + Optional bool + Deref bool + FieldIndex []int + + // TODO: Replace with a single MethodIndex field of &int type. Method bool MethodIndex int } From 68aa5698b7c1a5b61990bf3ee49c3e58363a3a3e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 20 Mar 2023 21:15:52 +0100 Subject: [PATCH 006/506] Add comment --- ast/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ast/node.go b/ast/node.go index adb5ddee0..e85f853e9 100644 --- a/ast/node.go +++ b/ast/node.go @@ -104,7 +104,7 @@ type MemberNode struct { base Node Node Property Node - Name string + Name string // Name of the filed or method. Used for error reporting. Optional bool Deref bool FieldIndex []int From 1a1138d22ab8eca39eb0286dd63299d0ce57a4c6 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 20 Mar 2023 21:20:13 +0100 Subject: [PATCH 007/506] Fix method calls for interfaces --- checker/checker.go | 10 +++++++--- expr_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 5ce9b31fa..06371c62e 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -393,15 +393,19 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { // First, check methods defined on base type itself, // independent of which type it is. Without dereferencing. if m, ok := base.MethodByName(name.Value); ok { - node.Method = true - node.MethodIndex = m.Index - node.Name = name.Value if base.Kind() == reflect.Interface { // In case of interface type method will not have a receiver, // and to prevent checker decreasing numbers of in arguments // return method type as not method (second argument is false). + + // Also, we can not use m.Index here, because it will be + // different indexes for different types which implement + // the same interface. return m.Type, info{} } else { + node.Method = true + node.MethodIndex = m.Index + node.Name = name.Value return m.Type, info{method: true} } } diff --git a/expr_test.go b/expr_test.go index cfe594a71..6246c844b 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1811,6 +1811,48 @@ func TestEval_nil_in_maps(t *testing.T) { }) } +type Bar interface { + Bar() int +} +type Foo interface { + Foo() Bar +} + +type FooImpl struct{} + +func (f FooImpl) Foo() Bar { + return BarImpl{} +} + +type BarImpl struct{} + +// Aba is a special method that is not part of the Bar interface, +// but is used to test that the correct method is called. "Aba" name +// is chosen to be before "Bar" in the alphabet. +func (b BarImpl) Aba() bool { + return true +} + +func (b BarImpl) Bar() int { + return 42 +} + +func TestEval_interface_method(t *testing.T) { + require.True(t, BarImpl{}.Aba()) + require.True(t, BarImpl{}.Bar() == 42) + + env := map[string]interface{}{ + "var": FooImpl{}, + } + p, err := expr.Compile(`var.Foo().Bar()`, expr.Env(env)) + + assert.NoError(t, err) + + out, err := expr.Run(p, env) + assert.NoError(t, err) + assert.Equal(t, 42, out) +} + // Mock types type mockEnv struct { From b3fb3b93ee204bf4df5e8c7abe9dcedfd3a157a8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 21 Mar 2023 11:43:04 +0100 Subject: [PATCH 008/506] Beautify program disassemble --- vm/program.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/vm/program.go b/vm/program.go index 7a417903c..d424df14f 100644 --- a/vm/program.go +++ b/vm/program.go @@ -1,9 +1,12 @@ package vm import ( + "bytes" "fmt" + "reflect" "regexp" "strings" + "text/tabwriter" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/builtin" @@ -22,7 +25,8 @@ type Program struct { } func (program *Program) Disassemble() string { - out := "" + var buf bytes.Buffer + w := tabwriter.NewWriter(&buf, 0, 0, 2, ' ', 0) ip := 0 for ip < len(program.Bytecode) { pp := ip @@ -31,16 +35,16 @@ func (program *Program) Disassemble() string { ip += 1 code := func(label string) { - out += fmt.Sprintf("%v\t%v\n", pp, label) + _, _ = fmt.Fprintf(w, "%v\t%v\n", pp, label) } jump := func(label string) { - out += fmt.Sprintf("%v\t%v\t%v\t(%v)\n", pp, label, arg, ip+arg) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t(%v)\n", pp, label, arg, ip+arg) } jumpBack := func(label string) { - out += fmt.Sprintf("%v\t%v\t%v\t(%v)\n", pp, label, arg, ip-arg) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t(%v)\n", pp, label, arg, ip-arg) } argument := func(label string) { - out += fmt.Sprintf("%v\t%v\t%v\n", pp, label, arg) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\n", pp, label, arg) } constant := func(label string) { var c interface{} @@ -58,14 +62,14 @@ func (program *Program) Disassemble() string { if method, ok := c.(*runtime.Method); ok { c = fmt.Sprintf("{%v %v}", method.Name, method.Index) } - out += fmt.Sprintf("%v\t%v\t%v\t%v\n", pp, label, arg, c) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, c) } builtIn := func(label string) { f, ok := builtin.Builtins[arg] if !ok { panic(fmt.Sprintf("unknown builtin %v", arg)) } - out += fmt.Sprintf("%v\t%v\t%v\n", pp, "OpBuiltin", f.Name) + _, _ = fmt.Fprintf(w, "%v\t%v\t%v\n", pp, "OpBuiltin", f.Name) } switch op { @@ -223,7 +227,8 @@ func (program *Program) Disassemble() string { argument("OpCallFast") case OpCallTyped: - argument("OpCallTyped") + signature := reflect.TypeOf(FuncTypes[arg]).Elem().String() + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, "OpCallTyped", arg, signature) case OpBuiltin: builtIn("OpBuiltin") @@ -265,8 +270,9 @@ func (program *Program) Disassemble() string { code("OpEnd") default: - out += fmt.Sprintf("%v\t%#x\n", ip, op) + _, _ = fmt.Fprintf(w, "%v\t%#x\n", ip, op) } } - return out + _ = w.Flush() + return buf.String() } From fb81647d3bd538f924726bbf48e339d68e4599dd Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 21 Mar 2023 12:03:36 +0100 Subject: [PATCH 009/506] Fix param type overwriting in type propagation logic --- checker/checker.go | 2 +- checker/checker_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/checker/checker.go b/checker/checker.go index 06371c62e..00025a33c 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -639,7 +639,7 @@ func (v *visitor) checkFunc(name string, fn reflect.Type, method bool, node *ast in = fn.In(i + fnInOffset) } - if isIntegerOrArithmeticOperation(arg) { + if isIntegerOrArithmeticOperation(arg) && (isInteger(in) || isFloat(in)) { t = in setTypeForIntegers(arg, t) } diff --git a/checker/checker_test.go b/checker/checker_test.go index eba6a1f81..f62b6d580 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -484,6 +484,11 @@ cannot use int to get an element from map[string]interface {} (1:10) invalid operation: + (mismatched types int and string) (1:13) | 1 /* one */ + "2" | ............^ + +FuncTyped(42) +cannot use int as argument (type string) to call FuncTyped (1:11) + | FuncTyped(42) + | ..........^ ` func TestCheck_error(t *testing.T) { @@ -893,3 +898,38 @@ func TestCheck_dont_panic_on_nil_arguments_for_builtins(t *testing.T) { }) } } + +func TestCheck_do_not_override_params_for_functions(t *testing.T) { + env := map[string]interface{}{ + "foo": func(p string) string { + return "foo" + }, + } + config := conf.New(env) + expr.Function( + "bar", + func(p ...interface{}) (interface{}, error) { + return p[0].(string), nil + }, + new(func(string) string), + )(config) + config.Check() + + t.Run("func from env", func(t *testing.T) { + tree, err := parser.Parse("foo(1)") + require.NoError(t, err) + + _, err = checker.Check(tree, config) + require.Error(t, err) + require.Contains(t, err.Error(), "cannot use int as argument") + }) + + t.Run("func from function", func(t *testing.T) { + tree, err := parser.Parse("bar(1)") + require.NoError(t, err) + + _, err = checker.Check(tree, config) + require.Error(t, err) + require.Contains(t, err.Error(), "cannot use int as argument") + }) +} From 0886a6af70395e70d8c11dcfc66f73fa489c2f51 Mon Sep 17 00:00:00 2001 From: Schneizel <744587537@qq.com> Date: Tue, 18 Apr 2023 20:09:01 +0800 Subject: [PATCH 010/506] remove duplicate codes (#356) --- expr.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/expr.go b/expr.go index 14f6af285..6aa674fb5 100644 --- a/expr.go +++ b/expr.go @@ -151,15 +151,10 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { _, _ = checker.Check(tree, config) ast.Walk(&tree.Node, v) } - _, err = checker.Check(tree, config) - if err != nil { - return nil, err - } - } else { - _, err = checker.Check(tree, config) - if err != nil { - return nil, err - } + } + _, err = checker.Check(tree, config) + if err != nil { + return nil, err } if config.Optimize { From c71396e70b9454b6cfcc958ed0f374aed2856fb4 Mon Sep 17 00:00:00 2001 From: Pranav Peshwe Date: Wed, 19 Apr 2023 16:27:56 +0530 Subject: [PATCH 011/506] Fixed a compilation error - there is not member named timestamp. Added some formatting for better looks. (#355) --- docs/Getting-Started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Getting-Started.md b/docs/Getting-Started.md index de42cdb4c..04dd015a5 100644 --- a/docs/Getting-Started.md +++ b/docs/Getting-Started.md @@ -82,7 +82,7 @@ type Message struct { } func main() { - code := `map(filter(messages, len(.Text) > 0), .Text + Format(.timestamp))` + code := `map(filter(messages, len(.Text) > 0), Format(.Date) + '\t' + .Text + '\n')` // We can use an empty instance of the struct as an environment. program, err := expr.Compile(code, expr.Env(Env{})) From cb1f3459dd4705b6cbaf43069925d5e2c782fd6b Mon Sep 17 00:00:00 2001 From: mdmcconnell <113192632+mdmcconnell@users.noreply.github.com> Date: Tue, 9 May 2023 19:32:42 +0100 Subject: [PATCH 012/506] Update Visitor-and-Patch.md (#369) Stringer example fixed. --- docs/Visitor-and-Patch.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/Visitor-and-Patch.md b/docs/Visitor-and-Patch.md index 419a60eee..f98418b05 100644 --- a/docs/Visitor-and-Patch.md +++ b/docs/Visitor-and-Patch.md @@ -91,8 +91,8 @@ func (p *patcher) Visit(node *ast.Node) { } ``` -Type information is also available. Here is an example, there all `fmt.Stringer` -interface automatically converted to `string` type. +Type information is also available. In the following example, any struct +implementing the `fmt.Stringer` interface is automatically converted to `string` type. ```go func main() { @@ -136,6 +136,7 @@ func (p *stringerPatcher) Visit(node *ast.Node) { Callee: &ast.MemberNode{ Node: *node, Field: "String", + Property: &ast.StringNode{Value: "String"}, }, }) } From d41c4943fb39a2d9a0b2e532895251af0e2bc179 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 6 Jul 2023 12:11:39 +0200 Subject: [PATCH 013/506] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 242431f2c..705fa21cb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +Webpod - deploy JavaScript apps + # Expr [![test](https://github.com/antonmedv/expr/actions/workflows/test.yml/badge.svg)](https://github.com/antonmedv/expr/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/antonmedv/expr)](https://goreportcard.com/report/github.com/antonmedv/expr) From 3c23d10fd78b0cfb86f8bcf66bd2ad9485d2074f Mon Sep 17 00:00:00 2001 From: mdmcconnell <113192632+mdmcconnell@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:01:19 +0100 Subject: [PATCH 014/506] env[] keyword implemented in parser (#382) --- checker/checker.go | 12 +++++- compiler/compiler.go | 4 ++ conf/types_table.go | 14 +++++-- expr_test.go | 97 ++++++++++++++++++++++++++++++++++++++++++++ vm/opcodes.go | 1 + vm/vm.go | 2 + 6 files changed, 125 insertions(+), 5 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 00025a33c..a4e5e6d45 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -383,8 +383,18 @@ func (v *visitor) ChainNode(node *ast.ChainNode) (reflect.Type, info) { } func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { - base, _ := v.visit(node.Node) prop, _ := v.visit(node.Property) + if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "env" { + // If the index is a constant string, can save some + // cycles later by finding the type of its referent + if name, ok := node.Property.(*ast.StringNode); ok { + if t, ok := v.config.Types[name.Value]; ok { + return t.Type, info{method: t.Method} + } // No error if no type found; it may be added to env between compile and run + } + return anyType, info{} + } + base, _ := v.visit(node.Node) if name, ok := node.Property.(*ast.StringNode); ok { if base == nil { diff --git a/compiler/compiler.go b/compiler/compiler.go index 3cd32af0f..423dd6217 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -205,6 +205,10 @@ func (c *compiler) NilNode(_ *ast.NilNode) { } func (c *compiler) IdentifierNode(node *ast.IdentifierNode) { + if node.Value == "env" { + c.emit(OpLoadEnv) + return + } if c.mapEnv { c.emit(OpLoadFast, c.addConstant(node.Value)) } else if len(node.FieldIndex) > 0 { diff --git a/conf/types_table.go b/conf/types_table.go index e917f5fa8..f4d401c9c 100644 --- a/conf/types_table.go +++ b/conf/types_table.go @@ -54,6 +54,9 @@ func CreateTypesTable(i interface{}) TypesTable { for _, key := range v.MapKeys() { value := v.MapIndex(key) if key.Kind() == reflect.String && value.IsValid() && value.CanInterface() { + if key.String() == "env" { // Could check for all keywords here + panic("attempt to misuse env keyword as env map key") + } types[key.String()] = Tag{Type: reflect.TypeOf(value.Interface())} } } @@ -94,10 +97,13 @@ func FieldsFromStruct(t reflect.Type) TypesTable { } } } - - types[FieldName(f)] = Tag{ - Type: f.Type, - FieldIndex: f.Index, + if fn := FieldName(f); fn == "env" { // Could check for all keywords here + panic("attempt to misuse env keyword as env struct field tag") + } else { + types[FieldName(f)] = Tag{ + Type: f.Type, + FieldIndex: f.Index, + } } } } diff --git a/expr_test.go b/expr_test.go index 6246c844b..14cbf7415 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1811,6 +1811,103 @@ func TestEval_nil_in_maps(t *testing.T) { }) } +// Test the use of env keyword. Forms env[] and env[”] are valid. +// The enclosed identifier must be in the expression env. +func TestEnv_keyword(t *testing.T) { + env := map[string]interface{}{ + "space test": "ok", + "space_test": "not ok", // Seems to be some underscore substituting happening, check that. + "Section 1-2a": "ok", + `c:\ndrive\2015 Information Table`: "ok", + "%*worst function name ever!!": func() string { + return "ok" + }(), + "1": "o", + "2": "k", + "num": 10, + "mylist": []int{1, 2, 3, 4, 5}, + "MIN": func(a, b int) int { + if a < b { + return a + } else { + return b + } + }, + "red": "n", + "irect": "um", + "String Map": map[string]string{ + "one": "two", + "three": "four", + }, + "OtherMap": map[string]string{ + "a": "b", + "c": "d", + }, + } + + // No error cases + var tests = []struct { + code string + want interface{} + }{ + {"env['space test']", "ok"}, + {"env['Section 1-2a']", "ok"}, + {`env["c:\\ndrive\\2015 Information Table"]`, "ok"}, + {"env['%*worst function name ever!!']", "ok"}, + {"env['String Map'].one", "two"}, + {"env['1'] + env['2']", "ok"}, + {"1 + env['num'] + env['num']", 21}, + {"MIN(env['num'],0)", 0}, + {"env['nu' + 'm']", 10}, + {"env[red + irect]", 10}, + {"env['String Map']?.five", ""}, + {"env.red", "n"}, + {"env?.blue", nil}, + {"env.mylist[1]", 2}, + {"env?.OtherMap?.a", "b"}, + {"env?.OtherMap?.d", ""}, + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + + program, err := expr.Compile(tt.code, expr.Env(env)) + require.NoError(t, err, "compile error") + + got, err := expr.Run(program, env) + require.NoError(t, err, "execution error") + + assert.Equal(t, tt.want, got, tt.code) + }) + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + got, err := expr.Eval(tt.code, env) + require.NoError(t, err, "eval error: "+tt.code) + + assert.Equal(t, tt.want, got, "eval: "+tt.code) + }) + } + + // error cases + tests = []struct { + code string + want interface{} + }{ + {"env()", "bad"}, + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + _, err := expr.Eval(tt.code, expr.Env(env)) + require.Error(t, err, "compile error") + + }) + } + +} + type Bar interface { Bar() int } diff --git a/vm/opcodes.go b/vm/opcodes.go index b3117e73c..63b9f8a30 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -11,6 +11,7 @@ const ( OpLoadFast OpLoadMethod OpLoadFunc + OpLoadEnv OpFetch OpFetchField OpMethod diff --git a/vm/vm.go b/vm/vm.go index af4fc5bf7..3e5411b1f 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -123,6 +123,8 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) a := vm.pop() vm.push(runtime.FetchField(a, program.Constants[arg].(*runtime.Field))) + case OpLoadEnv: + vm.push(env) case OpMethod: a := vm.pop() vm.push(runtime.FetchMethod(a, program.Constants[arg].(*runtime.Method))) From d3fee6e695813fc1f82b55eb7922a9dfcecd36cc Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 19 Jul 2023 17:09:45 +0400 Subject: [PATCH 015/506] Fix OpLoadEnv disassemble --- vm/program.go | 5 ++++- vm/program_test.go | 2 +- vm/vm.go | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/vm/program.go b/vm/program.go index d424df14f..57d7140eb 100644 --- a/vm/program.go +++ b/vm/program.go @@ -97,6 +97,9 @@ func (program *Program) Disassemble() string { case OpLoadFunc: argument("OpLoadFunc") + case OpLoadEnv: + code("OpLoadEnv") + case OpFetch: code("OpFetch") @@ -270,7 +273,7 @@ func (program *Program) Disassemble() string { code("OpEnd") default: - _, _ = fmt.Fprintf(w, "%v\t%#x\n", ip, op) + _, _ = fmt.Fprintf(w, "%v\t%#x (unknown)\n", ip, op) } } _ = w.Flush() diff --git a/vm/program_test.go b/vm/program_test.go index b7bb4f226..06e83b18c 100644 --- a/vm/program_test.go +++ b/vm/program_test.go @@ -15,7 +15,7 @@ func TestProgram_Disassemble(t *testing.T) { Arguments: []int{1}, } d := program.Disassemble() - if strings.Contains(d, "\t0x") { + if strings.Contains(d, "(unknown)") { t.Errorf("cannot disassemble all opcodes") } } diff --git a/vm/vm.go b/vm/vm.go index 3e5411b1f..b2b2e619e 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -125,6 +125,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpLoadEnv: vm.push(env) + case OpMethod: a := vm.pop() vm.push(runtime.FetchMethod(a, program.Constants[arg].(*runtime.Method))) From 38b27f3162bd7c083dd59d5f563f87805ed7dabb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 19 Jul 2023 17:16:46 +0400 Subject: [PATCH 016/506] Code style --- file/error.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/file/error.go b/file/error.go index 1e7e81b94..edf202b04 100644 --- a/file/error.go +++ b/file/error.go @@ -10,7 +10,7 @@ type Error struct { Location Message string Snippet string - Prev error + Prev error } func (e *Error) Error() string { @@ -45,7 +45,6 @@ func (e *Error) Bind(source *Source) *Error { return e } - func (e *Error) Unwrap() error { return e.Prev } @@ -54,7 +53,6 @@ func (e *Error) Wrap(err error) { e.Prev = err } - func (e *Error) format() string { if e.Location.Empty() { return e.Message From d2100ece96affe6766d97e2cf0e4ca4d145f0d30 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 19 Jul 2023 17:19:59 +0400 Subject: [PATCH 017/506] Add OpInvalid --- vm/opcodes.go | 3 ++- vm/program.go | 3 +++ vm/vm.go | 3 +++ vm/vm_test.go | 12 ++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/vm/opcodes.go b/vm/opcodes.go index 63b9f8a30..4bc9abf4d 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -3,7 +3,8 @@ package vm type Opcode byte const ( - OpPush Opcode = iota + OpInvalid Opcode = iota + OpPush OpPushInt OpPop OpLoadConst diff --git a/vm/program.go b/vm/program.go index 57d7140eb..936eca9a2 100644 --- a/vm/program.go +++ b/vm/program.go @@ -73,6 +73,9 @@ func (program *Program) Disassemble() string { } switch op { + case OpInvalid: + code("OpInvalid") + case OpPush: constant("OpPush") diff --git a/vm/vm.go b/vm/vm.go index b2b2e619e..ec22c251d 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -93,6 +93,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) switch op { + case OpInvalid: + panic("invalid opcode") + case OpPush: vm.push(program.Constants[arg]) diff --git a/vm/vm_test.go b/vm/vm_test.go index 6e32d4713..a5f24c29a 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -11,6 +11,7 @@ import ( "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/compiler" "github.com/antonmedv/expr/conf" + "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/parser" "github.com/antonmedv/expr/vm" "github.com/stretchr/testify/require" @@ -380,3 +381,14 @@ func TestRun_TaggedFieldName(t *testing.T) { require.Equal(t, "hello world", out) } + +func TestRun_OpInvalid(t *testing.T) { + program := &vm.Program{ + Locations: []file.Location{{0, 0}}, + Bytecode: []vm.Opcode{vm.OpInvalid}, + Arguments: []int{0}, + } + + _, err := vm.Run(program, nil) + require.EqualError(t, err, "invalid opcode") +} From 0dd3702b814ce12b5bd15f0bedba78dcba7d6080 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 10 Aug 2023 22:09:32 +0200 Subject: [PATCH 018/506] Refactor deref (#398) * Refactor deref types * Refactor deref opcode inserts * Add multiple pointers deref --- ast/node.go | 4 +- checker/checker.go | 26 +++---- checker/types.go | 12 ++-- compiler/compiler.go | 72 ++++++++++++++------ compiler/compiler_test.go | 20 ++++++ expr_test.go | 48 +------------ test/deref/deref_test.go | 139 ++++++++++++++++++++++++++++++++++++++ vm/runtime/runtime.go | 4 +- 8 files changed, 232 insertions(+), 93 deletions(-) create mode 100644 test/deref/deref_test.go diff --git a/ast/node.go b/ast/node.go index e85f853e9..5bdcb75ed 100644 --- a/ast/node.go +++ b/ast/node.go @@ -50,7 +50,6 @@ type NilNode struct { type IdentifierNode struct { base Value string - Deref bool FieldIndex []int Method bool // true if method, false if field MethodIndex int // index of method, set only if Method is true @@ -106,10 +105,9 @@ type MemberNode struct { Property Node Name string // Name of the filed or method. Used for error reporting. Optional bool - Deref bool FieldIndex []int - // TODO: Replace with a single MethodIndex field of &int type. + // TODO: Combine Method and MethodIndex into a single MethodIndex field of &int type. Method bool MethodIndex int } diff --git a/checker/checker.go b/checker/checker.go index a4e5e6d45..86d6d6c6a 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -135,18 +135,14 @@ func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) // when the arguments are known in CallNode. return anyType, info{fn: fn} } - if v.config.Types == nil { - node.Deref = true - } else if t, ok := v.config.Types[node.Value]; ok { + if t, ok := v.config.Types[node.Value]; ok { if t.Ambiguous { return v.error(node, "ambiguous identifier %v", node.Value) } - d, c := deref(t.Type) - node.Deref = c node.Method = t.Method node.MethodIndex = t.MethodIndex node.FieldIndex = t.FieldIndex - return d, info{method: t.Method} + return t.Type, info{method: t.Method} } if v.config.Strict { return v.error(node, "unknown name %v", node.Value) @@ -180,6 +176,8 @@ func (v *visitor) ConstantNode(node *ast.ConstantNode) (reflect.Type, info) { func (v *visitor) UnaryNode(node *ast.UnaryNode) (reflect.Type, info) { t, _ := v.visit(node.Node) + t = deref(t) + switch node.Operator { case "!", "not": @@ -209,6 +207,9 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { l, _ := v.visit(node.Left) r, _ := v.visit(node.Right) + l = deref(l) + r = deref(r) + // check operator overloading if fns, ok := v.config.Operators[node.Operator]; ok { t, _, ok := conf.FindSuitableOperatorOverload(fns, v.config.Types, l, r) @@ -427,34 +428,27 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { switch base.Kind() { case reflect.Interface: - node.Deref = true return anyType, info{} case reflect.Map: if prop != nil && !prop.AssignableTo(base.Key()) && !isAny(prop) { return v.error(node.Property, "cannot use %v to get an element from %v", prop, base) } - t, c := deref(base.Elem()) - node.Deref = c - return t, info{} + return base.Elem(), info{} case reflect.Array, reflect.Slice: if !isInteger(prop) && !isAny(prop) { return v.error(node.Property, "array elements can only be selected using an integer (got %v)", prop) } - t, c := deref(base.Elem()) - node.Deref = c - return t, info{} + return base.Elem(), info{} case reflect.Struct: if name, ok := node.Property.(*ast.StringNode); ok { propertyName := name.Value if field, ok := fetchField(base, propertyName); ok { - t, c := deref(field.Type) - node.Deref = c node.FieldIndex = field.Index node.Name = propertyName - return t, info{} + return field.Type, info{} } if len(v.parents) > 1 { if _, ok := v.parents[len(v.parents)-2].(*ast.CallNode); ok { diff --git a/checker/types.go b/checker/types.go index 7ccd89480..e8f53372c 100644 --- a/checker/types.go +++ b/checker/types.go @@ -204,25 +204,23 @@ func fetchField(t reflect.Type, name string) (reflect.StructField, bool) { return reflect.StructField{}, false } -func deref(t reflect.Type) (reflect.Type, bool) { +func deref(t reflect.Type) reflect.Type { if t == nil { - return nil, false + return nil } if t.Kind() == reflect.Interface { - return t, true + return t } - found := false for t != nil && t.Kind() == reflect.Ptr { e := t.Elem() switch e.Kind() { case reflect.Struct, reflect.Map, reflect.Array, reflect.Slice: - return t, false + return t default: - found = true t = e } } - return t, found + return t } func isIntegerOrArithmeticOperation(node ast.Node) bool { diff --git a/compiler/compiler.go b/compiler/compiler.go index 423dd6217..4b2f94603 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -224,11 +224,6 @@ func (c *compiler) IdentifierNode(node *ast.IdentifierNode) { } else { c.emit(OpLoadConst, c.addConstant(node.Value)) } - if node.Deref { - c.emit(OpDeref) - } else if node.Type() == nil { - c.emit(OpDeref) - } } func (c *compiler) IntegerNode(node *ast.IntegerNode) { @@ -289,6 +284,7 @@ func (c *compiler) ConstantNode(node *ast.ConstantNode) { func (c *compiler) UnaryNode(node *ast.UnaryNode) { c.compile(node.Node) + c.derefInNeeded(node.Node) switch node.Operator { @@ -313,7 +309,9 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { switch node.Operator { case "==": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Left) if l == r && l == reflect.Int { c.emit(OpEqualInt) @@ -325,114 +323,155 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { case "!=": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Left) c.emit(OpEqual) c.emit(OpNot) case "or", "||": c.compile(node.Left) + c.derefInNeeded(node.Left) end := c.emit(OpJumpIfTrue, placeholder) c.emit(OpPop) c.compile(node.Right) + c.derefInNeeded(node.Right) c.patchJump(end) case "and", "&&": c.compile(node.Left) + c.derefInNeeded(node.Left) end := c.emit(OpJumpIfFalse, placeholder) c.emit(OpPop) c.compile(node.Right) + c.derefInNeeded(node.Right) c.patchJump(end) case "<": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpLess) case ">": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpMore) case "<=": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpLessOrEqual) case ">=": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpMoreOrEqual) case "+": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpAdd) case "-": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpSubtract) case "*": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpMultiply) case "/": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpDivide) case "%": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpModulo) case "**", "^": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpExponent) case "in": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpIn) case "matches": if node.Regexp != nil { c.compile(node.Left) + c.derefInNeeded(node.Left) c.emit(OpMatchesConst, c.addConstant(node.Regexp)) } else { c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpMatches) } case "contains": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpContains) case "startsWith": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpStartsWith) case "endsWith": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpEndsWith) case "..": c.compile(node.Left) + c.derefInNeeded(node.Left) c.compile(node.Right) + c.derefInNeeded(node.Right) c.emit(OpRange) case "??": c.compile(node.Left) + c.derefInNeeded(node.Left) end := c.emit(OpJumpIfNotNil, placeholder) c.emit(OpPop) c.compile(node.Right) + c.derefInNeeded(node.Right) c.patchJump(end) default: @@ -461,7 +500,6 @@ func (c *compiler) MemberNode(node *ast.MemberNode) { return } op := OpFetch - original := node index := node.FieldIndex path := []string{node.Name} base := node.Node @@ -470,21 +508,15 @@ func (c *compiler) MemberNode(node *ast.MemberNode) { for !node.Optional { ident, ok := base.(*ast.IdentifierNode) if ok && len(ident.FieldIndex) > 0 { - if ident.Deref { - panic("IdentifierNode should not be dereferenced") - } index = append(ident.FieldIndex, index...) path = append([]string{ident.Value}, path...) c.emitLocation(ident.Location(), OpLoadField, c.addConstant( &runtime.Field{Index: index, Path: path}, )) - goto deref + return } member, ok := base.(*ast.MemberNode) if ok && len(member.FieldIndex) > 0 { - if member.Deref { - panic("MemberNode should not be dereferenced") - } index = append(member.FieldIndex, index...) path = append([]string{member.Name}, path...) node = member @@ -509,13 +541,6 @@ func (c *compiler) MemberNode(node *ast.MemberNode) { &runtime.Field{Index: index, Path: path}, )) } - -deref: - if original.Deref { - c.emit(OpDeref) - } else if original.Type() == nil { - c.emit(OpDeref) - } } func (c *compiler) SliceNode(node *ast.SliceNode) { @@ -734,6 +759,13 @@ func (c *compiler) PairNode(node *ast.PairNode) { c.compile(node.Value) } +func (c *compiler) derefInNeeded(node ast.Node) { + switch kind(node) { + case reflect.Ptr, reflect.Interface: + c.emit(OpDeref) + } +} + func kind(node ast.Node) reflect.Kind { t := node.Type() if t == nil { diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 81da17316..d5293913c 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -27,6 +27,7 @@ type Env struct { _ byte B B Map map[string]B + Ptr *int } } @@ -249,6 +250,25 @@ func TestCompile(t *testing.T) { Arguments: []int{0, 2, 0, 1}, }, }, + { + `A.Ptr + 1`, + vm.Program{ + Constants: []interface{}{ + &runtime.Field{ + Index: []int{0, 3}, + Path: []string{"A", "Ptr"}, + }, + 1, + }, + Bytecode: []vm.Opcode{ + vm.OpLoadField, + vm.OpDeref, + vm.OpPush, + vm.OpAdd, + }, + Arguments: []int{0, 0, 1, 0}, + }, + }, } for _, test := range tests { diff --git a/expr_test.go b/expr_test.go index 14cbf7415..3cda97fef 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1351,50 +1351,6 @@ func TestCompile_exposed_error(t *testing.T) { require.Equal(t, `{"Line":1,"Column":2,"Message":"invalid operation: == (mismatched types int and bool)","Snippet":"\n | 1 == true\n | ..^","Prev":null}`, string(b)) } -func TestCompile_deref(t *testing.T) { - i := 1 - env := map[string]interface{}{ - "i": &i, - "map": map[string]interface{}{ - "i": &i, - }, - } - { - // With specified env, OpDeref added and == works as expected. - program, err := expr.Compile(`i == 1 && map.i == 1`, expr.Env(env)) - require.NoError(t, err) - - env["any"] = &i - out, err := expr.Run(program, env) - require.NoError(t, err) - require.Equal(t, true, out) - } - { - // Compile without expr.Env() also works as expected, - // and should add OpDeref automatically. - program, err := expr.Compile(`i == 1 && map.i == 1`) - require.NoError(t, err) - - out, err := expr.Run(program, env) - require.NoError(t, err) - require.Equal(t, true, out) - } -} - -func TestEval_deref(t *testing.T) { - i := 1 - env := map[string]interface{}{ - "i": &i, - "map": map[string]interface{}{ - "i": &i, - }, - } - - out, err := expr.Eval(`i == 1 && map.i == 1`, env) - require.NoError(t, err) - require.Equal(t, true, out) -} - func TestAsBool_exposed_error(t *testing.T) { _, err := expr.Compile(`42`, expr.AsBool()) require.Error(t, err) @@ -1519,10 +1475,10 @@ func TestIssue154(t *testing.T) { for _, input := range tests { program, err := expr.Compile(input, expr.Env(env)) - assert.NoError(t, err, input) + require.NoError(t, err, input) output, err := expr.Run(program, env) - assert.NoError(t, err) + require.NoError(t, err) assert.True(t, output.(bool), input) } } diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go new file mode 100644 index 000000000..761e779f2 --- /dev/null +++ b/test/deref/deref_test.go @@ -0,0 +1,139 @@ +package deref_test + +import ( + "context" + "testing" + + "github.com/antonmedv/expr" + "github.com/stretchr/testify/require" +) + +func TestDeref_binary(t *testing.T) { + i := 1 + env := map[string]interface{}{ + "i": &i, + "map": map[string]interface{}{ + "i": &i, + }, + } + t.Run("==", func(t *testing.T) { + program, err := expr.Compile(`i == 1 && map.i == 1`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, out) + }) + t.Run("><", func(t *testing.T) { + program, err := expr.Compile(`i > 0 && map.i < 99`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, out) + }) + t.Run("??+", func(t *testing.T) { + program, err := expr.Compile(`(i ?? map.i) + 1`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 2, out) + }) +} + +func TestDeref_unary(t *testing.T) { + i := 1 + ok := true + env := map[string]interface{}{ + "i": &i, + "map": map[string]interface{}{ + "ok": &ok, + }, + } + + program, err := expr.Compile(`-i < 0 && !!map.ok`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, out) +} + +func TestDeref_eval(t *testing.T) { + i := 1 + env := map[string]interface{}{ + "i": &i, + "map": map[string]interface{}{ + "i": &i, + }, + } + out, err := expr.Eval(`i == 1 && map.i == 1`, env) + require.NoError(t, err) + require.Equal(t, true, out) +} + +func TestDeref_emptyCtx(t *testing.T) { + program, err := expr.Compile(`ctx`) + require.NoError(t, err) + + output, err := expr.Run(program, map[string]interface{}{ + "ctx": context.Background(), + }) + require.NoError(t, err) + require.Implements(t, new(context.Context), output) +} + +func TestDeref_emptyCtx_Eval(t *testing.T) { + output, err := expr.Eval(`ctx`, map[string]interface{}{ + "ctx": context.Background(), + }) + require.NoError(t, err) + require.Implements(t, new(context.Context), output) +} + +func TestDeref_context_WithValue(t *testing.T) { + program, err := expr.Compile(`ctxWithValue`) + require.NoError(t, err) + + output, err := expr.Run(program, map[string]interface{}{ + "ctxWithValue": context.WithValue(context.Background(), "value", "test"), + }) + require.NoError(t, err) + require.Implements(t, new(context.Context), output) +} + +func TestDeref_method_on_int_pointer(t *testing.T) { + output, err := expr.Eval(`foo.Bar()`, map[string]interface{}{ + "foo": new(foo), + }) + require.NoError(t, err) + require.Equal(t, 42, output) +} + +type foo int + +func (f *foo) Bar() int { + return 42 +} + +func TestDeref_multiple_pointers(t *testing.T) { + a := 42 + b := &a + c := &b + t.Run("returned as is", func(t *testing.T) { + output, err := expr.Eval(`c`, map[string]interface{}{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, c, output) + require.IsType(t, (**int)(nil), output) + }) + t.Run("+ works", func(t *testing.T) { + output, err := expr.Eval(`c+2`, map[string]interface{}{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, 44, output) + }) +} diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index b2eeb65d8..75ac94bf8 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -153,13 +153,15 @@ func Deref(i interface{}) interface{} { v = v.Elem() } - if v.Kind() == reflect.Ptr { +loop: + for v.Kind() == reflect.Ptr { if v.IsNil() { return i } indirect := reflect.Indirect(v) switch indirect.Kind() { case reflect.Struct, reflect.Map, reflect.Array, reflect.Slice: + break loop default: v = v.Elem() } From 6f8e24d3edb1f56ef3f9970f7c3b47fb6d89b6e0 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 10 Aug 2023 22:11:05 +0200 Subject: [PATCH 019/506] Add go 1.20 & 1.21 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7352f0d64..0d781a35b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-versions: [ '1.13', '1.14', '1.15', '1.16' , '1.17', '1.18', '1.19' ] + go-versions: [ '1.13', '1.14', '1.15', '1.16' , '1.17', '1.18', '1.19', '1.20', '1.21' ] steps: - uses: actions/checkout@v2 - name: Setup Go ${{ matrix.go-version }} From edcab828e4a953553500ca5a662791f9cfc3dd4f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 10 Aug 2023 22:41:20 +0200 Subject: [PATCH 020/506] Add repl --- repl/go.mod | 10 ++++++++++ repl/go.sum | 24 ++++++++++++++++++++++++ repl/repl.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 repl/go.mod create mode 100644 repl/go.sum create mode 100644 repl/repl.go diff --git a/repl/go.mod b/repl/go.mod new file mode 100644 index 000000000..6b0cd27e6 --- /dev/null +++ b/repl/go.mod @@ -0,0 +1,10 @@ +module github.com/antonmedv/expr/repl + +go 1.20 + +require ( + github.com/antonmedv/expr v1.12.7 + github.com/chzyer/readline v1.5.1 +) + +require golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 // indirect diff --git a/repl/go.sum b/repl/go.sum new file mode 100644 index 000000000..03c9b71af --- /dev/null +++ b/repl/go.sum @@ -0,0 +1,24 @@ +github.com/antonmedv/expr v1.12.7 h1:jfV/l/+dHWAadLwAtESXNxXdfbK9bE4+FNMHYCMntwk= +github.com/antonmedv/expr v1.12.7/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/repl/repl.go b/repl/repl.go new file mode 100644 index 000000000..280df9108 --- /dev/null +++ b/repl/repl.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + + "github.com/antonmedv/expr" + "github.com/chzyer/readline" +) + +func main() { + rl, err := readline.New("> ") + if err != nil { + panic(err) + } + defer rl.Close() + + for { + line, err := rl.Readline() + if err != nil { // io.EOF when Ctrl-D is pressed + break + } + + if line == "exit" { + break + } + + result := evaluate(line) + fmt.Println(result) + } +} + +func evaluate(input string) string { + result, err := expr.Eval(input, nil) + if err != nil { + return err.Error() + } + return fmt.Sprintf("%v", result) +} From c31c46786baee7f897ef985a735045e3b75ff329 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 00:24:23 +0200 Subject: [PATCH 021/506] Upgrade deps --- repl/go.mod | 2 +- repl/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/repl/go.mod b/repl/go.mod index 6b0cd27e6..544f97299 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -7,4 +7,4 @@ require ( github.com/chzyer/readline v1.5.1 ) -require golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 // indirect +require golang.org/x/sys v0.11.0 // indirect diff --git a/repl/go.sum b/repl/go.sum index 03c9b71af..12275609b 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -18,6 +18,8 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From c83a35c94a7f352e9689f30e0f3c75ce5ce0d134 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 00:25:05 +0200 Subject: [PATCH 022/506] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 705fa21cb..242431f2c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -Webpod - deploy JavaScript apps - # Expr [![test](https://github.com/antonmedv/expr/actions/workflows/test.yml/badge.svg)](https://github.com/antonmedv/expr/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/antonmedv/expr)](https://goreportcard.com/report/github.com/antonmedv/expr) From e646a93d2c6bb3c777fc62bd52ded0c66cfaa911 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 00:29:59 +0200 Subject: [PATCH 023/506] Add env info --- docs/Language-Definition.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 3dc947e0b..45514cc54 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -259,3 +259,11 @@ Braces `{` `}` can be omitted: ```expr filter(Tweets, len(.Value) > 280) ``` + +## `env` variable + +The `env` variable is a map of all variables passed to the expression. + +```expr +Foo.Name == env['Foo'].Name +``` From b32455f84c56fe5823b7e0f8e247ba492e021159 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 08:49:26 +0200 Subject: [PATCH 024/506] gofmt --- parser/lexer/utils.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parser/lexer/utils.go b/parser/lexer/utils.go index 72e3cf20c..a0ea87e28 100644 --- a/parser/lexer/utils.go +++ b/parser/lexer/utils.go @@ -63,10 +63,10 @@ func unescape(value string) (string, error) { // unescapeChar takes a string input and returns the following info: // -// value - the escaped unicode rune at the front of the string. -// multibyte - whether the rune value might require multiple bytes to represent. -// tail - the remainder of the input string. -// err - error value, if the character could not be unescaped. +// value - the escaped unicode rune at the front of the string. +// multibyte - whether the rune value might require multiple bytes to represent. +// tail - the remainder of the input string. +// err - error value, if the character could not be unescaped. // // When multibyte is true the return value may still fit within a single byte, // but a multibyte conversion is attempted which is more expensive than when the From 8404831a352e677125f2f96d088c810281a19a48 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 13:47:04 +0200 Subject: [PATCH 025/506] Update docs --- docs/Configuration.md | 67 ++++++++++++ docs/Getting-Started.md | 218 ++++++++++++++++++++-------------------- 2 files changed, 174 insertions(+), 111 deletions(-) create mode 100644 docs/Configuration.md diff --git a/docs/Configuration.md b/docs/Configuration.md new file mode 100644 index 000000000..153fc0df0 --- /dev/null +++ b/docs/Configuration.md @@ -0,0 +1,67 @@ +# Configuration + +Expr can be configured to do more things. For example, with [AllowUndefinedVariables](https://pkg.go.dev/github.com/antonmedv/expr#AllowUndefinedVariables) or [AsBool](https://pkg.go.dev/github.com/antonmedv/expr#AsBool) to expect the boolean result from the expression. + +```go +program, err := expr.Compile(code, expr.Env(Env{}), expr.AllowUndefinedVariables(), expr.AsBool()) +``` + +## Functions + +Expr supports any Go functions. For example, you can use `fmt.Sprintf` or methods of your structs. +Also, Expr supports functions configured via [`expr.Function(name, fn[, ...types])`](https://pkg.go.dev/github.com/antonmedv/expr#Function) option. + +```go + atoi := expr.Function( + "atoi", + func(params ...any) (any, error) { + return strconv.Atoi(params[0].(string)) + }, + ) + + program, err := expr.Compile(`atoi("42")`, atoi) +``` + +Expr sees the `atoi` function as a function with a variadic number of arguments of type `any` and returns a value of type `any`. But, we can specify the types of arguments and the return value by adding the correct function +signature or multiple signatures. + +```go + atoi := expr.Function( + "atoi", + func(params ...any) (any, error) { + return strconv.Atoi(params[0].(string)) + }, + new(func(string) int), + ) +``` + +Or we can simply reuse the `strconv.Atoi` function. + +```go + atoi := expr.Function( + "atoi", + func(params ...any) (any, error) { + return strconv.Atoi(params[0].(string)) + }, + strconv.Atoi, + ) +``` + +Here is another example with a few function signatures: + +```go + toInt := expr.Function( + "toInt", + func(params ...any) (any, error) { + switch params[0].(type) { + case float64: + return int(params[0].(float64)), nil + case string: + return strconv.Atoi(params[0].(string)) + } + return nil, fmt.Errorf("invalid type") + }, + new(func(float64) int), + new(func(string) int), + ) +``` diff --git a/docs/Getting-Started.md b/docs/Getting-Started.md index 04dd015a5..87653946a 100644 --- a/docs/Getting-Started.md +++ b/docs/Getting-Started.md @@ -1,97 +1,126 @@ # Getting Started **Expr** is a simple, fast and extensible expression language for Go. It is -designed to be easy to use and integrate into your application. +designed to be easy to use and integrate into your Go application. Let's delve +deeper into its core features: +- **Memory safe** - Designed to prevent vulnerabilities like buffer overflows and memory leaks. +- **Type safe** - Enforces strict type rules, aligning with Go's type system. +- **Terminating** - Ensures every expression evaluation cannot loop indefinitely. +- **Side effects free** - Evaluations won't modify global states or variables. -## Evaluate - -For simple use cases with one execution of an expression, you can use the -`expr.Eval` function. It takes an expression and a map of variables and returns -the result of the expression. +Let's start with a simple example: ```go -package main +program, err := expr.Compile(`2 + 2`) +if err != nil { + panic(err) +} -import ( - "fmt" - "github.com/antonmedv/expr" -) +output, err := expr.Run(program, nil) +if err != nil { + panic(err) +} -func main() { - env := map[string]interface{}{ - "foo": 1, - "bar": 2, - } +fmt.Print(output) // 4 +``` - out, err := expr.Eval("foo + bar", env) +Expr compiles the expression `2 + 2` into a bytecode program. Then we run +the program and get the output. The output is `4` as expected. - if err != nil { - panic(err) - } - fmt.Print(out) +The `expr.Compile` function returns a `*vm.Program` and an error. The program +can be reused between runs. The `expr.Run` function takes a program and an +environment. The environment is a map of variables that can be used in the +expression. In this example, we use `nil` as an environment because we don't +need any variables. + +Now let's pass some variables to the expression: + +```go +env := map[string]any{ + "foo": 100, + "bar": 200, } + +program, err := expr.Compile(`foo + bar`, expr.Env(env)) +if err != nil { + panic(err) +} + +output, err := expr.Run(program, env) +if err != nil { + panic(err) +} + +fmt.Print(output) // 300 ``` -## Compile +Why do we need to pass the environment to the `expr.Compile` function? Expr can be used as a type-safe language. +Expr can infer the type of the expression and check it against the environment. Here is an example: + +```go +env := map[string]any{ + "name": "Anton", + "age": 35, +} + +program, err := expr.Compile(`name + age`, expr.Env(env)) +if err != nil { + panic(err) // Will panic with "invalid operation: string + int" +} +``` -Usually, we want to compile, type check and verify that the expression returns a -boolean (or another type). For example, if a user saves an expression from a -[web UI](https://antonmedv.github.io/expr/). +Expr can work with any Go types. Here is an example: ```go - env := map[string]interface{}{ - "greet": "Hello, %v!", - "names": []string{"world", "you"}, - "sprintf": fmt.Sprintf, // Use any functions. - } +env := map[string]interface{}{ + "greet": "Hello, %v!", + "names": []string{"world", "you"}, + "sprintf": fmt.Sprintf, +} - code := `sprintf(greet, names[0])` +code := `sprintf(greet, names[0])` - // Compile the code into a bytecode. This step can be done only once and - // the program may be reused. Specify an environment for the type check. - program, err := expr.Compile(code, expr.Env(env)) - if err != nil { - panic(err) - } +program, err := expr.Compile(code, expr.Env(env)) +if err != nil { + panic(err) +} - output, err := expr.Run(program, env) - if err != nil { - panic(err) - } +output, err := expr.Run(program, env) +if err != nil { + panic(err) +} - fmt.Print(output) +fmt.Print(output) // Hello, world! ``` -An environment can be a struct and structs methods can be used as -functions. Expr supports embedded structs and methods defined on them too. - -The struct fields can be renamed by adding struct tags such as `expr:"name"`. +Also, Expr can use a struct as an environment. Methods defined on the struct become functions. +The struct fields can be renamed with the `expr` tag. Here is an example: ```go type Env struct { - Messages []Message `expr:"messages"` + Posts []Post `expr:"posts"` } -// Methods defined on the struct become functions. -func (Env) Format(t time.Time) string { return t.Format(time.RFC822) } +func (Env) Format(t time.Time) string { + return t.Format(time.RFC822) +} -type Message struct { - Text string +type Post struct { + Body string Date time.Time } func main() { - code := `map(filter(messages, len(.Text) > 0), Format(.Date) + '\t' + .Text + '\n')` - - // We can use an empty instance of the struct as an environment. + code := `map(posts, Format(.Date) + ": " + .Body)` + program, err := expr.Compile(code, expr.Env(Env{})) if err != nil { panic(err) } env := Env{ - Messages: []Message{ + Posts: []Post{ {"Oh My God!", time.Now()}, {"How you doin?", time.Now()}, {"Could I be wearing any more clothes?", time.Now()}, @@ -107,70 +136,37 @@ func main() { } ``` -## Configuration - -Expr can be configured to do more things. For example, with [AllowUndefinedVariables](https://pkg.go.dev/github.com/antonmedv/expr#AllowUndefinedVariables) or [AsBool](https://pkg.go.dev/github.com/antonmedv/expr#AsBool) to expect the boolean result from the expression. - -```go -program, err := expr.Compile(code, expr.Env(Env{}), expr.AllowUndefinedVariables(), expr.AsBool()) -``` - -## Functions - -Expr supports any Go functions. For example, you can use `fmt.Sprintf` or methods of your structs. -Also, Expr supports functions configured via [`expr.Function(name, fn[, ...types])`](https://pkg.go.dev/github.com/antonmedv/expr#Function) option. +The compiled program can be reused between runs. Here is an example: ```go - atoi := expr.Function( - "atoi", - func(params ...any) (any, error) { - return strconv.Atoi(params[0].(string)) - }, - ) +type Env struct { + X int + Y int +} - program, err := expr.Compile(`atoi("42")`, atoi) -``` +program, err := expr.Compile(`X + Y`, expr.Env(Env{})) +if err != nil { + panic(err) +} -Expr sees the `atoi` function as a function with a variadic number of arguments of type `any` and returns a value of type `any`. But, we can specify the types of arguments and the return value by adding the correct function -signature or multiple signatures. +output, err := expr.Run(program, Env{1, 2}) +if err != nil { + panic(err) +} -```go - atoi := expr.Function( - "atoi", - func(params ...any) (any, error) { - return strconv.Atoi(params[0].(string)) - }, - new(func(string) int), - ) -``` +fmt.Print(output) // 3 -Or we can simply reuse the `strconv.Atoi` function. +output, err = expr.Run(program, Env{3, 4}) +if err != nil { + panic(err) +} -```go - atoi := expr.Function( - "atoi", - func(params ...any) (any, error) { - return strconv.Atoi(params[0].(string)) - }, - strconv.Atoi, - ) +fmt.Print(output) // 7 ``` -Here is another example with a few function signatures: - +:::tip +For one-off expressions, you can use the `expr.Eval` function. It compiles and runs the expression in one step. ```go - toInt := expr.Function( - "toInt", - func(params ...any) (any, error) { - switch params[0].(type) { - case float64: - return int(params[0].(float64)), nil - case string: - return strconv.Atoi(params[0].(string)) - } - return nil, fmt.Errorf("invalid type") - }, - new(func(float64) int), - new(func(string) int), - ) +output, err := expr.Eval(`2 + 2`, env) ``` +::: From d625ef35e41a6b363a713d100151fe1edffec2cf Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 14:06:17 +0200 Subject: [PATCH 026/506] Add config docs --- docs/Configuration.md | 99 ++++++++++++++++++++++++++++++++++++++++--- docs/Internals.md | 17 -------- 2 files changed, 94 insertions(+), 22 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 153fc0df0..5423bc663 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -1,15 +1,91 @@ # Configuration -Expr can be configured to do more things. For example, with [AllowUndefinedVariables](https://pkg.go.dev/github.com/antonmedv/expr#AllowUndefinedVariables) or [AsBool](https://pkg.go.dev/github.com/antonmedv/expr#AsBool) to expect the boolean result from the expression. +Expr can be configured with options. For example, you can pass the environment with variables and functions. + +## AllowUndefinedVariables() + +This option allows undefined variables in the expression. By default, Expr will return an error +if the expression contains undefined variables. + +```go +program, err := expr.Compile(`foo + bar`, expr.AllowUndefinedVariables()) +``` + +## AsBool() + +This option forces the expression to return a boolean value. If the expression returns a non-boolean value, +Expr will return an error. + +```go +program, err := expr.Compile(`Title contains "Hello"`, expr.AsBool()) +``` + +## AsFloat64() + +This option forces the expression to return a float64 value. If the expression returns a non-float64 value, +Expr will return an error. + +```go +program, err := expr.Compile(`42`, expr.AsFloat64()) +``` + +:::note +If the expression returns integer value, Expr will convert it to float64. +::: + +## AsInt() + +This option forces the expression to return an int value. If the expression returns a non-int value, +Expr will return an error. + +```go +program, err := expr.Compile(`42`, expr.AsInt()) +``` + +:::note +If the expression returns a float value, Expr truncates it to int. +::: + +## AsInt64() + +Same as `AsInt()` but returns an int64 value. ```go -program, err := expr.Compile(code, expr.Env(Env{}), expr.AllowUndefinedVariables(), expr.AsBool()) +program, err := expr.Compile(`42`, expr.AsInt64()) ``` -## Functions +## AsKind() -Expr supports any Go functions. For example, you can use `fmt.Sprintf` or methods of your structs. -Also, Expr supports functions configured via [`expr.Function(name, fn[, ...types])`](https://pkg.go.dev/github.com/antonmedv/expr#Function) option. +This option forces the expression to return a value of the specified kind. +If the expression returns a value of a different kind, Expr will return an error. + +```go +program, err := expr.Compile(`42`, expr.AsKind(reflect.String)) +``` + +## ConstExpr() + +This option tells Expr to treat specified functions as constant expressions. +If all arguments of the function are constants, Expr will replace the function call with the result +during the compile step. + +```go +program, err := expr.Compile(`fib(42)`, expr.ConstExpr("fib")) +``` + +[ConstExpr Example](https://pkg.go.dev/github.com/antonmedv/expr?tab=doc#ConstExpr) + +## Env() + +This option passes the environment with variables and functions to the expression. + +```go +program, err := expr.Compile(`foo + bar`, expr.Env(Env{})) +``` + +## Function() + +This option adds a function to the expression. ```go atoi := expr.Function( @@ -65,3 +141,16 @@ Here is another example with a few function signatures: new(func(string) int), ) ``` + + +## Operator() + +This options defines an [operator overloading](Operator-Overloading.md). + +## Optimize() + +This option enables [optimizations](Optimizations.md). By default, Expr will optimize the expression. + +## Patch() + +This option allows you to [patch the expression](Visitor-and-Patch.md) before compilation. diff --git a/docs/Internals.md b/docs/Internals.md index 593af1321..beb28f17a 100644 --- a/docs/Internals.md +++ b/docs/Internals.md @@ -59,20 +59,3 @@ Will be replaced with a binary operator: ``` Ranges computed on the compile stage, are replaced with pre-created slices. - -## Const expr - -If some function is marked as a constant expression with `expr.ConstExpr`. It will be -replaced with the result of the call if all arguments are constants. - -```go -expr.ConstExpt("fib") -``` - -``` -fib(42) -``` - -Will be replaced with the result of `fib`(42)` on the compile step. - -[ConstExpr Example](https://pkg.go.dev/github.com/antonmedv/expr?tab=doc#ConstExpr) From 6feb409a961d08d250eafa49294343ed18c958ae Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 14:12:15 +0200 Subject: [PATCH 027/506] Fix link in docs --- docs/Configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index 5423bc663..7dd9d5a18 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -149,7 +149,7 @@ This options defines an [operator overloading](Operator-Overloading.md). ## Optimize() -This option enables [optimizations](Optimizations.md). By default, Expr will optimize the expression. +This option enables [optimizations](Internals.md). By default, Expr will optimize the expression. ## Patch() From 4ba47d93aade9d759142165a65f3b9ae74728e25 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 11 Aug 2023 21:43:17 +0200 Subject: [PATCH 028/506] Update env --- test/playground/env.go | 89 +++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 57 deletions(-) diff --git a/test/playground/env.go b/test/playground/env.go index 9b35c69b9..06224c60d 100644 --- a/test/playground/env.go +++ b/test/playground/env.go @@ -1,71 +1,46 @@ package playground -import "time" +import ( + "time" +) -type Env struct { - Products []Product `expr:"products"` - Customers []Customer `expr:"customers"` - Discounts []Discount `expr:"discounts"` - Orders []Order `expr:"orders"` +type UserProfile struct { + Birthday time.Time + Biography string + Website string } -type Product struct { - Name string - Description string - Price float64 - Stock int - AddOn *AddOn - Metadata map[string]interface{} - Tags []string - Rating float64 - Reviews []Review -} - -type Feature struct { - Id string - Description string -} - -type Discount struct { - Name string - Percent int -} - -type Customer struct { +type Author struct { + ID int FirstName string LastName string - Age int - Addresses []Address -} - -type Address struct { - Country string - City string - Street string - PostalCode string + Email string + Profile UserProfile } -type Order struct { - Number int - Customer Customer - Items []*OrderItem - Discounts []*Discount - CreatedAt time.Time -} - -type OrderItem struct { - Product Product - Quantity int +type Post struct { + ID int + Title string + Content string + PublishDate time.Time + Author Author + Comments []Comment + Tags []string + Likes int } -type Review struct { - Product *Product - Customer *Customer - Comment string - Rating float64 +type Comment struct { + ID int + AuthorName string + Content string + CommentDate time.Time + Upvotes int } -type AddOn struct { - Name string - Price float64 +type Blog struct { + Posts []Post + Authors map[int]Author + TotalViews int + TotalPosts int + TotalLikes int } From 9da6e0fb2961833a846da3ac71d25d0d90c80373 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 12 Aug 2023 13:22:27 +0200 Subject: [PATCH 029/506] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 242431f2c..1aab8b685 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,14 @@ The purpose of the package is to allow users to use expressions inside configura It is a perfect candidate for the foundation of a _business rule engine_. The idea is to let configure things in a dynamic way without recompile of a program: -```coffeescript -# Get the special price if +```js +// Get the special price if user.Group in ["good_customers", "collaborator"] -# Promote article to the homepage when +// Promote article to the homepage when len(article.Comments) > 100 and article.Category not in ["misc"] -# Send an alert when +// Send an alert when product.Stock < 15 ``` From 9ca99f0c4830bb0f0c3765cd0648eeb7c2344c9d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 13 Aug 2023 01:17:49 +0200 Subject: [PATCH 030/506] Add pipe operator (#400) --- debug/go.mod | 4 +- debug/go.sum | 2 - parser/lexer/state.go | 7 +- parser/parser.go | 135 ++++++++++++++++++++++++++------------- parser/parser_test.go | 30 +++++++++ repl/go.mod | 4 +- repl/go.sum | 3 - test/pipes/pipes_test.go | 31 +++++++++ 8 files changed, 161 insertions(+), 55 deletions(-) create mode 100644 test/pipes/pipes_test.go diff --git a/debug/go.mod b/debug/go.mod index dd9b17c57..5dbf3d776 100644 --- a/debug/go.mod +++ b/debug/go.mod @@ -3,7 +3,9 @@ module github.com/antonmedv/expr/debug go 1.13 require ( - github.com/antonmedv/expr v1.9.1-0.20221030193158-2213166cdca2 + github.com/antonmedv/expr v0.0.0 github.com/gdamore/tcell v1.3.0 github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 ) + +replace github.com/antonmedv/expr => ../ diff --git a/debug/go.sum b/debug/go.sum index dd620f7dc..3eaa3b26f 100644 --- a/debug/go.sum +++ b/debug/go.sum @@ -1,6 +1,4 @@ github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/antonmedv/expr v1.9.1-0.20221030193158-2213166cdca2 h1:/lRT2yHd7/W9hW2ZvpNKyoop5YBjJ+wa6p6Vxg1m9Hg= -github.com/antonmedv/expr v1.9.1-0.20221030193158-2213166cdca2/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/parser/lexer/state.go b/parser/lexer/state.go index 1212aa321..5b4b5839e 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -28,14 +28,17 @@ func root(l *lexer) stateFn { return questionMark case r == '/': return slash + case r == '|': + l.accept("|") + l.emit(Operator) case strings.ContainsRune("([{", r): l.emit(Bracket) case strings.ContainsRune(")]}", r): l.emit(Bracket) case strings.ContainsRune("#,:%+-^", r): // single rune operator l.emit(Operator) - case strings.ContainsRune("&|!=*<>", r): // possible double rune operator - l.accept("&|=*") + case strings.ContainsRune("&!=*<>", r): // possible double rune operator + l.accept("&=*") l.emit(Operator) case r == '.': l.backup() diff --git a/parser/parser.go b/parser/parser.go index fd26fe18b..ac54e29b3 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -23,10 +23,6 @@ type operator struct { associativity associativity } -type builtin struct { - arity int -} - var unaryOperators = map[string]operator{ "not": {50, left}, "!": {50, left}, @@ -61,6 +57,10 @@ var binaryOperators = map[string]operator{ "??": {500, left}, } +type builtin struct { + arity int +} + var builtins = map[string]builtin{ "all": {2}, "none": {2}, @@ -201,12 +201,41 @@ func (p *parser) parseExpression(precedence int) Node { } if precedence == 0 { - nodeLeft = p.parseConditionalExpression(nodeLeft) + nodeLeft = p.parseConditional(nodeLeft) + + if p.current.Is(Operator, "|") { + p.next() + return p.parsePipe(nodeLeft) + } } return nodeLeft } +func (p *parser) parseConditional(node Node) Node { + var expr1, expr2 Node + for p.current.Is(Operator, "?") && p.err == nil { + p.next() + + if !p.current.Is(Operator, ":") { + expr1 = p.parseExpression(0) + p.expect(Operator, ":") + expr2 = p.parseExpression(0) + } else { + p.next() + expr1 = node + expr2 = p.parseExpression(0) + } + + node = &ConditionalNode{ + Cond: node, + Exp1: expr1, + Exp2: expr2, + } + } + return node +} + func (p *parser) parsePrimary() Node { token := p.current @@ -245,34 +274,10 @@ func (p *parser) parsePrimary() Node { } } - return p.parsePrimaryExpression() -} - -func (p *parser) parseConditionalExpression(node Node) Node { - var expr1, expr2 Node - for p.current.Is(Operator, "?") && p.err == nil { - p.next() - - if !p.current.Is(Operator, ":") { - expr1 = p.parseExpression(0) - p.expect(Operator, ":") - expr2 = p.parseExpression(0) - } else { - p.next() - expr1 = node - expr2 = p.parseExpression(0) - } - - node = &ConditionalNode{ - Cond: node, - Exp1: expr1, - Exp2: expr2, - } - } - return node + return p.parseSecondary() } -func (p *parser) parsePrimaryExpression() Node { +func (p *parser) parseSecondary() Node { var node Node token := p.current @@ -294,7 +299,7 @@ func (p *parser) parsePrimaryExpression() Node { node.SetLocation(token.Location) return node default: - node = p.parseIdentifierExpression(token) + node = p.parseCall(token) } case Number: @@ -345,14 +350,13 @@ func (p *parser) parsePrimaryExpression() Node { return p.parsePostfixExpression(node) } -func (p *parser) parseIdentifierExpression(token Token) Node { +func (p *parser) parseCall(token Token) Node { var node Node if p.current.Is(Bracket, "(") { var arguments []Node if b, ok := builtins[token.Value]; ok { p.expect(Bracket, "(") - // TODO: Add builtins signatures. if b.arity == 1 { arguments = make([]Node, 1) arguments[0] = p.parseExpression(0) @@ -578,20 +582,43 @@ func (p *parser) parsePostfixExpression(node Node) Node { return node } -func isValidIdentifier(str string) bool { - if len(str) == 0 { - return false - } - h, w := utf8.DecodeRuneInString(str) - if !IsAlphabetic(h) { - return false - } - for _, r := range str[w:] { - if !IsAlphaNumeric(r) { - return false +func (p *parser) parsePipe(node Node) Node { + identifier := p.current + p.expect(Identifier) + + arguments := []Node{node} + + if b, ok := builtins[identifier.Value]; ok { + p.expect(Bracket, "(") + if b.arity == 2 { + arguments = append(arguments, p.parseClosure()) + } + p.expect(Bracket, ")") + + node = &BuiltinNode{ + Name: identifier.Value, + Arguments: arguments, } + node.SetLocation(identifier.Location) + } else { + callee := &IdentifierNode{Value: identifier.Value} + callee.SetLocation(identifier.Location) + + arguments = append(arguments, p.parseArguments()...) + + node = &CallNode{ + Callee: callee, + Arguments: arguments, + } + node.SetLocation(identifier.Location) } - return true + + if p.current.Is(Operator, "|") { + p.next() + return p.parsePipe(node) + } + + return node } func (p *parser) parseArguments() []Node { @@ -608,3 +635,19 @@ func (p *parser) parseArguments() []Node { return nodes } + +func isValidIdentifier(str string) bool { + if len(str) == 0 { + return false + } + h, w := utf8.DecodeRuneInString(str) + if !IsAlphabetic(h) { + return false + } + for _, r := range str[w:] { + if !IsAlphaNumeric(r) { + return false + } + } + return true +} diff --git a/parser/parser_test.go b/parser/parser_test.go index a93ecdc2f..4c162224c 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -8,6 +8,7 @@ import ( . "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/parser" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestParse(t *testing.T) { @@ -444,6 +445,12 @@ func TestParse(t *testing.T) { Left: &IdentifierNode{Value: "foo"}, Right: &CallNode{Callee: &IdentifierNode{Value: "bar"}}}, }, + { + "true | ok()", + &CallNode{ + Callee: &IdentifierNode{Value: "ok"}, + Arguments: []Node{ + &BoolNode{Value: true}}}}, } for _, test := range parseTests { actual, err := parser.Parse(test.input) @@ -631,3 +638,26 @@ func TestParse_optional_chaining(t *testing.T) { assert.Equal(t, Dump(test.expected), Dump(actual.Node), test.input) } } + +func TestParse_pipe_operator(t *testing.T) { + input := "arr | map(.foo) | len() | Foo()" + expect := &CallNode{ + Callee: &IdentifierNode{Value: "Foo"}, + Arguments: []Node{ + &CallNode{ + Callee: &IdentifierNode{Value: "len"}, + Arguments: []Node{ + &BuiltinNode{ + Name: "map", + Arguments: []Node{ + &IdentifierNode{Value: "arr"}, + &ClosureNode{ + Node: &MemberNode{ + Node: &PointerNode{}, + Property: &StringNode{Value: "foo"}, + }}}}}}}} + + actual, err := parser.Parse(input) + require.NoError(t, err) + assert.Equal(t, Dump(expect), Dump(actual.Node)) +} diff --git a/repl/go.mod b/repl/go.mod index 544f97299..4e15b13bb 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -3,8 +3,10 @@ module github.com/antonmedv/expr/repl go 1.20 require ( - github.com/antonmedv/expr v1.12.7 + github.com/antonmedv/expr v0.0.0 github.com/chzyer/readline v1.5.1 ) require golang.org/x/sys v0.11.0 // indirect + +replace github.com/antonmedv/expr => ../ diff --git a/repl/go.sum b/repl/go.sum index 12275609b..e5a857a0c 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -1,5 +1,3 @@ -github.com/antonmedv/expr v1.12.7 h1:jfV/l/+dHWAadLwAtESXNxXdfbK9bE4+FNMHYCMntwk= -github.com/antonmedv/expr v1.12.7/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= @@ -16,7 +14,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go new file mode 100644 index 000000000..47f440681 --- /dev/null +++ b/test/pipes/pipes_test.go @@ -0,0 +1,31 @@ +package pipes_test + +import ( + "fmt" + "testing" + + "github.com/antonmedv/expr" + "github.com/stretchr/testify/require" +) + +func TestPipes(t *testing.T) { + env := map[string]interface{}{ + "sprintf": fmt.Sprintf, + } + + program, err := expr.Compile(`"%s bar %d" | sprintf("foo", -42 | abs())`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, "foo bar 42", out) +} + +func TestPipes_map_filter(t *testing.T) { + program, err := expr.Compile(`1..9 | map(# + 1) | filter(# % 2 == 0)`) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + require.NoError(t, err) + require.Equal(t, []interface{}{2, 4, 6, 8, 10}, out) +} From 2eb6a03aacf9ca8a87685a6f3b1adc3e8473b295 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 13 Aug 2023 12:33:34 +0200 Subject: [PATCH 031/506] Refactor builtin funcs --- builtin/builtin.go | 31 +++++++++---------------------- builtin/utils.go | 16 ++++++++++++++++ compiler/compiler.go | 4 ++-- 3 files changed, 27 insertions(+), 24 deletions(-) create mode 100644 builtin/utils.go diff --git a/builtin/builtin.go b/builtin/builtin.go index ad9376962..f0b2fe887 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -5,16 +5,10 @@ import ( "reflect" ) -var ( - anyType = reflect.TypeOf(new(interface{})).Elem() - integerType = reflect.TypeOf(0) - floatType = reflect.TypeOf(float64(0)) -) - type Function struct { Name string + Id int Func func(args ...interface{}) (interface{}, error) - Opcode int Types []reflect.Type Validate func(args []reflect.Type) (reflect.Type, error) } @@ -28,8 +22,8 @@ const ( var Builtins = map[int]*Function{ Len: { - Name: "len", - Opcode: Len, + Name: "len", + Id: Len, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for len (expected 1, got %d)", len(args)) @@ -42,8 +36,8 @@ var Builtins = map[int]*Function{ }, }, Abs: { - Name: "abs", - Opcode: Abs, + Name: "abs", + Id: Abs, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for abs (expected 1, got %d)", len(args)) @@ -56,8 +50,8 @@ var Builtins = map[int]*Function{ }, }, Int: { - Name: "int", - Opcode: Int, + Name: "int", + Id: Int, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for int (expected 1, got %d)", len(args)) @@ -74,8 +68,8 @@ var Builtins = map[int]*Function{ }, }, Float: { - Name: "float", - Opcode: Float, + Name: "float", + Id: Float, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for float (expected 1, got %d)", len(args)) @@ -92,10 +86,3 @@ var Builtins = map[int]*Function{ }, }, } - -func kind(t reflect.Type) reflect.Kind { - if t == nil { - return reflect.Invalid - } - return t.Kind() -} diff --git a/builtin/utils.go b/builtin/utils.go new file mode 100644 index 000000000..64a84b747 --- /dev/null +++ b/builtin/utils.go @@ -0,0 +1,16 @@ +package builtin + +import "reflect" + +var ( + anyType = reflect.TypeOf(new(interface{})).Elem() + integerType = reflect.TypeOf(0) + floatType = reflect.TypeOf(float64(0)) +) + +func kind(t reflect.Type) reflect.Kind { + if t == nil { + return reflect.Invalid + } + return t.Kind() +} diff --git a/compiler/compiler.go b/compiler/compiler.go index 4b2f94603..11f3865e6 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -563,8 +563,8 @@ func (c *compiler) CallNode(node *ast.CallNode) { c.compile(arg) } if node.Func != nil { - if node.Func.Opcode > 0 { - c.emit(OpBuiltin, node.Func.Opcode) + if node.Func.Id > 0 { + c.emit(OpBuiltin, node.Func.Id) return } switch len(node.Arguments) { From 078f2e8de33c12531d44ba0fcbcb6ce99e80f0b8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 13 Aug 2023 21:43:47 +0200 Subject: [PATCH 032/506] Refactor builtin.Function and move builtin funcs to builtin package --- builtin/builtin.go | 26 +++---- builtin/func.go | 173 ++++++++++++++++++++++++++++++++++++++++++ compiler/compiler.go | 4 - vm/opcodes.go | 1 - vm/program.go | 11 --- vm/runtime/runtime.go | 91 ---------------------- vm/vm.go | 22 +----- 7 files changed, 183 insertions(+), 145 deletions(-) create mode 100644 builtin/func.go diff --git a/builtin/builtin.go b/builtin/builtin.go index f0b2fe887..4d600e5d5 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -7,23 +7,15 @@ import ( type Function struct { Name string - Id int Func func(args ...interface{}) (interface{}, error) Types []reflect.Type Validate func(args []reflect.Type) (reflect.Type, error) } -const ( - Len = iota + 1 - Abs - Int - Float -) - -var Builtins = map[int]*Function{ - Len: { +var Builtins = []*Function{ + { Name: "len", - Id: Len, + Func: Len, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for len (expected 1, got %d)", len(args)) @@ -35,9 +27,9 @@ var Builtins = map[int]*Function{ return anyType, fmt.Errorf("invalid argument for len (type %s)", args[0]) }, }, - Abs: { + { Name: "abs", - Id: Abs, + Func: Abs, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for abs (expected 1, got %d)", len(args)) @@ -49,9 +41,9 @@ var Builtins = map[int]*Function{ return anyType, fmt.Errorf("invalid argument for abs (type %s)", args[0]) }, }, - Int: { + { Name: "int", - Id: Int, + Func: Int, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for int (expected 1, got %d)", len(args)) @@ -67,9 +59,9 @@ var Builtins = map[int]*Function{ return anyType, fmt.Errorf("invalid argument for int (type %s)", args[0]) }, }, - Float: { + { Name: "float", - Id: Float, + Func: Float, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for float (expected 1, got %d)", len(args)) diff --git a/builtin/func.go b/builtin/func.go new file mode 100644 index 000000000..d120ede59 --- /dev/null +++ b/builtin/func.go @@ -0,0 +1,173 @@ +package builtin + +import ( + "fmt" + "reflect" + "strconv" +) + +func Len(xs ...interface{}) (interface{}, error) { + x := xs[0] + v := reflect.ValueOf(x) + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.Map, reflect.String: + return v.Len(), nil + default: + return nil, fmt.Errorf("invalid argument for len (type %T)", x) + } +} + +func Abs(xs ...interface{}) (interface{}, error) { + x := xs[0] + switch x.(type) { + case float32: + if x.(float32) < 0 { + return -x.(float32), nil + } else { + return x, nil + } + case float64: + if x.(float64) < 0 { + return -x.(float64), nil + } else { + return x, nil + } + case int: + if x.(int) < 0 { + return -x.(int), nil + } else { + return x, nil + } + case int8: + if x.(int8) < 0 { + return -x.(int8), nil + } else { + return x, nil + } + case int16: + if x.(int16) < 0 { + return -x.(int16), nil + } else { + return x, nil + } + case int32: + if x.(int32) < 0 { + return -x.(int32), nil + } else { + return x, nil + } + case int64: + if x.(int64) < 0 { + return -x.(int64), nil + } else { + return x, nil + } + case uint: + if x.(uint) < 0 { + return -x.(uint), nil + } else { + return x, nil + } + case uint8: + if x.(uint8) < 0 { + return -x.(uint8), nil + } else { + return x, nil + } + case uint16: + if x.(uint16) < 0 { + return -x.(uint16), nil + } else { + return x, nil + } + case uint32: + if x.(uint32) < 0 { + return -x.(uint32), nil + } else { + return x, nil + } + case uint64: + if x.(uint64) < 0 { + return -x.(uint64), nil + } else { + return x, nil + } + } + return nil, fmt.Errorf("invalid argument for abs (type %T)", x) +} + +func Int(xs ...interface{}) (interface{}, error) { + x := xs[0] + switch x := x.(type) { + case float32: + return int(x), nil + case float64: + return int(x), nil + case int: + return x, nil + case int8: + return int(x), nil + case int16: + return int(x), nil + case int32: + return int(x), nil + case int64: + return int(x), nil + case uint: + return int(x), nil + case uint8: + return int(x), nil + case uint16: + return int(x), nil + case uint32: + return int(x), nil + case uint64: + return int(x), nil + case string: + i, err := strconv.Atoi(x) + if err != nil { + return nil, fmt.Errorf("invalid operation: int(%s)", x) + } + return i, nil + default: + return nil, fmt.Errorf("invalid operation: int(%T)", x) + } +} + +func Float(xs ...interface{}) (interface{}, error) { + x := xs[0] + switch x := x.(type) { + case float32: + return float64(x), nil + case float64: + return x, nil + case int: + return float64(x), nil + case int8: + return float64(x), nil + case int16: + return float64(x), nil + case int32: + return float64(x), nil + case int64: + return float64(x), nil + case uint: + return float64(x), nil + case uint8: + return float64(x), nil + case uint16: + return float64(x), nil + case uint32: + return float64(x), nil + case uint64: + return float64(x), nil + case string: + f, err := strconv.ParseFloat(x, 64) + if err != nil { + return nil, fmt.Errorf("invalid operation: float(%s)", x) + } + return f, nil + default: + return nil, fmt.Errorf("invalid operation: float(%T)", x) + } +} diff --git a/compiler/compiler.go b/compiler/compiler.go index 11f3865e6..917860b09 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -563,10 +563,6 @@ func (c *compiler) CallNode(node *ast.CallNode) { c.compile(arg) } if node.Func != nil { - if node.Func.Id > 0 { - c.emit(OpBuiltin, node.Func.Id) - return - } switch len(node.Arguments) { case 0: c.emit(OpCall0, c.addFunction(node)) diff --git a/vm/opcodes.go b/vm/opcodes.go index 4bc9abf4d..70c788b42 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -57,7 +57,6 @@ const ( OpCallN OpCallFast OpCallTyped - OpBuiltin OpArray OpMap OpLen diff --git a/vm/program.go b/vm/program.go index 936eca9a2..3212449c8 100644 --- a/vm/program.go +++ b/vm/program.go @@ -9,7 +9,6 @@ import ( "text/tabwriter" "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/vm/runtime" ) @@ -64,13 +63,6 @@ func (program *Program) Disassemble() string { } _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, c) } - builtIn := func(label string) { - f, ok := builtin.Builtins[arg] - if !ok { - panic(fmt.Sprintf("unknown builtin %v", arg)) - } - _, _ = fmt.Fprintf(w, "%v\t%v\t%v\n", pp, "OpBuiltin", f.Name) - } switch op { case OpInvalid: @@ -236,9 +228,6 @@ func (program *Program) Disassemble() string { signature := reflect.TypeOf(FuncTypes[arg]).Elem().String() _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, "OpCallTyped", arg, signature) - case OpBuiltin: - builtIn("OpBuiltin") - case OpArray: code("OpArray") diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 75ac94bf8..92abf16c6 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -6,7 +6,6 @@ import ( "fmt" "math" "reflect" - "strconv" ) func Fetch(from, i interface{}) interface{} { @@ -348,12 +347,6 @@ func ToInt(a interface{}) int { return int(x) case uint64: return int(x) - case string: - i, err := strconv.Atoi(x) - if err != nil { - panic(fmt.Sprintf("invalid operation: int(%s)", x)) - } - return i default: panic(fmt.Sprintf("invalid operation: int(%T)", x)) } @@ -416,12 +409,6 @@ func ToFloat64(a interface{}) float64 { return float64(x) case uint64: return float64(x) - case string: - f, err := strconv.ParseFloat(x, 64) - if err != nil { - panic(fmt.Sprintf("invalid operation: float(%s)", x)) - } - return f default: panic(fmt.Sprintf("invalid operation: float(%T)", x)) } @@ -439,81 +426,3 @@ func IsNil(v interface{}) bool { return false } } - -func Abs(x interface{}) interface{} { - switch x.(type) { - case float32: - if x.(float32) < 0 { - return -x.(float32) - } else { - return x - } - case float64: - if x.(float64) < 0 { - return -x.(float64) - } else { - return x - } - case int: - if x.(int) < 0 { - return -x.(int) - } else { - return x - } - case int8: - if x.(int8) < 0 { - return -x.(int8) - } else { - return x - } - case int16: - if x.(int16) < 0 { - return -x.(int16) - } else { - return x - } - case int32: - if x.(int32) < 0 { - return -x.(int32) - } else { - return x - } - case int64: - if x.(int64) < 0 { - return -x.(int64) - } else { - return x - } - case uint: - if x.(uint) < 0 { - return -x.(uint) - } else { - return x - } - case uint8: - if x.(uint8) < 0 { - return -x.(uint8) - } else { - return x - } - case uint16: - if x.(uint16) < 0 { - return -x.(uint16) - } else { - return x - } - case uint32: - if x.(uint32) < 0 { - return -x.(uint32) - } else { - return x - } - case uint64: - if x.(uint64) < 0 { - return -x.(uint64) - } else { - return x - } - } - panic(fmt.Sprintf("invalid argument for abs (type %T)", x)) -} diff --git a/vm/vm.go b/vm/vm.go index ec22c251d..4509a1f3f 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -8,7 +8,6 @@ import ( "regexp" "strings" - "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/vm/runtime" ) @@ -411,8 +410,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(runtime.Len(vm.current())) case OpCast: - t := arg - switch t { + switch arg { case 0: vm.push(runtime.ToInt(vm.pop())) case 1: @@ -456,24 +454,6 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpEnd: vm.scopes = vm.scopes[:len(vm.scopes)-1] - case OpBuiltin: - switch arg { - case builtin.Len: - vm.push(runtime.Len(vm.pop())) - - case builtin.Abs: - vm.push(runtime.Abs(vm.pop())) - - case builtin.Int: - vm.push(runtime.ToInt(vm.pop())) - - case builtin.Float: - vm.push(runtime.ToFloat64(vm.pop())) - - default: - panic(fmt.Sprintf("unknown builtin %v", arg)) - } - default: panic(fmt.Sprintf("unknown bytecode %#x", op)) } From 65bd6736f33db2fd4e916aadbb025540252f8faf Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 10:29:38 +0200 Subject: [PATCH 033/506] Add OpCallBuiltin opcode to avoid an extra allocation --- builtin/builtin.go | 26 +- builtin/func.go | 126 ++++----- checker/checker.go | 260 +++++++++--------- compiler/compiler.go | 19 +- expr_test.go | 70 ----- parser/parser.go | 25 +- parser/parser_test.go | 8 +- repl/repl.go | 54 +++- .../interface_method/interface_method_test.go | 48 ++++ test/patch/patch_test.go | 38 +++ vm/opcodes.go | 1 + vm/program.go | 7 + vm/vm.go | 4 + 13 files changed, 393 insertions(+), 293 deletions(-) create mode 100644 test/interface_method/interface_method_test.go create mode 100644 test/patch/patch_test.go diff --git a/builtin/builtin.go b/builtin/builtin.go index 4d600e5d5..32ef76302 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -8,14 +8,24 @@ import ( type Function struct { Name string Func func(args ...interface{}) (interface{}, error) + Builtin1 func(arg interface{}) interface{} Types []reflect.Type Validate func(args []reflect.Type) (reflect.Type, error) } +var Index map[string]int + +func init() { + Index = make(map[string]int) + for i, fn := range Builtins { + Index[fn.Name] = i + } +} + var Builtins = []*Function{ { - Name: "len", - Func: Len, + Name: "len", + Builtin1: Len, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for len (expected 1, got %d)", len(args)) @@ -28,8 +38,8 @@ var Builtins = []*Function{ }, }, { - Name: "abs", - Func: Abs, + Name: "abs", + Builtin1: Abs, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for abs (expected 1, got %d)", len(args)) @@ -42,8 +52,8 @@ var Builtins = []*Function{ }, }, { - Name: "int", - Func: Int, + Name: "int", + Builtin1: Int, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for int (expected 1, got %d)", len(args)) @@ -60,8 +70,8 @@ var Builtins = []*Function{ }, }, { - Name: "float", - Func: Float, + Name: "float", + Builtin1: Float, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments for float (expected 1, got %d)", len(args)) diff --git a/builtin/func.go b/builtin/func.go index d120ede59..f3f5c1208 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -6,168 +6,164 @@ import ( "strconv" ) -func Len(xs ...interface{}) (interface{}, error) { - x := xs[0] +func Len(x interface{}) interface{} { v := reflect.ValueOf(x) switch v.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: - return v.Len(), nil + return v.Len() default: - return nil, fmt.Errorf("invalid argument for len (type %T)", x) + panic(fmt.Sprintf("invalid argument for len (type %T)", x)) } } -func Abs(xs ...interface{}) (interface{}, error) { - x := xs[0] +func Abs(x interface{}) interface{} { switch x.(type) { case float32: if x.(float32) < 0 { - return -x.(float32), nil + return -x.(float32) } else { - return x, nil + return x } case float64: if x.(float64) < 0 { - return -x.(float64), nil + return -x.(float64) } else { - return x, nil + return x } case int: if x.(int) < 0 { - return -x.(int), nil + return -x.(int) } else { - return x, nil + return x } case int8: if x.(int8) < 0 { - return -x.(int8), nil + return -x.(int8) } else { - return x, nil + return x } case int16: if x.(int16) < 0 { - return -x.(int16), nil + return -x.(int16) } else { - return x, nil + return x } case int32: if x.(int32) < 0 { - return -x.(int32), nil + return -x.(int32) } else { - return x, nil + return x } case int64: if x.(int64) < 0 { - return -x.(int64), nil + return -x.(int64) } else { - return x, nil + return x } case uint: if x.(uint) < 0 { - return -x.(uint), nil + return -x.(uint) } else { - return x, nil + return x } case uint8: if x.(uint8) < 0 { - return -x.(uint8), nil + return -x.(uint8) } else { - return x, nil + return x } case uint16: if x.(uint16) < 0 { - return -x.(uint16), nil + return -x.(uint16) } else { - return x, nil + return x } case uint32: if x.(uint32) < 0 { - return -x.(uint32), nil + return -x.(uint32) } else { - return x, nil + return x } case uint64: if x.(uint64) < 0 { - return -x.(uint64), nil + return -x.(uint64) } else { - return x, nil + return x } } - return nil, fmt.Errorf("invalid argument for abs (type %T)", x) + panic(fmt.Sprintf("invalid argument for abs (type %T)", x)) } -func Int(xs ...interface{}) (interface{}, error) { - x := xs[0] +func Int(x interface{}) interface{} { switch x := x.(type) { case float32: - return int(x), nil + return int(x) case float64: - return int(x), nil + return int(x) case int: - return x, nil + return x case int8: - return int(x), nil + return int(x) case int16: - return int(x), nil + return int(x) case int32: - return int(x), nil + return int(x) case int64: - return int(x), nil + return int(x) case uint: - return int(x), nil + return int(x) case uint8: - return int(x), nil + return int(x) case uint16: - return int(x), nil + return int(x) case uint32: - return int(x), nil + return int(x) case uint64: - return int(x), nil + return int(x) case string: i, err := strconv.Atoi(x) if err != nil { - return nil, fmt.Errorf("invalid operation: int(%s)", x) + panic(fmt.Sprintf("invalid operation: int(%s)", x)) } - return i, nil + return i default: - return nil, fmt.Errorf("invalid operation: int(%T)", x) + panic(fmt.Sprintf("invalid operation: int(%T)", x)) } } -func Float(xs ...interface{}) (interface{}, error) { - x := xs[0] +func Float(x interface{}) interface{} { switch x := x.(type) { case float32: - return float64(x), nil + return float64(x) case float64: - return x, nil + return x case int: - return float64(x), nil + return float64(x) case int8: - return float64(x), nil + return float64(x) case int16: - return float64(x), nil + return float64(x) case int32: - return float64(x), nil + return float64(x) case int64: - return float64(x), nil + return float64(x) case uint: - return float64(x), nil + return float64(x) case uint8: - return float64(x), nil + return float64(x) case uint16: - return float64(x), nil + return float64(x) case uint32: - return float64(x), nil + return float64(x) case uint64: - return float64(x), nil + return float64(x) case string: f, err := strconv.ParseFloat(x, 64) if err != nil { - return nil, fmt.Errorf("invalid operation: float(%s)", x) + panic(fmt.Sprintf("invalid operation: float(%s)", x)) } - return f, nil + return f default: - return nil, fmt.Errorf("invalid operation: float(%T)", x) + panic(fmt.Sprintf("invalid operation: float(%T)", x)) } } diff --git a/checker/checker.go b/checker/checker.go index 86d6d6c6a..bd2557507 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -493,45 +493,8 @@ func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { fn, fnInfo := v.visit(node.Callee) if fnInfo.fn != nil { - f := fnInfo.fn - node.Func = f - if f.Validate != nil { - args := make([]reflect.Type, len(node.Arguments)) - for i, arg := range node.Arguments { - args[i], _ = v.visit(arg) - } - t, err := f.Validate(args) - if err != nil { - return v.error(node, "%v", err) - } - return t, info{} - } - if len(f.Types) == 0 { - t, err := v.checkFunc(f.Name, functionType, false, node) - if err != nil { - if v.err == nil { - v.err = err - } - return anyType, info{} - } - // No type was specified, so we assume the function returns any. - return t, info{} - } - var lastErr *file.Error - for _, t := range f.Types { - outType, err := v.checkFunc(f.Name, t, false, node) - if err != nil { - lastErr = err - continue - } - return outType, info{} - } - if lastErr != nil { - if v.err == nil { - v.err = lastErr - } - return anyType, info{} - } + node.Func = fnInfo.fn + return v.checkFunction(fnInfo.fn, node.Arguments, node) } fnName := "function" @@ -564,7 +527,7 @@ func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { } } - outType, err := v.checkFunc(fnName, fn, fnInfo.method, node) + outType, err := v.checkArguments(fnName, fn, fnInfo.method, node.Arguments, node) if err != nil { if v.err == nil { v.err = err @@ -579,90 +542,6 @@ func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { return v.error(node, "%v is not callable", fn) } -func (v *visitor) checkFunc(name string, fn reflect.Type, method bool, node *ast.CallNode) (reflect.Type, *file.Error) { - if isAny(fn) { - return anyType, nil - } - - if fn.NumOut() == 0 { - return anyType, &file.Error{ - Location: node.Location(), - Message: fmt.Sprintf("func %v doesn't return value", name), - } - } - if numOut := fn.NumOut(); numOut > 2 { - return anyType, &file.Error{ - Location: node.Location(), - Message: fmt.Sprintf("func %v returns more then two values", name), - } - } - - // If func is method on an env, first argument should be a receiver, - // and actual arguments less than fnNumIn by one. - fnNumIn := fn.NumIn() - if method { - fnNumIn-- - } - // Skip first argument in case of the receiver. - fnInOffset := 0 - if method { - fnInOffset = 1 - } - - if fn.IsVariadic() { - if len(node.Arguments) < fnNumIn-1 { - return anyType, &file.Error{ - Location: node.Location(), - Message: fmt.Sprintf("not enough arguments to call %v", name), - } - } - } else { - if len(node.Arguments) > fnNumIn { - return anyType, &file.Error{ - Location: node.Location(), - Message: fmt.Sprintf("too many arguments to call %v", name), - } - } - if len(node.Arguments) < fnNumIn { - return anyType, &file.Error{ - Location: node.Location(), - Message: fmt.Sprintf("not enough arguments to call %v", name), - } - } - } - - for i, arg := range node.Arguments { - t, _ := v.visit(arg) - - var in reflect.Type - if fn.IsVariadic() && i >= fnNumIn-1 { - // For variadic arguments fn(xs ...int), go replaces type of xs (int) with ([]int). - // As we compare arguments one by one, we need underling type. - in = fn.In(fn.NumIn() - 1).Elem() - } else { - in = fn.In(i + fnInOffset) - } - - if isIntegerOrArithmeticOperation(arg) && (isInteger(in) || isFloat(in)) { - t = in - setTypeForIntegers(arg, t) - } - - if t == nil { - continue - } - - if !t.AssignableTo(in) && t.Kind() != reflect.Interface { - return anyType, &file.Error{ - Location: arg.Location(), - Message: fmt.Sprintf("cannot use %v as argument (type %v) to call %v ", t, in, name), - } - } - } - - return fn.Out(0), nil -} - func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { switch node.Name { case "all", "none", "any", "one": @@ -748,10 +627,139 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return integerType, info{} } return v.error(node.Arguments[1], "closure should has one input and one output param") + } - default: - return v.error(node, "unknown builtin %v", node.Name) + if id, ok := builtin.Index[node.Name]; ok { + return v.checkFunction(builtin.Builtins[id], node.Arguments, node) } + + return v.error(node, "unknown builtin %v", node.Name) +} + +func (v *visitor) checkFunction(f *builtin.Function, arguments []ast.Node, node ast.Node) (reflect.Type, info) { + if f.Validate != nil { + args := make([]reflect.Type, len(arguments)) + for i, arg := range arguments { + args[i], _ = v.visit(arg) + } + t, err := f.Validate(args) + if err != nil { + return v.error(node, "%v", err) + } + return t, info{} + } + if len(f.Types) == 0 { + t, err := v.checkArguments(f.Name, functionType, false, arguments, node) + if err != nil { + if v.err == nil { + v.err = err + } + return anyType, info{} + } + // No type was specified, so we assume the function returns any. + return t, info{} + } + var lastErr *file.Error + for _, t := range f.Types { + outType, err := v.checkArguments(f.Name, t, false, arguments, node) + if err != nil { + lastErr = err + continue + } + return outType, info{} + } + if lastErr != nil { + if v.err == nil { + v.err = lastErr + } + return anyType, info{} + } + + return v.error(node, "no matching overload for %v", f.Name) +} + +func (v *visitor) checkArguments(name string, fn reflect.Type, method bool, arguments []ast.Node, node ast.Node) (reflect.Type, *file.Error) { + if isAny(fn) { + return anyType, nil + } + + if fn.NumOut() == 0 { + return anyType, &file.Error{ + Location: node.Location(), + Message: fmt.Sprintf("func %v doesn't return value", name), + } + } + if numOut := fn.NumOut(); numOut > 2 { + return anyType, &file.Error{ + Location: node.Location(), + Message: fmt.Sprintf("func %v returns more then two values", name), + } + } + + // If func is method on an env, first argument should be a receiver, + // and actual arguments less than fnNumIn by one. + fnNumIn := fn.NumIn() + if method { + fnNumIn-- + } + // Skip first argument in case of the receiver. + fnInOffset := 0 + if method { + fnInOffset = 1 + } + + if fn.IsVariadic() { + if len(arguments) < fnNumIn-1 { + return anyType, &file.Error{ + Location: node.Location(), + Message: fmt.Sprintf("not enough arguments to call %v", name), + } + } + } else { + if len(arguments) > fnNumIn { + return anyType, &file.Error{ + Location: node.Location(), + Message: fmt.Sprintf("too many arguments to call %v", name), + } + } + if len(arguments) < fnNumIn { + return anyType, &file.Error{ + Location: node.Location(), + Message: fmt.Sprintf("not enough arguments to call %v", name), + } + } + } + + for i, arg := range arguments { + t, _ := v.visit(arg) + + var in reflect.Type + if fn.IsVariadic() && i >= fnNumIn-1 { + // For variadic arguments fn(xs ...int), go replaces type of xs (int) with ([]int). + // As we compare arguments one by one, we need underling type. + in = fn.In(fn.NumIn() - 1).Elem() + } else { + in = fn.In(i + fnInOffset) + } + + if isIntegerOrArithmeticOperation(arg) && (isInteger(in) || isFloat(in)) { + t = in + setTypeForIntegers(arg, t) + } + + if t == nil { + continue + } + + if !t.AssignableTo(in) && t.Kind() != reflect.Interface { + return anyType, &file.Error{ + Location: arg.Location(), + Message: fmt.Sprintf("cannot use %v as argument (type %v) to call %v ", t, in, name), + } + } + } + + return fn.Out(0), nil } func (v *visitor) ClosureNode(node *ast.ClosureNode) (reflect.Type, info) { diff --git a/compiler/compiler.go b/compiler/compiler.go index 917860b09..119ec48f6 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -5,6 +5,7 @@ import ( "reflect" "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/parser" @@ -603,6 +604,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpTrue) c.patchJump(loopBreak) c.emit(OpEnd) + return case "none": c.compile(node.Arguments[0]) @@ -617,6 +619,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpTrue) c.patchJump(loopBreak) c.emit(OpEnd) + return case "any": c.compile(node.Arguments[0]) @@ -630,6 +633,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpFalse) c.patchJump(loopBreak) c.emit(OpEnd) + return case "one": c.compile(node.Arguments[0]) @@ -644,6 +648,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emitPush(1) c.emit(OpEqual) c.emit(OpEnd) + return case "filter": c.compile(node.Arguments[0]) @@ -658,6 +663,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpGetCount) c.emit(OpEnd) c.emit(OpArray) + return case "map": c.compile(node.Arguments[0]) @@ -668,6 +674,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpGetLen) c.emit(OpEnd) c.emit(OpArray) + return case "count": c.compile(node.Arguments[0]) @@ -680,10 +687,18 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { }) c.emit(OpGetCount) c.emit(OpEnd) + return + } - default: - panic(fmt.Sprintf("unknown builtin %v", node.Name)) + if id, ok := builtin.Index[node.Name]; ok { + for _, arg := range node.Arguments { + c.compile(arg) + } + c.emit(OpCallBuiltin, id) + return } + + panic(fmt.Sprintf("unknown builtin %v", node.Name)) } func (c *compiler) emitCond(body func()) { diff --git a/expr_test.go b/expr_test.go index 3cda97fef..e7e432cd8 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1308,34 +1308,6 @@ func TestPatch(t *testing.T) { require.Equal(t, true, output) } -type lengthPatcher struct{} - -func (p *lengthPatcher) Visit(node *ast.Node) { - switch n := (*node).(type) { - case *ast.MemberNode: - if prop, ok := n.Property.(*ast.StringNode); ok && prop.Value == "length" { - ast.Patch(node, &ast.CallNode{ - Callee: &ast.IdentifierNode{Value: "len"}, - Arguments: []ast.Node{n.Node}, - }) - } - } -} - -func TestPatch_length(t *testing.T) { - program, err := expr.Compile( - `String.length == 5`, - expr.Env(mockEnv{}), - expr.Patch(&lengthPatcher{}), - ) - require.NoError(t, err) - - env := mockEnv{String: "hello"} - output, err := expr.Run(program, env) - require.NoError(t, err) - require.Equal(t, true, output) -} - func TestCompile_exposed_error(t *testing.T) { _, err := expr.Compile(`1 == true`) require.Error(t, err) @@ -1864,48 +1836,6 @@ func TestEnv_keyword(t *testing.T) { } -type Bar interface { - Bar() int -} -type Foo interface { - Foo() Bar -} - -type FooImpl struct{} - -func (f FooImpl) Foo() Bar { - return BarImpl{} -} - -type BarImpl struct{} - -// Aba is a special method that is not part of the Bar interface, -// but is used to test that the correct method is called. "Aba" name -// is chosen to be before "Bar" in the alphabet. -func (b BarImpl) Aba() bool { - return true -} - -func (b BarImpl) Bar() int { - return 42 -} - -func TestEval_interface_method(t *testing.T) { - require.True(t, BarImpl{}.Aba()) - require.True(t, BarImpl{}.Bar() == 42) - - env := map[string]interface{}{ - "var": FooImpl{}, - } - p, err := expr.Compile(`var.Foo().Bar()`, expr.Env(env)) - - assert.NoError(t, err) - - out, err := expr.Run(p, env) - assert.NoError(t, err) - assert.Equal(t, 42, out) -} - // Mock types type mockEnv struct { diff --git a/parser/parser.go b/parser/parser.go index ac54e29b3..0792ead1c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -7,6 +7,7 @@ import ( "unicode/utf8" . "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" . "github.com/antonmedv/expr/parser/lexer" ) @@ -57,11 +58,9 @@ var binaryOperators = map[string]operator{ "??": {500, left}, } -type builtin struct { +var predicates = map[string]struct { arity int -} - -var builtins = map[string]builtin{ +}{ "all": {2}, "none": {2}, "any": {2}, @@ -355,7 +354,7 @@ func (p *parser) parseCall(token Token) Node { if p.current.Is(Bracket, "(") { var arguments []Node - if b, ok := builtins[token.Value]; ok { + if b, ok := predicates[token.Value]; ok { p.expect(Bracket, "(") if b.arity == 1 { arguments = make([]Node, 1) @@ -373,6 +372,12 @@ func (p *parser) parseCall(token Token) Node { Arguments: arguments, } node.SetLocation(token.Location) + } else if _, ok := builtin.Index[token.Value]; ok { + node = &BuiltinNode{ + Name: token.Value, + Arguments: p.parseArguments(), + } + node.SetLocation(token.Location) } else { callee := &IdentifierNode{Value: token.Value} callee.SetLocation(token.Location) @@ -588,13 +593,21 @@ func (p *parser) parsePipe(node Node) Node { arguments := []Node{node} - if b, ok := builtins[identifier.Value]; ok { + if b, ok := predicates[identifier.Value]; ok { p.expect(Bracket, "(") if b.arity == 2 { arguments = append(arguments, p.parseClosure()) } p.expect(Bracket, ")") + node = &BuiltinNode{ + Name: identifier.Value, + Arguments: arguments, + } + node.SetLocation(identifier.Location) + } else if _, ok := builtin.Index[identifier.Value]; ok { + arguments = append(arguments, p.parseArguments()...) + node = &BuiltinNode{ Name: identifier.Value, Arguments: arguments, diff --git a/parser/parser_test.go b/parser/parser_test.go index 4c162224c..256024e0d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -265,8 +265,8 @@ func TestParse(t *testing.T) { }, { "len(foo)", - &CallNode{ - Callee: &IdentifierNode{Value: "len"}, + &BuiltinNode{ + Name: "len", Arguments: []Node{ &IdentifierNode{Value: "foo"}, }, @@ -644,8 +644,8 @@ func TestParse_pipe_operator(t *testing.T) { expect := &CallNode{ Callee: &IdentifierNode{Value: "Foo"}, Arguments: []Node{ - &CallNode{ - Callee: &IdentifierNode{Value: "len"}, + &BuiltinNode{ + Name: "len", Arguments: []Node{ &BuiltinNode{ Name: "map", diff --git a/repl/repl.go b/repl/repl.go index 280df9108..9072555a5 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -2,37 +2,67 @@ package main import ( "fmt" + "strings" "github.com/antonmedv/expr" + "github.com/antonmedv/expr/vm" "github.com/chzyer/readline" ) func main() { - rl, err := readline.New("> ") + rl, err := readline.NewEx(&readline.Config{ + Prompt: "> ", + AutoComplete: readline.NewPrefixCompleter( + readline.PcItem("exit"), + readline.PcItem("opcodes"), + readline.PcItem("len"), + readline.PcItem("abs"), + readline.PcItem("int"), + readline.PcItem("float"), + readline.PcItem("map"), + readline.PcItem("filter"), + readline.PcItem("all"), + readline.PcItem("any"), + readline.PcItem("none"), + readline.PcItem("one"), + readline.PcItem("count"), + readline.PcItem("sum"), + ), + }) if err != nil { panic(err) } defer rl.Close() + var program *vm.Program for { line, err := rl.Readline() if err != nil { // io.EOF when Ctrl-D is pressed break } - + line = strings.TrimSpace(line) if line == "exit" { break } + if line == "opcodes" { + if program == nil { + fmt.Println("no program") + continue + } + fmt.Println(program.Disassemble()) + continue + } - result := evaluate(line) - fmt.Println(result) - } -} - -func evaluate(input string) string { - result, err := expr.Eval(input, nil) - if err != nil { - return err.Error() + program, err = expr.Compile(line, expr.Env(nil)) + if err != nil { + fmt.Printf("compile error: %s\n", err) + continue + } + output, err := expr.Run(program, nil) + if err != nil { + fmt.Printf("runtime error: %s\n", err) + continue + } + fmt.Println(output) } - return fmt.Sprintf("%v", result) } diff --git a/test/interface_method/interface_method_test.go b/test/interface_method/interface_method_test.go new file mode 100644 index 000000000..44d765f04 --- /dev/null +++ b/test/interface_method/interface_method_test.go @@ -0,0 +1,48 @@ +package interface_method_test + +import ( + "testing" + + "github.com/antonmedv/expr" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type Bar interface { + Bar() int +} + +type FooImpl struct{} + +func (f FooImpl) Foo() Bar { + return BarImpl{} +} + +type BarImpl struct{} + +// Aba is a special method that is not part of the Bar interface, +// but is used to test that the correct method is called. "Aba" name +// is chosen to be before "Bar" in the alphabet. +func (b BarImpl) Aba() bool { + return true +} + +func (b BarImpl) Bar() int { + return 42 +} + +func TestInterfaceMethod(t *testing.T) { + require.True(t, BarImpl{}.Aba()) + require.True(t, BarImpl{}.Bar() == 42) + + env := map[string]interface{}{ + "var": FooImpl{}, + } + p, err := expr.Compile(`var.Foo().Bar()`, expr.Env(env)) + + assert.NoError(t, err) + + out, err := expr.Run(p, env) + assert.NoError(t, err) + assert.Equal(t, 42, out) +} diff --git a/test/patch/patch_test.go b/test/patch/patch_test.go new file mode 100644 index 000000000..cc7b3fd5d --- /dev/null +++ b/test/patch/patch_test.go @@ -0,0 +1,38 @@ +package patch_test + +import ( + "testing" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/test/mock" + "github.com/stretchr/testify/require" +) + +type lengthPatcher struct{} + +func (p *lengthPatcher) Visit(node *ast.Node) { + switch n := (*node).(type) { + case *ast.MemberNode: + if prop, ok := n.Property.(*ast.StringNode); ok && prop.Value == "length" { + ast.Patch(node, &ast.BuiltinNode{ + Name: "len", + Arguments: []ast.Node{n.Node}, + }) + } + } +} + +func TestPatch_length(t *testing.T) { + program, err := expr.Compile( + `String.length == 5`, + expr.Env(mock.Env{}), + expr.Patch(&lengthPatcher{}), + ) + require.NoError(t, err) + + env := mock.Env{String: "hello"} + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, output) +} diff --git a/vm/opcodes.go b/vm/opcodes.go index 70c788b42..985af1df7 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -57,6 +57,7 @@ const ( OpCallN OpCallFast OpCallTyped + OpCallBuiltin OpArray OpMap OpLen diff --git a/vm/program.go b/vm/program.go index 3212449c8..be0fd59b7 100644 --- a/vm/program.go +++ b/vm/program.go @@ -9,6 +9,7 @@ import ( "text/tabwriter" "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/vm/runtime" ) @@ -63,6 +64,9 @@ func (program *Program) Disassemble() string { } _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, c) } + builtin := func(label string) { + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Builtins[arg].Name) + } switch op { case OpInvalid: @@ -228,6 +232,9 @@ func (program *Program) Disassemble() string { signature := reflect.TypeOf(FuncTypes[arg]).Elem().String() _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, "OpCallTyped", arg, signature) + case OpCallBuiltin: + builtin("OpCallBuiltin") + case OpArray: code("OpArray") diff --git a/vm/vm.go b/vm/vm.go index 4509a1f3f..70f0ddca5 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -8,6 +8,7 @@ import ( "regexp" "strings" + "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/vm/runtime" ) @@ -380,6 +381,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) out := vm.call(fn, arg) vm.push(out) + case OpCallBuiltin: + vm.push(builtin.Builtins[arg].Builtin1(vm.pop())) + case OpArray: size := vm.pop().(int) array := make([]interface{}, size) From 47093a6b75cc27f00d1074794597f16ac2a3130d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 11:35:59 +0200 Subject: [PATCH 034/506] Refactor expr_test.go --- checker/checker.go | 3 + expr_test.go | 480 ++++++++++++---------------------------- test/mock/mock.go | 105 ++++++++- test/time/time_test.go | 102 +++++++++ vm/runtime/generated.go | 2 + vm/vm_test.go | 89 -------- 6 files changed, 345 insertions(+), 436 deletions(-) create mode 100644 test/time/time_test.go diff --git a/checker/checker.go b/checker/checker.go index bd2557507..8cd2f2b93 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -262,6 +262,9 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { if isTime(l) && isTime(r) { return durationType, info{} } + if isTime(l) && isDuration(r) { + return timeType, info{} + } if or(l, r, isNumber, isTime) { return anyType, info{} } diff --git a/expr_test.go b/expr_test.go index e7e432cd8..481cda37d 100644 --- a/expr_test.go +++ b/expr_test.go @@ -4,13 +4,13 @@ import ( "encoding/json" "fmt" "reflect" - "strings" "testing" "time" "github.com/antonmedv/expr" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/file" + "github.com/antonmedv/expr/test/mock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -411,7 +411,7 @@ func ExampleAllowUndefinedVariables_zero_value_functions() { code := `words == "" ? Split("foo,bar", ",") : Split(words, ",")` // Env is map[string]string type on which methods are defined. - env := mockMapStringStringEnv{} + env := mock.MapStringStringEnv{} options := []expr.Option{ expr.Env(env), @@ -434,6 +434,18 @@ func ExampleAllowUndefinedVariables_zero_value_functions() { // Output: [foo bar] } +type patcher struct{} + +func (p *patcher) Visit(node *ast.Node) { + switch n := (*node).(type) { + case *ast.MemberNode: + ast.Patch(node, &ast.CallNode{ + Callee: &ast.IdentifierNode{Value: "get"}, + Arguments: []ast.Node{n.Node, n.Property}, + }) + } +} + func ExamplePatch() { /* type patcher struct{} @@ -476,13 +488,13 @@ func ExamplePatch() { } func TestOperator_struct(t *testing.T) { - env := &mockEnv{ - BirthDay: time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC), + env := mock.Env{ + Time: time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC), } - code := `BirthDay == "2017-10-23"` + code := `Time == "2017-10-23"` - program, err := expr.Compile(code, expr.Env(&mockEnv{}), expr.Operator("==", "DateEqual")) + program, err := expr.Compile(code, expr.Env(mock.Env{}), expr.Operator("==", "TimeEqualString")) require.NoError(t, err) output, err := expr.Run(program, env) @@ -491,28 +503,26 @@ func TestOperator_struct(t *testing.T) { } func TestOperator_options_another_order(t *testing.T) { - code := `BirthDay == "2017-10-23"` - _, err := expr.Compile(code, expr.Operator("==", "DateEqual"), expr.Env(&mockEnv{})) + code := `Time == "2017-10-23"` + _, err := expr.Compile(code, expr.Operator("==", "TimeEqualString"), expr.Env(&mock.Env{})) require.NoError(t, err) } func TestOperator_no_env(t *testing.T) { code := `BirthDay == "2017-10-23"` require.Panics(t, func() { - _, _ = expr.Compile(code, expr.Operator("==", "DateEqual")) + _, _ = expr.Compile(code, expr.Operator("==", "TimeEqualString")) }) } func TestOperator_interface(t *testing.T) { - env := &mockEnv{ - Ticket: &ticket{Price: 100}, - } + env := mock.Env{} - code := `Ticket == "$100" && "$100" == Ticket && Now != Ticket && Now == Now` + code := `Foo == "Foo.String" && "Foo.String" == Foo && Time != Foo && Time == Time` program, err := expr.Compile( code, - expr.Env(&mockEnv{}), + expr.Env(&mock.Env{}), expr.Operator("==", "StringerStringEqual", "StringStringerEqual", "StringerStringerEqual"), expr.Operator("!=", "NotStringerStringEqual", "NotStringStringerEqual", "NotStringerStringerEqual"), ) @@ -543,49 +553,57 @@ func TestExpr_readme_example(t *testing.T) { func TestExpr(t *testing.T) { date := time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC) - timeNow := time.Now() oneDay, _ := time.ParseDuration("24h") - timeNowPlusOneDay := timeNow.Add(oneDay) - - env := &mockEnv{ - Any: "any", - Int: 0, - Int32: 0, - Int64: 0, - Uint64: 0, - Float64: 0, - Bool: true, - String: "string", - Array: []int{1, 2, 3, 4, 5}, - Ticket: &ticket{ - Price: 100, - }, - Passengers: &passengers{ - Adults: 1, - }, - Segments: []*segment{ - {Origin: "MOW", Destination: "LED"}, - {Origin: "LED", Destination: "MOW"}, - }, - BirthDay: date, - Now: timeNow, - NowPlusOne: timeNowPlusOneDay, - OneDayDuration: oneDay, - One: 1, - Two: 2, - Three: 3, - MultiDimArray: [][]int{{1, 2, 3}, {1, 2, 3}}, - Sum: func(list []int) int { - var ret int - for _, el := range list { - ret += el + timeNowPlusOneDay := date.Add(oneDay) + + env := mock.Env{ + Embed: mock.Embed{}, + Ambiguous: "", + Any: nil, + Bool: true, + Float: 0, + Int64: 0, + Int32: 0, + Int: 0, + One: 1, + Two: 2, + Uint32: 0, + String: "string", + BoolPtr: nil, + FloatPtr: nil, + IntPtr: nil, + IntPtrPtr: nil, + StringPtr: nil, + Foo: mock.Foo{ + Value: "foo", + Bar: mock.Bar{ + Baz: "baz", + }, + }, + Abstract: nil, + ArrayOfAny: nil, + ArrayOfInt: []int{1, 2, 3, 4, 5}, + ArrayOfFoo: nil, + MapOfFoo: nil, + MapOfAny: nil, + FuncParam: nil, + FuncParamAny: nil, + FuncTooManyReturns: nil, + FuncNamed: nil, + NilAny: nil, + NilFn: nil, + NilStruct: nil, + Variadic: func(head int, xs ...int) bool { + sum := 0 + for _, x := range xs { + sum += x } - return ret + return head == sum }, - Inc: func(a int) int { return a + 1 }, - Nil: nil, - Tweets: []tweet{{"Oh My God!", date}, {"How you doin?", date}, {"Could I be wearing any more clothes?", date}}, - Lowercase: "lowercase", + Fast: nil, + Time: date, + TimePlusDay: timeNowPlusOneDay, + Duration: oneDay, } tests := []struct { @@ -697,7 +715,7 @@ func TestExpr(t *testing.T) { true, }, { - `1 in [1, 2, 3] && "foo" in {foo: 0, bar: 1} && "Price" in Ticket`, + `1 in [1, 2, 3] && "foo" in {foo: 0, bar: 1} && "Bar" in Foo`, true, }, { @@ -745,20 +763,20 @@ func TestExpr(t *testing.T) { 5, }, { - `Ticket.Price`, - 100, + `Foo.Bar.Baz`, + "baz", }, { `Add(10, 5) + GetInt()`, 15, }, { - `Ticket.String()`, - `$100`, + `Foo.Method().Baz`, + `baz (from Foo.Method)`, }, { - `Ticket.PriceDiv(25)`, - 4, + `Foo.MethodWithArgs("prefix ")`, + "prefix foo", }, { `len([1, 2, 3])`, @@ -777,7 +795,7 @@ func TestExpr(t *testing.T) { 12, }, { - `len(Array)`, + `len(ArrayOfInt)`, 5, }, { @@ -824,102 +842,70 @@ func TestExpr(t *testing.T) { `count(1..30, {# % 3 == 0})`, 10, }, - { - `Now.After(BirthDay)`, - true, - }, { `"a" < "b"`, true, }, { - `Now.Sub(Now).String() == Duration("0s").String()`, + `Time.Sub(Time).String() == "0s"`, true, }, - { - `8.5 * Passengers.Adults * len(Segments)`, - float64(17), - }, { `1 + 1`, 2, }, { - `(One * Two) * Three == One * (Two * Three)`, + `(One * Two) * 3 == One * (Two * 3)`, true, }, { - `Array[0]`, - 1, - }, - { - `Sum(Array)`, - 15, + `ArrayOfInt[1]`, + 2, }, { - `Array[0] < Array[1]`, + `ArrayOfInt[0] < ArrayOfInt[1]`, true, }, { - `Sum(MultiDimArray[0])`, - 6, - }, - { - `Sum(MultiDimArray[0]) + Sum(MultiDimArray[1])`, - 12, - }, - { - `Inc(Array[0] + Array[1])`, - 4, - }, - { - `Array[0] + Array[1]`, - 3, - }, - { - `Array[-1]`, + `ArrayOfInt[-1]`, 5, }, { - `Array[1:2]`, + `ArrayOfInt[1:2]`, []int{2}, }, { - `Array[1:4]`, + `ArrayOfInt[1:4]`, []int{2, 3, 4}, }, { - `Array[-4:-1]`, + `ArrayOfInt[-4:-1]`, []int{2, 3, 4}, }, { - `Array[:3]`, + `ArrayOfInt[:3]`, []int{1, 2, 3}, }, { - `Array[3:]`, + `ArrayOfInt[3:]`, []int{4, 5}, }, { - `Array[0:5] == Array`, + `ArrayOfInt[0:5] == ArrayOfInt`, true, }, { - `Array[0:] == Array`, + `ArrayOfInt[0:] == ArrayOfInt`, true, }, { - `Array[:5] == Array`, + `ArrayOfInt[:5] == ArrayOfInt`, true, }, { - `Array[:] == Array`, + `ArrayOfInt[:] == ArrayOfInt`, true, }, - { - `1 + 2 + Three`, - 6, - }, { `4 in 5..1`, false, @@ -928,16 +914,12 @@ func TestExpr(t *testing.T) { `4..0`, []int{}, }, - { - `MapArg({foo: "bar"})`, - "bar", - }, { `NilStruct`, - (*time.Time)(nil), + (*mock.Foo)(nil), }, { - `Nil == nil && nil == Nil && nil == nil && Nil == Nil && NilInt == nil && NilSlice == nil && NilStruct == nil`, + `NilAny == nil && nil == NilAny && nil == nil && NilAny == NilAny && NilInt == nil && NilSlice == nil && NilStruct == nil`, true, }, { @@ -945,12 +927,12 @@ func TestExpr(t *testing.T) { false, }, { - `Variadic("head", 1, 2, 3)`, - []int{1, 2, 3}, + `Variadic(6, 1, 2, 3)`, + true, }, { - `Variadic("empty")`, - []int{}, + `Variadic(0)`, + true, }, { `String[:]`, @@ -973,98 +955,75 @@ func TestExpr(t *testing.T) { "", }, { - `Float(0)`, - float64(0), - }, - { - `map(filter(Tweets, {len(.Text) > 10}), {Format(.Date)})`, - []interface{}{"23 Oct 17 18:30 UTC", "23 Oct 17 18:30 UTC"}, - }, - { - `Concat("a", 1, [])`, - `a1[]`, + `map(filter(ArrayOfInt, # >= 3), # + 1)`, + []interface{}{4, 5, 6}, }, { - `Tweets[0].Date < Now`, + `Time < Time + Duration`, true, }, { - `Now > Tweets[0].Date`, + `Time + Duration > Time`, true, }, { - `Now == Now`, + `Time == Time`, true, }, { - `Now >= Now`, + `Time >= Time`, true, }, { - `Now <= Now`, + `Time <= Time`, true, }, { - `Now == NowPlusOne`, + `Time == Time + Duration`, false, }, { - `Now != Now`, + `Time != Time`, false, }, { - `Now != NowPlusOne`, - true, - }, - { - `NowPlusOne - Now`, - oneDay, - }, - { - `Now + OneDayDuration`, - timeNowPlusOneDay, - }, - { - `OneDayDuration + Now`, - timeNowPlusOneDay, - }, - { - `lowercase`, - "lowercase", + `TimePlusDay - Duration`, + date, }, { - `1 /* one*/ + 2 /* two */`, + `1 /* one */ + 2 // two`, 3, }, } for _, tt := range tests { - program, err := expr.Compile(tt.code, expr.Env(&mockEnv{})) - require.NoError(t, err, "compile error") - - got, err := expr.Run(program, env) - require.NoError(t, err, "execution error") + t.Run(tt.code, func(t *testing.T) { + tt := tt + program, err := expr.Compile(tt.code, expr.Env(mock.Env{})) + require.NoError(t, err, "compile error") - assert.Equal(t, tt.want, got, tt.code) + got, err := expr.Run(program, env) + require.NoError(t, err, "run error") + assert.Equal(t, tt.want, got) + }) } - for _, tt := range tests { - if tt.code == `-Int64 == 0` { + t.Run(tt.code, func(t *testing.T) { + tt := tt program, err := expr.Compile(tt.code, expr.Optimize(false)) - require.NoError(t, err, "compile error") + require.NoError(t, err, "unoptimized") got, err := expr.Run(program, env) - require.NoError(t, err, "run error") - assert.Equal(t, tt.want, got, "unoptimized: "+tt.code) - } + require.NoError(t, err, "unoptimized") + assert.Equal(t, tt.want, got, "unoptimized") + }) } - for _, tt := range tests { t.Run(tt.code, func(t *testing.T) { + tt := tt got, err := expr.Eval(tt.code, env) - require.NoError(t, err, "eval error: "+tt.code) - - assert.Equal(t, tt.want, got, "eval: "+tt.code) + require.NoError(t, err, "eval") + assert.Equal(t, tt.want, got, "eval") }) } } @@ -1146,11 +1105,11 @@ func TestExpr_map_default_values_compile_check(t *testing.T) { input string }{ { - mockMapStringStringEnv{"foo": "bar"}, + mock.MapStringStringEnv{"foo": "bar"}, `Split(foo, sep)`, }, { - mockMapStringIntEnv{"foo": 1}, + mock.MapStringIntEnv{"foo": 1}, `foo / bar`, }, } @@ -1167,7 +1126,7 @@ func TestExpr_calls_with_nil(t *testing.T) { assert.Nil(t, b, "b is not nil") return a == b }, - "is": is{}, + "is": mock.Is{}, } p, err := expr.Compile( @@ -1294,16 +1253,13 @@ func (p *stringerPatcher) Visit(node *ast.Node) { func TestPatch(t *testing.T) { program, err := expr.Compile( - `Ticket == "$100" and "$90" != Ticket + "0"`, - expr.Env(mockEnv{}), - expr.Patch(&stringerPatcher{}), + `Foo == "Foo.String"`, + expr.Env(mock.Env{}), + expr.Patch(&mock.StringerPatcher{}), ) require.NoError(t, err) - env := mockEnv{ - Ticket: &ticket{Price: 100}, - } - output, err := expr.Run(program, env) + output, err := expr.Run(program, mock.Env{}) require.NoError(t, err) require.Equal(t, true, output) } @@ -1584,7 +1540,7 @@ func TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) t.Run("with allow undefined variables", func(t *testing.T) { code := `{'key': 'value'}[Key]` - env := mockMapStringStringEnv{} + env := mock.MapStringStringEnv{} options := []expr.Option{ expr.AllowUndefinedVariables(), } @@ -1835,163 +1791,3 @@ func TestEnv_keyword(t *testing.T) { } } - -// Mock types - -type mockEnv struct { - Any interface{} - Int, One, Two, Three int - Int32 int32 - Int64 int64 - Uint64 uint64 - Float64 float64 - Bool bool - String string - Array []int - MultiDimArray [][]int - Sum func(list []int) int - Inc func(int) int - Ticket *ticket - Passengers *passengers - Segments []*segment - BirthDay time.Time - Now time.Time - NowPlusOne time.Time - OneDayDuration time.Duration - Nil interface{} - NilStruct *time.Time - NilInt *int - NilSlice []ticket - Tweets []tweet - Lowercase string `expr:"lowercase"` -} - -func (e *mockEnv) GetInt() int { - return e.Int -} - -func (*mockEnv) Add(a, b int) int { - return a + b -} - -func (*mockEnv) Duration(s string) time.Duration { - d, err := time.ParseDuration(s) - if err != nil { - panic(err) - } - return d -} - -func (*mockEnv) MapArg(m map[string]interface{}) string { - return m["foo"].(string) -} - -func (*mockEnv) DateEqual(date time.Time, s string) bool { - return date.Format("2006-01-02") == s -} - -func (*mockEnv) StringerStringEqual(f fmt.Stringer, s string) bool { - return f.String() == s -} - -func (*mockEnv) StringStringerEqual(s string, f fmt.Stringer) bool { - return s == f.String() -} - -func (*mockEnv) StringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool { - return f.String() == g.String() -} - -func (*mockEnv) NotStringerStringEqual(f fmt.Stringer, s string) bool { - return f.String() != s -} - -func (*mockEnv) NotStringStringerEqual(s string, f fmt.Stringer) bool { - return s != f.String() -} - -func (*mockEnv) NotStringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool { - return f.String() != g.String() -} - -func (*mockEnv) Variadic(x string, xs ...int) []int { - return xs -} - -func (*mockEnv) Concat(list ...interface{}) string { - out := "" - for _, e := range list { - out += fmt.Sprintf("%v", e) - } - return out -} - -func (*mockEnv) Float(i interface{}) float64 { - switch t := i.(type) { - case int: - return float64(t) - case float64: - return t - default: - panic("unexpected type") - } -} - -func (*mockEnv) Format(t time.Time) string { - return t.Format(time.RFC822) -} - -type ticket struct { - Price int -} - -func (t *ticket) PriceDiv(p int) int { - return t.Price / p -} - -func (t *ticket) String() string { - return fmt.Sprintf("$%v", t.Price) -} - -type passengers struct { - Adults uint32 - Children uint32 - Infants uint32 -} - -type segment struct { - Origin string - Destination string - Date time.Time -} - -type tweet struct { - Text string - Date time.Time -} - -type mockMapStringStringEnv map[string]string - -func (m mockMapStringStringEnv) Split(s, sep string) []string { - return strings.Split(s, sep) -} - -type mockMapStringIntEnv map[string]int - -type is struct{} - -func (is) Nil(a interface{}) bool { - return a == nil -} - -type patcher struct{} - -func (p *patcher) Visit(node *ast.Node) { - switch n := (*node).(type) { - case *ast.MemberNode: - ast.Patch(node, &ast.CallNode{ - Callee: &ast.IdentifierNode{Value: "get"}, - Arguments: []ast.Node{n.Node, n.Property}, - }) - } -} diff --git a/test/mock/mock.go b/test/mock/mock.go index f5474eda3..b59293cdd 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -1,6 +1,13 @@ package mock -import "time" +import ( + "fmt" + "reflect" + "strings" + "time" + + "github.com/antonmedv/expr/ast" +) type Env struct { Embed @@ -10,8 +17,11 @@ type Env struct { Float float64 Int64 int64 Int32 int32 - Int int + Int, One, Two int Uint32 uint32 + Uint64 uint64 + Float32 float32 + Float64 float64 String string BoolPtr *bool FloatPtr *float64 @@ -22,17 +32,22 @@ type Env struct { Abstract Abstract ArrayOfAny []interface{} ArrayOfInt []int - ArrayOfFoo []Foo + ArrayOfFoo []*Foo MapOfFoo map[string]Foo MapOfAny map[string]interface{} FuncParam func(_ bool, _ int, _ string) bool FuncParamAny func(_ interface{}) bool FuncTooManyReturns func() (int, int, error) FuncNamed MyFunc + NilAny interface{} + NilInt *int NilFn func() + NilStruct *Foo + NilSlice []interface{} Variadic func(_ int, _ ...int) bool Fast func(...interface{}) interface{} Time time.Time + TimePlusDay time.Time Duration time.Duration } @@ -48,6 +63,42 @@ func (p Env) FuncTyped(_ string) int { return 2023 } +func (p Env) TimeEqualString(a time.Time, s string) bool { + return a.Format("2006-01-02") == s +} + +func (p Env) GetInt() int { + return p.Int +} + +func (Env) Add(a, b int) int { + return a + b +} + +func (Env) StringerStringEqual(f fmt.Stringer, s string) bool { + return f.String() == s +} + +func (Env) StringStringerEqual(s string, f fmt.Stringer) bool { + return s == f.String() +} + +func (Env) StringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool { + return f.String() == g.String() +} + +func (Env) NotStringerStringEqual(f fmt.Stringer, s string) bool { + return f.String() != s +} + +func (Env) NotStringStringerEqual(s string, f fmt.Stringer) bool { + return s != f.String() +} + +func (Env) NotStringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool { + return f.String() != g.String() +} + type Embed struct { EmbedEmbed EmbedString string @@ -62,11 +113,22 @@ type EmbedEmbed struct { } type Foo struct { - Bar Bar + Value string + Bar Bar } func (Foo) Method() Bar { - return Bar{} + return Bar{ + Baz: "baz (from Foo.Method)", + } +} + +func (f Foo) MethodWithArgs(prefix string) string { + return prefix + f.Value +} + +func (Foo) String() string { + return "Foo.String" } type Bar struct { @@ -78,3 +140,36 @@ type Abstract interface { } type MyFunc func(string) int + +var stringer = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() + +type StringerPatcher struct{} + +func (*StringerPatcher) Visit(node *ast.Node) { + t := (*node).Type() + if t == nil { + return + } + if t.Implements(stringer) { + ast.Patch(node, &ast.CallNode{ + Callee: &ast.MemberNode{ + Node: *node, + Property: &ast.StringNode{Value: "String"}, + }, + }) + } +} + +type MapStringStringEnv map[string]string + +func (m MapStringStringEnv) Split(s, sep string) []string { + return strings.Split(s, sep) +} + +type MapStringIntEnv map[string]int + +type Is struct{} + +func (Is) Nil(a interface{}) bool { + return a == nil +} diff --git a/test/time/time_test.go b/test/time/time_test.go new file mode 100644 index 000000000..f6318426f --- /dev/null +++ b/test/time/time_test.go @@ -0,0 +1,102 @@ +package time_test + +import ( + "fmt" + "testing" + "time" + + "github.com/antonmedv/expr/checker" + "github.com/antonmedv/expr/compiler" + "github.com/antonmedv/expr/conf" + "github.com/antonmedv/expr/parser" + "github.com/antonmedv/expr/vm" + "github.com/stretchr/testify/require" +) + +func TestTime(t *testing.T) { + testTime := time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC) + testDuration := time.Duration(1) + + tests := []struct { + a interface{} + b interface{} + op string + want interface{} + wantErr bool + }{ + {a: testTime, b: testTime, op: "<", wantErr: false, want: false}, + {a: testTime, b: testTime, op: ">", wantErr: false, want: false}, + {a: testTime, b: testTime, op: "<=", wantErr: false, want: true}, + {a: testTime, b: testTime, op: ">=", wantErr: false, want: true}, + {a: testTime, b: testTime, op: "==", wantErr: false, want: true}, + {a: testTime, b: testTime, op: "!=", wantErr: false, want: false}, + {a: testTime, b: testTime, op: "-", wantErr: false}, + {a: testTime, b: testDuration, op: "+", wantErr: false}, + {a: testTime, b: testDuration, op: "-", wantErr: false}, + + // error cases + {a: testTime, b: int64(1), op: "<", wantErr: true}, + {a: testTime, b: float64(1), op: "<", wantErr: true}, + {a: testTime, b: testDuration, op: "<", wantErr: true}, + + {a: testTime, b: int64(1), op: ">", wantErr: true}, + {a: testTime, b: float64(1), op: ">", wantErr: true}, + {a: testTime, b: testDuration, op: ">", wantErr: true}, + + {a: testTime, b: int64(1), op: "<=", wantErr: true}, + {a: testTime, b: float64(1), op: "<=", wantErr: true}, + {a: testTime, b: testDuration, op: "<=", wantErr: true}, + + {a: testTime, b: int64(1), op: ">=", wantErr: true}, + {a: testTime, b: float64(1), op: ">=", wantErr: true}, + {a: testTime, b: testDuration, op: ">=", wantErr: true}, + + {a: testTime, b: int64(1), op: "==", wantErr: false, want: false}, + {a: testTime, b: float64(1), op: "==", wantErr: false, want: false}, + {a: testTime, b: testDuration, op: "==", wantErr: false, want: false}, + + {a: testTime, b: int64(1), op: "!=", wantErr: false, want: true}, + {a: testTime, b: float64(1), op: "!=", wantErr: false, want: true}, + {a: testTime, b: testDuration, op: "!=", wantErr: false, want: true}, + + {a: testTime, b: int64(1), op: "-", wantErr: true}, + {a: testTime, b: float64(1), op: "-", wantErr: true}, + + {a: testTime, b: testTime, op: "+", wantErr: true}, + {a: testTime, b: int64(1), op: "+", wantErr: true}, + {a: testTime, b: float64(1), op: "+", wantErr: true}, + {a: testDuration, b: testTime, op: "+", wantErr: false}, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("time helper test `%T %s %T`", tt.a, tt.op, tt.b), func(t *testing.T) { + input := fmt.Sprintf("a %v b", tt.op) + env := map[string]interface{}{ + "a": tt.a, + "b": tt.b, + } + + config := conf.CreateNew() + + tree, err := parser.Parse(input) + require.NoError(t, err) + + _, err = checker.Check(tree, config) + require.NoError(t, err) + + program, err := compiler.Compile(tree, config) + require.NoError(t, err) + + got, err := vm.Run(program, env) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + + if tt.want != nil { + require.Equal(t, tt.want, got) + } + } + }) + } +} diff --git a/vm/runtime/generated.go b/vm/runtime/generated.go index 09a4a200e..011a03325 100644 --- a/vm/runtime/generated.go +++ b/vm/runtime/generated.go @@ -2386,6 +2386,8 @@ func Subtract(a, b interface{}) interface{} { switch y := b.(type) { case time.Time: return x.Sub(y) + case time.Duration: + return x.Add(-y) } } panic(fmt.Sprintf("invalid operation: %T - %T", a, b)) diff --git a/vm/vm_test.go b/vm/vm_test.go index a5f24c29a..499020692 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -5,7 +5,6 @@ import ( "fmt" "reflect" "testing" - "time" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/checker" @@ -134,94 +133,6 @@ func TestRun_Helpers(t *testing.T) { } } -func TestRun_Helpers_Time(t *testing.T) { - testTime := time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC) - testDuration := time.Duration(1) - - tests := []struct { - a interface{} - b interface{} - op string - want interface{} - wantErr bool - }{ - {a: testTime, b: testTime, op: "<", wantErr: false, want: false}, - {a: testTime, b: testTime, op: ">", wantErr: false, want: false}, - {a: testTime, b: testTime, op: "<=", wantErr: false, want: true}, - {a: testTime, b: testTime, op: ">=", wantErr: false, want: true}, - {a: testTime, b: testTime, op: "==", wantErr: false, want: true}, - {a: testTime, b: testTime, op: "!=", wantErr: false, want: false}, - {a: testTime, b: testTime, op: "-", wantErr: false}, - {a: testTime, b: testDuration, op: "+", wantErr: false}, - - // error cases - {a: testTime, b: int64(1), op: "<", wantErr: true}, - {a: testTime, b: float64(1), op: "<", wantErr: true}, - {a: testTime, b: testDuration, op: "<", wantErr: true}, - - {a: testTime, b: int64(1), op: ">", wantErr: true}, - {a: testTime, b: float64(1), op: ">", wantErr: true}, - {a: testTime, b: testDuration, op: ">", wantErr: true}, - - {a: testTime, b: int64(1), op: "<=", wantErr: true}, - {a: testTime, b: float64(1), op: "<=", wantErr: true}, - {a: testTime, b: testDuration, op: "<=", wantErr: true}, - - {a: testTime, b: int64(1), op: ">=", wantErr: true}, - {a: testTime, b: float64(1), op: ">=", wantErr: true}, - {a: testTime, b: testDuration, op: ">=", wantErr: true}, - - {a: testTime, b: int64(1), op: "==", wantErr: false, want: false}, - {a: testTime, b: float64(1), op: "==", wantErr: false, want: false}, - {a: testTime, b: testDuration, op: "==", wantErr: false, want: false}, - - {a: testTime, b: int64(1), op: "!=", wantErr: false, want: true}, - {a: testTime, b: float64(1), op: "!=", wantErr: false, want: true}, - {a: testTime, b: testDuration, op: "!=", wantErr: false, want: true}, - - {a: testTime, b: int64(1), op: "-", wantErr: true}, - {a: testTime, b: float64(1), op: "-", wantErr: true}, - {a: testTime, b: testDuration, op: "-", wantErr: true}, - - {a: testTime, b: testTime, op: "+", wantErr: true}, - {a: testTime, b: int64(1), op: "+", wantErr: true}, - {a: testTime, b: float64(1), op: "+", wantErr: true}, - {a: testDuration, b: testTime, op: "+", wantErr: false}, - } - - for _, tt := range tests { - t.Run(fmt.Sprintf("time helper test `%T %s %T`", tt.a, tt.op, tt.b), func(t *testing.T) { - input := fmt.Sprintf("a %v b", tt.op) - env := map[string]interface{}{ - "a": tt.a, - "b": tt.b, - } - - config := conf.CreateNew() - - tree, err := parser.Parse(input) - require.NoError(t, err) - - _, err = checker.Check(tree, config) - require.NoError(t, err) - - program, err := compiler.Compile(tree, config) - require.NoError(t, err) - - got, err := vm.Run(program, env) - if tt.wantErr { - require.Error(t, err) - } else { - require.NoError(t, err) - - if tt.want != nil { - require.Equal(t, tt.want, got) - } - } - }) - } -} - func TestRun_MemoryBudget(t *testing.T) { input := `map(1..100, {map(1..100, {map(1..100, {0})})})` From dfad27f50781d49a0d06d7bed6f07e0c5bd1801e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 11:40:14 +0200 Subject: [PATCH 035/506] Test fixes --- expr_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/expr_test.go b/expr_test.go index 481cda37d..0f9f27f98 100644 --- a/expr_test.go +++ b/expr_test.go @@ -504,12 +504,12 @@ func TestOperator_struct(t *testing.T) { func TestOperator_options_another_order(t *testing.T) { code := `Time == "2017-10-23"` - _, err := expr.Compile(code, expr.Operator("==", "TimeEqualString"), expr.Env(&mock.Env{})) + _, err := expr.Compile(code, expr.Operator("==", "TimeEqualString"), expr.Env(mock.Env{})) require.NoError(t, err) } func TestOperator_no_env(t *testing.T) { - code := `BirthDay == "2017-10-23"` + code := `Time == "2017-10-23"` require.Panics(t, func() { _, _ = expr.Compile(code, expr.Operator("==", "TimeEqualString")) }) @@ -522,7 +522,7 @@ func TestOperator_interface(t *testing.T) { program, err := expr.Compile( code, - expr.Env(&mock.Env{}), + expr.Env(mock.Env{}), expr.Operator("==", "StringerStringEqual", "StringStringerEqual", "StringerStringerEqual"), expr.Operator("!=", "NotStringerStringEqual", "NotStringStringerEqual", "NotStringerStringerEqual"), ) From 57248060718ebcc46ebefbe4525ea6b57b5d7a78 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 11:48:20 +0200 Subject: [PATCH 036/506] Update patcher documentation --- docs/Visitor-and-Patch.md | 93 ++++++++++----------------------------- 1 file changed, 23 insertions(+), 70 deletions(-) diff --git a/docs/Visitor-and-Patch.md b/docs/Visitor-and-Patch.md index f98418b05..05838dab1 100644 --- a/docs/Visitor-and-Patch.md +++ b/docs/Visitor-and-Patch.md @@ -47,17 +47,31 @@ Specify a visitor to modify the AST with `expr.Patch` function. program, err := expr.Compile(code, expr.Patch(&visitor{})) ``` -For example, we are going to replace the expression `list[-1]` with the `list[len(list)-1]`. +For example, let's pass a context to every function call: ```go +package main + +import ( + "context" + "fmt" + "reflect" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/ast" +) + func main() { env := map[string]interface{}{ - "list": []int{1, 2, 3}, + "foo": func(ctx context.Context, arg int) any { + // ... + }, + "ctx": context.Background(), } - code := `list[-1]` // will output 3 + code := `foo(42)` // will be converted to foo(ctx, 42) - program, err := expr.Compile(code, expr.Env(env), expr.Patch(&patcher{})) + program, err := expr.Compile(code, expr.Env(env), expr.Patch(patcher{})) if err != nil { panic(err) } @@ -71,75 +85,14 @@ func main() { type patcher struct{} -func (p *patcher) Visit(node *ast.Node) { - n, ok := (*node).(*ast.IndexNode) - if !ok { - return - } - unary, ok := n.Index.(*ast.UnaryNode) +var contextType = reflect.TypeOf((*context.Context)(nil)).Elem() + +func (patcher) Visit(node *ast.Node) { + callNode, ok := (*node).(*ast.CallNode) if !ok { return } - if unary.Operator == "-" { - ast.Patch(&n.Index, &ast.BinaryNode{ - Operator: "-", - Left: &ast.BuiltinNode{Name: "len", Arguments: []ast.Node{n.Node}}, - Right: unary.Node, - }) - } - + callNode.Arguments = append([]ast.Node{&ast.IdentifierNode{Value: "ctx"}}, callNode.Arguments...) } -``` - -Type information is also available. In the following example, any struct -implementing the `fmt.Stringer` interface is automatically converted to `string` type. -```go -func main() { - code := `Price == "$100"` - - program, err := expr.Compile(code, expr.Env(Env{}), expr.Patch(&stringerPatcher{})) - if err != nil { - panic(err) - } - - env := Env{100_00} - - output, err := expr.Run(program, env) - if err != nil { - panic(err) - } - fmt.Print(output) -} - -type Env struct { - Price Price -} - -type Price int - -func (p Price) String() string { - return fmt.Sprintf("$%v", int(p)/100) -} - -var stringer = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() - -type stringerPatcher struct{} - -func (p *stringerPatcher) Visit(node *ast.Node) { - t := (*node).Type() - if t == nil { - return - } - if t.Implements(stringer) { - ast.Patch(node, &ast.CallNode{ - Callee: &ast.MemberNode{ - Node: *node, - Field: "String", - Property: &ast.StringNode{Value: "String"}, - }, - }) - } - -} ``` From 23efe7b36c3e627d35e6afaec0d6f45f1ed69601 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 12:05:07 +0200 Subject: [PATCH 037/506] Fix isTime() func --- checker/types.go | 2 +- expr_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/checker/types.go b/checker/types.go index e8f53372c..da8acf41d 100644 --- a/checker/types.go +++ b/checker/types.go @@ -98,7 +98,7 @@ func isTime(t reflect.Type) bool { return true } } - return isAny(t) + return false } func isDuration(t reflect.Type) bool { diff --git a/expr_test.go b/expr_test.go index 0f9f27f98..5e0ec5c8f 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1791,3 +1791,17 @@ func TestEnv_keyword(t *testing.T) { } } + +func TestIssue401(t *testing.T) { + program, err := expr.Compile("(a - b + c) / d", expr.AllowUndefinedVariables()) + require.NoError(t, err, "compile error") + + output, err := expr.Run(program, map[string]interface{}{ + "a": 1, + "b": 2, + "c": 3, + "d": 4, + }) + require.NoError(t, err, "run error") + require.Equal(t, 0.5, output) +} From a4557ba5f3c08f8f2bbace02a866296bde20431e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 12:20:37 +0200 Subject: [PATCH 038/506] Move operator tests --- expr_test.go | 46 ---------------------------- test/operator/operator_test.go | 56 ++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 46 deletions(-) create mode 100644 test/operator/operator_test.go diff --git a/expr_test.go b/expr_test.go index 5e0ec5c8f..16464383f 100644 --- a/expr_test.go +++ b/expr_test.go @@ -487,52 +487,6 @@ func ExamplePatch() { // Output : Hello, you, world! } -func TestOperator_struct(t *testing.T) { - env := mock.Env{ - Time: time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC), - } - - code := `Time == "2017-10-23"` - - program, err := expr.Compile(code, expr.Env(mock.Env{}), expr.Operator("==", "TimeEqualString")) - require.NoError(t, err) - - output, err := expr.Run(program, env) - require.NoError(t, err) - require.Equal(t, true, output) -} - -func TestOperator_options_another_order(t *testing.T) { - code := `Time == "2017-10-23"` - _, err := expr.Compile(code, expr.Operator("==", "TimeEqualString"), expr.Env(mock.Env{})) - require.NoError(t, err) -} - -func TestOperator_no_env(t *testing.T) { - code := `Time == "2017-10-23"` - require.Panics(t, func() { - _, _ = expr.Compile(code, expr.Operator("==", "TimeEqualString")) - }) -} - -func TestOperator_interface(t *testing.T) { - env := mock.Env{} - - code := `Foo == "Foo.String" && "Foo.String" == Foo && Time != Foo && Time == Time` - - program, err := expr.Compile( - code, - expr.Env(mock.Env{}), - expr.Operator("==", "StringerStringEqual", "StringStringerEqual", "StringerStringerEqual"), - expr.Operator("!=", "NotStringerStringEqual", "NotStringStringerEqual", "NotStringerStringerEqual"), - ) - require.NoError(t, err) - - output, err := expr.Run(program, env) - require.NoError(t, err) - require.Equal(t, true, output) -} - func TestExpr_readme_example(t *testing.T) { env := map[string]interface{}{ "greet": "Hello, %v!", diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go new file mode 100644 index 000000000..13ef19128 --- /dev/null +++ b/test/operator/operator_test.go @@ -0,0 +1,56 @@ +package operator_test + +import ( + "testing" + "time" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/test/mock" + "github.com/stretchr/testify/require" +) + +func TestOperator_struct(t *testing.T) { + env := mock.Env{ + Time: time.Date(2017, time.October, 23, 18, 30, 0, 0, time.UTC), + } + + code := `Time == "2017-10-23"` + + program, err := expr.Compile(code, expr.Env(mock.Env{}), expr.Operator("==", "TimeEqualString")) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, output) +} + +func TestOperator_options_another_order(t *testing.T) { + code := `Time == "2017-10-23"` + _, err := expr.Compile(code, expr.Operator("==", "TimeEqualString"), expr.Env(mock.Env{})) + require.NoError(t, err) +} + +func TestOperator_no_env(t *testing.T) { + code := `Time == "2017-10-23"` + require.Panics(t, func() { + _, _ = expr.Compile(code, expr.Operator("==", "TimeEqualString")) + }) +} + +func TestOperator_interface(t *testing.T) { + env := mock.Env{} + + code := `Foo == "Foo.String" && "Foo.String" == Foo && Time != Foo && Time == Time` + + program, err := expr.Compile( + code, + expr.Env(mock.Env{}), + expr.Operator("==", "StringerStringEqual", "StringStringerEqual", "StringerStringerEqual"), + expr.Operator("!=", "NotStringerStringEqual", "NotStringStringerEqual", "NotStringerStringerEqual"), + ) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, output) +} From ae70b655e969cb5daf5a02fec4e79fa01e70a528 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 12:46:08 +0200 Subject: [PATCH 039/506] Add AsAny() --- checker/checker.go | 8 +++++++- checker/checker_test.go | 1 + conf/config.go | 1 + expr.go | 7 +++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/checker/checker.go b/checker/checker.go index 8cd2f2b93..a5864cb33 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -31,9 +31,15 @@ func Check(tree *parser.Tree, config *conf.Config) (t reflect.Type, err error) { } if v.config.Expect != reflect.Invalid { + if v.config.ExpectAny { + if isAny(t) { + return t, nil + } + } + switch v.config.Expect { case reflect.Int, reflect.Int64, reflect.Float64: - if !isNumber(t) && !isAny(t) { + if !isNumber(t) { return nil, fmt.Errorf("expected %v, but got %v", v.config.Expect, t) } default: diff --git a/checker/checker_test.go b/checker/checker_test.go index f62b6d580..70d7b4bc9 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -778,6 +778,7 @@ func TestCheck_cast_to_expected_works_with_interface(t *testing.T) { config := conf.New(Env{}) expr.AsFloat64()(config) + expr.AsAny()(config) _, err = checker.Check(tree, config) require.NoError(t, err) diff --git a/conf/config.go b/conf/config.go index 1ac0fa7d2..33b91372d 100644 --- a/conf/config.go +++ b/conf/config.go @@ -16,6 +16,7 @@ type Config struct { DefaultType reflect.Type Operators OperatorsTable Expect reflect.Kind + ExpectAny bool Optimize bool Strict bool ConstFns map[string]reflect.Value diff --git a/expr.go b/expr.go index 6aa674fb5..1d81226ca 100644 --- a/expr.go +++ b/expr.go @@ -52,6 +52,13 @@ func ConstExpr(fn string) Option { } } +// AsAny tells the compiler to expect any result. +func AsAny() Option { + return func(c *conf.Config) { + c.ExpectAny = true + } +} + // AsKind tells the compiler to expect kind of the result. func AsKind(kind reflect.Kind) Option { return func(c *conf.Config) { From a2a2ff441197b77f06db1766ce4e95466c431988 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 13:06:29 +0200 Subject: [PATCH 040/506] Add string() builtin --- builtin/builtin.go | 16 +++++++++++++--- builtin/builtin_test.go | 4 ++++ builtin/func.go | 4 ++++ builtin/utils.go | 19 ++++++++++++++++++- checker/checker.go | 2 +- conf/config.go | 2 +- repl/repl.go | 26 +++++++++----------------- vm/program.go | 2 +- vm/vm.go | 2 +- 9 files changed, 52 insertions(+), 25 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 32ef76302..8b9019451 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -13,16 +13,21 @@ type Function struct { Validate func(args []reflect.Type) (reflect.Type, error) } -var Index map[string]int +var ( + Index map[string]int + Names []string +) func init() { Index = make(map[string]int) - for i, fn := range Builtins { + Names = make([]string, len(Functions)) + for i, fn := range Functions { Index[fn.Name] = i + Names[i] = fn.Name } } -var Builtins = []*Function{ +var Functions = []*Function{ { Name: "len", Builtin1: Len, @@ -87,4 +92,9 @@ var Builtins = []*Function{ return anyType, fmt.Errorf("invalid argument for float (type %s)", args[0]) }, }, + { + Name: "string", + Builtin1: String, + Types: types(new(func(any interface{}) string)), + }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index dd1907d08..24cfa36c5 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -23,6 +23,9 @@ var tests = []struct { {`float(5)`, 5.0}, {`float(5.5)`, 5.5}, {`float("5.5")`, 5.5}, + {`string(5)`, "5"}, + {`string(5.5)`, "5.5"}, + {`string("5.5")`, "5.5"}, } func TestBuiltin(t *testing.T) { @@ -48,6 +51,7 @@ var errorTests = []struct { {`int(1, 2)`, `invalid number of arguments for int (expected 1, got 2)`}, {`float()`, `invalid number of arguments for float (expected 1, got 0)`}, {`float(1, 2)`, `invalid number of arguments for float (expected 1, got 2)`}, + {`string(1, 2)`, `too many arguments to call string`}, } func TestBuiltinErrors(t *testing.T) { diff --git a/builtin/func.go b/builtin/func.go index f3f5c1208..d9885ef4c 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -167,3 +167,7 @@ func Float(x interface{}) interface{} { panic(fmt.Sprintf("invalid operation: float(%T)", x)) } } + +func String(arg interface{}) interface{} { + return fmt.Sprintf("%v", arg) +} diff --git a/builtin/utils.go b/builtin/utils.go index 64a84b747..be258657f 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -1,6 +1,8 @@ package builtin -import "reflect" +import ( + "reflect" +) var ( anyType = reflect.TypeOf(new(interface{})).Elem() @@ -14,3 +16,18 @@ func kind(t reflect.Type) reflect.Kind { } return t.Kind() } + +func types(types ...interface{}) []reflect.Type { + ts := make([]reflect.Type, len(types)) + for i, t := range types { + t := reflect.TypeOf(t) + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() != reflect.Func { + panic("not a function") + } + ts[i] = t + } + return ts +} diff --git a/checker/checker.go b/checker/checker.go index a5864cb33..c67850d7d 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -639,7 +639,7 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { } if id, ok := builtin.Index[node.Name]; ok { - return v.checkFunction(builtin.Builtins[id], node.Arguments, node) + return v.checkFunction(builtin.Functions[id], node.Arguments, node) } return v.error(node, "unknown builtin %v", node.Name) diff --git a/conf/config.go b/conf/config.go index 33b91372d..ad7f36c1c 100644 --- a/conf/config.go +++ b/conf/config.go @@ -32,7 +32,7 @@ func CreateNew() *Config { Functions: make(map[string]*builtin.Function), Optimize: true, } - for _, f := range builtin.Builtins { + for _, f := range builtin.Functions { c.Functions[f.Name] = f } return c diff --git a/repl/repl.go b/repl/repl.go index 9072555a5..eca5f3987 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -5,29 +5,21 @@ import ( "strings" "github.com/antonmedv/expr" + "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/vm" "github.com/chzyer/readline" ) func main() { + items := []readline.PrefixCompleterInterface{} + for _, name := range builtin.Names { + items = append(items, readline.PcItem(name)) + } + items = append(items, readline.PcItem("exit")) + items = append(items, readline.PcItem("opcodes")) rl, err := readline.NewEx(&readline.Config{ - Prompt: "> ", - AutoComplete: readline.NewPrefixCompleter( - readline.PcItem("exit"), - readline.PcItem("opcodes"), - readline.PcItem("len"), - readline.PcItem("abs"), - readline.PcItem("int"), - readline.PcItem("float"), - readline.PcItem("map"), - readline.PcItem("filter"), - readline.PcItem("all"), - readline.PcItem("any"), - readline.PcItem("none"), - readline.PcItem("one"), - readline.PcItem("count"), - readline.PcItem("sum"), - ), + Prompt: "> ", + AutoComplete: readline.NewPrefixCompleter(items...), }) if err != nil { panic(err) diff --git a/vm/program.go b/vm/program.go index be0fd59b7..dd3c0fae5 100644 --- a/vm/program.go +++ b/vm/program.go @@ -65,7 +65,7 @@ func (program *Program) Disassemble() string { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, c) } builtin := func(label string) { - _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Builtins[arg].Name) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Functions[arg].Name) } switch op { diff --git a/vm/vm.go b/vm/vm.go index 70f0ddca5..aa6191859 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -382,7 +382,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(out) case OpCallBuiltin: - vm.push(builtin.Builtins[arg].Builtin1(vm.pop())) + vm.push(builtin.Functions[arg].Builtin1(vm.pop())) case OpArray: size := vm.pop().(int) From 0c26c2694154ef2cc0af2dbc951cac912c8ef58d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 13:28:27 +0200 Subject: [PATCH 041/506] Better autocomplete to repl --- repl/repl.go | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/repl/repl.go b/repl/repl.go index eca5f3987..453c70531 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -11,15 +11,19 @@ import ( ) func main() { - items := []readline.PrefixCompleterInterface{} - for _, name := range builtin.Names { - items = append(items, readline.PcItem(name)) + extra := []string{ + "exit", + "opcodes", + "map", + "filter", + "all", + "any", + "none", + "one", } - items = append(items, readline.PcItem("exit")) - items = append(items, readline.PcItem("opcodes")) rl, err := readline.NewEx(&readline.Config{ Prompt: "> ", - AutoComplete: readline.NewPrefixCompleter(items...), + AutoComplete: completer{append(builtin.Names, extra...)}, }) if err != nil { panic(err) @@ -58,3 +62,26 @@ func main() { fmt.Println(output) } } + +type completer struct { + words []string +} + +func (c completer) Do(line []rune, pos int) ([][]rune, int) { + var lastWord string + for i := pos - 1; i >= 0; i-- { + if line[i] == ' ' { + break + } + lastWord = string(line[i]) + lastWord + } + + var words [][]rune + for _, word := range c.words { + if strings.HasPrefix(word, lastWord) { + words = append(words, []rune(strings.TrimPrefix(word, lastWord))) + } + } + + return words, len(lastWord) +} From 18e429023d33ff7c1110e1e0d570586a6cd09ffc Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 15:37:06 +0200 Subject: [PATCH 042/506] Add builtin functions --- builtin/builtin.go | 323 ++++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 63 ++++++- builtin/func.go | 22 +++ compiler/compiler.go | 49 +++--- optimizer/optimizer_test.go | 6 +- test/time/time_test.go | 43 +++++ vm/opcodes.go | 2 +- vm/program.go | 4 +- vm/runtime/runtime.go | 2 +- vm/vm.go | 2 +- 10 files changed, 488 insertions(+), 28 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 8b9019451..c0e3582ec 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -1,8 +1,14 @@ package builtin import ( + "encoding/base64" + "encoding/json" "fmt" "reflect" + "strings" + "time" + + "github.com/antonmedv/expr/vm/runtime" ) type Function struct { @@ -97,4 +103,321 @@ var Functions = []*Function{ Builtin1: String, Types: types(new(func(any interface{}) string)), }, + { + Name: "trim", + Func: func(args ...interface{}) (interface{}, error) { + if len(args) == 1 { + return strings.TrimSpace(args[0].(string)), nil + } else if len(args) == 2 { + return strings.Trim(args[0].(string), args[1].(string)), nil + } else { + return nil, fmt.Errorf("invalid number of arguments for trim (expected 1 or 2, got %d)", len(args)) + } + }, + Types: types( + strings.TrimSpace, + strings.Trim, + ), + }, + { + Name: "trimPrefix", + Func: func(args ...interface{}) (interface{}, error) { + return strings.TrimPrefix(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.TrimPrefix), + }, + { + Name: "trimSuffix", + Func: func(args ...interface{}) (interface{}, error) { + return strings.TrimSuffix(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.TrimSuffix), + }, + { + Name: "upper", + Builtin1: func(arg interface{}) interface{} { + return strings.ToUpper(arg.(string)) + }, + Types: types(strings.ToUpper), + }, + { + Name: "lower", + Builtin1: func(arg interface{}) interface{} { + return strings.ToLower(arg.(string)) + }, + Types: types(strings.ToLower), + }, + { + Name: "split", + Func: func(args ...interface{}) (interface{}, error) { + return strings.Split(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.Split), + }, + { + Name: "splitN", + Func: func(args ...interface{}) (interface{}, error) { + return strings.SplitN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil + }, + Types: types(strings.SplitN), + }, + { + Name: "splitAfter", + Func: func(args ...interface{}) (interface{}, error) { + return strings.SplitAfter(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.SplitAfter), + }, + { + Name: "splitAfterN", + Func: func(args ...interface{}) (interface{}, error) { + return strings.SplitAfterN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil + }, + Types: types(strings.SplitAfterN), + }, + { + Name: "replace", + Func: func(args ...interface{}) (interface{}, error) { + if len(args) == 4 { + return strings.Replace(args[0].(string), args[1].(string), args[2].(string), runtime.ToInt(args[3])), nil + } else if len(args) == 3 { + return strings.ReplaceAll(args[0].(string), args[1].(string), args[2].(string)), nil + } else { + return nil, fmt.Errorf("invalid number of arguments for replace (expected 3 or 4, got %d)", len(args)) + } + }, + Types: types( + strings.Replace, + strings.ReplaceAll, + ), + }, + { + Name: "repeat", + Func: func(args ...interface{}) (interface{}, error) { + return strings.Repeat(args[0].(string), runtime.ToInt(args[1])), nil + }, + Types: types(strings.Repeat), + }, + { + Name: "join", + Func: func(args ...interface{}) (interface{}, error) { + glue := "" + if len(args) == 2 { + glue = args[1].(string) + } + switch args[0].(type) { + case []string: + return strings.Join(args[0].([]string), glue), nil + case []interface{}: + var s []string + for _, arg := range args[0].([]interface{}) { + s = append(s, arg.(string)) + } + return strings.Join(s, glue), nil + } + return nil, fmt.Errorf("invalid argument for join (type %s)", reflect.TypeOf(args[0])) + }, + Types: types( + strings.Join, + new(func([]interface{}, string) string), + new(func([]string) string), + new(func([]interface{}) string), + ), + }, + { + Name: "indexOf", + Func: func(args ...interface{}) (interface{}, error) { + return strings.Index(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.Index), + }, + { + Name: "lastIndexOf", + Func: func(args ...interface{}) (interface{}, error) { + return strings.LastIndex(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.LastIndex), + }, + { + Name: "hasPrefix", + Func: func(args ...interface{}) (interface{}, error) { + return strings.HasPrefix(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.HasPrefix), + }, + { + Name: "hasSuffix", + Func: func(args ...interface{}) (interface{}, error) { + return strings.HasSuffix(args[0].(string), args[1].(string)), nil + }, + Types: types(strings.HasSuffix), + }, + { + Name: "max", + Func: Max, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) == 0 { + return anyType, fmt.Errorf("not enough arguments to call max") + } + for _, arg := range args { + switch kind(arg) { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: + default: + return anyType, fmt.Errorf("invalid argument for max (type %s)", arg) + } + } + return args[0], nil + }, + }, + { + Name: "min", + Func: Min, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) == 0 { + return anyType, fmt.Errorf("not enough arguments to call min") + } + for _, arg := range args { + switch kind(arg) { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: + default: + return anyType, fmt.Errorf("invalid argument for min (type %s)", arg) + } + } + return args[0], nil + }, + }, + { + Name: "toJSON", + Func: func(args ...interface{}) (interface{}, error) { + b, err := json.MarshalIndent(args[0], "", " ") + if err != nil { + return nil, err + } + return string(b), nil + }, + Types: types(new(func(interface{}) string)), + }, + { + Name: "fromJSON", + Func: func(args ...interface{}) (interface{}, error) { + var v interface{} + err := json.Unmarshal([]byte(args[0].(string)), &v) + if err != nil { + return nil, err + } + return v, nil + }, + Types: types(new(func(string) interface{})), + }, + { + Name: "toBase64", + Func: func(args ...interface{}) (interface{}, error) { + return base64.StdEncoding.EncodeToString([]byte(args[0].(string))), nil + }, + Types: types(new(func(string) string)), + }, + { + Name: "fromBase64", + Func: func(args ...interface{}) (interface{}, error) { + b, err := base64.StdEncoding.DecodeString(args[0].(string)) + if err != nil { + return nil, err + } + return string(b), nil + }, + Types: types(new(func(string) string)), + }, + { + Name: "now", + Func: func(args ...interface{}) (interface{}, error) { + return time.Now(), nil + }, + Types: types(new(func() time.Time)), + }, + { + Name: "duration", + Func: func(args ...interface{}) (interface{}, error) { + return time.ParseDuration(args[0].(string)) + }, + Types: types(time.ParseDuration), + }, + { + Name: "date", + Func: func(args ...interface{}) (interface{}, error) { + date := args[0].(string) + if len(args) == 2 { + layout := args[1].(string) + return time.Parse(layout, date) + } + if len(args) == 3 { + layout := args[1].(string) + timeZone := args[2].(string) + tz, err := time.LoadLocation(timeZone) + if err != nil { + return nil, err + } + t, err := time.ParseInLocation(layout, date, tz) + if err != nil { + return nil, err + } + return t, nil + } + + layouts := []string{ + time.DateOnly, + time.TimeOnly, + time.DateTime, + time.RFC3339, + time.RFC822, + time.RFC850, + time.RFC1123, + } + for _, layout := range layouts { + t, err := time.Parse(layout, date) + if err == nil { + return t, nil + } + } + return nil, fmt.Errorf("invalid date %s", date) + }, + Types: types( + new(func(string) time.Time), + new(func(string, string) time.Time), + new(func(string, string, string) time.Time), + ), + }, + { + Name: "first", + Func: func(args ...interface{}) (interface{}, error) { + return runtime.Fetch(args[0], 0), nil + }, + Types: types(new(func([]interface{}) interface{})), + }, + { + Name: "last", + Func: func(args ...interface{}) (interface{}, error) { + return runtime.Fetch(args[0], -1), nil + }, + }, + { + Name: "get", + Func: func(args ...interface{}) (out interface{}, err error) { + defer func() { + if r := recover(); r != nil { + return + } + }() + return runtime.Fetch(args[0], args[1]), nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 2 { + return anyType, fmt.Errorf("invalid number of arguments for get (expected 2, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Map, reflect.Struct, reflect.Slice, reflect.Array, reflect.Interface: + return anyType, nil + } + return anyType, fmt.Errorf("cannot get %s from %s", args[1], args[0]) + }, + }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 24cfa36c5..9b36dbe40 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -2,6 +2,7 @@ package builtin_test import ( "testing" + "time" "github.com/antonmedv/expr" "github.com/stretchr/testify/assert" @@ -26,12 +27,63 @@ var tests = []struct { {`string(5)`, "5"}, {`string(5.5)`, "5.5"}, {`string("5.5")`, "5.5"}, + {`trim(" foo ")`, "foo"}, + {`trim("__foo___", "_")`, "foo"}, + {`trimPrefix("prefix_foo", "prefix_")`, "foo"}, + {`trimSuffix("foo_suffix", "_suffix")`, "foo"}, + {`upper("foo")`, "FOO"}, + {`lower("FOO")`, "foo"}, + {`split("foo,bar,baz", ",")`, []string{"foo", "bar", "baz"}}, + {`splitN("foo,bar,baz", ",", 2)`, []string{"foo", "bar,baz"}}, + {`splitAfter("foo,bar,baz", ",")`, []string{"foo,", "bar,", "baz"}}, + {`splitAfterN("foo,bar,baz", ",", 2)`, []string{"foo,", "bar,baz"}}, + {`replace("foo,bar,baz", ",", ";")`, "foo;bar;baz"}, + {`replace("foo,bar,baz,goo", ",", ";", 2)`, "foo;bar;baz,goo"}, + {`repeat("foo", 3)`, "foofoofoo"}, + {`join(ArrayOfString, ",")`, "foo,bar,baz"}, + {`join(ArrayOfString)`, "foobarbaz"}, + {`join(["foo", "bar", "baz"], ",")`, "foo,bar,baz"}, + {`join(["foo", "bar", "baz"])`, "foobarbaz"}, + {`indexOf("foo,bar,baz", ",")`, 3}, + {`lastIndexOf("foo,bar,baz", ",")`, 7}, + {`hasPrefix("foo,bar,baz", "foo")`, true}, + {`hasSuffix("foo,bar,baz", "baz")`, true}, + {`max(1, 2, 3)`, 3}, + {`max(1.5, 2.5, 3.5)`, 3.5}, + {`min(1, 2, 3)`, 1}, + {`min(1.5, 2.5, 3.5)`, 1.5}, + {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, + {`fromJSON("[1, 2, 3]")`, []interface{}{1.0, 2.0, 3.0}}, + {`toBase64("hello")`, "aGVsbG8="}, + {`fromBase64("aGVsbG8=")`, "hello"}, + {`now().Format("2006-01-02T15:04:05Z")`, time.Now().Format("2006-01-02T15:04:05Z")}, + {`duration("1h")`, time.Hour}, + {`date("2006-01-02T15:04:05Z")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)}, + {`date("2006.01.02", "2006.01.02")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)}, + {`first(ArrayOfString)`, "foo"}, + {`first(ArrayOfInt)`, 1}, + {`first(ArrayOfAny)`, 1}, + {`last(ArrayOfString)`, "baz"}, + {`last(ArrayOfInt)`, 3}, + {`last(ArrayOfAny)`, true}, + {`get(ArrayOfString, 1)`, "bar"}, + {`get(ArrayOfString, 99)`, nil}, + {`get(ArrayOfInt, 1)`, 2}, + {`get(ArrayOfInt, -1)`, 3}, + {`get(ArrayOfAny, 1)`, "2"}, + {`get({foo: 1, bar: 2}, "foo")`, 1}, + {`get({foo: 1, bar: 2}, "unknown")`, nil}, } func TestBuiltin(t *testing.T) { + env := map[string]interface{}{ + "ArrayOfString": []string{"foo", "bar", "baz"}, + "ArrayOfInt": []int{1, 2, 3}, + "ArrayOfAny": []interface{}{1, "2", true}, + } for _, test := range tests { t.Run(test.input, func(t *testing.T) { - out, err := expr.Eval(test.input, nil) + out, err := expr.Eval(test.input, env) assert.NoError(t, err) assert.Equal(t, test.want, out) }) @@ -52,6 +104,15 @@ var errorTests = []struct { {`float()`, `invalid number of arguments for float (expected 1, got 0)`}, {`float(1, 2)`, `invalid number of arguments for float (expected 1, got 2)`}, {`string(1, 2)`, `too many arguments to call string`}, + {`trim()`, `not enough arguments to call trim`}, + {`max()`, `not enough arguments to call max`}, + {`max(1, "2")`, `invalid argument for max (type string)`}, + {`min()`, `not enough arguments to call min`}, + {`min(1, "2")`, `invalid argument for min (type string)`}, + {`duration("error")`, `invalid duration`}, + {`date("error")`, `invalid date`}, + {`get()`, `invalid number of arguments for get (expected 2, got 0)`}, + {`get(1, 2)`, `cannot get int from int`}, } func TestBuiltinErrors(t *testing.T) { diff --git a/builtin/func.go b/builtin/func.go index d9885ef4c..54fd383a0 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -4,6 +4,8 @@ import ( "fmt" "reflect" "strconv" + + "github.com/antonmedv/expr/vm/runtime" ) func Len(x interface{}) interface{} { @@ -171,3 +173,23 @@ func Float(x interface{}) interface{} { func String(arg interface{}) interface{} { return fmt.Sprintf("%v", arg) } + +func Max(args ...interface{}) (interface{}, error) { + var max interface{} + for _, arg := range args { + if max == nil || runtime.Less(max, arg) { + max = arg + } + } + return max, nil +} + +func Min(args ...interface{}) (interface{}, error) { + var min interface{} + for _, arg := range args { + if min == nil || runtime.More(min, arg) { + min = arg + } + } + return min, nil +} diff --git a/compiler/compiler.go b/compiler/compiler.go index 119ec48f6..0679edcc7 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -127,16 +127,34 @@ func (c *compiler) addConstant(constant interface{}) int { return p } -func (c *compiler) addFunction(node *ast.CallNode) int { - if node.Func == nil { +// emitFunction adds builtin.Function.Func to the program.Functions and emits call opcode. +func (c *compiler) emitFunction(fn *builtin.Function, argsLen int) { + switch argsLen { + case 0: + c.emit(OpCall0, c.addFunction(fn)) + case 1: + c.emit(OpCall1, c.addFunction(fn)) + case 2: + c.emit(OpCall2, c.addFunction(fn)) + case 3: + c.emit(OpCall3, c.addFunction(fn)) + default: + c.emit(OpLoadFunc, c.addFunction(fn)) + c.emit(OpCallN, argsLen) + } +} + +// addFunction adds builtin.Function.Func to the program.Functions and returns its index. +func (c *compiler) addFunction(fn *builtin.Function) int { + if fn == nil { panic("function is nil") } - if p, ok := c.functionsIndex[node.Func.Name]; ok { + if p, ok := c.functionsIndex[fn.Name]; ok { return p } p := len(c.functions) - c.functions = append(c.functions, node.Func.Func) - c.functionsIndex[node.Func.Name] = p + c.functions = append(c.functions, fn.Func) + c.functionsIndex[fn.Name] = p return p } @@ -564,19 +582,7 @@ func (c *compiler) CallNode(node *ast.CallNode) { c.compile(arg) } if node.Func != nil { - switch len(node.Arguments) { - case 0: - c.emit(OpCall0, c.addFunction(node)) - case 1: - c.emit(OpCall1, c.addFunction(node)) - case 2: - c.emit(OpCall2, c.addFunction(node)) - case 3: - c.emit(OpCall3, c.addFunction(node)) - default: - c.emit(OpLoadFunc, c.addFunction(node)) - c.emit(OpCallN, len(node.Arguments)) - } + c.emitFunction(node.Func, len(node.Arguments)) return } c.compile(node.Callee) @@ -691,10 +697,15 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { } if id, ok := builtin.Index[node.Name]; ok { + f := builtin.Functions[id] for _, arg := range node.Arguments { c.compile(arg) } - c.emit(OpCallBuiltin, id) + if f.Builtin1 != nil { + c.emit(OpCallBuiltin1, id) + } else if f.Func != nil { + c.emitFunction(f, len(node.Arguments)) + } return } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index ba31af56a..0fc9f55bd 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -119,15 +119,15 @@ func TestOptimize_const_range(t *testing.T) { } func TestOptimize_const_expr(t *testing.T) { - tree, err := parser.Parse(`upper("hello")`) + tree, err := parser.Parse(`toUpper("hello")`) require.NoError(t, err) env := map[string]interface{}{ - "upper": strings.ToUpper, + "toUpper": strings.ToUpper, } config := conf.New(env) - config.ConstExpr("upper") + config.ConstExpr("toUpper") err = optimizer.Optimize(&tree.Node, config) require.NoError(t, err) diff --git a/test/time/time_test.go b/test/time/time_test.go index f6318426f..200c821ee 100644 --- a/test/time/time_test.go +++ b/test/time/time_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/antonmedv/expr" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/compiler" "github.com/antonmedv/expr/conf" @@ -100,3 +101,45 @@ func TestTime(t *testing.T) { }) } } + +func TestTime_duration(t *testing.T) { + env := map[string]interface{}{ + "date": time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC), + } + program, err := expr.Compile(`now() - duration("1h") < now() && date + duration("24h") < now()`, expr.Env(env)) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, output) +} + +func TestTime_date(t *testing.T) { + var tests = []struct { + input string + want time.Time + }{ + { + `'2017-10-23' | date()`, + time.Date(2017, 10, 23, 0, 0, 0, 0, time.UTC), + }, + { + `'24.11.1987 20:30' | date("02.01.2006 15:04", "Europe/Zurich")`, + time.Date(1987, 11, 24, 20, 30, 0, 0, time.FixedZone("Europe/Zurich", 3600)), + }, + { + `'24.11.1987 20:30 MSK' | date("02.01.2006 15:04 MST", "Europe/Zurich")`, + time.Date(1987, 11, 24, 20, 30, 0, 0, time.FixedZone("MSK", 0)), + }, + } + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + program, err := expr.Compile(test.input) + require.NoError(t, err) + + output, err := expr.Run(program, nil) + require.NoError(t, err) + require.Truef(t, test.want.Equal(output.(time.Time)), "want %v, got %v", test.want, output) + }) + } +} diff --git a/vm/opcodes.go b/vm/opcodes.go index 985af1df7..1720fd4c2 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -57,7 +57,7 @@ const ( OpCallN OpCallFast OpCallTyped - OpCallBuiltin + OpCallBuiltin1 OpArray OpMap OpLen diff --git a/vm/program.go b/vm/program.go index dd3c0fae5..d6018139d 100644 --- a/vm/program.go +++ b/vm/program.go @@ -232,8 +232,8 @@ func (program *Program) Disassemble() string { signature := reflect.TypeOf(FuncTypes[arg]).Elem().String() _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, "OpCallTyped", arg, signature) - case OpCallBuiltin: - builtin("OpCallBuiltin") + case OpCallBuiltin1: + builtin("OpCallBuiltin1") case OpArray: code("OpArray") diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 92abf16c6..97f61843f 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -264,7 +264,7 @@ func In(needle interface{}, array interface{}) bool { panic(fmt.Sprintf(`operator "in"" not defined on %T`, array)) } -func Len(a interface{}) interface{} { +func Len(a interface{}) int { v := reflect.ValueOf(a) switch v.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: diff --git a/vm/vm.go b/vm/vm.go index aa6191859..0437a4c40 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -381,7 +381,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) out := vm.call(fn, arg) vm.push(out) - case OpCallBuiltin: + case OpCallBuiltin1: vm.push(builtin.Functions[arg].Builtin1(vm.pop())) case OpArray: From 24e1757b1d91d15882ef7965c195f3b0903b61d8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 15:54:34 +0200 Subject: [PATCH 043/506] Fix time constants --- builtin/builtin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index c0e3582ec..19195f183 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -364,9 +364,9 @@ var Functions = []*Function{ } layouts := []string{ - time.DateOnly, - time.TimeOnly, - time.DateTime, + "2006-01-02", + "15:04:05", + "2006-01-02 15:04:05", time.RFC3339, time.RFC822, time.RFC850, From 592dd5f9275276b888afb855efa1f58ea0c87301 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 15:41:10 +0200 Subject: [PATCH 044/506] Improve OpCallTyped performance --- vm/vm.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vm/vm.go b/vm/vm.go index 0437a4c40..51e8bf1c0 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -377,9 +377,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(fn(in...)) case OpCallTyped: - fn := vm.pop() - out := vm.call(fn, arg) - vm.push(out) + vm.push(vm.call(vm.pop(), arg)) case OpCallBuiltin1: vm.push(builtin.Functions[arg].Builtin1(vm.pop())) From 9f2ffce00e62a89de30a361aeb98e714138b986d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 22:13:55 +0200 Subject: [PATCH 045/506] Update docs --- docs/Language-Definition.md | 117 ++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 45514cc54..d6da203ca 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -238,6 +238,123 @@ int("123") == 123 Returns the float value of a number or a string. +### string() + +todo + +### trim() + +todo + +### trimPrefix() + +todo + +### trimSuffix() + +todo + +### upper() + +todo + +### lower() + +todo + +### split() + +todo + +### splitN() + +todo + +### splitAfter() + +todo + +### splitAfterN() + +todo + +### replace() + +todo + +### repeat() + +todo + +### join() + +todo + +### indexOf() + +todo + +### lastIndexOf() + +todo + +### hasPrefix() + +todo + +### hasSuffix() + +todo + +### max() + +todo + +### min() + +todo + +### toJSON() + +todo + +### fromJSON() + +todo + +### toBase64() + +todo + +### fromBase64() + +todo + +### now() + +todo + +### duration() + +todo + +### date() + +todo + +### first() + +todo + +### last() + +todo + +### get() + +todo + + ## Predicate The predicate is an expression that accepts a single argument. To access From 5002d98ec24b365dc289a18889e95e156e9bc77b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 22:44:00 +0200 Subject: [PATCH 046/506] Fix get/first/last --- builtin/builtin.go | 41 +++++++++++- builtin/builtin_test.go | 144 +++++++++++++++++++++------------------- 2 files changed, 114 insertions(+), 71 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 19195f183..cb9399fd5 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -389,15 +389,48 @@ var Functions = []*Function{ { Name: "first", Func: func(args ...interface{}) (interface{}, error) { + defer func() { + if r := recover(); r != nil { + return + } + }() return runtime.Fetch(args[0], 0), nil }, - Types: types(new(func([]interface{}) interface{})), + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments for first (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface: + return anyType, nil + case reflect.Slice, reflect.Array: + return args[0].Elem(), nil + } + return anyType, fmt.Errorf("cannot get first element from %s", args[0]) + }, }, { Name: "last", Func: func(args ...interface{}) (interface{}, error) { + defer func() { + if r := recover(); r != nil { + return + } + }() return runtime.Fetch(args[0], -1), nil }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments for last (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface: + return anyType, nil + case reflect.Slice, reflect.Array: + return args[0].Elem(), nil + } + return anyType, fmt.Errorf("cannot get last element from %s", args[0]) + }, }, { Name: "get", @@ -414,8 +447,12 @@ var Functions = []*Function{ return anyType, fmt.Errorf("invalid number of arguments for get (expected 2, got %d)", len(args)) } switch kind(args[0]) { - case reflect.Map, reflect.Struct, reflect.Slice, reflect.Array, reflect.Interface: + case reflect.Interface: return anyType, nil + case reflect.Slice, reflect.Array: + return args[0].Elem(), nil + case reflect.Map: + return args[0].Elem(), nil } return anyType, fmt.Errorf("cannot get %s from %s", args[1], args[0]) }, diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 9b36dbe40..a18c903ef 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -6,76 +6,79 @@ import ( "github.com/antonmedv/expr" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -var tests = []struct { - input string - want interface{} -}{ - {`len(1..10)`, 10}, - {`len({foo: 1, bar: 2})`, 2}, - {`len("hello")`, 5}, - {`abs(-5)`, 5}, - {`abs(.5)`, .5}, - {`abs(-.5)`, .5}, - {`int(5.5)`, 5}, - {`int(5)`, 5}, - {`int("5")`, 5}, - {`float(5)`, 5.0}, - {`float(5.5)`, 5.5}, - {`float("5.5")`, 5.5}, - {`string(5)`, "5"}, - {`string(5.5)`, "5.5"}, - {`string("5.5")`, "5.5"}, - {`trim(" foo ")`, "foo"}, - {`trim("__foo___", "_")`, "foo"}, - {`trimPrefix("prefix_foo", "prefix_")`, "foo"}, - {`trimSuffix("foo_suffix", "_suffix")`, "foo"}, - {`upper("foo")`, "FOO"}, - {`lower("FOO")`, "foo"}, - {`split("foo,bar,baz", ",")`, []string{"foo", "bar", "baz"}}, - {`splitN("foo,bar,baz", ",", 2)`, []string{"foo", "bar,baz"}}, - {`splitAfter("foo,bar,baz", ",")`, []string{"foo,", "bar,", "baz"}}, - {`splitAfterN("foo,bar,baz", ",", 2)`, []string{"foo,", "bar,baz"}}, - {`replace("foo,bar,baz", ",", ";")`, "foo;bar;baz"}, - {`replace("foo,bar,baz,goo", ",", ";", 2)`, "foo;bar;baz,goo"}, - {`repeat("foo", 3)`, "foofoofoo"}, - {`join(ArrayOfString, ",")`, "foo,bar,baz"}, - {`join(ArrayOfString)`, "foobarbaz"}, - {`join(["foo", "bar", "baz"], ",")`, "foo,bar,baz"}, - {`join(["foo", "bar", "baz"])`, "foobarbaz"}, - {`indexOf("foo,bar,baz", ",")`, 3}, - {`lastIndexOf("foo,bar,baz", ",")`, 7}, - {`hasPrefix("foo,bar,baz", "foo")`, true}, - {`hasSuffix("foo,bar,baz", "baz")`, true}, - {`max(1, 2, 3)`, 3}, - {`max(1.5, 2.5, 3.5)`, 3.5}, - {`min(1, 2, 3)`, 1}, - {`min(1.5, 2.5, 3.5)`, 1.5}, - {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, - {`fromJSON("[1, 2, 3]")`, []interface{}{1.0, 2.0, 3.0}}, - {`toBase64("hello")`, "aGVsbG8="}, - {`fromBase64("aGVsbG8=")`, "hello"}, - {`now().Format("2006-01-02T15:04:05Z")`, time.Now().Format("2006-01-02T15:04:05Z")}, - {`duration("1h")`, time.Hour}, - {`date("2006-01-02T15:04:05Z")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)}, - {`date("2006.01.02", "2006.01.02")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)}, - {`first(ArrayOfString)`, "foo"}, - {`first(ArrayOfInt)`, 1}, - {`first(ArrayOfAny)`, 1}, - {`last(ArrayOfString)`, "baz"}, - {`last(ArrayOfInt)`, 3}, - {`last(ArrayOfAny)`, true}, - {`get(ArrayOfString, 1)`, "bar"}, - {`get(ArrayOfString, 99)`, nil}, - {`get(ArrayOfInt, 1)`, 2}, - {`get(ArrayOfInt, -1)`, 3}, - {`get(ArrayOfAny, 1)`, "2"}, - {`get({foo: 1, bar: 2}, "foo")`, 1}, - {`get({foo: 1, bar: 2}, "unknown")`, nil}, -} - func TestBuiltin(t *testing.T) { + var tests = []struct { + input string + want interface{} + }{ + {`len(1..10)`, 10}, + {`len({foo: 1, bar: 2})`, 2}, + {`len("hello")`, 5}, + {`abs(-5)`, 5}, + {`abs(.5)`, .5}, + {`abs(-.5)`, .5}, + {`int(5.5)`, 5}, + {`int(5)`, 5}, + {`int("5")`, 5}, + {`float(5)`, 5.0}, + {`float(5.5)`, 5.5}, + {`float("5.5")`, 5.5}, + {`string(5)`, "5"}, + {`string(5.5)`, "5.5"}, + {`string("5.5")`, "5.5"}, + {`trim(" foo ")`, "foo"}, + {`trim("__foo___", "_")`, "foo"}, + {`trimPrefix("prefix_foo", "prefix_")`, "foo"}, + {`trimSuffix("foo_suffix", "_suffix")`, "foo"}, + {`upper("foo")`, "FOO"}, + {`lower("FOO")`, "foo"}, + {`split("foo,bar,baz", ",")`, []string{"foo", "bar", "baz"}}, + {`splitN("foo,bar,baz", ",", 2)`, []string{"foo", "bar,baz"}}, + {`splitAfter("foo,bar,baz", ",")`, []string{"foo,", "bar,", "baz"}}, + {`splitAfterN("foo,bar,baz", ",", 2)`, []string{"foo,", "bar,baz"}}, + {`replace("foo,bar,baz", ",", ";")`, "foo;bar;baz"}, + {`replace("foo,bar,baz,goo", ",", ";", 2)`, "foo;bar;baz,goo"}, + {`repeat("foo", 3)`, "foofoofoo"}, + {`join(ArrayOfString, ",")`, "foo,bar,baz"}, + {`join(ArrayOfString)`, "foobarbaz"}, + {`join(["foo", "bar", "baz"], ",")`, "foo,bar,baz"}, + {`join(["foo", "bar", "baz"])`, "foobarbaz"}, + {`indexOf("foo,bar,baz", ",")`, 3}, + {`lastIndexOf("foo,bar,baz", ",")`, 7}, + {`hasPrefix("foo,bar,baz", "foo")`, true}, + {`hasSuffix("foo,bar,baz", "baz")`, true}, + {`max(1, 2, 3)`, 3}, + {`max(1.5, 2.5, 3.5)`, 3.5}, + {`min(1, 2, 3)`, 1}, + {`min(1.5, 2.5, 3.5)`, 1.5}, + {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, + {`fromJSON("[1, 2, 3]")`, []interface{}{1.0, 2.0, 3.0}}, + {`toBase64("hello")`, "aGVsbG8="}, + {`fromBase64("aGVsbG8=")`, "hello"}, + {`now().Format("2006-01-02T15:04:05Z")`, time.Now().Format("2006-01-02T15:04:05Z")}, + {`duration("1h")`, time.Hour}, + {`date("2006-01-02T15:04:05Z")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)}, + {`date("2006.01.02", "2006.01.02")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)}, + {`first(ArrayOfString)`, "foo"}, + {`first(ArrayOfInt)`, 1}, + {`first(ArrayOfAny)`, 1}, + {`first([])`, nil}, + {`last(ArrayOfString)`, "baz"}, + {`last(ArrayOfInt)`, 3}, + {`last(ArrayOfAny)`, true}, + {`last([])`, nil}, + {`get(ArrayOfString, 1)`, "bar"}, + {`get(ArrayOfString, 99)`, nil}, + {`get(ArrayOfInt, 1)`, 2}, + {`get(ArrayOfInt, -1)`, 3}, + {`get(ArrayOfAny, 1)`, "2"}, + {`get({foo: 1, bar: 2}, "foo")`, 1}, + {`get({foo: 1, bar: 2}, "unknown")`, nil}, + } + env := map[string]interface{}{ "ArrayOfString": []string{"foo", "bar", "baz"}, "ArrayOfInt": []int{1, 2, 3}, @@ -83,8 +86,11 @@ func TestBuiltin(t *testing.T) { } for _, test := range tests { t.Run(test.input, func(t *testing.T) { - out, err := expr.Eval(test.input, env) - assert.NoError(t, err) + program, err := expr.Compile(test.input, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) assert.Equal(t, test.want, out) }) } From be61690d48c2d1738c2b4b7c46700ecf3ed87894 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 14 Aug 2023 22:44:08 +0200 Subject: [PATCH 047/506] Update documentation --- docs/Language-Definition.md | 260 +++++++++++++++++++++++++++--------- 1 file changed, 199 insertions(+), 61 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index d6da203ca..7a7ba6f7d 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -53,7 +53,6 @@ - ## Operators @@ -126,8 +125,8 @@ foo matches "^[A-Z].*" ### Membership Operator Fields of structs and items of maps can be accessed with `.` operator -or `[]` operator. Elements of arrays and slices can be accessed with -`[]` operator. Negative indices are supported with `-1` being +or `[]` operator. Elements of arrays and slices can be accessed with +`[]` operator. Negative indices are supported with `-1` being the last element. The `in` operator can be used to check if an item is in an array or a map. @@ -169,7 +168,6 @@ array[3:] == [4, 5] array[:] == array ``` - ## Built-in Functions ### all(array, predicate) @@ -238,122 +236,262 @@ int("123") == 123 Returns the float value of a number or a string. -### string() +### string(v) -todo +Converts the given value `v` into a string representation. -### trim() +```expr +string(123) == "123" +``` -todo +### trim(v[, chars]) -### trimPrefix() +Removes white spaces from both ends of a string `v`. +If the optional `chars` argument is given, it is a string specifying the set of characters to be removed. -todo +```expr +trim(" Hello ") == "Hello" +trim("__Hello__", "_") == "Hello" +``` -### trimSuffix() +### trimPrefix(v, prefix) -todo +Removes the specified prefix from the string `v` if it starts with that prefix. -### upper() +```expr +trimPrefix("HelloWorld", "Hello") == "World" +``` -todo +### trimSuffix(v, suffix) -### lower() +Removes the specified suffix from the string `v` if it ends with that suffix. -todo +```expr +trimSuffix("HelloWorld", "World") == "Hello" +``` -### split() +### upper(v) -todo +Converts all the characters in string `v` to uppercase. -### splitN() +```expr +upper("hello") == "HELLO" +``` -todo +### lower(v) -### splitAfter() +Converts all the characters in string `v` to lowercase. -todo +```expr +lower("HELLO") == "hello" +``` -### splitAfterN() +### split(v, delimiter) -todo +Splits the string `v` at each instance of the delimiter and returns an array of substrings. -### replace() +```expr +split("apple,orange,grape", ",") == ["apple", "orange", "grape"] +``` -todo +### splitN(v, delimiter, n) -### repeat() +Splits the string `v` at each instance of the delimiter but limits the result to `n` substrings. -todo +```expr +splitN("apple,orange,grape", ",", 2) == ["apple", "orange,grape"] +``` -### join() +### splitAfter(v, delimiter) -todo +Splits the string `v` after each instance of the delimiter. -### indexOf() +```expr +splitAfter("apple,orange,grape", ",") == ["apple,", "orange,", "grape"] +``` -todo +### splitAfterN(v, delimiter, n) -### lastIndexOf() +Splits the string `v` after each instance of the delimiter but limits the result to `n` substrings. -todo +```expr +splitAfterN("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"] +``` -### hasPrefix() +### replace(v, old, new) -todo +Replaces all occurrences of `old` in string `v` with `new`. -### hasSuffix() +```expr +replace("Hello World", "World", "Universe") == "Hello Universe" +``` -todo +### repeat(v, n) -### max() +Repeats the string `v` `n` times. -todo +```expr +repeat("Hi", 3) == "HiHiHi" +``` + +### join(v, delimiter) + +Joins an array of strings `v` into a single string with the given delimiter. + +```expr +join(["apple", "orange", "grape"], ",") == "apple,orange,grape" +``` -### min() +### indexOf(v, substring) -todo +Returns the index of the first occurrence of the substring in string `v` or -1 if not found. -### toJSON() +```expr +indexOf("apple pie", "pie") == 6 +``` -todo +### lastIndexOf(v, substring) -### fromJSON() +Returns the index of the last occurrence of the substring in string `v` or -1 if not found. -todo +```expr +lastIndexOf("apple pie apple", "apple") == 10 +``` -### toBase64() +### hasPrefix(v, prefix) -todo +Returns `true` if string `v` starts with the given prefix. -### fromBase64() +```expr +hasPrefix("HelloWorld", "Hello") == true +``` + +### hasSuffix(v, suffix) + +Returns `true` if string `v` ends with the given suffix. + +```expr +hasSuffix("HelloWorld", "World") == true +``` + +### max(v1, v2) + +Returns the maximum of the two values `v1` and `v2`. + +```expr +max(5, 7) == 7 +``` -todo +### min(v1, v2) + +Returns the minimum of the two values `v1` and `v2`. + +```expr +min(5, 7) == 5 +``` + +### toJSON(v) + +Converts the given value `v` to its JSON string representation. + +```expr +toJSON({"name": "John", "age": 30}) +``` + +### fromJSON(v) + +Parses the given JSON string `v` and returns the corresponding value. + +```expr +fromJSON('{"name": "John", "age": 30}') +``` + +### toBase64(v) + +Encodes the string `v` into Base64 format. + +```expr +toBase64("Hello World") == "SGVsbG8gV29ybGQ=" +``` + +### fromBase64(v) + +Decodes the Base64 encoded string `v` back to its original form. + +```expr +fromBase64("SGVsbG8gV29ybGQ=") == "Hello World" +``` ### now() -todo +Returns the current date and time. + +```expr +createdAt > now() - duration(1h) +``` + +### duration(v) + +Returns [time.Duration](https://pkg.go.dev/time#Duration) value of the given string `v`. -### duration() +Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -todo +```expr +duration("1h").Seconds() == 3600 +``` + +### date(v[, format, timezone]) -### date() +Converts the given value `v` into a date representation. -todo +If the optional `format` argument is given, it is a string specifying the format of the date. +The format string uses the same formatting rules as the standard +Go [time package](https://pkg.go.dev/time#pkg-constants). -### first() +If the optional `timezone` argument is given, it is a string specifying the timezone of the date. -todo +If the `format` argument is not given, the `v` argument must be in one of the following formats: -### last() +- 2006-01-02 +- 15:04:05 +- 2006-01-02 15:04:05 +- RFC3339 +- RFC822, +- RFC850, +- RFC1123, -todo +```expr +date("2023-08-14") +date("15:04:05") +date("2023-08-14T00:00:00Z") +date("2023-08-14 00:00:00", "2006-01-02 15:04:05", "Europe/Zurich") +``` -### get() +### first(v) -todo +Returns the first element from an array `v`. If the array is empty, returns `nil`. +```expr +first([1, 2, 3]) == 1 +``` + +### last(v) + +Returns the last element from an array `v`. If the array is empty, returns `nil`. + +```expr +last([1, 2, 3]) == 3 +``` + +### get(v, index) + +Retrieves the element at the specified index from an array or map `v`. If the index is out of range, returns `nil`. +Or the key does not exist, returns `nil`. + +```expr +get([1, 2, 3], 1) == 2 +get({"name": "John", "age": 30}, "name") == "John" +``` ## Predicate From 677dfb506e15dfcb1623ca0e9b5808118212ee79 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 12:54:09 +0200 Subject: [PATCH 048/506] Better type checks for env in get() --- builtin/builtin.go | 26 +++--------- builtin/builtin_test.go | 91 +++++++++++++++++++++++++++++------------ checker/checker.go | 46 ++++++++++++++++++--- checker/checker_test.go | 28 +++++++++++++ expr_test.go | 2 + 5 files changed, 141 insertions(+), 52 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index cb9399fd5..556223420 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -39,7 +39,7 @@ var Functions = []*Function{ Builtin1: Len, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments for len (expected 1, got %d)", len(args)) + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { case reflect.Array, reflect.Map, reflect.Slice, reflect.String, reflect.Interface: @@ -53,7 +53,7 @@ var Functions = []*Function{ Builtin1: Abs, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments for abs (expected 1, got %d)", len(args)) + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: @@ -67,7 +67,7 @@ var Functions = []*Function{ Builtin1: Int, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments for int (expected 1, got %d)", len(args)) + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { case reflect.Interface: @@ -85,7 +85,7 @@ var Functions = []*Function{ Builtin1: Float, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments for float (expected 1, got %d)", len(args)) + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { case reflect.Interface: @@ -398,7 +398,7 @@ var Functions = []*Function{ }, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments for first (expected 1, got %d)", len(args)) + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { case reflect.Interface: @@ -421,7 +421,7 @@ var Functions = []*Function{ }, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments for last (expected 1, got %d)", len(args)) + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { case reflect.Interface: @@ -442,19 +442,5 @@ var Functions = []*Function{ }() return runtime.Fetch(args[0], args[1]), nil }, - Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 2 { - return anyType, fmt.Errorf("invalid number of arguments for get (expected 2, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface: - return anyType, nil - case reflect.Slice, reflect.Array: - return args[0].Elem(), nil - case reflect.Map: - return args[0].Elem(), nil - } - return anyType, fmt.Errorf("cannot get %s from %s", args[1], args[0]) - }, }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index a18c903ef..94a146b8a 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -1,10 +1,15 @@ package builtin_test import ( + "fmt" + "reflect" "testing" "time" "github.com/antonmedv/expr" + "github.com/antonmedv/expr/checker" + "github.com/antonmedv/expr/conf" + "github.com/antonmedv/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -96,32 +101,31 @@ func TestBuiltin(t *testing.T) { } } -var errorTests = []struct { - input string - err string -}{ - {`len()`, `invalid number of arguments for len (expected 1, got 0)`}, - {`len(1)`, `invalid argument for len (type int)`}, - {`abs()`, `invalid number of arguments for abs (expected 1, got 0)`}, - {`abs(1, 2)`, `invalid number of arguments for abs (expected 1, got 2)`}, - {`abs("foo")`, `invalid argument for abs (type string)`}, - {`int()`, `invalid number of arguments for int (expected 1, got 0)`}, - {`int(1, 2)`, `invalid number of arguments for int (expected 1, got 2)`}, - {`float()`, `invalid number of arguments for float (expected 1, got 0)`}, - {`float(1, 2)`, `invalid number of arguments for float (expected 1, got 2)`}, - {`string(1, 2)`, `too many arguments to call string`}, - {`trim()`, `not enough arguments to call trim`}, - {`max()`, `not enough arguments to call max`}, - {`max(1, "2")`, `invalid argument for max (type string)`}, - {`min()`, `not enough arguments to call min`}, - {`min(1, "2")`, `invalid argument for min (type string)`}, - {`duration("error")`, `invalid duration`}, - {`date("error")`, `invalid date`}, - {`get()`, `invalid number of arguments for get (expected 2, got 0)`}, - {`get(1, 2)`, `cannot get int from int`}, -} - -func TestBuiltinErrors(t *testing.T) { +func TestBuiltin_errors(t *testing.T) { + var errorTests = []struct { + input string + err string + }{ + {`len()`, `invalid number of arguments (expected 1, got 0)`}, + {`len(1)`, `invalid argument for len (type int)`}, + {`abs()`, `invalid number of arguments (expected 1, got 0)`}, + {`abs(1, 2)`, `invalid number of arguments (expected 1, got 2)`}, + {`abs("foo")`, `invalid argument for abs (type string)`}, + {`int()`, `invalid number of arguments (expected 1, got 0)`}, + {`int(1, 2)`, `invalid number of arguments (expected 1, got 2)`}, + {`float()`, `invalid number of arguments (expected 1, got 0)`}, + {`float(1, 2)`, `invalid number of arguments (expected 1, got 2)`}, + {`string(1, 2)`, `too many arguments to call string`}, + {`trim()`, `not enough arguments to call trim`}, + {`max()`, `not enough arguments to call max`}, + {`max(1, "2")`, `invalid argument for max (type string)`}, + {`min()`, `not enough arguments to call min`}, + {`min(1, "2")`, `invalid argument for min (type string)`}, + {`duration("error")`, `invalid duration`}, + {`date("error")`, `invalid date`}, + {`get()`, `invalid number of arguments (expected 2, got 0)`}, + {`get(1, 2)`, `type int does not support indexing`}, + } for _, test := range errorTests { t.Run(test.input, func(t *testing.T) { _, err := expr.Eval(test.input, nil) @@ -130,3 +134,38 @@ func TestBuiltinErrors(t *testing.T) { }) } } + +func TestBuiltin_types(t *testing.T) { + env := map[string]interface{}{ + "num": 42, + "str": "foo", + "ArrayOfString": []string{"foo", "bar", "baz"}, + "ArrayOfInt": []int{1, 2, 3}, + } + + tests := []struct { + input string + want reflect.Kind + }{ + {`get(ArrayOfString, 0)`, reflect.String}, + {`get(ArrayOfInt, 0)`, reflect.Int}, + {`first(ArrayOfString)`, reflect.String}, + {`first(ArrayOfInt)`, reflect.Int}, + {`last(ArrayOfString)`, reflect.String}, + {`last(ArrayOfInt)`, reflect.Int}, + {`get(env, 'str')`, reflect.String}, + {`get(env, 'num')`, reflect.Int}, + {`get(env, 'ArrayOfString')`, reflect.Slice}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + tree, err := parser.Parse(test.input) + require.NoError(t, err) + + rtype, err := checker.Check(tree, conf.New(env)) + require.NoError(t, err) + require.True(t, rtype.Kind() == test.want, fmt.Sprintf("expected %s, got %s", test.want, rtype.Kind())) + }) + } +} diff --git a/checker/checker.go b/checker/checker.go index c67850d7d..973786bd1 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -135,6 +135,9 @@ func (v *visitor) NilNode(*ast.NilNode) (reflect.Type, info) { } func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) { + if node.Value == "env" { + return mapType, info{} + } if fn, ok := v.config.Functions[node.Value]; ok { // Return anyType instead of func type as we don't know the arguments yet. // The func type can be one of the fn.Types. The type will be resolved @@ -393,7 +396,9 @@ func (v *visitor) ChainNode(node *ast.ChainNode) (reflect.Type, info) { } func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { + base, _ := v.visit(node.Node) prop, _ := v.visit(node.Property) + if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "env" { // If the index is a constant string, can save some // cycles later by finding the type of its referent @@ -404,7 +409,6 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { } return anyType, info{} } - base, _ := v.visit(node.Node) if name, ok := node.Property.(*ast.StringNode); ok { if base == nil { @@ -503,7 +507,7 @@ func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { if fnInfo.fn != nil { node.Func = fnInfo.fn - return v.checkFunction(fnInfo.fn, node.Arguments, node) + return v.checkFunction(fnInfo.fn, node, node.Arguments) } fnName := "function" @@ -639,13 +643,44 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { } if id, ok := builtin.Index[node.Name]; ok { - return v.checkFunction(builtin.Functions[id], node.Arguments, node) + switch node.Name { + case "get": + return v.checkBuiltinGet(node) + } + return v.checkFunction(builtin.Functions[id], node, node.Arguments) } return v.error(node, "unknown builtin %v", node.Name) } -func (v *visitor) checkFunction(f *builtin.Function, arguments []ast.Node, node ast.Node) (reflect.Type, info) { +func (v *visitor) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { + if len(node.Arguments) != 2 { + return v.error(node, "invalid number of arguments (expected 2, got %d)", len(node.Arguments)) + } + + val := node.Arguments[0] + prop := node.Arguments[1] + if id, ok := val.(*ast.IdentifierNode); ok && id.Value == "env" { + if s, ok := prop.(*ast.StringNode); ok { + return v.config.Types[s.Value].Type, info{} + } + return anyType, info{} + } + + t, _ := v.visit(val) + + switch t.Kind() { + case reflect.Interface: + return anyType, info{} + case reflect.Slice, reflect.Array: + return t.Elem(), info{} + case reflect.Map: + return t.Elem(), info{} + } + return v.error(val, "type %v does not support indexing", t) +} + +func (v *visitor) checkFunction(f *builtin.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { if f.Validate != nil { args := make([]reflect.Type, len(arguments)) for i, arg := range arguments { @@ -656,8 +691,7 @@ func (v *visitor) checkFunction(f *builtin.Function, arguments []ast.Node, node return v.error(node, "%v", err) } return t, info{} - } - if len(f.Types) == 0 { + } else if len(f.Types) == 0 { t, err := v.checkArguments(f.Name, functionType, false, arguments, node) if err != nil { if v.err == nil { diff --git a/checker/checker_test.go b/checker/checker_test.go index 70d7b4bc9..127c7dd57 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -934,3 +934,31 @@ func TestCheck_do_not_override_params_for_functions(t *testing.T) { require.Contains(t, err.Error(), "cannot use int as argument") }) } + +func TestCheck_env_keyword(t *testing.T) { + env := map[string]interface{}{ + "num": 42, + "str": "foo", + "name": "str", + } + + tests := []struct { + input string + want reflect.Kind + }{ + {`env['str']`, reflect.String}, + {`env['num']`, reflect.Int}, + {`env[name]`, reflect.Interface}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + tree, err := parser.Parse(test.input) + require.NoError(t, err) + + rtype, err := checker.Check(tree, conf.New(env)) + require.NoError(t, err) + require.True(t, rtype.Kind() == test.want, fmt.Sprintf("expected %s, got %s", test.want, rtype.Kind())) + }) + } +} diff --git a/expr_test.go b/expr_test.go index 16464383f..7a7aea97c 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1704,6 +1704,8 @@ func TestEnv_keyword(t *testing.T) { {"env.mylist[1]", 2}, {"env?.OtherMap?.a", "b"}, {"env?.OtherMap?.d", ""}, + {"'num' in env", true}, + {"get(env, 'num')", 10}, } for _, tt := range tests { From a9c94aa45744d91f4e5fc02a5d5ce5198353fcec Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 14:38:48 +0200 Subject: [PATCH 049/506] Fix pipe operator parsing --- parser/parser.go | 29 ++++++++++++++--------------- test/pipes/pipes_test.go | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 0792ead1c..5f070b91c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -32,6 +32,7 @@ var unaryOperators = map[string]operator{ } var binaryOperators = map[string]operator{ + "|": {0, left}, "or": {10, left}, "||": {10, left}, "and": {15, left}, @@ -147,12 +148,13 @@ func (p *parser) expect(kind Kind, values ...string) { func (p *parser) parseExpression(precedence int) Node { nodeLeft := p.parsePrimary() - lastOperator := "" + prevOperator := "" opToken := p.current for opToken.Is(Operator) && p.err == nil { negate := false var notToken Token + // Handle "not *" operator, like "not in" or "not contains". if opToken.Is(Operator, "not") { p.next() notToken = p.current @@ -164,7 +166,12 @@ func (p *parser) parseExpression(precedence int) Node { if op.precedence >= precedence { p.next() - if lastOperator == "??" && opToken.Value != "??" && !opToken.Is(Bracket, "(") { + if opToken.Value == "|" { + nodeLeft = p.parsePipe(nodeLeft) + goto next + } + + if prevOperator == "??" && opToken.Value != "??" && !opToken.Is(Bracket, "(") { p.errorAt(opToken, "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses.", opToken.Value) break } @@ -191,21 +198,18 @@ func (p *parser) parseExpression(precedence int) Node { nodeLeft.SetLocation(notToken.Location) } - lastOperator = opToken.Value - opToken = p.current - continue + goto next } } break + + next: + prevOperator = opToken.Value + opToken = p.current } if precedence == 0 { nodeLeft = p.parseConditional(nodeLeft) - - if p.current.Is(Operator, "|") { - p.next() - return p.parsePipe(nodeLeft) - } } return nodeLeft @@ -626,11 +630,6 @@ func (p *parser) parsePipe(node Node) Node { node.SetLocation(identifier.Location) } - if p.current.Is(Operator, "|") { - p.next() - return p.parsePipe(node) - } - return node } diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index 47f440681..f2c0a93b3 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -13,12 +13,38 @@ func TestPipes(t *testing.T) { "sprintf": fmt.Sprintf, } - program, err := expr.Compile(`"%s bar %d" | sprintf("foo", -42 | abs())`, expr.Env(env)) - require.NoError(t, err) + tests := []struct { + input string + want interface{} + }{ + { + `-1 | abs()`, + 1, + }, + { + `"%s bar %d" | sprintf("foo", -42 | abs())`, + "foo bar 42", + }, + { + `[] | first() ?? "foo"`, + "foo", + }, + { + `['a'] | first() + "b" | upper()`, + "AB", + }, + } - out, err := expr.Run(program, env) - require.NoError(t, err) - require.Equal(t, "foo bar 42", out) + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + program, err := expr.Compile(test.input, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, test.want, out) + }) + } } func TestPipes_map_filter(t *testing.T) { From cee681e6165f9cea28bd83921cec0c72e0abce54 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 15:17:36 +0200 Subject: [PATCH 050/506] Add more pipe tests --- test/pipes/pipes_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index f2c0a93b3..6a0e2950b 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -30,8 +30,8 @@ func TestPipes(t *testing.T) { "foo", }, { - `['a'] | first() + "b" | upper()`, - "AB", + `"a" | upper() + "B" | lower()`, + "ab", }, } From 24608fb366f02185607f57caae80987947ac8b5b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 15:39:59 +0200 Subject: [PATCH 051/506] Add expr.ExperimentalPipes() config --- conf/config.go | 1 + expr.go | 13 ++++++++++++- parser/parser.go | 15 +++++++++++++++ parser/parser_test.go | 4 ++-- test/pipes/pipes_test.go | 4 ++-- test/time/time_test.go | 6 +++--- 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/conf/config.go b/conf/config.go index ad7f36c1c..849cdce14 100644 --- a/conf/config.go +++ b/conf/config.go @@ -22,6 +22,7 @@ type Config struct { ConstFns map[string]reflect.Value Visitors []ast.Visitor Functions map[string]*builtin.Function + Pipes bool } // CreateNew creates new config with default values. diff --git a/expr.go b/expr.go index 1d81226ca..6314314b1 100644 --- a/expr.go +++ b/expr.go @@ -130,6 +130,13 @@ func Function(name string, fn func(params ...interface{}) (interface{}, error), } } +// ExperimentalPipes enables pipes syntax. +func ExperimentalPipes() Option { + return func(c *conf.Config) { + c.Pipes = true + } +} + // Compile parses and compiles given input expression to bytecode program. func Compile(input string, ops ...Option) (*vm.Program, error) { config := conf.CreateNew() @@ -146,7 +153,11 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { }) } - tree, err := parser.Parse(input) + parseConfig := parser.Config{ + Pipes: config.Pipes, + } + + tree, err := parser.ParseWithConfig(input, parseConfig) if err != nil { return nil, err } diff --git a/parser/parser.go b/parser/parser.go index 5f070b91c..3288662b5 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -77,6 +77,7 @@ type parser struct { pos int err *file.Error depth int // closure call depth + pipes bool } type Tree struct { @@ -84,7 +85,15 @@ type Tree struct { Source *file.Source } +type Config struct { + Pipes bool +} + func Parse(input string) (*Tree, error) { + return ParseWithConfig(input, Config{}) +} + +func ParseWithConfig(input string, config Config) (*Tree, error) { source := file.NewSource(input) tokens, err := Lex(source) @@ -95,6 +104,7 @@ func Parse(input string) (*Tree, error) { p := &parser{ tokens: tokens, current: tokens[0], + pipes: config.Pipes, } node := p.parseExpression(0) @@ -592,6 +602,11 @@ func (p *parser) parsePostfixExpression(node Node) Node { } func (p *parser) parsePipe(node Node) Node { + if !p.pipes { + p.error("enable Pipes via expr.ExperimentalPipes()") + return &NilNode{} + } + identifier := p.current p.expect(Identifier) diff --git a/parser/parser_test.go b/parser/parser_test.go index 256024e0d..0d5d62d47 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -453,7 +453,7 @@ func TestParse(t *testing.T) { &BoolNode{Value: true}}}}, } for _, test := range parseTests { - actual, err := parser.Parse(test.input) + actual, err := parser.ParseWithConfig(test.input, parser.Config{Pipes: true}) if err != nil { t.Errorf("%s:\n%v", test.input, err) continue @@ -657,7 +657,7 @@ func TestParse_pipe_operator(t *testing.T) { Property: &StringNode{Value: "foo"}, }}}}}}}} - actual, err := parser.Parse(input) + actual, err := parser.ParseWithConfig(input, parser.Config{Pipes: true}) require.NoError(t, err) assert.Equal(t, Dump(expect), Dump(actual.Node)) } diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index 6a0e2950b..1658dd6aa 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -37,7 +37,7 @@ func TestPipes(t *testing.T) { for _, test := range tests { t.Run(test.input, func(t *testing.T) { - program, err := expr.Compile(test.input, expr.Env(env)) + program, err := expr.Compile(test.input, expr.Env(env), expr.ExperimentalPipes()) require.NoError(t, err) out, err := expr.Run(program, env) @@ -48,7 +48,7 @@ func TestPipes(t *testing.T) { } func TestPipes_map_filter(t *testing.T) { - program, err := expr.Compile(`1..9 | map(# + 1) | filter(# % 2 == 0)`) + program, err := expr.Compile(`1..9 | map(# + 1) | filter(# % 2 == 0)`, expr.ExperimentalPipes()) require.NoError(t, err) out, err := expr.Run(program, nil) diff --git a/test/time/time_test.go b/test/time/time_test.go index 200c821ee..eb8d478dc 100644 --- a/test/time/time_test.go +++ b/test/time/time_test.go @@ -120,15 +120,15 @@ func TestTime_date(t *testing.T) { want time.Time }{ { - `'2017-10-23' | date()`, + `date('2017-10-23')`, time.Date(2017, 10, 23, 0, 0, 0, 0, time.UTC), }, { - `'24.11.1987 20:30' | date("02.01.2006 15:04", "Europe/Zurich")`, + `date('24.11.1987 20:30', "02.01.2006 15:04", "Europe/Zurich")`, time.Date(1987, 11, 24, 20, 30, 0, 0, time.FixedZone("Europe/Zurich", 3600)), }, { - `'24.11.1987 20:30 MSK' | date("02.01.2006 15:04 MST", "Europe/Zurich")`, + `date('24.11.1987 20:30 MSK', "02.01.2006 15:04 MST", "Europe/Zurich")`, time.Date(1987, 11, 24, 20, 30, 0, 0, time.FixedZone("MSK", 0)), }, } From 8e6e992bcba45cac82067dbd8bdc2095dc8cd0ac Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 16:40:36 +0200 Subject: [PATCH 052/506] Integrate repl with debugger --- debug/debugger.go | 5 ++++- repl/go.mod | 14 +++++++++++++- repl/go.sum | 21 +++++++++++++++++++++ repl/repl.go | 45 ++++++++++++++++++++++++++++++++------------- vm/program.go | 9 +++++++-- 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/debug/debugger.go b/debug/debugger.go index b7af11230..6f71c322f 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -58,7 +58,10 @@ func StartDebugger(program *Program, env interface{}) { }() index := make(map[int]int) - for row, line := range strings.Split(program.Disassemble(), "\n") { + var buf strings.Builder + program.Opcodes(&buf) + + for row, line := range strings.Split(buf.String(), "\n") { if line == "" { continue } diff --git a/repl/go.mod b/repl/go.mod index 4e15b13bb..7bda6fbff 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -4,9 +4,21 @@ go 1.20 require ( github.com/antonmedv/expr v0.0.0 + github.com/antonmedv/expr/debug v0.0.0 github.com/chzyer/readline v1.5.1 ) -require golang.org/x/sys v0.11.0 // indirect +require ( + github.com/gdamore/encoding v1.0.0 // indirect + github.com/gdamore/tcell v1.3.0 // indirect + github.com/lucasb-eyer/go-colorful v1.0.3 // indirect + github.com/mattn/go-runewidth v0.0.8 // indirect + github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 // indirect + github.com/rivo/uniseg v0.1.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.3.2 // indirect +) replace github.com/antonmedv/expr => ../ + +replace github.com/antonmedv/expr/debug => ../debug diff --git a/repl/go.sum b/repl/go.sum index e5a857a0c..438d30deb 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -1,3 +1,4 @@ +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= @@ -7,16 +8,36 @@ github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= +github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= +github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= +github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= +github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= +github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/repl/repl.go b/repl/repl.go index 453c70531..78ba1bd66 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -2,44 +2,54 @@ package main import ( "fmt" + "os" "strings" "github.com/antonmedv/expr" "github.com/antonmedv/expr/builtin" + "github.com/antonmedv/expr/debug" "github.com/antonmedv/expr/vm" "github.com/chzyer/readline" ) +var keywords = []string{ + "exit", "opcodes", "debug", + + // Predicate functions: + "map", "filter", "all", + "any", "none", "one", + + // Operators: + "and", "or", "in", "not", "not in", + "contains", "matches", "startsWith", "endsWith", +} + func main() { - extra := []string{ - "exit", - "opcodes", - "map", - "filter", - "all", - "any", - "none", - "one", - } rl, err := readline.NewEx(&readline.Config{ Prompt: "> ", - AutoComplete: completer{append(builtin.Names, extra...)}, + AutoComplete: completer{append(builtin.Names, keywords...)}, }) if err != nil { panic(err) } defer rl.Close() + env := map[string]interface{}{ + "ENV": os.Environ(), + } var program *vm.Program + for { line, err := rl.Readline() if err != nil { // io.EOF when Ctrl-D is pressed break } line = strings.TrimSpace(line) + if line == "exit" { break } + if line == "opcodes" { if program == nil { fmt.Println("no program") @@ -49,12 +59,21 @@ func main() { continue } - program, err = expr.Compile(line, expr.Env(nil)) + if line == "debug" { + if program == nil { + fmt.Println("no program") + continue + } + debug.StartDebugger(program, env) + continue + } + + program, err = expr.Compile(line, expr.Env(env), expr.ExperimentalPipes()) if err != nil { fmt.Printf("compile error: %s\n", err) continue } - output, err := expr.Run(program, nil) + output, err := expr.Run(program, env) if err != nil { fmt.Printf("runtime error: %s\n", err) continue diff --git a/vm/program.go b/vm/program.go index d6018139d..24747df90 100644 --- a/vm/program.go +++ b/vm/program.go @@ -3,6 +3,7 @@ package vm import ( "bytes" "fmt" + "io" "reflect" "regexp" "strings" @@ -27,6 +28,12 @@ type Program struct { func (program *Program) Disassemble() string { var buf bytes.Buffer w := tabwriter.NewWriter(&buf, 0, 0, 2, ' ', 0) + program.Opcodes(w) + _ = w.Flush() + return buf.String() +} + +func (program *Program) Opcodes(w io.Writer) { ip := 0 for ip < len(program.Bytecode) { pp := ip @@ -275,6 +282,4 @@ func (program *Program) Disassemble() string { _, _ = fmt.Fprintf(w, "%v\t%#x (unknown)\n", ip, op) } } - _ = w.Flush() - return buf.String() } From a21a00d0d06faa7f91457648330197a4fd599f59 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 17:02:33 +0200 Subject: [PATCH 053/506] Update debugger deps --- debug/debugger.go | 4 +-- debug/go.mod | 10 +++++--- debug/go.sum | 65 ++++++++++++++++++++++++++++++++++------------- repl/go.mod | 15 ++++++----- repl/go.sum | 62 +++++++++++++++++++++++++++++++------------- 5 files changed, 109 insertions(+), 47 deletions(-) diff --git a/debug/debugger.go b/debug/debugger.go index 6f71c322f..7de851769 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -8,7 +8,7 @@ import ( "time" . "github.com/antonmedv/expr/vm" - "github.com/gdamore/tcell" + "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) @@ -85,7 +85,7 @@ func StartDebugger(program *Program, env interface{}) { app.QueueUpdateDraw(func() { for row := 0; row < table.GetRowCount(); row++ { for col := 0; col < table.GetColumnCount(); col++ { - table.GetCell(row, col).SetBackgroundColor(tcell.ColorDefault) + table.GetCell(row, col).SetBackgroundColor(tcell.ColorBlack) } } diff --git a/debug/go.mod b/debug/go.mod index 5dbf3d776..831ec776e 100644 --- a/debug/go.mod +++ b/debug/go.mod @@ -3,9 +3,13 @@ module github.com/antonmedv/expr/debug go 1.13 require ( - github.com/antonmedv/expr v0.0.0 - github.com/gdamore/tcell v1.3.0 - github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 + github.com/antonmedv/expr v1.13.0 + github.com/gdamore/tcell/v2 v2.6.0 + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 + github.com/rivo/uniseg v0.4.4 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect ) replace github.com/antonmedv/expr => ../ diff --git a/debug/go.sum b/debug/go.sum index 3eaa3b26f..879eeb41d 100644 --- a/debug/go.sum +++ b/debug/go.sum @@ -1,35 +1,64 @@ -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= -github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= -github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= +github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= -github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo= +github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4 h1:sfkvUWPNGwSV+8/fNqctR5lS2AqCSqYwXdrjCxp/dXo= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/repl/go.mod b/repl/go.mod index 7bda6fbff..c099d3b85 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -3,20 +3,21 @@ module github.com/antonmedv/expr/repl go 1.20 require ( - github.com/antonmedv/expr v0.0.0 + github.com/antonmedv/expr v1.13.0 github.com/antonmedv/expr/debug v0.0.0 github.com/chzyer/readline v1.5.1 ) require ( github.com/gdamore/encoding v1.0.0 // indirect - github.com/gdamore/tcell v1.3.0 // indirect - github.com/lucasb-eyer/go-colorful v1.0.3 // indirect - github.com/mattn/go-runewidth v0.0.8 // indirect - github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 // indirect - github.com/rivo/uniseg v0.1.0 // indirect + github.com/gdamore/tcell/v2 v2.6.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 // indirect + github.com/rivo/uniseg v0.4.4 // indirect golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.3.2 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect ) replace github.com/antonmedv/expr => ../ diff --git a/repl/go.sum b/repl/go.sum index 438d30deb..ba8ef9af6 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -1,4 +1,3 @@ -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= @@ -10,34 +9,63 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= -github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= -github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= +github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= -github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo= +github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 54fb84bf4fbfee4a20cbd27dbdc851bc85ce758b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 17:11:34 +0200 Subject: [PATCH 054/506] Update README.md --- README.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1aab8b685..b223940f4 100644 --- a/README.md +++ b/README.md @@ -26,21 +26,38 @@ product.Stock < 15 ## Features -* Seamless integration with Go (no need to redefine types) -* Static typing ([example](https://godoc.org/github.com/antonmedv/expr#example-Env)). +**Expr** is a safe, fast, and intuitive expression evaluator optimized for the Go language. +Here are its standout features: + +### Safety and Isolation +* **Memory-Safe**: Expr is designed with a focus on safety, ensuring that programs do not access unrelated memory or introduce memory vulnerabilities. +* **Side-Effect-Free**: Expressions evaluated in Expr only compute outputs from their inputs, ensuring no side-effects that can change state or produce unintended results. +* **Always Terminating**: Expr is designed to prevent infinite loops, ensuring that every program will conclude in a reasonable amount of time. + +### Go Integration +* **Seamless with Go**: Integrate Expr into your Go projects without the need to redefine types. + +### Static Typing +* Ensures type correctness and prevents runtime type errors. ```go out, err := expr.Compile(`name + age`) // err: invalid operation + (mismatched types string and int) // | name + age // | .....^ ``` -* User-friendly error messages. -* Reasonable set of basic operators. -* Builtins `all`, `none`, `any`, `one`, `filter`, `map`. + +### User-Friendly +* Provides user-friendly error messages to assist with debugging and development. + +### Flexibility and Utility +* **Rich Operators**: Offers a reasonable set of basic operators for a variety of applications. +* **Built-in Functions**: Functions like `all`, `none`, `any`, `one`, `filter`, and `map` are provided out-of-the-box. ```coffeescript all(Tweets, {.Size <= 280}) ``` -* Fast ([benchmarks](https://github.com/antonmedv/golang-expression-evaluation-comparison#readme)): uses bytecode virtual machine and optimizing compiler. + +### Performance +* **Optimized for Speed**: Expr stands out in its performance, utilizing an optimizing compiler and a bytecode virtual machine. Check out these [benchmarks](https://github.com/antonmedv/golang-expression-evaluation-comparison#readme) for more details. ## Install From b132d24022c7ed1fef1bbf97161bf90369c104ea Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 22:47:38 +0200 Subject: [PATCH 055/506] Update README.md --- README.md | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index b223940f4..8f2234d2b 100644 --- a/README.md +++ b/README.md @@ -3,25 +3,18 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/antonmedv/expr)](https://goreportcard.com/report/github.com/antonmedv/expr) [![GoDoc](https://godoc.org/github.com/antonmedv/expr?status.svg)](https://godoc.org/github.com/antonmedv/expr) -expr logo - -**Expr** package provides an engine that can compile and evaluate expressions. -An expression is a one-liner that returns a value (mostly, but not limited to, booleans). -It is designed for simplicity, speed and safety. +**Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. -The purpose of the package is to allow users to use expressions inside configuration for more complex logic. -It is a perfect candidate for the foundation of a _business rule engine_. -The idea is to let configure things in a dynamic way without recompile of a program: +expr logo ```js -// Get the special price if -user.Group in ["good_customers", "collaborator"] - -// Promote article to the homepage when -len(article.Comments) > 100 and article.Category not in ["misc"] +// Allow only admins and moderators to moderate comments. +user.Group in ["admin", "moderator"] || user.Id == comment.UserId +``` -// Send an alert when -product.Stock < 15 +```js +// Ensure all tweets are less than 240 characters. +all(Tweets, .Size <= 240) ``` ## Features From ba04206a438caf6cf03456ef223912d90e08efb7 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 22:50:15 +0200 Subject: [PATCH 056/506] Update README.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 8f2234d2b..5c0a1e027 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,6 @@ Here are its standout features: ### Flexibility and Utility * **Rich Operators**: Offers a reasonable set of basic operators for a variety of applications. * **Built-in Functions**: Functions like `all`, `none`, `any`, `one`, `filter`, and `map` are provided out-of-the-box. - ```coffeescript - all(Tweets, {.Size <= 280}) - ``` ### Performance * **Optimized for Speed**: Expr stands out in its performance, utilizing an optimizing compiler and a bytecode virtual machine. Check out these [benchmarks](https://github.com/antonmedv/golang-expression-evaluation-comparison#readme) for more details. From 10694bade7b71c18c0c9daf6bd249081491765d2 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 23:05:53 +0200 Subject: [PATCH 057/506] Add func names in disassemble --- compiler/compiler.go | 3 +++ vm/program.go | 12 ++++++++---- vm/program_test.go | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 0679edcc7..2b3bfa70f 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -54,6 +54,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro Bytecode: c.bytecode, Arguments: c.arguments, Functions: c.functions, + FuncNames: c.functionNames, } return } @@ -64,6 +65,7 @@ type compiler struct { constants []interface{} constantsIndex map[interface{}]int functions []Function + functionNames []string functionsIndex map[string]int mapEnv bool cast reflect.Kind @@ -154,6 +156,7 @@ func (c *compiler) addFunction(fn *builtin.Function) int { } p := len(c.functions) c.functions = append(c.functions, fn.Func) + c.functionNames = append(c.functionNames, fn.Name) c.functionsIndex[fn.Name] = p return p } diff --git a/vm/program.go b/vm/program.go index 24747df90..ea954cc7c 100644 --- a/vm/program.go +++ b/vm/program.go @@ -23,6 +23,7 @@ type Program struct { Bytecode []Opcode Arguments []int Functions []Function + FuncNames []string } func (program *Program) Disassemble() string { @@ -74,6 +75,9 @@ func (program *Program) Opcodes(w io.Writer) { builtin := func(label string) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Functions[arg].Name) } + funcName := func(label string) { + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v()\n", pp, label, arg, program.FuncNames[arg]) + } switch op { case OpInvalid: @@ -218,16 +222,16 @@ func (program *Program) Opcodes(w io.Writer) { argument("OpCall") case OpCall0: - argument("OpCall0") + funcName("OpCall0") case OpCall1: - argument("OpCall1") + funcName("OpCall1") case OpCall2: - argument("OpCall2") + funcName("OpCall2") case OpCall3: - argument("OpCall3") + funcName("OpCall3") case OpCallN: argument("OpCallN") diff --git a/vm/program_test.go b/vm/program_test.go index 06e83b18c..c1cdf4f4c 100644 --- a/vm/program_test.go +++ b/vm/program_test.go @@ -13,6 +13,7 @@ func TestProgram_Disassemble(t *testing.T) { Constants: []interface{}{1, 2}, Bytecode: []vm.Opcode{op}, Arguments: []int{1}, + FuncNames: []string{"foo", "bar"}, } d := program.Disassemble() if strings.Contains(d, "(unknown)") { From 4810a4735ac20476292226266c8d3abd75aa662b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 15 Aug 2023 23:34:16 +0200 Subject: [PATCH 058/506] Rename env to $env --- builtin/builtin_test.go | 6 +++--- checker/checker.go | 6 +++--- checker/checker_test.go | 6 +++--- compiler/compiler.go | 2 +- conf/types_table.go | 4 ++-- expr_test.go | 36 ++++++++++++++++++------------------ 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 94a146b8a..4c8f61fbb 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -153,9 +153,9 @@ func TestBuiltin_types(t *testing.T) { {`first(ArrayOfInt)`, reflect.Int}, {`last(ArrayOfString)`, reflect.String}, {`last(ArrayOfInt)`, reflect.Int}, - {`get(env, 'str')`, reflect.String}, - {`get(env, 'num')`, reflect.Int}, - {`get(env, 'ArrayOfString')`, reflect.Slice}, + {`get($env, 'str')`, reflect.String}, + {`get($env, 'num')`, reflect.Int}, + {`get($env, 'ArrayOfString')`, reflect.Slice}, } for _, test := range tests { diff --git a/checker/checker.go b/checker/checker.go index 973786bd1..f4d84d078 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -135,7 +135,7 @@ func (v *visitor) NilNode(*ast.NilNode) (reflect.Type, info) { } func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) { - if node.Value == "env" { + if node.Value == "$env" { return mapType, info{} } if fn, ok := v.config.Functions[node.Value]; ok { @@ -399,7 +399,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { base, _ := v.visit(node.Node) prop, _ := v.visit(node.Property) - if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "env" { + if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "$env" { // If the index is a constant string, can save some // cycles later by finding the type of its referent if name, ok := node.Property.(*ast.StringNode); ok { @@ -660,7 +660,7 @@ func (v *visitor) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { val := node.Arguments[0] prop := node.Arguments[1] - if id, ok := val.(*ast.IdentifierNode); ok && id.Value == "env" { + if id, ok := val.(*ast.IdentifierNode); ok && id.Value == "$env" { if s, ok := prop.(*ast.StringNode); ok { return v.config.Types[s.Value].Type, info{} } diff --git a/checker/checker_test.go b/checker/checker_test.go index 127c7dd57..56bc7546a 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -946,9 +946,9 @@ func TestCheck_env_keyword(t *testing.T) { input string want reflect.Kind }{ - {`env['str']`, reflect.String}, - {`env['num']`, reflect.Int}, - {`env[name]`, reflect.Interface}, + {`$env['str']`, reflect.String}, + {`$env['num']`, reflect.Int}, + {`$env[name]`, reflect.Interface}, } for _, test := range tests { diff --git a/compiler/compiler.go b/compiler/compiler.go index 2b3bfa70f..d32ba55e4 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -227,7 +227,7 @@ func (c *compiler) NilNode(_ *ast.NilNode) { } func (c *compiler) IdentifierNode(node *ast.IdentifierNode) { - if node.Value == "env" { + if node.Value == "$env" { c.emit(OpLoadEnv) return } diff --git a/conf/types_table.go b/conf/types_table.go index f4d401c9c..7d486480c 100644 --- a/conf/types_table.go +++ b/conf/types_table.go @@ -54,7 +54,7 @@ func CreateTypesTable(i interface{}) TypesTable { for _, key := range v.MapKeys() { value := v.MapIndex(key) if key.Kind() == reflect.String && value.IsValid() && value.CanInterface() { - if key.String() == "env" { // Could check for all keywords here + if key.String() == "$env" { // Could check for all keywords here panic("attempt to misuse env keyword as env map key") } types[key.String()] = Tag{Type: reflect.TypeOf(value.Interface())} @@ -97,7 +97,7 @@ func FieldsFromStruct(t reflect.Type) TypesTable { } } } - if fn := FieldName(f); fn == "env" { // Could check for all keywords here + if fn := FieldName(f); fn == "$env" { // Could check for all keywords here panic("attempt to misuse env keyword as env struct field tag") } else { types[FieldName(f)] = Tag{ diff --git a/expr_test.go b/expr_test.go index 7a7aea97c..31de39c71 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1688,24 +1688,24 @@ func TestEnv_keyword(t *testing.T) { code string want interface{} }{ - {"env['space test']", "ok"}, - {"env['Section 1-2a']", "ok"}, - {`env["c:\\ndrive\\2015 Information Table"]`, "ok"}, - {"env['%*worst function name ever!!']", "ok"}, - {"env['String Map'].one", "two"}, - {"env['1'] + env['2']", "ok"}, - {"1 + env['num'] + env['num']", 21}, - {"MIN(env['num'],0)", 0}, - {"env['nu' + 'm']", 10}, - {"env[red + irect]", 10}, - {"env['String Map']?.five", ""}, - {"env.red", "n"}, - {"env?.blue", nil}, - {"env.mylist[1]", 2}, - {"env?.OtherMap?.a", "b"}, - {"env?.OtherMap?.d", ""}, - {"'num' in env", true}, - {"get(env, 'num')", 10}, + {"$env['space test']", "ok"}, + {"$env['Section 1-2a']", "ok"}, + {`$env["c:\\ndrive\\2015 Information Table"]`, "ok"}, + {"$env['%*worst function name ever!!']", "ok"}, + {"$env['String Map'].one", "two"}, + {"$env['1'] + $env['2']", "ok"}, + {"1 + $env['num'] + $env['num']", 21}, + {"MIN($env['num'],0)", 0}, + {"$env['nu' + 'm']", 10}, + {"$env[red + irect]", 10}, + {"$env['String Map']?.five", ""}, + {"$env.red", "n"}, + {"$env?.blue", nil}, + {"$env.mylist[1]", 2}, + {"$env?.OtherMap?.a", "b"}, + {"$env?.OtherMap?.d", ""}, + {"'num' in $env", true}, + {"get($env, 'num')", 10}, } for _, tt := range tests { From aa3560bd7d08aaf70f9d33e70f0c8c0697d20115 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 16 Aug 2023 11:29:09 +0200 Subject: [PATCH 059/506] Fix slice out of bound errors --- expr_test.go | 20 ++++++++++++++++++++ vm/runtime/runtime.go | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/expr_test.go b/expr_test.go index 31de39c71..7ea3700d0 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1761,3 +1761,23 @@ func TestIssue401(t *testing.T) { require.NoError(t, err, "run error") require.Equal(t, 0.5, output) } + +func TestEval_slices_out_of_bound(t *testing.T) { + tests := []struct { + code string + want interface{} + }{ + {"[1, 2, 3][:99]", []interface{}{1, 2, 3}}, + {"[1, 2, 3][99:]", []interface{}{}}, + {"[1, 2, 3][:-99]", []interface{}{}}, + {"[1, 2, 3][-99:]", []interface{}{1, 2, 3}}, + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + got, err := expr.Eval(tt.code, nil) + require.NoError(t, err, "eval error: "+tt.code) + assert.Equal(t, tt.want, got, "eval: "+tt.code) + }) + } +} diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 97f61843f..3960b073c 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -183,9 +183,15 @@ func Slice(array, from, to interface{}) interface{} { if a < 0 { a = length + a } + if a < 0 { + a = 0 + } if b < 0 { b = length + b } + if b < 0 { + b = 0 + } if b > length { b = length } From beb738ba38d47bce3dfa13332b64342d61221bd1 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 16 Aug 2023 11:30:50 +0200 Subject: [PATCH 060/506] Update Language-Definition.md --- docs/Language-Definition.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 7a7ba6f7d..312946425 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -515,10 +515,10 @@ Braces `{` `}` can be omitted: filter(Tweets, len(.Value) > 280) ``` -## `env` variable +## `$env` variable -The `env` variable is a map of all variables passed to the expression. +The `$env` variable is a map of all variables passed to the expression. ```expr -Foo.Name == env['Foo'].Name +Foo.Name == $env["Foo"].Name ``` From 8f2cfbf673cdec4322f88126ed3ac8ece98bf921 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 16 Aug 2023 11:40:49 +0200 Subject: [PATCH 061/506] Add demo --- .github/images/demo.tape | 83 +++++++++++++++++++++++++++++++++++++++ .github/images/out.gif | Bin 0 -> 1087311 bytes 2 files changed, 83 insertions(+) create mode 100644 .github/images/demo.tape create mode 100644 .github/images/out.gif diff --git a/.github/images/demo.tape b/.github/images/demo.tape new file mode 100644 index 000000000..e7e2f15c3 --- /dev/null +++ b/.github/images/demo.tape @@ -0,0 +1,83 @@ +Set Shell zsh +Sleep 500ms +Type "repl" +Enter +Sleep 500ms +Type "1..9 | filter(" +Sleep 500ms +Type "# " +Sleep 500ms +Type "% 2 == 0) | map(" +Sleep 500ms +Type "# ^ 2" +Sleep 500ms +Type ")" +Enter +Sleep 1s +Type "de" +Sleep 500ms +Type "bug" +Enter +Sleep 1.5s +Enter 50 +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Enter +Sleep 1.5s +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Escape +Type "OB" +Enter +Sleep 2s +Escape +Type "OB" +Escape +Type "OB" +Ctrl+C +Sleep 1s +Ctrl+D +Ctrl+D + diff --git a/.github/images/out.gif b/.github/images/out.gif new file mode 100644 index 0000000000000000000000000000000000000000..501706bb550ab2c80eba18301e929fd7cfc4de64 GIT binary patch literal 1087311 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%0AccL95w-LddOfPjZo7hW}lL8G2E`)AFbj&to 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ⅅT(Utmp)v>!zBq;hqqyQ{#~)?(}T7HQ!N4(*7^LJ#I7rVH1Da zd=2ky^iQ_Xaz0vnPU4tYQd4U{td3N+(XfkelS%QLs{^Bs%Qb%X^0Co2S!Rh%h>J4GREU0LPA&aatA12Mo)`_ zD$qJOTahEiPJZ5f)REU+zI+j(J#AG4(^}Kl{_8F+Ol@5@dW}S+BR@)Nh61F%FN}q) z#3;N9WVw8owd%gO;qG`w6}}MwKR}z+HfSl97HJ=Ir%0T4CQYhAv*qsRt{Y$1EL3>N zs!Tv*uLSKC=m(<;lSBZf03V`M9IiNPoDJ*MfKw)$D$X#>)mjNLHMM@x@-7=t`=UY2 zciGD0f@p;_9uP+9Vde)7X1$I4l9jbRSNnw^`M7=9a!QPhooE3^^B~R*O@%i7`Vgbd zLFpT_u^sI%6)ZwLETx)2;^g}jV;;$N2}@N7@_-zqL!8wx`)#2cFwQ&D<=CHOWPke8 z9hB7%50RyR=asZy5!l{IYn6Vsr-rMng`+K@3z~l0-!$*yK$1_tkjx0+OYD<-G+2US zgJHG;tS6N)r&6dYV2(ZN+Wo;ll5*xU8TMuifFN~O`tvW?Hs~iw$0CQ#eighP?~-T? zh%j&)X_C8TD}s!zJz@T9&e}CORCzAzb`2$b#!1E9I5rG%grOsOIZirt=o%$M2!dE5 z*+!$R$}HNC;DZUfgVK@W>0wu|i&ehw*xNBu;?bqLnJNC1_-7B({;qEUZx|C%mXgMa zk>NF9VGr&ksLVtSo;*`Ll9LC`r4J07Tu6%vUl_-W?G=&X7E8aRBht!dwN3An zi4O&hTFfT-YzEPKFQYJ(&t5qk8~KA`k#Ry0@G08;+xRc7(|Id%buQO|yH>kvkXAQB z71ri#wlEWxD!(rW7PIue2b7zN;APhu^tAD1S?ffRpB2e=+2WPwsIVp9y?pSc|KB|` z$9k1G*D0%l$N$|abYZyb69CF(EaL&P1A%oTGeGcH?Cs>?wJS%|x;*_1j=~(z8^?P{ zeqkC-vmNS4s-iJMJu0J#W-KlTL zC6>$rC};@WZQ@yXT7&_x8J45iY#wY@Wt=7>KH;)LE{%QaTn!{A*SdJ{rRK3NW$w7w zhl}Q~jPpz2WmpAfiQG>T{n&oz@h0b=Y|Uz#d>Qruco=3h=s550#I2!!Wj*>D`KJ1n zOFY}!5%eYYFrLd))gYS&@qJ%2)%b%hj`ha}#QkCiclnbuCERta0B16(JJ9ah0-7`f zYcWMqh@BX4RQizVN6=syDzJA+fY9?F&E?o?951kpw}|neAsDpEWLxop>b6&OM&X`l zz*Qd>>;$)evE1SqMf9>E&#Cfnfhq?PBL+B6H$6H`%h!szYbk+mwqc#UdhVG=@j*Bx zJWRGDE#C=NM0Sy3UeS`1xCb$m~2XDn4@$tvAg3OPp zTY#}QVLy3ehyKlT;*U5ExQ9Ljh4r{QSG%!gpw8XyesqJd@9sMb#u&YqtGZbJH3kkG z_S^df8Db#k>SGQJa_D!^ZnHv|n42k=^|!dpRLL7sa*WgNsu)3b$Rt}ufR67YpRNcyy=S3n)pp4MY}-X4K!9M=(Ad%`-yX5o=Iavd2{|6XXD)}QVlyVrfxj2T&A2(vgIugcJwcGexLm^J!sruKf5zSI`LD5MMAJ^T=Oo*L zi>>J8cxvp-yIUYV!_q0&XsgFM#*_6tKrV}Hhk23`Lmc~#9CaOJ-v<&5u$>(T+kD4W zS9cbk1Hb=0U#~lkO-AkSBdA&JNsE;zt|vZDy!M z-PL+xX%Xw#I8!NzoGRgNUOntkrqveBIXimc+CETw7)P~J=x#SawwV?glObp;Vni9% zCe7Wtnw*;)Vttvcrx4BN=svC6S+D!ymUY<&LBh@zHfCD8=VOP1*r0M5V7LNX4PRE} zu^lpj@9{)T^(Qr>b9aBSjRdau@=OAH#f&!Dww+kfB528XFJYLRd+2d3FVSzJ(4ND_ z-~li+){yJ|TC`@S5|uc>N<2#m&$1be8T4APTWYNTHGa{#bI_wRE}86XIw;lNoXmf2 zM<+Y>`jl#%E7dH}Dr!{ZcuDmEMz61g_O6WG1ob_msu{VBdcA~hWAkd&MBuxs|B?m_ zM+aWAHRyz8Pwcwspoh#CQjaN&BWo5o9$PQev5z);b>`+PEf~zBQ#$vZEti-25Ax<8 z+foCxq6M<#4ti|+8m_R-^|2j{0{a$|_dT6sS_SvMpSZzsrFvl%gRt^qq=|o{4-&8U z15b2ZAv%E7R+BSm8BewjBHMJbC){rNZ<~sU@at#D zD_|eF*l)iccx+fN#(2SgXP@*h5F993{VnIe1yAaJ3DVGivvhJt!%enoH8O$b4y|?qV59j>ugJK|t@~VM~1>1N6wF?QW8|i8;96-G%^QINpGqzO|8u<`k`} zV&8xd7P1@AU!GOS)B#WZ_f`72*Y?CyznO30i|B8^(B#w`0y)NK4&Ts`C5vXk7P0=O zDNi31i0@jBaP3xz!7H8?C|>9=J-KFg^6UJzxE>j^6<8jZ%YK1lh8EbKk2?bwgD*iuOz;QT?Nl!wur+;@fJ zXtbWisut1u6n%&;(@kRphIS&l})BW)}x^t(fW^3!_<2|S*R@!%l?5I(! zkv!3QNyw z&}3kbp_QAy*h`f68dlrln%XlvE--L^lkT;h?3WPFL%qzPbLv4HjbypqhfX{5-CZ`_ zT{!FEY|`O>EQg4ulb;4{H_Zb$1dTF~%eH&uE4J~}YLBd&qd-&%WIOkQ{tStq*yFA_ zbjL-3Ejvw+^B}uy3PCQ@#qC-~lvKSK`li+Ve3)P?= zA;wH@(2&DbI|M-C+)|E{4*3~Dt{yV{k$7_X7jx!-RHxWu@J8~Yt9}<#s+~Z&#Y6() z?%A?r>zM9qcRGT^a9|lcw63dX7X!S>9kBK zrare$$iS;u7HE%$fqW5Z-kO&-1DGW*41fEZ+SRFx&28 zek`Jw`KtPU{Vlso_wHYMBmxTFzx>qhN@>{vw?dg$_Zto%?VO^EPx_U)%iq{oRad@|bhL$eK-Oz_al zbTbMWR11088eX{NjMXu9^E3tOOqr($3S=&0^|sx0%l`B^kW~C*9v=f}8j<>TxhYu* zIr65Yfv5cg4sKdO7s0><*`F+3T8>^jpekt`#vtl#10J0#lCi~_%!8beWDVv%zg}0R zi2nZL@Q+r&`{)1Ya!+|qyDAk8YLt`P4E_Y_*TWWxw)5^0Pp6CoHwuSiYkH4F&as{7 zAnpHhgM#*$Zn{_8`Rcq0(zmOHbpos%XBD^Dura1Gm+drPd-BUc7hCf5Cx<&|?5|HC zC2J#Cu0N~{VE2=3G=G0)+;s<^?O+O&AGjD%N3>LsaFICf*&=4J$#$Ol>pbJ`Bw!mR zpB-j1RWv}(vF=}J1N$~-RA}#ZdjL_}q$HHvRYmE>lSH#^cQX~XeI~nwFUk&ZIjLBff}>&qCHRA7-?n9O~kc7zqdZ4%*}k-%`B7cR0RC6 z-=AF9EMo=GupnCn`t7xk=za!zsk11n0Q^?7#|hQ%IlwZXCjA;7#B_=le7E?UOl2Q; z=k~#9*@t_XuF~j1=VZ1@J3-0{Yc|h*yk|k)fF-(vO-5}EE2Ukx!=vUtxM-S1Y$r_) z4wWehW4DbqcMVCY+8Y{P-kkHM>03`snRpL*okPhB{}x3pL^wG*R_NOW;vmZDb3@a% zJ*Pj9RBPn)g#=6%!YjZ|T9SiFjYcX)O%oyAS09&L6*bJ$b<%{8gSU>dD2fhB$0}9q zhk{r|&ph>VR$n@rwl|kt%s0=by>K{4xt=@Lfb_6)pLEW>D=0f}V+eU!=N*UFsofu< z#4-vHlaursI`Xs;OI32JPfK`yEg-+JNmtG#+^Os)oqa2`W~#w%VM02l+~HK9#8oiI z(5F({zJWj6e2fA&$>G-}1htRWdX}dCE!%y{Vzs+b_*C1nI)qH~k*I1eE*d94fwW!zex1tQLg~x8E#R--D9)xul{#yL zwp5x$Mt-|1J66J?V1lx!WkZIfsIpYS>sW~FF|lTi&L$wL3OzaZAJy7z$)S*RKtJ%=zRYb;1;#?^vBwg4265b6r(P%Z}iOb*WfU1~B)8chCRW#1| zxIP#e){gk16DJ*@J=Lt9hyS!g-8l^@yN@?+KUtl&8THIpy?zs{9oN!FGc+Ha{j8}$ z?y2=qeVDnU!Lr~Am*OH|U<)y|$vxiYwXADOJC}r>d!Po1v!CU)X8wCQOVz1RnNa11 zTx;+@w|TrgDApb!g;`re!qqlmJ z#Zd1@mZ|evXI|p5lqQ_LyHdtfxxuiCnwJ>`vsC=TgljSXD!el-l2n&-H;Qe_h!7Ms zh8P{4+4w+2G;|6j0)`t78q4lzI5p4sIYGyAb6(XJ`^>yP#!lg)VFi z&V_{O@0L2}R+n8NncUolJ!`*oxc#pEa_3}dcU%7GeGu#*fLk!oIgii4BVb}Wm1(ru z1jt48AY>-uR1p?zECEC{=)g?Ii=aKCentxcsNjKB`Lh`Qg#c9_P8rj@#SQo`+7+U5 z_NrYhm#kKD0I4EA3+onp_h3S7x7K4DYmMh_3(0*i^^-47IfA5R+!$)q}OB7cPmba8!CUF z1}goYEcyOISG$KnOu^AbIgJ?dw?D$5cDk+zJ&%R2##2>WA`4AJu#&fQsrHOBk5XxK zu<|b~`EfLb%n<|c-}G`?Wg0-OJyXykuy=0&SRol~x4*7frju88mNyGpUvt$K=#(2p zw3TLc7uc^hRRq^H9X0|eV+3nu##|<(Q2^alA!s{u5umip9Ciqr?0<`#Eb@Vs!s`0G z$ml4ATM`hfVI7ExQY<)h##0U_;YEa3)0?YUYV`q#6X<5GcSRnyS2hL~Yy2UVn@~;R zWQ{}I{z~STIqlm<+(v_Bd251}#>apPQ#$9sKC-WSpqTcVsdj~=?I zvXMzqZU1;vYZ@hYYGfu1)9qj|(1F4h&u+EJ-jnVAQM9Ke-0_iI0m^C?_MS`Kc~Yt- zFHx2bPG5=98B?~TfwXUM2jx|oDspY38>18FJbuIml)aJ7$(o^f|CR8m0+wsnpgYuG z3*a^NH(J+z_>R9}!OcCy4R&|eYjo1Vvr_jYvtB>dtN=9U@b&7~U9Zp7O4SU+Mr-}y zQ^hN*iVTtS*O%J8oqvjG0eq15N93|H0#bIiOi#&nX3`^fzC0&3`hqzQYj6fS`F?Or z?ittHs;^J@O83|L6+${M>;R+atZ8#>$@+1Eo_ds|i;~hdA1oiiM|$)1)I$X~>e5hT zRn0=1hfVGAb6#PN4Nc9~o9&5>z~1~mrR-$>|3}h!hb8s@{~JVx$k1Fk!I4{YmRoVJ za#qg5nWpwu(;S%zsJO*ZsX0K+m73;Ao8SsZscEjPa8zc?hNfoml@-seCw60lOm9Yg!JuE0)@Hi?c179O8kLB;oi%@Th%V7TIf zx%ox>yJOcgu8DT=iRD*q-O|=D5wVw**xRszb2~`d zc|kJNhjWM#0>4L-4Y$!tHhJilVPY7FW#GDOoyJ#ZIQI>DWTn@OP1tI?W*w9^u zr4N-yunb3Iti8v$Gux840!@}*l7@Gt(Zt_YGCx>d`0i`%NgbbpF8?J>)n3_{e`W*E zu}BYrzu35(M>c$6YN@_clp_^dv3~e!8N7vk)}ky;UIPO%eBUWY8Sd~6_5#|uy2AXf zt3%?Z?6}!lRjocN>05dl=kXFO{QEl5>}Mdek$}&C``AVKhGU(RRNv5Jk}Sci)rCg+ zP*cOinO@R;BBBSMOY(&bqUP5DkD;ZA$8?$EhU=DmE~x1@EX^;R%@t{F%I zL%?Zhu>Wp1QT+!I)6IYtFkpzlHZ#0*qAdRpG~^dUdKF(Yw<)r-f@z_VNDSev0C83; z?JoH33nq2~Cp!_S#%(fhsZDa&*<7ufoif@vnGK7S1#Gvd!v$VmPbczz!bSq%6)Q4{ z_#2*#-7UPR?FBhcHfo(IJxf~&{l-V{(DQ4P*`!N2uV6`ZnVkS33?xuEPv&2MusdDi zYd}OY_CTx7kVeIbnFW{=($HIY5$0!!O`s;c0eqLen@%sO)slWGsF%usWDVcn zC1Ph+geud@+3V+&SET;Q%Ix7K-ZPX72JFr=Wp;|N3qYY|>%+4EEDLCmPRITW6FR_) zLin)mE3$id?1rq!p+j=PvOb$c9EXYBXTOgf1dF<3d%r5P-^qNYmmUP2h{VBznKG-L z*j47_J`w!`Wt9vNe2&LLP*}^5HW*%N7w@(U#8%+n(?%d$Z0`&1QZkNHGP#kDSMf$n zY%H)=xb27SI^lvWb{3B&)wV|xgrjZTEOk`=(#5rSj!FPk*4(h|%rt9js3(CxbtRUQ zdR`i+t2HcV)eAtYGY@^mDYeEr7X(3u(oo8DL2fwQ{==qD4&QTtfGQ9zTp}N50iRpf*Bq@;`ekd-;lL@v}p`*6o%N{r^y5L&#(+w4QiL{v9U{8|@WllW>Gk0!WiiFj)L zj)eH(@ZvwAMnMpxwVsN$cI80GX3(iPf?6Kp$iF(UQIP%-AVkL*!ci^xoBqj@@h81|PWo@34A4In5`QYZ=Ty}8shId9 z=YJi&q<{L#_GzL%yyT*FroI=k=XAclH(yJBmcGlio>P)mP|ow2fH(%ERphb#xtOJ} z6CHuRYr(!nBI;!?Jxx#gK8=?j(^sr|>01+jiVQ#n;xXw&F@P*wK~X0d|NS3bL|xX- zS+$n2ZTV84z>HVt>Ghn{4_w&xt%@i7j0<@6^5kU;KI;`3xExkd?uCpZfO0Rumu$ z1ewROLZWm*Eh1)@%Fn#(o53PHvJCM!6@u>dFtXud8vW#ReQ(c2JnD4|Iu+Wy6VX2x zYIhP`%Z5g+L=pfH3A)TGG2-ZTkX_RH6F;iun{?omllr5?ED@Y5Cx)vPwX(w3e z>YR05rk%c)N&wHMNxvZ?lWh+7r5zH!BT#Q~Dh_}Sq@(+A!jW`QOQ3b@DFSroBLC5g zN;hKhH)0HLBthYUM-nb3t%sQ2^VJngwmR*3JZ+doB*qRxNC8-#06YKr3qkkP6ygx8 z>eoF<$RSy5aWVGaD!*J{n>7<#Nt7r(gl#8Yy)mC8l90r_cUipm^!QH9oqHid*OMKr zV^#WygL9E>$5ISMz>nEd7v>ety%67GqB)$;f4?H(9sKr#S{InC5E)^L_9iHq;@P3wRo`^qt8glt-^S#mFKFwgdAO|^kE_% z;|`6jNVn6Ao*UeHe@(268OZhM+z*6U24FAIT|;pEBS7qX8hAeuOOloKPeZJ8T`u~U z$FH3i>ralD%_;JhD_F=?-Yw&3dzBxrE7tIesPis4{t|MRpmRS)<~{R)4$$&Zde}FC ztJ?|EWkgg<2J~bAmi6>>tA)gl?2SKV*fY%kR_}$J3eJ{4M!w@s-Ybv1B^GkCKUei0 zt!^*UhFo#0{G#MyO{ceqY#ki4B3AlY{0&pGtnEU+sK6TnYMqU!r0Fa!Rs{g6-<4M< zEmVK+xBX?95L8+wTXDIuEW7bHK~SO?ywrg0*TdW|JJMazV^Aw50x6(LhY${C+1I^K z(_9Tg(Lmzxy&fNnRlmC2d|gNlUHLh9!q>iwl#A zUDg_PF_G8G+p?EV2Y}E9Cvs1Z%TS;P#z1#V(bTy+as+ zKkzpX$$>{0foB>DzspM0rp383kSSheZn05mcO@BeYinv-dlb^oCUxwD0Br;CrQV86-= zI%iYDm1Js}n1@6(=jQ#s=6iR2|MXY=QKn&B>RxrxA7mT*KA|izfF~E;q)E>bQzcU> zztoE-cV$Ph`81i5>+i6&D`>5u+gQBRhO7*0<R?9Sy1ahgFY-frdALdB<@*!jJ*-(Nk8`xge;(l0o2$>t!d&$R#~|fhi8Sq3&4-Qs zly)zdKUhz$)b1?HaZ7nAYdU9cHS-6R9pdlB?{_5j?_83p+Jj~+fj-CSpRW;^vyz|A zHeF=aLR;DVoKvdmRR6`ppI_X1NI_IrwX*L0)J=VCV6jZ_{y@2Jg@b}^7P+j zE5P#Tqt~yiJWXlfQp=8wM{kDzd-2xv?Y8uBQwuO#YUH;m8*JwM=kMDiiEKf$6<`

t6DR89HcNy%Ck?(y1@dS6o`e?Au@d;0Ks(W20c*XoGMFET1DO-2 z7&lMYe=&T5+pmJM*y2BArOyXQJ+wJN00=_N54AA(-mtN;USUra&PRJ7&#%bjaT}r@ zX%lOcNmG#4AIHFT0R(x?wrvv;-rcHtpBDWiE%DkS);>4PHEYh^uaAc~HVJxK_{^7| z*kVUpGZ#NtNCwul=bYUSX#DfZ@h_6JPkifNF9Oz~V*>-)>bJv<&%QP12<_7^0W6*S zlY;^e44Ue)J5pNyJ)8RO;_@ioFZkd=mUi7pzLfEWgK2pPLa2K8WyQ3dZ6TRcU=YBO zv&t4$(YhRbK(~Sjsd!gPWz(k*mx$Z7coO-v*AS8?T0O(%25oH>&2D7HvWvlOlRHSk5=f&=bSC8{0 z>!2b=W+H2Hfe0fK1ieI+)4)~>i-kn*9sMtFc)1BpDizGZwkxQ$jrUz_yCxOzs#kkF zXi(8oF}>hgjcD$~udCV%uDK!aZyfuXR;=(>$x5`^x$CWNzIA{b+SE_ynex-TAWp9M zK;BxOgoXaOO!cMDN_kRvg~MdYB^D3#$U9RI%UqzJ@K$#+udX0T)4eN`-$;wdZ(iPH z^A_{WzH1mE_6%pEFd0_&Ot;8WcHR7Fu&lFQsPhL)g{8bh=~jN~7xScA9^M!gvK;Hk z$eoC+dv2guTjjCETL5kRPdEZ6%yygVP-c4v?irrC zk>8J-MffcYDE~b;lwKbs@L9cYdmS_`Xm}+C{qPg5>-qidtsr=3Qu{>gxaJeY#fhFT zmxkPLKzycX8UL*8;4WU@T}1PY#$xMBF3d|irBD4lp%ZKpGh)8&ET4fi@7u~W{V}9t zE5b1$PinjPt@Fryd-!ug+$B1|$@E=HfE%K2eFiD*V((^ev?oyOF3`;TidS|wvMWRU zd!Gjt>5?WrfpG~d8Z-HrCHPxo6fEU2dDLftMiz<9`?dn#`UBdaY`KNqM4-IbSg)$eTE!7GFAb<2XIaQbLD{$PK9j*w2;11IR2G-&7iU+IM z|C|q>sBR*A4(Ld@rP*unb!O|bEFc67#W+niw|*p0{D+pJ&NUTMXv+YvPuYlGfCVfm zuTIqAnvF)KNDkzZ8g_E4{?Asx^St_t*iVt?gg)Q0DNt9J+;at)PM<7{-1wRIk5~Ce zX##4`&l=iq(PVjKz?EXzU7Hux8iaLf%$0L@&DHaq^jqbj=XZxei)R0+W(bN$zQCwI z$`Xa>j7dJzJEYpd)p+GVldY}boERp2#M3i=h%EE)mYvD!be`e{^@kcuMutFqXrCmWXP@uB^?3CkJ2doL6{YR^{Cb?)04vJstW&A9%R3NcA!@1SpC8=))HjYLk~+&WH&7E*lZEmRddH1(bWKA0cx0@^fbF zeA~|Xp}GQg>HUeG_Jm=pGrz|slZ1cOTzoZrdCk~s|I+Wrd)s%e-N}15!edZJwmf0> zi%POe1sVm@lwOJQXQGa3q{q8DrbhByYss@#^ve!dd~sd=!RL1vXDv_hRtB$f zM{ah$@kx=HDe%jb5kWt#SqzQAtJUPh$-i@XE%v>ajqxcpq27;tGC);{=>-ykbyLb{ z>LU2}L}Oycr9$IM4{(E)gBBPbBI2<4xF+1@S{LFof&X%f-c4qWGaz#%jmfJ`1)iwb z;y-fK4WbO-#)|_sYcqzx%E}HJk!(^YU;~Q`{fK7qujHo7VaKVYW1N*tSOGCo{LN3> zIDrhbnH<>aI8*A38=tV^&mni4uX;hznF(y_TMPP-+E+lS)9ph~&*!fmw%k%mUJQZI zUD-mXa33u{lcmWkwPNSkr0Cl`*inHC8u>+NkNRNn3HuQCX^83ncl~cuESB;X7B=*YGljKgFIba9;UuwLgwB-V=!Mn;JCO3gG7)=pO1F ztiq_SaFgzMiyRVI}17;{pjc3P71vn3q9=kBy&>w%Kq$~)QC%Di>vEa z*rz#Avz_U}kabU}3)RN#$8^EP1xLx~2=Veag3Q%%dF%llb0BznnKSIf?iLdmtIOmYN3BKNYvodmtuGu2&zA}{)diwqXmJ- zOHE%#Ka5WuaMc&XD+^_%e#dE5(?CayOuh-A_4K@+u+a@u{<;kC^Sl3pPyJ)SZiZfo zU}erxu3RM`p5Q1KclnuG@YmWP7Y2+Qz*%JfkH{3-tD{Q*_ghe6F^K*t4-_6c?g}4> zzu?`$&$O@_Ve+O4AQraJ;~nsyneN*Gh`U?7k`2P%9sk2Zam}G+RB-n!sBj9ABEXRv z72s1LfbS9z1TAS@sw~$eIEKJjAfHg7gvP@R0OIVF!lO>agGNDJ0Hj%qGNJ`l zc$xWkqmW^%TOsJYI15@#=gxQKv>CiOQLwH>fyN+c!IR2NKQ1oFOZ({~*enABf*fdE zK`BN!w1`HQIEn+gGQd7mUM-7)ilV~_OpqA8D562lj{r8of!LsuFTo)1TESwuBHip0 zaK6B`T}9U>sy7wvK#P$GD0b)opAz6*y(9>RxCuJsptM1tW{wVLfLiKyy3BXt#QwrS^XowN>9~BJc>Nohxh#w2NiqF3#AsH%V z+0A9Sqh;cqk~TPAstRw3L-{qsaz<#m4?>o|TJx5+g~KJX%$qomHXo0>KOAVi<(w)W9Dt7s;EFXlS^yBcMx6}c z`sDw;HP|&AOhf+k=fz>8U>?TZF0TxW_@0NHCOu9#WhR0pcxuW9&vyTBAfvqXfOt6M&u*s3-a~ zk}H}Fma4OSn&ifs#DUH75^dyU!6JCutWO&#xp^+RZSwxDDtNoyQ@|wvnk%295>P8? zw|w^7dYLsL1Qcru{6G0*8f1&ceW6;uIn=A;67W{X< z#<+zB(*h3~fsu}Mv`^*8$2%}UN8I@ulo59?hK?z^RlM2u%BW4nxT#2@wxpu%Ma$i3 ziFV!bOavRwbxa;%gTK4Bj4rm{BUXZ3AzNt(dny3J=!^%T*=bYl3{(TOwZ*I?`VHMh_N0BYYiI0InES@c9%(gjUT10GyF%{K`PFIzXWhYB|yHeHvdY0Nqi6 z3>N^x#sEzO^wt#WBNcUW3H2U;^va)8HHnB&M@2il2vTyzKqdDfX~C$^xL7 zhuC4j<(=+0(RxE@Jx+ugyHAKM!eGrS2-nsW?^uox4$P4k8W_$+w80MKV>k9g96&=mMX zpZY-nOH!+fE7lBl1{NWPZyYq0aMgRQqhDIje)F#6VGQj`jwQwdIP6;=3FyG{=zRjJ z9oIX<_qfs($V=!DW+3;ejjkyGpjNld5RyJm`KW)&1#Vy@^KG#|L-6s?X*RSF;Q! zX?gvz#SLeYQKMQ2muK*(Ego^zDbCc`Z)Z-=6a&p4RfF`0M5H`$^`i@afr?!Lz|y!k z4|3{uBknKS1JE?8GRalYKIca!Ad$^~UdT!U?laJOU;6m~JRxi_@AYjmFqz(W zouiEd!v8)*Np<6*kRE9?9<|BSI79Bc65|U$6Un!10?;`=Q`y#UbAKVb?J?D7H1EsI zR>~qZ>h;(D>XN^sy^orA@+PexfVkd(cg_9xBhXaWDQG?tp1<@?^1;K0AP6^Rf_SBW zWiE_>UZ&05lYY_R^y2pekfZeebvAdd` zG}~J>8>2He)d5PDnC0O3cGz%9c0b}a>T^}Yu=vy4(r+6b--aNYy4tw=3;lhjU=aIl z#y;RQ0re5U1G4}MThOID*lKVd;o~z8@)zD14IN5-ETZ}D?_Tq!!{P}9T@t0_Bz@1S8k*v=P*)SX_tzFGG%dskSk6cz=`#K9VAsCQa?nF6p7YQtK%Qp>acA64(f z{-KT25L*o7%~U=%fWtyp&|?H(B`4tD8OZVruvCG!cQn?ZTCa9G=H5rv7!#1+*@$A= z#~6$HO+LPB5wH+fNR>ci6m5;~@p{LDyQ+VdKTd4CLVbMwRR_j~|C>Vl=A(ZD9R9K4 zTK9E2$I<=I+R3T|XQ)%uS+un=SPKbYX?>;EqqnraZl3@fenyLa>F@f2UU7Y%pXt zGz%d%$x3Qw04Fx|5@R_pxzdRMtxSVcAG|dg`;p3}M1T8nk{{6c`reqzGYSDZ`mh?E z3_el_vCiQP@=_s{YN>@;J!LJ|-*wQcxz#_hu09MtOBq(ZaGxgX1OTRWclKE) zCwdq$wP>9G8(aVoU0MXC0Sdn{GH*V9ab@2P_4-Xx-?C~~4Ej$@@e-s;5Z2P9ezEaG zUfT_yrrsxOn1C5rvf$&IN~6?2ODgrRTbj~Znp%$>v>k6Vy3l(3{>Hhtg6)N)uQ%^5 zaduum`LihVXJzsh+xyQWj*j57wuj&T7=NvrJo{(Guu833aQ$uDH_qK(lk2Y^y}Dmh zzl;{(@N!VRu2Td&35rGuH%;LNGf_Y-zcK+?YYIova(!W%8#I-*DNyi!vF=c+azcu$am<0}+?kj}W_fup)2!zB_Wm;b*LO+(&l>T}~E9p>559el<%# zMPi*3Z0s=K>2bf{Yqwplc8=)Z?3CHelGA&ed?iBZ+fPLAVyqvlM*59R za-}gp#O;t`OI@x_GRZgvZi#U5oU}^{e@^$vzm;>?l&|R>*|vAEwU8!reBS&sD~^FHW;C z|6ZwN>b`0IASl-RX(h{&#cZsM-4tJQD2OwV6TMP9Y6&SgwHsJ*#eJGNZ5|Zwz`e@p z0h;_`epJ$p%h$b2jpqw?&q0nZe^i{rX8JS1^KX3VHqt)PvYAVfW%Q$-RvJ3sf-|K> zvj08UKI-jlxG4*f8EIO5DetpFsXi`I#BHs|Hx1YfRQsI7jqD-=dK0ShiaUkuDVcJnVZQ-7H`lZlPP ztf7x)Zpgk@`nq71E77(vh}6ZX)aPgj2LvOCoFX|iaT$=X{2yHgc7A)zbUsttJ>aQ> zbfp2L%FL6oCX);;1|njE4eOv+;{Pw=TW_D4B6YaNxtMKPm2RA)bCZ+enex=AcB5b~n|&ejIZs3ffK4}5d}+$#D<7)7 zp0g6(mId#wRwX`<7V0zqS{9I@J@rvi&Mky#C!wK9Ih*aXyBEAQ{70#oB4U!Or{TqG z)?NfI1?HM+E%<#1-h!q63XId8vTR(|YSX33%QScm8GOYfOihBYMXn3xV=LLjb&v^1 zStc;&>44aXD#T0I#;AARRE=*P)^r}f-F}R!J2W8u%HtKMpYfqsUHUv?XJ!TQbFCY#z zN{zcK`I|t7I5P`RP94XsyAHxjcXBUFt?@x5WDt~j%QgQd=tp-M^M&s@x(D*PwIAu* zsrpoS)r!dHKKk$3zC$lx);aN|XN5_uJ$Aucrx>_r6b?}-`U=2PDjmG$m)vT!AVLb- z#sjKf@hBbG3#G_Nny?qljt`zmdU$(He6BO!=DnqiFZ-~$4}HQ%%No7Al_}yn#}YMi zPkdXvZmvo%xZG4H5=xNVHQE~_{sKVoS|If~j$plKiko7y-#a1=GfvEE5#4Rd6eVmK zUR9{$`>^*Ep4`vx5BI2(p5{t`VhS%S%jJ%zxJjPfDTMx$uiz;U(!W!#6cyWb<83fY z(MwstV2GP4PpqiP`ps(UoUt?_SZaU$j?iso9L4s3Q1Ug@(1F#-%m_?7!^Xg;_P@~J zH-WNJwv-tbP4Iv{Z0!+0op-^rjYCDqaTAhmyu@0QfCfn<@3WR(Ve*k4yz>JGkHU@> zY2%QP_sNd>@dNfvRwoCz!`=d~CVYuq?36M^AQ*6`i)7hPY87X3j;o zF*Jgppq`qw`lb`1{bX4rDBa|%AU{V*zy_)lEf?h;KF!I z<_$rRD{Uw|+dbDew+wN>kHA$zNb%=aqXi)lvuChA*DDDYiOQKXk`|F%sm zk*-u5wK6xfy44WGeQLxEQe<%C$O%Y<1xBj{N0wLcHMXGBj%|L2EAvwMpK*td1-LRy zS%Az>*L0M}_rmbjPm_w*n~#CL(Xp+vV3j74*4LsuC8@cLeA~!+vBpV>w+mS3>&|!m z*@Mb{j$Zlw&>~%j&6|E>qI&|;Hej=W-$lU1fxrj^A^Lmn?dv@syt#VF6%-sSnTOYE zFe(t__g$BJ$9d=lO1UUEcV%`BQ|D@<|CNc-HED)AP>0R_3Ff-O*06uVcv}e3kOY8{ z*iYr($F2&Y<4XsH>GrlJ>m%yPlusEuU$H+v=G3KW5lQk@EwpAdNLwKPAUj=&O8(>pI-FJxlf2RTQ>cBW$w`*1-()VN&eY%K z8Q;vl_c0?Si{e8dKPISYdVz#ZnEE(!;r{{TSoHld-Y5o_N(b7_HP0Uv$?P+@Cj{4t zH5TV~)P?hTa}=bTs5kM~ZuX19Jd{&eyqL5BTcThV+elZz>PRk7j4NPq;MIDAVH>e* zd%-UklbikD=aHT%prjTxR{d#+5Iok}j#x&t6?|Hn)LFY_ktCGeLbpq_&Ry@w@Y=Au z+MQv{vaT!xYEr>h54d1C-fzV6lx4mYg&azXeawnbb|kCQ9_Y9Qt$9T$%Z2`R>#-w( zt~60n*eszvs7KbZ+#$Z^@~6>}qXoMoIew#e%78jq>Gsj-_8c$XGhFXyp6|$lz~dTsT+Q7v9TTgl`q4InJn^tWv=%vh3hIWD zrePeDx!h6qb>V1|7me~CL9ZijFn7&@jTe7I0!FAD(n)s+Nmtm0F)Ltpn4it)O2>g; zW3Be+QSBqH?9Omu$D=e#L|-@73#d<^BoN3LgS`Ji<~E*kA#*Be9fMOuS;{rjcW_pmt?IRHb93>-e}y;|PY5*hd!K z1wwKJKCDr$0w28Cc$}J;c|K7(l>v>MdcMR_A9)q5^rn)ped5`&vorf3XEu&>&h@b6 z6wj6NiAqY9?_(Xa(GQcgO!;)^?$fHXbKCg_Fa$*rc0QDaEH%M0=nKEhwSA> zY)SN$i=8_Ywo!5P*OjBFE0gV81yLA>SUFx>=kc*wh^9SBF_A~VEHgPQGcB7KV+7T= z2a1IObG#{)7pH=BK*GDz_I;F?j!J~c2=dxJl(UO~%|x5^1cu};^fyPwmB-XI-L-5o z(F^qKvhdLk_ z=J=58w|U(^K0j0co3olrROfIPgj6sm+O27vGC59(w}%*Eq$FK4uD}#xJ9)wvpvHd% zQxn06sJs&~#daW1Hw8DF{86;N=jp0;#o-q=@xwP|k(-N@FfAo94M&SKkWm^)KaBLz z>H3Mko*39mH;t2;mM_(L$tV9#&}!X%)Mo|MJr|lz{&JqhKYQ6`-|PREC`tfb#!xi2 zhHp-}sA&*lRa!E0F>rli*Q?fFZ!-Rzi zAlSA?G}3kjr0P}Wo;K`5{QImt3hsli4>uso6L<`_GIilLRl7hMQp~=bk|>a&Dv;%` z?5bv8hmFCwYT0NSKy(9&(qFpT8M_>m+Fs6;jox0m;}7pO1tqFNLlZNvzJPp*bGzIJ zVeMUaQUMdEGS6WsSNovWY%`ZWN>mml+yL@lhfxvSFGyjz_2lF=5wG-Xi^Cy)z5e8& zXi73c+SjXgAZlJG3Zh|uLa&>s#Nz#Lmy!rLX2Ax&*lw`f5Uy%TpKe|XO36ony{?yz zs&Qw>-LGG9Lg2meB<*O>v0ak%>Y2(7qGAV0)qp2b{pn?IkanULn_YVnMpBRFLJ~-o z@&4xy-Xu;)@tCy^c|QLhpEH{`fPoqBJj<4`IC1(KaQEVr2a<>X(gS}}=NlomOB#fn z^*N^JGFa3Q3(W8kQT8(pn9vSrvi2539mVePs+P}Y=ds1-j)N~O%Df2>?j;>zHwU~3 zz%^uJ%>pBa4)uIdIh-1(To9;I9jMwKsP;He{du6qn?TL4fkz?QR>| z>GcwQ4+4*7YS&i0@<=IBD)YVNR-sBI8Js|z_r@Ql@|gb%;w~bTqJ^(iJU;qw^_Rdk z_l?Z69Itv>(~%%X=G82SV?*Zo=uEbIo(z?YUm(>x6hzV>=V|LVW`Zunmeo!A@6c>QhdJrq$VYwVo$$Ik3?Q~rNNGnXxH;#*}rNl-T zklNp?pLpgr3JtfQvHj~V#sG!bwU$m*sOxSggL%v^kR)~s%ZiAKRPGfe;gsp}oG_AN z8Bw8$q)Pbs)8hH>FX0kFFvVyd`NXq|R3P`ipeRs=G2l^Vk(3EMRx(*PPkdC~2)7b~ zm9}3?$x4@x=22qj5<7rm_CPKcI++0y46`H>NQ(A6+O#lzd!A0kh`fj1dtJu_sN z9HDztoy-1aXGVo(+9vXpj#8bnGTpQ?qdUOdt;N_dh(16>TnpsQ$o!85`A1dz97E>1 zjSMz2qF9-s0Pc<-@F*2>E;=*D6*^sgA>0d;(R`$5j;x*ooaLO!3=5M!@0IxxmHFUV zgj)6Cl;~@x>1GOMc@J@sAhpwzD!f;=Ajo~ln@1Egi)$}nqz6pOC4hg50rZa$OpFCO z{2J144Sk=>Yjsf|G^;;qH#2zw>I*BA!5MNFJYg6L^F?MPgA$}wcopLq$C!n4kas6S6twlK(WSy!k6mJ22^W}Bw0{Kfj>FaYju`F;Zm68}H?T~ako}s$k z5STGQ31`UNhAVh1 z>5lLd5bO#>Kaodg>s6%k8R-rlL*==>NN}KOJOF}{zXSbt^pLjlDN8SCTy*+L3P?Ha zo61=~u`Sgn)j*4>%#*MVjhb%*z2C0lcrS-Rb+`<5;{D2*0yhTqthRz+G$?h7;uQ-t z$)Y6DKtdfrF7@=>8ks>Qon!rvGb%pC@38<4=sRltjbhJE(_NsPvL~ufWhS!>?Zabr z({@C&NMVHEGt?NEKS;0xD6B=kv@rqiANVL3W&3u*m;(mzWnc-*_xDa^F0+sRo{+Szy5*Fr3^((QQ5a2C|i}A zN4Q`!q=rQqzg)}NUCJew>t*4yI#XZtn@1!mOj{WXa8t*#XK}9E9LrK8dpj_UYLHgq;s;6XLSql$mB|V z7Uj(s{~t-2*%epPcB2(*RE2yRUg`>gAh@K>O?>(W>THt;CvbW6cWX}m)uS!J4;mYX zpA>WAV6Wz3nWNVan+M)*e3~&{tkc`4*4UvqS#5Te2dNsTJY8#BD0jRiPGzRyM2%&> zYR|^gh_4OOqf?QMVKhCex} zztVtpl(S-q8#X0}5;V9B)%CEwfe@V=8g|LN4#P)^vxs1{q91JIjoxT!e@Z7;EoxgJ zgU?Y2KXl9Sx@o`|r{4Q#=<}+8t01&yioy5QkwW=n|2khiy1ZBY;qveH`T6xA;7yyG z^>$9Z7gnxU`u=V&_B%Mr-1?*a;+DEJQvTG0$B5W}zemcbvOyzoL6v_24c-bog24io za37>-k077?&O5)R$igB}*jQ{0kFW+PR%F%4)=uC>iH7i@hD4lDpSG&7Vn|nm_ zCHW8`&n+mQkY0?A&lQJyAv9@hKJ%Uhwk2Zu@7il$qXR8+;-zb)YdY>;ztB<#pLJ~= zwhoW1MY@@AUFymk6dvh2p0(+y@~Am)B27hjQ2ZM$2vV-ii|12MsANfG-icE7b?6R} z<3VT-b(A5sIjsUV&WTw9gNTTgU(dxAajKxao3TsHjWwjr=EAJvoB_Fm&t-n-}G6B6f}n7qYN8jI^Cng?6}+2LXL7m^FhB@;rvGIJp=+Ua*)jwOcC!BUI6T{)-- zxIOzEbc8S{G|3Li6ZeVy&NBJCj4!Ea56AdYdf8S;Tz89X4bo@I=;^WViGd>$gt*}1 zlC_~he(CNCI&U#uXSrh#Z6(#|Fz=>5DF2t&Lpt_YCppCQJF5h3{;f|GB==VxG>_H^ zTS1xsx3x4VSZi{6(rA}`k$W)xG^qJJ>uCwnTcHbW_O6sXY4$8q8Y`m zeUS8c*^iSY-dmP=mO+c$z{^nBPqc1Z*vEOBNQ^vxqG{4sKHXPg7o8Qo!2fH);#%&HNXo zJd!^?)mpWdK5r?TC~FkZZ5dSJivvk+FrJ?L3MH)g6~+tLZ*iw1P4`EM@SG5b1;}%4IbEPdjI#g2qvKJ(rWhJLml;fu$FZq#WXQ@+MT&Zwa zEqv4|P^Y9~SwShI79>WEQ4TS5S8@s;^BCxaYG#q74h5*yB903NZ^@}fsOY(`+`X(O zH{KAO=A;N|gl6#sxi2i(HB2z@Xd&6!bUBb%^bv#kSSy{~>AYuqTXq~xz&jsqHsn&h zCI64Ecd~Xb2kSQ&@N-&&M)P}xx{=K6f<dGD4=9bO7Ru-XNx>qo!kn&36trs78#P zxQ^+{fthZ$2-Q;22NB%<(wL*^H~U;O7VRvBp?26nUZ*tM*okae!Gxr2y|U|AwX zk9PYF1z~3}iMG5?2yxL}5j7K+f1 zL|!PXS`3*^5s{I8@;$FHE-b*^Et@Fu zgPz~9AKdDt9w9j?QQG~(N)*p7MNvHsOcO!aZ_!WnHVPzZ?}_O6 zm6cR?7A6Q-i7qxl&0uabCG`ZvJU5_RnczJ!KtMd@5*=n^&{I2}%5^VcVt1)v4HE16SQ)!!0PJLyx(DF2@q`s zJcRy^Pb?9)oZAFs9k25j9-?i^aEY?F-{bpkx%R1NNv6N}M-rc%nq-#pYPn;`qLCfo zs@N6iQG)jP(qFJhp5?gaU2gtlibFY97S=MdV5d^XeT|Gucn;LGGc&_4Xtb?}r=;;9 z-aB7Y){@8G=sS{DJe8MP76`VnW{STTEYyWfDZHtGn8|5Bw|VOZDczuGKc;5<=Uj1m zMkWU?+*uf`8~}c$a5z^P0y^3eGzh#nWS-n<=$}uP`Cj5-+_Zv7J&+e_fpz!JjS*n3?(c$iu zWsy7KBENP=M3bj-uYQ*Oe=Oa5IMe_CKk%K$Hrt#x$1&&QoX>3LRFNqPDRT&+T2e{K zHq6;bs8mxbm3mL9RH_{uLne|`8mV+1sZ?seeZJT4-~F@e+I792d%hlr+Z`Hap<|jT zVMQ#9RZMCXHNo2Ie3{r_L;#LI^c|kR3c{8?>Guc_COjBu$G%+o<89nho-Yq+40KHs zs;}@X^HzwnVO%I7mk#nFuMXQ@d}$w>6rl2XiUSa>~V|Lw_W@2wNH)7xZX z`?!-w>cu`&#m#M0ZyeQzNA*c#TV{)W0sgi66x*T^9|+Yho9ZJ04~NkBFDV6z<^G_} z#qB8lVTI@a zgdhR!^Rz6sQ<~bv$|XHX{2oP!Ct-r>(Zg1-evT7j-%5}?UMSF)Qhloq*-QxUepPaoXn9PMTn$P$NvESo}9(? z#H||!kam{o41m2>O15f({IKBH5<`RUWDPwb`%}EcA(GZcCIVud7r=f}s&^|(J#CKR zu0OG6>l$y+r2y&GXu1bOVd#Nwexd|%;dP=E=*i&mJ!1fHLinGv9kyEq~q-M4;NeZ^nQ>=#r441{` zNJqIXQ0YI*;kh1cKcr?p<0BjQgL^(4pC%_)1%xWlwWTO;j zN+A|j8kljA-V{T<)1js;&FHhkM|+Hd;w^3qa9pZysef=XP&*P>w*Ww8Qd(rTB$azAg6As zqNWmyc)ibt?%*kP+dq0FPQg|THRuYxDu5nps|2b{Y(ItP<)fw|NUhnn~Xdwg^1(^tyY3TrvR17 zbe#el^2k3)Op=rxs>AvA0_Zdq=7jRsWT=O)BpW}BQwOlWn=);d+2*pSHRMvQ0Flcl zv5yT{Kl}JPY-3cSDXnMLOA0m)edAYnE*eIRIUdnFoG8}}+_FUVS!SXp3N>URA7^oN zEN7cq64>Bud_#aoQ&BU@Z0j4AcP2B@@qE%G$S)71Clca6q*U~RH|dF;3y1A8b?Jga zWj&@wBt?_VwE3j?O;gr{idCxvv6VpGJc^)=f~{k!2l&&3OvxYs&t*FYP)zdJa`PUr zb|u9ZTNXAStl@o8-8;@Ba??IE$k!YEp;PLz3^r;fqnd;sJ=C=gkOpNvMc$4B;F;v7-&?WV!5Nq^FpTe_Xq9sD zJh2x8_>?7M~73j1#^WI?2G7bb2pUe+m~U zP&b|N)(>ZaH958Q*$@i3u2o!B|vbCww3F|yMDZ;l+rmZ=$vc2 z@sNJ=H}qDn^#x|e9R^o9X;eW&DShF`#xKuxeQ(_e};pGTW$$@^|v)I1N*VE?vS; zu-!6i!n*+4A(O6L;NXn_q>1fSJ6jDGTMoK6oMLos6k1#ARWlB|)#7y3^sK zZ?ygt`h4ef+OrQ9esQduiSf4zJ{CSZd9|K>{tg-WN$6WI*0W%$kto>Ev#%O@d{(LV zv>y8&?`hn{)=8#3?}$Ni15+lbCIM8l0H$jtOF_*}P8DkAfqj}-8hT8%DKewP?sVPN z_f~EAR`xHu^oC>Yd(s-htW;We3fJH18R~2Mc8Bdra!@}D_CeVnusNq`B69YINBRoQ z(NObC?6PIZM%FsF&eP!oqNuTwL-Z+uwrZ3iV>5$H+9?yI|BK1o6rQjGrt zzHJcs^@yMzHHax2NMnyHspe~($N?qt10B=iku_|@J|yaubG8Jj*nvwm5CBM6uzjVN z-V4wrYiiSXVOjyY3sjXYneQFfgbxaEm16JC_?S+R?DnoKY@Eij(CG`+HBvEG4^e9j zKyif%8TRhAy_11^$hItJu8Pw#uz%0jSO#75m+yI@Xiu|HZ2*Kb&|aZQMskpO@4W<+fXf0RB;g+A^4|>^ z)!SbC=xHN(WK26~NApSbRk5#x*)j#t=wU^DIIofi0=O~}0sw*m?BFd?2_RH7B=R_%%>nSF(J#j}l4klk$gg6&je=WN}G4qzr%v4T#J z^C!fZq|a90DNYLDG-uI5Sg0fghPpB7kYQDCrn<$=M5?elr~}y!^kbMBdNZ3Xdn1*p zzTF@Uc09O#!L^;K)CE9I2v8Ag_gjjjCfPbJgZ^!WTFFn(3CKs)pr`?g&j8y-D%5WR zVK#x}JGJ2nP5!=os-=W!FtOnCf(bueq+vqE8jJLjMIQ5POVZ%l=YoWrozEsg114Yt z3B`)sX6_zV@kDH`!7?snIrUI|lST2Jg?e`s@Ue~o3B2pwAlcHvTq+S54jhP1=R68jo(oRb=F*Yp6eUn)uf07>FdzdA2jt&6SDs zY%i?B-xd+Q51KRsYoa9qm~X$X-qd&|zz2wk&Mb2j-^#|{1jR}!d#t!A$@^v0#FyXI z)2y?G$(r*bpJnm!Z(y%v(e{}R4i^#=G~ zT#wEwxOaUyDw^WF3Vt4kMgF8Z1qcyc6u(umS*ux4HmdX;)f>R}=@Fk2kzWO{KQugPD~R;Oa)?=7X860#dk*P`P5Z}0W=l^ncXLzPohdyls<&8HMjEy%z` zcz^cI?sk;=0>xsUWs}U(iCbrMuR+V%-&)49Z2wyR{)85dMbv9Cp!;j~2y`+<`lZt9 zAQrCB-+s#9gmh|{cGc9vr|L8%_-`@VnQ71@vY+rbNn`5efLK@G;5x0elR?A*IQ|mF zEE)6^lW3F-GJptC$-rkvm^ZVy_)L(UOk~lfxKR0V!BGHZq6X>9_Zg>*8c~3 zBYpJ>d;5;R_89`8>+;gS`6X8b>fAdGLtk=9}%<&)Y{Dp8Qz4rM#3fc6Lo; zLu|yu#)i;C-oV#A(8TfUJD%Rm*L8bh5R4VpB@quWX2s#0UDMQ(%(~ zwrsvtpnqup=jXQ%{QRe%m$UeKu+iu$Rq*G}ub)5V zuP&A@Cs`Q-RJ^f5$TM|@-7%aVO{lcDq7AOSskDXiIGZm!t@*FRNPIp!C!-Y~8$BC< zU&+Oa?h|xs?O!-%tS8qYnk##&4JP&kE9bXYiHKhq^VP)MvY z891O_m(I)XZ$ua|NpqqsdgRFDL&7zq@}woz^UB!T_E3&V;$Z*D!#ZoWHy>&`=zqJT zDW}BH-+jpf<}`gV_{4ex2eVUot$#Hp;sf*Bpi#fq^t$7pCm(s_Fq<6}y5}3)ZQFr^ zkvAsuOm)Aj=1n+=i)rRZD3uw+Sqcolu=4Jd_f60Nu~uT2EaWe0Z9>U**_aqyys6Y0 z7O^z;wgQ(}dPXbn)Irfx4(hS|()QJCMY&er_;}Of!zot}CL+gQJ_B!D!S_NmZ)Q1P zZ*{7?zAbP2jmDddlLb2Qx&2!=f6%%z*_d(HfJLd?C3_!W$uzBCqI2&&15tIG7=5SL z(g2%b=F(^rHUCEo!l!t_0u|%aS(~cq4SFg@=qhN^#{2;0?108wY3eB(&|jd3-3p)l@3lBgIz?M9q9%%`Z3AIa9jtyj8;*%?a=xq<<0Fcw$d9rjjR}Ba7HN#}-oMG{#<;g;-DB#t`=g*A@8$e6q_VX#UA>oIbFB+aNjlu zc>Ew8^-03PD~^BMfXMI~Z7u2%50fP@Hb9JVTqk%~?WPt(1w-lea1ky4MO4?`-Cv|Y z4A-e-m%CbBUF*DGNL%&c?la0}D{zAs4j4~{iBf2qKQ>aR*jK);9Lm^^aVz)UGO}UQ zaK^S8#_f8O>g=`Vf8VV21F?N3sQO<^`yBt5ckeE$I3b*KbVR^UixSZBv;makB4&$# zoM_g@a+4XsIow`Ya2m|_x6GlNf4#7<5Lke72HU2A4G)C?{UW$!`6RaT-_>`-2b1N8 z;Py8@wOv-ywLS_exon{M>2dCY7=Ns@(c@cCo2NxhXL@N^GRs* z!4S-sTnt%oqz0lG;3_i*lT6mt##4(PJ}wvDfYlqS8?|`#Esh-i)Q9`S@7YAyaJA*e za7VCnW|fZavwX`$x}9)_H5rtq~vDMX1US$ z=RR%1INK!oz}*|mb~?KCE1bJuA1dpw=*ERflZ!zC~oaPx%+`Ja`E}Elb@HTO4 zjIp2*PuhJ<3b|>~B>bM!XAwH~#_m56N~x3Kl!uIK|3|IKb$M1>SrIoZAoq->UG)q5 zL|L=;C+f=r3>Uka_&KXFPV?Mi9P9+qa9u!m&AreyK7+ibDf_<%mU*2Z)E~mdCVY$Tv@i;E!#Jw!Ja@M)a zZfqMa+n})RqhG9`_|JKK>66udxBCLsTMoo0NHZ(HELF&o{wy+y%X;5ei6Qd}Piy{x zt7mm!Hqzc19^k#8Jt)WcwgUEU_sNL;c)6-%WM{zL6^{9a=661vx6c-rzKGRl>^3`o z<+yKh#!@_I{BQl7cDnE*xj$^z2U|Psm8L$NnOa3ImyN_e{qcKMx17iW!1AJleJoZn z+TFr<1`UX!2}&;h*COhE(q!3;Eh6F)B2P#-ZjboV!wRipcxoAwyI7N)34|iA2Kfd> zG`!RU8$M_QP0UKsdBZ@nVRU^(LVMQ6Pp@$?N-WiCY*EjQo~^^~O! zvwr5?@9~x=>0WLM@wK9y8DV&8u9WuM1uY`>NnhiJe;Ygeb3kvTi!@$JIV9c=GXw7e z{h>Cf9iyX|>~PIsCZyNGcU{!*z+Hp!kY1~sdocSdTQU*iV4rHE@~C>EVIM9&?)z}+ zu#c`J34NNH<3eif+hJs;R4=V>@wM69-4Qew!n?c|L0 z&zJv`ONS7rFQj{i-$(N^_9vqMwW$53qiBKQnFQrzb9FtY3Xl9gN2EL{RdobnhsnzR zRB{SW`4L@Zf`HXsFiIpK7YfxRHYy{ay~%Xs0#8)~h`uJ>m<;u}Ux>D9!A=q^P5iS# zW6D-$O2c%OE`YnSC}n_vRfw6_00E+*^_lDGAX2SJI%jEMvy{>EE4ftc`!MJRP})k&uE7E{i@&$%{_SG;*_ zeWdfX6^X=ZfA4vIRWUz)>8;5X?T;Pa3wC1$PhT%FR1Lq48QvqJe4dc4q;3^A zz;6+Au*9{^Aqr)`0_T+OJSFbyW9j>q>#e!gI(WolgB_u88tZ9?9!vNW2q5W zT)i7?V>)*VI~lLjq4=bd7tB51J_x49`d(Zm9pZ)^q6Kg3I=tqN^xDU559krd>97+x zlQ%4f7qZt+!$vC~7E&wL?;sB9#fXX)jUn5EM$foj>-?>KdH-eeLu+o@u4TXs<8H9~ zAD%OV4H%@8p^e{*+v}r5?ANia;7&1qOZvUJxm@R=&Ya{yx#Js?TV&mu^uQX^iqHd! zDF@QffnDQ`4}4;qnVOfiv`-bgsIIlE)pO8Ze?X5t>ca*sykui{O;FV@PF)Z8#l8Jj zv7V%9s@ORGt3a9FM0PZU+{L?aQP)<);l7GK_o(l`v_N>@ZJs&xL_dYjC)gomEL zG9As=@wclE`c=1|sdn2ySQh*HG~dBST)b4?s9WzYPegdVshkTjP3ry`o;f}7ZP>IX zK&?#673ERwb;a4Zoqtr4aPkOfjV2qn*e1Sk7XJ(jj!o21C{&|edq)}}&j7)uBG0)H zr>{NN7yKMg=F}n&OsHe@EmzM`HLoy!g?fCi95bgZZfDn6J<->oY6#QXAe~b|s1`(o zGdtWmSO8$FoP9y8(!6tZq5(}>RcGmZ<;G5;>;@#0o9*V$vyl!xHsbZ!b0HT{u6G%8 z81G{wSQ)*E?~sz(sXmGi%II$FSZr7IN9kmI;;A@a_ZAPI_@_vvb!;MExdC2>s#US| z9_!cI;xx9-@3mx%$b#%1+zlhjIe z#>r(~dA7~5ZzQhOU)kt(k7J+C%_&y!5g$F~fOS^oV)#-+WW@F@4o#FfnHB3ZODUyG zyk5(!hxTnerc%8|H{HOQjpx%ufu=Vm5)nrs-?0$=D+9$gG7{_nw<;S$*`o1VfI8gN z0`+A0J2p^Yn1xw`eF_*?Eu!Y&r-Ut_Jn&VOtg2L)S zeCz(NblNI5k!=y0WLVBH0?9e=nG7ploiZ;oTG$@797X81Df7k4Vo*D>tY9$RHX9Ldy)(WbHwYCYchK%sYyk$k2aBgW&&3t8(3mW%5!WenPb-Su%?{?QUi< zSk|az!|?r63L}Pg8rKLmG|Y>}v}YF4DH0$2yqWHYXx^9W z27kT9ZD#=N_!nZ7fehlesY6mS1J;cVVH!s39dhtB(jtwC3XP~~QM&*@trKYT+u@Z~BB7yZc9Z@uZmY@P4m4N!r@`|nkm5hS zc-I6NQ;zbtS{W-Zx-CHccef$_?9=kRE+U>S+vO$JeUcT`f~_D0;;#dHXL`tTWG%PE zJGR@SxQBQD=M8J&WV)Cs5U76733iKhC{O7D8(vhpz*Ox<-gjLY^F2mUPdB2wDtb#= z4HtqPGsE-tuXNOEI(V(io74EO$*_@6p}&+?XC)`VTxQZ%;ux@Rvj+%$S;1yg1h|KQ ziOx)8b$;R2q>{cLfQ?h@w+m|&tyRMKrG|#G>4?OYwJ0N+eNK|)%)deDt`uCbua423 z#VRBGinRFD=gQPC76A|PXQFyPI8@CJk`Wzk!CuF&FF?F>9s^PbQFV;lIjhWbKJV9U z(Kr;le(#i+3+-szNlw?;_-o=Q&Ba@h&#+m1$KvI9+ZNtQ=lw5Y2{ic@Hau3aq}9bc z*W-FK_7b=1kj3-E!|2|sEYF)ejvN^Ro$4cAqcs+BW40+*XrY3Hm>3(hy&V@ssGCLS zx1V{Gxbx>7C}{VNGcORYcyPkfcZ_!4tnN=j(M@^6V$i6Yl<{AwN;MskKR{GVTr5*- zl|g0%bd@hOyyU}0dVj&x=`;6FmDyfRESY2(;>{6gAA^sz?>gtrFN_<_a08ZxS?;)bKLj2u+KRKd7!hlGMLFy`q6$}lc#92Tb8uffhV>1@;2{v z(}oPYA{L!&ztOi&yag$SWFHA~pVO4L(D2v$_oZ-=XG!6=HY=}^QQa57oA^p&So#pb z9c!Z6t4O!HmiMQ3UlJGnkq28G2Zu6Hzv#--lM%Q1m@`thnWshgF_UA<=wm$FB4NIc zDwr-X&EVR57J`m)G2=4GrMIBnJj^S_W_1ZD6^l9G3@&Xvta0nG_Pd-F8Ipq4vM5wq zk*YZV0GD)tl4U-Yg%MZh!j+m1TDX+%sntDYzW1(NE%)I~>tlROj|5^<49ewhZ*yB8 zeVsfi$bBW)EvwUNDy6IkXdRjbrAsitBlb>M$ga6;mILfDA#Yd$SCp$Y988{YG1ZJ{ zPy)`C4|3KZiJbSQr7D|GfYY1MiqmqtlgSJhlSj*4pHp>r1^z<~8AFH0$g1Q5h`lg* zlz|x}Zw>{(Ul(G|a!HN^*hd29JON4(Kt=TGH;W~|H>dAi!Q7x>zHpU78ITl`%KNuF ze6Y|M8k9l6yb-{nxX|@nEAVXi&GUtv9{2`Xl^!0t0SHFB@5ScqSgy0El0bq9uu&Nr zH$Xo*!2C;xEncsUAwcyyRpRB+DuXip=QK<=AG$^gsgR;4()5xCFptRWgkG$EE#fyl z(}=zGRWvk%M$P2cMv?N*b1|>E@GveUNr1YRoD69JRq-OGni^DrU_SuzCm$^@RC&f% z*=vc;;g^}sf>eHO8j_&CU>n!&x4OSk`HiVczeFXj&diTq%NRiZ6x963Py7*u8DXHl z5HX50aW8X=&6Vlg?qP#-QRMW&)X zZj$c7Qvrg5X$Uz9Jx4~Ptgv4JN=zg0ExlsE_i$gl1gYtX=@Y;ap3MM`s{ymLGBzUg8X5hKg!#lrF#!I;97v{|r-G|L z2+_HyIt$TX(p)cq?&iT1NSTAwO6U&WK!!00FdDDTKMfkifcO!ho9F}@9cpk}yCzuq zxg|VPmVRXkto#eJNpkuAZ;WWtFH~|_9;Aq!xjZm^`P`h#`oc>T5;m9y-9)Oj7D3_x z@Kh;;BDst#scJvoe%~s7ENgcP37)}&QuzCH62PHS<&;*HN~z1XZxHE+%Q3f&gZa>I zR~U_}+4Tb|V4R#L!vq!=VY)hcM>qCG6u=X}=(&q;F7D~Av+|^C7fjJsNyXktdRL6` zY2Q0!BGt6*`n^jXW_PtTt?kv%7)qx8m?EH#CjZqX0@rC0BGDz{zyPZUF?E zaU;2c95JMe+K&87R{jusbC)&VccU69DR1|dTWWi6LRz5lG^ks~t?=i!3Us@;Ki0!$ zOV(L-m7eG-zuQ&$ysP?87gzUoo!9O9Ew>vE-EKN@`}mLr%w6r|-P=5CqXN}CQC?n# z33pm6$f7RmiUsw2=CxU(s;2;aF}LeH>(;G|gQ*`cY9t&4f4B?oxND($18NkASiCJK zcQtP5NDI8Btlg=(2=*|7PHedsMZQAX19{?w4JEsGf5eW-k0?I{AVW1(16#m$jh8#D zu{n3|zOq&oR8+Cbx(BVh%_!Z%iaW4`?oXGyk30w4Ng**jsM@bAvV;0e^pQYoRa=tM z3`qs6CwwkZN~%zM$5B!BRv8r_t7uR=qH0pH=X>ab`$ujZAY=+Y-nUx4k8XMJwDiH> zj0bmSAAJ8P`Zc86y-r+n8BCFCEJ)*f$nd3U^>0MvYaV)mq@tktb|SY`3NVr1(O+cZ zUovIQJT(UyY?+V#BI(Vo!}Lp1Qa3^$@X$lDbQ6^6Dj7XeE3&o`o9I2Dt;2Tdio5RK z*9MARGR22NA9#N1a>6R7IHTo`#-)Y(EGU}uavtU@Pi1>Ori*5v+5(Q@!y39_=~7zL zvy1ksV1be!FJ1(KQb`axR678w0s&agN-ybhagF`!#2&>`KO>n2Ii#<>Oj;w zb?I`+?2x5@frhTu)j08?=DUYi(}?hXtIU3#SrH>oyqwYhq`fOW%4B$t;`l^$b)arqXyH#I@dv#68HiZlPAO9$W%KOih06?T4KRg1n?;u zW?s7Mjt+RO3=*z5wl5m{F(6@5$a)fYE$>o}H@H3*8!CkaV@qeqn>FsyPn4<0V4dO_U?SwSbaMTuo~MbcT;{ zUD68YLW8B<_*qZ}9kaxTnH9PO3y{AE$kE?e*uw}{M#EPw{JHT&^e}9hq4Ke@d-Hzu zS8m&#X>hgxIn7gfB0+qaHA)tsMrBV&B}g+?cM(bDIm74SE$j1Gm0^;Kv5QK3)K7c-tsW08pfg6N~wsCSpUZU4W^{d=0neMkB!_eNPr z@J21%8$R`VX8xjoW69`+e^7x;I{m1YZ_l z&dcx#M%!2E%1Q?mS=E>?d zp|8$?3LDVNKCsU;%md!V0}|9v0jjIza+nmhR{%Rk!%+Y2>CQmJ680G(cg-+d~WmBr^_HwTxC@CjK@FZ=Otx+IefklbDmuK<-}}fSO9zGfuH=| z15)0Cch&6o6AL#!FL1wf8KCD}c#wsM;EgGB_x32SGBBUGQ*NqS)`~a>E+*4U;ZUf2 zHa0yky?%0a@F@efg%3^QE7gHfzPgq_i$P9wP=>@VgLmxC2M|dH%;aOXRCk9Fu(sUw zgEB}Q9Bd|oE=yJ7B+fBo32_9E1KcMLScrg+xg>Q|T}FQAqAY#DR`*?Iqp-}^YspRDFCpyA;WnvxIy{hk`Nbzjjd z1Z0?`=g&HPV8`+=hRUk`$8S89R37xkRrO0QE5-j=mHxM4D}N9`vj2AagfhhFm+J$q zqjHtTuc?I>(BH_IFX5QEW5^);->n#3YhFm%qu;l`{=OFf9k3WK#jrqdwSYA2tf&a4 z@0&d!gZGr8G-FrIRnG*K>-!Wy@Ehhs>P#u3=-$!DDtttWVxMWW4t2zZaxD3eR%BI(i=l5 zhI5fysmwG(>q=}vrpldS>&=9%cjK2lD_i>X zZ(CWP|FCq) z&2nZhsG{{B8|nMellTxYPLeg{#?pBqR6JDbl$UxnD>L zR@#VzP}SQSNy8mb53r1EDA%*?WJ9)dh38dn#WW(ZRB2I4*ZuN(@GIt_x zg~kjp$65AP9cB<2B@V3@-?^!VI@eCrR!6@%orSP$uiLlO(gO_wR@n`_b+4nKvgcLb zqU`3IN=|KWmdtX91JP6!C*zB$x}FmPEyVYg+dV^uf;{W1ACgxRPaa5TQmYORxF=2= zW(=n4xOPfdn0>1UP2776c2r*Wh0c#lLg02)qCl0AVR8UQt1BW{xnv~*FQ8p8*ft;$ zRVFD?(<%()$BfhqJ{(M~Y|R>0iy+10=;#78&*q(X@H{3t-%iM5Vt4wXq zZRLGV$V4VNfOlwq@ZIUXQw!X(q~Bwy^3#Xr59FcdlXyr}L23M(`zHU^p^XmEjomYO9^(P-ml=#l_r_?rFkpKjyt;mAzPkIIY)%xMsoGasEL2nkG5qoS@jp zq7aiEhRG&ywuZdc9pm@v(B`@LwiY@5RcY~xQY+hPz&Ll}@;19Jx?i1wi*_s&Y2B0- z;hZxza}lD@m9qESdv-bjyi*>!aBn> z$)>@#9|n7HkN#I=3fUTSET->q!>yikHmXP0ZTs=K4xT+?mhTaosCC^%-e#(fVWQPJi^j9jURt1?@4jJaXW0+{_zv9AgS)X9_zCj#+%;-qHhXN>kdjeVWl17V74=mQ5jZbM9cAusr z)7?Wud~ZvFdkKgX5*T044-Xk3!|Bn~wYLdua@NGT|FY6FDuoz2sp3rid!cILSPh@q z+F(BthKVD<61#~8&lXP1rf{KA3Mc9BRKL4T!baYvqsA(KDf&*eHG4_nr@A!GqU-4u zcE7S4H*Fo+4>1;c^B45LbOmjAijW{?mG=&o_Bz`=Ei*myw7|ErrOgl2dSDSDLB2&}MZBtO@F<*E3;P&sng>LMlTnmJL6Ku^ zg2G5==4R7k3L@vYP^Z_rvlfGe(>!SS0@bOHMm5(|0gwk)V~EYJizg5y1+IY0AYPdOoI=Ucy?&J!D>^VaqQh!N{Pm}LfPQ% z%ko+bIU6C|v`?rrxrhm-)mmMy7ZO(%D-d^S$TwXaUH4YDg-ud+&p@y9yrKY%FfovG z`|bbDsyL$8@3B60;oxaS@qQjWP{Dt%n){fowb0a`vEASJdpM1IS zX!L&c?lE$JW}GbgyGCw*mi|%XC0=P-r|rO%zv?Y(wm64Aa9(>_polspXa+C8)(*?b zG&6tk2H7Y!D!$+Ec81H!b4)-bHl>vXYknCq;U9*1S$p2f=4^kFWH@ROknukKlbq_+ zb3G~q@@UDZiUMJ_w(k()2bh?M+`8{vN{l4)D7u>uS8>SGKJtP8(7YSM0;`gNtx!MCHtwSPRqwUKsz^y0T$CjL_! zD$Z%v$&sdgQIB0nTi>bEm$`0KDIn>*?9gK&hb8CCjdPB_NBxhu8-msavp4vmtnsc(@?Ga zz5BXb4wh|Rn7h7+-q$Mr^`6}CWfT6D<;$99y<2Td0kBOJ3p&M$0V7GrhHzI}Zx$!@ zzhh%JGb2In6Ho6_i+)3VOu&Y#ZGFb=0QNEKKv?)x@t6>7OYyC)V-i!T~L0o2E$SY?pr=Qr# zhgkA%tx%nPqy4N^9kogK9yS5ZOQCrTjt@ZqinLHD7mA&DbGpAdofR_0*%oc8O#>gw z;kbn`HOatWg~B3XnO+0>D=8jsmPQ&-6$jo&66$2#m7fsb0wxN*Ki)_ca0=+BB5Lb! zSfF9qZJbys*b`7xg@?CFdgSEh!$7m@ETLa1?CqeXcWF^@bWt<|elfi$ zB$}=Lo0Y;Sy8Epb$7PQlED1_03T6}qmqOeD_e1i`+x?aBrI5q!B}zReI08Fk3SJ;*{hc-=6+m{~StKEP~mB9}e_8)2!7sxn~AwU7^ zwn1_gZb~6lTq!6FDP4vqL>p!_o6F1iOs55iZ`(lBV^Givd>gLVccGIlQ}bBiYzCA> zJFrO~{NnaDHw_0DZ@An%#|~{PYMvNeI{WKRnnv z{IGL)sAqV%`7E9W#H9go3&UD8<}|n-7tPd^H5kflG|7~666Pb5qhZ$+pM*;ETzf02 z+k_q?-KM%Yb`ZHpF4cGxL<1MwXu8rNLD5Fq)1bh#BDaN*6FF^xIEYRpp`4Eo!mbZg z%)Rq2KbW@xBEn~u&uNj1Y7;t_mpKuPYs?+YdMSt2hQOska)zP8>&n{h?1CKlPX^(P z3?3xb%X4Rs<3pE>o3;{1x1}@v6+YBJaV)=B`3;oJ7z)_|+}NeSK48xiS@DA7v4YX# zlF>sJaJlzo`ZMU3HfREabAaqETdtISc<3j*4t-;aBNye-OU#v6M8F0@RTJtcXJI2- zL(1A?!Py(($&vuIm4-A054Y9=r%i^OND&(Qn40wVXPLkkfDNy*IXR^frLrzfr6H}h ze)$9cW=KZ_Ks2_61q>YEB-24hE)5#FKo8POa(NI{03?r4vIiTXTgNnGfc8*bYx|2XEeI86D*V8L8^J z9JNK?H15e07i@7nx0vp<9yBN^kg(%ua8Cg&1yFRzVxrywX4GCBiY<{JnBqi)R2){) z%4)iPI0ur#h3}i1G?O+4NexNAI6JY8-$|QsJHx8BLKGxhs;p=ez{zO#iZe@m{QA>7 zl~3}XJPj2+IkWnblft-v+fSoBg(EmZZ$-#XHonk=8Elk+`07}1t17hG_hJVsID$)|@*)L|?v?b=Y% z^a$_hS*;w10;M6m21haAcho@PI%ePkF37CZ<8J zG*ubWm|g=Lj;FD1?)vB^adB2ntmZOdWs{Dg2_ zG$4ysJNaf3leC3{J7Q4AoZcCBUx6Bx-noY>&gU0@+-E*#%NrjGn-AOerkHS*0kY+T zcE>PX+BkcsK%f%$jSHLzKGSMSA=ohem0lslh$~VAa|QAJJGNj?{7UbJ8-L+Ppk=F7 z&pFa~`3*zd3Zwu>?-aQm>NWvyYJ#Ll;r^lk$K&-GinGw~=LCJD6u71$;gacWJ1JfR zhU|!*{gMC5&|+-oKG5%@n|1cb=uW!p%~Z(sza$u*k8pF@#*2~)ZRb4vMfhl&B3k19 zv_w>XqQOG>y4JbHH=IrG3IBz}+ortI`jP0wef9L5ZAK6&y81Vub+RyEtc+wy{3H_Uj8+d=r;sF?e_iIie{ieVSWoOvEXgpPZ-yjQX8uSIubYs6e#0+AdXx7YUlPtkDtYTbFVZ>25MrKNn<)1_F_bx##NlXiCPF^(R{*_DNZ&QFBTwQ2tXdUpy zJFkN0g$^wOyq%o@{L#> zKnDifo{u0+gIsZn7{z*^IgL$W6!{R?dS^<#yC7sK%e=I~oN;FJ7IttBq`vvFbr#Es z#!ic2JCI60f!JP*BL8TxrEH;s$YUDqcyfw3dImA=wG-J=_H%*wH@B30rzSmH$?}=+ z5zn@%$S`fL`q`FJa~}&F?;eM%=JD%M&!4xO(v!ZI$dnpo$`@paTQX$74E0o|@=k{S zDZ{`QvD%BO=8I}>i|WCP8k_f!TZT0IE8oOk{(04!lxwn4^ze!M@n?WU_nCDwZ>_6m5>B`J3su(xUIok1y!zF{Q;;jm4YVikt?F@WCDC{zY56z=gRC zK_}2mz?R1vSPSuSO+zZ|V^dNJ*`#F~uOI&cDJ#UqjoaxLIz@w(n zz6Yw#H^Fxg6a_{Xg%V)rpA`-4G=fdr4SldYj{nvjY4f6#xmE&isA$;4;N%T7-iWn% zI0o9?^vp{!aNkyPs1&BA{yk#!5}pRl8-Uq1WtIZfcJM*Lp-jaU@a{_d;knbD4vesD zTX6i(xUY88^FX}p%*lPGG5L<8xkBU*=bc@g2&sZ;WD;_qlABjJ2>0JVRB^bXJXwj{ z!D5|;JA1DH?%may@t<;w?9_oSxWC1`;ya9tN;PThlL>5cHhVK2V)0cP5dwYYpyV1- zyqUKY4gl}2J+PL4$#gGrVJI}>(rIJl+wAAoo7*j%&jQQEGV>?I>OkBNugbB6^&S+_X#osfj*SfSF z4<22Y7!w^BJs}*lH+QbP8MPP93L`msXQts`x1Qer9AzC1IKQ<^YHtclCyw^c@BEtw zQnwaiv5&?(PC^s(lySo_vzlH5faLa(@7w8Nq;8!H&r9c4El9iDQcs3%oM3(Z*lMC5 zT8|5l4pdYV<&QqyZ@T-6q9gf>&a7KcN2yEX>)hj4^#{vbVwUE={Wjn;T`$X;MlT=Z zYxu9@`<|GGu#C(iA+aoXtn*I!@ON?kP=D*Rf7RP+UxSbPE7z^wNcZ4icEx>Q&Q37^<6723TIb>e%u>L-gCoFQ_lS4WMqNPgQd3J?w++g zrbUY*_euS(#9N2zE8nIy`dqz%)Ap3E7+qWvga$TdpbCtDX6p9i40J`svsEzTx2+d=KIgUSqR`;K+ zhBWPRtX#&wJ!cc$rg#0&`kizI(T7p6C;apIsXV6)b+024zf-`H>WRGgOLF-B*#oZf z-HEK@D2@fvc~eLl+VLdL0vv0&uX)sS(@;e{gir1;1bwg7Lr~TB{b^mEA)|0`M`ZCk5~geZ>Z_Z-ce)o? z?cKzkE{nC`B5|p4xN_%Rk^QU2EN8PIUesf&_BZKB4}$+Ihd&I9;I^;b5U$JW>P$_X zx%*R#5u0y<&VaF>T%_JXgd<({9$#)q+sZC2Ts}?rYTWi5f=B4t`!RP&vdzNZp7(tE zoc?x`lTH`t84Hpw*)Q{DlFu7GEVK48YiAYM9&Evks4Nv*!74<#S`sQv*;QhSyk3Tm zBEHAVA(91^$fSbr5!2s1N1n&;r#R@mu>*fB?J~&R4x)c)onY*I)o$Tf5^q5+^0o8{ zo)6mo576BCeZb+r6PW55t34VOn_O?F@!;X(wDc!sR}o=VdkeM&bm=0TU$rm$A_|vJ zBh`Eihuw5CHYd-TiZ;rmpUzc9UAG7L{%x;*)PNqEyQ~t*2di0!ov3Y0S7^p@OtL&+ z;Wd|SR4JK?aS!Y)>_|@Eo3ahniST=+9`;7IY=!1VXDb0{`_`X=s4iWNWPU)ze0-j1 znz?~ZtDARqJmSK5@5 zRsvx`4s?&@07hrZJ445#rAEW5iu*EaB`2Z%v*vccoQ+X-JBGn4*I^Q0?*MC&|B{D&oE2r3Y zM}MOd?m^b`O~iw@F*rza3P_L=kZHx^AokgTjKZ}uO&q88IK{at)}OWB-#cfUPnqqm z0&vbRjY#Fz7a)`FUfNMcIrpl|z*X*@oKjcy?kGy2(%GpXy(q zd(7#>9lw+bGECp;o0sSSQzLK`YQY}x3^y9N@w%nj=J~cgr)x)UFSXot-rVL#HyRap z=4#xXi~_FKj^43+bZ^gjqrgg|v3miJYWF=i+V`+_?0&+dy2G1B!Cci*YSDIkpi|8? z-j#hXsG?#6X%l1b^A+IMqM$or$m0hewX{65|05N|0FiZc8+&ab)p8+J8eZb zb)y^9Z+7cJV9H}JyP#2XuoL&R@+>l}cGU4;+bdX;V@aQ*l5fydVHTGjX>6w+e3uRQ zbs(gwmIu^#%7rTnz88f8=HlyxuUpU|6yo>d|L%5=87R9m@doaCS-J}Ym#HOh^DOg zVeY?H_LUKytAy!zE}1>0FgfmSrOkm92IE!x$nLhIQ+ZM1X}H&OB)j|d(e1m&?S7`l z)Mc*ILwt89d}-~$Dn5ynxy6E7Ra@?f6pAxwbg-Y4v6MGVwq{L*<~;!?CX@_I>!P>1 zw8opQ#G`Ksz-k#ANv$f_xLd^znqL`})^56Tk)0b^UbHWVs@d}NF znlcmr}tU0z7Mttc0Ig%=E;_zLGF*F-7rnQGu`Cpo2chs{Vv;-FXkRc zxG0&g(WK`X1*hV)pf-4pCcHBF#b55PhyG6myRE?lUb>9L+GQ#2CUhij+t<%4UPBj8 zo^1nzpf8ALu^!C&kO%T*F)!`NJp5Cws(4ZwL)xGMLLE47W)BC6o_BcdiGO z`=l`(7<9Nyj>SA(&ok7!g-~n}ya&njLNksCc$)uWQN-de(mvK zn5cLRsCbg7hFDKbd4f9yvP&rlgy0)a7c@(rM97dMXH= z;o!aiKd7{lY}0^2%LLgO0ct4&eNzH6Eq@#em1*7$n1#yfvwTgb-sf?+i!?Y!5Wjp= zg~|5X1piH(Qo1yyd~IrZ6D)c7lWLIw!Kc~bJtd)~_Ny7v<)2)Cvc9ZoDMO}l-*M=D zU1(4c=ictafBrk-R-wBjuNS>rZ-#Eeyrr+|@!-#O&unew^2|e}(;r!3srNN%`;LKElIC;tp9Zj9R`U zEKHFMgT1X4d#rbrLl?N_)-LGSKTc2$gme>iV($%(Q?YoUn1E;{ilICuCgEZR zb!oU_&8z(U)HGs+Vmm*r{U=Q8otx7~9p~=DI!oc#Vkds6PzWDKEg!S7qhJR~X}?;f zTleWIr38fIm%RxEbGcxpt_&$ax?|~-OFcnr9&E$xa$!<+X1G>lk2d6lVhx+vN-)@f z%#3kWvjBk!XwNGEZ0=44Cg7{Gq<3!>Zm?3Tw$r)GRhpo;=S}e$r&5ffgeC0go(YYn zaaU(aFiH1|e)A0nlTH;eHFRxUku8EuKH|E}bSiIf)l*0xP4izr;yR9YD#rjdb4kv* zu2J=G9lGe-juGV}Xxi;u**_V`V4C$P*h2n5HjSgbS*lt_W5}pn+6g?ia>sGKLhBM} zcn2t|fvDJ6?sN3R*jhN*x;p%0@y}OOl`gQ$22nbA_UItjA#11e3|;(kDF&UKV|RZL zgB$eJxT24*cnC+3^Bl?B`lHSn_xpM2&SIkmPmc+s>+N`lP3v*)igH=*lo_YWnvh(0 zp^iLK+B&_kaY$vHyCZGJTc0~>ftJmq*-er%7w9g_z#Ldfve|U4%IB2tf#NAG^9(mv z)gIDDr@15;FaNDjLqz|3`=zcP*T$Q^t&DbY*JR8j5oYOc7(tBUWg+=P7RTtey5KT- zu5Y8f+IV{57RVyP6_c314MMtE{mr801{6v%BLraeNSgJp5DcO*?w&;>F?CVXw^JiU zwJd+(80N)Ti@MQyyY82VLhtVILEwQ(F$~3HItk-lig+5rZScu9j$-2X-S>lHJfn;9 z{Hq4X*d~5gUqY^)?JaIH+WSQ(FY8(bJe=_zz8l-6=sk1s+VOzW(S|S4Bl9I*k$4?tRL>B7p23AZO}g12346w4k0BOpeKv40HircJ}195iNxztKgi2#4j!r z?4AoTNv&-4Rq&2n{tLsHBgF>tWyG=?nj%iOOZ$800rclmTAkZ?pZJfr4Z4cweU(y< zO3dAF{RCOeYn9-it-1Xw8TZGp{8TgTNdDm8Y&anfwzJH2(Iz;jA+ z`#3jcif)K7@*SWm*n!=(_g-%$EPo)GsQ121d1)kev-sfn#V)v`t4qX}*m5&xGDv)y zTy75dS%D<4Yw{TeMa&OcPjc;NI*lVplCOY>j0WFSm~trBC6H@dPqz)E<=Wjxq`BG# za&2np_A#XG3^3LY;v*Sm9v5os$=z;!{Y4zmz6NY#s3dWOZc^{7+g2jG;c64g-R{<9 zhF<&Kox%5EbL*&M}OITc-^T;hFsYOP|fh^Qb0Xccm%;g@ah0K|Hj zM+5b(-N3#TEr%FdXwd<;1e$#=Sb5cIS2o0FrcRMTQ)O@zA;sCnfjbvL`X`!wyRIlR zfGX{ggg+S`=699xKo2<#f#m_jLot6C zBmSGFdH1I*FYyMY6yzL1KfU9fqT?iXqs3Blr`2z+dHWjTq1#dCE*CzXdBM-Y54`l9q~GG|G6TlPo&L&8cg{^W9#`R*aygp)1D!F zjvOASR?oHXhrd6xSNpfb`~+3b&s7ZF(bGgEeLrT>H>!J7^W8EUp8YmGiL37?4$b74 zGYwq&Njs7(#h*`3$g$*q-8&?1Q^xIjo9HB@TNl4Hs(Y){3Jwi;g!D@{w5Cbr0_``1 zg9mJO&r1YxqvbY0E}^cJ{o4aFs#J!FNG4m+8|>0@C$DTU`1+p%7rV{tx4TW!)fhGQ zU381C&eJEvk|ur08{w70a}rnHSyE2zv{UMjZ>|~3iG@WB*D3;UrOvfbrZ@kQP->yO ze)c}#Bt++SI`ipP;O@pc02L8Bgyhp?VhS92SyH-x7t2VW7rpSv;IH(GQDN_uLH(a%v1i) zzMRYUR<>&pcv>aSIWfWZS($}@!9Vw{+VQ2{-#?^h=BZBrBJ7BUVzm+wW>eDY+d|L~ z{#I9}AtE@2t)z#3P=x1@H3NuXvz5I`X-&e0RzmEjm0;a;@lQndww?31tJs!P_}|>3 zF(R0w4d``-JPCxLC1bg)jSS5L{L>C??J-~%1Cn0x2j42Ho{(#%OYBWw%Yy)iGW?vD zMV-}iV>hopIxw<)iwikU=1JWDf7nXvBW+Jy|9cB^27t>q0r0^19JXY|@2-OT92JvJ z`xd%J#9h_goL?-im0PO?A;q$0;t~R+X$KsvqAKK)ocJ8`^cDAi8E~Adb0Ao*hK*qM zDpP4G^NE)8B&~=wL>gOrhGd=g=h^5xEFPR|!^M^5jf_*VFNM3$h;cwyS;tpNxK69U zIcrSkbqRMw4To{af#JF1i37*nlQb(<=mM=)uKjDf>rh%SWt{SnYYJ9tjOdz%+6gvYA(lkqfb5XNgC7k`M*tC@#ww6L@GRj#VY?Dc4xpq;A}5(i6QOjXmr`U8dv^4aI4~|HeRIp5x^w-{*qwJBeEEzC!;HqIz zv--DYti7dH2%GoGRbsbF{x5BMjZ~%5G8cUl zB&|EpGEJCgN!W{b4F8?b7}mbDQY$AdW5&+1C^-*1-G523T*T&ik2#);EEr7v;TE5Qy znxpfw{X~xYdYo(9MKbj>_Eari`sw-VzHOC1njONQEx_#!S(&QSUyHIX#BuU|*9ZQp zWbjkX@05g0S2$bQ9Xz??e%OS83O=7aEot1`Cc!Dp-xYoDVJbrlruQNaTzGtX4OV%- znG=P4Qc8Bs*2&L$*s5GU7p@}rq$wgNGbGXD_K62O4a!w%89=yGKIgLLam9PuFtf~D zU~cNDR`{!yqWUN+{abbsNpi7CJQYX4p}*%SE;$L6#QR2 z|9ws6?oWDNBdhkCiQD}3#N1Ql$~Q1n<|v~=ZGTR>!ad(Wg7MfzaSSU|ZamJQd?1pi zee?WB&jyKyWyiE9awrdhmkiepDs;Wv{2y@Ft&T@39_6a%$ms=9=R&)#Jnc%% zE;~0HN4c+TdG+sy`+Q1No`Q7<4RyZxUePwS@{~wTkI2k}f5r}&w`S_6bM7kY`}qMc z?Hqq(LQ#2)xgx6)NMK1F7Rpp-caFAx#oGC;dSrSmh$h@~h7bx94m-Igjy0M3rKFae zt1b+yQVA39&CmAAfHMug{JVU|YH}iR^x_<;C%3ZjWZaE3lSL#WEGSloNb z_X8`N_(?d4k7Q&OX6vr%L!vQi;x;N>XC~d9*mxT*>z@~DH$}R?HwPI?coHe7)LdBa zktq{G4Eh^mZ($IW2*9P}+&UTY2zp89j67xLvw|aT96|O2%V!Y{!|1KI5(IZjo|x_YZZkUA=9CN_4SzFvqYBNXluV5U zKvvW!Nlko)7eQD-?d1Vcg@zt3&J;Jx=A9?~0bSOit7vTQ=`tGzQU7EOSS4*rB|lgl z^LaFVryv}AEBp#-lpy6{ou0RVIjXyg(^d;icdcs$Ya}e@pA%}Gv8TA22^Vt>i{ox7 zJUXT<9R*K4mZ7=XdRYts+@%jN;ccxwE~|wBNioxsy@hC%+Qotk^Oc&bt5A2l3fTEF z5{@$`q2%2tb#XK-^6&UdThThJ;QWk^%7HA&&A2J_#gyf$0B9H7?F;DkcbyVh)+eR; z_yVhp-je_Ix0g5tXZkBOyKo*Zt8qj6Rj#3%bC+FKr_AnFrE4VJ`R4q(@bU^iLhg4d zM*0^e$B6yAqVhCHu9$$wO$g++cu>mW)eL34&7PD4Q`X%8`bzzM`G7~pPV@2mFS_X% z*u=S-%oV;a?xx?#|Hh%Xin*+Ltz&tAex8zxr0ejs;`U^PlqEI|_y$Zp{$Yh(;XXx3qlJrdq zkL*6CD;L2$_4=`&D0|nkSD@-Wke;^1^L>iJ#s^Z|OfC#xaSkNP9B(4ZEi*sua_qbp z;?;>Yk&!-JlP(*?$k!*b8RP*(X`IAfVY(74n1t!CDAcf~AX=e07<52(XBUYz8S z-*l6Mw!_nIeH)3d({-#_5~i(%A>;kW{NKNU8jmNU_u*b!4zc;nsl`%r@G*<0WW)f^ zLoC|gDH2sthmA0Q-~j|eeCm3?iu^m(rNV-<5$PuylU5#{8llI(PC4^Aq7Pm5Gr-&9 z>3N^yqm@;g(XB_-+(r)XZe`s*na5_r^Hba{1(LVojbfy$X*w?1timVW*8 z!!@1dPR(0cO&v1j!iSTd@FOV)uWzhE^^^}zDLhFj1%6aTYJ(ILcuOydCl?!_{?D~+ z*IxDT$Zxv{Q0<*-eH4w;H-^e)w?A1Mh%Y~V`85WfBV{F|p4qk6O&cRZyRunu%T~F`$*mQhZ~3?5 z+3l0RUOau8{A?k0=wG_k(BGT4?x?NudCua)!v<-N6bmZJ`Fm5rMUzJwZvl|UK^|wH z?Y*#6(3Upr@L)|qcmDnK6HmC){PdNsN(~V&LnnQB!-u*SW&@^FYdCGlHG_+X@C%E%<|Y_;E&1&&LHGI`QSC8R zBA+eUMOFDuRLvr3Co)Hse}>B5Z?iKn=-pFh_v^Q#`SNS@*2f|6*MhCyf-PsierLvJ zd+m~FdIsWvhmg=)-+gBT3DP{8#**Op76;l2(v$?|h7=&@h^nq|Pd_qhnuG1$r5!=- zlcZq)9K@T*9f@oNU`QDG0Xo~bskB^N@5B?6#tnAqDVJJWfS#YsbaIVTgtp@{rwz%}7 zaJ6$$=U`(+Zz1BV!RE&%o6*Imo=r$wjK+}$g#{oMLxkTXBg?0-Jc=~R%)8!PqgzW} zn!9Fb5u*N zh70qa(%c7x&2Zr@6wO(-krPcbLQ85LERG#N^lp#I+dYWg!zO?CZ1w-D*d?pi^ID+| zW%ez=?7;B$AI+cg2{0Z(@hJsc%2J&KN}U^4dhkmvfFkEiky8XB94lV{W-WB~sv3@1 zu1zU~)V8siRu0{2L^f>qU{U;Q^>aGEPx)Q~KJHEjZ~5 zxmOxH9XW1*Iu_g;0E_8aZ106#le6632`_tS$+ED&YjwH)x7BbQ>d8a!v#XF-MNU3E z>kfZ~gL@&L1Ae_et@eIo`T|M&rW-6h9P{l*n8*$!DX|zCnr)$^XK64(cwl)O9#6Dd z*bG@h>b2-3C%O*%n+^w9@7?QZII6QZz+?L|Y0T7ZECThSz_4?#cR;bmK6%)U1kHS) z(HRW3=C$R+W-0A3=+lIlhLI9wYn%NKHwTNqg)nq&m*vkFJN&$A!?*G*u=cqa==C?x zORYpk17zbxgO9DKDom=HK(8Td#3T|Pm|3aH5g(u?E`X^nn65-#KxDlbiGMsVcQDH>Z8 zdCPR|Q^yrPp3qpL$Zz$z_Q-i%9Nl|f-ci((yZzNea)3;ral!WeXFi1lSuV3QwOQU@ zmv@Ig(CpIM`(!{biBh>fr8%voP|h}CE>a_Cnp;Fop_Y=Q_g*hK-}f>hUO^$ZO&$9Z zLO&(=h)b2P2?y7FUbl)#If0bn{de_bc~nB#ybrx%;ftPixAcTahqshQxF6Ay3=!X4Jx>Ei zEw77C2wbe zrkZVnp3)CT0<_V`4R3pTr(2xClhaO0b4E{sMwU){JxRQ1mRL8I7?gY_9(Bg!`WcFC zlF#57pTc($*L7q5CY{-zdn_3iBS?M}``+3!S8_J_CGu<0KGSHZaa`6PxH+sWIXPVE zjKfa^SxYgRRacs?oHeBhCmQeTfmJZ&BPhCIQ)vf@VYCHlok&=rDFDds67ngK79xC9(_J^c`B=V9lRH2lo^k?{LUx z7feZI+Wfd|xn>s1hK3N7SBNs@yn=@an2nZZH3z=YBTF93c+_8TWa4W4+XA0(*hacn zSw@=MT4?D^iO30%e-LQxcOx(8Nx~Vjd>0WF06-K+>`>JeCqtp#wP9Uk^;seUrs93A za-S9a)Oe6nR%;r)xzBHAk$=9nX=Iwmg%Jn z{Y(XKj{IW|wrHw4NK3)B)AW1Lfrp*YegSrdn4E}{e8ZL>+^^6O^SYKGzmJHRcZDtC z6y>!fTivDIDe_$aOaz7b4REzhU)r0f;7(KdNKs8mRhT2+zONE@q!iiB95Cv+q?bn# zeW#%;kHz+1(&&aSxdp;L?kK0*!Z0k&7A@6xe>8*ZMsUuzAB;9Bl$D*s}ro>f)Un^OC zm4>`l1@-30vLX>5IoN#S<0YDghSt?lXiL)&_NIfv9+L(qC2EKGP^PMR1LeWLdC3r* zbTzP1>uul%mGUoVcSKMzbK;%L6q-kn`M#=L+N$#on7u|oZqd{uJfuYOrqoH6I);W= zV5%tc;r*RZMT+J-iX2aX2%u;z08#4Zl5^jcyUB9jDcErVir?dzNRUd=(rloid2D1p zN23Mk6ed8WZ>Y=D5L;xm?^6*gv(olja(JTJN20P3Q0UC*O2j?Ad+^3>72k?)N(%y% zEL_tp!1ysiZH|H*JSV@Tr38an@hI3CE%|-|>e`efse-5tlr!Qef1FYQpv7w^s^WTw z+Vv!0yZ6Af>J|-E%9KAzK~&*X0SnuMCVVS<|H&IPoGn7eS zR#_TsW*4*uw!kmBgtoqq^Lt zrd*gxc?=r*6RHzJ9olT)*G*ObPCOv`D%}p$#1IprkHTDWnFoQ{bI)I!-j27}Y}kIA zGDky>QmY-c;GRy6{>!7-(D!qfG0Qa7GB2GL=J*65L3L+MosLpE$1)Uvo@J>4{OHxd z&>(jGWATC~058$Oa4pSpntcH6xuXEFL{xCYNmsEn2vG4&r%|mXnMQ&J5}rEIPFFjo zdbbjvvNVK*@kGKkH5RMOYe4kd$+XwK>@PDqK#<$OGJ!h}{cRr-wNHK0icOqWTA7kl z-38@)<+;2_ByHWgdTC|~CoKl^<_K`vvM+Mgx267RA`X^Bd{o}Wot1iNdSOaa0~j{h zLrY=TrI%||5KmEOB)zA^PsA2BS^eXboIFcL6(|!;xpc4mxijEL5C_siFn^(eF%17N zt3zhPTE025_s$F7)@peAm!O;J3qQ9$zEwA+>S>0+rWTnR%|zj^GNH`jDfEBpOL2{M z$K*9!md?a1iS|PQ)4T$jWjC|VR==CAX;T|o=V6ekfVXM(u1wbN?#NSjNZpXMoaxDQ zipZG0Z0uD)Q#*=zE!vN`lAjmSJ9hfBtHjkKBJF#ti>Js1C4@r)mXc4ecfLpJ##LZs z+0*lzwJV={eyPf-5d#);bf>+YgY;Xx>!S2w2*T3nf%`WfeER?8s3ISJ7#XRkL{a{! za)dRNUgj6_trOIr#$UP?v-SqE^%ms&JjOq!f4m~^qpFhH!Q9^K#-6V%W(ErjoBSmn zoUcTk4lK+*QeUlo?%x*Du~j(Lm80g8@7T8VrT><}U#9E--6ciEtTOVY)huIzvu(^P zPfzLkR0K{8-*FDNJpQih-qo)<@`Q`aaZ_PmTq-?FoRiiA1AjTXN@&1TC3|G-6aS1! zgcTkYDTYJ?0}5g$~;1qaxbN1ZR_^csfr!t%6Pavh8~TsFP(_I zeZG3Yv9cs7B)aa=N=VGZu{Sa&pDx-QF4|@GD&p!MXQ`vbFNg*o&`@kK-_^!59_gIC zvCNH{=)Zcc7+aDYunX{bS@zuSvBbT5yoF1?dU(JXT`s0w=B4+B-lJj~jg##~5K^YFFWrnX1vRX5%o&WU~e z?&LXX}qAl{SB1*oelG*xs5N94+QR2PIk`dU zMx6PeXOyLVbA5>X&n*npx?tZ+-}Y}Kp$p+uN|10_;h!MMznbATpzNy{Ud{u&QLtS9 zOt=)>Uef87;W-6J)kBhdU8nxPckqRqlMMq&?@xBbnkKq97VcCGs*lI01&llSA&O`A zqOjiT7BH*7>LVW?x#&_dKRAmjc78B--pO-5iP|Wac4=XHI4?L(yU89DCKT8_T1Xbj zGqnbUz0N~fgYsh1rBfBQ@novU_%?rQw0F+Ov}Sse@$3z)dpfo2(#~Cs;S@!0 zyRlBq)%p=nIWPGODd)^`(+h0VZM81juBA0UMApqz=BW~`{do?nJeJJ(09-1zu%uDs z{^5Wf%cfN-jtVhh0&PK9abmOj#CW&uXcOvGM7VkzpTjPvp_A}j($@o`vYtA|tdVotdC7iE);p2g7X?HJLQ@Ut=RJRJGM z?D*p2ySvyPjulP0@uQU*35^4Y7yLU(jykIIY_Uk`SFb|lsIB5WEX!mH(#F%JthVuX zyr#gK7U`bqG>*zge{@oeI39HsJb=pT4XjNl@!BQOn-wG0S>fu_7>OMp7o{tB0_kSE z9>+OO{!uo^V!Q~k?UhCT$=u5A6NZ%tKzzXwJ5GAhH<*LF6+z$8lUH&xsJ} zl1%ony5!kqg`s1YOE24BV8N~<@5ryFWJva7(0fa9(gS1(73&JR&IU_$k?G;sT?jXo z?=xHUbXQReKqgJnBJKS;bs8vrr|T=deTP9NyeXd~$Il|vgK1Aow?^7YveJr0x|YHQ@gjM z)3sdtnJtfk@RMXcFA}0_1I{FzZBCa@#}(^%o=KIyLBu>3r}Sn4;TFMr(KpGNM&5gL zEsk|6&oo{##cS30mq^LgV=^@iS@3fyK?fHuM%Mw=x}KetVxD)>po0+U5LMl+c@W4iEm8Bw;wQdHs}_aZu_a!)RBK z=dfQM`;~N^8c!xWfetU;RI->lbn4v0y2C8sYKQt_KTU0NQoreu0PmX0gGB|C{&i)utbU^?+#9+3@-k5!O_xc7{*;-3(tn^ZiDppUW z6sR^L;8~>%XBqJTW6!gJD&J+$7v_0(NMIM%{>Nj-CIIBMRDflKc0u>lvl*!QJ0-<>(edx_TDkao&*b(UW(SCzc1B zkmH0Krv$Fp&y1CpJMv(g{&2NqJG$yeVfL9xlA>3slvi{$*y?V~32$YtHEFu|hMPLO zM3L+CbTPBcE>A~y?Hcz(Su-=O&!5}id$+PIqO>PXr(1um#bKc6X3w*aj!}y;Cx;87 z7&N5Bqi=nc@^PtwI?~&+Xz&P;Ap3uGzu7}yM6oc#z-~$c{*5PdQvfkQ?2)1`NXl(3 zY8z~PmNH+*%az4t96T3}@REFXOseRvi5tsI(fZlDSV4wK(>}G zm7$tVt5lZK(&JLz4tW8#}Mi=Eb`7RW?qxN6JAKXTLUyMqF`YVSSWH6MfI zZ`Zi0B^p9(+F5zQS*&0$XU7>^$6uv)KP@ggi)KC@nWE*gq`r-9*yV1Ws(MJ%U@AGi zeMLYmF|m|R$-h+eFS1B(Ee;hUP_|&gem8n7;?NU#2@L>9{!i}0#M|S=y+?^$A?hM9Q zAw(?-rLr<5J~v)o2+P=6nv(4i^W$$e<9f#3@j#U~8Ml-!kITmWjzdN@il7JaupFib zo8Tp)O0G2`L#ZI!GuhX)Nr7{az zxqR{V6J6k6_iZi6FI4m@14#@6^R%V=UYqYDJD=u*RNjE%nCRU~m-{@`hW?<9I)f)Z!|H&!8gd#6?gN$W=XmJ2LB(ai*-HhioxlV`o%*142PbA z?tR5uykZFm12l2vZ5U$?K;+vXtNEE}Ecm}h5j?qBW*-juk6fsHuTcG!Y#$F@0w@wo zT$ciiLX(R=Vbb4!0i6(_<`~k=%bvR%8st` zjLDa}vG;MY&+!|e<>H-6C8PRr@8Vz~_?#d-_)i%4;6%v`^jg^2!uKVGYG+R>21{=+ zq;O{)RaUQkTR|u6IPo3|PP&Kca6@y}P|L#W)`q1S_w05(l2rKT`dzgraaQ{MF5)2WZE3+#>kj(p?MH&n`OM zhIyV%jckM-VM909pdpR2wmV8QvoAoSMYr=*GWP4;mJYd{`?hpKinZi^-A^TR&(c}K z#Bp?+x!Pa!0l&h!Hq8Cw*T7TdEfd$4+AylLq9cIQ#3||m0Tt8;n%)N9#?RALEd@Uf z%Q?$5e^TiwRrURCrGhGJr;*--JlFyUa(bn91h(X2NQSyN66^D zxcKGaAc}T>X^}g{*QP65TZ6JU?&JLP?Kz{7#C*4LYUC=Ow^W8 z63)uk8NUmwW#+aW|D#+*OD#s(-_DM{?<4E?jE`P#M6cjzYfSW(5bg!l8|y}Y0GxD) z250%9*W%E>8ECj?wtYO}{ZsT`;eA0bI)V?%okRaRZgQ57{*1fnzv8w=MgL=>HwB0& zCH-(J@}D2NuNeIgfVfShcL~t>1m^tLrqSNY!W+du-!g5LZoIwH?DbmvItI}pXg2>R z-Hnkl4l}ikgZ1E~Pkl=vX-Tw+tNcd9gD9-&l9Z|RL$f-!Pz>0kQL2wGf%^uE5oa^_ zx%)?geFc)w1fpgR86F#@7s`MS3Xx+NM4k|`byu#k5plNh*2ug1OCinF)aKCxH7Ea- zjooZM`(FK1vxy`Bi6a^8*l22liKm9ho~efV;cpUQtry>eFC2_i(`prWDY=&p)7~Gs zs&;fs8yYIsT>;?VuVkpZ<(=Lo=+K_rx>SI!eY);>W6j`3s_`?gCFVVdnXLYmKL2O6 z)8>(p#U8t=p4AmR+}-~2M0-z8`>VS4zP|Q>AMHcZ&xehlkL-RvcH;S4V*-c(0O0_; zUO#`|_k7&=#dO_s5&yZ@(sKy;#pn0BK=O;P&ujp=js;`D@-6kHoDM)-hltscss;f1 zbu9d_0hovYXfj($hz7OGh@{!<#g4B(UceXtNh$zX&z}FGzAW7_nclH{qJyW^vGKkG z*Wc0nk1hIVgNy-C$P$ui97H=udyy@@ftDgbk{Tf}JisuQ(?9hBj0ebjb3|l-W18uz z0{}*5OOn}WKv!2`hkx30Kn!5l20)4daIZHtR0kdwA~pol2+WILIWJ-LTrfr!==ajQ zo(tFjPz2~HjHIXE%aBQKw+sgq2c=+OA_CAl*L3w@ms&hD(;Fh9c5`Jq{T(~~ayz!| zehDG-U<~#Ndglc)Y7LLNfb0Hxumk4D+aCugF6)L7fSD$MouTaAc*HtDgnmJQ6sK{L zz15@30EYz9ZIAEs{b0c{J-!tkq7z&p870J^x)C54rXR@cSbNV_2XYY`eH|QLz`RWE zhRoO`FWjA7q7IM}0`}q&i+*T+9H^w7J>}5n)A?M60sBKhmofVJ8)yU{SVcyCBct~V z0Uh%%tOe5R0_l76FMxP}6cr`_pj(6>x_4g>g$s{GwXxyiOC!X<4zv&MY3`S5gopsh zaW--mgTes@`b|22KjRFW47_9w6r>HjnUr}~9|O?c8?OV} z$2Xsi>mec`p)Y0lK-sdcOL4<3OsQEa!l03B7YlG;1A^)Ye;RWxG10t6FeDD}tsg*P zpzfWQ{M0z)|3PN54{#WOULi{;q;cx=02j#Ul-T!2oYW1-$W5GNaDCTF0QyZMn279O z``0DK2JFY7Cka3)TnCN-X{vvl`W)g$095%vc7*bRLV5bYsCdL9et1)$6DBG6GXnkNJyHwN4U(nC0BTU?&wHTH2WbI8vKCo{sC}g)CvX$OM}h=kbFV!)i`)Vy);e;$m*B5*(kHl zMyde;u4bQ(m(OaqADz6_ReVUIx3STU0kF@9A7^&Q1JJiOC!|p5bpTRqy~q&WSMNkB#lyro6>m71SR4)Zb) z!paH*Wp(>?@vkks&(UZ{0Go+^<0rAb|65ZB8|Jq>gTja)qAh8RfK7wQPvf514p3<{ z8NEGKc6cgPV!t5%U=dZ&m5#nvMNj@hx-0?F3AK zoo0za;luMvB>HD)%IcLP$wTDwS#% z*OCY&Ns~(|`bv^Y?YG~5`|~``9y{AU@7MeJx@_l_5e*RjL+{xXH0fzINhHIRp5~OI zfu%;LD~w}HTvJWKD(h&GFwQNQtQ8z_^Hx>(!)|mHM(%3c8Pe~Mki?Cs*i+g)_0i%@ zI_ci%(Xwfnl;Q#FbZ3>*CO*6%6&j>Ks%ikSR3S!1{8p1_z!Sj0yt7{Kc&2)*djH`s zm+pPQ7fBz*VzJ_+?ca&b;1fb%rF87pe?363f*X2hyKMW#Ff=lf5W6u2leH_|(&__h z?Yk9;2_w)rl7?{`g}+|tumEY?P{84&L4FZ`O({e8wnTHoM};Gd!={b5J$g=#aOobm z=x5Nt+3dh@8HyfIulcZ#cXw;nAyj@{B&V7G<=m*X^K#<$?f3s0=uNsS`8qdX@#HJE z$Ib7Hc7>=SHZPfc5YTMp?kwDX5x#6Hc$<&Ehb<%8-9UA{uCcK(r6$~Yd6KYMwEJ|m zMh)}|gG4mXzv071svUFtaPm4|0WLnKBFdp+qytWJL|G}6_=VT{I?8rwS0Bzi1+(8s zwO2W-07Ka!5T(FCj;!OI!Uub>Mx*>_4(eDWfg^bI!-X#>({Gk?T^hMqG4bQAVx5}6 z?^(IJH-&ujk}r|u&}@;RF55?p`^q|r#p8DKnKXYdZ;{xri$g22}* zjQAk%kH1Lvz$~vcQ5GPO4;4n(J0Fv1<3#ffojkD;gZei~xBbnmJh2z0=THn64vo?h z{RUQ|H-~uE^$3&u;xwH5M_=wlRq&x1GF~BP>;{L<2Gz$%FHFL?Z+Di2)MBsb%sx~a z(CO?w&CgMmtEp(K`i2vo2P^$Q--sp`(X*OC$G*6n5Z_ffr%mvNjG@%_zu``-fKlij zn30nB5M96kP_hNn*9t_qxD@MWdzH&xB01X!sKM!-qf*dVwNZY6Fg+cjv!Bij1$S8G z{2n=Xov*r3YfQw;n4zY+E@MI(1T1cYrL+#a2*%R&a+6fZjrGo2#ZV(|eH*Iam#dwE z3OpuCRRGM9j9mvS6a#QDQcV#C;Cnt1z>Bk_(+F+bDhMA+aX_hjXo+v5nD?_O6>(sb zz)5FX3;?X-MgDKc)i~)^M{OqZ;D1GibpD?AgaPgliyxj;*4tQGlze!y=W1%B?oqKI z_@qav;|}iU=?@p+e9n3dx{0a+XwSth(STp+3<-PM`GHq`lBn+I zzV&Jlpa>MOV~BXDU76e~RomRA`EQ1fs)I-X6X_~p%f9%tNj9|M+GI$Zjwe6hn$}VR zK;RqYK;n|yW4}As?Cv{zp%BpY{^)v{ysLiie%nJGPwGZH2uAc5OZEKtqWoZMM7bjW z)|FnNV|{8>_MJapT|ITD$n?%tf@(S_P9LLtYE|CBprnScC{j?$8Q>uHCus7Ngl-PU z9*H*UpX}H@`6Q|mcmB2#vnAlp?e>(XJ<&c~t+BgzAG$a2X0n=Vd%Nfdt0@`f$3j;$ z0`EVIOI7*wCUo5~@WHf0s`$TZKGl6Tzr$Q=?)^Vu|CPuLEK8;3jU5aB-XZhoi+|d& zH-Ex^4$D0Lem3p+r(+R+)?}XinN2JF^(=zSPksPaauz#aQlkJbORWr{e=WrlZ?P*7lwqJ?+e`Il;NhgPfDue_D2E8(>DBNBy zjQ#cWsRK@Z|CXr9f6GcgI3pTv1#QRyt}^P!+=$(-VL}Sv1Iz|#oOXX)*YMBWGb!1u zdZBj-i!6Z1K##-am~WNYE0@L7%zWT;h|0_r73o`hw1c0$D{VWGQ$o<1ae8q|K$iSE_Fw(yiS8+1- zaK1A^Narh1kk^lp+t{)=lUgj#Z&+$q-vTo#=@A*iIida6dN%V!G!%6pK~Ve zc|PB)_-}4uRpaOVF#XJmoANB~y?Cf?tTK&!?>Bbuafx)T+ooZes#0zu@Xmd787Zq8 z_0^dsiFv%`y+=UaMf|o&7lV`>vtE7rZEx7MB6F?n!mNa{#r0dZ+4syE1(-b}W^`-jjN^JzwLsKB4C=D^17T}#(d>S<)V3O>Y!Leh@3N zM}ndAImH?UtxBr^@Y%oNqB)!vh*l&^=j$!u3xQ#4=TT2DJ>1AXb7bI4fJ<(DOJUws zg6;S5!Y+||%qb#*pt!rob^Pyg>?cwIL9)7;s@?icq`>+E%BCKtu^UyUp(P6q*&DH0 znJlJ#rxp-P_WzKj%qjUKx?$;kr7qjAe~g}mJRX_0t%?~KlfR#G#9C185sZ2jWzK^y zDJeW?tsZFG)#vI9L;OY;c){Evi+OtvJUY+6h%9;=lrl%R0AQai!-AYaij4c2oxD&t zL-r^`q^)#x`GHUmcyrq4&mcNPlXPC6td8=A5^fiw;S(IwQrN1EGBVamKY$vE08CT9T^3w zTMfq!Sjcxh`SZ}6JO|3&dSb4?(5Nz$!ZJui?18sKsWXh>X@CXjAV+y^I$%*bFt?hJ!20fv2T+zN#QM$YLIC8TEos}M6c=Db=&rYOyA)tAqFz-^!($GWAezvD152o*o36JxJimnrHj1`I0Ob(2> z088nocv6kc*I^mXwpz77gTzOL>pa(v?pFkg6Ji|iq!Fvek2C0DouGc}LyuPs1*`@i zEmUBQoiYm?+7;aMTAm!3qquhRSxy!wE;B$=KwTomI1+T&*g`fPWQyc-ngbj0gW`-` zEkYrhMDU@0>Om5yThjftq~L5>%}m*|fxdyyZD{@@gR)+aF78XnbJqvo*D|91z`S)` z{0eC3L?CbMQdBfw&brx+qUoYV6+Qx zb(l~13ee${K>6g=FF+#>#aL@>vv2Yq>-iACTU6>^j;^5h$PN zE!#AebDGSPbmg9VE57qq+Vn>K^+pT(C@cD?==-SJ_^1iLTq_1@B>HF`_t7f%(Qfk5 z>GsimKaY2QSbqw@-9WepWL^X|Gxzs%_xBI;4@mJ3Jnl~{_YZ3F5AOEowF!kj_YZsL zAHL}y@z+06I3P+fAc{sY^#X~Q-tac{k4_0lI3AE#9&orRAgMdx$fJPdrr8+xS0933 zCI1ab7Y@u&49wIIJZck2d>62~9gvk0n0q{sR34bu6qx8A=&kPW$II@Vojv}1_C)z~ zVYmNr#kr#P*N0~V1J#MtxY=S;BK+lh^g~zZ#F$ci+Yb1!nO&`%AQ{i4zM1z z%9|`1yFMSF|K@NNEFK#i97Z7mtiwyGZjmLqB%Tbr5NP@)z>CIfHAyiK^KS;fbO;SS zUUJNf#tNg@o4+F>>Dg$ge3e_uitZ3!+C*4F7We$;n$G&hbVvLedhZE|H1(n+bi#az9GXLfX)`6I6y|9T21Dnz zvgw&xeEg|%E5cD?BCl3A1AOk#GDrDL(bQ4(Fw;`L>`vIc`WxG=5>gL!(;pnt4~tI> zw&Bo1(R`lhk{ATklQUnK7#u{3XmkHyn$8#H1;JL)Vt8oo#CwNMnvOKoH~n2f7&Rgh zVx36SS)+Y`gqn|1BeY_iyk@=jXkI;#c*HU>5*p5#D|iI<)hdZamk=4t9btS?i4bfl z&B%7y91;`GfuwPX^us+ghkp<}Al!PZB$uDInKJLa2MI?&v#~JU@Ri`nH(~~HzKgTs zYu$0>eE51_>5j$u&G0-D)B>|eRi|bYt@`>?f{UJZ==0_7(V@fiE0Q5y?jOvf!nP`m9-b*muqMkq|WY;fduhG4l zV_k<={QM~-)r71ndd4s;55N~<8&@Ursi|r1nCWaq7$xvVIHMbqhoxUDe?LAH7j}0p z{OgiASDl*aMbG8kf*xvqILzL0&D1MC{@+}l0o|KOl`Vq>r_S5+uO;zAoDyluq47mI z^cTi7`z^kdQhEx5a>k5y%!^JWQXM(8-2SEGDUTAI`GV46*`<7*Bzk6jtXUBywiCu< zOYM88301JPNy?dBzJ5nKQ=XRL^{zUMf?w=QNv9_y(%icsXDg<84}G@^U)L%cag^ry zkLG@w7J!bcHb|MC2&_3Vf9laE>3~_896G7_ooNr1SF0AkOKi9i9)1IM!SPdODLoYM zUhW2+I2Ycc@wv&AmKU%DdAzn^^Xbcv65F0>Z)fboa4_rQTSx%d2}{o%rB-lhl&8X9 zA@LL*@D_vh51*V@CZw72uw;Yqw?j!%bV7OEDy9WySP;CA#91BPo;f7K&f(8Ie4E(%0N9CXVtW zmBvFU^Eou$_~?WC`pBKRO~;I&xwJea%-Y}$Z{5msG}$bXBYQEFPxE_+)M6%f1y=a| zWyRL~`SjYp4iMTbK^4@?%N4lA9|a@ zCFtPze!9Qc_kthPk=Y>gQQBeT(f2v@9zTdb;7#r%G(Kh9IFYJV_+JW%uJa^54V@i~ zdLPW$P9kNPHG}t+j{2J(T@Is|BoNJVkDA-%_|_erZ~b0t_TFj>nwLoX?N70JvQYo; zJ3@5lf&mPlHc#-(G9zYnrDk4aQ*Y$wgJ zi#Bs-S9D}I?CWX*A}iHt#gqfF5BwGzzf+K%b=2wS!y7vwE^NVV_^bP+Q1J+w+ZNxY zpLwocX$1+{+V69T=X?v_mt5lh@-mNUeDUMVjaVu-TUI2eqU3Dgjuh%=!C!i&-KV34bQjN(W5l1nXDQA- z)bm4mxv%r~HTYBmDaIIzF(O}6Ge6KS-?TqI8SoyGy1#k+w~S0q;?Ey`rbpe<=DT1E z*FWaZIECKy)KB~Chu=yS{TgV_5Aj7p-roBgL!$Rp`bWKo=5^*_ZPKDKzeq^h$bZB) zXEPnRGr|2I3;)jL@6qc&{@F}<^lX!8O5~fX3uPDPzU2P=%NIzoN79<@{Qb`rT)vs< ziU`Hd6}Tb?n02tudmAr2_wuWD`BUd>?!IF99+^{!y_~MhE)hZD%d|37 zhE7Qzh#v3EP#vjIvQzPUxr`dC(eP|_yPB!~tj-|f{7fW7MA0UH%iQOufsebj&@4bW ze^}BsKHW&^%)RGg@)jNc#^l?f$}O2+`_!YsPP3MIE#fTZ(KCTI@duCVgvMN3G`57j zUf2FP@zT#!?e*1G@D)+xyv3b?A8MZRO{GVuv(t{wQI`(?s?lGe-JET3{6V@pb$jz& ztLc#~(wU!MDp<~+cN@+>a7;I~PQyL>ZgN)H`0mNU&s>XZRU%5()PYCF*)Y$jlJx9X zpH-#xN7p7U5h@LiTV_`sv1g6nIBxZG!)U4R_s8dN`wKr0=jrB-_gp*XXn5l=)nM^S z(%XgE3ppQCW(!yU*<5~Z_s!2&A#}bfu)=b^>dNyI{0*6&A!$QWqG9|~-f#V!Vxv23hQO-?`0?X@`i^Gobk^IihnyeElb_j8X7lV@A<(=I(feYk@#aYej)fP z#`$7-64gf}Z@qIl*5c0iU4+8O%yLC-ivR2Oa}mX|9re${4*KLKv^I3Oz8~85a9Q2| z`NDD>8Gp!nWIbm}uG;PPgw@ymqi!fvfa!$Ri-GSGmM^$!+bv3q&EP9-a5?i+*5k;| z5%aJ1M)IKp#P&|J7Uaj1mXJez!zwR2C0`fv3i;9y0@4P*gmk{b$ju_mzxAN%TKqDYMu#C z=UjaF_2Ku$hyOj{is)~#B_amCji_E4*nVdGe&G8H0_xGuv~R?tAEVDa9_}8<0MKM( z3sAOu%cmo3e|@}g$@ce`uJ^Wo{(FeB+yDM7!tU?Sx0mex{rU3Vj?4XXpa`JQ3=nc= zfaQ8l#O%G@mE)IC+9`q|YI)~RiA=%hs$#hT4sYRrDVop4P!$!F`CYVF;;ma$9TR0C z-#M1l1562~aY^Wi7D4{yR*B`fvS`LSTk&5H9jg${r|0gX?V(~ zQAMgNaY#4%o10BN8QwolLC&F1M=PkxK1&=nZp}Dp#9>OmO6N0vWY7DFNRbR}rkH#% ztbF&0Ec|=jsb)d!q#bfa;_teXIkciOD)}{9{?jO`-xX%Yzak}df3(hdyXMTF57Le; z6|op{joK|H{E#+J`Y(ciBMqbKCmn29Ms?bsfD+eu%LN~{Q6A18(3M-2IwppKcWd!d zt&x0If?xUX?zFqgU9EA#e^;xZx`;M=(KI77pxh^YaR|&OYFxzxBzbPwb_;m=VBH|p zuoN#nKgNfwkA;RZN^G~hPwNc$)cvNm3w^CBPxMl42L5$a3ymCfeEJ;)^w$#4p5zM& zRc)Rn4(skP_}m}so_%9pBHcGu_g-MK7n9j2lZg@HzKE-U>v%5{{y@q0$LOa-+Jp!go^nKOBV6`Wu=8TD0x z4t-__+!>|YJ|>svatMk?iV|F6IUvh6Ra9LSGvW5<5ZzQM)HI+z!TLMoSd*!jSLCV0?7|&%QtWuT%7afiWF*o z{Y!rLpGvFU$f{S0YR8;Z-r4%RZuq+SpXmIb@H1LIF#0N8@8aH&62=#ng>bU%s}{-) zz1*vF7^v_eLllebQ%fturQM${c38ix5R2?`iN%x_^v6hqRuwCBWQfMhNii{1{Ezi4Ylr% zLudu9s*N@aa7#hwmGdJ0-&mD}z`=d0sIzOJra0kZiR);Z#yA6->LDOG<2JT8kqh15 z?3F0Ex~3X?PT-+}n#5fC;Xki!PJ_7GH6LQw#0))VuTTMtC{Rtr||M?!;~9Ze<> z;MMaXd5{K*-IK`?1ALNQk$wDeq<;KXq zPMWi$*THW9U2+S8*vx0wSv0`56nlxJDlluw0_Dg8X$>J6?WFmEDXojZ&aU662%zJK?lEuB!N7grnB?Zb+$}~ zveK_ohfUX-iqVS8zxMX1UECJvua~c{eC5!!te<^%u8$OY%c1K8Z-GO0*m8YEgdw~| zHT&Q=*p>vA&6*NrV3m0)T><64cDBtvr5{%VZzO+s&OXRv_uL3Jqxe4-UZRZi^H;%k z0|b2{Sr|J9dX5#E3A@=sFJrmv! zP~IbGkcwmn2sU%YdSCgw?_g0o6l=d?m8Zb|M=TEu4w~a^RK=7i1xCjboc@AEwcbbY zEUN2xn?W|eQZ>A-NxO|>HOP|XW2%39WjEUVE~*wzB*$=AJ&H`5SCSF~z@RNQN0ImE z7pC-zcdvoiI;tAe`~Oy+A3-|QUx)*=Ga<<5M>!~oAr~oJ%Q?1v&*Lf5e4qgR8mSTCXm9Av8K8I~&&aC-MP{+hdQND0H{u>14 z{z$R~S!)m^Uk~Vo;4m8mt*rBZ{*K98w;TMW*d?rC_`}+ufC6kj~DSH@U~tQsl+ov@Z#93Wd1p$Z`v8#VD5DDf-bqX!Vk__N_>JgKb_w7E&W?>CuEhK0;b# z`3;see~Wf0GpyS_e3osNPR4cc!K;8=uN3@pH4l7Qu~#|gVDxdNvuIKC`*(MOWdCc?Erwz&NMWERY@aP%3b^}@t+E#pex7V)0+!SQS)@Z`(s8z1 zER_^7_&6i0ogudXwn)aw2*i5<+kH+D?9^C-g8i(b9CS(S(u?)F&<&mVt( z7I}D4(PfTfy+BZ&n`-(2)?%#Tde`IzK?!T1^t*g%zctQ;MM>*X(k)^Sp|9Bc#2!7R zy~<1F@WvY^#S%qgg6lx8Z5G%}$vcOolzZO3ai2g+1!q-X$!pczo(0+YvGO0kwW=jZ zQ?(jt7o-xIvZZ*d6@rFZy9ggsmdKke@DO0U=?p=4{|Xfwr8>kA+`l3>L$Khd=qD3w z23S49HNt*mlTwP*b-d9i)3yw#u))?EsNs>q%Jr=FyCB1UN@dIX>89`#Q#C5dAnKo&10pV**0@5F}`5LAjl4@16^2AXWRKM ze!gm5`;nVB-*yRft+^N2BBw*zWGlLL2=xIfQz(SpBJqOa6vqIY8A4$CwF@rJ5-YEr ztFKv>zCWN+EO`C3m;%@;8Hc%EjO2ioc-SWgXgvmyPY2tru)n_}h>L%D|A=TbuC9E) zNHEd&b}QRTZKFJVZ3A1cew}TTcv?<@oLCWmFWl$$p;vNhObK(G%%CcM01|D;5lVRYkRUs5;unrs{8^{X!{>sZNpCTMn}IUnrx zAZqX$-_ShcV)TZ4s-Bu~Qj5}O!`Ox4)%Lu83gB*${0iGDk|mS4E@edogjKJ!!&P(nCVUX6UWm0EST`vB{y;d+`8iDEO?E#Q%)JO17hc_Ei6 zgRK25-Z2Qr;Pf~IYdGGjBvoaLZ3sWS9E~{-uaPdoNk+aF-Se})PGBX8Dt)F@YR`*y zG885M`=CVeKRZ}(o!QhId$Hoi(DvbBx#$~$Nyn}k{J4Juo``$hi;F2{*=@1J`ikI* z(>i-sF3b{4vFA>_V`}u^ik}8bQvotNY5EGloE9JCHtQgQ1(zfk41%mmf!y9Erd1r#}#Ev6;5l z+172k)F!gt_$A9u{EYhBoKc1h&sV)pUTdHVYvFVj2sV27?rv(r9hU6?9+7+mI-Tjt z$JAM1YsDUcH)E0Eloqo|O>V1FeNhS%;EiEREL01PV=T*nf}=(J8|RaHGh72UhIX$i zueC{RTolw>F(Vl?(yj|=HQ*m;@}{Ap>rMJw0E@dt5*T*u{ztohib8#n6&`51N6{p; z|6!sGMB;6>fX)vtD`;^ntAK)oEc0Zx(YPNxE7`)@Si6P6Ro$uIo4+-CqNnKi5mS2& zlP+wWN0(Sj)1Qv!Zn=waz3coOrcES4g3)RAgCS9dbAM|hyTh_=(^VP<+jUZIDZkab zX`g6Auq`Ogz!SB2uB{qgaAT1b?w@GksJ3%dKjcmhgMr?nSeX}>d}W$*2s)#g6=vkv z0*X>PQ^pU(d!VTLwTpJ>7}hhTXNa~dZ)9e-Oh0b95A*IXOC}kJrbdu@WLkqkd*e)< z#!Gsn0HJ-Rt^K0@ahz^Z%zriZCnkBQD^qunVAI3Y{dc=!n`ILVmPx;`-%UB$%FyWN zMU2lsZlYKZvZQ+?(4B0{nT*-G|5Wp&4YVS;O37rTSB`l}3i?Wu&J5-4U$$5o@HG#c zAEX={Amh?;x%wN~2iJ6)yM#a&t&%gnx=sp_@U~g(q@1@(9JbXy-U~1!mq^z7!4SmY z>*{f<;XjUFqAHBBY-bFzp#vVa$AvOpd{bqMg{OMHPsR-K*aNz-VyFb}@g>B;oZgr~*ejqEqPvDu@ zmNNv~eS#(_F#P05rAv$X7D1o4kCRWZwI@imF%&o0c4ft_-=@@Sr_C|!gBuhxty6m} zfXWWrcw^V3LEC~ua5VVw?+u=taV87icN0blv}-2KJO!)$A!xT@5A9vGqZSK&E|M%F zTgFMsWU+0wiX{~y-2FjzXcgP7gK9t7n&z``o*N91(%X#V?Y-m#aRLm#m4MUE@GEN2?cj9q%v&enCzSegQBtg0lfYu|Z&&-R2 zuoM;8W{KbfjZEFC8f{7T|B>!}yn!AFBit!^o@Gp8_ugcxV!-Ox8(pjkF6(4*ua}ii z@#iej%KMbi@2|wJvka5*h(U%70({YLwO0&(?HJq0gcY>{ifk2E)T8JWe0FZoHgIE` zaa>d}ghvE1uI`skE&D%xu2y$Y;F<{^gdfkEWvNWHPcw>?7y+0@;PVP`lmcP+;ea8! zm>$4HmrrSgrg9U~%65@fbrQ9Vb20sHXTg2knDYevk7IF9g19_LqN=hLcFY zpr$ih;eDm{O5$d{=z#K04uezJh$D4zZE!6dc+7c<=mJfxr^K3gVG|SF_XgQj0 zZ9d$fQ+R3Q;+oKtdKHwx4!BLEaQhxnw2G-r^Nr2qf_|fk2JLbbWjrXBgF2+ z>&D|#lG>0 zb89d@{HiZcBEh4{GGe!2PGZfYg>ce{Plrt_Yc@{kPrsIRctpvt@j*`%B5|g|_VmAF zZ_c7$(;}SW!_MDn4(d7b<^$g~!gzxrZ-u}9Dq*O=vy(~G9lQ4SWZJk+4Zvq_ie(!j%cVI__YW0K7FIWBx z)zLM^+HGX;P3ssLiwq;d8;Va(>@>cc`nGp_rTjn~;FS8u?THC{2UWFA!|nC2;ZH7^ z6^1XnzPYvS{*3kT;8P_toy{)IZt2_kzmlfP=O`x=e=D~^DDiWk3&$1(G|r`dy-F_! zT|Q%Q`CM?~&?Ud#Wf#4B*wYhMefZO&m$w}GyazTXL#l^L!!wsE@;=|c3=wp<^lHox zzNJ#CrI+WVWEO3nQGzVvgKNll@;H)$Jp>La8%^4{B&{<>SFo(-kA}y8{naj@nE#T? z97V=#jQk6WOMb8zsA+lLGu#{`xp2on{2p8SWZtHUh z{d#+f@p0sIYTO>*rHsd3K(mHW0N^6#cy2`fqL&4YwOL zqL?)qG@_WZ$V@0ldf1j+!be8BKrz8V4uWcN=HPnL?v$ot5ToeYdd8eGSO*!flpsZl z!Kf;wD4cX`&dr>{HzP;;>54fsxRIvD_isK{BawHHa0=Zw?sYtr`g_A$M&|1{hpKG5 zKY$7~zuc71@1i0oU-GJcIgX{429*W;xk5+#ywOyOiVYf8DiFW*kY+P67Jni0pRDGE zxiPWrgcHBhagR(N)sV|Fw=zcRV;9FX<@8BsqRKKB3{}4b?wuU^V*E<`qhea}uY`oi z^Lr!xsSn0F6tbVb(bzqzu=MJ`N59rWI>_2Kq{*L!#ePO~MMnkh%dAK)s6KDtFbz3I z9FmR4w$~=ZQP0wgMdBwJ<3Jr~QuBzFv=|@KTv_VJT*p^_Mj; zv5*lKn~XSJm`o9NPX{US$jw6tSl+vI*efE460mhyYRcEiy5gHC5~D1!T{$;tEkIGWVll2J^kPI zW#|VHK`VjUguGkzF)qu7DJ#!RZI9|dsUEUkR2DQU1tJ!!U~i&}8F82v!R16J%TZjV zQyT|mh8eO82hw!>aDow?!?tT)s&#-)*`I(x!HDhKgrF(?M4nnSBN~4HaT;IxB z{0&&|Iz7?dj&?CagZOSO&3k~5Le_lvtqvB=TXV^)V&8^obE_vk|R zokEvin%;kwk{W&KA@SVsfey7>H|Vm%ONgTy-12un3`ju=XTa4lN?F*Cy4`5u>9Jik zyHcj&=N4gohAZq4VBRMIA$VdG4}I}T?f+Zg|L*Q89q;)Vcz)}2VQh3JH=S)gs$3@KaQ(nFHswETIG?Db_1&`DhFf z?zRPqcOwYz4<^`}3xY#lJGggDju`h=fwIo4pl0W!ivE!+gE2seRu#)|!$AgM14dn4 z2VNiKloxD8Ij1xo&3Kr-p!3FG>JN8rNG#HeqP#gfxh?{aN?-*_{<^QS8udO~F)Z!O z$`Xz>2UhB#R|cxJcx=q#B#JUBGyRH1N~;_z3->E!6IbK;s zeXHAe`&;GleO1(Q5ydOwKJ-;>6Ka2SST5K@(YSzs`n%<1_fPCq>JN_C(Pvh?Z|u{W z)Ob#N|41t(3BpJ@K#t&v4Hs%$kqXq94}}Mhd*6U zFRR(Jp2Hu220*whXnK!kFd9-T$_VB_6;pe(dU^mQ;HEAiPp>Z?)Oxe6cUUjJ7dNoJ0&EpWom2Lcqj2cB>Gg89(_pMgJhg z>GzSeS zh3Ecpqkj0{c~qOyE=B31Az`8o8LDB6ae{wk0MSQ6up5_;940PxZu z^*Y}1<;8=`gMH$Ly59~mir~%723csqi^`}OT@CYXy%+k%(EzdE%5q8M?JZ?w3HOHk zZlppo8}%3{*#W}{Xih?Jzi4~*j)gHy@I_p<_lt}a;lXdLYevss!tI-N`ss)M56a;b zd2Xttvh-Zbo6mUYAdfj?%9}C8>Y|heKMFZ-nBFNheWLOXQ*FkcUi^UJkBvgzaMCb; zsc0P~`j275jTEu}boP|5(!>ZKDN-UFc7q4*%0=IgTc6<^Fsz-(K>Vi zT*y(JcDk(MjN=ns-Pj`WV&P43A60W7#b~Akp6pCm5;LHi|6n3jxCy>}&Ah7@uBs6@ zq1@-!tUk_hNUOv=o3x7aiwxd&WJ?Z2x(ZsyNr+sNC9sUf7~oWdY?P|YY2IPV%F;!X zLqF+(zXLy>6uHQXb`TVaB7~#It+G zz-#-!)QAo^+sX#vmEhMQc-Bw8`$;iCW_wAdwkQJm!)R8;NAr$H%ZyLg&Y@pBzL4*p zHvWDR?S6$)PFLgL6Ut9J^xSbQqZdU-XT;std|g@?&l+n3e6t*eVj*7vC^J*cJNjpP ze;=eIku4RSkB903QN2;YjPI%oOPb{z{)Jh7PA%f%S&ycle$R}aL2^+AkV!xp4QZL8B~d}GfG>A^A_Oc=MNg~NxP4uW3xIaxzE>nXiWW$J zE-(`*3`cnE8j2bL5&eK*nexch^3z#&q6R9Ge(qYwH$&1_i7wHwuHy8N$!EXYo;0=! zw^PmIIl_TuslumqUPQk`SEn7wRRe(l%D?y^d;l&$FBX6W>;m5a0sLG5S3tqJrPcfolv&ZLbc%RX z@Mrh$+k-D=B&scIH@5E`c4SSY9tgRyE@$Ssj!M`Hx_99HR>9keQEpY&`DEhuZ1?H2 z@1`7UV}G46bxAgcUdVfIq@P4RNgOD+u+ z1bFgQM_C7>vRfWDW9v9a)wc_`;gYVViHmt6y~HR_Oi!+|#$GJ}3YWhYi?W#|wy^B9 zuwt$@?_zH?Q|&_6@o;WGhjmy*r*BJvx*m0QKC9asd8Y2bS}aAH;x~maN%Q6x zgI`)PelD%WC}Jso9b}gXh18vkt2ovwz2;$>Y6$(*oC z#*BG6L3>-C+L380j?s2{G_-nr@^4QypR%84PB&d`xN>psFE_}S{v+{nX+vUWyQaPI z{s&JT{XUr?vtK*6K#kqwT~oVobbJL|Cef^O`ejAA?fjDYw}q(HcANF|F`GX- z)1r32+Ky@l-kJRV!h%og`-|$E&>!gDAH@wfyPmh2P^4dM-4->yckycdDFj4$ST_v@|eN<(+<2|6(@s7UBCc%S~wF3F0(-pFHhvt+m|Jzrg z%bxOLdz$)Bx{k}mm%W^@t82WQeCcPe#=FP+@yRv90T^-j^l8bB&>?q}8bv7a24mQ2 zqciHT^C$0uzG(~Lry{nMk?X@cWf()W>s)3ApM+IQ#!JLzU@t_-&wHo@hs*2Ogb zSo3sc!flyex&*alz-c6JgHyY5pAi?l^wjpeya)>cbt1*3TX>xWNqn ziH#4r2Ddz|XR1X{G#^nMZ>ET><(xGHZTUHO{ZkSPg2)pa zzcp)7gB)=1D9yTqNqrsF9h?4%EF@_tT0l}csN4JcCD$!cU%JK~;y((t)dPaBFe1hF z*CC*gXw*L7gYeNRwrnF>N}(nWn%WGto$wdUnkg1ac5&vvgTwz5oAT5dY&;c^IC!q{ zCd8wkfI2oDfuC?fduY*uzUWixGd1T%14quFzsdc_8Paq#6!ccOtmMK|f=uwfD{wYz0mvw&$X-S2Hbx6C-T6?4*H} zdQsS8XcT`zi#n+36cf;=Vm4ZASmayoNMuG5%ADb^&=vXnt%ADgr+lIlT%Rv(UlISs zBbyoiH%_6&yzSc#*+12CI=f?GSZZ(A$1KsnFa^psi6l7dyO; z5?3dYJVVvdk9@>th)9UXK+|SoFBPr(GAgRWwVen3PJ_IiZa z(<X;;5yPvd|Te7vJ43 z#Srpez9Tg@H)(X%x8F<_Rg)bgqL3&9Q+(ZiaPN^HGK- zsUACBlFt*XC+|;HEq*_#>i+3a$nTf+6MY>ApMUZ=_ItWn6u9_=~&~8wN}%->v)H9rXN&hcQ#jhJ=?o)c8)-xkYfq`)K!B9#yx{uWS>E zzuk^aN%;ADz9EOHcsB}>W)Jc-%^+*uT@tn?d9}QqE77jue8xVkf-jPwN%Hs$scy@Q z)6Gy>M)~FmC(D7ah*2x3L1WteHpn%eNkVSk8*b(H z$0#K*E zRZF)zMXe?Q2HPT`qf>X|r_?Gf=iM%f#w*|;9>qYoPt2M65w`r#Q40TKGvRFeg-^k6 zw(WYis8aRH>#~9PfX1Hhm)H!xP~rpF!M<8eHLKF%x(A$t)4bS{s;qmu4;((9?K^i_ z>T4AQu2(G@QntMDjS{TYu_T-l`$3q+?iZ=AI+d~oJcKDCn4VCkB@JQW`I;yh$0*+v z1VQvS`#UE$qE;FcjT%V@As3oU=y&DUu1-3kIx@-+D8$HDlVEG|trU$75Q?iscfCxm z$mD+~z*whqRlP33PLM9&!{i;`U>lVbu3Rpov0$4S*N-i}wbOh&GGhEcrtUqQ>Hq&9 zxNUYYY;&IToaNM<$!SBOq$!n9&7lx7hiW-*!zQPZq?AKRgj$kRs?BlUNmHs3nnOs^ zNTSq!`+WcU{kQAdAG@yCYp=)ibv>Vt$L${GUzE}uu9n5rH&1XAp_2YGp*Km$S}dZy z2KpPDE(37?B}CM-{^zyL3lNj`T6@Jb5D(TsKWu*~gY^sHdroUZD4QdmPmz!o5s(2& zL-gL;!(8G)D8BoOSKt>9p~`FvSPqZgaLI*YKz$VNO#(4u7ar$_LqsQ#(@2ZkW>Yk zFmO^m4_S@@&#;l-+29l&vK5mcU83Yk8n-BD_QbltpAP8c;WXNpA^Z#<&F1<(y6- z^5OdhI3F#_7SFzl~8I6!kY~_FD$4!La7a4SMN_tkAh!+0IaTqwKL92 zmgH}tq)Y_)fqY6=MFNbHr)!V;%qn>Nxu6}h$I7AbcZZxE22`d1I>|)P_~gGtxU+2N?GLbEy-6AG@lP&!S zmb%7*=weW4T~shG_d*uXk_GgW(7waY9fn=Xb(FKf!nRn5A|Wz_4Yjxg=l5QMe7OWa zpAQGPui+@iS>UW1#8(!j$Q%061}--4i&%)wEEvNIMbMM|iIXAUg2YHbBq_*A30MdY z(t<+%s)77WuIS2>;}}XWt00$ZkQ+k7}!lnI!V&uV8zzso3K!jB~vn}CMl*w!I`Hd$pIa> zr1}>I4#9wZ{8f+Ef~-*DZ^1rTErS^&AGnfV4fr4irC4^#c}G1oA+0UxgpA|%Q*^oQ zUiGJc*OSz4C+@hN9CZ6^%5C!1+bK_Or;Xjt_rccQ-K@WI$iEaTCq! zTQKYMFXR(RkZ?k1iHWJDP%<(r*&kJGv7#svK!7WC1XU1GAiE`$`jFHZY6XfR`Hc0* zkVqxAa^PD81aPIGN<12+b^#)$41J25f9qP*Ko(HA$3$tL21KMpw%IVqO9=16%iJN! zbo;}ZDVbx2$R7gpV!LKn%aqP65uyG2n-}!5ID?BN&TbdA^}QgyH>F3OOOKwc_+TzMauL@<7cGquSj5|h=-Wv`C&OA4hwmONaB4}Ft34FT#^aS z(sQ7+(XQxEe`)VEy%3BOUnc064N#r_t_#?Xuayc|BIG0PZZPZIj~Mt~V-O-7v==9{ z#eyyV$u$v54w8_~mw~1NjWsr6+d;MqCy*ueLMQ8lZIgUk1#*T6G3Eh{*^nK~ zw+kV^2*@rrluU$w&qCf4#_BIUyiYqQmqm)_l2-voYgTivI-F7%af$8 z-Mi4K8XcgZsROc{mh{OA$i1R`GWfr`#Kiv4}Mi)HGH(go*f81FsSTdw)y~5GR5T9CKmR#?FqUJL^(%; zblzLDg5RR*!X}s>(4e6$&S&nRmVkYe2s{Yn6Exo)#K`{0f@(H-lrWK7KSvM~@4k^B z=7jdEuTI2tfYSsp1`e{92|bVX74blkLTDuOs2u^E%7pI6`TFRBj*x~5h0ur^#pLv{ z$~{o`D_~`F)D9vzl?3%CK^Qz(8cRGfKbBepP3h^byADm4fRtV5E8UVL;vm-V_q`S| zkzZmIY@Q)>>{WJblU@FTs1+bKS&%CepeBjyz-h)wHu4u1l4=i1u94jo_HAV$E-@w7 z&1#Ft(9^9YyUJ^svmXlRA&~(;Z z77n^R!-&D4QUpL_q4uPwXa% z5ZIpSc_WVEZmp7gtF*F2~^;;Y5m_FKqxX+TRW-i|l!tPr8-HnjGxD6B}F_Yjr^H-ch z&C$=YFy4j%M-U-pr=)%oOGaa7i;HHRmJ#YsTD(&-e~40x`J^o@+-Tz4nUNz}?e{9# z1C3RPuQ-Ty4bW|RaMTub1$%MjIoRgF_tcE<&;QMHmhqdSF{u$$&w3V8I$06+Wr0~W zyUde4F3`Y!6{7Z`=T#_265p8Aey8 zVY}mtG02IJy#CQ`&GH5|66k$ z&MnK_^c-EN6+(HHRvmQ*&NY{}gal*)uC9bfJxKi=lw-nJo=_{uZ8fn}HfA39r>|UAr z>n@oP&7ifYH@8y%Mcu!x{oI;#*}}Gvx6L(eOZ0o<`QP|=1zIBFwc+-AHBWtK`YxEk z>I0u=Zfz8LDC&Q4Q#p0#+svMk+!1wiubtpFAw98paBwRn-*$wcyX^vMgd=6E)g$b(WmnwQHJ@X9 z%3<43`OVbw6n9xqlPfdQs`_Texn^^W>{7=&4Pk}W6$^3oT18kr519{4cY0uddTEAl?gZp=8xe8kbuO(mit z)bAFem6M~o*rxLu8-HQSSB01*R&$EY9*FwU!7ya47SLcM$Mk7k+x|V1N^-Vlmh%>g1evXKYZfh!NbRM4jO7!b?6~Y!+UKHA3gWkmZKFE82aWI-Jm@% zym+VGkrS6sv>%DA&an%MzJ04bDCS8s=pey+#EgQpsc9tLp17AcQ!R}(jmz73-m`;Ja~gp;}- zC#(rt1egCk@lXyg+WcH{Rw3ZOT(h7}BT;!^#F5W=m(ow2?yrlh)op{Acyb;L?|jT?`hFHgc&hb* z!kKRdc4Ux&MkxGTS-4_RLk~LE=wZyrjOrCqHvAzGbi3xJMs1*{;>`_)vnRtq^3U*5 zttrN1hAz#y$fTDw{&UkGV^ljBeF9Gvt&#{ zrgX_uMQO&<`AT_Ri5a0gWtBa_CH#KtIu=l+2cx(NgD5I`T`m8@cF`epI~_xNTrJB_ zm)Ubs_M`-D5?d7Bc(G906Pue-29hykD!Q9Z7m=^wB~MzF9vHDK+Adi2O2NXGb6RGGr)TvwpdMKfs`eYTb26|MXx|yG8HuYO)*3Ai;(mpi)_~luS~5Z4*Y>f* ze&Y`drK%*3;w1@BiwMhHTYi@^nRz%KwE}l6;3z)c@G`i= zBi?u!ppvhJjKXbf2}M~~CqJa;hC(pwsN^l5S1a4_h{ldFQ#%g$qw0WcBR1NEFCn>7 zc;|$9g@^Mp0EX`Qk?kfZvlk}N+l!JEKi7cZJy}I*PwK!iXga7Er64gV~q2Bi6m@8!BSjLhDV)6uJ_SSF~KP4~TtJh?!# zTNVu$7&k9Hep_&N=j0S3xQ;J3w$N{7F3U zWDmJ!4^)nM=aDOco|=;kcj=4-q&1nXuoc*=a=#W#Yd%tX@y?gMpMKu-hlQ&Q;JkKR z7|uVwHnvmK#miBb0(Du!BU88@B_{5WSch(zZ6u16`px*Sl$sCg3k(6r3sQy{W6CH{3 z(60Rn(Ft)T>=A~mIJ_mQ9h6|48~4b%Po$>Kb$%DbspZ<-=k92i1FO%vYXy7byMtGD zK163DHqdmXSe2O3dOxT$iL-P3J{VolZ11N--?5ah|oD~uECih9^!0-pIwLpeMh-Y0deH{dIaGj={u9*sVLHwpXs1$HDuJq z=tV$|vv1q`S}vJm>oC@Qcf0A(3!Y{-9V2i?AI+kcbN9# z!Swqq(fJqMZ=;nS5TaI zxoHc~j2dVn8EhU{AePf&(K_P|oHPt{Iao={jGl^oS?tlYFQb4q)t0%Va=jE)=3AXsHc!TO37;iP_Di zN5iy}W}RJqz2IiBG>KdcK~)i#ohi(N080Y>JmX&1?%ediY$b0Gl?@=S19Vvb(veLXUP8<= z4Z88cX&c-}@TaG^P_G8l3&Rvwe*k;r=6!tzD;%03o{r`LGy^H#TzXVZgY5t?o(pv) zRaKfX;z%^=1~Al^Au@4b){=8my>l%IXon3*8X89Ho`~a?XdQ>ulnWN9^&6|2;&8s57sK-O#>J8b6e2CRS`Wazv z9GV`2mEU*ZO=KWFE~%u=2VjkcrbXqL#@1a0Le3a7&X6Hxt4gX_pp${n^9*Qm1GtwZ zg~rknDRf1d|15&-Q9pyYvoiUoini)vB<+s2}%9T+wy{HNCd&S;Rl&7_%3 z$?_NcOtBvyJOuu@cDcbexb*MS#uIgEWfT(!kRyg>R6$vF-Zx4HwzU8aU=BuHpe+d` zu4P&b6ICJ*O9t8VfkwEt!=oe3Kd(M&1sL+PYu`e=Sj~#BfNeX2Z}2fjXplXLww>fk zb8rpC=*MDc)^GP}GAX;MSAJgs)Vg<*zo2snx9WHl(dEtjyU!%gHP+qlz375JHv3M! z$NZ}4*hQ=vOdVF1`(@(P?qkJ&C%(i@;wmT5+@m42SUnvB@YDnbBN@jurtB!4J#jp= zWMX$IrDaqjlSvOj(P-~pMM)jY=#YdA9w*LQPr}cST*copUhrgPAXf zRTvL!p9_Dp@X`d8o5rHY^B{#9^aoO5JO;(SM*M%?b{1We=ACQrJ3GV<&t}g!XXLpo z&-ne5LGvhn!d71a(3A@@2+qB2!$cEl=lQu#4j@}`%Wfb&l?gW5g1)ybwW$lQir%{e z(jj)-e2-oKP|+2ld~)BRxuJzo0KowULt>an`-r^DLA&-=}tcprJ4*OWw}+j5J4M^jI5>E2lr zZ`gA&3)B5I*xkju0 z7ZHB!OZwR_*RYg#deFGp2_m2F>k#$Edx0T%2@p0eI(2A7rZ7%$SRD=C zCws-U75MQQZQ*BjI@!Tk6_lh2>ZzI^zq|PCfpPEqI6-bajWOoWGu z><1y@7ilA-OnD=V{A2&$$#^^NoS8s-$Cb-l&cgOP2@vRasREMLJyM_YYGKlMvRYD^ zYobW-51`cpNz2MP>&d)cE?9VV`UroS^<$Zail=mKPcp|~_kGzrN3udDTe~IoyH@O% zcwyv%a?qYe8)t9j$;lBxv$Yx;FX-{ahi~75(gLBDOzTg6CqoSrC!f!|i@s@-D7Fos zJsrLp-G=744wFj(mfrMCRIarE=vb4RO3dw=Q+~OeLuJwqIOle)|Jbt}r*4uYV}GWl zonk`H&A{Xu8i!ub1!a)GNwyiQ<0QXW?&dqvUwK=9NXSjTLe_I4N^4;_9#Sq|pF%R8B_6XVkyVn;&XwGPC3Pl7BpY-+oP8KTwfO`F%$u zgJk~}hqW}%OT_dMRCjM{Qc11HQ8JvldDpn^jnnrdQ^_k?SOoAAGxf0wCvRc1z5mb2 z6$vF)>ZhSUFK(AV`<@yGNz-^AQRT43o=-iyJx#TIvzmB5MsABPcZZ@n?e#_e`s(jT zCOpV;KrSE8n+e~*;v3qVb zNB=M!D%J|n$V-?z@;qg6u`mz6zpp%IxX z;~06j%x68;x7g&2#*bgHK2P;SRa5zqgNGia{t~j4Di8D;Wj-wOT#K=bcq!`6-8Ymb z_15wT*FxpM-Poktg^pj>_dc-kJLX@Cwfd|M?eBB5=vg+;r;e@m>m6zh^v@~2Ty7Rr z#9P|9M=wBIMy#P6N&3Rft~j(2KcNpvfkNqMV^iX8MoQf;m>HntXWRW485=z54*3sDW`vO_AuNwqZP{TU_M$vebp z$tnZm3UHOMC^*>DrJ=Rhe8(UU1Wy#wUaNS@_w=}hGgqSUF4&bE^fg4Cc=Itzt|xwP z)=HF8#5K!Yh4g_tUzG36cIVe$Jp>5dTYTL?HBU!5I_^wK9%H)APU z6hxukC?;qBxdy@;ncygEq^f0BupFsYNZTVnHY~|?;{+rk+TT~KhjpzopF#QcGD zTl0Ji_0)Y#@^a~4T4A|S)r5cFQjNFx@{*)5=G#|#Ly8*3*bu&Hx5^4@W@zN#@$37H zdPeKw9_qRO(`g^wUAh1BL`v%Rd53RnG{uAekxoCcJCv|Dz&xa4r_GORq4D$g|Et;l z;vd3>>+*TzZGrh)?t@~ZLyHn%OT77mJ$CB?4;bGqf^hXwZlB{a>)|osO*z{qs_E>t;_YOR_IHOqOFpHzJuXz8L^~?I>wfW3 zL0s}Ij_%Y`k{{MNqcuQ!g}*yo7+2t-`I(H7bP5G6W=Wb~jVY4bW`ASRvnY6P@{P|8 zN>8^{MHqRpN0IG^pO{>~tCbwcL62Z6qj)oC0u*^m>+kLjpr~4_Q9BihL~!s(xOxz= zNcwjc@|*(@Zp{N)EY}vA;rh>ieUPK{kCVNZ+pT#LQz{!)QXH8EfM6ZE?bZ|W{J}a( zTUaoB4(nq?!fP%!Tt3*DP#mxYg5bS-oaSmFB7Ufu*29J_w;Q|*fwmOs5Wc&Wa7xO2 zqg2{|fr7Y-!+VABJT}l!O>sV|BUw-TCfd8REupKvP*?kL)D)V#QWRMLfOwI5e$Sz3 zS{gdLjt~x6To}kPL9OWdq}`w|AGtDkP`aA&SYxh++(+5nb3t!7EXwy+yBHqP_=E9O z<7mQ!ckZj zUb(&m>70!V&|&wu7S&2>Cbw!AZLn2WYvGDfc(tEc8fhGZjE~g;+mSeOi4l24Cq0cL zygA4ajNW-Jz{160zfATDa&u55@YeL1v#NYtn-)R!vh&6p{u`F5Kao_K^mWdjqA--Q z#*q}U01Blg#e3FnwYYuuGVM&NlWF{H_OZ3xRkr)}>Awm!*9?rKwuSL>N-SzaLKako z!^l0JZ3V2GVLM~`ccq(ozyWIXqzbllM!*elW+GMXy)awLu~_RJ7kG-lS&-rB4z`l$ zc37;B4#41tF;un!V9i8N`?R-g+GT)Da$1AivvmzW)J+D_2xx@-6{r2(U`#Q=wDeW=I^ zT5qlV@$%%&jnK5+D-T4qE-ScQmA!9{@gPU*XtHn}xOo8n#=Yxdu^;#v?h7~3ga!tp zLMWZ#3qO<*l=r_TCrg9 zZIxW4#hWX-=gLLgj6Z*FFDdG4#|YzURtUwh9rgDTX6mWnJ&0XSYF+Xcuv?ZPuXWE> z^jyv#WHic$Wma)}AlkN#=MxFaO<#M3UjTlM!;3>D`u!@OEn6sN5xVN<^?iw5-sLh& z<<9m`BAD;`i)&UtksalUhjJ0)0Gpc?LUHw;TR`p~eqQ=UtEx!LL-l96ao?Zqh z4v}&V2}asU3VAgjCYC`j{@mLn)^>hLH%;BM<5T&2EPGEtsXXVTpki-+J+z24)aU?_ zc~qi!V+D!pS<|+F&Aasw+fxsYKRY%15D!~H2Dy1jKS}D2FCyf_^1UEItlsUpBVUg@ z9Wk&LblHi73AswR9`OSVY)auJp6nhUwamh6P5#RE$A?JO96!+h$R)DY-u=yjkGt7= z=!KGYfy{SeKND7pbPX^CXLI{)LvGSKKGBe;tJZEG$s_u?}>@BL_BYj4BlVcFH*)8kkirF5k0V4j!Y zm73xjS6lN~)lxUU2H{)~sQR@OTTNhpuGcuC4CZ3BlKuvV$fn6ODakh*VG_$E}7fLk7Ao9p79N zjc&&Q;59e}A<%WpeF03t&U%=OX(q#7R~ukS2lM9_iFLVbc+@9L8_w^EfM2$Kzs{GR z=%|%DUws=qzIkTIZ!JrWK-IIM8dtnA#=7eZ0Tpb#%SgAyI7K5H_`aa4VXe9j+odHh z*1Wp)oT<9{z5w}S$>?J)9TeG84#Bxwdk}AU4dgmPl~?qFxaLZm0Y?~J>YaGQI#5!= zn^wwYxcenB0A`Vl)Maxtdb(WN#$@LN*S-;{ZC%#4-1VHh+{TBIJz1*F9?mu%+FRYm z9W-0nVcY`8t*6^!ful7`bryh*mu1UHxVv_GnDPMH8r?1h9(M?zI&DQ`?{@~_|7Y|; zEu5)(o?Uv;u+4`$n#%_^<@D?G0`c#4I>u|aZP47-JluFRmo<>*E{|fSw|-~0+fuiy zu-lDKjq{h=KMV4l>vox??OgP@whgMg;bE;oRF0!KuhERgxY~8yUKWzBW*(z~1zKw! z_BKZt`UkcN#B3Jr?Wl(-4q)F!bqk?F8z^p_RPq@Qw`&|=BEIO_?twaxE=f;jf#OD_ zEgj@I5_)79fW@_Lw~cPMtt0DvHYRr0fRN?_1981QowsP7s~*m2)LY-Cjd>n!dD#8?{>#U=sQ>AE~w?%isX8I@-<4YyIbgcWW4l~bB|&x_?PO*hO^OrB}%JmXGqtv3mv^+c8x_QCDBxA z=6dCeJXoG$bl1u*rgCHPj$E&$AQ#H<=B2C0F>jwgHu;qBX{SKu&iZ2ec(%gh+Iu&u zyIK}mOm_9CV zdR*1C)7P}|hUwGxrl-%Fp5AF{?h=_kd*AeI^6S`uY00$di}j`#|C&xLG_inY9OY(? zmKh$_ys2Z>ZP(mg-qhu8`eaCakrum;nf3LVc8uYqlba#Ba=mApA(y_&qyh9Q0G_jw zJwDNW?aeO{BT)}=%8FgOX2A4DPh=ZgMW3px*hR`&WR2ktOo5#EdVcxxocsK{5p=hGH8>JTc$0R1Bki0OCVQ1P%AAr z8t*wV4m$h9w&GDdlpq7`sYi$|fr zxo*t>OaWeb4X>xzr8e>fCuFOw0kmQx96fDg3tgM@^0*0k0_eFprGjCR^bl&19I!|Fe<|Wp!Z({ z4a*f=XlxYq_*}|X@9B031k4|bNhaYfwz@2^w6$2F^apq6sMCfHU6ws!43GMZFJU0* zv0a0P)b!ZCMa6Qv9-y;L`#j7r?)ttU*C>zC8oI)kJ2Te9z=nz~Xwe$Hi&C+A7F2Rp zBcb=mpuGKxf>)EbP`uDUHJ4~M8{b|TPyVQ)z-zLUP~CB{AKWwmnH6{!ayMF^qi@e? z@up}NyQ7?I(GhR-`1y#Xl^>-XgA zaQ0+^D;H>g1E)>ewMX}WGz0IF)~%wi+G0XiCCI8|vs2TujNVakBQ?ofJ>Ukv~sp| zGsUS4q+vXvTEQ`$rI|PX(E4%sc);3@!OK_2t#`-7xW@ZiYCpJ0jKLw3@xlH0!(B0K zwtI}n9@k{geKz=jHm5ewsL2Uei~$xkU=9MgnNjcC;75G9D(U95>ISm$ zf!W~06P5MW_Rg>QnL<7Hti=OuceHgGR{(=6-A&AZr}TgB-^V|4y)EF=!`8cN6K^~N zAKUN_2@kz&JFK1Tj+FHKv=aFAsOM|FouB~+XNpvEtaL>dY~*@~we7LU^?)BDi0Amk zN=Dv`;$J~}edJnLa-{+TS}c6-{{P;b3=1(fl?UUV$pGo<}n zbUO)Ys;f2~3>7#!&s^% zpZ1mai#cka(Z3Ph$~E?!4YfOY(hk(JPA&WaDhjSMLoK#Kj==VaX5F?rJWB!9t7IeZ ze)tl_jY0GHrJ)|;@h&LBrcO7-7+}yjcr>hAv$N0q(N6Q19ala~&67B4&3MxN&8znS zsu8b|1)Qso&R5>!pl$A0X#-S8HrK~Clb>N#S(JDqhPaHXqE6#`aLSU0Nml>?H|dB1 z04CW|Jp%u4)v@-$(v@?+Rc{@a#$0L0{|z3E2K8iJUq={y3w-IUTqQ z=>XuSokEFhpZst-_EJJ&fn%v(8LhIc76qzj<2c(-JJ6I9ZQ|O$n<|}1Jt09~Ufjgx zy|WniaFe9nQ0S2f+3Gr+Ba8Ev>A(*p)3j`+B|hTh2PtM-v>-Y6mc5;Y5gdzWW{NFM zO+HVLFIZ@Csb&>G!(8S461|SGT`DO5p(=n`kNDayff?KrXB_k7ezIaMO|9gx?3cI@G=&e!{Lq@6iNgWY1c)V^a^)EAsQ-`$l= zQ)9CyU$Nz6x*R2YT}SeFcCb}h;&;lKmIevMhAx-RZZlaCR(Gr0NsRbjqikb!yTwwk zab5ge-1Qy0Od4qR1$BEjq`V7acUIKrDeCjy=#2OORbOrB8IwG(m@CV`Th4axaHcuw zAJ3K8eXohzJJRjM!^2S}hyc9l>|bksOYfoju)ov_KTjD?Ja)Ewd(`Iiq_=pHGZl{S zE$njfrYU^fdKI`I*1&OU`xoQw)%%PdzmO%p;D+N?=ydlLpk4kMl&!=I+%%=*^vgEB zd+ofSlMW$xY6%ijykRyJOhbcD&eoC(=5EP5gbQ9nCb=h?PmSo>bv?oPpe z+g+H;0cEhy7i>=!ng^5btUFK_E?u*%_YA%xKl8c&k~O}|H#*fIe%$cD^!vDyNAZFe zc|TsM-a=Yuo(x(bmBy;7B2$(%_x|43SCKNN=$LcI;a-9Hq;Mj^={~*Ce|ok~f>soJ zwAkW(NB2B;XMnnY{is*TPp&DC4U$``m9icb_lI5xB6e#fr??X=`!r}~x~jS>MrcDV zo9~(#lO!F8?OfjNsuW>fUuCK=uU|$r*+KVmMuBK^mu^}?W0>=-74S_*2~)k*`%^*e zHV4d=aoKyl0qA`DH-4;!jd_6uL3YiTZCv-nWi)hguS~J{oz|ra#68VzsyeDahH#zT@Qb zZBGMK)$T~XjLONtTDQs|ZgzE0DZ%C~MM^Z;RQK<{f!p%vQ>GjBdu@Fe-V(I+-vtD` zTQP*AGamQLAf2ZoF9j7heAbF>^VZpMP(uQRA32gT@M^>8NN_q7B&wJs|67)$@xYDi)^6zRTv#H3-EKR@Q zZ*<4fT6nnd$}VYDwPV5c7u05K8uRcG3)PAL5@xE=LxGX%b%`aB`HKIY&Y2BbKVrbY zKhKWTFg?k2JjpCdYImr-D822Gp3kq&xu@_~{nsO|CWaD<+ib`5)R`8uSI({K?2@{V zEJ#^QjB8EVXZg3s2#t4KyIojUh03>P;PI>5fwKgwkErDLB>|U)k?YH?nkJPQV zCvBxqdwyPC-71kId+xsh-5*!%510NJ&sCU6;vF|R+VMJ}?{YQjrq*ke2W(yG5?TbDqBxr!rhQDFtmWQPtN`viuDye{#Eh zorTmppI>ns*DJZAbXxuM0gaiBDTm;doAOJ4yuv5tUTnUL5A;ry{|7X_X#D$LphU>~ zp&}kUy)#^`m<#-%7-$0-y8C~__u?j2;?hvaDP|D3sr+`+wp;K~Hr;?o1gVRM`fKEC zy|Mz`Cu^BZa2G?ihzL*T>dEh5iUKA^>Ls^1Q!FTdP-874NbLnc+Bk<+m4 zdBnN@f7bum#*Ake$|_5?l{sOXrH;(VyO8zuH4SOjWIffO4w%dwrdZu#TDylt zHB99WXy1ruR9A#ZPZE&(O`6Kqzj76RovS>w-_r12_Kjo70;;ihUi8O?9_5~PHh!QK zIlzXBcdyMq$Tsi&&Y-K!CgU9u-?b}r`dv4MkyqBmnHMZW%lV${kR=aAXF(oo}U?JrDo(7h#vZx)jk+O5sFVnj4h8&)zl0_=*g|H(MsS%P$Jz%)GE zJ18TeQ%vsBl|IDnihq!0_eGr1@w&sys*fpY$PU%mK<6OZb#u>fyA}7tfGXLP;s^&k zbmnE`^uMWr{&(G)dBiTcL6*(2wYYmWPpglIySq_`?2k0~mWBaeLL=9@W&V_Q#ouCz zV2$aVNB$Kb{^tpl1Yr++^T~0on$jy4Eg>l?K4Km}yScrr;!H%T*iifmo$Jt-t*U0~ApxYD;7bd*nfZZ_H zoK^?&Q|o>z%}nfaxtdUr(Bq+%90eE(tAB7H*Uv%bTVd+gJ#!}0hi|0wx`OYi6sZ<> zYc5u-I2zvv{vSxt(L4tGg-BuCfU+L|47fTo@eSdcliWUsMErE#|D=PBUfWbA&^isI z-O}*i1-$vCxl2^d85Go!P`G$bLYH#3^0In)Ns;1p59P0=qx&>U3dtfKP4iWS$H8l{ zkOXhgwpL>Qv@WGMpoe{ElP_sJhA$?kg`=t=5Aeg|JWKnf%$CmY6GP*N|NOg$bIjxJ zOXMH|^1DYG>Y;{*1We^li@0xckuJM*LT`nHX??Z(+4yNCAO9cj?jt6#kY7`{L@*zb zec_|nj7rGcGcM(3fDXFG&arR6OZ(L96=l@WTuT6mu≥$s3SiU@hEhgQD16qhuV& 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

xy9p{KXA!iTw>_Q-_eG`(=49xzc628OvS(Bt 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 z z_}7k)rpGr&i16FhLw=tuFKvz{@4kKU)#xYN`H(;%{6I+87wmqAV^D)Kjko$VZ2ytQetxSzFn%|dm8af6JWH;sT z>&f@Frlo_uyRKgl(7GNnJfv>X6gjttcHfp74nw6XD}BGH)x(jA6u7C>u>JSmpMNfS zorWFMIjv2(WliiGv~G4TO%m42hgF;H>b3L;s%el9efY7l^npA&Ek@}Lj_J@HbDD6@ z6M`4;ECk~_Vg*#a`Ta5-%D0OyoWZ}P6>-%U+Tl5ZlE0=mE%vPRkh&0A+--xcfwh{&Qmsn3TKMpCo^Ryn14YG8(Vdwo&>xb!yv+pFZ- z-~XEm=1_+ye9!IG68F&YGpOfwJQ4FcvM6aZKz)c$P^f)y_XL@Sd@d}o&7xYo6lN_R z@4olNzYcz?n(7`ckb8#%*RLW>un@yLt}&U2RitbZ2bgqT1KS$Z7Wh6h=4E=?Lm$77;1&~M~BU=)(tuN;p z3#0%5Zl9L^Arc!+HW1|;!~-1tbC&k&b%X`Zdj$!F9|hlSL(H-KE`{uCAcBJ0ARmQ@ zW>U7|FWv7SlPud#Et2x#(o&HGg>WkMJ`2&!mV(Csy-4784!nDVV)jdclnk|DOGP22 zoN&}CR>`r2WASXbXc{i&rD|tkC@Zy9`r+>+xuiDGUM#qn7{I|ID4EG#KI(i53 zkqC{SK6pslHHlY z@LV85s2_Hide~vp!OmK)d76QIR_2~kwc3*{=3h3Eh$n5b4LC?7GS(zaw!X>+b-~ju z+bas48$B$pwj-Xh!R8!mg>e9pB)1`iMIl`+;{gXavTK2I?iUnCjDW>LSU$4Uxaj=A zRX`LL{v8J~#@SEP5v2m^)ANVlkib#IvMzw8rNjl6&V|=Xm;)lD>=z2+E!id`kiotn zqrg1d#@F4Ol0*uV!T*AHv%x+{Do7Hz7c2LRB`39kw8R2qkuVu+Okh_PF31FuEUu{d1| zHa&+8|AiyiU$kkla&5BDb&X0Td*)vwHuj1*;3WT*y&7N$;pli{ zToOpeAlEsTp1Z)TJ)n&a#5xP!*nwz3di$N1{l{)~Wdl0gOnAXjN<-~VSa1*<_;x_{ zys;SdLL9k|cvtVg8w>VbY;v#w7UQ<(dm+wWgYbQ>PqO630-@2^>qm5eNhDYYsXdU7 zJV=xkvE)Q7=mTHmwlgx1kaBOP#aqDA{sLuEm&}L&BHs@l#>fWa5~Q}}7Zk*6WJ+B^ z!XCBV@BJgoZ3BCb7aW!E$l}OO2<66!vK=4qxcou*wSl5pvA3wiY(S$G1{6Il1%%4m z5<$^z2Q5UHsLzer+FW4gPus4SDWCN{oH!3Z_xGlb7etCfdPphe(k)1kWf@Sl;?-@^ z_hj7ZM>pjYigY;OJdU*3iPp=3O>y8`9Ha(U!HKIB%~i?cqH4Hmy^2>LL_YV>x^>se_4Aj1z}JNE{af$=8|b;;J<$R;`2&I7wqmc*;ZvNI}YGO+QLI$I2qy-?#w?Bgw5y%e@e> zgy)HB_fKZdotu{Uj*=9%^(kSTCgxpwf$x!o#{Lf zXHjQFwtKSQis*+-3u^;^#XbfGfuaIIbdpUx5fmkC(U1p5!~)-Lk29u+8CJAin~ zfxI?48B*olfbrO6ZTH|kjBhv>YG_=(BmIlON775-z+Q2?0sPJ^KL12Borh+p| zs+)9Sm?is{3P18#-j(I8C*u$pgjm9Wp|k(JVj&hWuwLSxZ^G-@U!O?L0CJq=j@`6L z672XkE!WM0tx*shfs~FV_}#Rev-pVM82mrC#M=i?g^R*QHforB6@~In#0Hd~67zy0 z1jPy7$8$h@1N1r)aY-O$&H)Wk_Me41#HYW!z3=VyaR7T7G1msx)&U2c_Wcp}itKEv z-UMGI!AeJ@E+7#{uKW8+JcvTdZVI7-5zvPl!yySHe1-Shqi0Qe&&=I?kai9{^TKmPNcCtr4H##&$i^e|8dSlZ1*J8Wh0 zJMAOVO6Cf)LSx^sc=FS`fY^y#L@;I}h#4K8%zdqsYAol>5*Ihwguc#81iXMyh{= zKRu$-ln!e=wAfPie*NR(*mcJ<4-`l%w>n(BQ_s_lYd_yR`QnYWM~F4DZ};-xp+mzD zKeR^7|4Roe#=i}Tm-)p)yb-{jOvBz#zNYF=`91#fe&x$M3Gi&K)cpQMdge;v%Y=JM zJFySbcdC5;lL%}QWAyAfa_#$H<|i9OhRc)RzZKnDeyhX`nP2EmKV)@ZCV(a7M+6?j z5M&>IRr%mBeQQ;NyZZ6p>Sg+hRpKs>>@_VX$4T=Kq~@I8YZf<_z9Q9-tA2mP z&oF8+njIf#7wUZi<*_92CKj&jKDAh17{U;P$!Fg`#P;=m={W!KL+z^iht*H-?ITpy zfFBz?zpg|ac&%l$WKNOZz`+HepI(^)_P)OFl91mlcoGqiNR!zYea*EEZ~}8WjtDTp z0-Gs0I(OoGg^*zj{*32;STeeaK- z9!>IGdv|%l5WaMHPmUi6rYX|$w&_&~PluKYrOR;tD%k34?I2ehISLL^D_(@7udV6O z@(%siEQa3&(sv%zhy?)>+=9`I;lC#S5~>3sRm5MN`C02m&uTEvWeY`}MlbJYUQqLR zW;u7D#A@XpRsOYJQTvH=QTkh-bfHH* zQ}=CloZ^Uwkaj#e^&`rDygd|LN8VcLdV6Pg#KT%kzTex=FAucq*;cuK|NON5jUY9; zB$W456NMIq+I~Nu0`gOj6rFiDcju)x`*p$z(Ld*~p5PA73AiXGdNb?O6UBdpRN=Uy zruSuFS5SWNwv~4#31=!NyGm^uCG=AEj{n zucCUA8}IKD+V$zW^)A6H&D=X;ihZ@N=~@(nU&oiK9lclw#lc3uILLeH!|y71RXsLV z+7sXI!6;)%f|PUH#ys-F19iMK!*DwH7`YTY*suhPmpw9he0PEJVx?rkB5_d%jH*tq z2Wy|Y7~`e1n;;EF=Y;Bj)D=2(yjGE^I{7cj9pY|6kYL!;e#Gt2SkuK0s{rS&>zM)d z!XS9eK{Yy_8d3`vWprWaKm| zN24Nk>zEi{y^>g+96oV+Z}R39Q^)3wIYx9fPdl$rr{MwXly4vytM+=n(syFPFHWW6 z*-Vl6JZfIs1Dx3>8fZwfqgR|lzE+cWN6G8GEJ)zT!acgf^<~vB?r)U8^WhMq!l{aK z?z(pQbe#Nu@+t0e1rILAh`n1Wx}Q|iNwa737Uez5P7_mgim$2$sT-h2ljFZVP`4*s zedC5Uyprkn=k?Y0ctJx=-kaIamxG`ma=y@pHkjDF75r7GdaPmQ`-rX0q}AND*F#ra z5_kC)*mU}|Y*d&qCNPXP(xQ?MUUq1}SB^$$AP5 zapOctl~xtPMIPQ4xGHJX;wX(c&G#(Y3F)77v{Aik7iQ2wpi>eh0Su9Qj{jfwICE=O zyL);-HJ)_tFndn59jB{sutMfs!g7!b+QU38NH$}Np!CBroE@7;H(1uy9%Z@JWV8NL zshHRNL1xJIf4ZorMAO(X^0HsFD9GVTz@j5N?V-0#|L zQJ~byk?G=l?YKCp+dPp3PQw-{#oEv-wt1MF6rP1gkuIumQo%ba@XN7n0CbH^+|Mtg z=*1wo<>a*Vq?>fMc(3Ew6duyEH5B>AqRe7)?cC7l#~_1G2CAV+2k_o~X2;sgO=69` zMn%?Bqf_hRDo_z5u0^mrx~=edYeV4F4H}w;>rfuXDQ`xAm0lWIc`O69yE#0&PaC&X z-(`WLF`h1kL3b}VP9ttxpVhhFNb?r*R5mub&;?F;V&UV|+AWCK{svbn^MS-|0M!d{ z4bAUj5IW;j<)71FD{MV7Y?7vn3L4esC&-;b(UsPOl>Io=pl2cX& zwo>>f4IcT_l%KOcC)aWf;vg6=@6`vA-;xD8j*TNwx0Y@q*oe@6uY5ZktOPWTchi6~ zY&|Vea=+aQ9_H*6r!Cw}FcSxsvdFXALxo;0(7JahSeM4vzw(Ndin7cq!rhN3uiDo! z1t>pdSgP7A@<$WUP$EuyA#gx9lvkxf^6IEq_^psULFs?bPX&0op++aAl8?+N|N_w&ihND#!&xJ5n=b)h>9#(-2c z=CslT6yuF{sG(+^$`1@vEm1H3z|2&3{fo%~&Krr0O>Wtq8XW_sK9A^X0n}vaAX3Rw<4=XqqhwUS%PU{lL?8m3_1s1p zeY7~{S!a6HZ4C~VkP~wTuuB-Hs&eJ0Yc_?37w5T(D?JpFryNP&RPtqXa$-mKl^a*a zYrf_0H=l0@b$@SA{!tKbmWI<)5_h@Z7arrh+gf6HbD_a3y5m#~_~~9QG}}?uega?S z^!b9uyd5DsS14swg0Hf`aTOnm6Y;I0qw`75^B7@W>Gnnr$b1^F#70U5Mb@GJuz3*n zBGqM@pcYhp^~!v(%n?+hvba)muLlLob83KEws8%&#*6i8WW2?u7}J;Xk3zlG?V>(A zsP>+WP*FX;?1##az<`gmF*CedE=N$i-{$Lc9LN=tw&a3ioPvaENJb&!=b!FI={wuh z@0=o8Uf5(Fw(3n6=nus8b|3G>&N2NbFF&Ht$wo|5ER=fOs_Qlt?Ja4Q3^_VUdtEKb z^L_Bb1X7>~c@YBCzHnb}17Kwbv?S8EKLdU!?!26AH9lu)g9I8BVj7>((ps4A7`j!m z+pa=p8pp-^OKofqGYLxdldgF8K#p>he%0MfK8PMXEhYsEa;pox{>W`DIk2T2 zMZj(`iaTKm;<@2K@tmIfH9Mp7O(`^w2xcCU@%KLb>LkbF3kRXm+viB*SK%;5j#fqS9&30Jq}M-PsxsC!dACYcEl9iG{aJs~ZaWYEcJkO7Grk}H+R zFEADKe-cQF(1o&10;957j+c;Q0QJb$^H9ffLpoKD|6ztXLEk~~rzd);b23r!kiGMo zF>Vmch-&REyxMS!V+$nDyC4Xg9~=R)_w~$=7;OIou|ee%C!H7N^G~-8=Cpz8OhF;2 z#{sw!?{P`2Hz@1|WG|7fpKM^R!6XZ%960o@PEa0)$0($tk@O&B$uSnl3R`n?lAxsk z?0Q?|mUkXkM72thwB;}lp|G{dl5hI*y+VzYS+r#F__Q~*p-|GoNDPQNDOF(hV)LOs zaK|%{48dh$7UM*l8CMqHr|6@g?-SyV=g)}&awk;={`}}RwJEvw>lKW~m4mC2lVP%&@@CV5a2l!8|M-L6R(&k(B2QIpJL` zy+PU2%wr3noeQuF;{ffElBsFPu|nn@{Tmi2P}VdvH?Xx~Zy9QXW?@C&^LylEsI+mQ zlsl%SualW6Eo0|IiUe6^$(xlYm@65FEV=L5aa=(E)Ja)G0$%8@!5 z!3>vRxV3?%>X=RuX6R~Q@TCIz$KuO?tdYNx6qp}G2AS5T6GL6YM{Uyb?;eOuU{ibsr*T1l|Qw8%dH&FPQCNrx)&C zp5%o$wNZ^&peerGF%&3cL#(9WiTC8P`6b;P=Fco`Hze%SEOV{+GgTA5aC{Q=?){iH0r$}JgajM4xws#Ve9%zv) zex979os4_^z(n)zJ>UwP9{Xn6e}amZ_4wsS=na}p1jBa&Xv3ndoH21~VH61-ZQHG^iH&uP>L#BTfWebWb^FNYe@^IkUT~MmUjJl&(-R z@hNS4;=;J{!S{-27A>@ed6Htbiv2|X_i1kKs)5gSGnlFU0yA$C?7)h6cUD>CgoY~j zGKMRY-)Sn^v^<}B@W>{)z<2s%Nw@N873h~WW}j}#yAzKLB@8|+NN(ry&)!n5ghPu1 z=`L-~7ZX#022VH4rbHRT>q(V^a*GX~i;dxnO^J)mM;EUaEVi6myw<#U{bXvB1-!L; z@#d#g`Pa46sMOk*i?w0|ingKHVZ$m^J>BQK#RyI_7x@%0N1#!zLM3vIQP z*97Jdwcv&h2j3l`M@SbCC-Ys2;r5$`k>2&ElJk8f+A{~uW;PBg$}F?_%NgTK4_B7A zPADn1FL7-fwE}5@#1DDwl2hJ(szubD0?08;?fpsSiG9nDe=aF;m#4s|MNfX7yVuiW-whd!;r(}d?p?>>ne-QPAoDP3Ago8DjcH2j;)jtoKVx9BQ} zU5np^YqaDZrYAN~zDUxR%{(ZWQw{_kB|~frB}e7~zPS25MhySNi;ji)F4MGtHc;dS z!)yUF`l+Z>B^~)nDEE}~VK*FpUTN+pNglC!dvM7Ja%ek5RdK;zlqGH7*hVEzGW|$N z=&PCPszt}p^xMl19uet+x&X35{l%=AljMRF3NepU;KIy;9mrT66K+Q=alsj~AJ%>y z%`k%;e`V}9Fj3^wkD;7PmiwStjGfZ? zT!ooa>x^77B%K4aYLfyi-+kwqEwd-PL#)nH`R+hn_muhm1pd9%;HyG=_KsJ=lo0B6 zVPCi%4HGGeV?mDD_5FJZHut6(kO4N;1-Z%KW2YrY93eK?hbne0N2aZQtul^dAXbxS zR9L)B_J^dMUt;$h_0GwrUd?uvB=?^D=^OAZ=22Rz;dfC+JJp}h%-MLjgUrYxGY|56 zEn|TwrGjXFenK)cw-DkG_$jdEtG>j2Q?Wj$8c02M<%BeNGE>sh$igAG!aQT0x@UuN zXASE5)1!_=dz9^^^HsR}XkkDu`C2KF5BW=d{iIJSKCukVe3Qp1&Wm8iv*~Ufl3|mO z+_$PGtb!AT$Buty?(s%CoY(tzcj-T^!`M^VZ0)5h2adYVkYY}4cszw#LRK4guBOO# zZ;xOcumgvX3vz_ui&ZO7DJeTP(B2Mch`l~9{ij`9mVrIqd44k~?zo!##XH|J@6T)& zoX_eVS~F4o-TR^P#m?XKo!^?Zw@NZM-k!ps7NDX`8Cx6jrU!ZL-@gn+qiu%mWuu12 z$A(HePiYSw{4@R^q-W=eyX8mkonN1H&7fcX`RZxf!vo~TUw_`*IoR~=j~@d44x(d- z0p}TkXA-`BqLkUaio4z>dF*)p2dA5P#D7UQKr?_sRNTZ1J;galAH(&ZvHQk19bN&_ z&^FpTXttlJyfbQ|1>4|NrfWhoO*%i%lTc^_Bw}ZzI-zTB-UMNS2%bm|H8?KgkZPtcmu98OYviOJaND?GT_H7H7koT(w-ZgzV)tHb@khr9U5V{m38a$ z{D7t!tQi_=Knj*wqiQMX3^R~ZzHbh3z!7nL>GF~Jd6LZA)9Gj#D zKRZvu8V}1?6v}(moe8s@UUq{ z`FqnwheKvlFm(*To8T*u;3Oi8>FZUFvudWn$V!xsYpi=UwvzUHL$K#k21B7mu%yTkG$y5VU&! znD?$^QH<|fy+-n2^TB&}Jo@|l&$j@bYAluuQZywXB}{s;JUK_xDu@Tj!eT%ot`BOJ7XM_Re&FX3>f1^s(h*JXE40 zG8ubrJ(d7o@);?;JX)rrAZPQ2qCT|hbrKh_I~N}}ExV~)pE_Lb_zSf@uGrhDD(5I76Tqbx9#_7!Wep7_IjV;zy8^SiyvKo zw!`D?D$5)SU2=twa7v(hUDrEN~ZAHY3;GNQa$Y)73P5l|r5iBrfxj}w=OC`MVN4d(> zjMg_~e$N8C^zRRZu5k^!~Ej*KgKKTPO=Tk*|q#lt9w; z?iLQ>kMwj2T`fn~>_+^EfT+$k*J-a~z~)%0;YLs~x|3)I_i&7f)bNL+P`CovDUy21PTp0?E$5QJ`gF2&B%wp*w4>9wHkirawLhwY^a zTQkyXRd^L!c{#EC1YJsYdzdR`)ZF8g2Bn#1qY|(zYl0lJii(b>mS)5gP+8J6V8V34 zK|TQfVA9j}qGTcB9}kqqDzK`tfFBX}xt>K3V9iX~lkv03fK0GWH}VeJTbwxM6xi0R z7H$s|Jpo5bcv_DlcdEM2sx`4*!g|_D;`lns@}=UF=idl)S{?dH#GvhjMOh2&to(+C zVLX1VU5kQ;S|IrjcO!ZZPSD|I9HL4yzT8T~@`}UURaeQ2NVJlh_Iuor)5Dpv+^Ggc zT5KFLtEl`a2crEs0_YyiVjeFcsIPB;9agC2-WpGCj*6!fAFh_>F7s3ZDgMZCYB||G zPUD*q)3$?J9%na`9gO#KdD$+PHQk_9MoNIKu*x&5=6b%iKwQ)+cBuU%X#EI;I3(^Z z&s~p0M5ep#*cdPD{yQffKn6_y8@I;J5;PY%UM`HfUW-FB>YJQJLKOD&NeM!e$Pz_x zXgOV;!D`UjOwRW*JB-M!k=I-jW;kyIK@pzaLyA7H8@D%%nHj|2zU@$^M6?9t_?DhZT;LNc=?w<6M*{JUJY+Q{lro>M z*ZQ~txD<o)0YEw>b~Mt$x0`wn;+H# zcAh7K;_`s-;N&%Q?2$JocW>%3+Pob3EI`KqK{Jt41^1+uC%DIeL`bT*=vUrjt&CW$ zhG>cpiGNR4+Ow@Mq=U^$J0)w- zOOxvgnJ!uKHx(=Aw8|IAve&Vt$KC65obB#G%*V^a3%@SZ$>x*~otVwK^L=WaNLO1Q zFW>Es?`$-i=nZ*$o2%faJvNE;-s_~IX{4hXEmy%1-4GV~#?NG@H$$$4OfashdtK9hHlkT&?B)->ncNQq6XR0)>XUM9G#dS!3p$IPD;nEqSEVC;{ z{g;3+rc)18vF$sKpx&F)rUJbNf5QvzegS>1J8Yy>E}6ZLg@hcCN{KzXgs8OyU0V(^A~(bFJC8 zOAKJPQp&A0oErz^H6?Y@`p|p|jKa0+;qBnNnN7HvVhK+DweZpX`h}dY*Jv`yT=2MW?vTyP)U{X_?3BR@cNA|{;C?$Ud0=jm#l{<70}=Xl=6 zk;|JW_L(v#zzU zn+4jtf8i-rxqvn1<K6s299dSBU(ODZZYpz35t{=3*@ayytqI%hn7KuDj$<1l8kqtxLdap1B#- zE3sHj)kJ4LRV7bSwO>y)P4YZngpoU{3tz-wrg+wz2B$2pY6SJzwORRayvg>u^?~|z zT#TMZuvmcmh7_T^Kc+B6NA=7V+fl-w{KDAQRlsg=fWK62e2=P@kQo!xdK9N0 z6j)Zh+$TMwfA6i@{2Tgl&}xb-#Xk>SCr}#0Kb(aa&nsBsSC73w8I?t(A8;APzipM+ zC^~R~an4yF`Jjbj%$G;BeDFFK}TdKKAzUp^H643r2vq_3<>j2M_JJ(WRGQFdC;-0(6<6d2I$L z5*N_?K4%m`;+iDDnW5eMDfP5Rh}{c9e;=V&(sqhq*@}jE@(!JIhcWtGvVmI3R27a0 zZ@aXORViNw`M};>4mp~wH3wUg~)p!ArsS1NFOV3ng_b}@(KpT zM}euSk0~lW;Q_UXU`4)Tt=A!$PT!2*?-ByEO5HESDWkSyms9nfG zp$Pho6lH#&MdKps0^Zb*zSEDlV_i~_RSIjvTXyy-)|AP)Q_WDo@pL4jm1a*xswrZuJs#GF9`Yim!-=CoGE$Q+Er<^8on|pjyi@k)(|4JJj^@gG^?@F>}H0B`(M;TB}f1;8< z-30;&*-=`P(d-A6%pv)fT;iLSw3D$iPtB$OgKe1-ibgp?X+MWWzxO%}_@lI{P{y~CcJi)A*8z$uetL9Qx>Hc#0Z8!T2j7%Ca zBQ1i}8_AiN%96%~K$m{tZ5>NvLoZk_el&$Xn+J5ZyP@WE&W|!|U`;SC`4A{A<=V(= zo`H72GPQn>8aH&njQ~e9>4vR5y9hivv?x?Sw`Jj#Bd97PN1d5_Zjc&+RkO-*cvmVLe*TEj(07!Rus6bP4xDMLxowimK^EarAJj43(PK z@`YSi7FDI^nV5@aXGvC!ypTm*?y_c0r@C8}aMmx`cQEH0PHs}bdvbN7*B&5Fc zw7XrG+>Y$wb(}(@o1O+$hJ#1k>u~cLv?&I=NlV%H)A#@WpqNG@e<47QPPpEn>fI(d zw$ZHvZxa?c@`Z~=VsXG0UA%s4^_-Dgra2=K4lQ&?yEP{wufXTAh8^8m$irR*=(@)2 z5L-DKMS#{fK$|IiqkgvA2-FkndBBKIjQBB(>7PSgR`2JzU+Rcp7KCBkWoxJoy}2m$rC26Rg#L?_zB_;jfKM~M{4>&JD zrsx%=nAk&Qdj_qg#8!_qdY8@98#~v<;t)yg{yyVox8#E!R^F14{E&zqNdnfrp;|(H zfnKhK&8DeqXcTyO0|_T-ZPIH{e@;wUbj$8mkFjqIo1cBxx@=Z zBL~Bg-XGA_q+VoH-c4B^NYS&d$|NXotXNQnFF(|qbT#e_lS9c^OT#IwBZu{;Zuh=AqyX-c1CT12i~FVuipZ z+bZQAYO$|>OX2Z5mmc4#JX(49ep=;m=%qi@tAEbM9oEq1%A?MJUsE2;-S=2N{z!D( ztrN#NaP;u6Tmua!n0~J<@_6LVt(}(Nf%ZAgocc@Mw$KH4cI_Gm^Z$of84~W33dFr ztCN`Ibu6K)Y)L4Zx;zOPJf4v^bpB`eahXZc&YtssKVA|&xYuyv(e&Rp|82#Ubafve zh9OgSxT7u=F1!Qg-MZ@dLEZV8$%#;`bFHRVio~P}%Og^tplGf1((B>J^4`~w&SX{5 z{BzLo9jVWiCA<1?a)p#@U-P_etB*CK)IjF9gSwGFZo7h=|mKj@-dF`iqi z0lMy|l|>1?5#zI-W!m_Ht%Y_y&r%(m=Fq!m5_X;65i?k2UzzBCX=moAiMt_j<$8y8 zouejF_ucg?)g8XTRZN1}uD7M&`KupFOeYsp_GTxEp4;bjm#qsge6A3LuRhc?yW}xg z5w&Icx>|Y;?vfss7G2Zcw6`} Fgo`;S=~w8{6#`raJsbdntF7dNmxlb;eOYSt++>P7{8ReR4b5HKM6|&7`lFN`1(nOL}DoIhz zeS}snsZ>)E-lb7Vy6n5p_m}+vuWe^L=RD8jaj#h1NyW2faP{X?)km*yjdWN(e{xtm zPw4-7&23`zd7%kz@byp3PjfBBxWJLBGW?_Lzwc8~wY(AIoN_&g7wMGmbI+y<$uZA6 z`STj2t+LUQL=Xo1G}rSOuk;e-z@+9~9Agvv~zrW?|&V?1a5`<!4Jk@+)snHEgtuxVT1*+~x)$%=E zG}^t+O8$-AZt>!b`3nU8qu&b~x`h8M_1IR`Z1vgC-?y8jhjw1xZkRd}guL?b?u)bT zHvX^U?thtiozN>0Fqbr9_+swZGp~R*sW0PRyh)!g33z*a`TC2unQP+#@3Mb=dGRg> zBpJx3BZWq@{9LJ3i&s+vduHdEYO41TiXoIx;&fjOb-qyJ#@P>LL3bPrjBOS3krCdN z^XMQ!G#JiGsBt7XM3C-J6q4f|qiTHLq9Nuw6K$b*`Y z^@!99; z)A&^tJl2d4?0e3IKP>CjRx%3j%Ko1Q=t_O0-Vx37=>o;3Z&n(wp2#1FF^*J8XaXL^ zcSl`1n1$4i)Kzh&$}TDmTi;mgK4XAMlrExgn{zC4>!MKYb)BsQKBdW1VMh&G^vItwp96z7D|6=LPByMA_!4VLCMG9kG9J5^qaJCx-!FB&7!2Jt_ZVnqXaA6Z) zVuQp?T-sm0x0fQZ%DEWwKupX6O7}a`55YHGg6Mw+Nk&FHtF^Yn9+fnd3Rw(QlRo%i zL-)Oi2WL0!BXW&f-m5&{$2FelWy}pNv^Z0d>IN=8@vM1)wv|qM|T&WA!1T#J1TLaTKb+xaJHhkX`~$*Rkb7}L?#p4As-yg7b%DIRmCN>? zk21DhTHF(SZ8s61^E7AJJZs7u{MVH2bf#Bh^O<?LN$NwF8*yDw zoDH~d|2XUH`nJ66ZpoD6BhAk{a^)e^8Yh)Mg~MidewJzE-Gmumxa#V^SXw*8sJRyE zC9(pQB^9f+ZnNq`YZXi-mwsh2VnI>|dD03Q4E(LaHu>p+O9s)CvKCz{G4@XW^m_B_ zN8^s#z1@~;+7hPhPwO>a?S)HJGw|1zBCV!aQo3S|s>AFLA~mP)VfC|N9@akME^ErPF-FB!$ zT9S$3&~C);z(G5%+QTV7=PqBiSkiQjW@nn&{iwiUi=}Gulr`z|4}G8%39 zcCk@!Wjpo;IjQ_459^JwC*>aeylr=@S&?$9^!-&vZ}ZE99Ji?o;HJOEjjJ&GriOeR zb_zcd?KI^t;2+eSzvnpFi`H>0%QR5$R66U<{FXeElV_bV!&zSjO3zV%7=gX&XaKdNO$TD?DDyLAajvCBqc>hj{qzx=wGs^BU|XocjC zN=J>&-qSlO$z$R5iQW`i;fc90S>&yKiJ-0Bp2CKz31Pcw$XYDK?q1hZLu$VbTqWX_ zinZCFeI3%YTV+WDP7>28ADWKto~#dkpZAPKyfV!>?CqgAHFC#Mwuz3}*F`&}6X+Zq zaJ_=KYxA|tj4oj@sVvYE6ll!?#c1^H_FhbQF?e_CW|h)s>bLu~Rqi9VDkYvYfy&+ngbn$@KO7IgI!*=m&d7ks}=uYCG!Y44|c*d?Ylf(ggnp8qwZHChEL&mqL zbGiy$jy$Tw%?6j6=(Q12^;P#Hb{V||8dK83*Ww{uRpcFCbX1jh)Yw0dZ=OF*dHUbR*x*}4 z`3wLfvr&2TsulA{REcNxcv`{JCgI!!KBS1q;0Qwr%^hl}489mVEPRQs+MaMleLy=_ z4PQu|?Bog~Nq4yZJ3l-O9!Il=Fnn#YBM6nX^sG^#{M zyi+(uYJ;v?N|p6(*tRySzS3<^)I~hOSt|P)G#f{&8R%>T<0TaDb&7!k1j7ssdD) z{1E&ffHN@0@u(_=4f1L8GXC5ZHZkco0hI5Ebd?G{$(P&eRsF7J)eIrt5G9s#r6=h4 zx^jFIRZ@OPPZ-my8u$r63zG5wLKo1L*WGYi^g)YWd^iYRu`ucjQvT(LUs98M)E0ow zJ4a63gx-wg-bCuGSbP`3bLsfRMp;xusO=M{6cRFC4L{|GNg1t0@3M%@#s7VVuW^i@ z7{wQ##?pidWz&gq=fwT1F;`JSG#;!y7j!2hMu8FOtJND-qw3e zcx^DCm!XD#-ylCn3OYd(Z(ldKR)G$2LUht3xP;8`Rp}cb{G21^(GESe?V~A$p^>yu zVV7@^Yg0f9p)+uMR-j9y$>8YbyflR)6G8E-mfqBwh&Pbjv5$eQC7K@g2n;8od>d4^ z)D$heB27$99Zj}}YaI_INp7j(Z__0+cqR~6;~l;C!oQ`hJ4x(!lwTPinc*v{JBqKa zTl^R_@9MWH{FatChBOkPHJXtB46R^8+EX;l5L@%IOz7D>^KDu-2>AXXp3UGf+mSoA z}u7$GwS{U9=~mi2Ye)w)7vW-3Ap8K83djIXnC(@!e7M;dDC?rRqtC27Etodub*n zVz&ob%2+lsl7?1q*ptstn48DTswwIZ=q{=m$~Q<6={R(fOxsG-`qB7`jvVZQ%YT!a z*+WI4vZvY7k%Ulqq!`?ugYGyYdxqq)G@!c#`mvwzvyLFY(x9a5w!?GM$0Q6M!haXS zKNWh~tS-gt!thpTwmsYXE>>cQj<;45Q%>Cr{jsh3E5e^7F*~m^OE5V} zfOpZPr*2}K0DoyPCbR+5MUY+6mhB{voKgEse*{wZo1Y!ux4qI|?|Ya~vk%TEDZlTP zilkfv|IiJbwsnnEem^f6%=UjtO8HZcUsw`1`B?j>SFwd^vGQTtRBF#9GyCNqD3A50kGRA+`K~TEQkecJm41n;-Y6hr& znU#5!4iILHE&Y66HC$~E`lw4)s``7g!yX#X3@!zo^V|HV9rygIs-Qs$=(V_4rFw%d zUP?pOlO!%RsMdi{u>|-Jkjj+kjvatY?p7J2_{DN$RvVPZ09XhcrarGa1j<_Si}>aj z8Ff~Be6muJGFwWdT*v z^K#5jHQd{0FfRW}XQa!eD!YScBP)MUj%x2euo1YuR5gMmI+#XPtKmg^;Qdt+K)F3H zRi&CPIWq#^PsO)+c(swXZS*GEoW&oaI=DvWHeGq?G;Q}}BM4-c{1b7^SR?k+RPx

|2WD0v}xmmGR=Ch8ZO1)FCHxI~2-!z-p$oTYgpQ5h#EFHf|f_8?()YbCBna1-5dQ#IWkH4gb@`u6Z_+j{+g@f{5(&5R6(^MyCi*s)5t60~d@;UU-y=m1Oz4e}b+Ma3}HyRX&=JBg)Qqap`U#Uv()kMT% zC3N{XOCd;Kq0+Evw{i7J(;tV0YVa8j?iE#4xHzvIOYcaojt8|WcF-y^2jTU6>7My3 z|J1hqV{22o*Q5vx8SJ*0|iXK2+hq!`S-T!>wz*)@_3)+D0CI* zv%Wrk;`+;NRLef!GwJmKV8^>HMC|t)x9(gQCS6mnZ$xQ6akpam4vF9q}CMb zSCLS-?pv4HsCrryOUL5Jwx(x`VxIF#wE6BO=fz@2C9}|N%?;b?>3rp8!~zZ5#Xf76 zqU8Mh?v-98i-uZwVT<0C+lIgEHwlPkg2_tW^-(p|xAXX!UX{0?@)}EO3Lm%CAVopL z;cED|^D0HJyMFe{rhPcy$x)r9#w6L?JD_=CkE6l+ZLR0|dedzA)n42zN6$M_ogJZ$ zHjCjcCIN_Gv9L!M^Bo(tf>0@2v7Femnw;O69%79or38;i5^keGYCpwe=1AsUw%#Yc z()(VS34+d-OyWI`$|xN@_Kfq`CRzwsh=r@+o9TwFie2_FxF@YM-rMicmRKDP8BV!% znKKlp)pVYOx=phhKQ(lo@7Bsj#b$-wo<_pAS^r=ntM4G&NXT#+vXzZo(Seupk+=EC zGknJ*%GOl`RIBn&llM=~({Sr*(hLrAw#O=t;LQf~1q3LCFk1IV%pcPoJ%_BJ418^d z1s`SkD|Zn>L!H!?xSs0ae90RPatkC}CsnCh4HGLvIZwlusy)A=CSOX{sAFsk?M0vL zRnk&h|6^X$r}7;o864kmjzou} zJfEhZ{#OxjbQB(>Nwmx>)>D+5Ke!{Wgnii(V zUunhh-B%D^9rW{km}1J556isqsRM_{QFVg>%vNvK(8G8Cfy{nUPINw0ePFjegdjhpqsjxRlxEJ%Q0J!p zQuRKM)}x+O^4l+T@jj_M`|=krMpu2SrpVtD#VS(6{VV zYc5PcP+g%*wj73aQGlN`MiXCgeO`*p-f@5+)$Mh~H z+U;+i`LhPUm9o2b;d$?w`n${SI&?}u|I{|>p%}!SKK8+hSrPKbq_@T9o6lu~9S8Xh z=e(X2=h&4x|L1lD7Lf3h+s1zeaZ$^9TFv$v-0_@g`pfqeSN%E#jmuiC>g?6HXLz#S ze}7M|ckM!sMN@e96=tZXijGn*+4|0+SCdKSAG2zU?u{>V-I+qkL*0^EodT~X(z7la zC%bF%y!YJu^1AETf3Kzk(5P2A!9#x~#s+o>Z5d7n9hN8+lBrg%-ex{*KcS*pZJk;! zno|5hl6X57_rzrVOj>Y^dV6ybGT2i?37y9^-D{{c>ifiEGw)Jg!Y|uKg(Sa_T<>Hn z<9lVtc+bLR_PY9|A4GpO90{-7YmdC_ZyJ&7t+AT~a*-+jJozMuJoHIEB>83fMdPjB zCKoGVi8e)359j_OSV+W`$o?L`-xn@l+PK&D`=8z3wrgg`{IM-pT`!%|*#?CW)>|M; z7eDjAol1~@Q~lu#R~I3}a?+AJSUwdLAerV;#E0AGh7SY|asy;k zqqVIiR_x&&*1J8v>!T`rnrn~9*&MT$-g7Q5k&I4%h3!ZAOyx1fj6Jo4-`%3BRddmM z9!q9^{vG<}m!pnBpZ7F*gEycUQ|IGhH{8}xu+6j3i)$a*sB%l(p^F2z6Apl7lwZwN zj>)9%%>3zNoOS!DWkz%ZO!@U@Wszh){=v5Q2E&wonF;=}V#VOtd3U?Nb86D)bjkyx zCvhuoT^y#Fn2)V_${0MDpsLa%h4HSYN>DO(d-5zwGXxCDn7~}c1@&%hQDWZLQ!)p` z1!6hXgE3#PPS`B?mt}A@@P9JgN<&$NCyBcp{n+=9c@wc4>terdT$Z)~!7o|v z@(f`kPDVFoy54e>FTI7yD%_>KImdh@MF-&7Nvh zTA6h_T0xV?Ei~XKTS9hj_1?MOPF4Nc-e|wo055MNN&UlBqs5oY{CXs`sB6yhU$|xQ zq+W*R=O%53-EuPZUnIvi^Nz61Ao>gM720AWh{coZ?~VO;KB_pC}0AE zUXo)FCYN%@8!hT?gKX*f#Pg!e=dI#6$_JdtWgjlee7c#5EFZXCChFy2eQqC)l6Yb7 z7~ynuV%WCFe29#}=1_QB==p(DeTD@J9qnz7@;8)o{|g}^!a8nO4O5(-Sx@IVer8nl z((+}hk)wrs%r0G8=ymrUgv@;>?6l)}?PX9Put8m6qf3K0qk;`Hvg}O_-$J;nZIe;r z0;mw4lQf0)VDC$U*qOB@2lr8;QXpO2pHD|8Py3wy7k$O;$Z1#lo{=jItwsac)2_R$ zpS8u9UrXAicCa|KPu0`aG4NS0x^K2sF){gCY}~a2?^^YJ`ciMCT)%ekj$U5R%8wga zU#=Y%j_N%`$+zbjwox&sX9x7sM30~?3@`qYyC?1TA87ytCD2;JH*Qy7Zi{jdfAuwR z1Al(n0A#5|8*ARcUyHjQbNET{>;sF=jtkf0B2K@4wYbsw;EQ2Gl*g-9DB*6u;q_L4 zHV3f$?}Nnvfb252r1!#RFn{z|C1dV$On~kSVfJWDSis!8#mDaX-PZwC+FNM5h1TF; zTLx7c5XoggV&v6K2b+V+?%R77y!_J6i}P2VbRUdA+>ze;TNb3`(v4n>-@kRu>|g1N zE`HE;P#*>HWAC}Ui-w7NrAZ*05GnvCCPp_%zx!nmfb>st9Iyfm#96mnGtJmDR{1gr z4Lmf6yp`qECim-7z%Yb@O1|}kuZg$P@;JE%tjYou6EY58l`}ab1B7ohD?FLC{F`|zk zv#1AZcbJNl6_}=@2{e7I8sK7)EKDoAw4nJZynC-A>C!1eSd-s*;5hupiOTm!c6;1^ z{z~d5eym(%52ug8jMn7(umvtpL=;n?*MKjY(^PLgP3=4e;ArrZT_465iEg&vlf>X5 zGrLD5NZ>+2WJcbu*T$=>$L@Jh*IMNt4U~>_%^wJj0BlqenhUf@9ANEG&Hc7GlYPFY zY5D?)vWGhW)Oj4({P+7^|G{<6wS$yTCK=;LH`-~hJwkVX&y|tm7+h<39rWA&II6$U z&5oVK*!Kx~2OS9Bxs_D7^=jvbpx#*Mb28>cA{gphdJEK?h{{klnN4-4H6mCvB4HPP zhQwf>wxdF48&sEC;AVBg(vrl@hDWj|z3SRNeG#`%zLb-Dodc=evtqeV^AkUq@L9jDA2 zF#GrStXxqy$`Y0XW`PjV@D{;!iC+Z>9Jwv>Q02SVug(f{QM&8>kR@!0w@IOaoyGFZHye<@BmrRjhgEj=+qnb;UTge|&Cas|VB9Z! zY5U>#ZlU&{gb6P$M{)|4@jgfs3RK*NhmjkJ=vNa>c zIIiL~6iIF(7($HbugcB=Fnm4?!Z`|WhoA|E4R*@OM~iLI&^9Ch!N~z*K}xke83TAJ0aGOQQi%3ZUfK(z!VzBTI797d~ zth){$-HGPOgRYq8$??Vi@sRdsfrHrGgFJdQEMl62*~d)lJC}c;D^#@e_gOsrGBrpH z3qSNT{fs~31~~~T00>q6}HGu-2yO`i74z zkEQ{#BoLZ{xa=0%F9(VvqQe_SutsqYEC@DpaD!yA$VMVXn(I{97W)(?F-VDn6i_5Q zD8LtEqbACIL{B>a(> z0uoBe@;Es(365o?veC?`D6>M;5$xe4UY@>X#Q0rM2R2p~I0B0-5pXc0WP}P96gNwM zI~eJKEeUAPTsRA`_$Vql^!&$60T0Hw5^{xtkws7gqT|7|iVdQu{=kKV(C)}=&r1gn z{3<)bji6I7(Br`mH!uQ1Rh)cDr$PxY5yc}HDp&z`D3TAY(02gI9~8+$q@3IqjPH>O zG!3=IK{;3eaTJLSj>H|dIC8gmT2#mr#rl;Q%nd*WN@0?Ir9%NA4qKAMKh|w|v@HsA zg#|ze)d75(EFh84EPkh5czh8He_dEJiI9{WL5)%*{{l#(v_n*&oKF<*XU7S6rxO(q zgIVxLYz*nwnZHK>3=eb$es*m0oDeHE?hpSvlIUZBe22t5V!;~%YdnlYFeKu-T~?FnwV4_%^RbkkY;vB?I}an5`MH?fM_UX8}qrVXXXZ{(Dw)ja!nEN)p`cMrAU zM5EfhobO%ipM1$>4yuM7|A&IGgl`xAxV#KVf~(?Hkt>33GAAeFCyvKMxV1l1P9}wBLooalvSFf*~>zA z9y^H@Y(r$*4Yy(d^lw_5=cTYCglgM+kdosmx8#cSSI+%W095#>4L+K{33WLx)=?cQ z)eb43W$vtjH!R9-E=D>Yxh}{LDo})5M z?s+qUrWeb^uC+sgSVBtj&Y4J2TG(5wn)W(3d6cn7G0thJY=b44b1q(YN&FEFJ-&!? z-FfP}97r2@xSd$uCP+X7GNS}0-W^J9hxSjW&+}kA*kZ;@uzVyCNRimPbh3gXxt|0x zJspn*!n6h89elW}70j_P_VUkk*ViB}fJxs590Y`td?M_CQW)z+=U1u25CH8QfT&If z5ZL>lBY>&V#FyG)3m$+h8C1u?RJ30iHSZ-via}b%x2kVeyp9y`Zm_lQzjWgWNa9w% zqiQp6*8jfmp2Ui1Z?ZZH#8A%Iu>1GkegOScHpPq(7so(j7jTIrLPy;2S`a@jD37o7*u!f zH_$=K7i;g9;&pGe4?_86uVxZh&FF+8Afy=1N75c{aE4CzJVq4E{KoLwD<)jRORr%b z#z=g2ZC(6Y)JM@dzSp9|;yr5+D??&*7-bUKX&hXOa&#w2e39$!6`+NC|X z{Yh&FMUtkER2GG`#sCEHwCZT>)b0wc{#chr}E{Q&tq*>32{VNbO>CCeZ8cjiWF3SZ--`P13NzTm7Kl*a5?Wh zEbJRcC^;C|z5fsJIBiggJE3G#W4`;EsKzgldceerpT#2{B1kK_SO_469MqY}ijKAm zXW}q#fi5Q;=pN3;rGe3OIrP74mXj~S* >7>3Ef4JsMG^I{=0TSpP6sF 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 z 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 @qi&dYq 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%0DN?lJf>uQuJj;cvtg8z_Uu%Yu0^8__3t z*~J>|p+N69Cq||EdJAQHD6q$W&rnckT$i2tYX>1Zuyw=7f!+8l&E`-e7>w zH+Y|hhOt6!0~HVi7^i5x3c}0(phL8-yO*($8$ZVo?_YhRfz2shRnKA*xE5D2)Z#P4wNS0}P=(FBU;!*viRg-d^4TAzuQa%~6h2P#O*5 zPXp%(py?bgVB~EY89GomR)7M34ks17A>J+a!LXDDK`02+85 z@m=@-z7F5hLjj249z6}g%uLy{;A6E5ypm# zV2`-4w;aS$?KZBhG)QgbMI3N?0UY8hk@y)z%W|VN0Q-*DqyqTPza9au&@eg*S zZnAURJDHjfGG|vm^~FXl_CHD$J-Xcs`a(zi6%BlzMt`XZ{Jk1n~6e7DmSS|A!%!ACmn^ zEt^Q3EiIXKT0&?zVFicaf2pzyg|rQVoZicq^yio2H4 zwUGpcT`NL_Ve2zB%MYK5RSZg30<<}%8E?%?zdynvEyc*~DA-RESTjYgK?M8G{!#p4 zQM*j^p8CG!ii`(td1vA3w%XxsiZXXlxb66Nlv0J=ZgxJ)OUtg`EpPs;sg!$YfueuV z2DU)X$^)?k$iUEXrx(A<&Vt>Lzum>6WVdCNjNkvPA4k&=+gp3?-%!~79dKDI!HNR? zL;VUY` zncufQS_f@B37T*i%~3qC`RCjHz4vR~Y%NT#O?^QOPnSH~hz(7mcq;{b|MmVC1f>$C z%OL`h9t097tbM^ zwZr`Gtm0F(P@43BWK?Q)TReyfgCgs&0R6FS)BBB`yLW8qw+Ud!q*(9ta|781`g`lE1nx`-<3HHF zH}+1@-iYiV1Ff2FU8HGrzwO?Ar#{*8u%W?`FZbu_cLhh6dfJ7=UX1MuIZ&Hz7kW?< z+7X&?tKaV3fizTw@sT?q`|u>yF=?g?*mm&QRfy+Q)7=j?mjwLE@RU`v z9NU`;*@c+TciuE%V>nY#gA`&4sY&_U`CP$L*415wTM+e4SZd|eG&W5rJOv|6bCn@P_c>=6~+!=#uqMWha#a zpX8W@t{aLgf@4BHEK*87l;kaet&mpi8+c<$nf<@qhbf{NrA5;`M4%`uaC}DV5S_gMpT3pa z!xXC~VB8JI%1ZrOpAh|@lJ#_^ph4YyjoloE=upRPr4!%u?NWgHnv#6r@@VCf);>(4 z;hluB8MRBaEV(;WU<}xnV8O*&|P1=I_Wp>{Q;pJRPQU*~Ococ0f}PAnuMs zCL*T0yYf8)yUcc%)9X~$yU~mFGV^vBpmH;Y>2Qz5l60f#LY4g9V`n2h<5Dr~MfBs`A1!@Ezyn1&lkfy2sx?c zK)3-*nQS&)l2T2QiL*KvFlJe@MY!UdzNlN5DFt-V(xX@eOKcgq) zMi?0eL{hzNgB}0|%rZ-mx7=kk$kpzQG!)FA#R$l{~k(H6^e^8zu zf;#~AJ<(bRh|MF|iPF%auMkr<(5*^hQ-NOCCsGHE-prj-qw$n4NO@SqSmxM{_o7o+ zdyk@)<+c{_l<%#1>tACDFqL%`(LPt;QFws0WScR>hXeTJ1+=S)!qNLoe zlHwrN?y#59!t*LiSj$@Y7?ZIQ@RoGho;BY93jZDgv1 zkh&)*NgD3bzw&QjwL1E_t>$h>fQz1Y386sxLk?~oGpL4NyGWVjZ+(7s(5RgAm@;Jn z8ySMAzpC767qtbuM38imT7h;&bs$R&Fyi+R-l1F<~q(I*d})gQW6KO}f+D zshMe?d%g<~tLNCX4>@)zfHY>w*f1XwKWy3a4kin+hRIb)R85#@-U)H0@jNHnL71X8 z`<>dkj&s^hZ|9zpWEQ(WjZTJ_K2zzh5_OqJ#*lZ!OcxTxesIfop#|4 zxsDauMbxo}zhWroY2R6S9?D`J#hLD0Z0p&^1l<^L1h>WB*K*OE(1^DlC)-U&7I>J| zE9A%bJ9X5Z-19G9Wlc1o+H1q~9Mma3wU_zmwggZXpMJz2J%~P6h71WtYn#TeSt#Bj z(VkCXm-0%~I3;I{K)%+fBl+4*qVA5UeAc_1=T7&^XL2v3<&T&?7(H(*AMNrct!9dx zYt3TdQ9Okryy3V^@*48%?%Y(AYr<{Eib{r)ASZnea+VD_mI5*lE|S1$i5Tt4R$e+D zvJ|F*HOoyS$|%n%VT>OANV|Ua9r!`C+r#5-F;<++U}=}}+<4a33KsF-=-s4)41=NU zGlXn40R!tJ?cACxK0cl~rYo<{0vOS1ZE1DGUpt?ranBVJ1x|U}9iT9q2dYoG;P3~p zpBf`=n1pS{o(zWfckwo^Ayk|cBl`fw`ke@xwbJd^+bKkyxFW5%3qPMfow&xf2g z=W-e$Ni~NYLPm}ycEBj-gd&HMh)NPFz1!wArBWeEnnRLQBgc~c_WAzx`)_|=yRO&k zy1lOFwyN*B&+s-49fznYx z@hEC6+evnz|7!xJ$sM&%5R#roADLywu<5=rkF(avNC1`h@EtX+N(tKrOJ@(fVAZDP z(Kjcbn6^03O5_65Acb0jVPo{u1ebqAs4Ow2{mF8=86Mq`OvcRVDlFWQ2^Sx zX1W=UqEv!C$fidNV$Lks*m=0Zbp@VrK+2BGA+G?y(N$o)65Hc5{^72H|?Z zht)10*`eV90uEIp_LGo|ZFV>O$tgD9%hI{JhS`y7t9A3@NHpp;C`2odr)^o%kd}MSE!T*EvfPGdpdi&_z0K=3LXFRR zi7;mZ2;0Kf^&pgGiWZxyO{S%3(aoBvx`7gr#_pmBOXu=-j5su7o6qm{X_r9KiOkst zKz}wpvbjum`&Gsz3V{PV#g8NtsG9BBX;HBEG>Xq8{S+2_nGGT?(Zfg<0U_6<1A)>U zf|McUAcsEUr+NC#>--@53riGD?rViv9hIF|s?k)R>Rb~7%BuaPiCUF3G20?A*j;1z+FgYiHO8F?qvRwnb7W`;PU{lQMD;DyFLYa})CD=~dt!w@W@) zdK?#;yxke+Mz>~r@&?oBxgPz=1Xy;WknA=sBM6umOLEjk2l8jTO-5@8g47ei zaQWu!#7U^JKRub78;7C?8%lT|dK(!?k2_P^c>rjFf@MVI=)^W&1woUw@{-e_{qn})M%$_R|)QGr)C^_ zqeXbG+6>8T7P!R^!p@3JE_vw~ethr{^t-0A+3aZ9zb7px8#Br&+LmA|EKReDvS#Bw zl?Lj(15y{X)MSIqNMQb2rj)0RCV~vpz!sArOUsj;?=tKA(yjmhkWcTm^%HmR4O zPUoZ7C$X9+umy=`K(eD*+J#`%VzD%ncbhZ}8%HU;%AJdM zp9-Y5G~OS$WQ#w(FfQM(cU9-ZB|}|7dBO7BZ=X&bJYM|o)3>-8T=gdu`&e*;p{lYv zWcCvlD-c(rMcH4raPmY*>8FEblsi)jStayfF&b_BWt7nI%pL*g$ceQ3P1@VwgLy~m zxi@@CVD+>Qyts;IjGWBo>}I|jFnehJ2yF&Z?$J-w8zU zI;kg(=O)=Gn%FB1x9;cH+Er5WRWj$UOopm$&P|djs_c*MdAVmS>G6ROUQI{nJI-K? zWnSbG#3icIY|&EJOHl7;XqDEm!D86kr5D;_xf$*B_)%z~0{wwd=x83rqMm<0?@K|| zXSn5Bcr3hPgk>}4Z8Gz1f6jaDAyA_fFK&ki2c*LWs~^q1WmxDl=^itBv;D5AAUuT<|!4?R^z1SSG?dVDZ(`6k)UljiXql!OjwC5E+qx zCRlVkwLS=lp3F|~dC#3hX^=shBr3MVq=GQ5od?p`9xJKfPrv#^mKuNk9`zdMX*bRU*r?nuNr*M+IVO8-HQ)r0lFo z0ZU7$gE`dWT1m#>*W-54=;z^K$G@FV`Bq~{8CQkHEqo$Q(mgDr-nuR2ak}kuRQ-=+ zucyHhOO%qD7yU$X&W}P<)9CSe^fM>HhH=s7Ud^X@eYK+ zE>GF9zrA5ZM6*G*`4nlAz*#rg06{W+JE!R>Z7v*oXDZ6u^6+snuof8{S5FTmfmE5N zZo5Rc4lWPOEDsh5N#}tMSm!$kf&MFk#RY!}n89N}|$;mu3 zu>jt2@+gS6$Q8Q|(8n6u(nj|AG)pZs_>3aBzxM0&-Q}kbv<4>P zIJxn(ybnI3Y`G-Ze+~k>W+Go*V98PR6f8YT3qt=C9K$vwaQ^XVe}u$wFz zK(kQ+uNOtODlP7djo-}twO#b=(b5xPf*KU)_58oqINTI4;KZ?A1#~)+HkvW zCqQApgbGMX_eg^>YlUZirOBNsw@c)4_JB(L&d~tCic%eZ-;Tb)i`0(8XI3o~d zRATbkD262+|fi<9Md&0DY>yEkcNKqEJL7N0NYfUN3s&k=K3i!v{M z=1@y$hir0Lo4?(E#>s1+L0BZ;>7r<-RjR86BLoqQ7)A zd7qGbriU(VbJ&uDu;;A~M0~S8vWbmPIiCWwu!M#X+;vMSCYI16C_&xYsN-o+=**`lgCwPyp zN1)11#YGgS347mCdEH+0Z2L;L)E&#RyUIJiKh7ZTg5gN<1r0%l|r8;d67<|En4nY@S9lYX=29FZ+Ba zg;TmU*}h$on%=#fF?=FJwwdam21}`@+jcY<0dl|Y@waiPt>K^79Omimwk+b)EI{O% z`tC|<>J`S0TUw3@AP>!hO6+RVF6yQ1{+YT2ZFViDN@)7FMU{pYSa+-~^(^sgCon3m zdw}S*MyE10;oA!QG1G%oL-*@#(Z4lb6)X8Eg1`S0xVa$!E+cd#O6`|Ws8@{bw& z{Z_a3s!MN9J&c*3xcn~V&K0TKR*`qh4{XMI6l*6d{N55AbdnFKoxK=263~5ai_4I% zJ~W`2^{~ikJ;prz1+OpH`&EX}JEJ3Pec3~IW6#_wwEDj3`M}icxKEj(@fUg6(4f73 z|4+S()DLSzssSB=J~_pe6}mx1qbu9@=mjXF@O3dOk{UOQ6^GKCOc+E`pu!m07RMg$ z+{?)Rc5#LMsdIX9MEcC`=j6G!S+c!KeFF?&n$i4?Vd}b*Vn-# z{O?eXt7^g+6CE{*gkkI_mD7Y@j!o{OhgTH069`>>L?am z)i8((=podQc|LhYjWWENRcEp9r6`(YXmdh@gmG0>4$7a@kSk*t+W@^Pp3fh24Jc`V zqK~o}!Bt_T2AYg-W@&cP{=9vIvcuDoaM{o(IK;`exuaNb|Hvp9p2(%WmUWWo@3#*t zS&hQm8m{J`YD63PhmTR>{qdgU)hOxk8lzmv^TW5l$=qJ(yV!I!02ty~e9aP_uPhTC zmt2~kH`l2lv!i!X*H`7Bq(%Wnv`}>lo8z0>On8ep8fAh+87>8wq!O8Qv~lf%%j6SP;_uX+z5^`DHH6iSZ_mk8Qz8mhV* z@>W+Kz-OL^1i!Ms?IU)mydOfs4w?7(h$a<;$xpEdt$wyYJkGr#ZuS^`p0QqRkOs#5 zvK%zxmjZXig~*d=$An$(7a!xqB`x6S*8QayLwo0yhDk5+ci$Ao6*ww>Ny7?Qhk%#K z0(w_tip2L>Twiu7I_jBp{Y$g-lYO<}ny!o~WY^)x+Sl$XB?U53W7z7b(fMRQsnL~9 zeppS6se|B#WXmLRyvC`kWjL!mBiDE<3`9O*q~wkNw!F#=mA z63R~AL*k_3%dKHIv4IXveM!^*MeW+Gxs+b!nx8BYKR#Tx0 z=26rvioIGCSpbB(lKTHFiqVu5lwFPx0`xBo=V*(qsvgL=PXBr2%80*kUEU*w#rm{C z%EA5%s&7K0Jhr+lGAIgvu})I#s6mrO_rk8fFy$3xQTXXkT_15m|;6!rl}NZla2FJX7t+?H3%psbzq9N8R)eJxKtEgZo`m9 zn#LmIW0fK1B&K*`cz#iYlUBGJ6B&$EO=ko3Z7qEf*{jH%5gx})@xY>S^`nN2aH^}h z8(w4Y4WjAfnd&p&7cD4~ug>xlr@VHcWLask`})m0_Fr6ede1Z>TE6Ih?5MC4>3e

nS_(9xVy{f6M+B{cU9(%q@Ep#4UubIg#-d0j_1P>z14iXoiocO83rzUp_GMyYC#(+M{<%V1>zXrHBso%DiDRBL)v4o1-ZEdIeoM;;}sNS|? z$^*iu<;^)v1A)Th8i_0f?9-L@iBZ)69nLg-khnvn2|IOwY;ln4wY3=dQz5U!Y`@dy zoB=zRH83$J%@EUAaaW2&ZZ;y{ck2TUn;L314 zKm7H3*Ft08PbxSp-9QnV^Y{vzaHb6i!cO4NP6td!xizTTTT;=}?T}x%RK=M|XhnC! zljzv)OUE5=`+6GAtg!%MYg(=q_uGp2B@d9j>Tv0*`MFrBK$Y$Bd&WCD?|<*AVonKi zkwIj7R(K!dLogT)e8M?Xg7@FgcFxw^Ery@4?0fTpE3RW<^-{mIFJqGwX)$a88aiQX(et;fT&NZSQ&Xpk0doPg#yi2uyJ@*qR^@^0MLD0mUk<71u|LG_A+24CR#D?B)=XK7x@BdseVaRaz zE0bVGaH>2nHo=NWuUagji0)FU>#Imy|2jrr@T+}4vFn^aA7@^8h!DI+poX=W?i2Olg{ zf8tPAw{2vDg~QvW0}i^IAs0%!IEY`wp%TF|q@AA*B%3{C7JP%&^O=S`UAunkI1^0E zKJgy*mwje#AVhl#T?@QOg5C zq=FNf_Vo-z8pv+t#LhZz$^Zw1*W>`+4u(76wii7 zeKs;>{`us$Wj45#UU9OgK|HwP~!rt7A3xNQ$bq>M?h>BEfRHEO_iV^j$#SEyaC zur6pUk0sxW*JuQvNqE~qsf0UR7S+P*Cm~fBOoe`yZRZD(MNZ8RBDIrca??T8hGjqf z2H8(Ww>jFFI%4<=Ob^XWyGxLG~0Es zlZ#_>ucaLmNGO)2O!(5uJAeimuWV1_iT646? zpx*p3r#0$mKYi13iE_KZ%XSj%_vxVFwxc%Nlj_7YnCx@Fg{#@r;V#JKoAJa44qQ|y zyXK&;=9u}yOMofIPqh1i)SW=;fmHqvu!i`AHg~mPmTc9~ky5+{2V_tMQg)-HJHgOImWn0iS&i#uEudl*$Y7E`@`jhd z9z?R48f|!ZEM6nZQ_7U3UhsKUKYeGOrLI|#%N+8A8ySUG zu7c(*McSp&RN<1%>Sy_a`BKrWRhJT(mg4=nt}8*dloM?$S5IKy{r5=wbHZn54&wIa za@TaWMMKArjgVOXbhPUqQX>$APq zlS{4bAYGqNWa?pAFihq%o`;O}l4(jxLzzHX{K~=;DQre)G zzw;3y)heLVfcykWewjHdT(ArV-%9`V7XS3)j=4HAI zO0?4Z*rgYn@k(6E!HVN(wNwRTp2cCycc zj~FKDp1l4BUUgX5ZQt?-M%5th$Bg#;-f3os+oy1rcn0usRY1uPmNnJ^(T2B;J)Lh9 zBeOtJ^1G)rN}<5n_H96H0bXVuuPVio8~cXiGUV2QO0nTqP9UWvAZCw7<}aAZWnVpY<$)s4&FXkdyfG}G-LFSTZV*HYm1WNER!xY+mh3c#!? zylq+^N{y*z!Mx)}Q7m>4vuQwuzg3;QD7v!xyNoI6LNW9RDVH-g?2Bp9Yd_e7Q?*W5 zSNiU@5(MvM+9|wGiAbZ91ADBAd-PmqFGXr{bp9 z3^;u{q%in24`?3?R)##Veem57^Q+d#SW?vlV$yi96QHmJHZ^!Kx9X^o_eGJ@XTEas zbs^9;!*Na~Teyv4T@F^z`h>1x>MYRo+I}njK77J&eg8=1)oGK1F)?=WK1P@amxwVq zWD@@95dJVLhQV-%adfv!a`HCC`*m7(f~T}k+F{iV#fJ63V0&HaeN+5tZty|ZhX-k` zDo+ILt=H_qrUwK~@nMNFs_UL#*S&OLPVVdRAhZ3QEUhZg(P{^6UC=4D4PWocBiB0p zK0oZZyZ-5|Q{W@h(Ex71i_XKCBnPB`*XPy1C&!##t2%>+Eo~@5NwLCJWWlj(!6s(M zBRBni^Po=CpH?&TpCug>RxnA}{@K1Kc)PA}*-)*fdB?0C-A16~SO$QLapgY;_Z$oOy@0Q>gs9I(S$% zMQ1qWdJ)B@AFQOtOfmdDUklYP06-eHmQZb!9_^L42ZrZ4FRtu=!J8~?vPqBAUuiIJgMbDM@vtLO} zxi&oM{?65VKy>(PWC8PPcY5_bCd%}-F$Rbp+u8iEll0UO-A;+u%;PVkXtC4yew>WJ zVbT?#-wnEG0T7#HBp;67TeE6-uyQ5!5BlZ_VeFOWi+>=)-zpuwP=8@>iJ=t^5Tvi^Q)wwTk{ouV$hvx5g z&2taDpA6nU)zhWZdFV-3_xA^p8(mp{yN>?trCL9#eDbKy`thwNk3S3dpLct5k7wQc z@prNU^K_sK(h|tdI3>n2d;Ht__zQsK64OYnI$HLpToky8fnyq+wxr1O=-en!m5y813dho+ZG$qqHz(<_K2t{|779{R)$FsLE zoT>j*SL#k{>wzaHmh_d_RNX3&My`x6V8AMtB`fChsurl*&;Rr5oJRo49M;?3!Ka@o zMw~ud1ogiMamF{PwkwWxR-X(!(xW28(L}>>&}d)Ehlg9euf21GZJ3%PeYRtc7CkOe z-*6I>4t8lYIR<0qB|{v+vJx1u8@uS-!$7z5-zn$sGy|lXS+>1>x*|M7mEAsTKImIR z+1K7@A4{!a+j`kLs9CbKn`ssWjh@>=ZUwQ$4uk!^KKP{qQ;q|4b(D3Yx=>YlZ_E#jbcL7oTlD}c~(otb*8TGKdJmxpu4*Lva}~u#5Os2TchZ)I8;7mrqQW$Rij}7 zV}859*USZ5=~piJ<$_s6q2AH7+nbiurOP!&O-@H|OU!>6x@>}Hc|@O6kDt~!G&d1f z+8xh%mjC-D`X)XB`Meg9mJ^0Pzx^gx7=4y7C#n-1g)ctac_|92S34VtImJ5noK+pZt)i4V zf+eUZPNHt)pa$#jwOx%UpKBt!=R=)5_0ky~w+`zJPHR_@wHdy3g)R3| zxNpet-&gU>v%pol(TkQL5y{uMAw}HSB(%=I2OCl6No>Afk+yhXvCzaL1cvdB#WfFy zL>?@g{FJvVav-c&@!POW)!#F9QK*(sYwF&rghwOkHnlWrb1L$x=}?R*)OdLnT9C7y zecRghhkG*&ZGPk;LN+3>!M-|(on04HMlgLx5#r6XHtsziz9oS=rL*1SY38x?j(|}c z_wyTH)qtZi9}OXpHnWkJgNmEKD8+WVDew2^rfYOWgmk&FRjwuFPtI0_2i#M-UXxfC zDb@lyk@*ZEsVRG#5H6ST3gOK$^KOf**137M`@g>v+>KIH1Sw3~r7G=DowV+3WM#Xe z*U=wztFi`o825^cFk0^T(WVP>^QJBN`0%B=#Jz<1I@GJcNcqOZ(#VTa&rjzp1Z^Hs zpS=H-5viaP!M2JhDLT_-S$#=(U$^Rkt=`2a@Rvi^!mlQV5Q;m^KB&r<=r3GJT~l@u zx{oY4yPO!;an{@DU%w^_Z?%4_N+YQ`KlTBb*LC#lL#wL|`9bRm^gJ>hp5LdjCV_o66r-I-v$tM#Ij&7HGH_C%!+B9o zYTBjw7T*;-*M^=w@$@;e|H0h1pVw(oMtbt)qYj8kh_%swq6gE-^7c*l^R!K02hX5k zk#m9u`NYNlKkNT=d)_Hj%$O|FQS!-j@+7rA|J>NTgl(FdnxY2HBuy0^)FX&k#1_lz z&tdvWRE=}&Va)aTyt=Aj;TZzbSG%=*^E+E|E44bn*GS`D_VwdQ9IBREe)PxYewqF* z27b5#B;+!C$h1~WT$ZpXe>4h@gyez(*B1#|&W~717K;p_I8v=EooI0J<6ti?ZYN#gC@Q3^fVx{PM9%v=F zPv~G=tw;y4AYN*os|W|MS@93Z=HI4p@Yg-A#)BmS8jKKyZB&kEmr8CjyHCnj5G0#T zDGs;9!{%Q^&h5<(4~_RJ<`Y@sBkiWg*W>P)KB+qq=3q~KWpSk0qbwBk0v5U6hxl8@ zioaRH6Kpxp?Dna8|36QlG|2GKj{`Y&wX>?l+?8(sK=AoV?q_XwD@2FePIoR5w4XCo z){e@?l|~hqBn&J zZoBW@WpeD8`ATiTx_o<6eRRJDkVh$UxhY3IF##UiTF`??z{V<_T1s?=SNvb z@5vUSi~AIpt5&VF?t}ghBs?;FOjVp0gIN&@ms0^Ml$7d9`HIpascVih-^-@F6-o=!c%wAM zmsO7bHL=hHH}Jj=;?SH5Uy$o(1nf)-XnnvJr)7kR)j=QN-%O7hS*&E;>HYQT)%4-N zd-rfw`E2h*rl{Y=zOm*em_`7nM5b3i?uU4!t&4KV&EQa_@8%mVpI0y9pX2U!mkkC&1dSfEb4oJ0$CFHwL3)!oqf@&B!7R`9!1NEMK7nf#N3KR_`v+&w)!5V=LaMx{$ zR9n5YRv?q%*qANSgXK?i{EE&xDZ@SoX3+1ZzkGjp_(bW+6RKwLMajBtN!_1@@`g-F z!?#e?J&IVZ)%iK!yo1OZBIKSXf4CC>{n`0OhJNp<288k)!BI**@bL~$<>f`n5w(G` zO+Ke4&~Tt3IUe}N9P3;cjWp-g#RQwW3?0_koLFN@!C zAQ%vb`F%W4S!am$55+VtW;8@`ZB{aruoFQzq$LI`H58I|gmn-_Y6v1@oPftGgH7>V zG2!+0A8T4%!3PAPr|m$U&|?1gD&Kk}znXfR2px_8QO*#mA}Zg;!eYtx`KN0DW4gl2H^ z%gowWEl=m%-GWw88{YeyW)=5BFiT7+wY(kDsuHhP`D82rvdvK%Wlj+8qYk|hEj3d3 z>TSm6Ab!?M&jB%ih=OrQ+4~ND+;GL^umd$Ys~sXAwY?QKeE#txyM9=~Q_2{vCU_h+ z{5aD%9Dq2OgRs+oS=OiYOnga-gxUA@?|KwhI~1~j#oSdEp1!9jT!s-%`C z={NkmZ|>5raxC#rQGIu?sDql50<{3^*d#6HtNfj!{7w8awqvA-tDfKSCxR$kOOYGl z%m)EP*BazIaeq$V$8J$VYhn=#Z!`x)wCJZBayzt`zB`6D6xNyI1kTTJh7>mhJ?OU6 zv?}lG0`(vwk9#1z$}D}?H2v?Z_jMTX;*A6YLiFGi;s5F-$R!e25t_-RvV%n7CC>9A z%9Hgn^^NC&x~~n4es5+nY-&R=YZS#jWy~H$_Bd4YD3t$OF+fd;!_i-r$WlrCXne-p z?A>rDPO2hAUTRgmk(k+RpmvBNLdFkL@uF3yjCY2VyNxl?53J&1{K5h7E~2p9#oT73 ztn*tamAL;a*X)t!TEysAJC@b(gH0zdk*7#&{dJC*jeZc*S+RvZ;f5IRISm0Iv7ZA9FBBa8xYSlYER#9k;{)9#R0Fwjbc}u!FxTAjl5@WdIyIHGDf=j+tsljO}`jImN}edaq*u zM3t0v{Y)u0%9v~Vm~g78^WpLX@ngr7b?5m1&C*Omlp11fz`R(#7; z_`pFW;u>uw3_n6Aq%abv2cV?oEt2`%NpXZ#%dE(e*613i0|CWEcZy3_K;1EQ;_zE zdl-<@87iL=8c#X^#ENl%3Xl00!auHPT(*ZI$5K{gHSmuU&{_beXPrUzQb%ciN9B_b zw~QUVpLDF{vh(?rgD=J%2KP zS&}*)Lr?~}RQi7|CmJLR0k8?OTMqdg%w4h|jsehKcfxZpd1T_MtW#K$BYhk|NcK;) zaMAJ4s>Ei^T96Nzdg94~ETWKFnxhCAaF-~A;81=a_O$4vRuYAHxlAQd3Oo-$`)%s^ zdJ9qlRC*3b8ehji>!~dq_#*#S0SFidQX96;CT|4%?(%8dI-6s9?pAl6Uc1AWBnb{v zu9*W6B}RBRI~+4R@6!NU^iL4Mimu~j5ljXCaqnCH*Di9_v7|F$K)wNpS)s^%z=Hm~ z2Yg^C0=0tYC!OfGn-Eb8+9plZEH z4<6IpFQ>-z{yKhqHUx!W%B=vEI20*|!_FVEigO`HsvjQld?Yg6>3}2yyZ~|>Wl<&n$yp0_D7zs5zh# zp&^GCBIGtD7Z@TlJt+&?0!U32c;nFu=`s<9&8ISUk!Desn% zi@>8f4HzuG5mt|AqsaH*`Hz)C4^X~`DffXG1SSInI2D@dmG-7JOkmTySp}k8Qz`Ju z1JmZJM=kObdBuUg&-`vHC!cHGIXugh1uy_9Wcc3u>UV=V16Qg&lK^uZ3};sA!WJet zM5%o?E2LA@&Rk532xultt^?(GIP%STfWknFFnwoq8!VoUOV-U*T zm>@|pEMjdxu!2!Kf0@|LR0_BX5XFkMF%=#IoPPK#EdZtW*ZZEIl54_69!3ce{)nZJ z1p@*Psm}$5S&DkdI_aPUdig8@P(=4!j=R}d^Zu*jGWpjYT`63@qEiv~viwoHzl5E6 zIE;ZDVM^~Ow)6#g4g~?c)-UoX4_zyP74=P8@14(2Nt-h~znb5?N51!OfB1V-;PY9f zw^+iydj9_`(q#oOXCT)@P@)X}MZb^c@J}+O!~g>Alo$~U{{1eGBLmx{z+`_3H+d1k zkHRR1e<`5n1v!CtvN9#EI~itn&|fO|OnUcCGhj)o5`)=yw9+5%`KZ$J@r~3+clHnU zO$;SZhgJsyP*}uU=4lKEAixk?VM=RrTyDXfAsbKn{jvocY+?vw>vz0uM|N^9KJGqY*rx2{P{r8c^z`wcrYdk zKZ#^?@V2%wGe=~%nWBR=H82Kg-0$VoE~LWT`w2t1g6#RwT(Q1k`o*>K7G+NzvLr`& z6!s5@V~qZj65%Q$`gvHNVLx2?kDv}_4ewq`~)I3y4`{b?32 zsrzvhxN*FX@~y7++YfS<=J{IQwd0WE@6_J|_8$we1$Ap4Ipo;s;QdK~rTpKeN3%sA z<9IJ*hQysF&MUAlO20=FX1~rVtl56<11eD!pBI`fKK(cutyEC?&tdkH!V2>YGvk9E zze73T`FjO)o>DJx%GvwajTRzUr5;461MbIq>i{Gaj*h;QoB4A7?FJL=g#~$GHpJ_} zy$?SR*#VwsrsDkw@Akg9|HA|Zcgrg|fdMnBd%)$|xtmAxcQPjuK27M!aAiq>lH_lt zK=j`1U*zZE@ys}C*J@;Kjq>3`amUvVNh+}bKths?<+*BPJu?|En}=)6nfVP2B?ABg zLQuDMfvf-NAhZZ>{5yyS0HR25Wd)hiX;&r4WazKwV1X!(vk8~X0tz7a8;bD=_ZyAH zgaifBfW}3@Dj-5_^yceVPF1`Md%`#zLnvx732GTsK1WlZW$59>Z~(s>!B5WqgPXTa z-i5rls=ocJ?ZZRJ(BqBgGJvU`q?a-`|C-;M;q#+^3jc7J7bOi;q#_z$kLR~#@ghVF z8MoBVH>(hw{u&h71zi;K_yRRROaOD&m2Vhh0U&EGNACc@s_0RcrodI(C}NeJo1myd z8WD!p27z-GU+jIsKew;N2G9 zQykR5i<$*4I0ym0u3h>Atu^1PJACZq&14x$8cmUjSB=M+|mJvdUPak7wWLTL78|-c64OkLm|O1)Qeua zAvI*r?j_Fxy3t~SmRzE*3;Gf{%o__6B#I|KPhOao4ix9WZAMpoTohU-!9}t>B0AUZ z^Hlbs3~Om=v^JOIcp*P?rR1`UhB3%%e|r^b&|T_Z7yvSnW|5yCoz(81r@Y^7UqqRl ze{>W4_T`D2wVBI@vrupxt_6siD=rA4eDL?Ru6oBG>f8kv+wU@di=EG1pMMbw!wPuY zU%xDem;25Q^KReVre*_M(Di83i{ciXL*k^+*LRpK8t=LA5r0O$J%4pTp20Gf)x!^M zUoW=9Z-#lvil4lxaUUD#%! z2id9M@4a9mh9{y<{H&b6no@Ir;nEp1``tg@w<~7O{LIro?*aTO|0!ze zhqg=$$7?k_oP;G+oC)y}h{9w^J5ix><5!_9T4knhBw=IY$pB(l$m3XOUWkI-*i&T}G#W;)I z+~=PE{LpRV%Wc6ob&d+XIQ-nWqO<0vUQGUrqszvXz0)@h&Iyg2fSXkHD>NBh%pbW< zetW4+f+|)e^fKz;nX6-MO=c!jU^Js%2+w&T&JXR&2cM}~(7k1)9u7tqgh<{XIw04L z!TM~Fm@kQG{W{R%MbH_+5>h=Gj4UdlI|Ka1Gc0M6!K8ii;S}+#GzXvWmNYXPmWcMlFl3M+)LC~9 z`4i!eJWGPPOwS4)yHg@k!@ZC(=7>rZWZ9k*qv;~9OI+c<%8 zf3WVtN$<5gTdZ1w6*)}#>K`srcHgB@?RcesIHy>Haj<+EtFwRrLi8Ae_eX&-|JpCx z1S#jdUS>d!@|tsOCmNtx+76QMA|YBeVeBu>IQ`rVKH#tRYisa~n!~)Il|CyP*`5reA7%6Xd+0iuPdNseS$D z__hBep)n*_W?cI_qg{%K;}X-WjzqVOQtl3zq{)vk@*Mm^gf9^LQT_Z=$K4QwFWXTS zKAWqWVf8AN47~4Il7C*oQD|$7B0Ba%(1~q*-{n42e9SP<4M7$4Es63${EJ0rP>|=? z4#;T+U2hTxJG~7?v14=XqmV--v_1 z;ks(^lb8Y9U{S(lp!{_TGOPc&VuRp+U&Y@bUlZZu-O=Wx+z$>B+>OHY5h^yZV7@Fk*$0kR7gV3kaTz2 zksmAaD^+vsaXE)0asr!kf|qiL&7$)}h&~Ci#em9jiLC%|&tc&Woam``kQNs5jD#HG z3YZL?*fNAC;b0dShz&6WqU*#P67pufz`hbtSc%9^yP(7XZHa*Vk?nhmB>J~ra8DqU zwIRACCS=0(PaEZ%raVw24*4C2@F;=I5JZBoU_CLRU7W~?_A-xA_%;y{@Gy!-KyHvO zYjHpq#E{>K(0$_qFG$EoTmh|i&}nSgXq4ZL0Lm^y^d1R%aZq||tPryl5)1?l zI?!*hWsh(eKN_fliMdO-7*mPiad^IGfq0DCcSPu;{(x^Z%#CKK4kBJE6JKTMJD z=ukhrSNILEFA4CYhw^Z4r)ik?v^-7I%lv9CIymTiGA4}$(&0eg6EGwOsOKiQorcM^ z)Bf%*xK6^Xv*2N57u8>wvfU!}Q0N31)29!%p&|YeYQX(rc1++A7PG@Zd%X~Ex>X%4 zbh?~`+2Dh1d5g52y3$#7MR)>4A)#NB0A)I8F$ptGs>L42-gm&sa|bi(BO>X*X9Bq@knx5#9IPpjt)G`0cq2rVYucHCSsQbhXG(R z2{VQZVTeI}I9$m0K3~B+SQrbw%|c0diyWRu&EcR|NT?zrCV&X+Vi6glU{x$Mm;{8G z0tNIyKh`x08DrZ>_;U&Qg$}zL4t(UG{Yhc!c)0h?00#o{b|iqxZm_CrxOCuJGmjf= zT5Lpv{H_vQoD(I6fluRnyBO8M{Egg~qMA(DrfJQ<(JSrASE^q(UKj`SxUQb$7!z#t z-cFQD=gla-lwFTf@^4HgJZJJ$)9b3MZ|1JHGclLgO;H^5Mf+QSOkwg2kQoQs7mn=q za%*Rzev&afn%%3U=GvRhW4J5iOMWUhc|L*$Y7!=!3?dIeMj2>NBH|Gd_(KQMnOsaU zi3s-=9A}`73NZG6d?%|hgDl8)JcQ@mIVBB#`}=PA2jWWPQ3E>UIRmqdMd)vZ1&rUj zCR%b35KyK?>2ctDr2A^wUIwN>Jp;AJL`1+Dc2}xFR~qB+HJxk-@^&NQ4MVuqO^4*K zHiLc-H!;A0y>Gd#gvH1V*ZhOEW*M~RMz$6-w_2H9(ma;hui|1v1f9m-0>qr>8JIa5 z{C{9QENTnecI$Do)$uT;)s$5%@+ls@iADTNbZ>7028eJ!Cc20%_!sMDgoR+lFdcY! zBOczxMu#4|{Kne-zl63k1?bq}d)F!w_Sb`nH29P^rh^ICakxPjJ{Nua-En>{K8XxV zF-^@woYulZI#LdProjW4j6fl92t6Z<~OIEcHyTTbXVh2vWFNKN~1H^t<3?)+{lHMsTU zbm|jd=n4lNum&o+fePXys9{038CRPO+J5*^JeW`y+-<>Tl!Sx8CJ{rXc^fgo^^Edq zte_(n)lBC-s+Tt|p}*4vwD|~fbl~IuyBk-KVGE+a{@iV82mQWnqD=&c(BP~in5Q(- z{a+6wJnx_+)c+j8U=KQlbKqZ?n9p>0e0Y!49v4a)${>z|A_?dn8q$}Tc(T-A=t!T% zKu>C{dlnrY#f&A9FiW(d!Ux^OR)88SM3o=_uL#gGh5aVq3M7=#^xI z-~sxV6xa?2xxxoir6I;h$T|EOO+MHUc9imEP&|1k?8(rxE?3=@`lHR^9jy94r``AM zJTKltV3IwJ7@&6oQ14wQH5Eh)2Y%!)yoHSVMeEd~Lt7ce>ooY!q0?zRXfV?+jgw>; z2E1dY`QZrc#$g*%iB`j(BZC31%R-@F=YV;Bt zb=JjAzUOLc&*k2N9ofi?Q`fSSE0v><8eyF(3eo?t!`~Z1G)YVw(a;_*!ZZr3L+Z@? z42of4njK2euO)1(CK``~=KLVnHAL_0&65pDjhU%b^6SBNEn_t$$a*L zgV~|M9{F>%waHokbm7ee)HV~HCU}|$BmTp|v|!;q9Lygc#XSZ1#ui7YsK*BD(`3BgLhFtw5n2Hq~WBPDz7d%CY4N71JvG8Ux`qf(f z?*|FN40y*(>J=8EgMb)epjVlQ4jeMwl)^X%`6X3*a5@w8Ph67(le894=L_ZmWY;;! z7BZrf(9Wd8n4(}OCSsfZIyCKlutG{a9%bE)S!D}o-3hQE2(nbv_wcBAKCXX~7h;?2 z!)2qZSj~7kuuDMCSuM_f68wils1#tDambcd%oYuP_i?}&4&TD#XAr#v*962=@hv#y zKLR2=4D3RKf2Xa#u?F5h1pX1w$S|-YPd80Q2hjYS>8QUXq!R-a&cgh~3Wfu`w@D7D z_x;nVAv|vy!J{m{i2j)#{KLdNpX!Gzst|Oz~_!DI`H2nAm{>^)(^Lg##3tU@jeS4i_;XKqIepJZXlWW&pl; z*Dw>H?-wNJ8q{j~>=`Ui*?BwsI|Tb2dYTB> zKte_=n1`5Ra`-Y6pVBZJ1Vj|c&xi@l8T%da{x|kJq=>nyk#k?4D}OPk8Fx+V&wpS| zJa}x3u`S})@XSq<=zRV1Umapt&&R$hJ}~PLI66IU_RK%%7twi!S0e~ z=={_tw8M{x!25q`d%IiTzZ+lU zrt^VCNT#5{ANNfm``k%p0K$;eC6^N6)bm|6ierw{3E^~0MzOoq=TjK`earYIgE$>6!e$B1em{CN$5?{EWh+rS9G=2?EZdCKc<_-7M)(3k;Kx_^0rp z;c~Z42{s6Cccj?kMYyD@C*D9Lwc}Q1psa)Ti|pznwevh=QiOJt#KDUhu(E@P1#&R| zb3Tjq6>kSV`}6OWAy>{?Asj8zN1XAQ^(QW0Jui^a-6`2Q)F^jUj?16zvNN||K&V~y zM)@HQt-r$a8-ssDg2T93?VmoBUwJ`MvbtH~8FS^De~6DITr!vd7ISmm9k?1~y{mG` zy;F54FW}cLOKXYQCY!4>myJQi?m>As%5_}pUjiD|TA>JH_|CGZ>4ieWOU};-AwNB4 zRg-cwT(v^W!^C0;^%JMAC53h6tdQ zLp_+akD|i{%f4X41ov49EOxSy|8PskUT&ZjH+$vjjA6dNJ2tCWHD@yyc0dSL@O(KK zLlPJj`qd!~_r+37SU8xGJ`j7yLXJn4l)0#YNvu>TR*$NKq*-2)j8Kr?)*p}_Vp0iT zGwsbbER_vgP>Gx#;VQ;{34;bp<)z^SE!8UssZz|j*-Uf_)|!X>q*_C7NPovs?h#q= z3vEk<;eUFa0%7zooa#~&^?-IJNHYp7e>tfJ?z0BrC5@ocDD>B#G#>wwAF7G( zmR@No#%mT?n~{9w9k5E0Ysz`YAz7<6D_Oy8-oh`U8{R-fUVRmZoV@el4CB_QJUv!+ zs|kYiC4+Qm^>QgmqShfeklW8-k;sBl!_T`O4A<3KL7v6lpOc%?)hm4$Z}pE;n(wsL zNQb>8nu|+e^xOC@b+B#J)a+j>8}jeFg8QO6!)lVuQoN!}Fhe+SvIwJQ_ucDW8-3fl zT(w!>*qT?P$Ki(!*WrZ!Bn^n%uyZ^umvH4XVNg=;V^zqCl5p85UG1CobuQzB-os#x zmF?@S!W4&Kq}IhA^$+94hxiD3XVb*Y57`x;&D}hIn?0!Z@1?o2w}SlNHJI^l7eSGO zj-q!QES02M1db5_bb*gz&aQ8R%c?~dRgXshtCvpr<_{4+snhf8tD@wD(A)5SHHkk%mZjlJL63d87oW4NHnu%e z-->^xYa8WSeaUHDIxi56PQ)Fq`(gSFhnaio@ghn-YP||a2z~Lh{SXr15B*mhESu1% zO}<;WYPiK@3V1RuOUs10V@M;*aC?LKIzUBxQDT>ob!GK)QF3m9nz}%C4aL0J%j7iB z(iCI$hg1?~Yj(tE5o!`sQ}Ha0?}&zN2Fwr({vB^Ww7q6gT4r0ArrHx{R@$%DKm<#s zF3NA~_dalEaD%4Z+xivV|UmU=)=oTAGD%Z8bD zTVBT(r5OfAXead<7mh=ojL-#>`5@O1sE4Ft%^^yl((n+iO`%Ur2ziZqEUtayyy4Qa z9-&)xGZy)9jV(CIgekgef|X?|h56-3O*W&e%}I0jWqZCdzoJ!t?6C!XhRj80$UL8t z89eQ~JJzAJBz7f3&|U(pvz~!cN4o2^v_g$}y5|?jCHWmv+l&4U^rBn_4_gI$D1Z6o znJFc4U;Una#-$H*yY`Sja&43lq4Gz$)qMG<%FwJ&+~wSL;9IZjpui$;gvaw#Jc+% zUFj0kbp4#rI#_roQ!p5kN~cEiaEVRSRBx!-r*b9R>{Q~-0B@BG`0UQ+e95&(Nvg2u zSs=#t-i;Q}&7(}n9oV_fBj!D@gdG^Xj~YQ1x8wPEI;pYxIj3k;5r4D8Db!ewnTy|b zdjdm(3{FX+CJdRxby7s>Cb}b7=B=!hq}*5*Gd&4Lcir249%rXUp_;l6^kqDiaOXFsw&lYC)1~fUsoS+oG^FRKQez59M1w)4={*y z>RfBS_a_R(((0-UL$}5n^5TgK0~9qf5LFIpJDRCM;^7I)S{2Zeq)e?!@DU#VGvZ>v zF{+k6NT-r_rUR9B=c?&bjuOBcc>R%yjDy}hEF$=wV5iWn%&0q{rLs099%qpTj?F5P zAc8c#DLO4%7v!_D1-M*#8{BBv zPI|HOvD?dAA#FFJ?C#5y{~(u~E5CRD;PD6kC9qhGc_hr~*zt#{!~X<^x7RXwHF(WR z#m-x3-0-HgiJMB=8$dv z+^pmKC={D}XXLi(SPA~s1DsPfaqO4ntCd0r>Dln&A;*~Cu|nf%a`{Shj<&0+A4I|UJ-bOebq{Gp4WHUDIA+&@cw%Mn<8+IsF8}# z{%cvtp9)JH(!zr3(p0lS(eR@$Vez(_mF%LHB*LcU*aU;{ypn+OaBjvTkavr4MFjMI z6y|9TZyZr~D>z1L@;zS2??6rPhUo54b!T1m_$c#xFv_v3EE!jdPOeTTHI6YZZ{+;0 zZ(M0>d}(D|SJsWW<8VxN;>Zn_!lg+n-^7UO81ibq!0Kcp%jHO#^M8&LBOF%D8qA2x zA^#QO*Q3D_BsA4lLF)U#`*vWpL;JFAGt>DDlxd&?5t&jn+V+Bg>JUhkz^`NKri*g6 z)Sd8Iom7Onv+qnEYbW4PQ^uF3P4=VBL|tW1z%7iXe6!uG`jN8aOh?=7>-jX_S*kC) z=6L(WxhsCbf0JwZOO$M-H{2!HoCP~$N==fe zO=0UvCSN?kq^97gu?)j_TesC#FPUgU>RrO+uSFH1&K03P{kFyFm%L24Psc6qzP{=> zMY%gC&{AbP1UrRoqV~I=BZ8HaK#ggc%1k$NiQW(%m6Sj^R|Nz{@qRruQ9}LzA0(ax zD^Dn{9GwQX(9c!c&-0*x(1aObYe1~-Q(I{pFW(`0d}XJ+sso5=2-$P z+LU>!lIc%U$i_j=6Ng23a3OC>5`l^rE=Ab`Dx?fa?+nK#YD+Y_{q5ufUDxG^Iac;u zAL-4JEtex6Z`m?qSNbPAvrjyY_PfmzPazJ6Kbkr#;3wAJ7oLg~Ah8`Dw0E>ovDZqbRE8*`OVN6yoCfj8dH zuOh?|)Kx2YP{J&`eYEhSEQu@R``} zxtR5OCXM+0?MZXlSC1TLo+P|Q{>pv)mN@^H{VO40UJ?wQqRjCxbdkNQDKGNLzG--X zzi||Fu4B%HxITJvjr?Y7+OaZ$ojQF|*6BnCbTRG5oMNLNM|XBwc5%1~F4>fo%F0=H zS=`E+jXL4DbSbcel_6!#7CSa6GcZ}DftKs=YmX+T-}S4Jeg6y}fbtCf@|7*;xrh`C zR2d*1U+g6CjXdoSq9zd}Jy8mAJTB+Ek3}bSE8it@@1CsEUDgYm{0=>#_rd2^Ke1zr z2MzbU_B7b=)iR>!$uV3{`QsHtXke{^a?qx`q<*q@v$4+!@LF--d zB~V?{B6CkEA^xdg;c>w`ni1%N%Qe^?AyWa`HsueTcZwWZ#mSGK+I%v(TC)02Zr?&CvD|! z@rO3Cv1F%DL(lwZtOti2mnv$b`ezCd)&c4lqMWQxZ$YCc-WC4Th@Lvfnv7YRiiw{7 z7WKOLYZK{9=cVX3XvF-p=(q2p-&seEev4+KV;1FNmNa9Qjbm1vVpdPae29tpcp+x3 zIObDr%=*2URlQuw4(#<*;pJOGuTDmP=AzH6RPd|ngZ1g)w6;Q(Ur23zur}evm}ii> z@t5kq(Hqac50~?6<8zYP_tH9ZjC0G%i)+pfwdhvfVdcE-)BCzGa0X_Ak{-%D)yW%3 zvb`#0US?$ces;)I|3IoOWPbC@M%Hp*3$JSb>D9RO~3T;%(1Kl1RzsFd@U14Lj*wEob^a zsC(FslwwDDcoNlHf*Oq-xJ|fph>wEH1!)r~T4WGv8}S%IImG5y$AfjTV7g9&(hf*R zpQ1$rWzq9-vphloC~Oa=$&~<`Y$}Lq|P1y-e3Mt;eQPw3%j)9uk zFO8j?G&cCiZI6JQc)Rp-{UrV)P1J-=u!L!bMkR1z4MN2&iP~nRssaTcsMbj}*)*A! z{V>0^?6aM)XaPxeY5#m84~n+kymqdcz|EhfzSL8os(pw31CZo zQpOJ11a}t^&u`A8#*->M>tSA6pW$Lbz3;O%v8k!7Z_Q$ zxhl!$JC8`SL0*sHhwWi;`qr-{!ACf*uaANZa=FBc zl1u>ckGDaj_GF_l$_{II#r}M;LqQ`=u}Xu*aweI`19AVoxTx%W-Qhqhwa9s|_LLd_ za;{qHXu~W)u+@gM z4}G1NH>i;rKJwDlILs-2!D{I8;>qdcKS9NsX$D*CGxr196jptWjZ}pPb~dAHt0bn! zMxZ%( zHEW|)T3{v;FR@srH`YJn7`{}<9~dXH?y*=Ve$M;GC9j~WQ0uIfeI**nEQNdn?vVCU zywM(E*!WiGFAHSJm$H#qE_?02lgGX#zDD{Mx;f*c3cCl?x0`zXER05I_C_1r6=6vA zeaAfUa+Z%kX~pHB>RXL@T7hsQp{*Y!TE6~zSCRgV)soH8LtU&9Aqn}#ql$%@8Tb3u+`03$6CE09c z>&LI$#-uc(+7hP2>#ugqpY}W4tN!osKC8Z{$rBIXCLaImxBo6DR{LE#Sgw;T{g{!N zOi`-sTq@9c*STC`A@^vd%~YXICb& z#P>*I$o(s_u2VvDJiIk=sP^&q=Oyk0Ov~RgJLS^KZi_RYBU@}0g~m7fIqm0H7EH7Y z>(It;%7L!!_lZBj$5Y}d&L(yDbn^F|b`kHD+TDAAG2yb#I;r_CcwOAm>}tUne~ibZ zf@J6cL}pIX)Us3+$r8VwQR1lIoE9TV)i}9<3GY&p?;wKWetOl(;ko?SMiRwKAi|vU ziEXi+G$2mo1FJM$ms@8P@=((#4Gvr0aj5UuQta)nHFA^|eqmZ$ky6pWrmJ__3~osV z35jSa7^yBG!x))8{kVLUh3l)oEYT?|i^q^IaAN_pj!$d(a^v1JTQ&HiRGc{!RhqGn z&B(RIE+G%LTc?JWapzY;e$BgxXRnb3ZO--`s4p9c zu@GAyt~2W&UxaH##UjR*$#Z`x5x_d>s+>wFxGJrrPU{1WS`Edu1$LiW5SX1lXlK z=3h4;LT5si)nF2u4?w1S6q(bx0$LFJk#r7S(2<>?wA0NBGj5ZcWP_ZZ<58*Q=CG;} zRj=;@WoC6?A=ii=soD*69P@bQcLG)8Nl2lZKJ-8po2o%%WlB`i;qRDK8R6>`0!K;Q z+BO&dfmV{?Y6&wi?N+RL>G0h6u>2JociDu%5WKKwF6j4FEqo5(eJPgZe&pup%rEk` zRGF|Vx`p?aw9syQ!8~-?;IYUJi090I;vxFIk|TUP7Je{V%fS5Lzl}UeOQ9A~AG6?V zaG$UhFjnt36|UG)5**R-VE*Y9^5@;Q++UhACfBd))4$Cop}>2=(o#OgGWQ<89{qMs`pX%Bnx?VjWd|EBZsq@dr&OXvQM#@xgVNV&cSXTJJ z=)w~+pY=!I{?0&rAe5x61sa=KpE=x0td`(~LYerN$Pe?X2jmtJWXo6Z&i~vmdvr^D zPulQGp=Ey1<9}pvcCGSsYOrpwZ^(RX4p72+Qr4`6;0l=IzMdCs-MHUKBJd*#%$$V1 zVAKyg`y=a%D38J=$*h!EY$l0kPU>kf)X#J{a22EN_Id>Q>hOa{`-dIa6qykGAt{y4 zf+d4sInhawejQJL)g`vCaSbrZ(o*qx*)6^KdGNGN+4cSgMe)w2ew~FyRPx6qQCAv& z(QxXgFtESd;|UuR#lRmExchOzj}>Ho9dMl`wlzSilv1AUdB-U_?6imU&zZcZdrXak)XT4wX*JzeHU-+o8ja- z@bw@&U7Y$}3xb8RY7qB>GbLwOaXLM3pdwh=Ss$*LTIO64PUtB?DcWdXR7i{ zk|E`4x2B@uM!QfYK`_<9LgQp!2IBX(?dKTBa1FALIX#Z_K$RkQ?NdWv@5&yLdNBUf?%2&oFvm);oP9b~2cN;A2c%KXvob~Xcke}n8GYTi56h>p z3xPuTxO@jg_$>Ig_-FX}1h{-$K^a>H-BeajSZy!dg4#{RD%oc>EmN(sP%4pouayEz zGQ`p?zcjIy2g+34n*Diz_TgLwjb}AJ_%PdQ{j=)}FWd&IeOof&?d>YSSeX`lu_wWL zphO}payl-4CHS}`F{=G#P;a9xMSEaYSgL%uus&k4`NU_B5A%7^XP#X>{_tC$SnkgB zo59QXpS!Am5sqrfe{bxqmomf*(HGxG)i_bZb4?byUBUR>*%&+$V3Zo}FCgcb60>ms z2KVZ@E05bhSKzU4-*|p`rqm(n2G`o+ZC+@C@ zjk0^lntd$MNN_)=Tp;Z5c8!&GC*HzAPh_VQt;r;U#J@!hUNtl5Go>T68^RTRKO{qi z!_M5uW#{250E*)7f0KPkecwyIXSf{UF;&%rtz(Cl_q@j4{0WNg3a3^!U&o0 zspT4^k?Q!6`Wc5E3Noy1>BT9jU(PqsN6D)$zM*{m^Nm8*Usq5KMQBg zb^qOxeSJGWhCxZ`8`9wXx5>PWG}7NSqsy|)5C?P&$j`=qkM{nWqZ1zk%P`+U$@ z1MeEFG+3zPcrXm9?tSL(LW{joUX%q=en;XcMQm=W9;FnMs)#mzQ2zzLMB)>~|+w{rB9>+9g@5 zlMkdW@42>({&m9`>>Req$^5zX117)z@_~Tdo`fVt?l-;O8ZHTPEiph26JHolM`V~I zjQWD!pXDCzKF$Qc&lu|#M8u!2M(zu-5PP%0dyv&hE{?|Zkf^w;GSYukhHkdoZqCQo zxAiFf-Fr|V8NA1Jd1cf(bWG}DX+(yT(FU!~#$@Od-a_@ym$)ob?GP=r@mYMDrN&+% z$O2;$kyG;A4RKJo+e^GH;htb^-7AA&63im7J;HB0QNiT!k%ghg=|5kYr$u^Y`lhbO zBM<0jI_vq)8jC-yl?i-#xC6p3U{dsk{?hn1lXFRQ;!D{hw8LJ{n3AgZiaDi$%X6pV z1saOh5r+)EOMNdd>yN>w_LOM6LYzEZ4lR2)y^?6CK<5*;#Y(u}P=j6fGMwp#w$Ekz z)vvu2Dkh76F|t0t@T1n0sq##WHkMjS$oTz=O&7KsO%qEUT7RsEmAKO_`+NBsmv6}Q z`^u|md1>bbu4N8WPMeh>aCE|LgjSsBjt^^On_(K)GOd%a3U5BY+irB}*;jig&4gIo zT*E0yKd6}VhA#j5OL*_zSImWDNV*VovI7i^2g9fA2XIMX7})f^N67wtJFt#?6WZ|L23$Zp=(y>BZ@^T|>+;(D6|j z>GeC;WOltT8z>hTCLO#kmuPdGeU!0pl&5e^AcKt9_0pphMU2F${(%=vq1_~FQOmMS zEnfd1hSY82&{C2#dH~w`Xu{25qr{&>S5R&0GtOGf(vFUn3$x8Im&v>oJGG2fUh76? za<~O)eTq3x|8pGD|J4f-J4}x+=-&T(u}BxMAQ+MabX5|hVl-TFMN$69SNIb7ze<9B z?Ci&PXbdqvMfuNseI~_3Ad1Z~(@=#Nv-ky+@qws!EE{E_GVN?ay6vwRh+({B($*Wdw6}ZI84SumMnS`bsbxn`ZGatoe9%DnO9xx4wB!Ju+ih) zS$Viy0cVnI&Q>cFC9POU5LC-N-GZkn!dh1Kj;aztvBk+F^|FKBlrrE5Je6A*WDd$Z zWgJv0!%G7Qzr(*WxxPWoELWBITsdfx!k>FKe%UNw!d!hws3f_mSFGY_3A!Ac7e!ls z@;%AQ!(cNf^p29;_cd#^tg`uU3lL|y+cyg4pXf=-1R|n{VDW0=%!K8lJVBtxG=&XO zw>4ve>~cj%7&+;d{B)2IMP`W4R^8i7&~w)n+seq%jmi*&r;MA#Gbw7`vprnV-0L;C z9NkItc1i+VOkJl}F)HvRyZRJu^FXaAgwV~*#kYrS# z$h;}lpd&EfqQV+x#_H8#jUNhPWhkwj6l@iJkXLol>`i7~xAa;II#D9^(5^lZd}8U+ z*QM+7l>$e;4_y78gX&uto3%0OXhFGJ1tTJRfBJ=C^Ukw_WyZLwun-~s#e5sc9KnTZ zq$m_5G`Sy$svOk&MgnxZ7WaMb9JKMM39(e!RWS8j!o)L(PD;1hGyu}v`J8ypa`cHAuS)UL|aw>@o zQGjX@GLVKYn7E-6f=)zphhi2)#UTc#r$4;!I&DWnfJaQ84B6Mr$x3(7zMLp>L=$>f zRk~0?wBqP%{msQ(5q1-_iaB@~s|VJ+vxNL1eAJnU%}a%RJR3TEN*<(>Sd=OSWOWW6 zn`MEnyvhFlI->UX2&p)cnK4KnvR13)dn_5UC^4zu%cVAB^TJ1*r3Z&BglnHZN=wSb zPI7Ye;xe>mIC1OeJ05>>tV5?)W?1sBg5R0~JlwoG9;WipBrq1U@xM9!OV2}yIEhKXT; zWV#`(3=Efy=F)w3=>qr%M}Oc^o=d1L66P%qxWQR!>FcCyv;f4%LfA7S;|UGZL5H9N!8RnIg^BLiA!}?4 zlOo`{bO?_SYiOELPAg1aOAeu`Ksam2*D_b`eAkeUCWYGM7!e1|&frKP(X3>l* zRJ;C4f7Ivc8@>KaoXS@p$xr@b&G7$BqFduA?x(DKV zxvoT&wRyaauVjk<3rIgN+e`;EnTLhPK|~UY7aaG+nrMfB0+@(R0?M*#->@pUfP>7& z79GgD+RG(ibTQWPuEhXvBc(=&fo?lBOh$>jwtn&a@rnGHan)CYE|fZXQiZo&lTTfo4L%7K4|Ch4kxTHR;e%Qe0@ZJ;VUM zLKi=+AEY2jJu7e~@o0ryE+~MIHj;>SW+Qhv0#iQX2RfxsDuA=-m_b@1C{TZc0c?6x z@TQ7dbV?!}y=`i7v|6`G$K=M*6cgXbB|6Ig(m@Tz4yIP_^w9eDAar#{9j zGTBBeLo_L)QUrg>ppHwwJk7y0lNGo`P$IGPTz=V4Y+6+0zS|9$k9c5g7n6wf3BW5D z@xiVzV4|(fe)PC=`N@0CTJ1nxZ>5xRp@MYlY^(JHExp*TI1EY@bgUy7?Q;Gt3$sbO zaeV$3Yb8+~2PXbT?J{9EESn#13jATCuj2qN3wAC6>BOo%)6#ffAM8id>>~nxe6V?5 zSh!WDh>iJ%6%1lRE!8lWw1ONH1!3Av0?T*4LsK@Y(t)^?pPY0fI=Foc-ALqxnp;(d zO9D&L?Igeye=j0Kbe(|dG6j6OL|~ABdCP$QetgjY3w=b!aPgSxEzBEJp!28{Xb^Mk z*zIwCa1svtlc{Ze9H4nYcUmz&Y3PPlOg+}t;WFYM{f-G8)M~EY>*^~q*kXtWTyA!%z<&LPffl&HR4v;EbNLo*$gX*ohI&PS`{SDv6u{vmWGktK zFoZo#L~v;+E)D+F9=rdd;Bzc$o{eOZ1sqwTq;|n!7EGuQc!5K>nubF5XXoUE$izaf zV3E%mPrCjfx*34=c+NSY);K0&ih~*_B3f4;8vnsKFrfalpnDm_cu)hcyyee^fZ;-V zM5sUGv=$fV`>`Qjz8l>3ORs(A)W`p<44Kb9_H{*$=lC$8o>&O=^F5f0b}?AI^z{SM zj|kKJ=XZrd^AwmsDpR0_3GZSe7ntZhCRV0f*sxo~zgsM|TcW00s;gUOp<8aR8+YfJ zXUEgnOorc=!S^{Z&T22sH3(5d)w2(+#@oC!7F zi)^|Db|v>7b5O=~L+!hI!#N!X$Db!vJUe{n__yZESGUl-`ozgSw6iX};&-P%3k}}r zKc#=}Nmljk`0TZQboLzHhJ)B4p9I2X_BiS43Scr85yyTWRY8lhc(QXFJS~UQ63E7EB+V!HXNwXQNWdzVP63XV52wqnrKJByfexl&Ux>S@#t`92$uv9nGneb<3t9u zm4=Dhh7$RJz1*44=ao%h zbE+5I%5Cd$R>uz?p4$TB@jyErZS0L1!NDf#@TU)#CbG|;DaVCz(DQ78N%n#7G=wiH zH-v=w!bY!~o&jzal@Kcf&K>lL?&p({llCie4#cfn*lsZZJ9P=qXh4~8{kp6$uS(ZJ zs(L{~{LMfoyc9B_*(wPd5L_^yaR7Yj{%c+Z1c&S*dVS|K$A2A#EP@h^P|0_7!&!&E zvr!#1Wf9}a^S3C==<9*+(L(kgx{(8FR6E3T)sPfs!c$ho!UDB{YXY{ znqu^vI>%{=&fPlGM5uKJh(v$y@MHcjVWu@2Xp4ShLIg+B1!{~6MLy&mWVyT$=13#}(@fGwrfLS~w8J1KJ7*n5)Zse4G7|xr)93 ze8Z#Pt2PWWFcrjG8e~s*pRlYiwfP!q-lld1-V=Woi+DvwO%qV>8EE*)*I2U!loM8Z6+M<9b|V_u z5VPJ?{O;%K`m5$+7oQ4~zTImzwvD_@IZ*rY@rCL6!&YvGu{};-24Z4fJbQn~d*xp= zurK6|TZka94l~a}jE2lVw{ey7O(*QQRs5ztFRasbvGs!Hds1WK?@g`SpTAL*u|qoEf?0W=elKql1P`{J;V2OeQLeD`o4BU`u)a-cSpU&Ho>d))?dGQ z2h7Q-e%2%l?3kii&|fyOEc%I_AN;W2G;}x-6qYG?!vB^D1C)l#4<>?mxBHFcM1>{5 z(;QIbm6u7776OL20bMu6B(gwnn)N)xKxa7<9(+kOtsMuGZ_Xyzo9`UW*dyWAn{Tg9 zsh~gedfE;oq%2p?R<}#cGa6pR5hynOS4x-OY=N5SqR6JOTHZ(4|JJ5LW@^m+Mh<$H zCGhZR%@z*H*PSy`?YTYm*P@aDD<^KZWyk$gov6VX6|d#Bsm?r!t&*~u&|VHG)cN)} zLugJZuO+R*_rJZ5iWiOJTNSOPl!QMx)f%P!gGjlr5w7FYWvo(u2DmmlmWgFYP92zR z^0<4lzuH56O3B2((@Y;WFnQM_lr&Dgf9?5&=+`~f<6s4PBKOzE^5xSDPjnBZGif^L zL(kKs_WpU$dOM5LN@=Q9|_x(zdRt~71CmrRZQcD zil#7LS!H_?6l`QYOcfqyrI5`4l|sB3B4PHtQ;z6*8Gp_?aa{qBsEoJ{$fs8a+K4z= z2mq3a?g~(8;Z_Bk4Q!-B_DoVMKOpPEdSQKZ*gWRdjp|k%XQTG!Sm*1U&t^Fq#b1Wi zWaDYWTxTos(5Z*U(%FYy?Xrd2YSU)eajuR>R@>a1O`u!XzF6C3w-cPLbUi%0LK9SR zei9Ene8O+Ed-|Q}*Y!G)xZ3U&kPg-J4y5ky@D47q((?)RGo0*{6F#Bmd+O%&Vb+1q zZr^foH4PnpXPzgF1Cj%?4I;|)Eyo<4kVo}->fNa3+wvg<{+x98+>C*hC`DW0bAxjA%rJ0=2p&+zXhv$C?>FSdWLJ!}^WR)70lPj9#OW46e_k~Vb zqH>;I4MbT3rxZVkMU$2;rLGHE7v~cr6$);OyGScbjzolfe=2>{;^w@$q{_8ehd*;S zTS8d%HL3GUAFsN=-zR>`9NeMeQ@@$rgi8mh#J=<1+YR4H*_<1^W*m0hK1a9Bu4zZd zpSFld{`TlJW1%+LJnD(iM26s*-*e&DQg$T!Pm%&9ltNu<+aJKB4ZArVnaG^wxPx=# ztdVMSKIV{Wq1uTla!RF0&Q$76Nh;OmIFTroN;QW{l8{iT{r36({@JztwQJkG>%Q;T z>-l^<5*H|bP;il>k zLG>2}r1H|x(rpol>E!j=ecHUC_AUbyfpvGz54d}&L8x%c>MZVl1Iu%{7qR(^51Ho` z$L2pytlk1cUkYI=MPA^jO`t{|p}y%IO#wH~R9zQ>Eb(=UA(Jd^WWWeU5F>vADQ?Ft z7n8bhGH(u^mK(tjoAVgQWG)a3N0woS&E7N-IF^l&5{ zuF2>a@bJDkP*{b#$XRj4V?!+Uyx=LRHqq|au`Xsm*nwOa0n*2{UqIdp1~EBJV+cnU zW{66Ph$s=SjO)_WjzOT4yrLqIr5Nb~8vfMye@K^>D`5Mv@#1b>ApI?U%Sem2>Ijb4j5||3%?*?Kf!(_GMROc|0%@b@*IH$96;wYx+sG_gBi^CaE8>rLqczB ze*3EgXOtGDmy_>)M0!-ersW}hRH2FLGm1YOfd&#$n0fzx?O5Qn9UYq$>h#)c!8aEK+!&&VHF zHKkS+M;&*NA_m;}knauIeQkp_lZuU(yLkVTdN!-xD@Q46Yi-2m>OEE}-W~i+;Nz8% z8Z#C>O$vJ)?98?wph>G~&Z3jY7)G1z5Cg4R#7`_&Jys`o|I{qS%w0);8C+Wtv4LU3->ZnO*qrYIuM}F?~{nsO*xUmdEhL*5& zBPIK7h+SA4j zJn8L1qDqaTR6tlQ>Q7BCxMqRrEF`N3R5V|n3zR*CY*3A*n%wI`LUSDJAr@_XgRSub zohn&RA|7b+Qt45!r-ohlXM45o;}nEi_M#6mmx2WyYU8GQwp^kxJKyH&^6crQ02_MV zQC?n51voXIv;L>ELFSI0#+?&s78ibT4_bDojOq4Ab$4cW<7c_Plb0Sb*mOg#2_C}C zw!D3diSh(k#*1^ltk)HQUhfAlwt@5D;1@w+I@taH%XtDVsBAGq|3g8?rFhHnSqpIl zR6ifv@Qjt*!gUo((Bnxv^Tqj1XU{LykzL$4JX@rySaB)svS%0gFi&Np_Ii90YTy*W zLNPC^BG2QG{MJ|d8W{%>uv6a-IAI|zHYiF*^SbU=*@owuFj#IBZVr|6_dcw7l4maF z18H{mIIw%S@%xjyRXS{sw{Q>>*N^1$?OxwdUz9DIByRWA8=huqUj%L&W9?h)*DooE zyUUKE>tuIbdUC3#y^>`3i|bRuy>Cc}B5?GPaKqueCy&9$1nxOJaJpTu`#3;vGxr#h zOYvt{5Y7)?t@D{wR`X|iGi;z8Rr5m}!S7yBH-tFhLRx(EARD3K$#k0(ryy^-XF7BR zwP53=j|-*s)0jb7QaOS=ld--}V*n8^ zcM#&KiEiesY;T2Wqb1Uo_^RuZWVABy_S=)Bob!Z}Ov?m-4Uc;OiLZ_ayy?mH2sTtLVZ{r$&YsNr ze1N$j_^8lPr4+jdp9}GVIh27@$1YJbILF#d`EtY_xR;*keLV>b7ehoPP4U2Afn30? zfgC(rAq`M03sB+>IuczhJf$;*+@tf-w)4;nFj?lp6ybcT?d<=Z&r{sSeGet4#%V3-?Dbsg3KPvszLwT)*AwdUua zT!3y9CWEJSpEb};hWgl#ePG+hEauA{Zjk`jScr;Kl1-HWB`ole%=m+hhsVa)@5MP< z2{X}PVY%V-wf`2M?w2{aNXezpa~&Q8#kGJPM{u>bhAkyn1K}{@3MgkD_>Yv2{pM0u zDrcAkwI={Lo&bV?n}jvAD3wf^)yOalMAAi*s5ZrB>L1Bv-^TvvK*`9d@3|XW(TM>FUZ`$`m zuzIEDXddmNzFl69zqE#-o(8rzt1VEYM4I`Gh3(S2d+@TKCwH%a6_^NcGHidCd3pCF zH>yRF@)sO5#*OK^p2!4f5d1Qixsr$Ei-;6k<{-tNRiMcR{PrWpzzW)OML9AzD%$g@ zQSBu=cWclk371?MZ|YwEjmv?%lKR2gH;}&E$y!JRkYlHpS%VZ_BE?`y*m_%X5wgU*8xkk#M zObYnFZ@E8DmN|`yElu7jE#R=P6JpB_t){YT&#CdBc?;8E(IFXW1HnV3Uya@b?i+qV zLJb?y_r|0pH=D5Uh(KzR39uG$Gsbjj^WcFWQYT8J1-;;qv3Uas)iz}|x6hFrOkVJ{`C%bwSEEpsDygd`(B;XGR0>NqqB9Pkd-KuUK~Z~S~B zew->zp(;P~*a=-}<|vU_iI%-V;t4P*vTn=ESz$9ofKUBX%_ z+veE9IXU)7Z+sv}ZJx+h9-KGEsn>~IU` z^`$~3g<}C1T@%h3u+V;mWxH-yEl^oMJ3p?P^d62XVFkBvk26eH@So`a zKF!WH>w8@_g_`V`=jKd;>`N%`&Z>$WQ4rN`&d{0ocUo}kmgiFs9$Cldc?&-lcB-C2 zK)$SUd$beY9eZRTq5okXV9Xbsy`g#r1}X4oJGVJqj7D?hVMJA6rnd?Fg-SNvH z%(L!9e6F`dd-{Os^kx!VcCkjVm^%LT;nL#PF%@|GSH4Yyxbx^w{g6{rc*4_1?IhE7 z415$@eSeaBZ13XZ^{*=Y#VOD!(UbLa_nI1>b|&*brM$1UK_R6={(Ozr}o}Fnh$n9b0Dh(w9S)w!jox`FP*gsI-iN8e?snP>ZDqH($IajeBje6EP44{ z+PhClo4dYmep0DiN*3-bdK&s&)+}|b`g=q<*sjIr!WCA07uOx{uXGY%Q^QRfn^pA( z9;SnB@&UthlHP>6-G&_B*ozMNxz0kCUz>E;CdYIhJM!sd2O>rB)w2B4v=6&ru=6Uj z>uE{~E4K!|8iEfPgVo^kzM>479SvLk}EEe_S3uAz4FD2jb+@xdc1d#u)vu3UF9 zWBNEfFM&bL;pI7VGobrZS4NkO6~6L8sd67yHx8$of|Gd1Q(ZS|7+^mdq zbwyrQJm}~tz_0_@8vhVs*K$Z`xv|2@#)2&;%Mc~K=`|nXY`;YAKJ0lUli8f<1fX{x zU-$O=PJ5J`Xz)Xn+RpS9aF1+0G^2Ae=-ebhw?!lnsgf5V$c>5TX61wJ{XhA)eAAV< zZ-NBpQ~;SrFCUWuO{N1Z49)EWOSh-4F?Vlr?yN#w*4=8;SdTJ2aNm}99nSa5qF*^p z6@dRTUq9)QijFNpao^;53X)g``!KF%nRG!Y}@Zmn61L} z&9^78$a#n;UDn2${>zQN`tM&V+)&S;y=cTBdvvg{;{;|f>CgCo;4a%^cZ(0-JHIyR zlFDvgfAuu^;eL9<#-BHLk{ZAN@lim%1LF*^AaS2*I_CQ)Mv>jCsH<&&quIG19Ixk4 z|HWOCo|eok_1kVull-SB)oha z{8`@ThmNP{oc-6;L-CvDa{|lL|4LRGH68|7WZ9j~u~?Y6y4!2O&eE*9#aQ9Ui|4WZ z?qPmEXP6looZYa-E z9vher&o4|Gc;7yfvU9WQ?M|nO_2j8X+4<;!hj&chcSOCP`4}{z@+;Cw`tu}XM%7T5 zF(6HUMK3m|3)!!5U0AP&dXv~ZRN!2X#`hLB7&;nb7~=ROo?m&;#!+nP6ZQRgYQuiuL+}Nva;iB+B{VI9!{Bl4&(iPY1YJEf56>*@uJs0LI=~;VF!5!InUQOF*t~xZ!Ci<*7 zKvs{#GR}GjwamOb@8UGV&_1IuqzLqEU-{v!c>bQy@Ll7H_k~vZi+yMCfwjd98CP-_7r6Mka1;1*ky6aL(yp~@$1bO;oD5w z7#Ffk@4Rc8V5{zrE`8Sd{$lnLy|wQC5*gj~XM6Wj2E*vS9qQtgte6PHNNx9fhVQ${98q~Vfi%RM?AAFTn(^GNlu%pG0US;dtAg&X%@LWiA+hH_8YfaO*i31b%b&Klw|Zv!xs@#+7>vtRc5*oP z-6eeLcQ5?vU!DG!fu8BE&&)fp9bPs9tQ#VnlFr$EO{arD)Yrf|6-=7NFMpanP1>Ig{*b2MZ zfu?jipXIZrgNRY8`&B1nuDZ+%drf5{#{e#Ow+LWgMR(`mm10!YE`^^Iu-Z&hEoKc1 z+Ky)$Yz7pdI;f^FFB1GBR@_g&E^BQVsTMOP)nSd3Sz`&5R_)lj!L^X%y3-98snSOC z=|_FiSW3D>9H;PF+2KDPP;v6ogus-=8%ApXtl${hWmqcmqtJZhNs*2nUpBWv_&<_~ zehx(X*w~;$mp?FH<%z6+OC$8$dC#{#99dtgq${h$LqiGx*E`c6t;#%0DVk`56$!VPU!?nn}@V+@w|#tWV%> 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 JJG5{a{x7GLc-#O0 literal 0 HcmV?d00001 From 47eae7e6e89768c43449376cca0503e672d4a30d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 12:50:04 +0200 Subject: [PATCH 062/506] Add pipe docs --- docs/Language-Definition.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 312946425..d99f55cd3 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -110,6 +110,12 @@ [:] +

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

+ + +
Pipe + | +
Examples: @@ -168,6 +174,17 @@ array[3:] == [4, 5] array[:] == array ``` +### Pipe Operator + +The pipe operator `|` can be used to pass the result of the left-hand side +expression as the first argument of the right-hand side expression. + +For example, expression `split(lower(user.Name), " ")` can be written as: + +```expr +user.Name | lower() | split(" ") +``` + ## Built-in Functions ### all(array, predicate) From 879a428e42546c3bb3bd3abfa309c5d333a157a4 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 17:22:22 +0200 Subject: [PATCH 063/506] Update prompt --- repl/repl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repl/repl.go b/repl/repl.go index 78ba1bd66..c249af0d9 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -26,7 +26,7 @@ var keywords = []string{ func main() { rl, err := readline.NewEx(&readline.Config{ - Prompt: "> ", + Prompt: "❯ ", AutoComplete: completer{append(builtin.Names, keywords...)}, }) if err != nil { From 189e576d9b2d677e4e9e0e3a30f32f00b236eee5 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 17:10:28 +0200 Subject: [PATCH 064/506] Add String() to nodes --- ast/dump.go | 59 ++++++++++++ ast/node.go | 1 + ast/print.go | 185 ++++++++++++++++++++++++++++-------- ast/print_test.go | 112 ++++++++++++++++++++++ parser/lexer/state.go | 12 ++- parser/lexer/utils.go | 13 --- parser/operator/operator.go | 52 ++++++++++ parser/parser.go | 82 ++-------------- parser/utils/utils.go | 34 +++++++ 9 files changed, 419 insertions(+), 131 deletions(-) create mode 100644 ast/dump.go create mode 100644 ast/print_test.go create mode 100644 parser/operator/operator.go create mode 100644 parser/utils/utils.go diff --git a/ast/dump.go b/ast/dump.go new file mode 100644 index 000000000..56bc7dbe2 --- /dev/null +++ b/ast/dump.go @@ -0,0 +1,59 @@ +package ast + +import ( + "fmt" + "reflect" + "regexp" +) + +func Dump(node Node) string { + return dump(reflect.ValueOf(node), "") +} + +func dump(v reflect.Value, ident string) string { + if !v.IsValid() { + return "nil" + } + t := v.Type() + switch t.Kind() { + case reflect.Struct: + out := t.Name() + "{\n" + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if isPrivate(f.Name) { + continue + } + s := v.Field(i) + out += fmt.Sprintf("%v%v: %v,\n", ident+"\t", f.Name, dump(s, ident+"\t")) + } + return out + ident + "}" + case reflect.Slice: + if v.Len() == 0 { + return t.String() + "{}" + } + out := t.String() + "{\n" + for i := 0; i < v.Len(); i++ { + s := v.Index(i) + out += fmt.Sprintf("%v%v,", ident+"\t", dump(s, ident+"\t")) + if i+1 < v.Len() { + out += "\n" + } + } + return out + "\n" + ident + "}" + case reflect.Ptr: + return dump(v.Elem(), ident) + case reflect.Interface: + return dump(reflect.ValueOf(v.Interface()), ident) + + case reflect.String: + return fmt.Sprintf("%q", v) + default: + return fmt.Sprintf("%v", v) + } +} + +var isCapital = regexp.MustCompile("^[A-Z]") + +func isPrivate(s string) bool { + return !isCapital.Match([]byte(s)) +} diff --git a/ast/node.go b/ast/node.go index 5bdcb75ed..ba6545871 100644 --- a/ast/node.go +++ b/ast/node.go @@ -14,6 +14,7 @@ type Node interface { SetLocation(file.Location) Type() reflect.Type SetType(reflect.Type) + String() string } func Patch(node *Node, newNode Node) { diff --git a/ast/print.go b/ast/print.go index 56bc7dbe2..e95e88796 100644 --- a/ast/print.go +++ b/ast/print.go @@ -1,59 +1,162 @@ package ast import ( + "encoding/json" "fmt" - "reflect" - "regexp" + "strings" + + "github.com/antonmedv/expr/parser/operator" + "github.com/antonmedv/expr/parser/utils" ) -func Dump(node Node) string { - return dump(reflect.ValueOf(node), "") +func (n *NilNode) String() string { + return "nil" +} + +func (n *IdentifierNode) String() string { + return n.Value +} + +func (n *IntegerNode) String() string { + return fmt.Sprintf("%d", n.Value) +} + +func (n *FloatNode) String() string { + return fmt.Sprintf("%v", n.Value) +} + +func (n *BoolNode) String() string { + return fmt.Sprintf("%t", n.Value) } -func dump(v reflect.Value, ident string) string { - if !v.IsValid() { +func (n *StringNode) String() string { + return fmt.Sprintf("%q", n.Value) +} + +func (n *ConstantNode) String() string { + if n.Value == nil { return "nil" } - t := v.Type() - switch t.Kind() { - case reflect.Struct: - out := t.Name() + "{\n" - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if isPrivate(f.Name) { - continue - } - s := v.Field(i) - out += fmt.Sprintf("%v%v: %v,\n", ident+"\t", f.Name, dump(s, ident+"\t")) - } - return out + ident + "}" - case reflect.Slice: - if v.Len() == 0 { - return t.String() + "{}" + b, err := json.Marshal(n.Value) + if err != nil { + panic(err) + } + return string(b) +} + +func (n *UnaryNode) String() string { + op := "" + if n.Operator == "not" { + op = fmt.Sprintf("%s ", n.Operator) + } else { + op = fmt.Sprintf("%s", n.Operator) + } + if _, ok := n.Node.(*BinaryNode); ok { + return fmt.Sprintf("%s(%s)", op, n.Node.String()) + } + return fmt.Sprintf("%s%s", op, n.Node.String()) +} + +func (n *BinaryNode) String() string { + var left, right string + if b, ok := n.Left.(*BinaryNode); ok && operator.Less(b.Operator, n.Operator) { + left = fmt.Sprintf("(%s)", n.Left.String()) + } else { + left = n.Left.String() + } + if b, ok := n.Right.(*BinaryNode); ok && operator.Less(b.Operator, n.Operator) { + right = fmt.Sprintf("(%s)", n.Right.String()) + } else { + right = n.Right.String() + } + return fmt.Sprintf("%s %s %s", left, n.Operator, right) +} + +func (n *ChainNode) String() string { + return n.Node.String() +} + +func (n *MemberNode) String() string { + if n.Optional { + if str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) { + return fmt.Sprintf("%s?.%s", n.Node.String(), str.Value) + } else { + return fmt.Sprintf("get(%s, %s)", n.Node.String(), n.Property.String()) } - out := t.String() + "{\n" - for i := 0; i < v.Len(); i++ { - s := v.Index(i) - out += fmt.Sprintf("%v%v,", ident+"\t", dump(s, ident+"\t")) - if i+1 < v.Len() { - out += "\n" - } + } + if str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) { + if _, ok := n.Node.(*PointerNode); ok { + return fmt.Sprintf(".%s", str.Value) } - return out + "\n" + ident + "}" - case reflect.Ptr: - return dump(v.Elem(), ident) - case reflect.Interface: - return dump(reflect.ValueOf(v.Interface()), ident) + return fmt.Sprintf("%s.%s", n.Node.String(), str.Value) + } + return fmt.Sprintf("%s[%s]", n.Node.String(), n.Property.String()) +} + +func (n *SliceNode) String() string { + return fmt.Sprintf("%s[%s:%s]", n.Node.String(), n.From.String(), n.To.String()) +} - case reflect.String: - return fmt.Sprintf("%q", v) - default: - return fmt.Sprintf("%v", v) +func (n *CallNode) String() string { + arguments := make([]string, len(n.Arguments)) + for i, arg := range n.Arguments { + arguments[i] = arg.String() } + return fmt.Sprintf("%s(%s)", n.Callee.String(), strings.Join(arguments, ", ")) } -var isCapital = regexp.MustCompile("^[A-Z]") +func (n *BuiltinNode) String() string { + arguments := make([]string, len(n.Arguments)) + for i, arg := range n.Arguments { + arguments[i] = arg.String() + } + return fmt.Sprintf("%s(%s)", n.Name, strings.Join(arguments, ", ")) +} + +func (n *ClosureNode) String() string { + return n.Node.String() +} + +func (n *PointerNode) String() string { + return "#" +} + +func (n *ConditionalNode) String() string { + var cond, exp1, exp2 string + if _, ok := n.Cond.(*ConditionalNode); ok { + cond = fmt.Sprintf("(%s)", n.Cond.String()) + } else { + cond = n.Cond.String() + } + if _, ok := n.Exp1.(*ConditionalNode); ok { + exp1 = fmt.Sprintf("(%s)", n.Exp1.String()) + } else { + exp1 = n.Exp1.String() + } + if _, ok := n.Exp2.(*ConditionalNode); ok { + exp2 = fmt.Sprintf("(%s)", n.Exp2.String()) + } else { + exp2 = n.Exp2.String() + } + return fmt.Sprintf("%s ? %s : %s", cond, exp1, exp2) +} + +func (n *ArrayNode) String() string { + nodes := make([]string, len(n.Nodes)) + for i, node := range n.Nodes { + nodes[i] = node.String() + } + return fmt.Sprintf("[%s]", strings.Join(nodes, ", ")) +} + +func (n *MapNode) String() string { + pairs := make([]string, len(n.Pairs)) + for i, pair := range n.Pairs { + pairs[i] = pair.String() + } + return fmt.Sprintf("{%s}", strings.Join(pairs, ", ")) +} -func isPrivate(s string) bool { - return !isCapital.Match([]byte(s)) +func (n *PairNode) String() string { + return fmt.Sprintf("%s: %s", n.Key.String(), n.Value.String()) } diff --git a/ast/print_test.go b/ast/print_test.go new file mode 100644 index 000000000..9517a0820 --- /dev/null +++ b/ast/print_test.go @@ -0,0 +1,112 @@ +package ast_test + +import ( + "testing" + + "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/parser" + "github.com/stretchr/testify/require" +) + +func TestPrint(t *testing.T) { + tests := []struct { + input string + want string + }{ + {`nil`, `nil`}, + {`true`, `true`}, + {`false`, `false`}, + {`1`, `1`}, + {`1.1`, `1.1`}, + {`"a"`, `"a"`}, + {`'a'`, `"a"`}, + {`a`, `a`}, + {`a.b`, `a.b`}, + {`a[0]`, `a[0]`}, + {`a["the b"]`, `a["the b"]`}, + {`a.b[0]`, `a.b[0]`}, + {`a?.b`, `a?.b`}, + {`-a`, `-a`}, + {`!a`, `!a`}, + {`not a`, `not a`}, + {`a + b`, `a + b`}, + {`a + b * c`, `a + b * c`}, + {`(a + b) * c`, `(a + b) * c`}, + {`a * (b + c)`, `a * (b + c)`}, + {`-(a + b) * c`, `-(a + b) * c`}, + {`a == b`, `a == b`}, + {`a matches b`, `a matches b`}, + {`a in b`, `a in b`}, + {`a not in b`, `not (a in b)`}, + {`a and b`, `a and b`}, + {`a or b`, `a or b`}, + {`a or b and c`, `a or b and c`}, + {`a or (b and c)`, `a or b and c`}, + {`(a or b) and c`, `(a or b) and c`}, + {`a ? b : c`, `a ? b : c`}, + {`a ? b : c ? d : e`, `a ? b : (c ? d : e)`}, + {`(a ? b : c) ? d : e`, `(a ? b : c) ? d : e`}, + {`a ? (b ? c : d) : e`, `a ? (b ? c : d) : e`}, + {`func()`, `func()`}, + {`func(a)`, `func(a)`}, + {`func(a, b)`, `func(a, b)`}, + {`{}`, `{}`}, + {`{a: b}`, `{"a": b}`}, + {`{a: b, c: d}`, `{"a": b, "c": d}`}, + {`[]`, `[]`}, + {`[a]`, `[a]`}, + {`[a, b]`, `[a, b]`}, + {`len(a)`, `len(a)`}, + {`map(a, # > 0)`, `map(a, # > 0)`}, + {`map(a, {# > 0})`, `map(a, # > 0)`}, + {`map(a, .b)`, `map(a, .b)`}, + {`a.b()`, `a.b()`}, + {`a.b(c)`, `a.b(c)`}, + {`a[1:-1]`, `a[1:-1]`}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + tree, err := parser.Parse(tt.input) + require.NoError(t, err) + + require.Equal(t, tt.want, tree.Node.String()) + }) + } +} + +func TestPrint_MemberNode(t *testing.T) { + node := &ast.MemberNode{ + Node: &ast.IdentifierNode{ + Value: "a", + }, + Property: &ast.StringNode{Value: "b c"}, + Optional: true, + } + require.Equal(t, `get(a, "b c")`, node.String()) +} + +func TestPrint_ConstantNode(t *testing.T) { + tests := []struct { + input interface{} + want string + }{ + {nil, `nil`}, + {true, `true`}, + {false, `false`}, + {1, `1`}, + {1.1, `1.1`}, + {"a", `"a"`}, + {[]int{1, 2, 3}, `[1,2,3]`}, + {map[string]int{"a": 1}, `{"a":1}`}, + } + + for _, tt := range tests { + t.Run(tt.want, func(t *testing.T) { + node := &ast.ConstantNode{ + Value: tt.input, + } + require.Equal(t, tt.want, node.String()) + }) + } +} diff --git a/parser/lexer/state.go b/parser/lexer/state.go index 5b4b5839e..c8f0d1725 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -2,6 +2,8 @@ package lexer import ( "strings" + + "github.com/antonmedv/expr/parser/utils" ) type stateFn func(*lexer) stateFn @@ -11,7 +13,7 @@ func root(l *lexer) stateFn { case r == eof: l.emitEOF() return nil - case IsSpace(r): + case utils.IsSpace(r): l.ignore() return root case r == '\'' || r == '"': @@ -43,7 +45,7 @@ func root(l *lexer) stateFn { case r == '.': l.backup() return dot - case IsAlphaNumeric(r): + case utils.IsAlphaNumeric(r): l.backup() return identifier default: @@ -91,7 +93,7 @@ func (l *lexer) scanNumber() bool { l.acceptRun(digits) } // Next thing mustn't be alphanumeric. - if IsAlphaNumeric(l.peek()) { + if utils.IsAlphaNumeric(l.peek()) { l.next() return false } @@ -113,7 +115,7 @@ func identifier(l *lexer) stateFn { loop: for { switch r := l.next(); { - case IsAlphaNumeric(r): + case utils.IsAlphaNumeric(r): // absorb default: l.backup() @@ -141,7 +143,7 @@ func not(l *lexer) stateFn { // Get the next word. for { r := l.next() - if IsAlphaNumeric(r) { + if utils.IsAlphaNumeric(r) { // absorb } else { l.backup() diff --git a/parser/lexer/utils.go b/parser/lexer/utils.go index a0ea87e28..83d96f49c 100644 --- a/parser/lexer/utils.go +++ b/parser/lexer/utils.go @@ -3,22 +3,9 @@ package lexer import ( "fmt" "strings" - "unicode" "unicode/utf8" ) -func IsSpace(r rune) bool { - return unicode.IsSpace(r) -} - -func IsAlphaNumeric(r rune) bool { - return IsAlphabetic(r) || unicode.IsDigit(r) -} - -func IsAlphabetic(r rune) bool { - return r == '_' || r == '$' || unicode.IsLetter(r) -} - var ( newlineNormalizer = strings.NewReplacer("\r\n", "\n", "\r", "\n") ) diff --git a/parser/operator/operator.go b/parser/operator/operator.go new file mode 100644 index 000000000..455c06f17 --- /dev/null +++ b/parser/operator/operator.go @@ -0,0 +1,52 @@ +package operator + +type Associativity int + +const ( + Left Associativity = iota + 1 + Right +) + +type Operator struct { + Precedence int + Associativity Associativity +} + +func Less(a, b string) bool { + return Binary[a].Precedence < Binary[b].Precedence +} + +var Unary = map[string]Operator{ + "not": {50, Left}, + "!": {50, Left}, + "-": {90, Left}, + "+": {90, Left}, +} + +var Binary = map[string]Operator{ + "|": {0, Left}, + "or": {10, Left}, + "||": {10, Left}, + "and": {15, Left}, + "&&": {15, Left}, + "==": {20, Left}, + "!=": {20, Left}, + "<": {20, Left}, + ">": {20, Left}, + ">=": {20, Left}, + "<=": {20, Left}, + "in": {20, Left}, + "matches": {20, Left}, + "contains": {20, Left}, + "startsWith": {20, Left}, + "endsWith": {20, Left}, + "..": {25, Left}, + "+": {30, Left}, + "-": {30, Left}, + "*": {60, Left}, + "/": {60, Left}, + "%": {60, Left}, + "**": {100, Right}, + "^": {100, Right}, + "??": {500, Left}, +} diff --git a/parser/parser.go b/parser/parser.go index 3288662b5..b1de4c9c0 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -4,61 +4,15 @@ import ( "fmt" "strconv" "strings" - "unicode/utf8" . "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" . "github.com/antonmedv/expr/parser/lexer" + "github.com/antonmedv/expr/parser/operator" + "github.com/antonmedv/expr/parser/utils" ) -type associativity int - -const ( - left associativity = iota + 1 - right -) - -type operator struct { - precedence int - associativity associativity -} - -var unaryOperators = map[string]operator{ - "not": {50, left}, - "!": {50, left}, - "-": {90, left}, - "+": {90, left}, -} - -var binaryOperators = map[string]operator{ - "|": {0, left}, - "or": {10, left}, - "||": {10, left}, - "and": {15, left}, - "&&": {15, left}, - "==": {20, left}, - "!=": {20, left}, - "<": {20, left}, - ">": {20, left}, - ">=": {20, left}, - "<=": {20, left}, - "in": {20, left}, - "matches": {20, left}, - "contains": {20, left}, - "startsWith": {20, left}, - "endsWith": {20, left}, - "..": {25, left}, - "+": {30, left}, - "-": {30, left}, - "*": {60, left}, - "/": {60, left}, - "%": {60, left}, - "**": {100, right}, - "^": {100, right}, - "??": {500, left}, -} - var predicates = map[string]struct { arity int }{ @@ -172,8 +126,8 @@ func (p *parser) parseExpression(precedence int) Node { opToken = p.current } - if op, ok := binaryOperators[opToken.Value]; ok { - if op.precedence >= precedence { + if op, ok := operator.Binary[opToken.Value]; ok { + if op.Precedence >= precedence { p.next() if opToken.Value == "|" { @@ -187,10 +141,10 @@ func (p *parser) parseExpression(precedence int) Node { } var nodeRight Node - if op.associativity == left { - nodeRight = p.parseExpression(op.precedence + 1) + if op.Associativity == operator.Left { + nodeRight = p.parseExpression(op.Precedence + 1) } else { - nodeRight = p.parseExpression(op.precedence) + nodeRight = p.parseExpression(op.Precedence) } nodeLeft = &BinaryNode{ @@ -253,9 +207,9 @@ func (p *parser) parsePrimary() Node { token := p.current if token.Is(Operator) { - if op, ok := unaryOperators[token.Value]; ok { + if op, ok := operator.Unary[token.Value]; ok { p.next() - expr := p.parseExpression(op.precedence) + expr := p.parseExpression(op.Precedence) node := &UnaryNode{ Operator: token.Value, Node: expr, @@ -510,7 +464,7 @@ func (p *parser) parsePostfixExpression(node Node) Node { if propertyToken.Kind != Identifier && // Operators like "not" and "matches" are valid methods or property names. - (propertyToken.Kind != Operator || !isValidIdentifier(propertyToken.Value)) { + (propertyToken.Kind != Operator || !utils.IsValidIdentifier(propertyToken.Value)) { p.error("expected name") } @@ -662,19 +616,3 @@ func (p *parser) parseArguments() []Node { return nodes } - -func isValidIdentifier(str string) bool { - if len(str) == 0 { - return false - } - h, w := utf8.DecodeRuneInString(str) - if !IsAlphabetic(h) { - return false - } - for _, r := range str[w:] { - if !IsAlphaNumeric(r) { - return false - } - } - return true -} diff --git a/parser/utils/utils.go b/parser/utils/utils.go new file mode 100644 index 000000000..947f9a400 --- /dev/null +++ b/parser/utils/utils.go @@ -0,0 +1,34 @@ +package utils + +import ( + "unicode" + "unicode/utf8" +) + +func IsValidIdentifier(str string) bool { + if len(str) == 0 { + return false + } + h, w := utf8.DecodeRuneInString(str) + if !IsAlphabetic(h) { + return false + } + for _, r := range str[w:] { + if !IsAlphaNumeric(r) { + return false + } + } + return true +} + +func IsSpace(r rune) bool { + return unicode.IsSpace(r) +} + +func IsAlphaNumeric(r rune) bool { + return IsAlphabetic(r) || unicode.IsDigit(r) +} + +func IsAlphabetic(r rune) bool { + return r == '_' || r == '$' || unicode.IsLetter(r) +} From cb6c8ca40f4c31b5c4131ec832bff70be2294134 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 18:00:31 +0200 Subject: [PATCH 065/506] Return correct type for builtin functions --- checker/checker.go | 5 +---- checker/checker_test.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index f4d84d078..89c0d4d84 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -139,10 +139,7 @@ func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) return mapType, info{} } if fn, ok := v.config.Functions[node.Value]; ok { - // Return anyType instead of func type as we don't know the arguments yet. - // The func type can be one of the fn.Types. The type will be resolved - // when the arguments are known in CallNode. - return anyType, info{fn: fn} + return functionType, info{fn: fn} } if t, ok := v.config.Types[node.Value]; ok { if t.Ambiguous { diff --git a/checker/checker_test.go b/checker/checker_test.go index 56bc7546a..dbd13765f 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -962,3 +962,24 @@ func TestCheck_env_keyword(t *testing.T) { }) } } + +func TestCheck_builtin_without_call(t *testing.T) { + tests := []struct { + input string + err string + }{ + {`len + 1`, "invalid operation: + (mismatched types func(...interface {}) (interface {}, error) and int) (1:5)\n | len + 1\n | ....^"}, + {`string.A`, "type func(...interface {}) (interface {}, error)[string] is undefined (1:8)\n | string.A\n | .......^"}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + tree, err := parser.Parse(test.input) + require.NoError(t, err) + + _, err = checker.Check(tree, conf.New(nil)) + require.Error(t, err) + require.Equal(t, test.err, err.Error()) + }) + } +} From 931dbf3ecd990b36ec980b97df4a522d65b1c021 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 21:05:34 +0200 Subject: [PATCH 066/506] Fix date test --- test/time/time_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/time/time_test.go b/test/time/time_test.go index eb8d478dc..4b659367c 100644 --- a/test/time/time_test.go +++ b/test/time/time_test.go @@ -104,9 +104,9 @@ func TestTime(t *testing.T) { func TestTime_duration(t *testing.T) { env := map[string]interface{}{ - "date": time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC), + "foo": time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC), } - program, err := expr.Compile(`now() - duration("1h") < now() && date + duration("24h") < now()`, expr.Env(env)) + program, err := expr.Compile(`now() - duration("1h") < now() && foo + duration("24h") < now()`, expr.Env(env)) require.NoError(t, err) output, err := expr.Run(program, env) From 39c9df602b5b19499994b6a2568d3a171d897ac8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 23:03:13 +0200 Subject: [PATCH 067/506] Fix panic in checker --- checker/checker.go | 8 ++++---- checker/types.go | 7 +++++++ compiler/compiler_test.go | 13 +++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 89c0d4d84..5088fa5f9 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -475,7 +475,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { func (v *visitor) SliceNode(node *ast.SliceNode) (reflect.Type, info) { t, _ := v.visit(node.Node) - switch t.Kind() { + switch kind(t) { case reflect.Interface: // ok case reflect.String, reflect.Array, reflect.Slice: @@ -532,7 +532,7 @@ func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { fn.NumOut() == 1 && fn.Out(0).Kind() == reflect.Interface { rest := fn.In(fn.NumIn() - 1) // function has only one param for functions and two for methods - if rest.Kind() == reflect.Slice && rest.Elem().Kind() == reflect.Interface { + if kind(rest) == reflect.Slice && rest.Elem().Kind() == reflect.Interface { node.Fast = true } } @@ -666,7 +666,7 @@ func (v *visitor) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { t, _ := v.visit(val) - switch t.Kind() { + switch kind(t) { case reflect.Interface: return anyType, info{} case reflect.Slice, reflect.Array: @@ -791,7 +791,7 @@ func (v *visitor) checkArguments(name string, fn reflect.Type, method bool, argu continue } - if !t.AssignableTo(in) && t.Kind() != reflect.Interface { + if !t.AssignableTo(in) && kind(t) != reflect.Interface { return anyType, &file.Error{ Location: arg.Location(), Message: fmt.Sprintf("cannot use %v as argument (type %v) to call %v ", t, in, name), diff --git a/checker/types.go b/checker/types.go index da8acf41d..bb23aa190 100644 --- a/checker/types.go +++ b/checker/types.go @@ -223,6 +223,13 @@ func deref(t reflect.Type) reflect.Type { return t } +func kind(t reflect.Type) reflect.Kind { + if t == nil { + return reflect.Invalid + } + return t.Kind() +} + func isIntegerOrArithmeticOperation(node ast.Node) bool { switch n := node.(type) { case *ast.IntegerNode: diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index d5293913c..c5575ebfd 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/antonmedv/expr" + "github.com/antonmedv/expr/test/playground" "github.com/antonmedv/expr/vm" "github.com/antonmedv/expr/vm/runtime" "github.com/stretchr/testify/assert" @@ -278,3 +279,15 @@ func TestCompile(t *testing.T) { assert.Equal(t, test.program.Disassemble(), program.Disassemble(), test.input) } } + +func TestCompile_panic(t *testing.T) { + tests := []string{ + `(TotalPosts.Profile[Authors > TotalPosts == get(nil, TotalLikes)] > Authors) ^ (TotalLikes / (Posts?.PublishDate[TotalPosts] < Posts))`, + } + for _, test := range tests { + t.Run(test, func(t *testing.T) { + _, err := expr.Compile(test, expr.Env(playground.Blog{})) + require.Error(t, err) + }) + } +} From 87e38b17441fba0c5691cccf545ef835c74224c3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 23:16:33 +0200 Subject: [PATCH 068/506] Fix panic in checker --- checker/checker.go | 3 +++ compiler/compiler_test.go | 1 + 2 files changed, 4 insertions(+) diff --git a/checker/checker.go b/checker/checker.go index 5088fa5f9..0091544fe 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -804,6 +804,9 @@ func (v *visitor) checkArguments(name string, fn reflect.Type, method bool, argu func (v *visitor) ClosureNode(node *ast.ClosureNode) (reflect.Type, info) { t, _ := v.visit(node.Node) + if t == nil { + return v.error(node.Node, "closure cannot be nil") + } return reflect.FuncOf([]reflect.Type{anyType}, []reflect.Type{t}, false), info{} } diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index c5575ebfd..b405d3df7 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -283,6 +283,7 @@ func TestCompile(t *testing.T) { func TestCompile_panic(t *testing.T) { tests := []string{ `(TotalPosts.Profile[Authors > TotalPosts == get(nil, TotalLikes)] > Authors) ^ (TotalLikes / (Posts?.PublishDate[TotalPosts] < Posts))`, + `one(Posts, nil)`, } for _, test := range tests { t.Run(test, func(t *testing.T) { From f383e06071d372e613aaa9b7329019c37b12159b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 23:19:58 +0200 Subject: [PATCH 069/506] Fix panic in checker --- checker/checker.go | 14 ++++++++++++++ compiler/compiler_test.go | 1 + 2 files changed, 15 insertions(+) diff --git a/checker/checker.go b/checker/checker.go index 0091544fe..9cfb0f9f3 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -670,8 +670,22 @@ func (v *visitor) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { case reflect.Interface: return anyType, info{} case reflect.Slice, reflect.Array: + p, _ := v.visit(prop) + if p == nil { + return v.error(prop, "cannot use nil as slice index") + } + if !isInteger(p) && !isAny(p) { + return v.error(prop, "non-integer slice index %v", p) + } return t.Elem(), info{} case reflect.Map: + p, _ := v.visit(prop) + if p == nil { + return v.error(prop, "cannot use nil as map index") + } + if !p.AssignableTo(t.Key()) && !isAny(p) { + return v.error(prop, "cannot use %v to get an element from %v", p, t) + } return t.Elem(), info{} } return v.error(val, "type %v does not support indexing", t) diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index b405d3df7..fd3f663ee 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -284,6 +284,7 @@ func TestCompile_panic(t *testing.T) { tests := []string{ `(TotalPosts.Profile[Authors > TotalPosts == get(nil, TotalLikes)] > Authors) ^ (TotalLikes / (Posts?.PublishDate[TotalPosts] < Posts))`, `one(Posts, nil)`, + `trim(TotalViews, Posts) <= get(Authors, nil)`, } for _, test := range tests { t.Run(test, func(t *testing.T) { From 87534e6eca73f8a940557068e972c1897efafd3b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 23:39:35 +0200 Subject: [PATCH 070/506] Improve type checker --- checker/checker.go | 8 +++++++- checker/checker_test.go | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/checker/checker.go b/checker/checker.go index 9cfb0f9f3..43c80b35f 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -321,9 +321,15 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { return boolType, info{} } if isMap(r) { + if l == nil { + return v.error(node, "cannot use nil as map key") + } + if !isAny(l) && !l.AssignableTo(r.Key()) { + return v.error(node, "cannot use %v (type %v) as type %v in map key", l, l, r.Key()) + } return boolType, info{} } - if isArray(r) { + if isInteger(l) && isArray(r) { return boolType, info{} } if isAny(l) && anyOf(r, isString, isArray, isMap) { diff --git a/checker/checker_test.go b/checker/checker_test.go index dbd13765f..e2d955e94 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -489,6 +489,11 @@ FuncTyped(42) cannot use int as argument (type string) to call FuncTyped (1:11) | FuncTyped(42) | ..........^ + +.0 in MapOfFoo +cannot use float64 (type float64) as type string in map key (1:4) + | .0 in MapOfFoo + | ...^ ` func TestCheck_error(t *testing.T) { From 282244db28b8efe3a5a0e3b2a25537ce95b67cb3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 17 Aug 2023 23:59:56 +0200 Subject: [PATCH 071/506] Improve type checker --- checker/checker.go | 24 +++++++++++++++++++----- checker/checker_test.go | 11 ++++++++--- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 43c80b35f..82aa5b74e 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -275,7 +275,7 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { return anyType, info{} } - case "/", "*": + case "*": if isNumber(l) && isNumber(r) { return combined(l, r), info{} } @@ -283,6 +283,14 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { return anyType, info{} } + case "/": + if isNumber(l) && isNumber(r) { + return floatType, info{} + } + if or(l, r, isNumber) { + return floatType, info{} + } + case "**", "^": if isNumber(l) && isNumber(r) { return floatType, info{} @@ -321,15 +329,21 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { return boolType, info{} } if isMap(r) { - if l == nil { - return v.error(node, "cannot use nil as map key") + if l == nil { // It is possible to compare with nil. + return boolType, info{} } if !isAny(l) && !l.AssignableTo(r.Key()) { - return v.error(node, "cannot use %v (type %v) as type %v in map key", l, l, r.Key()) + return v.error(node, "cannot use %v as type %v in map key", l, r.Key()) } return boolType, info{} } - if isInteger(l) && isArray(r) { + if isArray(r) { + if l == nil { // It is possible to compare with nil. + return boolType, info{} + } + if !isAny(l) && !isInteger(l) { + return v.error(node, "cannot use %v as type %v in array", l, r.Elem()) + } return boolType, info{} } if isAny(l) && anyOf(r, isString, isArray, isMap) { diff --git a/checker/checker_test.go b/checker/checker_test.go index e2d955e94..5b6a31365 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -55,13 +55,13 @@ var successTests = []string{ "(Any ? 0 : nil) == 0", "(Any ? nil : nil) == nil", "!(Any ? Foo : Foo.Bar).Anything", - "String in ArrayOfFoo", + "Int in ArrayOfFoo", + "Int not in ArrayOfFoo", "String in Foo", "String in MapOfFoo", "String matches 'ok'", "String matches Any", "String not matches Any", - "String not in ArrayOfFoo", "StringPtr == nil", "[1, 2, 3] == []", "len([]) > 0", @@ -491,9 +491,14 @@ cannot use int as argument (type string) to call FuncTyped (1:11) | ..........^ .0 in MapOfFoo -cannot use float64 (type float64) as type string in map key (1:4) +cannot use float64 as type string in map key (1:4) | .0 in MapOfFoo | ...^ + +1/2 in MapIntAny +cannot use float64 as type int in map key (1:5) + | 1/2 in MapIntAny + | ....^ ` func TestCheck_error(t *testing.T) { From 76664a6b6001432253f2c36f57372398992d8290 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 00:06:51 +0200 Subject: [PATCH 072/506] Fix errors in checker --- checker/checker.go | 6 +++--- compiler/compiler_test.go | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 82aa5b74e..8204aa7d0 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -434,7 +434,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { // First, check methods defined on base type itself, // independent of which type it is. Without dereferencing. if m, ok := base.MethodByName(name.Value); ok { - if base.Kind() == reflect.Interface { + if kind(base) == reflect.Interface { // In case of interface type method will not have a receiver, // and to prevent checker decreasing numbers of in arguments // return method type as not method (second argument is false). @@ -452,11 +452,11 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { } } - if base.Kind() == reflect.Ptr { + if kind(base) == reflect.Ptr { base = base.Elem() } - switch base.Kind() { + switch kind(base) { case reflect.Interface: return anyType, info{} diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index fd3f663ee..9a21979d8 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -285,6 +285,7 @@ func TestCompile_panic(t *testing.T) { `(TotalPosts.Profile[Authors > TotalPosts == get(nil, TotalLikes)] > Authors) ^ (TotalLikes / (Posts?.PublishDate[TotalPosts] < Posts))`, `one(Posts, nil)`, `trim(TotalViews, Posts) <= get(Authors, nil)`, + `Authors.IsZero(nil * Authors) - (TotalViews && Posts ? nil : nil)[TotalViews.IsZero(false, " ").IsZero(Authors)]`, } for _, test := range tests { t.Run(test, func(t *testing.T) { From a03c2c3700dbc67f8384a18d7bee3222878147df Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 00:15:32 +0200 Subject: [PATCH 073/506] Add test data generator --- test/mock/mock.go | 1 + test/playground/data.go | 119 ++++++++++++ test/playground/env.go | 125 ++++++++++++ test/playground/gen/gen.go | 358 +++++++++++++++++++++++++++++++++++ test/playground/gen/utils.go | 53 ++++++ 5 files changed, 656 insertions(+) create mode 100644 test/playground/data.go create mode 100644 test/playground/gen/gen.go create mode 100644 test/playground/gen/utils.go diff --git a/test/mock/mock.go b/test/mock/mock.go index b59293cdd..2ded8e555 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -35,6 +35,7 @@ type Env struct { ArrayOfFoo []*Foo MapOfFoo map[string]Foo MapOfAny map[string]interface{} + MapIntAny map[int]string FuncParam func(_ bool, _ int, _ string) bool FuncParamAny func(_ interface{}) bool FuncTooManyReturns func() (int, int, error) diff --git a/test/playground/data.go b/test/playground/data.go new file mode 100644 index 000000000..70d12e916 --- /dev/null +++ b/test/playground/data.go @@ -0,0 +1,119 @@ +package playground + +import ( + "fmt" + "time" +) + +func ExampleData() interface{} { + profileJohn := UserProfile{ + Birthday: time.Date(1990, 1, 1, 0, 0, 0, 0, time.UTC), + Biography: "A passionate writer about Go.", + Website: "https://johndoe.com", + } + + profileJane := UserProfile{ + Birthday: time.Date(1985, 2, 15, 0, 0, 0, 0, time.UTC), + Biography: "A web developer and writer.", + Website: "https://jane.com", + } + + authorJohn := Author{ + ID: 1, + FirstName: "John", + LastName: "Doe", + Email: "john.doe@example.com", + Profile: profileJohn, + } + + authorJane := Author{ + ID: 2, + FirstName: "Jane", + LastName: "Smith", + Email: "jane.smith@example.com", + Profile: profileJane, + } + + posts := []Post{ + { + ID: 1, + Title: "Understanding Golang", + Content: "Go is an open-source programming language...", + PublishDate: time.Now().AddDate(0, -1, 0), + Author: authorJohn, + Comments: generateComments(3), + Tags: []string{"Go", "Programming"}, + Likes: 100, + }, + { + ID: 2, + Title: "Exploring Python", + Content: "Python is versatile...", + PublishDate: time.Now().AddDate(0, -2, 0), + Author: authorJane, + Comments: generateComments(4), + Tags: []string{"Python", "Development"}, + Likes: 150, + }, + { + ID: 3, + Title: "Web Development Basics", + Content: "The world of web development...", + PublishDate: time.Now().AddDate(0, -3, 0), + Author: authorJane, + Comments: generateComments(5), + Tags: []string{"Web", "HTML", "CSS"}, + Likes: 125, + }, + { + ID: 4, + Title: "Machine Learning in a Nutshell", + Content: "ML is revolutionizing industries...", + PublishDate: time.Now().AddDate(0, -5, 0), + Author: authorJohn, + Comments: generateComments(6), + Tags: []string{"ML", "AI"}, + Likes: 200, + }, + { + ID: 5, + Title: "JavaScript: The Good Parts", + Content: "JavaScript powers the web...", + PublishDate: time.Now().AddDate(0, -4, 0), + Author: authorJane, + Comments: generateComments(3), + Tags: []string{"JavaScript", "Web"}, + Likes: 170, + }, + } + + blog := Blog{ + Posts: make([]Post, len(posts)), + Authors: map[int]Author{authorJohn.ID: authorJohn, authorJane.ID: authorJane}, + TotalViews: 10000, + TotalPosts: len(posts), + TotalLikes: 0, + } + + for i, post := range posts { + blog.Posts[i] = post + blog.TotalLikes += post.Likes + } + + return blog +} + +func generateComments(count int) []Comment { + var comments []Comment + for i := 1; i <= count; i++ { + comment := Comment{ + ID: i, + AuthorName: fmt.Sprintf("Commenter %d", i), + Content: fmt.Sprintf("This is comment %d!", i), + CommentDate: time.Now().AddDate(0, 0, -i), + Upvotes: i * 5, + } + comments = append(comments, comment) + } + return comments +} diff --git a/test/playground/env.go b/test/playground/env.go index 06224c60d..691aae624 100644 --- a/test/playground/env.go +++ b/test/playground/env.go @@ -10,6 +10,10 @@ type UserProfile struct { Website string } +func (u UserProfile) Age() int { + return time.Now().Year() - u.Birthday.Year() +} + type Author struct { ID int FirstName string @@ -18,6 +22,14 @@ type Author struct { Profile UserProfile } +func (a Author) FullName() string { + return a.FirstName + " " + a.LastName +} + +func (a Author) IsAdmin() bool { + return a.ID == 1 +} + type Post struct { ID int Title string @@ -29,6 +41,35 @@ type Post struct { Likes int } +func (p Post) Published() bool { + return !p.PublishDate.IsZero() +} + +func (p Post) After(date time.Time) bool { + return p.PublishDate.After(date) +} + +func (p Post) Before(date time.Time) bool { + return p.PublishDate.Before(date) +} + +func (p Post) Compare(other Post) int { + if p.PublishDate.Before(other.PublishDate) { + return -1 + } else if p.PublishDate.After(other.PublishDate) { + return 1 + } + return 0 +} + +func (p Post) Equal(other Post) bool { + return p.Compare(other) == 0 +} + +func (p Post) IsZero() bool { + return p.ID == 0 && p.Title == "" && p.Content == "" && p.PublishDate.IsZero() +} + type Comment struct { ID int AuthorName string @@ -37,6 +78,14 @@ type Comment struct { Upvotes int } +func (c Comment) Upvoted() bool { + return c.Upvotes > 0 +} + +func (c Comment) AuthorEmail() string { + return c.AuthorName + "@example.com" +} + type Blog struct { Posts []Post Authors map[int]Author @@ -44,3 +93,79 @@ type Blog struct { TotalPosts int TotalLikes int } + +func (b Blog) RecentPosts() []Post { + var posts []Post + for _, post := range b.Posts { + if post.Published() { + posts = append(posts, post) + } + } + return posts +} + +func (b Blog) PopularPosts() []Post { + var posts []Post + for _, post := range b.Posts { + if post.Likes > 150 { + posts = append(posts, post) + } + } + return posts +} + +func (b Blog) TotalUpvotes() int { + var upvotes int + for _, post := range b.Posts { + for _, comment := range post.Comments { + upvotes += comment.Upvotes + } + } + return upvotes +} + +func (b Blog) TotalComments() int { + var comments int + for _, post := range b.Posts { + comments += len(post.Comments) + } + return comments +} + +func (Blog) Add(a, b float64) float64 { + return a + b +} + +func (Blog) Sub(a, b float64) float64 { + return a - b +} + +func (Blog) Title(post Post) string { + return post.Title +} + +func (Blog) HasTag(post Post, tag string) bool { + for _, t := range post.Tags { + if t == tag { + return true + } + } + return false +} + +func (Blog) IsAdmin(author Author) bool { + return author.IsAdmin() +} + +func (Blog) IsZero(post Post) bool { + return post.IsZero() +} + +func (Blog) WithID(posts []Post, id int) Post { + for _, post := range posts { + if post.ID == id { + return post + } + } + return Post{} +} diff --git a/test/playground/gen/gen.go b/test/playground/gen/gen.go new file mode 100644 index 000000000..8e0bb17f2 --- /dev/null +++ b/test/playground/gen/gen.go @@ -0,0 +1,358 @@ +package main + +import ( + "fmt" + "math/rand" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/builtin" + "github.com/antonmedv/expr/test/playground" +) + +func main() { + var code string + defer func() { + if r := recover(); r != nil { + fmt.Printf("==========================\n%s\n==========================\n", code) + panic(r) + } + }() + + corpus := map[string]struct{}{} + for { + code = node(weightedRandomInt([]intWeight{ + {3, 100}, + {4, 40}, + {5, 50}, + {6, 30}, + {7, 20}, + {8, 10}, + {9, 5}, + {10, 5}, + })).String() + + program, err := expr.Compile(code, expr.Env(playground.Blog{})) + if err != nil { + continue + } + _, err = expr.Run(program, playground.ExampleData()) + if err != nil { + continue + } + + if _, ok := corpus[code]; ok { + continue + } + corpus[code] = struct{}{} + fmt.Println(code) + } +} + +func node(depth int) ast.Node { + if depth <= 0 { + return weightedRandom([]fnWeight{ + {nilNode, 1}, + {floatNode, 1}, + {integerNode, 1}, + {stringNode, 1}, + {booleanNode, 1}, + {identifierNode, 10}, + })(depth - 1) + } + return weightedRandom([]fnWeight{ + {arrayNode, 1}, + {mapNode, 1}, + {identifierNode, 1000}, + {memberNode, 1500}, + {unaryNode, 100}, + {binaryNode, 2000}, + {callNode, 2000}, + {builtinNode, 500}, + {predicateNode, 1000}, + {pointerNode, 500}, + {sliceNode, 100}, + {conditionalNode, 100}, + })(depth - 1) +} + +func nilNode(depth int) ast.Node { + return &ast.NilNode{} +} + +func floatNode(depth int) ast.Node { + cases := []float64{ + 0.0, + 0.5, + } + return &ast.FloatNode{ + Value: cases[rand.Intn(len(cases))], + } +} + +func integerNode(depth int) ast.Node { + return &ast.IntegerNode{ + Value: rand.Intn(3), + } +} + +func stringNode(depth int) ast.Node { + corpus := []string{ + "Go", "JavaScript", " ", + } + return &ast.StringNode{ + Value: corpus[rand.Intn(len(corpus))], + } +} + +func booleanNode(depth int) ast.Node { + return &ast.BoolNode{ + Value: maybe(), + } +} + +func identifierNode(depth int) ast.Node { + cases := []string{ + "Posts", + "Authors", + "TotalViews", + } + + return &ast.IdentifierNode{ + Value: cases[rand.Intn(len(cases))], + } +} + +func memberNode(depth int) ast.Node { + cases := []string{ + "Birthday", + "Biography", + "Website", + "ID", + "FirstName", + "LastName", + "Email", + "Profile", + "ID", + "Title", + "Content", + "PublishDate", + "Author", + "Comments", + "Tags", + "Likes", + "ID", + "AuthorName", + "Content", + "CommentDate", + "Upvotes", + } + + return &ast.MemberNode{ + Node: node(depth - 1), + Property: weightedRandom([]fnWeight{ + {func(_ int) ast.Node { return &ast.StringNode{Value: cases[rand.Intn(len(cases))]} }, 5}, + {node, 1}, + })(depth - 1), + Optional: maybe(), + } +} + +func unaryNode(depth int) ast.Node { + cases := []string{ + "-", + "!", + "not", + } + return &ast.UnaryNode{ + Operator: cases[rand.Intn(len(cases))], + Node: node(depth - 1), + } +} + +func binaryNode(depth int) ast.Node { + cases := []string{ + "or", + "||", + "and", + "&&", + "==", + "!=", + "<", + ">", + ">=", + "<=", + "in", + "matches", + "contains", + "startsWith", + "endsWith", + "..", + "+", + "-", + "*", + "/", + "%", + "**", + "^", + } + return &ast.BinaryNode{ + Operator: cases[rand.Intn(len(cases))], + Left: node(depth - 1), + Right: node(depth - 1), + } +} + +func methodNode(depth int) ast.Node { + cases := []string{ + "Age", + "FullName", + "IsAdmin", + "Published", + "After", + "Before", + "Compare", + "Equal", + "IsZero", + "Upvoted", + "AuthorEmail", + } + + return &ast.MemberNode{ + Node: node(depth - 1), + Property: &ast.StringNode{Value: cases[rand.Intn(len(cases))]}, + Optional: maybe(), + } +} + +func funcNode(depth int) ast.Node { + cases := []string{ + "RecentPosts", + "PopularPosts", + "TotalUpvotes", + "TotalComments", + "Add", + "Sub", + "Title", + "HasTag", + "IsAdmin", + "IsZero", + "WithID", + } + + return &ast.IdentifierNode{ + Value: cases[rand.Intn(len(cases))], + } +} + +func callNode(depth int) ast.Node { + var args []ast.Node + max := weightedRandomInt([]intWeight{ + {1, 100}, + {2, 50}, + {3, 25}, + {4, 10}, + {5, 5}, + }) + for i := 0; i < max; i++ { + args = append(args, node(depth-1)) + } + return &ast.CallNode{ + Callee: weightedRandom([]fnWeight{ + {methodNode, 2}, + {funcNode, 2}, + })(depth - 1), + Arguments: args, + } +} + +func builtinNode(depth int) ast.Node { + var args []ast.Node + max := weightedRandomInt([]intWeight{ + {1, 100}, + {2, 50}, + {3, 25}, + {4, 10}, + {5, 5}, + }) + for i := 0; i < max; i++ { + args = append(args, node(depth-1)) + } + return &ast.BuiltinNode{ + Name: builtin.Names[rand.Intn(len(builtin.Names))], + Arguments: args, + } +} + +func predicateNode(depth int) ast.Node { + cases := []string{ + "all", + "none", + "any", + "one", + "filter", + "map", + "count", + } + return &ast.BuiltinNode{ + Name: cases[rand.Intn(len(cases))], + Arguments: []ast.Node{node(depth - 1), node(depth - 1)}, + } +} + +func pointerNode(depth int) ast.Node { + return &ast.PointerNode{} +} + +func arrayNode(depth int) ast.Node { + var items []ast.Node + max := weightedRandomInt([]intWeight{ + {1, 100}, + {2, 50}, + {3, 25}, + {4, 10}, + {5, 5}, + }) + for i := 0; i < max; i++ { + items = append(items, node(depth-1)) + } + return &ast.ArrayNode{ + Nodes: items, + } +} + +func mapNode(depth int) ast.Node { + var items []ast.Node + max := weightedRandomInt([]intWeight{ + {1, 100}, + {2, 50}, + {3, 25}, + {4, 10}, + {5, 5}, + }) + for i := 0; i < max; i++ { + items = append(items, &ast.PairNode{ + Key: stringNode(depth - 1), + Value: node(depth - 1), + }) + } + return &ast.MapNode{ + Pairs: items, + } +} + +func sliceNode(depth int) ast.Node { + return &ast.SliceNode{ + Node: node(depth - 1), + From: node(depth - 1), + To: node(depth - 1), + } +} + +func conditionalNode(depth int) ast.Node { + return &ast.ConditionalNode{ + Cond: node(depth - 1), + Exp1: node(depth - 1), + Exp2: node(depth - 1), + } +} diff --git a/test/playground/gen/utils.go b/test/playground/gen/utils.go new file mode 100644 index 000000000..0a1b5cc9c --- /dev/null +++ b/test/playground/gen/utils.go @@ -0,0 +1,53 @@ +package main + +import ( + "math/rand" + + "github.com/antonmedv/expr/ast" +) + +func maybe() bool { + return rand.Intn(2) == 0 +} + +type fn func(int) ast.Node + +type fnWeight struct { + value fn + weight int +} + +func weightedRandom(cases []fnWeight) fn { + totalWeight := 0 + for _, c := range cases { + totalWeight += c.weight + } + r := rand.Intn(totalWeight) + for _, c := range cases { + if r < c.weight { + return c.value + } + r -= c.weight + } + return cases[0].value +} + +type intWeight struct { + value int + weight int +} + +func weightedRandomInt(cases []intWeight) int { + totalWeight := 0 + for _, c := range cases { + totalWeight += c.weight + } + r := rand.Intn(totalWeight) + for _, c := range cases { + if r < c.weight { + return c.value + } + r -= c.weight + } + return cases[0].value +} From dbd9af5b1cfd1a38b8034b26d0af4ca261b027b4 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 00:21:18 +0200 Subject: [PATCH 074/506] Exclude test folder from coverage --- .github/scripts/coverage.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/coverage.mjs b/.github/scripts/coverage.mjs index 2df642b22..1fb96c498 100755 --- a/.github/scripts/coverage.mjs +++ b/.github/scripts/coverage.mjs @@ -2,7 +2,7 @@ const expected = 90 const exclude = [ - 'cmd', + 'expr/test', 'checker/mock', 'vm/func_types', 'vm/runtime/helpers', From d0d972b171eccff9066ed405a5637d3e6d16372f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 01:34:16 +0200 Subject: [PATCH 075/506] Add fuzz testing --- fuzz_test.go | 81 + test/playground/data.go | 2 +- testdata/corpus.txt | 3446 +++++++++++++++++++++++ testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e | 2 + testdata/fuzz/FuzzExpr/87861ab0b9f0abbe | 2 + testdata/fuzz/FuzzExpr/b65163ca9e44703c | 2 + 6 files changed, 3534 insertions(+), 1 deletion(-) create mode 100644 fuzz_test.go create mode 100644 testdata/corpus.txt create mode 100644 testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e create mode 100644 testdata/fuzz/FuzzExpr/87861ab0b9f0abbe create mode 100644 testdata/fuzz/FuzzExpr/b65163ca9e44703c diff --git a/fuzz_test.go b/fuzz_test.go new file mode 100644 index 000000000..be395e47b --- /dev/null +++ b/fuzz_test.go @@ -0,0 +1,81 @@ +package expr_test + +import ( + "os" + "regexp" + "strings" + "testing" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/test/playground" +) + +func FuzzExpr(f *testing.F) { + env := playground.ExampleData() + + b, err := os.ReadFile("testdata/corpus.txt") + if err != nil { + f.Fatal(err) + } + for _, testcase := range strings.Split(string(b), "\n") { + f.Add(testcase) + } + + f.Add(`Posts[0].Comments[0].AuthorEmail()`) + f.Add(`Posts[0].Comments[0].Upvoted()`) + f.Add(`Posts[0].Comments[0].CommentDate.Add(now())`) + f.Add(`Posts[0].Comments[0].CommentDate.AddDate(0, 0, 1)`) + f.Add(`Authors[Posts[0].Author.ID].Profile.Biography`) + f.Add(`Authors[2].Profile.Age()`) + f.Add(`Authors[2].Profile.Website`) + + okCases := []*regexp.Regexp{ + regexp.MustCompile(`cannot slice`), + regexp.MustCompile(`integer divide by zero`), + regexp.MustCompile(`invalid operation`), + regexp.MustCompile(`interface conversion`), + regexp.MustCompile(`memory budget exceeded`), + regexp.MustCompile(`slice index out of range`), + regexp.MustCompile(`cannot fetch .* from .*`), + regexp.MustCompile(`cannot get .* from .*`), + regexp.MustCompile(`invalid argument for .*`), + regexp.MustCompile(`json: unsupported value`), + regexp.MustCompile(`error parsing regexp`), + regexp.MustCompile(`time: missing unit in duration`), + regexp.MustCompile(`using interface \{} as type .*`), + regexp.MustCompile(`reflect.Value.MapIndex: value of type .* is not assignable to type .*`), + regexp.MustCompile(`reflect: call of reflect.Value.Call on zero Value`), + regexp.MustCompile(`reflect: call of reflect.Value.Len on bool Value`), + regexp.MustCompile(`reflect: Call using .* as type .*`), + regexp.MustCompile(`reflect: call of reflect.Value.Index on map Value`), + } + + skipCode := []string{ + `??`, + } + + f.Fuzz(func(t *testing.T, code string) { + for _, skipCase := range skipCode { + if strings.Contains(code, skipCase) { + t.Skip() + return + } + } + + program, err := expr.Compile(code, expr.Env(playground.Blog{})) + if err != nil { + t.Skip() + } + + _, err = expr.Run(program, env) + if err != nil { + for _, okCase := range okCases { + if okCase.MatchString(err.Error()) { + t.Skip() + return + } + } + t.Errorf("code: %s, err: %s", code, err) + } + }) +} diff --git a/test/playground/data.go b/test/playground/data.go index 70d12e916..534af0523 100644 --- a/test/playground/data.go +++ b/test/playground/data.go @@ -5,7 +5,7 @@ import ( "time" ) -func ExampleData() interface{} { +func ExampleData() Blog { profileJohn := UserProfile{ Birthday: time.Date(1990, 1, 1, 0, 0, 0, 0, time.UTC), Biography: "A passionate writer about Go.", diff --git a/testdata/corpus.txt b/testdata/corpus.txt new file mode 100644 index 000000000..420ef66ad --- /dev/null +++ b/testdata/corpus.txt @@ -0,0 +1,3446 @@ +TotalViews +Authors +len(Authors) +Posts +map(Posts, float(TotalViews)) +all(map(Posts, 0.5), TotalViews < TotalViews) +Authors == Authors +-TotalViews +map(Posts, TotalViews) +len(Posts) +TotalViews .. TotalViews +first(Posts) +min(TotalViews) +Authors[0]?.ID +int(TotalViews) +string(Authors) +toJSON(Posts) +map(Posts, int(TotalViews)) +Authors[TotalViews]?.FirstName +TotalViews >= TotalViews +abs(TotalViews) +Authors[TotalViews]?.LastName +string(TotalViews) +TotalViews <= TotalViews +string(get(Posts, TotalViews)) +TotalViews + -TotalViews +one(Posts, TotalViews > TotalViews) +get(Posts, TotalViews) +TotalViews <= 0.5 * TotalViews +toJSON(TotalViews) +float(TotalViews) +map(Posts, 0 / TotalViews) +all(Posts, 0 in Authors) +last(Posts) +TotalViews * TotalViews == TotalViews +Authors[TotalViews] +TotalViews ** TotalViews +map(Posts, Authors) +one(Posts, 1 != TotalViews) +TotalViews * TotalViews == 0 ^ TotalViews +string(map(Posts, TotalViews)) +get(Posts, 0)?.PublishDate +TotalViews == len(Authors) +[Authors] +TotalViews - TotalViews +filter(Posts, nil == TotalViews) +IsAdmin(Authors[0]) +string(Posts) +get(Posts, TotalViews)?.PublishDate +Authors[TotalViews]?.ID +Authors[TotalViews]?.Profile +TotalViews < TotalViews +max(TotalViews) +Authors != Authors +map(Posts, #) +len(map(Posts, 0)) +string(TotalViews .. TotalViews) +TotalViews > TotalViews +last(0 .. TotalViews) +toJSON(Authors) +{" ": TotalViews}?.Content +last(map(Posts, Posts)) +TotalViews == TotalViews +-(TotalViews / 0.5) +Posts != Posts +TotalViews ** 0 < TotalViews +!("JavaScript" <= "Go") +Authors[TotalViews].ID +int(min(1, 0)) +Authors[TotalViews % TotalViews] +map(map(Posts, Authors), nil == Posts) +-max(2) +-(TotalViews + TotalViews) +{"Go": nil, "Go": 0.5}?.Content?.AuthorName +get(Posts, 2).Title +!(TotalViews == nil) +first(Posts).Title +not none(Posts, true) +not (nil in Posts) +TotalViews ^ TotalViews +map(Posts, Posts) +-(TotalViews % TotalViews) +get(Posts, 0).Content +last(Posts)?.Likes +TotalViews in Posts +Authors[TotalViews].LastName +get(Posts, 0).Title +filter(Posts, TotalViews > TotalViews) +{"JavaScript": Posts} +--TotalViews +TotalViews + TotalViews +TotalViews .. abs(TotalViews) +TotalViews != TotalViews +!(1 != TotalViews) +WithID(Posts, TotalViews)?.ID +TotalViews < -TotalViews +get(map(Posts, TotalViews), TotalViews) +TotalViews / TotalViews +TotalViews < TotalViews ? Authors : Authors == Authors +[get(Posts, TotalViews), Authors] +map(Posts, float(1)) +Authors[2].ID +TotalViews >= TotalViews ? TotalViews : Posts +TotalViews % TotalViews +max(0 ** 0.5) +TotalViews > TotalViews ? Authors : 0.5 +TotalViews + TotalViews - TotalViews +Posts == Posts +TotalViews ** 0 - TotalViews +not none(Posts, false) +any(Posts, TotalViews <= 2) +IsAdmin(get(Authors, TotalViews)) +!(Authors != nil) +TotalViews in Posts ? TotalViews : 2 +[TotalViews] +TotalViews <= TotalViews + TotalViews +float(TotalViews) >= TotalViews +0 % TotalViews .. TotalViews + TotalViews +0 ** TotalViews >= float(0) +first(Posts)?.ID +not (Authors != nil) +TotalViews in Authors +Posts[0].Content +not (TotalViews == 0) +!any(Posts, false) +!(TotalViews == 0) +TotalViews - TotalViews <= float(0) +TotalViews ^ 1 ^ 1 +-(TotalViews - 0) +first(Posts).Likes +!(Authors == Authors) +float(TotalViews) > count(Posts, true) +false ? Authors : TotalViews + TotalViews +all(Posts, TotalViews < TotalViews) +toJSON(" " startsWith " ") +string(filter(Posts, true)) +int(TotalViews / TotalViews) +float(0 ^ TotalViews) +get(Posts, 0)?.Likes +all(Posts, TotalViews > TotalViews) +not (1 in Posts) +WithID(Posts, 1).PublishDate +TotalViews >= TotalViews ** TotalViews +get(Authors, 1)?.FirstName +-(0 - TotalViews) +(0.5 / TotalViews) ^ TotalViews +--0 +trim(upper("Go")) +int(int(TotalViews)) +TotalViews <= TotalViews ** TotalViews +-(0 + TotalViews) +none(Posts, "Go" contains "JavaScript") +toJSON(0.5 == 2) +-int(TotalViews) +!(TotalViews in Authors) +Posts[2].PublishDate +-2 in Authors +map(Posts, #?.Likes) +(2 + TotalViews) ^ TotalViews +(TotalViews + TotalViews) / TotalViews +Authors[TotalViews].FirstName +none(Posts, Posts == Posts) +toJSON(TotalViews > TotalViews) +(TotalViews * 0.5) ** TotalViews +Posts[2]?.Author +Authors[nil].FirstName +!(TotalViews == TotalViews) +-(TotalViews ** TotalViews) +toJSON(TotalViews ** 2) +first(Posts).Tags +not (Authors == Authors) +min(2 ** TotalViews) +-(0 - 0) +1 < TotalViews ? Posts : Authors +all(Posts, one(Posts, true)) +map(Posts, TotalViews <= 2) +[Posts] +TotalViews * TotalViews +TotalViews <= -(0.5 - TotalViews) +WithID(Posts, TotalViews) +Posts != map(Posts, Posts) +!(2 == TotalViews) +!(nil == Authors) +get(Authors, TotalViews) +-(TotalViews ** 0) +Authors[1].FirstName +TotalViews - 0 != -0 +-(TotalViews * 0) +string(TotalViews > TotalViews) +map(map(Posts, Authors), #) +{" ": TotalViews, " ": Posts}.PublishDate +get(Authors, 0)?.Profile +get(Authors, TotalViews).LastName +first(Posts).Author +{"Go": Authors} +TotalViews > int(2) +map(Posts, min(0.5)) +map(false ? 1 : Authors, Authors) +!(TotalViews == 0.5) +get(Posts, TotalViews)?.Tags +!(nil != Posts) +toJSON(TotalViews < TotalViews) +0.5 * TotalViews * TotalViews +TotalViews == TotalViews != nil +string(!true) +-TotalViews ^ min(0) +get(Posts, TotalViews)?.ID +toJSON(max(0.5)) +TotalViews * 0 / TotalViews +not not false +{" ": Posts}?.Author +any(Posts, Authors != Authors) +get(Authors, 0)?.Email +string(Posts[TotalViews:TotalViews]) +get(Posts, TotalViews)?.Likes +first(map(Posts, true)) +abs(TotalViews / 0.5) +Posts[2].Tags +toJSON(upper("JavaScript")) +-0 + TotalViews +toJSON(float(TotalViews)) +get(Authors, TotalViews)?.Email +2 / TotalViews >= TotalViews +TotalViews ^ TotalViews > TotalViews +TotalViews < TotalViews - 0 +TotalViews > TotalViews * TotalViews +TotalViews % TotalViews / TotalViews +any(Posts, nil != Authors) +-TotalViews > TotalViews +string(map(Posts, Authors)) +get(Authors, TotalViews)?.FirstName +Authors[2]?.LastName +any(Posts, TotalViews == 2) +string(0 <= TotalViews) +!(TotalViews > TotalViews) +not (TotalViews == TotalViews) +!(TotalViews >= TotalViews) +map(Posts, TotalViews in Posts) +count(Posts, TotalViews <= TotalViews) +len(map(Posts, TotalViews)) +Title(WithID(Posts, TotalViews)) +TotalViews < 0 ? Authors : "Go" +!(" " == nil) +count(Posts, 0 >= TotalViews) +not (TotalViews in Posts) +-(2 - TotalViews) +get(Posts, -0) +get(Posts, TotalViews)?.Content +abs(len(Authors)) +TotalViews / (1 - 2) +IsZero(WithID(Posts, 0)) +Posts[0].PublishDate +TotalViews in Posts ? TotalViews : Authors +get(Posts, 2)?.Likes +toJSON(toJSON(Posts)) +map(Posts, get(Posts, TotalViews)) +get(Posts, TotalViews)?.Comments +Posts[0]?.Tags +TotalViews % TotalViews != TotalViews +!(Authors != Authors) +Authors[TotalViews].Profile +!(0.5 == 0.5) +not (TotalViews >= TotalViews) +0.5 / 0 <= TotalViews +abs(TotalViews ** TotalViews) +TotalViews > TotalViews ? Posts : TotalViews +!(TotalViews < TotalViews) +not (0 == TotalViews) +TotalViews + 0.5 ** TotalViews +{" ": Authors} +TotalViews == 1 / TotalViews +TotalViews < TotalViews ? Authors : 1 +len(Posts) >= TotalViews ^ 0 +(0 % TotalViews) ^ 1 ^ 0 +last(Posts)?.Author +map(Posts, not false) +get(Authors, TotalViews).ID +get(Posts, TotalViews)?.Author +all(Posts, TotalViews > 0.5) +Authors[TotalViews + TotalViews] +TotalViews - TotalViews > TotalViews ^ TotalViews +-count(Posts, true) +map(Posts, 0.5) != Posts +!(TotalViews > 0) +TotalViews + 1 .. TotalViews +Posts == Posts ? TotalViews : 0 +toJSON(TotalViews / TotalViews) +len(TotalViews .. TotalViews) +toJSON(max(TotalViews)) +get(Authors, TotalViews)?.LastName +TotalViews ** 2 + TotalViews +WithID(Posts, 0)?.Content +abs(TotalViews - TotalViews) +last(Posts).Content +Posts[2]?.Title +-abs(TotalViews) +Authors[-1] +max(TotalViews) < TotalViews +abs(len(Posts)) +TotalViews / 0.5 / TotalViews +toJSON(TotalViews == nil) +toJSON(toJSON(nil)) +Posts[0].Likes +not (TotalViews > TotalViews) +first(Posts)?.Content +-(TotalViews * 0.5) +toJSON(nil == Authors) +true ? "JavaScript" : TotalViews in map(Posts, Posts) +string(map(Posts, true)) +{"JavaScript": Authors} +[Posts, Posts] +toJSON(TotalViews <= TotalViews) +get(Authors, 1 - TotalViews) +get(map(Posts, Posts), TotalViews) +string(TotalViews / 0) +not (Posts == Posts) +TotalViews > 0.5 * TotalViews +TotalViews .. TotalViews % TotalViews +get(Authors, TotalViews).Email +string(none(Posts, false)) +toJSON(-0.5) +TotalViews .. 1 == map(Posts, Authors) +{"Go": Posts} +not (0 != 0.5) +get(Authors, TotalViews).Profile +!(TotalViews != 0) +WithID(Posts, TotalViews).Tags +TotalViews > TotalViews + TotalViews +none(Posts, TotalViews != TotalViews) +map(map(Posts, 1), #) +IsAdmin(Authors[TotalViews]) +!(0.5 < TotalViews) +get(Authors, TotalViews).FirstName +Posts[1]?.Comments +all(Posts, TotalViews == TotalViews) +TotalViews - TotalViews - 1 +{"Go": TotalViews} +get(Posts, 1)?.Likes +Authors[TotalViews].Email +IsAdmin(get(Authors, 1)) +TotalViews ** 2 > TotalViews +not (Posts != nil) +string(-0.5) +TotalViews % min(TotalViews) +TotalViews > len(Authors) +get(Posts, 0).Comments +{"JavaScript": Authors}?.Website +TotalViews ** 0 + TotalViews +TotalViews <= -0 +{" ": nil}?.Comments +!(false != nil) +!(nil == Posts) +Posts[1].Content +lower(string(Authors)) +nil != Authors || true != false +(TotalViews - TotalViews) % TotalViews +Posts == Posts ? Authors : 0 * TotalViews +0.5 != 2 ? Posts : Posts +Authors[0].LastName +{" ": Authors, " ": Authors, " ": Posts, "Go": false}.Birthday +max(TotalViews - TotalViews) +toJSON(Authors[TotalViews]) +none(map(Posts, false), #) +not (Posts != Posts) +get(Posts, 0).ID +!(TotalViews != TotalViews) +len(toJSON(Posts)) +TotalViews >= TotalViews % TotalViews +!(TotalViews != 1) +Title(Posts[1]) +none(Posts, "Go" > "Go") +TotalViews * (TotalViews - TotalViews) +toJSON(TotalViews <= 2) +one(Posts, 0.5 == 1) +get(map(Posts, 0), TotalViews) +Authors[nil]?.ID +string(nil in Posts) +count(Posts, false) .. TotalViews +TotalViews ** (TotalViews + 0) +map(false ? Authors : Posts, Authors) +last(Posts)?.Content +2 - TotalViews == TotalViews +TotalViews == TotalViews - 0 +none(Posts, TotalViews == 2) +len(Authors) + TotalViews +string(0 .. TotalViews) +min(TotalViews + 0) +!(TotalViews <= TotalViews) +-TotalViews >= TotalViews +Title(last(Posts)) +toJSON(TotalViews <= 0.5) +int(TotalViews ^ TotalViews) +map(Posts, TotalViews == TotalViews) +not (Posts == nil) +TotalViews + 0 <= TotalViews +len(string(Authors)) +get(Posts, 2)?.Content +min(2 - TotalViews) +Authors[0].ID +string(int(TotalViews)) +Posts[TotalViews:TotalViews] +0 - TotalViews - TotalViews +not all(Posts, true) +-(TotalViews * TotalViews) +-TotalViews / TotalViews +!(nil == TotalViews) +not (nil != Authors) +!(TotalViews < 0.5) +map(map(Posts, TotalViews), 0 % TotalViews) +0 - 0.5 >= TotalViews +filter(Posts, 0 <= 0) +map(Posts, get(Authors, 0)) +nil == Authors[TotalViews % TotalViews] +Authors != nil ? nil : TotalViews +float(min(TotalViews, 0)) +count(Posts, 1 >= TotalViews) +last(Posts).Tags +0.5 / TotalViews > TotalViews +get(Authors, TotalViews)?.ID +!(0.5 >= TotalViews) +nil == 2 ? Posts : TotalViews +max(TotalViews * 1) +TotalViews / TotalViews - TotalViews +map(Posts, Posts) == Posts +0 == TotalViews or 0 > TotalViews +all(Posts, Posts == Posts) +get(Posts, 2).Comments +get(Posts, max(TotalViews)) +not (TotalViews in Authors) +first(map(Posts, Authors)) +get(Posts, 0).PublishDate +!(2 < 1) +min(TotalViews, TotalViews) +(0.5 - TotalViews) / 0 ** 0 +none(Posts, 1 == TotalViews) +get(Authors, 0)?.ID +float(TotalViews) - TotalViews +toJSON(not true) +map(Posts, nil == TotalViews) +get(Posts, 2).Content +any(Posts, IsZero(#)) +last(Posts).Comments +Posts[1].Likes +string(TotalViews * 0) +TotalViews * TotalViews * TotalViews +false ? true : TotalViews * TotalViews +not ("JavaScript" matches "JavaScript") +0 % TotalViews .. TotalViews +!(Posts == Posts) +TotalViews == TotalViews ? TotalViews : TotalViews +string(TotalViews + 2) +{"JavaScript": Posts, " ": 0.5, "JavaScript": TotalViews}.Content +map(Posts, toJSON(Posts)) +TotalViews in 0 .. TotalViews +!false ? Authors : Authors +toJSON(0 * TotalViews) +Authors[2]?.FirstName +not (0.5 <= TotalViews) +!(0 <= 0) +get(Posts, TotalViews)?.Title +false ? Authors : TotalViews in Authors ? TotalViews : 0.5 +string(max(TotalViews)) +max(0 + TotalViews, TotalViews - 2) +map(Posts, TotalViews ** 0) +max(1 * TotalViews) +max(max(0)) +0 >= TotalViews ? Posts : TotalViews +TotalViews * 0.5 * 0.5 ^ 0 +-0 ^ TotalViews +{"Go": Posts, "JavaScript": true, "JavaScript": Authors}.Birthday +!!true +Authors[1 % 2] +(0 - 0) ^ TotalViews +TotalViews / TotalViews != TotalViews +string(Posts == Posts) +toJSON(TotalViews in Authors) +get(Posts, 1)?.Content +TotalViews - 0 % TotalViews +!(nil != "Go") +TotalViews * 2 % TotalViews +map(map(Posts, Posts), TotalViews) +2 * 2 > TotalViews +WithID(Posts, TotalViews).Author +int(len(Posts)) +map(Posts, TotalViews < TotalViews) +Authors[TotalViews]?.Email +map(Posts, 0.5 / 0) +0.5 + 1 + TotalViews +float(TotalViews % TotalViews) +!(Posts != nil) +string(!false) +TotalViews ** 2 == TotalViews +IsZero(WithID(Posts, TotalViews)) +int(toJSON(0)) +last(Posts).Title +filter(Posts, Posts == nil) +-TotalViews % TotalViews +TotalViews + TotalViews .. TotalViews +string(-TotalViews) +!(2 in Posts) +TotalViews < TotalViews ? Posts : 0.5 +-TotalViews <= TotalViews +get(Posts, 1)?.Comments +toJSON(0 * 0.5) +Authors[nil].ID +get(Authors, int(TotalViews)) +abs(abs(2)) +Posts != filter(Posts, false) +one(map(Posts, true), #) +map(map(Posts, TotalViews), #) +{"Go": Authors}?.Content +not (nil != 0.5) +Posts == map(Posts, 0.5) +last(map(Posts, Authors)) +Posts[1]?.ID +IsZero(last(Posts)) +TotalViews - TotalViews ** 0 +map(Posts, string(TotalViews)) +not (TotalViews != TotalViews) +!none(Posts, true) +string(toJSON(Posts)) +{" ": TotalViews} +get(Authors, 0).FirstName +not (0 != TotalViews) +!(2 <= TotalViews) +0 - 0 in Authors +get(TotalViews .. TotalViews, TotalViews) +not ("Go" != nil) +string(TotalViews % TotalViews) +Title(Posts[2]) +not (0 >= TotalViews) +TotalViews / -TotalViews +{"JavaScript": TotalViews} +fromJSON(toJSON(TotalViews)) +-len(Posts) +-(TotalViews ^ 0.5) +TotalViews <= TotalViews == false +" " in Authors[TotalViews] +map(map(Posts, #), Authors) +abs(TotalViews * TotalViews) +get(Authors, 2)?.Email +map(map(Posts, Posts), toJSON(Posts)) +TotalViews * 0 <= 2 - TotalViews +TotalViews in Authors == nil +map(map(Posts, TotalViews), get(Posts, 0)) +map(Posts, first(Posts)) +TotalViews + 0 == TotalViews +-TotalViews == TotalViews +filter(Posts, TotalViews != TotalViews) +TotalViews != 1 / TotalViews +TotalViews + 0.5 <= TotalViews +toJSON(TotalViews != 0) +Authors[nil]?.Email +Posts[1].Tags +string(true == nil) +none(Posts, nil != TotalViews) +get(Authors, 1).ID +get(Posts, 1).ID +!(nil != TotalViews) +float(TotalViews * TotalViews) +get(Posts, TotalViews % TotalViews) +one(map(Posts, Posts), 0 in Posts) +Posts[1]?.Content +TotalViews * int(0.5) +string(toJSON(TotalViews)) +get(Posts, 1)?.Tags +0 ** TotalViews / TotalViews +all(Posts, false && false) +map(map(Posts, 0), TotalViews) +TotalViews <= 1 ^ TotalViews +Authors[0 * 0] +TotalViews <= TotalViews / 0.5 +string(TotalViews / TotalViews) +TotalViews != 0 + 1 +{"Go": TotalViews, "Go": Authors, "Go": TotalViews}.Content +TotalViews ^ TotalViews ** TotalViews +first(map(Posts, Posts)) +!(Posts != Posts) +WithID(Posts, 0)?.Comments +map(map(Posts, "Go"), TotalViews) +TotalViews > 0.5 ^ TotalViews +count(Posts, TotalViews == 0.5) +TotalViews ^ (0 / 0) +map(Posts, last(Posts)) +WithID(Posts, TotalViews)?.Tags +get(Posts, -1) +min(0 + 0) +TotalViews * TotalViews <= TotalViews +len(Authors) in Authors +Authors == nil ? Posts : TotalViews +Posts != nil ? Authors : TotalViews +one(Posts, TotalViews < TotalViews) +!none(Posts, false) +Posts[0].Author +TotalViews != 0 ? TotalViews < TotalViews : Posts +Authors[nil].Email +get(Authors, 2)?.Profile +{"JavaScript": Posts}?.ID +first(Posts)?.Author +not (0 < 0.5) +first(filter(Posts, false)) +Posts[2]?.Tags +TotalViews * TotalViews != TotalViews +not (TotalViews < 0.5) +filter(Posts, 0 == TotalViews) +TotalViews ** 1 == TotalViews +-(0 / TotalViews) +abs(-TotalViews) +TotalViews == nil == nil +map(map(Posts, 0.5), Posts) +not (1 < TotalViews) +TotalViews ^ -TotalViews +Posts == Posts[TotalViews:TotalViews] +Authors == Authors ? "Go" : Posts +all(Posts, 2 >= TotalViews) +TotalViews - TotalViews >= Authors[TotalViews].ID +not (0 < TotalViews) +map(Posts, TotalViews .. 0) +max(TotalViews % TotalViews) +toJSON(!false) +map(Posts, TotalViews / 1) +all(Posts, TotalViews in Posts) +max(TotalViews + TotalViews) +not (true or false) +float(TotalViews) * TotalViews +get(Authors, TotalViews)?.Profile +TotalViews <= 0 % TotalViews +TotalViews > TotalViews ? Posts : Authors[TotalViews] +any(Posts, TotalViews in Posts) +filter(Posts, none(Posts, false)) +IsZero(first(Posts)) +map(Posts, TotalViews >= TotalViews) +nil != TotalViews ? TotalViews : map(Posts, TotalViews) +abs(-0.5) +TotalViews == TotalViews % TotalViews +first(Posts)?.Comments +WithID(Posts, TotalViews)?.Author +one(Posts, nil != 1) +first(Posts)?.Tags +map(Posts, #?.Tags) +Posts[1]?.Likes +TotalViews >= TotalViews ? TotalViews : " " +all(Posts, false) ? last(Posts) : TotalViews +TotalViews ** (TotalViews * 1) +TotalViews != -TotalViews +-(0 + 0) +Posts[0]?.Comments +count(Posts, nil != Posts) +(0.5 + TotalViews) ** TotalViews +TotalViews - TotalViews in Authors +IsAdmin(Authors[nil]) +one(Posts, 0 <= 1) +2 ** 0.5 > TotalViews ** 1 +any(Posts, nil in Posts) +!(2 < 0) +TotalViews < TotalViews != false +{"JavaScript": Posts, "Go": "JavaScript"}.Birthday +abs(TotalViews) >= TotalViews +count(Posts, true) % TotalViews +!(TotalViews < 1) +filter(map(Posts, 0.5), TotalViews >= TotalViews) +toJSON(0 ^ 2) +TotalViews / (2 - 1) +toJSON(first(Posts)) +TotalViews ^ 0 != TotalViews +string(-(TotalViews * TotalViews)) +TotalViews != 0 / TotalViews +toJSON(get(Authors, TotalViews)) +float(float(0)) +get(Posts, 1).Likes +count(Posts, Posts != Posts) +first(true ? Posts : Authors) +-min(TotalViews) +--0.5 +max(TotalViews ^ TotalViews) +0.5 >= TotalViews ? Authors : TotalViews * TotalViews +first(Posts[TotalViews:TotalViews]) +(TotalViews * TotalViews) ^ TotalViews +map(Posts, abs(TotalViews)) +TotalViews == int(TotalViews) +Authors[0]?.LastName +not (0.5 < 1) +TotalViews != 0.5 + TotalViews +toJSON(TotalViews % TotalViews) +true ? Authors : TotalViews % TotalViews +one(Posts, Authors != Authors) +[get(Authors, TotalViews)] +not (0.5 != TotalViews) +get(Posts, 1).Comments +TotalViews + 0 in Posts +0.5 ^ 1 <= TotalViews +Posts[0]?.Likes +first(Posts)?.PublishDate +string(true ? TotalViews : TotalViews) +int(1 / 0) +0 * 1 * TotalViews +-(TotalViews / TotalViews) +Authors[0]?.Profile +max(TotalViews ^ 0) +not false ? nil : Posts +count(Posts, true) * TotalViews +filter(Posts, 0 >= 0.5) +all(Posts, Authors == Authors) +TotalViews >= 0.5 ^ TotalViews +get(Posts, 2).ID +{"Go": TotalViews, "Go": TotalViews, "JavaScript": Authors, " ": Authors, "JavaScript": TotalViews}?.Title +last(Posts)?.Tags +TotalViews <= TotalViews / 0 +Authors != Authors == one(Posts, false) +TotalViews in Posts ? "Go" : Authors +TotalViews + 0 ^ TotalViews +first(TotalViews .. TotalViews) +get(Posts, TotalViews - TotalViews) +string(TotalViews + TotalViews) +none(Posts, TotalViews == TotalViews) +min(-TotalViews) +last(Posts).ID +Posts[0].ID +none(Posts, TotalViews <= TotalViews) +string(map(Posts, Posts)) +get(TotalViews .. 0, TotalViews) +one(Posts, TotalViews in Posts) +get(Authors, 1)?.ID +none(map(Posts, Posts), Posts == Posts) +toJSON(TotalViews > 0) +Posts[0]?.ID +TotalViews / (TotalViews - 0) +TotalViews / (TotalViews + TotalViews) +TotalViews in Authors and TotalViews <= TotalViews +map(Posts, Authors[TotalViews]) +int(1 * TotalViews) +all(Posts, 2 == TotalViews) +max(TotalViews, TotalViews) +toJSON(get(Posts, TotalViews)) +{"JavaScript": TotalViews == TotalViews} +min(0, TotalViews) ** TotalViews +toBase64(string(Posts)) +TotalViews != 0 ** TotalViews +count(Posts, TotalViews >= TotalViews) +first(Posts).ID +{"JavaScript": Authors, "Go": Authors}?.Likes?.ID +TotalViews - TotalViews * TotalViews +toJSON(map(Posts, Authors)) +{" ": Posts} +float(TotalViews / 0) +!(TotalViews == 1) +TotalViews != TotalViews - TotalViews +last(Posts)?.ID +TotalViews == float(0.5) +TotalViews ** (0 / TotalViews) +count(Posts, !(TotalViews <= TotalViews)) +get(Authors, -0) +Authors[nil]?.LastName +toJSON(Authors == Authors) +IsAdmin(get(Authors, 0)) +abs(TotalViews) <= TotalViews +TotalViews == -TotalViews +int(0 + 0) +all(Posts, "JavaScript" < "Go") +TotalViews >= 0 - TotalViews +map(filter(Posts, false), TotalViews) +string(TotalViews - TotalViews) +!all(Posts, false) +TotalViews == 1 ? 1 : Authors +map(Posts, TotalViews ** 2) +Posts[2]?.Likes +-(0 ^ 0) +TotalViews ** (1 - TotalViews) +TotalViews > 0 ^ 0.5 +last(map(Posts, "JavaScript")) +not (2 != 0.5) +!(TotalViews > 1) +get(Authors, 0).ID +max(TotalViews * 0) +Authors[nil].LastName +string(map(Posts, 0.5)) +map(map(Posts, TotalViews), TotalViews) +Authors[0 + TotalViews] +1 % TotalViews / TotalViews +len(string(Posts)) +string(0 >= 0.5) +(1 * TotalViews) ^ TotalViews +!(1 > 0.5) +not (1 in Authors) +-0 <= TotalViews / 0.5 +{" ": false, "Go": TotalViews}.FirstName +TotalViews ** 0 ^ TotalViews +toJSON(-TotalViews) +string(TotalViews >= 2) +int(TotalViews * TotalViews) +TotalViews % TotalViews >= TotalViews +get(map(Posts, Authors), TotalViews) +TotalViews > TotalViews ** TotalViews +WithID(Posts, TotalViews).ID +TotalViews + 0.5 ^ TotalViews +map(Posts, int(0)) +toJSON(1 > TotalViews) +WithID(Posts, TotalViews).Comments +len("JavaScript") > TotalViews +Title(WithID(Posts, 0)) +string(Authors == nil) +WithID(Posts, TotalViews).PublishDate +-(2 ** 0) +string(false ? Posts : false) +string(2 == 0.5) +count(TotalViews .. TotalViews, TotalViews != TotalViews) +!(true != true) +get(Posts, 0)?.Content +one(Posts, Posts != Posts) +map(TotalViews .. TotalViews, TotalViews) +count(Posts, TotalViews != 0) +string(Authors[TotalViews]) +len(toJSON(2)) +upper(string(" ")) +map(Posts, Authors) != Posts +not (nil != Posts) +Title(get(Posts, 2)) +WithID(Posts, 0).Author.FirstName +Authors[0]?.FirstName +not (true || false) +int(string(TotalViews)) +-(0.5 ^ TotalViews) +TotalViews > TotalViews ? Authors : TotalViews +IsZero(get(Posts, 2)) +map(Posts, count(Posts, true)) +toJSON(0.5 < TotalViews) +string(2 < TotalViews) +not (TotalViews > 0.5) +not (" " > "JavaScript") +any(Posts, Authors == Authors) +TotalViews in TotalViews .. 0 +-(0.5 / TotalViews) +-(TotalViews ^ TotalViews) +0 ** 0.5 + abs(TotalViews) +-1 in Posts +one(Posts, 0 < TotalViews) +TotalViews * TotalViews ** TotalViews +!(0 in Authors) +map(filter(Posts, true), #) +get(map(Posts, "Go"), TotalViews) +string(TotalViews % 1) +!(TotalViews in Posts) +toJSON(TotalViews ** 1) +count(Posts, TotalViews in Authors) +float(toJSON(TotalViews)) +-float(TotalViews) +Title(first(Posts)) +int(TotalViews) > TotalViews +map(filter(Posts, false), 0 < 2) +TotalViews <= TotalViews * 2 +map(map(Posts, "JavaScript"), Posts) +any(Posts, TotalViews <= TotalViews) +count(Posts, nil == nil) +WithID(Posts, 0).Content +TotalViews - min(0.5) +map(Posts, Posts[0]) +map(map(Posts, Posts), #) +0.5 + 0 + min(TotalViews) +TotalViews in map(Posts, Authors) +TotalViews != TotalViews ? TotalViews : nil +Authors[1].LastName +not (TotalViews == nil) +0 - TotalViews in Posts +get(Posts, 2 - TotalViews) +none(Posts, TotalViews in Posts) +TotalViews * abs(TotalViews) +0.5 <= TotalViews or TotalViews > TotalViews +get(false ? Authors : Authors, TotalViews % TotalViews) +{" ": Posts}?.ID +map(Posts, TotalViews in Authors) +abs(TotalViews) != TotalViews +min(TotalViews * TotalViews) +first(Posts).PublishDate +false ? true : TotalViews in Posts +not all(Posts, false) +count(Posts, 0 == 2) +true ? Authors : TotalViews == TotalViews +!(TotalViews != nil) +{" ": TotalViews - 2} +string(Authors[0]) +max(abs(0)) +TotalViews / TotalViews / TotalViews ^ TotalViews +!(TotalViews <= 0) +TotalViews ** (TotalViews - TotalViews) +WithID(Posts, TotalViews).Content +TotalViews ** TotalViews ** TotalViews +TotalViews in Authors ? Posts : Posts +{" ": false}?.Profile +TotalViews ** (TotalViews * 2) +TotalViews ^ 0 + TotalViews ^ TotalViews +map(map(Posts, TotalViews), Posts) +TotalViews + TotalViews / 0.5 +get(Posts, 2)?.Title +0.5 ^ TotalViews ^ TotalViews +TotalViews > -TotalViews +string(0 > TotalViews) +map(Posts, .ID) +{"JavaScript": 1, " ": Authors}?.Biography +not (TotalViews == 1) +string(string(" ")) +map(Posts, 1 ^ TotalViews) +toJSON("Go" matches "Go") +filter(Posts, TotalViews in Posts) +TotalViews in map(Posts, Posts) +one(map(Posts, false), #) +map(Posts, -TotalViews) +{" ": Posts, "Go": Authors}.Author +TotalViews * TotalViews / TotalViews +IsZero(get(Posts, 0)) +one(Posts, TotalViews <= TotalViews) +last(Posts).Likes +!!false +map(map(Posts, Authors), TotalViews > TotalViews) +float(len(Authors)) +float(float(TotalViews)) +Authors[2]?.ID +get(Posts, 2)?.Author +min(len(Posts)) +!one(Posts, true) +2 - TotalViews != TotalViews +false ? Authors : TotalViews / int(TotalViews) +map(false ? false : Posts, Posts) +toJSON(one(Posts, false)) +WithID(Posts, TotalViews)?.Content +!(0 >= 0) +max(count(Posts, true)) +TotalViews <= len(Posts) +TotalViews == TotalViews or 0 == TotalViews +count(Posts, TotalViews == 2) +Authors != Authors ? TotalViews : 0 +int(TotalViews) ^ TotalViews +not (1 > 0) +-(TotalViews - TotalViews) +{"JavaScript": Posts}.PublishDate +float(TotalViews / TotalViews) +map(TotalViews .. 0, Posts) +last(map(Posts, TotalViews)) +{"JavaScript": Add(0, 0)} +abs(TotalViews + 1) +not (Authors != Authors) +Authors[0].FirstName +toJSON(TotalViews + 0) +--max(2) +{"JavaScript": Authors, " ": Posts, " ": TotalViews}.Author +not (TotalViews < 1) +0 ^ 2 > count(Posts, false) +not ("Go" contains "JavaScript") +len(Posts) ** TotalViews +abs(TotalViews ** 0) +map(Posts, .Author) +get(Posts, len(Posts)) +toJSON(min(2)) +-(0.5 - TotalViews) +count(Posts, Authors == Authors) +{"JavaScript": TotalViews}.Website +TotalViews <= TotalViews && TotalViews > TotalViews +count(map(Posts, TotalViews), TotalViews < TotalViews) +!(TotalViews >= 0) +string(Authors) matches string(false) +TotalViews ^ TotalViews * TotalViews +one(Posts, Authors == nil) +string(len(Posts)) +float(2 / TotalViews) +(0 % 2) ** TotalViews +get(Posts, 2).Author +Posts[0]?.Author +get(Authors, 2).LastName +not (1 == TotalViews) +"JavaScript" < "JavaScript" == nil ? TotalViews : Posts +-TotalViews in Authors +abs(1 ** 0) +get(Posts, 0)?.ID +get(Posts, 0 * 2) +min(TotalViews % TotalViews) +nil != Authors || nil == 0.5 +{"Go": "JavaScript"}.ID +none(Posts, 0 != TotalViews) +Authors[abs(0)] +map(Posts, Authors == Authors) +map(Posts, TotalViews > TotalViews) +map(Posts, 2 ** 2) +string(2 > TotalViews) +Posts[2].Title +none(Posts, Authors != Authors) +not (TotalViews > 0) +TotalViews > TotalViews != nil +toJSON(toJSON(TotalViews)) +toJSON({"JavaScript": TotalViews}) +Authors[0].Profile +map(Posts, Authors != Authors) +TotalViews / (TotalViews + 0.5) +-TotalViews ^ TotalViews +last(Posts).PublishDate +one(map(Posts, TotalViews), 1 != TotalViews) +not (TotalViews <= 0.5) +TotalViews <= TotalViews * TotalViews +min(len("Go")) +!(nil == 1) +TotalViews ** TotalViews == TotalViews +TotalViews .. 2 % TotalViews +lower(toJSON(Posts)) +any(Posts, Posts != Posts) +toJSON(TotalViews - 0) +TotalViews * 2 ** TotalViews +0.5 / 0 - TotalViews - 1 +int(0 + 2) +Posts[TotalViews % TotalViews] +max(0.5 + TotalViews) +0 + TotalViews in Posts +[0 in Authors] +IsZero(Posts[0]) +[map(Posts, TotalViews)] +one(Posts, 0 != nil) +TotalViews ^ 0.5 ** (0 / 0) +TotalViews >= abs(TotalViews) +filter(Posts, 0 in Posts) +TotalViews > TotalViews and TotalViews in Authors +last(map(Posts, 0.5)) +TotalViews != TotalViews ? Authors : 0 +string(2 > 0) +2 ^ TotalViews ** TotalViews +TotalViews .. 0 + 2 +{"JavaScript": TotalViews, " ": Posts}.FirstName +toJSON(Posts == Posts) +not one(Posts, true) +Authors[2]?.Profile +min(TotalViews) - TotalViews +map(Posts, 0 .. TotalViews) +map(map(Posts, " "), TotalViews) +TotalViews in map(Posts, TotalViews) +TotalViews % TotalViews <= TotalViews +map(Posts, len(Authors)) +-min(2) +filter(Posts, !false) +string(TotalViews ^ TotalViews) +int(TotalViews) > TotalViews ? Authors : Posts +TotalViews ^ 0 != TotalViews / TotalViews +float(TotalViews / 2) +none(Posts, Authors == Authors) +-max(TotalViews) +map(Posts, Authors) == map(Posts, Authors) +TotalViews == TotalViews ? "Go" : TotalViews +!(0 > TotalViews) +TotalViews ** TotalViews - TotalViews +2 - 0.5 <= TotalViews ? nil : nil +filter(Posts, TotalViews <= 1) +not (0.5 == 2) +map(Posts, 0.5 ** 2) +toJSON(2 >= 0) +count(Posts, 0.5 >= TotalViews) +all(Posts, TotalViews < 0) +toJSON(1 > 0.5) +filter(Posts, TotalViews == TotalViews) +first(Posts)?.Likes +get(Posts, 2).PublishDate +Posts != nil ? Posts : true +abs(TotalViews / 0) +int(TotalViews ** TotalViews) +string(none(Posts, true)) +{"JavaScript": Authors, " ": Authors}.ID +min(TotalViews ^ 0.5) +{"JavaScript": 0.5}.Comments +get(Authors, 0).LastName +{"JavaScript": TotalViews}?.PublishDate +TotalViews - TotalViews + 0.5 +float(abs(TotalViews)) +map(Posts, 2 .. TotalViews) +any(Posts, TotalViews in Authors) +map(map(Posts, Posts), map(Posts, false)) +one(Posts, 0 < 1) +map(Posts, map(Posts, false)) +Posts[-1] +float(string(TotalViews)) +TotalViews % (0 + 1) +TotalViews ^ (TotalViews + 2) +any(Posts, 0 < 0) +any(Posts, TotalViews > 1) +abs(TotalViews) in map(Posts, Authors) +float(TotalViews ^ TotalViews) +all(Posts, nil == TotalViews) +all(Posts, TotalViews in Authors) +max(min(TotalViews)) +TotalViews < 2 / TotalViews +max(len(Posts), TotalViews) +min(-(TotalViews % TotalViews)) +count(Posts, true) / TotalViews +fromJSON(toJSON(0.5)) +TotalViews >= 0 ^ TotalViews +int(2 ^ TotalViews) +not (0 <= 1) +!(TotalViews >= 0.5) +min(TotalViews ** TotalViews) +TotalViews ** TotalViews != TotalViews / 0 +map(Posts, map(Posts, TotalViews)) +!(0 < TotalViews) +0 in Posts ? TotalViews : Authors +abs(2 - TotalViews) +TotalViews .. TotalViews - 0 +not (" " matches " ") +any(Posts, TotalViews < TotalViews) +Authors[1]?.Email +TotalViews < 0.5 * TotalViews +map(Posts, #?.ID) +get(Authors, -(TotalViews + TotalViews)) +not (TotalViews < 2) +get(Posts, abs(TotalViews)) +TotalViews * 0 == TotalViews +TotalViews / TotalViews < TotalViews +get(Posts, 2)?.Comments +filter(Posts, true != nil) +[1 ** 0] +max(abs(TotalViews)) +string(max(1)) +(2 - TotalViews) / TotalViews +TotalViews != TotalViews ^ TotalViews +TotalViews != 0.5 ? Posts : Posts +min(1 ** 0.5, min(TotalViews)) +-max(0.5, TotalViews) +string(get(Posts, 1)) +none(Posts, 0 >= TotalViews) +TotalViews > count(Posts, true) +none(Posts, nil == TotalViews) +any(Posts, 0 >= TotalViews) +{"Go": TotalViews}.Content?.Likes +map(Posts, TotalViews % TotalViews) +float(1) ** TotalViews +int(TotalViews ** 1) +TotalViews >= TotalViews + 1 +TotalViews * TotalViews / 1 +len(Authors) ^ TotalViews +any(Posts, !false) +Authors[1]?.ID +Posts[0].Comments +Authors != Authors && TotalViews <= TotalViews +max(-0.5) +all(Posts, nil != 1) +last(filter(Posts, true)) +min(int(TotalViews)) +Posts[2]?.ID +map(0 .. 0, TotalViews) +last(Posts[TotalViews:TotalViews]) +abs(2 ^ 0.5) +WithID(Posts, 1).Likes +int(min(1)) +int(false ? TotalViews : TotalViews) +TotalViews + 0 ** TotalViews +float(0 % TotalViews) +map(Posts, .Title) +Authors != Authors && TotalViews > TotalViews +not true ? 0 : 0.5 +(TotalViews % TotalViews) ** TotalViews +0 + TotalViews - TotalViews +TotalViews * 1 .. TotalViews +string(Authors != Authors) +int(TotalViews - 0) +map(Posts, !true) +string(max(max(TotalViews))) +min(TotalViews) ^ TotalViews +!(1 != nil) +!("Go" != " ") +map(TotalViews .. TotalViews, Posts) +-(0 / 0.5) +string(map(Posts, 1)) +{"JavaScript": Posts, "Go": " "}?.PublishDate +not (nil != nil) +-(TotalViews % 2) +one(Posts, 1 in Posts) +TotalViews < TotalViews ** TotalViews +len(true ? Posts : TotalViews) +map(Posts, count(Posts, false)) +toJSON(2 ^ 1) +{"JavaScript": Authors}?.AuthorName +get(Authors, 0).Profile +TotalViews / 0 > max(0) +TotalViews - TotalViews * 2 +-(TotalViews % 1) +{"JavaScript": 0 == TotalViews} +TotalViews * TotalViews ^ TotalViews +max(0.5) != 0 ? TotalViews : true +TotalViews + TotalViews ** 0.5 +Title(get(Posts, 1)) +min(TotalViews) in filter(Posts, false) +string(not true) +len(toJSON(TotalViews)) +TotalViews * TotalViews == TotalViews * TotalViews +-(0.5 ** 0) +TotalViews <= abs(TotalViews) +min(TotalViews + TotalViews) +all(map(Posts, 0.5), TotalViews < 2) +string(TotalViews - 1) +(TotalViews + 0) % TotalViews +{" ": Authors}?.Content +len(string(TotalViews)) +not (nil == TotalViews) +map(map(Posts, TotalViews), Authors) +toJSON(TotalViews / 2) +one(map(Posts, Posts), none(Posts, false)) +max(max(0.5)) +toJSON(false ? Authors : Posts) +Title(get(Posts, 0)) +min(min(TotalViews)) +trim(toJSON(" ")) +max(TotalViews / TotalViews) +map(Posts, # != WithID(Posts, TotalViews)) +min(max(0)) +map(Posts, true and false) +(TotalViews / 0) ^ TotalViews +{" ": TotalViews, " ": TotalViews}?.Comments +float(count(Posts, false)) +string(WithID(Posts, TotalViews)) +TotalViews >= -0 +all([true, Posts], TotalViews <= TotalViews) +Posts == Posts ? Authors : 0.5 +!true ? true : TotalViews +not any(Posts, true) +2 + 0 .. TotalViews +!(0.5 == nil) +{"JavaScript": Posts, " ": Posts}.Biography +TotalViews >= 0.5 - TotalViews +first(map(Posts, TotalViews)) +TotalViews ^ (1 / TotalViews) +count(Posts, 0.5 >= 1) +{"JavaScript": TotalViews}.ID +all(Posts, any(Posts, false)) +TotalViews != 0 == false +map(Posts, get(Posts, 0)) +count(Posts, nil in Authors) +int(-TotalViews) +none(Posts, 0 < TotalViews) +toJSON(0 in Authors) +toJSON(trim("Go")) +toJSON(int(2)) +-len("JavaScript") +!(nil != Authors) +get(Posts, 0).Tags +string(get(Authors, TotalViews)) +Posts[0]?.Content +TotalViews / 0 / TotalViews +not (1 > TotalViews) +first(Posts)?.Title +!not false +get(Posts, 1)?.Title +all(Posts, one(Posts, false)) +Posts[0].Tags +toJSON(Posts[0]) +Posts[2].Likes +TotalViews - min(TotalViews) +-(0.5 - 0) +toJSON(TotalViews - TotalViews) +WithID(Posts, 0 - TotalViews) +false ? TotalViews : TotalViews > TotalViews +filter(Posts, nil == Authors) +!true and Authors == Authors +-0.5 ^ TotalViews ** TotalViews +TotalViews - 1 ** TotalViews +not (2 > TotalViews) +TotalViews >= -TotalViews +TotalViews ^ TotalViews > TotalViews ? TotalViews : Posts +0 * 0 * TotalViews +not (nil in Authors) +Posts[0]?.PublishDate +TotalViews ** 0.5 / TotalViews +not (0.5 > 0.5) +{"Go": TotalViews < 0}?.Author +-len(Authors) +0.5 ^ TotalViews - TotalViews +!not true +TotalViews == TotalViews + 0 +Authors[nil]?.Profile +TotalViews != 0 ^ TotalViews +-1 in Authors +TotalViews <= 1 ? Authors : Authors +2 + TotalViews + TotalViews +string({" ": Authors}) +map(Posts, trim(string(nil))) +int(TotalViews - TotalViews) +toBase64(string(Authors)) +max(TotalViews * TotalViews) +not ("JavaScript" != nil) +float(0 + 2) +IsZero(get(Posts, 1)) +TotalViews * len(Posts) +string(true ? TotalViews : Posts) +float(-TotalViews) +0 ^ 0 - TotalViews +TotalViews != 1 ? false : 0 +toJSON(map(Posts, Posts)) +min(abs(0)) +len(map(Posts, Authors)) +get(false ? Authors : 0, TotalViews) +last(Posts[1:TotalViews]) +none(Posts, TotalViews != nil) +filter(Posts, 0 in Authors) +map(Posts, 0 + TotalViews) +map(Posts, Posts[1]) +TotalViews - TotalViews >= -TotalViews +0.5 ** TotalViews <= TotalViews +Authors == nil ? "Go" : true +int(TotalViews) < TotalViews +max(min(0.5, 0)) +any(Posts, none(Posts, TotalViews != nil)) +one(Posts, nil != Authors) +string(nil == "JavaScript") +none(Posts, nil != Posts) +!(0 != nil) +TotalViews == 1 ^ TotalViews +TotalViews * (TotalViews - 0) +not true ? Authors : TotalViews +TotalViews != TotalViews ? -TotalViews : Authors +TotalViews + TotalViews / 2 +map(0 .. TotalViews, #) +TotalViews ** (TotalViews / TotalViews) +any(Posts, TotalViews > TotalViews) +abs(min(TotalViews)) +TotalViews >= int(TotalViews) +lower(true ? "Go" : Posts) +max(1 / TotalViews) > TotalViews +map(Posts, TotalViews % 2) +int(toJSON(TotalViews)) +string(toJSON(false)) +!(0.5 <= 2) +upper(string(false)) +first(Posts).Comments +Posts[0]?.Title +len(0 .. TotalViews) +WithID(Posts, 1).ID +Authors == Authors && nil in Posts +{"Go": Authors, " ": Posts}?.Birthday +any(Posts, 1 > 0) +!(TotalViews != 0.5) +last(Posts)?.Author.FirstName +{"JavaScript": 0.5, " ": 0}.Tags +get(Authors, 1).Email +max(int(TotalViews)) +TotalViews ** 0 != TotalViews +all(Posts, 0 == TotalViews) +int(TotalViews / 0) +not (TotalViews <= TotalViews) +map(Posts, int(1)) +toJSON(0 in Posts) +count(Posts, true) != TotalViews +map(Posts, .Likes) +get(Posts, 1).Content +TotalViews / TotalViews / (0 - 0) +[false ? Posts : Posts] +get(Posts, 1).Author +TotalViews + 0.5 >= -2 +Authors == Authors ? TotalViews : Posts +one(Posts, TotalViews == TotalViews) +toJSON(TotalViews != TotalViews) +toJSON(TotalViews >= TotalViews) +TotalViews + TotalViews ^ 0 +not (TotalViews != 0.5) +TotalViews < TotalViews ^ TotalViews +map(Posts[0:TotalViews], TotalViews) +IsZero(Posts[1]) +!(0 <= TotalViews) +TotalViews / TotalViews >= TotalViews + TotalViews +none(TotalViews .. 0, Posts == Posts) +toJSON(float(0)) +!(TotalViews <= 0.5) +count(Posts, 2 >= 0.5) +Authors[-TotalViews] +{"Go": Authors, "Go": false}?.ID +count(Posts, true) <= TotalViews ? TotalViews : Posts +string(0 % TotalViews) +{"Go": 2, " ": nil, "JavaScript": TotalViews, "JavaScript": "JavaScript"}.Birthday +toJSON(filter(Posts, true)) +[Posts != Posts] +Posts[2].Author +get(Posts[TotalViews:TotalViews], TotalViews) +TotalViews + TotalViews != TotalViews +toBase64(string("Go")) +one(Posts, 0 == 2) +max(0 ** 1) +int(TotalViews ** 0) +map(map(Posts, true), TotalViews / TotalViews) +filter(Posts, 1 >= TotalViews) +TotalViews % TotalViews % TotalViews +float(int(TotalViews)) +TotalViews * 0 ^ 0.5 +none(map(Posts, Authors), TotalViews == 0.5) +TotalViews * TotalViews in map(Posts, 0) +abs(0.5 + 2) +filter(Posts, TotalViews < TotalViews) +get(Posts, TotalViews + 0) +{"JavaScript": true}?.Content +TotalViews == nil ? TotalViews : Authors +!(false and true) +not ("JavaScript" == nil) +last(TotalViews .. TotalViews) +TotalViews < TotalViews % TotalViews +TotalViews in Posts ? Posts : " " +max(TotalViews + 1) +string(2 in Posts) +one(Posts, Authors == Authors) +Posts != Posts ? TotalViews : TotalViews +TotalViews - 0 + TotalViews +map(Posts, TotalViews ** TotalViews) +TotalViews ^ TotalViews / 0 ** TotalViews +not (nil != TotalViews) +TotalViews - TotalViews .. TotalViews +!(nil == 0) +!(1 <= TotalViews) +int(TotalViews) + TotalViews +get(Authors, 2)?.ID +TotalViews <= 0 != false +map(map(Posts, 0.5), #) +get(Posts, 2)?.PublishDate +abs(TotalViews) + TotalViews +float(TotalViews) <= TotalViews +IsAdmin(Authors[2]) +Authors[-2] +map(Posts, 0 > 0.5) +string(true ? " " : "JavaScript") +!IsZero(Posts[1]) +-0 > TotalViews +abs(TotalViews + TotalViews) +Posts == map(Posts, Posts) +abs(-0) +0 - TotalViews < TotalViews +Authors != nil ? Authors : splitAfter("Go", nil) +one(map(Posts, Posts), 0 > 0.5) +not true ? Posts : "Go" +-0.5 ^ TotalViews +(TotalViews - TotalViews) ** TotalViews +float(int(0)) +!("JavaScript" matches "JavaScript") +not (Authors == nil) +-0.5 > TotalViews +get(map(Posts, 1), TotalViews) +TotalViews == TotalViews + TotalViews +filter(Posts, TotalViews <= 0) +TotalViews % (TotalViews + 1) +{" ": Posts}.CommentDate +2 + 0 - TotalViews +Posts[2].Comments +any(Posts, 0 in Posts) +count(Posts, TotalViews == 0) +{"JavaScript": TotalViews}?.FirstName +min(0.5 + TotalViews) +max(-TotalViews) +map(filter(Posts, true), TotalViews) +TotalViews / 0 - TotalViews +max(TotalViews - 0) +get(Posts, 1)?.ID +false ? TotalViews : 0 >= TotalViews +-int(1) +one(map(Posts, TotalViews), TotalViews >= TotalViews) +last(true ? Posts : 0) +not any(Posts, false) +{" ": " ", "Go": 1}?.Upvotes +get(Authors, 0)?.LastName +TotalViews ^ 2 ** 0 +string(nil == TotalViews) +not (0 > 2) +not true ? map(Posts, Posts) : Posts +TotalViews >= min(TotalViews) +Posts != Posts || TotalViews <= TotalViews +get(Posts, 2 % TotalViews) +map(TotalViews .. TotalViews, Authors) +int(2) > len(" ") +TotalViews <= TotalViews - TotalViews +TotalViews - TotalViews - TotalViews +last(TotalViews .. 1) +string(TotalViews) in first(Posts) +TotalViews <= 0.5 + TotalViews +Authors[nil]?.FirstName +TotalViews - int(0) +get(Posts, 0).Author +all(Posts, Authors != Authors) +get(false ? 2 : Posts, TotalViews) +not (0.5 <= 0) +max(TotalViews) == TotalViews +TotalViews ^ max(0) +toJSON(get(Posts, 0)) +map(Posts, 2 ** TotalViews) +float(TotalViews) / TotalViews ** 1 +!(0.5 < 0) +get(Authors, 2).ID +TotalViews / 1 ** 1 +last(Authors == Authors ? true : "Go") +count(map(Posts, false), #) +all(Posts, TotalViews < 1) +TotalViews % TotalViews == max(TotalViews) +all(Posts, !false) +{"JavaScript": 0}.CommentDate +{"Go": true, "Go": nil}?.Email +float(get(Authors, TotalViews).ID) +TotalViews ^ (0 + TotalViews) +Authors[1].ID +count(Posts, TotalViews < TotalViews) +!(0 == 0) +float(max(TotalViews)) +-TotalViews - TotalViews +TotalViews == 2 + TotalViews +float(TotalViews) / TotalViews +TotalViews / count(Posts, true) +min(TotalViews / TotalViews) +count(Posts, TotalViews > 0) +map(Posts[TotalViews:TotalViews], Authors) +toJSON(TotalViews <= 0) +get(Authors, 0).Email +string(0 != nil) +string(Posts != Posts) +Posts != Posts ? false : 0 +-(0 * TotalViews) +-float(0.5) +Posts != map(Posts, "JavaScript") +TotalViews <= 0.5 / 0.5 +-(1 + TotalViews) +TotalViews != nil ? Posts : "Go" +max(0) * TotalViews +TotalViews / min(TotalViews) +count(Posts, true == false) +TotalViews != TotalViews ? 0 : Authors +WithID(Posts, TotalViews).Likes +TotalViews % TotalViews in map(Posts, Posts) +{"Go": TotalViews}.Likes +one(Posts, 0.5 <= 0.5) +TotalViews >= 0.5 + 1 +TotalViews > TotalViews ? nil : nil +abs(TotalViews - 0) +TotalViews > TotalViews - 0 +toJSON(TotalViews * 0) +get(Authors, 0 + 2) +max(TotalViews) ^ TotalViews +Posts[2 + 0] +(0 - TotalViews) / TotalViews * TotalViews +len(map(Posts, Posts)) +all(Posts, 0 == 0.5) +toJSON(!(nil == Posts)) +!("JavaScript" != nil) +get(Authors, 0 * TotalViews) +Authors[TotalViews - TotalViews] +{"Go": Authors}?.ID +{"JavaScript": TotalViews}.Biography?.Age(TotalViews) +TotalViews * 0 < TotalViews +(TotalViews + TotalViews) ** TotalViews +TotalViews + TotalViews > TotalViews +map(map(Posts, Posts), Authors) +IsZero(Posts[2]) +TotalViews >= 0 ** 0 +!(2 > TotalViews) +TotalViews - TotalViews < TotalViews +get(Posts, 0)?.Tags +min(1 - 0) +min(count(Posts, false)) +1 * TotalViews - TotalViews +Authors == Authors != nil ? Posts : Authors +!(TotalViews < 0) +Posts != Posts ? Posts : -TotalViews +TotalViews == abs(TotalViews) +string([Posts]) +TotalViews ** -0 +TotalViews != 2 * TotalViews +-2 == TotalViews +first(Posts).Content +any(Posts, TotalViews > 0) +TotalViews ^ (0 / TotalViews) +Authors == nil ? "JavaScript" : TotalViews +toJSON(1 < 1) +-(0.5 + 0) +none(Posts, TotalViews < TotalViews) +Posts == nil ? Authors : TotalViews +get(true ? "Go" : Authors, 0.5 <= TotalViews) +TotalViews ^ TotalViews <= TotalViews +any(Posts, 2 < TotalViews) +{" ": Authors}.ID +map(Posts[TotalViews:TotalViews], #) +string(all(Posts, true)) +count(Posts, TotalViews > TotalViews) +one(Posts, nil in Posts) +not (0.5 < TotalViews) +string(nil == Authors) +all(map(Posts, Posts), TotalViews != TotalViews) +map(map(Posts, TotalViews), toJSON(0.5)) +Add(1, 2) / (TotalViews + TotalViews) +false ? nil : TotalViews >= 0.5 ** TotalViews +all(Posts, all(Posts, true)) +{" ": Authors}?.Email +{"Go": 0.5, "Go": Authors}.Tags +filter(Posts, Posts != nil) +filter(Posts, all(Posts, false)) +min(TotalViews) ** TotalViews +all(map(Posts, Authors), 1 >= 0.5) +none(Posts, "Go" == "Go") +{" ": Authors, " ": nil != 1} +string(last(Posts)) +string(2 == 1) +IsAdmin(Authors[1]) +0 .. 0 != Posts +--(0.5 / TotalViews) +TotalViews - TotalViews + TotalViews +any(Posts, TotalViews == 0) +map(Posts, -0.5) +-(0.5 + TotalViews) +string({"JavaScript": Posts, " ": Authors}.Title) +any(Posts, nil == TotalViews) +toJSON(int(TotalViews)) +1 * TotalViews - TotalViews % TotalViews +TotalViews == TotalViews == nil +len(Authors) * 0.5 ** TotalViews +int(len(Authors)) +count(Posts, true) > TotalViews +len(map(Posts, 2)) +not true ? TotalViews : false +filter(Posts, IsZero(#)) +one(Posts, TotalViews in Authors) +-(2 + 0) +float(TotalViews + TotalViews) +{" ": Posts, "Go": Posts} +none(Posts, any(Posts, false)) +!(1 in Authors) +get(true ? Posts : Authors, string(Authors, Posts, TotalViews)) +TotalViews / TotalViews >= 0 / TotalViews +TotalViews <= TotalViews ? Authors : Posts +0 ** 1 < TotalViews +not !false +float(-2) +TotalViews - 0 .. TotalViews + 1 +toJSON(nil != Posts) +map(Posts, 0 in Posts) +true ? Posts : TotalViews > TotalViews +map(Posts, .PublishDate) +any(Posts, TotalViews <= 0) +map(TotalViews .. TotalViews, #) +Authors[0]?.Email +{"JavaScript": true, " ": TotalViews}.Comments +{" ": Authors}.Website +-count(Posts, false) +toJSON(1 < TotalViews) +Title(WithID(Posts, 1)) +map(Posts, 0) != Posts +int(TotalViews + TotalViews) +float(-0) +--2 +get(Authors, 1 * TotalViews) +-max(0) +0 * TotalViews - TotalViews +TotalViews > 0 ? nil : 0 +int(0.5 / TotalViews) +WithID(Posts, 0).Tags +all(Posts, 0 >= TotalViews) +min(TotalViews - TotalViews) +get(Posts, 0)?.Comments +string(TotalViews in Authors) +TotalViews ^ (0.5 * TotalViews) +one(Posts, nil == nil) +string(TotalViews == 0.5) +TotalViews ^ min(TotalViews) +toJSON(Posts[TotalViews:1]) +abs(1 ** TotalViews) +min(2 + TotalViews) +TotalViews < len(Posts) +not (nil == Authors) +{"Go": Authors, "JavaScript": TotalViews}.ID +map(Posts, TotalViews != TotalViews) +toJSON(Posts != Posts) +map(2 .. TotalViews, TotalViews) +get(Authors, len(Authors)) +get(Authors, count(Posts, true)) +map(Posts, 0 - TotalViews) +TotalViews ^ TotalViews - TotalViews +TotalViews ^ (TotalViews - TotalViews) +int(TotalViews % TotalViews) +{"Go": Posts, " ": Posts} +min(abs(2)) +string(0 * 0.5) +TotalViews >= TotalViews || TotalViews == nil +get(Posts, 2)?.ID +get(Authors, 1).FirstName +abs(0 - 0) +TotalViews * 1 != TotalViews +float(TotalViews * 0.5) +any(Posts, 1 in Authors) +map(Posts, 2) != Posts +get(true ? Authors : nil, TotalViews) +not (TotalViews > 1) +none(map(Posts, TotalViews), true == false) +TotalViews / abs(TotalViews) +TotalViews == TotalViews ? 2 : Posts +TotalViews <= 0.5 ? Authors : TotalViews +toJSON(nil == 0) +string(TotalViews != nil) +any(Posts, TotalViews > 2) +all(map(Posts, Authors), nil in Posts) +abs(Sub(0, 0)) +Posts == TotalViews .. 0 +WithID(Posts, 1)?.ID +not (0 > TotalViews) +one(Posts, nil == TotalViews) +map(true ? Posts : TotalViews, TotalViews) +Authors[int(TotalViews)] +TotalViews < TotalViews + TotalViews +toJSON("JavaScript" > "JavaScript") +TotalViews - TotalViews > TotalViews +{"Go": TotalViews != TotalViews} +int(-0) +toJSON(TotalViews ^ 0) +TotalViews != TotalViews ? Posts : (false ? TotalViews : 1) +map(Posts, Authors[nil]) +map(Posts[0:TotalViews], "JavaScript" == "JavaScript") +TotalViews * TotalViews .. TotalViews +TotalViews ^ (TotalViews - 0.5) +abs(1 + TotalViews) +TotalViews <= count(Posts, false) +nil == Posts && TotalViews > TotalViews +toJSON(false ? 2 : nil) +toJSON(max(1)) +min(TotalViews * 1) +TotalViews != TotalViews ? Posts : 1 +-(TotalViews ^ 0) +int(2) <= TotalViews +-TotalViews == 0 - TotalViews +WithID(Posts, 1).Tags +get(Authors, 2)?.LastName +TotalViews ^ 0.5 + TotalViews +toJSON(TotalViews + TotalViews) +any(Posts, 2 in Posts) +get(Authors, 2).Profile +Authors[1].Profile +TotalViews != 0.5 && nil == 0 +{" ": "JavaScript" <= "JavaScript"} +one(Posts, TotalViews == nil) +WithID(Posts, 1).Content +none(Posts, true or false) +max(TotalViews, TotalViews) - TotalViews +TotalViews - -1 +count(Posts, TotalViews in Posts) +Posts != Posts ? true : 0 +map(Posts, one(Posts, true)) +TotalViews .. TotalViews + TotalViews +string(nil == 2) +none(Posts, TotalViews < 0.5) +max(2 + TotalViews) +{"Go": false, "Go": 2}.ID +TotalViews ** Sub(0.5, 0) +!(nil != nil and Authors == Authors) +get(Authors, 0)?.FirstName +map(Posts, map(Posts, Posts)) +map(Posts, 0 ^ 2) +{"Go": TotalViews, " ": Authors}.CommentDate +{" ": Posts}.Content +one(Posts, not false) +abs(TotalViews) in Authors +max(0, TotalViews) >= TotalViews - TotalViews +TotalViews + abs(0) +min(len(" ")) +max(count(Posts, false)) +Posts == TotalViews .. TotalViews +0.5 + TotalViews == TotalViews +TotalViews % TotalViews * 1 +Posts[1].Author +Posts == map(Posts, Authors) +string(TotalViews * TotalViews) +not true ? Posts : Authors +min(TotalViews) * 0 * 2 +float(TotalViews) > TotalViews +abs(0.5 / TotalViews) +not (TotalViews < 0) +Authors[1]?.Profile +map(map(Posts, Authors), toJSON(Authors)) +first(1 .. TotalViews) +last(Posts)?.Comments +!("Go" == nil) +abs(0) / TotalViews * TotalViews +toJSON(Posts != nil) +min(-0.5) +TotalViews > 0 / TotalViews +0.5 ** 0 - TotalViews +filter(Posts, 2 == 0) +int(TotalViews) <= TotalViews +get(Authors, -TotalViews) +map(Posts, nil != Authors) +one(Posts, 0.5 == TotalViews) +map(map(Posts, Authors), map(Posts, Posts)) +toJSON(Authors[nil]) +Posts[1].PublishDate +map(Posts, get(Authors, TotalViews)) +-(1 - TotalViews) +{"JavaScript": Posts}.Profile +map(Posts, TotalViews ^ TotalViews) +TotalViews >= 0.5 ? TotalViews : TotalViews +0 - TotalViews + TotalViews +TotalViews != nil ? TotalViews : 0 > TotalViews +2 >= TotalViews || TotalViews <= 2 +TotalViews != TotalViews ? Authors : TotalViews +all([Posts, 0, TotalViews], 2 in Posts) +min(1 ** 0) +{"Go": true}.CommentDate?.Email +abs(TotalViews) < TotalViews +TotalViews ^ (0.5 + TotalViews) +map(Posts, TotalViews - TotalViews) +any(Posts, 1 <= TotalViews) +not false ? Authors : Posts +abs(0 ** TotalViews) +false ? nil : TotalViews == TotalViews +int(1) + TotalViews +[map(Posts, Authors)] +TotalViews * 2 + TotalViews +toJSON(0.5 > 0) +TotalViews * TotalViews == nil ? 0 : TotalViews +WithID(Posts, TotalViews)?.Likes +TotalViews * TotalViews >= TotalViews ? nil : Authors +!(2 == nil) +1 ** 1 <= TotalViews +string(TotalViews <= TotalViews) +TotalViews ** get(Authors, 1).ID +(TotalViews / TotalViews) ** TotalViews +toJSON(TotalViews - 0.5) +float(0.5 / TotalViews) +{"JavaScript": nil, " ": TotalViews, "JavaScript": true, "Go": TotalViews, "Go": TotalViews}?.PublishDate?.ID?.Profile +-(2 + TotalViews) +any(Posts, 0 > TotalViews) +TotalViews + TotalViews / TotalViews +TotalViews != nil ? Authors : " " +not (nil == Posts) +get(Posts, 1)?.PublishDate +TotalViews - TotalViews ** TotalViews +{"JavaScript": Authors}?.ID?.Biography +map(Posts, TotalViews - 1) +{" ": 0.5}.ID +Authors == Authors and TotalViews in Posts +min(TotalViews) >= TotalViews +-(2 ** 1) +TotalViews ^ TotalViews < TotalViews +!all(Posts, true) +any(Posts, nil == true) +{" ": 0.5}?.ID +TotalViews <= TotalViews ^ TotalViews +none(map(Posts, TotalViews), Authors == nil) +!(0 == 0.5) +TotalViews + abs(TotalViews) +{"Go": TotalViews, "Go": nil, " ": Authors}?.Profile?.Upvotes +string(get(Posts, 0)) +get(Posts, false ? Authors : Posts) +TotalViews == TotalViews ^ TotalViews +none(Posts, nil in Authors) +!(0 != TotalViews) +map(Posts, #) != Posts +{"JavaScript": TotalViews}.Biography +toJSON(TotalViews >= 0) +-get(Authors, 0)?.ID +TotalViews > TotalViews / 0 +all(Posts, 0 <= 0) +get(Posts, -TotalViews) +not true ? nil : nil +int(TotalViews) ** TotalViews +map(Posts, TotalViews < 0) +trim(false ? Posts : " ") +TotalViews in 1 .. TotalViews +TotalViews == Authors[TotalViews].ID +string(1 * TotalViews) +TotalViews + TotalViews in Authors +TotalViews ** 0 ** TotalViews +float(max(0.5)) +!(nil in Posts) +{" ": Authors}?.Upvotes +one([" "], 1 != 0.5) +string(not (0.5 >= TotalViews)) +get(true ? Authors : false, "Go" matches "JavaScript") +TotalViews % TotalViews > TotalViews +string(Posts == nil) +{" ": TotalViews}?.Upvotes +Posts[1].Comments +0.5 ** 0 != TotalViews +any(Posts, Posts == Posts) +any(filter(Posts, true), 0 != TotalViews) +2 / TotalViews < TotalViews +TotalViews / 1 == TotalViews +TotalViews ^ (TotalViews + 0.5) +filter(Posts, any(Posts, false)) +not ("JavaScript" startsWith "Go") +min(TotalViews) % TotalViews +0 ^ 1 / TotalViews +TotalViews > TotalViews ? true : 0 +one(map(Posts, Authors), Authors == Authors) +toJSON(!true) +TotalViews >= TotalViews == nil +toJSON(all(Posts, true)) +toJSON(0 == TotalViews) +TotalViews - TotalViews != TotalViews +TotalViews > TotalViews / TotalViews +TotalViews + 0 / TotalViews +[len(Authors)] +fromJSON(string(TotalViews)) +toJSON(2 / TotalViews) +TotalViews .. TotalViews == Posts +TotalViews ^ 0 == TotalViews +TotalViews > TotalViews && Posts == Posts +-TotalViews + TotalViews +abs(2) < TotalViews ? TotalViews : Authors +int(TotalViews + 0) +TotalViews >= TotalViews ? Posts : Authors +Posts[min(1)] +toJSON(nil == 1) +0.5 ** TotalViews < 0.5 ^ TotalViews +(TotalViews + TotalViews) ^ max(1) +string(upper("Go")) +-TotalViews + 0 * TotalViews +{"Go": Posts}.Website +TotalViews in Posts ? nil : 0 +TotalViews >= TotalViews / 2 +-(TotalViews - 0.5) +map(Posts, true ? TotalViews : Authors) +map(Posts, Posts == Posts) +string(TotalViews != 0.5) +max(TotalViews) != TotalViews % 2 +max(TotalViews + 2) +map(Posts, TotalViews * TotalViews) +all(Posts, TotalViews != TotalViews) +Posts[2].Content +map(Posts, TotalViews / 0) +one(map(Posts, TotalViews), !false) +map([Posts, false, Authors], #) +-(0 % TotalViews) +count(Posts, TotalViews == TotalViews) +{"JavaScript": Posts, "Go": "Go"}.Likes +TotalViews - max(0) +WithID(Posts, 2).ID +toJSON(0 >= TotalViews) +-(1 % TotalViews) +Add(0, 1) ** TotalViews +string("Go" != "JavaScript") +one(false ? Posts : Authors, nil != Authors) +(TotalViews + TotalViews) % TotalViews +!(0 > 2) +min(TotalViews) .. TotalViews +TotalViews < len(Authors) +toJSON(nil != TotalViews) +none(Posts, !false) +[Posts, Authors] +last(Posts)?.PublishDate +0 != nil or TotalViews != nil +get(Authors, min(2)) +toJSON(2 == nil) +{"Go": TotalViews}.Upvotes +get(Authors, TotalViews - TotalViews) +last(filter(Posts, false)) +TotalViews ^ TotalViews >= 1 * TotalViews +one(Posts, TotalViews == 0) +trim(string(TotalViews)) +-TotalViews < TotalViews +not false ? 1 : Posts +TotalViews ^ TotalViews ** (TotalViews - 0.5) +any(Posts, 0.5 != 2) +-0 in Posts +nil != Posts ? TotalViews : abs(TotalViews) +{"JavaScript": Authors}.ID +map(Posts, 0.5 + TotalViews) +2 / TotalViews != TotalViews +filter(Posts, 0 <= TotalViews) +map(Posts, Authors) == Posts +map(Posts, nil == " ") +string(TotalViews > 0.5) +string(TotalViews != 0) +toJSON(len(Posts)) +get(Posts, 0).Likes +Authors[len(Authors)] +{"Go": TotalViews, "Go": TotalViews}?.Biography +TotalViews != count(Posts, true) +[Authors, TotalViews, TotalViews] == Posts +len(Authors) != max(TotalViews) +!(TotalViews + 0.5 >= TotalViews) +int(1 ** TotalViews) +{" ": TotalViews, "Go": nil}?.PublishDate +TotalViews == 0 ? 0.5 : Posts +not (TotalViews < TotalViews) +TotalViews == 0 and TotalViews >= TotalViews +!(" " endsWith " ") +none(Posts, TotalViews < 0) +TotalViews == TotalViews ? TotalViews : 0 +0 ^ 0 >= TotalViews +max(float(0.5)) +filter(Posts, Posts != Posts) +-(1 % 1) +one(Posts, one(Posts, true)) +TotalViews ** float(1) +max(int(2)) +{"JavaScript": Authors, "Go": TotalViews, "Go": Authors, "Go": TotalViews}.Birthday +map(map(Posts, Posts), Posts) +get(false ? false : TotalViews, TotalViews) +one(Posts, TotalViews != TotalViews) +TotalViews >= len("JavaScript") +string(TotalViews <= 0) +true ? TotalViews : Posts != map(Posts, 0) +TotalViews ** (0 + TotalViews) +TotalViews == TotalViews / TotalViews +trim("JavaScript" + "Go") +{"JavaScript": TotalViews <= TotalViews} +string(TotalViews != TotalViews) +{" ": nil, "Go": TotalViews, "Go": TotalViews, " ": Posts, " ": Posts}?.Author +TotalViews % 2 <= TotalViews +TotalViews - 1 % TotalViews +Posts != Posts[TotalViews:TotalViews] +TotalViews != nil or Posts == nil +TotalViews + Add(0.5, 0) +TotalViews != TotalViews && TotalViews <= TotalViews +{"Go": Authors, "Go": Posts, "JavaScript": Authors}.Profile +TotalViews - -TotalViews +map(Posts, -0) +2 ^ TotalViews * TotalViews +-(TotalViews ^ 2) +TotalViews * 0 in Posts +TotalViews < TotalViews ? Authors : map(Posts, true) +-(TotalViews / 0.5 ** TotalViews) +TotalViews % 1 <= TotalViews +-TotalViews != TotalViews +!(TotalViews <= 1) +[Authors, Authors] +!(0 >= TotalViews) +0 * TotalViews + TotalViews +last(false ? TotalViews : Posts) +int(-2) +Add(1, 0.5) >= TotalViews +TotalViews <= TotalViews ? Authors : Authors +TotalViews != TotalViews % TotalViews +trim(string(Authors)) +none(TotalViews .. TotalViews, TotalViews >= TotalViews) +string(TotalViews - 2) +(TotalViews * TotalViews) ** (TotalViews - TotalViews) +abs(0.5) ** TotalViews +-1 + TotalViews +int(TotalViews ^ 0) +TotalViews > 0.5 ? Posts : nil +string(TotalViews in Posts) +string(1 in Authors) +TotalViews == TotalViews ? Authors : TotalViews +0.5 * TotalViews + max(0) +TotalViews * 2 * TotalViews +map(map(Posts, TotalViews), TotalViews - 0) +any(Posts, 0.5 < TotalViews) +TotalViews ** TotalViews <= TotalViews +Authors[2].Profile +none(map(Posts, Authors), 2 == 2) +count(Posts, false) - TotalViews +min(TotalViews) <= TotalViews +!(0.5 > 1) +not !true +TotalViews ** TotalViews / TotalViews +len(Authors) != TotalViews +int(0 ^ 2) +TotalViews <= TotalViews == nil +float(1 ** TotalViews) +TotalViews > 0.5 - TotalViews +TotalViews + min(TotalViews, TotalViews) +1 / TotalViews + TotalViews +filter(map(Posts, 0), nil != nil) +0.5 <= TotalViews or Posts == Posts +toJSON(any(Posts, true)) +string(true ? Posts : Authors) +string(count(Posts, true)) +none([Posts, Posts, 0.5, nil], 0 == TotalViews) +WithID(Posts, 0)?.ID +max(1 ^ TotalViews) +string(nil != 0.5) +not (TotalViews >= 1) +count(Posts, nil in Posts) +TotalViews > 1 % 2 +not (2 == TotalViews) +lower(string(TotalViews)) +toJSON(Authors) startsWith " " ? 0 : TotalViews +TotalViews ** TotalViews / int(TotalViews) +any(map(Posts, 0), 0 in Posts) +filter(Posts, 0.5 == 2) +not (2 != TotalViews) +string(false ? Authors : 0) +string(true ? Posts : TotalViews) +map(Posts, 1 ** 0) +fromJSON(string(false)) +TotalViews * Authors[TotalViews].ID +!(false or true) +one(Posts, nil != TotalViews) +last(TotalViews .. 0) +string(0.5 == nil) +TotalViews == TotalViews - TotalViews +TotalViews <= 0.5 ? nil : nil +float(TotalViews ** TotalViews) +toJSON(any(Posts, false)) +TotalViews / TotalViews == TotalViews +one([0.5], TotalViews in Posts) +toBase64(string(0)) +-(0.5 / 1) +filter(Posts, 0.5 != nil) +not (TotalViews <= 0) +(TotalViews - TotalViews) * TotalViews +map(true ? Authors : TotalViews, Posts) +not ("Go" < "Go") +max(float(TotalViews)) +!IsAdmin(Authors[nil]) +toJSON(map(Posts, TotalViews)) +0 * 0.5 / (TotalViews - TotalViews) +filter(Posts, not (nil != Posts)) +Posts[0 + 0] +TotalViews ^ (TotalViews / 1) +map(Posts, #?.Content) +{"Go": Authors}?.Author +not (0 != 1) +0 + TotalViews <= TotalViews +one(Posts, Authors != nil) +float(TotalViews) ^ TotalViews +TotalViews - TotalViews ^ TotalViews +!false ? Authors : 1 +WithID(Posts, TotalViews)?.PublishDate +max(TotalViews * 2) +get(Authors, 2)?.FirstName +get(Posts, 0 % TotalViews) +len(Posts) == TotalViews +get(Posts, 1 - 0) +{" ": Posts, " ": Authors}?.Biography +count(Posts, 0 <= TotalViews) +nil != Posts or TotalViews > TotalViews +toJSON(TotalViews == 0) +0 != TotalViews && TotalViews == nil +Title(Posts[0]) +TotalViews % TotalViews * TotalViews +min(TotalViews) > min(TotalViews) +none(Posts, TotalViews in Authors) +TotalViews != float(TotalViews) +map(map(Posts, 0), string(Posts)) +TotalViews ^ TotalViews ^ TotalViews +lower(string(nil)) +TotalViews <= 0.5 - 1 +string(2 % TotalViews) +WithID(Posts, TotalViews).Author.LastName +last(get(Posts, 2)?.Tags) +{" ": 0 != TotalViews} +max(TotalViews / 0) +int(2 / TotalViews) +none(Posts, nil in Posts) +abs(TotalViews ^ 0) +nil != Authors && false ? Posts : TotalViews +TotalViews ^ (TotalViews - 1) +IsAdmin(nil) || true ? TotalViews : Authors +TotalViews % TotalViews .. TotalViews +map(Posts, false or true) +int(max(TotalViews)) +TotalViews <= TotalViews != false +0 % TotalViews / TotalViews +not ("JavaScript" <= "JavaScript") +abs(TotalViews) != 0 ? TotalViews : TotalViews +TotalViews + TotalViews == TotalViews / TotalViews +not (nil != "Go") +TotalViews .. len(Authors) +get(Posts, 0)?.Author +TotalViews * TotalViews >= 0 + TotalViews +abs(float(TotalViews)) +string(2 - TotalViews) +TotalViews - TotalViews % TotalViews +-(2 % TotalViews) +[Authors[TotalViews]] +get(map(Posts, 0), -TotalViews) +max(len("JavaScript")) +map(Posts, .Tags) +-(2 ^ TotalViews) +-(TotalViews / 2) +string(2 + 0) +int(0.5) > TotalViews +all(Posts, TotalViews >= TotalViews) +len(toJSON(Authors)) +toJSON(TotalViews .. TotalViews) +abs(int(TotalViews)) +{"Go": true}.Tags +TotalViews ** 2 == TotalViews ? 0 : 2 +toJSON(TotalViews != nil) +count(Posts, 0 != 0) +TotalViews in Authors && TotalViews != TotalViews +toJSON(get(Authors, 0)) +TotalViews <= TotalViews ? 0 : nil +get(Authors, TotalViews + TotalViews) +0 * TotalViews > TotalViews +TotalViews > TotalViews ^ 0.5 +TotalViews ** -TotalViews +map(map(Posts, 0), get(Posts, TotalViews)) +map(Posts, max(TotalViews)) +max(TotalViews / 0.5) +(TotalViews - 1) ^ TotalViews +map(map(Posts, 0), Authors) +{"Go": get(Posts, TotalViews)} +TotalViews / TotalViews > 0.5 ? Posts : 0.5 +toJSON(count(Posts, false)) +not (2 <= 0) +len(Posts) % TotalViews +filter(Posts, 0 >= TotalViews) +1 / 2 + TotalViews +Posts[2].ID +{"JavaScript": " "}?.ID +fromJSON(toJSON(Posts)) +not (-TotalViews in Authors) +TotalViews + len(Posts) +TotalViews ** (TotalViews + TotalViews) +-1 .. -TotalViews +-0 == TotalViews +not not (Authors == Authors) +map(Posts, nil in Posts) +toJSON(TotalViews in Posts) +one(Posts, 0.5 < 0.5) +-(1 / 1) +2 in Authors || 1 > TotalViews +len(string(0)) +!true ? true : " " +nil != 0 and Posts == Posts +not true ? 0 : Authors +map(Posts, lower("Go")) +toJSON(nil in Authors) +Authors[2].Email +one(map(Posts, Posts), !true) +get(Authors, 1).Profile +TotalViews < abs(TotalViews) +toJSON(toJSON(Authors)) +toJSON(last(Posts)) +not (TotalViews != 2) +len(Posts) in Posts +-min(0) +" " >= "Go" && Authors != nil +{"Go": Authors, " ": 0.5, "JavaScript": nil, " ": 0, "JavaScript": Posts}?.PublishDate +TotalViews * 0.5 <= TotalViews * TotalViews +len(Authors) * TotalViews +Posts == map(Posts, 1) +TotalViews / 0.5 >= 0.5 ? " " : true +!(0 >= 0.5) +TotalViews < TotalViews * TotalViews +TotalViews ^ TotalViews <= max(0) +not (0 <= 2) +abs(TotalViews) > 2 == true +-int(2) +get(true ? Authors : 0, TotalViews) +string(0 == nil) +Posts != Posts ? 2 : Authors +string(2 / TotalViews) +count(Posts, Posts == nil) +!(nil in Authors) +{"JavaScript": false, "JavaScript": Posts, " ": TotalViews}.Title +2 % TotalViews >= TotalViews +toJSON(2 < 2) +TotalViews % TotalViews >= TotalViews ** TotalViews +int(0.5 ^ TotalViews) +TotalViews / 0.5 ** 1 +{"Go": Posts, " ": Posts, "Go": nil}.Author +TotalViews ^ 0.5 == 0.5 ? Posts : "JavaScript" +0 ** 0 ^ (TotalViews - 2) +first(false ? TotalViews : Posts) +int(0) in Posts +!one(Posts, false) +toJSON(abs(TotalViews)) +get(Posts, 2)?.Tags +Authors[TotalViews % 1] +min(0 % TotalViews) +string(Authors == Authors) +min(-0) +min(0) ^ -2 +count(Posts, "Go" != nil) +one(Posts, 0.5 < 0) +0 / TotalViews > TotalViews ? " " : 1 +first(false ? Posts : TotalViews) +Authors == Authors ? Authors : Authors +map(Posts, Posts) != Posts +map(Posts, false == false) +any(Posts, true) && TotalViews == TotalViews +get(Authors, TotalViews * TotalViews) +TotalViews * 0 / float(TotalViews) +Posts == map(Posts, "Go") +TotalViews < TotalViews - 0.5 +not (TotalViews >= 2) +0 ** TotalViews + TotalViews / TotalViews +TotalViews * 0 + 1 / TotalViews +string(!(nil in Posts)) +none(map(Posts, 1), TotalViews != TotalViews) +!(0.5 <= 0) +TotalViews + 0 != TotalViews +int(float(2)) +not (true and true) +max(0.5 + TotalViews, TotalViews % TotalViews) +one(Posts, nil == Posts) +TotalViews / 0 < TotalViews ? TotalViews : 0.5 +TotalViews >= 0 - 0.5 +count(Posts, 0.5 > TotalViews) +float(TotalViews ^ 0.5) +get(Posts, 0)?.Title +abs(TotalViews ** 1) +true ? " " : TotalViews < TotalViews +not (0.5 > 0) +!(0.5 == TotalViews) +map(map(Posts, Authors), Posts) +TotalViews != TotalViews ** TotalViews +not all(map(Posts, "Go"), TotalViews != TotalViews) +int(0 * TotalViews) +max(TotalViews ^ 0.5) +TotalViews / TotalViews / TotalViews +Posts != map(Posts, TotalViews) +TotalViews / 2 ^ 0 +TotalViews > 1 ? TotalViews : TotalViews +-TotalViews < -TotalViews +{"Go": TotalViews}?.LastName +all(Posts, any(Posts, true)) +max(1 ** TotalViews) +max(TotalViews, TotalViews % TotalViews) +max(-(TotalViews * TotalViews)) +float(TotalViews + 1) +Posts[len(Authors)] +map(Posts, 0 != nil) +not (0.5 >= 0.5) +Authors[2 + TotalViews] +map(map(Posts, Posts), TotalViews != nil) +{"Go": "Go", "JavaScript": Posts}.Title +not (true == nil) +string(0 != 0) +TotalViews * 0.5 / TotalViews +int(TotalViews) / TotalViews +get(Posts, 1).Title +Posts != Posts == nil +TotalViews < 0 == nil +(TotalViews % 1) ** TotalViews +float(float(0.5)) +not (0 < 1) +!(0 < 1) +{" ": Posts, "Go": Posts, " ": TotalViews, "JavaScript": 0.5, " ": Posts}.ID +-(0 / 1) +{"JavaScript": Authors}?.Email +map(filter(Posts, true), Authors) +not true ? TotalViews : Posts +filter(Posts, nil != 2) +{" ": Posts, " ": TotalViews}.Comments +string(true && true) +Authors == Authors == nil +string(TotalViews >= TotalViews) +map(Posts, 0 == TotalViews) +last(filter(Posts, true)).Content +string(1 ^ 0) +TotalViews + TotalViews * 0 +len(map(Posts, true)) +not (1 < 2) +count(Posts, 0 != TotalViews) +TotalViews * TotalViews in Posts ? 2 : Authors +TotalViews != TotalViews ^ 1 +count(map(Posts, Authors), !false) +filter(Posts, TotalViews >= TotalViews) +filter(Posts, TotalViews >= 0) +max(0) ^ TotalViews +none(Posts, false) != false ? Authors : " " +TotalViews / (0.5 + TotalViews) +all(Posts, !true) +{"Go": Authors}.Author +none(Posts, 0.5 >= 0) +Posts == Posts != false +not (0.5 < 2) +min(1 ^ TotalViews) +any(Posts, # != #) +TotalViews ^ TotalViews > -TotalViews +-(0 ^ TotalViews) +TotalViews != TotalViews / TotalViews +abs(TotalViews / TotalViews) +WithID(Posts, 1 * 0) +TotalViews * TotalViews % TotalViews +len(Authors) < -TotalViews +Authors != Authors and Posts != nil +filter(Posts, nil == 1) +not (TotalViews != nil) +TotalViews >= 0.5 || Posts != nil +string(string(nil)) +Authors == Authors ? TotalViews : 0 +{"JavaScript": 0.5 > TotalViews, "JavaScript": Authors} +0.5 ^ TotalViews + TotalViews +one(Posts, Posts == Posts) +Posts == 1 .. TotalViews +[-2, Authors] +one(Posts, 1 == TotalViews) +abs(TotalViews) > min(0, 0.5) +0 ^ TotalViews - 0 % TotalViews +TotalViews ** 2 - TotalViews +TotalViews < TotalViews ** 2 +len(Authors) == TotalViews ** TotalViews +{"Go": TotalViews, "Go": TotalViews, " ": Posts, "JavaScript": Posts, "JavaScript": nil}.ID +min(1) != TotalViews +TotalViews - Sub(2, 0.5) +float(len(Posts)) +0 - TotalViews != float(TotalViews) +map(Posts[0:0], !false) +Posts[2]?.Comments +map(Posts, float(TotalViews % TotalViews)) +string(false ? false : nil) +min(TotalViews / 0) +all(Posts, 0.5 < TotalViews) +count(Posts, TotalViews > 1) +{" ": min(0), " ": -TotalViews} +max(TotalViews % 1) +TotalViews > abs(TotalViews) +TotalViews < 0.5 ? Authors : Posts +not (" " < " ") +TotalViews ^ float(0) +toJSON({" ": Authors}) +TotalViews * TotalViews * 0.5 +float(1 % TotalViews) +-0 % TotalViews +any(Posts, 2 != nil) +(0 / 0) ^ TotalViews ^ 0.5 +trim(toJSON(TotalViews)) +TotalViews / TotalViews + TotalViews +TotalViews / int(0.5) +{"JavaScript": map(Posts, Authors)}.Profile +duration(toJSON(0)) +upper(toJSON(TotalViews)) +toJSON(nil == nil) +Add(0, 0) > TotalViews ? Posts : 0.5 +max(1 / 0) +filter(Posts, nil == Posts) +2 ^ TotalViews > TotalViews +!true ? "Go" : Posts +map(true ? Authors : Posts, TotalViews) +min(0.5 * TotalViews) +" " contains "Go" or nil in Authors +one(Posts, 1 != 0) +-TotalViews < TotalViews == false +map(Posts, "Go" == "Go") +count(Posts, not false) +TotalViews >= 0.5 / 0 +len(Authors) / TotalViews / TotalViews +one(Posts, 2 == TotalViews) +TotalViews + 2 ^ 1 +-(0.5 * TotalViews) +[map(Posts, "JavaScript")] +none(Posts, 0 > TotalViews) +map(Posts, TotalViews == 0.5) +one(Posts, Posts != nil) +-max(0, TotalViews) +not (0 == 0.5) +map(Posts, map(Posts, Authors)) +0.5 ^ 0 ^ TotalViews ^ TotalViews +(TotalViews - 0.5) / TotalViews +min(count(Posts, true)) +TotalViews < TotalViews ** TotalViews - -TotalViews +last(map(Posts, false)) +map(map(Posts, Authors), Authors) +TotalViews ^ 0 >= TotalViews +len(true ? Posts : Posts) +Posts != Posts ? Posts : Posts +TotalViews == 0 / TotalViews +0 ** 0 >= TotalViews +TotalViews != 0 ? 0.5 : "Go" +len(trim(" ")) +{" ": nil}.Tags +TotalViews in Authors ? 0 : 2 +TotalViews ^ TotalViews != TotalViews +one(Posts, TotalViews >= TotalViews) +toJSON(true != true) +1 / TotalViews > TotalViews +TotalViews + TotalViews - max(TotalViews) +all(Posts, 1 <= TotalViews) +none(Posts, TotalViews >= 1) +max(0.5 / TotalViews) +TotalViews .. -TotalViews +Posts == Posts ? TotalViews : TotalViews +TotalViews ^ (Posts != nil ? TotalViews : Posts) +TotalViews == count(Posts, false) +0 % TotalViews + TotalViews +string(0.5 + 0) +all(map(Posts, Authors), Posts != Posts) +string(false ? " " : TotalViews) +toJSON(TotalViews * TotalViews) +0 / TotalViews - TotalViews +none(Posts, TotalViews != 2) +count(Posts, Authors != Authors) +0 + TotalViews < TotalViews +toJSON(upper("Go")) +TotalViews ** (0 - 2) +all(Posts, # == #) +{" ": true}?.Biography +nil != Posts and TotalViews < 0 +TotalViews in Authors ? Posts : nil +one(Posts, Posts == nil) +nil == TotalViews and 0.5 <= TotalViews +TotalViews != min(TotalViews) +TotalViews <= TotalViews ? "JavaScript" : Authors +min(TotalViews) * TotalViews +TotalViews ** 2 == TotalViews % TotalViews +string(1 ^ 0.5) +max(min(0, 2)) +TotalViews / Add(0, 2) +count(Posts, false) > TotalViews +Authors == Authors != true +TotalViews >= TotalViews + 0.5 +abs(2) in Authors ? nil : false +string(filter(Posts, false)) +upper(string(float(TotalViews))) +abs(0.5 / 0.5) +Authors != Authors ? Authors : Authors +toJSON(TotalViews == TotalViews) +-0 - TotalViews +1 .. TotalViews == Posts +-TotalViews >= 1 ? 0.5 : 1 +0 ^ TotalViews / TotalViews +-(0.5 ^ 0) +max(TotalViews ** TotalViews) +2 ** 0.5 / count(Posts, false) +string(map(Posts, 0)) +map(map(Posts, TotalViews), abs(TotalViews)) +max(TotalViews) ** TotalViews +string(-0) +TotalViews ** TotalViews >= TotalViews +TotalViews != 0 ? Posts : nil +filter(Posts, 1 == 0) +TotalViews ^ 0 ** TotalViews +count(Posts, Authors == nil) +TotalViews ** (TotalViews * TotalViews) +string("Go" <= " ") +get(Authors, TotalViews - 0) +0.5 + 0 < 0.5 ? nil : TotalViews +toJSON(nil in Posts) +min(TotalViews * 0.5) +!(TotalViews > 0.5) +{" ": -TotalViews} +Authors[min(TotalViews)] +[2 ^ 2] +max(int(0)) +{"Go": "Go"}.Tags +string(TotalViews * 0.5) +all(Posts, TotalViews != nil) +map(Posts, Posts[0:TotalViews]) +TotalViews * 2 > TotalViews +TotalViews - TotalViews + TotalViews - TotalViews +lower(string(false)) +all(Posts, Posts == nil) +all(Posts, 2 >= 2) +len(filter(Posts, true)) +filter(Posts, Authors != Authors) +!(0 == TotalViews) +map(true ? Posts : Posts, Authors) +len(Authors) ** TotalViews +not true and TotalViews == 0 +all(Posts, nil == nil) +TotalViews <= 1 or nil in Authors +TotalViews / 2 == TotalViews ? false : Authors +TotalViews / max(2) +TotalViews + 2 ^ TotalViews +TotalViews in map(Posts, 0) +int(0.5 * TotalViews) +(TotalViews + TotalViews) * TotalViews % 2 +Authors == Authors ? 1 : nil +TotalViews / 0.5 * TotalViews +true ? Authors : 2 >= TotalViews +len(Authors) in Posts == nil +filter(1 .. TotalViews, TotalViews >= TotalViews) +TotalViews ^ 2 != TotalViews +all(Posts, nil == Authors) +string(any(Posts, false)) +TotalViews <= -TotalViews +float(TotalViews) - 0.5 - TotalViews +nil in Posts or true == nil +map(Posts, TotalViews .. TotalViews) +toJSON(TotalViews == 1) +Posts != Posts == false +{" ": Posts, " ": 0.5}?.Author +-(2 + 1) +-(1 * TotalViews) +get(Posts, TotalViews - TotalViews)?.ID +string(0 == TotalViews) +min(TotalViews, TotalViews) > TotalViews +TotalViews != len(Authors) +string(int(0)) +not (nil != true) +0 ^ TotalViews - TotalViews +all(Posts, 0.5 != TotalViews) +Posts != Posts ? Posts : Authors +!(nil != true) +{"JavaScript": nil}?.PublishDate +int(TotalViews - 2) +min(TotalViews) / 0 ** TotalViews +-TotalViews * TotalViews ** TotalViews +min(2 % TotalViews) +0 .. TotalViews != Posts ? TotalViews : 0.5 +int(TotalViews * 2) +0.5 - TotalViews != TotalViews +get(Posts, 1).Tags +TotalViews % TotalViews < TotalViews +get(Posts, false ? Posts : TotalViews) +TotalViews - float(TotalViews) <= TotalViews +{" ": Posts, " ": Posts}.Content != Authors +not (0.5 != 0) +not ("JavaScript" == " ") +(0.5 + TotalViews) / TotalViews +TotalViews / 0.5 < TotalViews +not (0 == 1) +TotalViews != TotalViews ? TotalViews : Posts +upper(toJSON(" ")) +float(2) >= TotalViews ** TotalViews +-(TotalViews / 0) +not (TotalViews != 1) +int(0 ^ 0) +TotalViews ^ 0 ^ (TotalViews + TotalViews) +TotalViews * 0.5 > TotalViews +map(Posts, 0.5 / TotalViews) +-(TotalViews ** 2) +int(2) - TotalViews +toJSON(nil != 1) +TotalViews > 0 ** TotalViews +TotalViews >= TotalViews ^ 1 +filter(Posts, TotalViews < 0.5) +abs(0.5 ^ TotalViews) +int(0 % TotalViews) +0.5 * TotalViews > TotalViews / TotalViews +int(TotalViews + 0.5) +map(Posts, 0 != TotalViews) +Posts[1].Title +TotalViews * -TotalViews +!(1 == TotalViews) +TotalViews - TotalViews >= TotalViews +max(Add(2, 0)) +1 + 0 < 1 ** 0 +nil != Posts ? TotalViews : Posts == Posts +one(Posts, true != nil) +filter(Posts, 0.5 == nil) +not (0 in Authors) +map(map(Posts, true), Authors) +not ("Go" > "Go") +string(0.5 + TotalViews) +true ? Authors : Posts[TotalViews] +not (false and true) +min(0 + 1) +{"Go": Authors}?.LastName +0.5 * TotalViews / int(TotalViews) +Posts == map(Posts, TotalViews) +count(Posts, nil == Posts) +-(TotalViews * 1) +TotalViews * TotalViews in Posts +string(not false) +2 ^ 0 / int(TotalViews) +TotalViews ** -0.5 +!(0.5 >= 0) +string(nil == nil) +!(1 > TotalViews) +abs(TotalViews ^ (TotalViews / TotalViews)) +TotalViews .. 1 - 0 +!(" " <= "Go") +abs(TotalViews + 2) +abs(len("Go")) +string(string(Posts)) +map(Posts, min(TotalViews)) +{"Go": nil}.ID +!(" " > " ") +{" ": TotalViews, "Go": Posts} +last(map(Posts, 0)) +-abs(0) +toJSON(true ? 0.5 : 0.5) +float(1 / TotalViews) +not (1 != 0) +max(0 / TotalViews) +int(0) - TotalViews +!not (TotalViews != 0) +string(!(TotalViews < TotalViews)) +int(0.5) == TotalViews +Authors == Authors ? Posts : 1 +WithID(Posts, 1)?.PublishDate +-(TotalViews + 0) +Authors[min(0)] +filter(Posts, true) != map(Posts, TotalViews) +trim("Go") > toJSON(TotalViews) +WithID(Posts, 2).Title +int(TotalViews) % TotalViews +max(0.5 - 0) +last(Posts).Author +map(Posts, TotalViews > 0.5) +!true ? 2 : 2 +count(Posts, TotalViews != TotalViews) +string(0 ^ 0) +min(TotalViews) + TotalViews +false ? Posts : TotalViews .. TotalViews +one(Posts, !false) +fromJSON(toJSON(Authors)) +TotalViews - 1 + TotalViews +true ? Posts : TotalViews ^ TotalViews +Authors != nil ? TotalViews : TotalViews +TotalViews ** (TotalViews + 0.5) +get(Authors, abs(TotalViews)) +len(Posts) > TotalViews * TotalViews +TotalViews <= TotalViews ? Authors : TotalViews +one(Posts, true && true) +min(TotalViews * 2) +Posts[1]?.Tags +min(1) != 2 ^ TotalViews +map(Posts, string(Posts)) +-(2 ^ 1) +not (TotalViews == 0.5) +count(Posts, nil == 0) +0.5 * 0 != TotalViews +(TotalViews + 0) ^ TotalViews +TotalViews + count(Posts, false) +TotalViews == 0.5 ? TotalViews : TotalViews +map(Posts, true) == Posts +{"JavaScript": 0.5 ** TotalViews} +{"Go": nil, "JavaScript": Posts, " ": Authors}?.Upvotes +one(Posts, IsZero(#)) +!any(Posts, true) +last([TotalViews]) +string(TotalViews <= 0.5) +-TotalViews - TotalViews / TotalViews +any(false ? " " : Authors, 0 == 0.5) +one(Posts, !true) +WithID(Posts, false ? TotalViews : TotalViews) +trim(true ? " " : TotalViews) +TotalViews ^ TotalViews != abs(TotalViews) +count(Posts, TotalViews != nil) +{" ": Posts}?.Content +{"JavaScript": TotalViews, "Go": Posts}.Title +none(Posts, !true) +trim(toJSON(1)) +0 .. TotalViews != filter(Posts, true) +count(Posts, true) == TotalViews +filter(TotalViews .. TotalViews, 0 == nil) +WithID(Posts, 2)?.ID +string(TotalViews / 1) +toJSON(len(Authors)) +float(TotalViews ^ 1) +min(TotalViews, TotalViews) % TotalViews +filter(Posts, 0 != TotalViews) +{"JavaScript": nil}?.Tags +-(TotalViews + 1) +TotalViews - TotalViews == TotalViews +(0.5 * TotalViews) ** TotalViews +one(Posts, 0 > TotalViews) +TotalViews .. 0 - TotalViews +filter(true ? Posts : Posts, TotalViews <= 0) +len(filter(Posts, false)) +TotalViews - 0.5 * TotalViews +TotalViews * TotalViews >= TotalViews ? "JavaScript" : 1 +-float(0) +TotalViews * max(0) +any(Posts, TotalViews != nil) +{"Go": Authors}?.FirstName +int(min(TotalViews)) +TotalViews != nil == nil +{" ": 0.5 != TotalViews} +TotalViews ** -2 +toJSON(map(Posts, "JavaScript")) +map(map(Posts, Authors), TotalViews) +TotalViews / TotalViews ^ 0 +TotalViews != TotalViews ^ 0 +map(Posts, Authors != nil) +-TotalViews > count(Posts, false) +2 ^ TotalViews >= TotalViews ? true : 0 +map(Posts, TotalViews / TotalViews) +map(Posts, TotalViews + 0) +one(Posts, TotalViews != 1) +(0 + TotalViews) ** TotalViews +TotalViews .. -1 +{"JavaScript": 0, "JavaScript": Posts, "Go": TotalViews}.FirstName +TotalViews ^ 0.5 / TotalViews +abs(TotalViews % TotalViews) +one(map(Posts, Authors), TotalViews > 0.5) +TotalViews == nil ? Posts : "JavaScript" +toJSON(one(Posts, true)) +toJSON(0.5 ^ TotalViews) +len(true ? Authors : TotalViews) +0 / TotalViews <= TotalViews +Posts != nil ? 2 : nil +2 - 0 >= TotalViews +map(Posts, true ? false : 2) +filter(Posts, !true) +string(TotalViews ^ 0.5) +TotalViews in Posts ? Posts : Authors +int(0) == TotalViews +max(0.5 ^ 0) +filter(Posts, nil in Posts) +toJSON(1 .. TotalViews) +TotalViews != 0 and not true +Posts[TotalViews:TotalViews] == 1 .. TotalViews +!(TotalViews <= 2) +any(Posts, 2 < 1) +TotalViews / (TotalViews - 0.5) +int(1 / 0.5) +!("JavaScript" <= " ") +int(abs(TotalViews)) +map(Posts, TotalViews + TotalViews) +map(Posts, len(Posts)) +lastIndexOf(" ", "Go") ** TotalViews +toJSON(get(Authors, TotalViews).Profile) +min(TotalViews) != TotalViews +any(Posts, 0 != TotalViews) +{" ": Authors, "Go": 0, "Go": Authors, "JavaScript": Authors, "Go": 2}.Content != Posts +filter(map(Posts, Authors), Posts == Posts) +TotalViews > 0.5 ? Posts : Posts +one(Posts, 0.5 >= TotalViews) +none(Posts, IsZero(#)) +Sub(1, 0.5) ** TotalViews +TotalViews >= 0 ** 1 +TotalViews in Posts != false +get(Posts, int(TotalViews)) +!(0.5 != TotalViews) +(1 - TotalViews) ** TotalViews +[TotalViews, TotalViews] +Posts != map(Posts, 0.5) +get(map(Posts, false), TotalViews) +TotalViews ** TotalViews + TotalViews +string(map(Posts, " ")) +any(Posts, TotalViews == TotalViews) +TotalViews * (0 + TotalViews) +[nil != false] +TotalViews <= 0.5 ^ 2 +-(0 - 1) +min(TotalViews / 0.5) +TotalViews != TotalViews ** 0.5 +Authors != Authors != nil +TotalViews / TotalViews ** 0 +one(Posts, 1 > TotalViews) +!(nil != 0.5) +get(Authors, 1 + TotalViews) +{"JavaScript": "JavaScript"}.ID +abs(TotalViews + 0) +map(Posts, TotalViews != 0.5) +abs(TotalViews ** 0.5) +[TotalViews .. TotalViews] +0.5 - 0 >= TotalViews +-abs(2) +{"JavaScript": Posts, "JavaScript": Authors}.Title +map(Posts, 2 ** 0.5) +string(0 == 2) +map(Posts, nil in Authors) +-min(0.5 ^ 0) +min(TotalViews + TotalViews, TotalViews) +Authors[nil].Profile +2 % TotalViews == TotalViews +TotalViews * int(TotalViews) +!(0 in Posts) +string(hasPrefix("JavaScript", " ")) +map(Posts, TotalViews < 0.5) +any(Posts, 0 == TotalViews) +0 >= TotalViews or TotalViews < TotalViews +all(map(Posts, Posts), TotalViews in Authors) +none([TotalViews <= TotalViews], #) +get(Posts, TotalViews)?.Author?.ID +not (0 <= TotalViews) +!(0 > 0.5) +TotalViews in Posts or TotalViews > TotalViews +TotalViews <= TotalViews ? nil : Authors +string(map(Posts, "Go")) +string({" ": false}) +toJSON(Authors != Authors) +!(0.5 > 0.5) +toJSON(get(Posts, 1)) +TotalViews - 2 * TotalViews +TotalViews >= TotalViews ? nil : false +map([Authors], Posts) +TotalViews * 0 % 1 +2 ** TotalViews < TotalViews +float(TotalViews ** 0) +!("JavaScript" >= " ") +-TotalViews ** -TotalViews +TotalViews - 2 == TotalViews +last(map(Posts, 2)) +TotalViews / TotalViews > TotalViews +toJSON(TotalViews < 2) +max(2) ^ len(Posts) +!false ? Authors : "JavaScript" +string(all(Posts, false)) +!("Go" > "Go") +TotalViews >= 0 == nil +toJSON(TotalViews != 1) +(TotalViews + TotalViews) ^ TotalViews +TotalViews + TotalViews + TotalViews +last(Posts)?.Title +Add(1, 2) + TotalViews ^ 0 +not (1 == nil) +string(1 / 0) +filter(Posts, Authors == Authors) +get(false ? Posts : TotalViews, TotalViews != Posts) +0 ** TotalViews * TotalViews +{" ": nil, "Go": "JavaScript", "JavaScript": Authors}?.Tags +all(Posts, nil != TotalViews) +abs(0.5 ** TotalViews) +TotalViews <= 2 ** TotalViews +TotalViews ^ (TotalViews / TotalViews) +string(0 / TotalViews) +max(0 + 0) +any([0, TotalViews], TotalViews in Authors) +map(map(Posts, 0), TotalViews - TotalViews) +min(TotalViews) > TotalViews +TotalViews < count(Posts, true) +false ? 1 : TotalViews > TotalViews +TotalViews ** (TotalViews % TotalViews) +Posts == Posts == one(Posts, true) +get(true ? 0.5 : Posts, Posts) +last(map(Posts, #)) +not (TotalViews != 0) +TotalViews ** (0 % TotalViews) +any(Posts, true == nil) +string(0.5 > 2) +Posts != Posts != true +max(TotalViews + 0.5, TotalViews) +Authors != Authors ? 1 : 0 +abs(TotalViews) / TotalViews +TotalViews != len(Posts) +{"JavaScript": Posts, " ": Posts, "Go": nil}.Author +TotalViews == nil ? Authors : TotalViews +{" ": TotalViews, "JavaScript": Authors} +min(1 / TotalViews) +string(1 <= TotalViews) +int(1) >= TotalViews +filter(Posts, not false) +first(Posts[0:2]) +-max(TotalViews, TotalViews) +all(Posts, 0.5 > TotalViews) +none(Posts, TotalViews <= 1) +Posts == Posts ? Authors : Authors +0.5 ** TotalViews == TotalViews +get(Posts, TotalViews * 0) +abs(TotalViews * 0.5) +TotalViews / 0 * TotalViews +-(1 ** TotalViews) +Posts == Posts and TotalViews in Authors +count(map(Posts, TotalViews), TotalViews == 0.5) +get(Posts, true ? false : TotalViews) +TotalViews >= 2 * 0 +{" ": Authors, "JavaScript": Posts} +toJSON(0 != TotalViews) +2 ** TotalViews == TotalViews +max(TotalViews, TotalViews, TotalViews) +Posts == Posts || TotalViews < 1 +WithID(Posts, 0)?.PublishDate +[TotalViews == 1] +1 .. 1 == Posts +abs(0 % 1) +none(2 .. TotalViews, "Go" >= "JavaScript") +any(Posts, none(Posts, false)) +string(nil != TotalViews) +!(0.5 != nil) +toJSON(string(1)) +WithID(Posts, TotalViews).Title +one(Posts, TotalViews != 0.5) +0 ^ 0 < TotalViews +{"Go": TotalViews}?.CommentDate?.Content +TotalViews + TotalViews < TotalViews +TotalViews / TotalViews * TotalViews +!(false != false) +float(0) < TotalViews +string(-1) +-(0 * 1) +-(TotalViews > TotalViews ? Posts : TotalViews) +TotalViews != TotalViews == true +1 % TotalViews % TotalViews +TotalViews < float(TotalViews) +string(TotalViews ** 1) +{"JavaScript": Authors != Authors} +Posts != 0 .. TotalViews +count(Posts, any(Posts, false)) +map(map(Posts, true), count(Posts, false)) +TotalViews != 0 ? TotalViews : " " +TotalViews == nil ? TotalViews : Posts +{" ": TotalViews > TotalViews, "Go": Posts} +float(TotalViews) * -0.5 +TotalViews / TotalViews >= TotalViews +Posts != Posts ? 2 : "JavaScript" +!true ? Posts : Posts +-(TotalViews ** 1) +string(Posts != nil) +toJSON(Posts == nil) +TotalViews != TotalViews ? 0.5 : nil +lower(toJSON(TotalViews)) +!(nil == false) +all(Posts, 0 >= 0.5) +TotalViews != 0.5 == nil +any(Posts, TotalViews >= TotalViews) +map(map(Posts, true), #) +{"JavaScript": 0}.LastName +abs(0 - TotalViews) +0 <= TotalViews || TotalViews == 2 +(TotalViews / TotalViews) ^ TotalViews +TotalViews != 0 * TotalViews +count(Posts, false) < TotalViews ? Authors : TotalViews +TotalViews > 0.5 + TotalViews +TotalViews % TotalViews in Posts +max(0 % 2) +string(len(Authors)) +-(TotalViews + 0.5) +float(min(0.5)) +!("JavaScript" == "Go") +len(map(Posts, false)) +map(Posts, TotalViews == 2) +!true ? TotalViews : 0 +{" ": 0, " ": TotalViews, "JavaScript": 0.5}.Title +toJSON(Authors != nil) +true ? Posts : Authors[TotalViews] +TotalViews * TotalViews ^ 1 +{"Go": Authors, "Go": 0.5}?.Email +filter(Posts, nil != TotalViews) +TotalViews in Authors ? true : false +toJSON(string(Authors)) +first(map(Posts, "Go")) +Posts[1]?.Author +max(TotalViews % 2) +!(nil == 2) +TotalViews != 2 ? true : TotalViews +TotalViews in Posts ? TotalViews : Posts +len(Authors) > 0 * TotalViews +TotalViews .. min(TotalViews) +TotalViews == TotalViews + 2 +string(1 / 0.5) +false ? Authors : 1 in Authors +map(Posts, Posts != Posts) +!(2 != TotalViews) +all(Posts, TotalViews <= TotalViews * TotalViews) +string(2 < 0) +string(0.5 != TotalViews) +map(Posts, # == #) +Authors != Authors ? get(Authors, 2) : Authors +TotalViews ^ (TotalViews * 2) +TotalViews < TotalViews * 0 +TotalViews > 0 * 0 +TotalViews <= 1 ? Posts : true +TotalViews <= TotalViews ? TotalViews : Posts +not (" " > "Go") +TotalViews / -0 +string(float(TotalViews)) +not (0 in Posts) +not false ? " " : 2 +TotalViews ^ int(0) +any(Posts, TotalViews != TotalViews) +map(Posts, IsZero(#)) +get(Authors, 1)?.LastName +toJSON(map(Posts, 1)) +{" ": nil, "JavaScript": 2}?.Upvotes +len(0 .. 1) +TotalViews <= TotalViews / TotalViews +max(0 - TotalViews) +Authors == Authors || 0.5 >= 1 +get(true ? Posts : Posts, TotalViews) +float(1) + TotalViews +{"JavaScript": TotalViews}?.ID +count(Posts, 2 < 0) +map(Posts, 0.5 != 0.5) +{"Go": Authors}.Likes +Posts != Posts ? TotalViews : 0.5 +map(Posts, Posts[TotalViews:TotalViews]) +any(map(Posts, 0), not true) +nil == " " && 0 == TotalViews +string(0 <= 0) +map(Posts, nil != Posts) +-TotalViews in 0 .. TotalViews +filter(Posts, TotalViews < 0) +TotalViews ^ TotalViews * min(0) + TotalViews +count(Posts, IsZero(#)) +map(0 .. TotalViews, TotalViews) +!(0 > 0) +1 >= TotalViews ? IsAdmin(nil) : TotalViews +TotalViews <= TotalViews % 1 +first(map(Posts, " ")) +len(Authors) == 0 % TotalViews +max(2 - TotalViews) +{"JavaScript": "Go", " ": " "}?.Title +{"JavaScript": Authors}?.PublishDate +TotalViews * 0.5 >= TotalViews +one(Posts, TotalViews != 0) +none(Posts, one(Posts, false)) +Posts != nil ? Posts : false +Posts[TotalViews:TotalViews + TotalViews] +abs(0.5 + TotalViews) +!(true == nil) +int(TotalViews / 1) +float(Add(0, 0)) +1 - TotalViews == TotalViews ** 0 +TotalViews ** (1 * TotalViews) +string(Title(Posts[0])) +map(Posts, toBase64(" ")) +{"JavaScript": TotalViews, "JavaScript": Authors} +(TotalViews - TotalViews) * -0 +map(Posts, TotalViews * 0) +toJSON(false ? Authors : Authors) +!false != none(Posts, true) +map(Posts, 0.5 < TotalViews) +string(1 ** TotalViews) +min(float(TotalViews)) +TotalViews == 1 ? nil : Authors +Posts == Posts != true +0.5 * TotalViews - TotalViews +TotalViews in TotalViews .. 2 +filter(Posts, "JavaScript" endsWith "Go") +-min(1) +TotalViews + 1 in Posts +not (" " != nil) +[0.5 + 0] +max(TotalViews, TotalViews) > TotalViews +string(Add(2, 0)) +all(Posts, nil != Authors) +TotalViews == abs(0) +TotalViews ** 0 != -0 +any(Posts, 0.5 != nil) +not (nil != "JavaScript") +1 + 0 >= TotalViews +TotalViews * 0 ** TotalViews +toJSON(string(TotalViews)) +TotalViews ^ count(Posts, Authors == nil) +0 * 0 in Authors +[TotalViews % 2] +min(float(TotalViews), 0 / TotalViews) +any(map(Posts, 2), TotalViews <= 0.5) +0.5 - TotalViews > TotalViews +string(nil != nil) +(TotalViews - TotalViews) * (2 + 0.5) +int(count(Posts, true)) +0 > TotalViews || 1 >= TotalViews +count(Posts, 0.5 < 0.5) +any(Posts, 2 >= TotalViews) +0.5 + TotalViews + TotalViews +min(TotalViews) in Authors ? nil : nil +not (2 >= TotalViews) +get(Posts, TotalViews - 1) +abs(false ? 0.5 : TotalViews) +TotalViews ** abs(TotalViews) +float(TotalViews * 0) +TotalViews < 0.5 - TotalViews +TotalViews ^ -0 +-(TotalViews / 1) +map(Posts, toJSON("JavaScript")) +map(Posts, filter(Posts, false)) +none(Posts, 2 < TotalViews) +2 > TotalViews and nil == Posts +TotalViews in Authors ? nil : Posts +--1 +min(TotalViews ^ TotalViews) +max(TotalViews + 0) +TotalViews * TotalViews >= TotalViews +map(map(Posts, false), Posts) +Add(0, 0.5) + TotalViews +all(Posts, 1 > 2) +TotalViews != TotalViews * TotalViews +{"Go": Posts}?.FirstName +map(map(Posts, 2), Posts) +upper(string(2)) +2 * 0 .. TotalViews +Posts == [TotalViews, Authors] +get(Posts, TotalViews) != get(Posts, TotalViews) +{"Go": 1, " ": Posts}.ID +toJSON(TotalViews ^ 1) +none(Posts, 1 <= 0.5) +0 - TotalViews > TotalViews ? false : nil +TotalViews == 0 ? Authors : Posts +{"JavaScript": " " != nil} +[Authors, Posts] +0.5 - 2 <= TotalViews +len(Posts) <= TotalViews +len(Authors) <= TotalViews +-float(2) +0.5 ** TotalViews != TotalViews +-TotalViews in filter(Posts, true) +2 ** 0 ^ (TotalViews / TotalViews) +TotalViews ** TotalViews != TotalViews ** TotalViews +float(2 - TotalViews) +map(Posts, nil == Posts) +TotalViews * 1 % TotalViews +toJSON(true ? TotalViews : Posts) +TotalViews % TotalViews == TotalViews +-0 != TotalViews +TotalViews ** TotalViews ^ TotalViews +trim(toJSON(nil)) +any(Posts, TotalViews == nil) +string(TotalViews < TotalViews) +int(0.5 ^ 2) +!(TotalViews < 2) +first([" ", TotalViews, TotalViews, Authors, Authors]) +WithID(Posts, 0).ID + TotalViews +none(Posts, 0 in Posts) +first(Posts[0:TotalViews]) +get(Posts, 2).Likes +TotalViews >= 2 - TotalViews +count(map(Posts, Posts), TotalViews in Authors) +TotalViews != TotalViews ? Posts : Posts +TotalViews + TotalViews != count(Posts, true) +TotalViews ** 0 >= TotalViews +Authors[1].Email +min(min(0)) +float(0 * 2) +TotalViews + abs(TotalViews % 1) +0.5 != TotalViews or 0 != nil +abs(1) < TotalViews +{"Go": nil, "JavaScript": "Go"}?.CommentDate +one(Posts, " " != nil) +int(TotalViews) in map(Posts, Posts) +TotalViews + 0 .. TotalViews +TotalViews - TotalViews / 0 +0.5 / TotalViews < TotalViews ** 2 +none(Posts, TotalViews <= 0) +Authors[len(Posts)] +lower(toJSON(Authors)) +!(0.5 != 2) +TotalViews != TotalViews ? nil : TotalViews +int(TotalViews * 0.5) +len(Posts) <= -TotalViews +!(0 < 0) +Posts == nil ? Authors : nil +-(TotalViews + 2) +TotalViews * TotalViews - TotalViews +1 < TotalViews || 0 == 0 +not (nil != 0) +TotalViews >= 0.5 != nil +none(Posts, TotalViews < 1) +map(Posts, 0 in Authors) +not true ? Posts : Posts +string(0.5 < TotalViews) +int(TotalViews) != TotalViews +map(Posts[TotalViews:TotalViews], Posts) +(TotalViews - 0) ^ TotalViews +len(Posts) + TotalViews +{"JavaScript": " ", "Go": TotalViews, "Go": 2}?.Tags +!(1 < 0) +one(filter(Posts, false), 0 == nil) +abs(TotalViews) .. TotalViews +TotalViews % 1 < TotalViews ? 0.5 : Authors +map(Posts, 1 + TotalViews) +string(true == true) +TotalViews ** (0.5 * TotalViews) +none(Posts, false == true) +int(0.5 ** TotalViews) +TotalViews .. max(TotalViews) +TotalViews <= count(Posts, true) +!(Posts == nil) +{"JavaScript": Authors, "Go": "Go"}.Upvotes +float(0.5 + TotalViews) +TotalViews % 1 + TotalViews / 0 +"JavaScript" in Authors[TotalViews] +TotalViews + TotalViews + 0.5 +all(Posts, false == false) +TotalViews < 0 / TotalViews +map(Posts, 0.5 * 2) +[-TotalViews] +get(Posts, false ? 0 : Authors) +get(Posts, true ? TotalViews : true) +max(max(TotalViews)) +!(TotalViews >= 1) +Posts == Posts or 2 <= 0 +-0.5 == TotalViews +map(TotalViews .. 1, Title(nil)) +not !(TotalViews > TotalViews) +(0.5 + 2) ** len(Posts) +!true ? Posts : Authors +abs(0.5 ** 0) +all(Posts, TotalViews == 1) +string(0 in Posts) +TotalViews + max(0) +get(Authors, int(0)) +get(Posts, true ? 0 : Authors) +TotalViews > TotalViews % TotalViews +len(Posts) != TotalViews +float(TotalViews * 2) +0 % TotalViews / 0.5 / 1 +toJSON(min(TotalViews)) +string(any(Posts, true)) +not !(Authors != Authors) +-0.5 ** TotalViews +Authors != Authors && one(Posts, true) +TotalViews * 2 == TotalViews +int(0.5) <= TotalViews ? Posts : 0 +one(Posts, true) && TotalViews in Posts +TotalViews + 0 > 0 ^ 0 +any(Posts, .Equal(#)) +TotalViews ^ TotalViews / TotalViews +0 / 0 != TotalViews / TotalViews +2 ^ TotalViews - TotalViews +map(map(Posts, 0), Posts) +-(1 * 0) +map(Posts, 1 != TotalViews) +min(TotalViews ^ 0) +map(false ? " " : Posts, Authors) +{"JavaScript": Authors, "Go": TotalViews}?.Profile +upper(false ? TotalViews : "Go") +min(1 % 1) +max(0.5 - 2) +-(TotalViews - 2) +all(Posts, nil in Posts) +TotalViews + 0 + TotalViews +Posts != map(Posts, Authors) +TotalViews * TotalViews < TotalViews +{" ": TotalViews, "JavaScript": TotalViews}?.Content +0 != TotalViews ? TotalViews : TotalViews +{" ": "JavaScript", " ": TotalViews}.ID +min(0 - TotalViews) +TotalViews + 0 in Authors +TotalViews - TotalViews / 0.5 +TotalViews != max(TotalViews, TotalViews) +0.5 ** 1 == TotalViews +len(Authors) in Posts +filter(Posts, Posts == Posts) +TotalViews ^ 0.5 ^ TotalViews +all(map(Posts, 0.5), TotalViews in Authors) +TotalViews + TotalViews >= TotalViews +(0 % TotalViews) ** TotalViews +filter(map(Posts, " "), TotalViews >= 0) +TotalViews in Authors or TotalViews in Posts +-max(0.5) +all(Posts, 0 < TotalViews) +WithID(Posts, 1)?.Content +!false ? nil : 1 +-0 ** TotalViews +{" ": TotalViews, "JavaScript": nil}?.CommentDate +int(TotalViews ^ 1) +map(Posts, .Content) +string(false != false) +filter(Posts, any(Posts, true)) +abs(true ? TotalViews : Posts) +map(Posts, # != #) +toJSON(0 ^ TotalViews) +not false ? 0.5 : Authors +TotalViews - 0 <= TotalViews +TotalViews ^ TotalViews + TotalViews +TotalViews * TotalViews / 0 +float(0 + 0.5) +abs(count(Posts, true)) +max(0) ** TotalViews +not (1 >= TotalViews) +filter(Posts, false != true) +string(toJSON(true)) +0 % TotalViews < TotalViews +map(map(Posts, TotalViews), 2 != TotalViews) +-(2 ** TotalViews) +none(Posts, TotalViews > TotalViews) +get(Authors, 2 * TotalViews) +[Authors] != Posts +Posts[0 % TotalViews] +(0 + TotalViews) / TotalViews +true ? TotalViews : 1 .. TotalViews +float(0.5) ** TotalViews +TotalViews * 1 <= abs(TotalViews) +TotalViews + 1 >= TotalViews +0 * 0.5 - TotalViews +filter(Posts, 0 < 0) +TotalViews == min(TotalViews) +{"JavaScript": " ", "JavaScript": TotalViews}.Comments +TotalViews == TotalViews ** 0 +-TotalViews > 0.5 ? "JavaScript" : 2 +TotalViews / (0.5 + 0.5) +TotalViews ^ min(0) +TotalViews * 1 ^ TotalViews +map(map(Posts, TotalViews), -0) +string(0.5 ** 0) +count(Posts, false) > TotalViews ? 1 : Posts +min(TotalViews % 2) +0.5 / TotalViews < TotalViews +!(0 != 0) +!true ? TotalViews : Posts +last(map(Posts, " ")) +TotalViews * 0 % TotalViews +float(TotalViews - 1) +string(TotalViews ** 0.5) +map(Posts, TotalViews <= 0) +TotalViews ** 0 * TotalViews +abs(TotalViews ^ TotalViews) +TotalViews in Posts and nil in Authors +TotalViews / 1 / TotalViews +TotalViews % TotalViews - TotalViews +len(TotalViews .. 0) +Posts[count(Posts, false)] +toJSON(0 <= TotalViews) +any(Posts, nil != 1) +not (2 >= 0) +0.5 > TotalViews and TotalViews <= TotalViews +-(TotalViews ** 0.5) +not (false != nil) +TotalViews == TotalViews * TotalViews +not (1 <= TotalViews) +not (0 != 0) +0.5 + TotalViews <= TotalViews +string(1 - 0.5) +TotalViews <= max(TotalViews) +-TotalViews in Posts +any(Posts, 0 in Authors) +any(Posts, TotalViews == 1) +abs(0 + TotalViews) +TotalViews / 1 - TotalViews +one(Posts, 2 <= 1) +TotalViews / 1 * 0 +TotalViews == TotalViews ? Authors : Posts +not !(TotalViews in Authors) +(2 - TotalViews) * TotalViews ^ TotalViews +not (1 != TotalViews) +int(0.5 + 0.5) +map(false ? 2 : Posts, #) +count(Posts, 0 < TotalViews) +map(Posts, 0.5 != TotalViews) +TotalViews ** TotalViews ^ 0.5 +abs(0 / TotalViews) +TotalViews <= TotalViews ? TotalViews : 1 +all(Posts, 0 <= 1) +Authors[max(TotalViews)] +0.5 != TotalViews || Posts != Posts +any(map(Posts, true), 1 < TotalViews) +lower(upper(" ")) +TotalViews >= 2 ? TotalViews : true +string(0 / 0.5) +none(Posts, false ? Posts : true) +TotalViews ^ (TotalViews * 0.5) +0 % 1 != 0 ^ TotalViews +Authors[2].LastName +TotalViews in Posts == nil +Posts == Posts ? true : Authors +all(Posts, TotalViews != 0.5) +upper(toBase64("JavaScript")) +int(1) .. TotalViews +TotalViews ^ (TotalViews * TotalViews) +TotalViews / max(TotalViews) +string(nil in Authors) +min(0.5 ^ 0) +2 % TotalViews + TotalViews +not (1 == 0) +max(-0) +(TotalViews + TotalViews) / (TotalViews + 1) +not not true +TotalViews ^ (TotalViews * 0) +not false ? nil : TotalViews +Authors[1 + TotalViews] +toJSON(false ? Posts : Posts) +map(Posts, TotalViews == 0) +(0 + 0) / 1 ** 2 +true ? 1 : 0 / TotalViews +none(Posts, nil != Authors) +nil != Posts or 2 > TotalViews +toJSON(min(TotalViews, 0.5)) +all(Posts, TotalViews <= TotalViews) +any(Posts, 1 > TotalViews) +TotalViews > 1 ^ 2 +one(Posts, not true) +one(Posts, TotalViews > 0) +none(Posts, 2 <= TotalViews) +none(map(Posts, Posts), nil == Posts) +0.5 ** TotalViews ** TotalViews +0 + 1 <= TotalViews +!false ? false : true +abs(true ? TotalViews : TotalViews) +-(0 ** 0) +TotalViews * (TotalViews + 0) +TotalViews % (TotalViews + TotalViews) +toJSON(map(Posts, 0.5)) +float(TotalViews) != TotalViews +{"JavaScript": 1, "Go": Posts}?.PublishDate +min(1 % TotalViews) +TotalViews != 0.5 && TotalViews in Posts +TotalViews != 0 % TotalViews +min(0 ^ TotalViews) +WithID(Posts, 0).ID +toJSON(0.5 + 0.5) +TotalViews + 0 / 0 +TotalViews >= 0 ? Authors : Authors +toBase64(string(TotalViews)) +{"JavaScript": "JavaScript"}.Content +any(Posts, 2 != 0.5) +TotalViews + -0 +TotalViews >= TotalViews and 2 in Authors +Posts != Posts == false ? false : TotalViews +[Posts, TotalViews] != Posts diff --git a/testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e b/testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e new file mode 100644 index 000000000..751f951d4 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e @@ -0,0 +1,2 @@ +go test fuzz v1 +string("duration(toJSON(1))") diff --git a/testdata/fuzz/FuzzExpr/87861ab0b9f0abbe b/testdata/fuzz/FuzzExpr/87861ab0b9f0abbe new file mode 100644 index 000000000..58c76a3b0 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/87861ab0b9f0abbe @@ -0,0 +1,2 @@ +go test fuzz v1 +string("[[0][0]][0][:0]") diff --git a/testdata/fuzz/FuzzExpr/b65163ca9e44703c b/testdata/fuzz/FuzzExpr/b65163ca9e44703c new file mode 100644 index 000000000..e24cea08f --- /dev/null +++ b/testdata/fuzz/FuzzExpr/b65163ca9e44703c @@ -0,0 +1,2 @@ +go test fuzz v1 +string("map(false?:Authors,.A)") From a3bd3a14a3fb350daf28266e8484288dd85f02e9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 12:41:06 +0200 Subject: [PATCH 076/506] Do not set int type for 1/0 expression --- checker/checker_test.go | 5 +++++ checker/types.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/checker/checker_test.go b/checker/checker_test.go index 5b6a31365..74f02ef37 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -499,6 +499,11 @@ cannot use float64 as type string in map key (1:4) cannot use float64 as type int in map key (1:5) | 1/2 in MapIntAny | ....^ + +repeat("0", 1/0) +cannot use float64 as argument (type int) to call repeat (1:14) + | repeat("0", 1/0) + | .............^ ` func TestCheck_error(t *testing.T) { diff --git a/checker/types.go b/checker/types.go index bb23aa190..f5fcbdab3 100644 --- a/checker/types.go +++ b/checker/types.go @@ -241,7 +241,7 @@ func isIntegerOrArithmeticOperation(node ast.Node) bool { } case *ast.BinaryNode: switch n.Operator { - case "+", "/", "-", "*": + case "+", "-", "*": return true } } From 692a25396290abbc035f5dc26ce91782b238a2bb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 12:43:27 +0200 Subject: [PATCH 077/506] Update fuzz_test.go --- fuzz_test.go | 120 +- testdata/corpus.txt | 3446 ----------------------- testdata/fuzz/FuzzExpr/1fedafb72e35699d | 2 + testdata/fuzz/FuzzExpr/37464e3dcb75a05c | 2 + testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 | 2 + testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e | 2 - testdata/fuzz/FuzzExpr/87861ab0b9f0abbe | 2 - testdata/fuzz/FuzzExpr/b1aef962e961045a | 2 + testdata/fuzz/FuzzExpr/b65163ca9e44703c | 2 - testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c | 2 + testdata/fuzz/FuzzExpr/c6717d9f77902b9c | 2 + testdata/fuzz/FuzzExpr/cd662894c578ed90 | 2 + testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd | 2 + 13 files changed, 110 insertions(+), 3478 deletions(-) delete mode 100644 testdata/corpus.txt create mode 100644 testdata/fuzz/FuzzExpr/1fedafb72e35699d create mode 100644 testdata/fuzz/FuzzExpr/37464e3dcb75a05c create mode 100644 testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 delete mode 100644 testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e delete mode 100644 testdata/fuzz/FuzzExpr/87861ab0b9f0abbe create mode 100644 testdata/fuzz/FuzzExpr/b1aef962e961045a delete mode 100644 testdata/fuzz/FuzzExpr/b65163ca9e44703c create mode 100644 testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c create mode 100644 testdata/fuzz/FuzzExpr/c6717d9f77902b9c create mode 100644 testdata/fuzz/FuzzExpr/cd662894c578ed90 create mode 100644 testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd diff --git a/fuzz_test.go b/fuzz_test.go index be395e47b..b9af4ec21 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -1,53 +1,121 @@ package expr_test import ( - "os" "regexp" "strings" "testing" "github.com/antonmedv/expr" - "github.com/antonmedv/expr/test/playground" ) func FuzzExpr(f *testing.F) { - env := playground.ExampleData() - - b, err := os.ReadFile("testdata/corpus.txt") - if err != nil { - f.Fatal(err) + env := map[string]interface{}{ + "i": 1, + "j": 2, + "a": []int{1, 2, 3}, + "m": map[string]interface{}{"a": 1, "b": 2, "m": map[string]int{"a": 1}}, + "s": "abc", } - for _, testcase := range strings.Split(string(b), "\n") { - f.Add(testcase) + + fn := expr.Function( + "fn", + func(params ...interface{}) (interface{}, error) { + return params[0], nil + }, + new(func(int) int), + ) + + corpus := []string{ + `.5 + .5`, + `i + j`, + `i - j`, + `i * j`, + `i / j`, + `i % j`, + `true || false`, + `true && false`, + `i == j`, + `i != j`, + `i > j`, + `i >= j`, + `i < j`, + `i <= j`, + `i in a`, + `i not in a`, + `i in m`, + `m.a`, + `m.m.a`, + `a[0]`, + `a[i]`, + `a[i:j]`, + `a[i:]`, + `a[:j]`, + `a[:]`, + `a[1:-1]`, + `len(a)`, + `abs(-1)`, + `int(0.5)`, + `float(42)`, + `string(i)`, + `trim(" a ")`, + `trim("_a_", "_")`, + `trimPrefix(" a")`, + `trimSuffix("a ")`, + `upper("a")`, + `lower("A")`, + `split("a,b,c", ",")`, + `replace("a,b,c", ",", "_")`, + `repeat("a", 3)`, + `join(["a", "b", "c"], ",")`, + `indexOf("abc", "b")`, + `max(1,2,3)`, + `min(1,2,3)`, + `toJSON(a)`, + `fromJSON("[1,2,3]")`, + `now()`, + `duration("1s")`, + `first(a)`, + `last(a)`, + `get(m, "a")`, + `1..9 | filter(i > 5) | map(i * 2)`, + `s startsWith "a"`, + `s endsWith "c"`, + `s contains "a"`, + `s matches "a"`, + `s matches "a+"`, + `true ? 1 : 2`, + `fn(1)`, + `{a: 1, b: 2}`, + `[1, 2, 3]`, } - f.Add(`Posts[0].Comments[0].AuthorEmail()`) - f.Add(`Posts[0].Comments[0].Upvoted()`) - f.Add(`Posts[0].Comments[0].CommentDate.Add(now())`) - f.Add(`Posts[0].Comments[0].CommentDate.AddDate(0, 0, 1)`) - f.Add(`Authors[Posts[0].Author.ID].Profile.Biography`) - f.Add(`Authors[2].Profile.Age()`) - f.Add(`Authors[2].Profile.Website`) + for _, s := range corpus { + f.Add(s) + } okCases := []*regexp.Regexp{ + regexp.MustCompile(`cannot fetch .* from .*`), + regexp.MustCompile(`cannot get .* from .*`), regexp.MustCompile(`cannot slice`), + regexp.MustCompile(`slice index out of range`), + regexp.MustCompile(`error parsing regexp`), regexp.MustCompile(`integer divide by zero`), - regexp.MustCompile(`invalid operation`), regexp.MustCompile(`interface conversion`), - regexp.MustCompile(`memory budget exceeded`), - regexp.MustCompile(`slice index out of range`), - regexp.MustCompile(`cannot fetch .* from .*`), - regexp.MustCompile(`cannot get .* from .*`), regexp.MustCompile(`invalid argument for .*`), - regexp.MustCompile(`json: unsupported value`), - regexp.MustCompile(`error parsing regexp`), + regexp.MustCompile(`invalid character`), + regexp.MustCompile(`invalid operation`), + regexp.MustCompile(`invalid duration`), regexp.MustCompile(`time: missing unit in duration`), + regexp.MustCompile(`time: unknown unit .* in duration`), + regexp.MustCompile(`json: unsupported value`), + regexp.MustCompile(`unexpected end of JSON input`), + regexp.MustCompile(`memory budget exceeded`), regexp.MustCompile(`using interface \{} as type .*`), regexp.MustCompile(`reflect.Value.MapIndex: value of type .* is not assignable to type .*`), - regexp.MustCompile(`reflect: call of reflect.Value.Call on zero Value`), - regexp.MustCompile(`reflect: call of reflect.Value.Len on bool Value`), regexp.MustCompile(`reflect: Call using .* as type .*`), + regexp.MustCompile(`reflect: call of reflect.Value.Call on .* Value`), regexp.MustCompile(`reflect: call of reflect.Value.Index on map Value`), + regexp.MustCompile(`reflect: call of reflect.Value.Len on .* Value`), } skipCode := []string{ @@ -62,7 +130,7 @@ func FuzzExpr(f *testing.F) { } } - program, err := expr.Compile(code, expr.Env(playground.Blog{})) + program, err := expr.Compile(code, expr.Env(env), fn) if err != nil { t.Skip() } diff --git a/testdata/corpus.txt b/testdata/corpus.txt deleted file mode 100644 index 420ef66ad..000000000 --- a/testdata/corpus.txt +++ /dev/null @@ -1,3446 +0,0 @@ -TotalViews -Authors -len(Authors) -Posts -map(Posts, float(TotalViews)) -all(map(Posts, 0.5), TotalViews < TotalViews) -Authors == Authors --TotalViews -map(Posts, TotalViews) -len(Posts) -TotalViews .. TotalViews -first(Posts) -min(TotalViews) -Authors[0]?.ID -int(TotalViews) -string(Authors) -toJSON(Posts) -map(Posts, int(TotalViews)) -Authors[TotalViews]?.FirstName -TotalViews >= TotalViews -abs(TotalViews) -Authors[TotalViews]?.LastName -string(TotalViews) -TotalViews <= TotalViews -string(get(Posts, TotalViews)) -TotalViews + -TotalViews -one(Posts, TotalViews > TotalViews) -get(Posts, TotalViews) -TotalViews <= 0.5 * TotalViews -toJSON(TotalViews) -float(TotalViews) -map(Posts, 0 / TotalViews) -all(Posts, 0 in Authors) -last(Posts) -TotalViews * TotalViews == TotalViews -Authors[TotalViews] -TotalViews ** TotalViews -map(Posts, Authors) -one(Posts, 1 != TotalViews) -TotalViews * TotalViews == 0 ^ TotalViews -string(map(Posts, TotalViews)) -get(Posts, 0)?.PublishDate -TotalViews == len(Authors) -[Authors] -TotalViews - TotalViews -filter(Posts, nil == TotalViews) -IsAdmin(Authors[0]) -string(Posts) -get(Posts, TotalViews)?.PublishDate -Authors[TotalViews]?.ID -Authors[TotalViews]?.Profile -TotalViews < TotalViews -max(TotalViews) -Authors != Authors -map(Posts, #) -len(map(Posts, 0)) -string(TotalViews .. TotalViews) -TotalViews > TotalViews -last(0 .. TotalViews) -toJSON(Authors) -{" ": TotalViews}?.Content -last(map(Posts, Posts)) -TotalViews == TotalViews --(TotalViews / 0.5) -Posts != Posts -TotalViews ** 0 < TotalViews -!("JavaScript" <= "Go") -Authors[TotalViews].ID -int(min(1, 0)) -Authors[TotalViews % TotalViews] -map(map(Posts, Authors), nil == Posts) --max(2) --(TotalViews + TotalViews) -{"Go": nil, "Go": 0.5}?.Content?.AuthorName -get(Posts, 2).Title -!(TotalViews == nil) -first(Posts).Title -not none(Posts, true) -not (nil in Posts) -TotalViews ^ TotalViews -map(Posts, Posts) --(TotalViews % TotalViews) -get(Posts, 0).Content -last(Posts)?.Likes -TotalViews in Posts -Authors[TotalViews].LastName -get(Posts, 0).Title -filter(Posts, TotalViews > TotalViews) -{"JavaScript": Posts} ---TotalViews -TotalViews + TotalViews -TotalViews .. abs(TotalViews) -TotalViews != TotalViews -!(1 != TotalViews) -WithID(Posts, TotalViews)?.ID -TotalViews < -TotalViews -get(map(Posts, TotalViews), TotalViews) -TotalViews / TotalViews -TotalViews < TotalViews ? Authors : Authors == Authors -[get(Posts, TotalViews), Authors] -map(Posts, float(1)) -Authors[2].ID -TotalViews >= TotalViews ? TotalViews : Posts -TotalViews % TotalViews -max(0 ** 0.5) -TotalViews > TotalViews ? Authors : 0.5 -TotalViews + TotalViews - TotalViews -Posts == Posts -TotalViews ** 0 - TotalViews -not none(Posts, false) -any(Posts, TotalViews <= 2) -IsAdmin(get(Authors, TotalViews)) -!(Authors != nil) -TotalViews in Posts ? TotalViews : 2 -[TotalViews] -TotalViews <= TotalViews + TotalViews -float(TotalViews) >= TotalViews -0 % TotalViews .. TotalViews + TotalViews -0 ** TotalViews >= float(0) -first(Posts)?.ID -not (Authors != nil) -TotalViews in Authors -Posts[0].Content -not (TotalViews == 0) -!any(Posts, false) -!(TotalViews == 0) -TotalViews - TotalViews <= float(0) -TotalViews ^ 1 ^ 1 --(TotalViews - 0) -first(Posts).Likes -!(Authors == Authors) -float(TotalViews) > count(Posts, true) -false ? Authors : TotalViews + TotalViews -all(Posts, TotalViews < TotalViews) -toJSON(" " startsWith " ") -string(filter(Posts, true)) -int(TotalViews / TotalViews) -float(0 ^ TotalViews) -get(Posts, 0)?.Likes -all(Posts, TotalViews > TotalViews) -not (1 in Posts) -WithID(Posts, 1).PublishDate -TotalViews >= TotalViews ** TotalViews -get(Authors, 1)?.FirstName --(0 - TotalViews) -(0.5 / TotalViews) ^ TotalViews ---0 -trim(upper("Go")) -int(int(TotalViews)) -TotalViews <= TotalViews ** TotalViews --(0 + TotalViews) -none(Posts, "Go" contains "JavaScript") -toJSON(0.5 == 2) --int(TotalViews) -!(TotalViews in Authors) -Posts[2].PublishDate --2 in Authors -map(Posts, #?.Likes) -(2 + TotalViews) ^ TotalViews -(TotalViews + TotalViews) / TotalViews -Authors[TotalViews].FirstName -none(Posts, Posts == Posts) -toJSON(TotalViews > TotalViews) -(TotalViews * 0.5) ** TotalViews -Posts[2]?.Author -Authors[nil].FirstName -!(TotalViews == TotalViews) --(TotalViews ** TotalViews) -toJSON(TotalViews ** 2) -first(Posts).Tags -not (Authors == Authors) -min(2 ** TotalViews) --(0 - 0) -1 < TotalViews ? Posts : Authors -all(Posts, one(Posts, true)) -map(Posts, TotalViews <= 2) -[Posts] -TotalViews * TotalViews -TotalViews <= -(0.5 - TotalViews) -WithID(Posts, TotalViews) -Posts != map(Posts, Posts) -!(2 == TotalViews) -!(nil == Authors) -get(Authors, TotalViews) --(TotalViews ** 0) -Authors[1].FirstName -TotalViews - 0 != -0 --(TotalViews * 0) -string(TotalViews > TotalViews) -map(map(Posts, Authors), #) -{" ": TotalViews, " ": Posts}.PublishDate -get(Authors, 0)?.Profile -get(Authors, TotalViews).LastName -first(Posts).Author -{"Go": Authors} -TotalViews > int(2) -map(Posts, min(0.5)) -map(false ? 1 : Authors, Authors) -!(TotalViews == 0.5) -get(Posts, TotalViews)?.Tags -!(nil != Posts) -toJSON(TotalViews < TotalViews) -0.5 * TotalViews * TotalViews -TotalViews == TotalViews != nil -string(!true) --TotalViews ^ min(0) -get(Posts, TotalViews)?.ID -toJSON(max(0.5)) -TotalViews * 0 / TotalViews -not not false -{" ": Posts}?.Author -any(Posts, Authors != Authors) -get(Authors, 0)?.Email -string(Posts[TotalViews:TotalViews]) -get(Posts, TotalViews)?.Likes -first(map(Posts, true)) -abs(TotalViews / 0.5) -Posts[2].Tags -toJSON(upper("JavaScript")) --0 + TotalViews -toJSON(float(TotalViews)) -get(Authors, TotalViews)?.Email -2 / TotalViews >= TotalViews -TotalViews ^ TotalViews > TotalViews -TotalViews < TotalViews - 0 -TotalViews > TotalViews * TotalViews -TotalViews % TotalViews / TotalViews -any(Posts, nil != Authors) --TotalViews > TotalViews -string(map(Posts, Authors)) -get(Authors, TotalViews)?.FirstName -Authors[2]?.LastName -any(Posts, TotalViews == 2) -string(0 <= TotalViews) -!(TotalViews > TotalViews) -not (TotalViews == TotalViews) -!(TotalViews >= TotalViews) -map(Posts, TotalViews in Posts) -count(Posts, TotalViews <= TotalViews) -len(map(Posts, TotalViews)) -Title(WithID(Posts, TotalViews)) -TotalViews < 0 ? Authors : "Go" -!(" " == nil) -count(Posts, 0 >= TotalViews) -not (TotalViews in Posts) --(2 - TotalViews) -get(Posts, -0) -get(Posts, TotalViews)?.Content -abs(len(Authors)) -TotalViews / (1 - 2) -IsZero(WithID(Posts, 0)) -Posts[0].PublishDate -TotalViews in Posts ? TotalViews : Authors -get(Posts, 2)?.Likes -toJSON(toJSON(Posts)) -map(Posts, get(Posts, TotalViews)) -get(Posts, TotalViews)?.Comments -Posts[0]?.Tags -TotalViews % TotalViews != TotalViews -!(Authors != Authors) -Authors[TotalViews].Profile -!(0.5 == 0.5) -not (TotalViews >= TotalViews) -0.5 / 0 <= TotalViews -abs(TotalViews ** TotalViews) -TotalViews > TotalViews ? Posts : TotalViews -!(TotalViews < TotalViews) -not (0 == TotalViews) -TotalViews + 0.5 ** TotalViews -{" ": Authors} -TotalViews == 1 / TotalViews -TotalViews < TotalViews ? Authors : 1 -len(Posts) >= TotalViews ^ 0 -(0 % TotalViews) ^ 1 ^ 0 -last(Posts)?.Author -map(Posts, not false) -get(Authors, TotalViews).ID -get(Posts, TotalViews)?.Author -all(Posts, TotalViews > 0.5) -Authors[TotalViews + TotalViews] -TotalViews - TotalViews > TotalViews ^ TotalViews --count(Posts, true) -map(Posts, 0.5) != Posts -!(TotalViews > 0) -TotalViews + 1 .. TotalViews -Posts == Posts ? TotalViews : 0 -toJSON(TotalViews / TotalViews) -len(TotalViews .. TotalViews) -toJSON(max(TotalViews)) -get(Authors, TotalViews)?.LastName -TotalViews ** 2 + TotalViews -WithID(Posts, 0)?.Content -abs(TotalViews - TotalViews) -last(Posts).Content -Posts[2]?.Title --abs(TotalViews) -Authors[-1] -max(TotalViews) < TotalViews -abs(len(Posts)) -TotalViews / 0.5 / TotalViews -toJSON(TotalViews == nil) -toJSON(toJSON(nil)) -Posts[0].Likes -not (TotalViews > TotalViews) -first(Posts)?.Content --(TotalViews * 0.5) -toJSON(nil == Authors) -true ? "JavaScript" : TotalViews in map(Posts, Posts) -string(map(Posts, true)) -{"JavaScript": Authors} -[Posts, Posts] -toJSON(TotalViews <= TotalViews) -get(Authors, 1 - TotalViews) -get(map(Posts, Posts), TotalViews) -string(TotalViews / 0) -not (Posts == Posts) -TotalViews > 0.5 * TotalViews -TotalViews .. TotalViews % TotalViews -get(Authors, TotalViews).Email -string(none(Posts, false)) -toJSON(-0.5) -TotalViews .. 1 == map(Posts, Authors) -{"Go": Posts} -not (0 != 0.5) -get(Authors, TotalViews).Profile -!(TotalViews != 0) -WithID(Posts, TotalViews).Tags -TotalViews > TotalViews + TotalViews -none(Posts, TotalViews != TotalViews) -map(map(Posts, 1), #) -IsAdmin(Authors[TotalViews]) -!(0.5 < TotalViews) -get(Authors, TotalViews).FirstName -Posts[1]?.Comments -all(Posts, TotalViews == TotalViews) -TotalViews - TotalViews - 1 -{"Go": TotalViews} -get(Posts, 1)?.Likes -Authors[TotalViews].Email -IsAdmin(get(Authors, 1)) -TotalViews ** 2 > TotalViews -not (Posts != nil) -string(-0.5) -TotalViews % min(TotalViews) -TotalViews > len(Authors) -get(Posts, 0).Comments -{"JavaScript": Authors}?.Website -TotalViews ** 0 + TotalViews -TotalViews <= -0 -{" ": nil}?.Comments -!(false != nil) -!(nil == Posts) -Posts[1].Content -lower(string(Authors)) -nil != Authors || true != false -(TotalViews - TotalViews) % TotalViews -Posts == Posts ? Authors : 0 * TotalViews -0.5 != 2 ? Posts : Posts -Authors[0].LastName -{" ": Authors, " ": Authors, " ": Posts, "Go": false}.Birthday -max(TotalViews - TotalViews) -toJSON(Authors[TotalViews]) -none(map(Posts, false), #) -not (Posts != Posts) -get(Posts, 0).ID -!(TotalViews != TotalViews) -len(toJSON(Posts)) -TotalViews >= TotalViews % TotalViews -!(TotalViews != 1) -Title(Posts[1]) -none(Posts, "Go" > "Go") -TotalViews * (TotalViews - TotalViews) -toJSON(TotalViews <= 2) -one(Posts, 0.5 == 1) -get(map(Posts, 0), TotalViews) -Authors[nil]?.ID -string(nil in Posts) -count(Posts, false) .. TotalViews -TotalViews ** (TotalViews + 0) -map(false ? Authors : Posts, Authors) -last(Posts)?.Content -2 - TotalViews == TotalViews -TotalViews == TotalViews - 0 -none(Posts, TotalViews == 2) -len(Authors) + TotalViews -string(0 .. TotalViews) -min(TotalViews + 0) -!(TotalViews <= TotalViews) --TotalViews >= TotalViews -Title(last(Posts)) -toJSON(TotalViews <= 0.5) -int(TotalViews ^ TotalViews) -map(Posts, TotalViews == TotalViews) -not (Posts == nil) -TotalViews + 0 <= TotalViews -len(string(Authors)) -get(Posts, 2)?.Content -min(2 - TotalViews) -Authors[0].ID -string(int(TotalViews)) -Posts[TotalViews:TotalViews] -0 - TotalViews - TotalViews -not all(Posts, true) --(TotalViews * TotalViews) --TotalViews / TotalViews -!(nil == TotalViews) -not (nil != Authors) -!(TotalViews < 0.5) -map(map(Posts, TotalViews), 0 % TotalViews) -0 - 0.5 >= TotalViews -filter(Posts, 0 <= 0) -map(Posts, get(Authors, 0)) -nil == Authors[TotalViews % TotalViews] -Authors != nil ? nil : TotalViews -float(min(TotalViews, 0)) -count(Posts, 1 >= TotalViews) -last(Posts).Tags -0.5 / TotalViews > TotalViews -get(Authors, TotalViews)?.ID -!(0.5 >= TotalViews) -nil == 2 ? Posts : TotalViews -max(TotalViews * 1) -TotalViews / TotalViews - TotalViews -map(Posts, Posts) == Posts -0 == TotalViews or 0 > TotalViews -all(Posts, Posts == Posts) -get(Posts, 2).Comments -get(Posts, max(TotalViews)) -not (TotalViews in Authors) -first(map(Posts, Authors)) -get(Posts, 0).PublishDate -!(2 < 1) -min(TotalViews, TotalViews) -(0.5 - TotalViews) / 0 ** 0 -none(Posts, 1 == TotalViews) -get(Authors, 0)?.ID -float(TotalViews) - TotalViews -toJSON(not true) -map(Posts, nil == TotalViews) -get(Posts, 2).Content -any(Posts, IsZero(#)) -last(Posts).Comments -Posts[1].Likes -string(TotalViews * 0) -TotalViews * TotalViews * TotalViews -false ? true : TotalViews * TotalViews -not ("JavaScript" matches "JavaScript") -0 % TotalViews .. TotalViews -!(Posts == Posts) -TotalViews == TotalViews ? TotalViews : TotalViews -string(TotalViews + 2) -{"JavaScript": Posts, " ": 0.5, "JavaScript": TotalViews}.Content -map(Posts, toJSON(Posts)) -TotalViews in 0 .. TotalViews -!false ? Authors : Authors -toJSON(0 * TotalViews) -Authors[2]?.FirstName -not (0.5 <= TotalViews) -!(0 <= 0) -get(Posts, TotalViews)?.Title -false ? Authors : TotalViews in Authors ? TotalViews : 0.5 -string(max(TotalViews)) -max(0 + TotalViews, TotalViews - 2) -map(Posts, TotalViews ** 0) -max(1 * TotalViews) -max(max(0)) -0 >= TotalViews ? Posts : TotalViews -TotalViews * 0.5 * 0.5 ^ 0 --0 ^ TotalViews -{"Go": Posts, "JavaScript": true, "JavaScript": Authors}.Birthday -!!true -Authors[1 % 2] -(0 - 0) ^ TotalViews -TotalViews / TotalViews != TotalViews -string(Posts == Posts) -toJSON(TotalViews in Authors) -get(Posts, 1)?.Content -TotalViews - 0 % TotalViews -!(nil != "Go") -TotalViews * 2 % TotalViews -map(map(Posts, Posts), TotalViews) -2 * 2 > TotalViews -WithID(Posts, TotalViews).Author -int(len(Posts)) -map(Posts, TotalViews < TotalViews) -Authors[TotalViews]?.Email -map(Posts, 0.5 / 0) -0.5 + 1 + TotalViews -float(TotalViews % TotalViews) -!(Posts != nil) -string(!false) -TotalViews ** 2 == TotalViews -IsZero(WithID(Posts, TotalViews)) -int(toJSON(0)) -last(Posts).Title -filter(Posts, Posts == nil) --TotalViews % TotalViews -TotalViews + TotalViews .. TotalViews -string(-TotalViews) -!(2 in Posts) -TotalViews < TotalViews ? Posts : 0.5 --TotalViews <= TotalViews -get(Posts, 1)?.Comments -toJSON(0 * 0.5) -Authors[nil].ID -get(Authors, int(TotalViews)) -abs(abs(2)) -Posts != filter(Posts, false) -one(map(Posts, true), #) -map(map(Posts, TotalViews), #) -{"Go": Authors}?.Content -not (nil != 0.5) -Posts == map(Posts, 0.5) -last(map(Posts, Authors)) -Posts[1]?.ID -IsZero(last(Posts)) -TotalViews - TotalViews ** 0 -map(Posts, string(TotalViews)) -not (TotalViews != TotalViews) -!none(Posts, true) -string(toJSON(Posts)) -{" ": TotalViews} -get(Authors, 0).FirstName -not (0 != TotalViews) -!(2 <= TotalViews) -0 - 0 in Authors -get(TotalViews .. TotalViews, TotalViews) -not ("Go" != nil) -string(TotalViews % TotalViews) -Title(Posts[2]) -not (0 >= TotalViews) -TotalViews / -TotalViews -{"JavaScript": TotalViews} -fromJSON(toJSON(TotalViews)) --len(Posts) --(TotalViews ^ 0.5) -TotalViews <= TotalViews == false -" " in Authors[TotalViews] -map(map(Posts, #), Authors) -abs(TotalViews * TotalViews) -get(Authors, 2)?.Email -map(map(Posts, Posts), toJSON(Posts)) -TotalViews * 0 <= 2 - TotalViews -TotalViews in Authors == nil -map(map(Posts, TotalViews), get(Posts, 0)) -map(Posts, first(Posts)) -TotalViews + 0 == TotalViews --TotalViews == TotalViews -filter(Posts, TotalViews != TotalViews) -TotalViews != 1 / TotalViews -TotalViews + 0.5 <= TotalViews -toJSON(TotalViews != 0) -Authors[nil]?.Email -Posts[1].Tags -string(true == nil) -none(Posts, nil != TotalViews) -get(Authors, 1).ID -get(Posts, 1).ID -!(nil != TotalViews) -float(TotalViews * TotalViews) -get(Posts, TotalViews % TotalViews) -one(map(Posts, Posts), 0 in Posts) -Posts[1]?.Content -TotalViews * int(0.5) -string(toJSON(TotalViews)) -get(Posts, 1)?.Tags -0 ** TotalViews / TotalViews -all(Posts, false && false) -map(map(Posts, 0), TotalViews) -TotalViews <= 1 ^ TotalViews -Authors[0 * 0] -TotalViews <= TotalViews / 0.5 -string(TotalViews / TotalViews) -TotalViews != 0 + 1 -{"Go": TotalViews, "Go": Authors, "Go": TotalViews}.Content -TotalViews ^ TotalViews ** TotalViews -first(map(Posts, Posts)) -!(Posts != Posts) -WithID(Posts, 0)?.Comments -map(map(Posts, "Go"), TotalViews) -TotalViews > 0.5 ^ TotalViews -count(Posts, TotalViews == 0.5) -TotalViews ^ (0 / 0) -map(Posts, last(Posts)) -WithID(Posts, TotalViews)?.Tags -get(Posts, -1) -min(0 + 0) -TotalViews * TotalViews <= TotalViews -len(Authors) in Authors -Authors == nil ? Posts : TotalViews -Posts != nil ? Authors : TotalViews -one(Posts, TotalViews < TotalViews) -!none(Posts, false) -Posts[0].Author -TotalViews != 0 ? TotalViews < TotalViews : Posts -Authors[nil].Email -get(Authors, 2)?.Profile -{"JavaScript": Posts}?.ID -first(Posts)?.Author -not (0 < 0.5) -first(filter(Posts, false)) -Posts[2]?.Tags -TotalViews * TotalViews != TotalViews -not (TotalViews < 0.5) -filter(Posts, 0 == TotalViews) -TotalViews ** 1 == TotalViews --(0 / TotalViews) -abs(-TotalViews) -TotalViews == nil == nil -map(map(Posts, 0.5), Posts) -not (1 < TotalViews) -TotalViews ^ -TotalViews -Posts == Posts[TotalViews:TotalViews] -Authors == Authors ? "Go" : Posts -all(Posts, 2 >= TotalViews) -TotalViews - TotalViews >= Authors[TotalViews].ID -not (0 < TotalViews) -map(Posts, TotalViews .. 0) -max(TotalViews % TotalViews) -toJSON(!false) -map(Posts, TotalViews / 1) -all(Posts, TotalViews in Posts) -max(TotalViews + TotalViews) -not (true or false) -float(TotalViews) * TotalViews -get(Authors, TotalViews)?.Profile -TotalViews <= 0 % TotalViews -TotalViews > TotalViews ? Posts : Authors[TotalViews] -any(Posts, TotalViews in Posts) -filter(Posts, none(Posts, false)) -IsZero(first(Posts)) -map(Posts, TotalViews >= TotalViews) -nil != TotalViews ? TotalViews : map(Posts, TotalViews) -abs(-0.5) -TotalViews == TotalViews % TotalViews -first(Posts)?.Comments -WithID(Posts, TotalViews)?.Author -one(Posts, nil != 1) -first(Posts)?.Tags -map(Posts, #?.Tags) -Posts[1]?.Likes -TotalViews >= TotalViews ? TotalViews : " " -all(Posts, false) ? last(Posts) : TotalViews -TotalViews ** (TotalViews * 1) -TotalViews != -TotalViews --(0 + 0) -Posts[0]?.Comments -count(Posts, nil != Posts) -(0.5 + TotalViews) ** TotalViews -TotalViews - TotalViews in Authors -IsAdmin(Authors[nil]) -one(Posts, 0 <= 1) -2 ** 0.5 > TotalViews ** 1 -any(Posts, nil in Posts) -!(2 < 0) -TotalViews < TotalViews != false -{"JavaScript": Posts, "Go": "JavaScript"}.Birthday -abs(TotalViews) >= TotalViews -count(Posts, true) % TotalViews -!(TotalViews < 1) -filter(map(Posts, 0.5), TotalViews >= TotalViews) -toJSON(0 ^ 2) -TotalViews / (2 - 1) -toJSON(first(Posts)) -TotalViews ^ 0 != TotalViews -string(-(TotalViews * TotalViews)) -TotalViews != 0 / TotalViews -toJSON(get(Authors, TotalViews)) -float(float(0)) -get(Posts, 1).Likes -count(Posts, Posts != Posts) -first(true ? Posts : Authors) --min(TotalViews) ---0.5 -max(TotalViews ^ TotalViews) -0.5 >= TotalViews ? Authors : TotalViews * TotalViews -first(Posts[TotalViews:TotalViews]) -(TotalViews * TotalViews) ^ TotalViews -map(Posts, abs(TotalViews)) -TotalViews == int(TotalViews) -Authors[0]?.LastName -not (0.5 < 1) -TotalViews != 0.5 + TotalViews -toJSON(TotalViews % TotalViews) -true ? Authors : TotalViews % TotalViews -one(Posts, Authors != Authors) -[get(Authors, TotalViews)] -not (0.5 != TotalViews) -get(Posts, 1).Comments -TotalViews + 0 in Posts -0.5 ^ 1 <= TotalViews -Posts[0]?.Likes -first(Posts)?.PublishDate -string(true ? TotalViews : TotalViews) -int(1 / 0) -0 * 1 * TotalViews --(TotalViews / TotalViews) -Authors[0]?.Profile -max(TotalViews ^ 0) -not false ? nil : Posts -count(Posts, true) * TotalViews -filter(Posts, 0 >= 0.5) -all(Posts, Authors == Authors) -TotalViews >= 0.5 ^ TotalViews -get(Posts, 2).ID -{"Go": TotalViews, "Go": TotalViews, "JavaScript": Authors, " ": Authors, "JavaScript": TotalViews}?.Title -last(Posts)?.Tags -TotalViews <= TotalViews / 0 -Authors != Authors == one(Posts, false) -TotalViews in Posts ? "Go" : Authors -TotalViews + 0 ^ TotalViews -first(TotalViews .. TotalViews) -get(Posts, TotalViews - TotalViews) -string(TotalViews + TotalViews) -none(Posts, TotalViews == TotalViews) -min(-TotalViews) -last(Posts).ID -Posts[0].ID -none(Posts, TotalViews <= TotalViews) -string(map(Posts, Posts)) -get(TotalViews .. 0, TotalViews) -one(Posts, TotalViews in Posts) -get(Authors, 1)?.ID -none(map(Posts, Posts), Posts == Posts) -toJSON(TotalViews > 0) -Posts[0]?.ID -TotalViews / (TotalViews - 0) -TotalViews / (TotalViews + TotalViews) -TotalViews in Authors and TotalViews <= TotalViews -map(Posts, Authors[TotalViews]) -int(1 * TotalViews) -all(Posts, 2 == TotalViews) -max(TotalViews, TotalViews) -toJSON(get(Posts, TotalViews)) -{"JavaScript": TotalViews == TotalViews} -min(0, TotalViews) ** TotalViews -toBase64(string(Posts)) -TotalViews != 0 ** TotalViews -count(Posts, TotalViews >= TotalViews) -first(Posts).ID -{"JavaScript": Authors, "Go": Authors}?.Likes?.ID -TotalViews - TotalViews * TotalViews -toJSON(map(Posts, Authors)) -{" ": Posts} -float(TotalViews / 0) -!(TotalViews == 1) -TotalViews != TotalViews - TotalViews -last(Posts)?.ID -TotalViews == float(0.5) -TotalViews ** (0 / TotalViews) -count(Posts, !(TotalViews <= TotalViews)) -get(Authors, -0) -Authors[nil]?.LastName -toJSON(Authors == Authors) -IsAdmin(get(Authors, 0)) -abs(TotalViews) <= TotalViews -TotalViews == -TotalViews -int(0 + 0) -all(Posts, "JavaScript" < "Go") -TotalViews >= 0 - TotalViews -map(filter(Posts, false), TotalViews) -string(TotalViews - TotalViews) -!all(Posts, false) -TotalViews == 1 ? 1 : Authors -map(Posts, TotalViews ** 2) -Posts[2]?.Likes --(0 ^ 0) -TotalViews ** (1 - TotalViews) -TotalViews > 0 ^ 0.5 -last(map(Posts, "JavaScript")) -not (2 != 0.5) -!(TotalViews > 1) -get(Authors, 0).ID -max(TotalViews * 0) -Authors[nil].LastName -string(map(Posts, 0.5)) -map(map(Posts, TotalViews), TotalViews) -Authors[0 + TotalViews] -1 % TotalViews / TotalViews -len(string(Posts)) -string(0 >= 0.5) -(1 * TotalViews) ^ TotalViews -!(1 > 0.5) -not (1 in Authors) --0 <= TotalViews / 0.5 -{" ": false, "Go": TotalViews}.FirstName -TotalViews ** 0 ^ TotalViews -toJSON(-TotalViews) -string(TotalViews >= 2) -int(TotalViews * TotalViews) -TotalViews % TotalViews >= TotalViews -get(map(Posts, Authors), TotalViews) -TotalViews > TotalViews ** TotalViews -WithID(Posts, TotalViews).ID -TotalViews + 0.5 ^ TotalViews -map(Posts, int(0)) -toJSON(1 > TotalViews) -WithID(Posts, TotalViews).Comments -len("JavaScript") > TotalViews -Title(WithID(Posts, 0)) -string(Authors == nil) -WithID(Posts, TotalViews).PublishDate --(2 ** 0) -string(false ? Posts : false) -string(2 == 0.5) -count(TotalViews .. TotalViews, TotalViews != TotalViews) -!(true != true) -get(Posts, 0)?.Content -one(Posts, Posts != Posts) -map(TotalViews .. TotalViews, TotalViews) -count(Posts, TotalViews != 0) -string(Authors[TotalViews]) -len(toJSON(2)) -upper(string(" ")) -map(Posts, Authors) != Posts -not (nil != Posts) -Title(get(Posts, 2)) -WithID(Posts, 0).Author.FirstName -Authors[0]?.FirstName -not (true || false) -int(string(TotalViews)) --(0.5 ^ TotalViews) -TotalViews > TotalViews ? Authors : TotalViews -IsZero(get(Posts, 2)) -map(Posts, count(Posts, true)) -toJSON(0.5 < TotalViews) -string(2 < TotalViews) -not (TotalViews > 0.5) -not (" " > "JavaScript") -any(Posts, Authors == Authors) -TotalViews in TotalViews .. 0 --(0.5 / TotalViews) --(TotalViews ^ TotalViews) -0 ** 0.5 + abs(TotalViews) --1 in Posts -one(Posts, 0 < TotalViews) -TotalViews * TotalViews ** TotalViews -!(0 in Authors) -map(filter(Posts, true), #) -get(map(Posts, "Go"), TotalViews) -string(TotalViews % 1) -!(TotalViews in Posts) -toJSON(TotalViews ** 1) -count(Posts, TotalViews in Authors) -float(toJSON(TotalViews)) --float(TotalViews) -Title(first(Posts)) -int(TotalViews) > TotalViews -map(filter(Posts, false), 0 < 2) -TotalViews <= TotalViews * 2 -map(map(Posts, "JavaScript"), Posts) -any(Posts, TotalViews <= TotalViews) -count(Posts, nil == nil) -WithID(Posts, 0).Content -TotalViews - min(0.5) -map(Posts, Posts[0]) -map(map(Posts, Posts), #) -0.5 + 0 + min(TotalViews) -TotalViews in map(Posts, Authors) -TotalViews != TotalViews ? TotalViews : nil -Authors[1].LastName -not (TotalViews == nil) -0 - TotalViews in Posts -get(Posts, 2 - TotalViews) -none(Posts, TotalViews in Posts) -TotalViews * abs(TotalViews) -0.5 <= TotalViews or TotalViews > TotalViews -get(false ? Authors : Authors, TotalViews % TotalViews) -{" ": Posts}?.ID -map(Posts, TotalViews in Authors) -abs(TotalViews) != TotalViews -min(TotalViews * TotalViews) -first(Posts).PublishDate -false ? true : TotalViews in Posts -not all(Posts, false) -count(Posts, 0 == 2) -true ? Authors : TotalViews == TotalViews -!(TotalViews != nil) -{" ": TotalViews - 2} -string(Authors[0]) -max(abs(0)) -TotalViews / TotalViews / TotalViews ^ TotalViews -!(TotalViews <= 0) -TotalViews ** (TotalViews - TotalViews) -WithID(Posts, TotalViews).Content -TotalViews ** TotalViews ** TotalViews -TotalViews in Authors ? Posts : Posts -{" ": false}?.Profile -TotalViews ** (TotalViews * 2) -TotalViews ^ 0 + TotalViews ^ TotalViews -map(map(Posts, TotalViews), Posts) -TotalViews + TotalViews / 0.5 -get(Posts, 2)?.Title -0.5 ^ TotalViews ^ TotalViews -TotalViews > -TotalViews -string(0 > TotalViews) -map(Posts, .ID) -{"JavaScript": 1, " ": Authors}?.Biography -not (TotalViews == 1) -string(string(" ")) -map(Posts, 1 ^ TotalViews) -toJSON("Go" matches "Go") -filter(Posts, TotalViews in Posts) -TotalViews in map(Posts, Posts) -one(map(Posts, false), #) -map(Posts, -TotalViews) -{" ": Posts, "Go": Authors}.Author -TotalViews * TotalViews / TotalViews -IsZero(get(Posts, 0)) -one(Posts, TotalViews <= TotalViews) -last(Posts).Likes -!!false -map(map(Posts, Authors), TotalViews > TotalViews) -float(len(Authors)) -float(float(TotalViews)) -Authors[2]?.ID -get(Posts, 2)?.Author -min(len(Posts)) -!one(Posts, true) -2 - TotalViews != TotalViews -false ? Authors : TotalViews / int(TotalViews) -map(false ? false : Posts, Posts) -toJSON(one(Posts, false)) -WithID(Posts, TotalViews)?.Content -!(0 >= 0) -max(count(Posts, true)) -TotalViews <= len(Posts) -TotalViews == TotalViews or 0 == TotalViews -count(Posts, TotalViews == 2) -Authors != Authors ? TotalViews : 0 -int(TotalViews) ^ TotalViews -not (1 > 0) --(TotalViews - TotalViews) -{"JavaScript": Posts}.PublishDate -float(TotalViews / TotalViews) -map(TotalViews .. 0, Posts) -last(map(Posts, TotalViews)) -{"JavaScript": Add(0, 0)} -abs(TotalViews + 1) -not (Authors != Authors) -Authors[0].FirstName -toJSON(TotalViews + 0) ---max(2) -{"JavaScript": Authors, " ": Posts, " ": TotalViews}.Author -not (TotalViews < 1) -0 ^ 2 > count(Posts, false) -not ("Go" contains "JavaScript") -len(Posts) ** TotalViews -abs(TotalViews ** 0) -map(Posts, .Author) -get(Posts, len(Posts)) -toJSON(min(2)) --(0.5 - TotalViews) -count(Posts, Authors == Authors) -{"JavaScript": TotalViews}.Website -TotalViews <= TotalViews && TotalViews > TotalViews -count(map(Posts, TotalViews), TotalViews < TotalViews) -!(TotalViews >= 0) -string(Authors) matches string(false) -TotalViews ^ TotalViews * TotalViews -one(Posts, Authors == nil) -string(len(Posts)) -float(2 / TotalViews) -(0 % 2) ** TotalViews -get(Posts, 2).Author -Posts[0]?.Author -get(Authors, 2).LastName -not (1 == TotalViews) -"JavaScript" < "JavaScript" == nil ? TotalViews : Posts --TotalViews in Authors -abs(1 ** 0) -get(Posts, 0)?.ID -get(Posts, 0 * 2) -min(TotalViews % TotalViews) -nil != Authors || nil == 0.5 -{"Go": "JavaScript"}.ID -none(Posts, 0 != TotalViews) -Authors[abs(0)] -map(Posts, Authors == Authors) -map(Posts, TotalViews > TotalViews) -map(Posts, 2 ** 2) -string(2 > TotalViews) -Posts[2].Title -none(Posts, Authors != Authors) -not (TotalViews > 0) -TotalViews > TotalViews != nil -toJSON(toJSON(TotalViews)) -toJSON({"JavaScript": TotalViews}) -Authors[0].Profile -map(Posts, Authors != Authors) -TotalViews / (TotalViews + 0.5) --TotalViews ^ TotalViews -last(Posts).PublishDate -one(map(Posts, TotalViews), 1 != TotalViews) -not (TotalViews <= 0.5) -TotalViews <= TotalViews * TotalViews -min(len("Go")) -!(nil == 1) -TotalViews ** TotalViews == TotalViews -TotalViews .. 2 % TotalViews -lower(toJSON(Posts)) -any(Posts, Posts != Posts) -toJSON(TotalViews - 0) -TotalViews * 2 ** TotalViews -0.5 / 0 - TotalViews - 1 -int(0 + 2) -Posts[TotalViews % TotalViews] -max(0.5 + TotalViews) -0 + TotalViews in Posts -[0 in Authors] -IsZero(Posts[0]) -[map(Posts, TotalViews)] -one(Posts, 0 != nil) -TotalViews ^ 0.5 ** (0 / 0) -TotalViews >= abs(TotalViews) -filter(Posts, 0 in Posts) -TotalViews > TotalViews and TotalViews in Authors -last(map(Posts, 0.5)) -TotalViews != TotalViews ? Authors : 0 -string(2 > 0) -2 ^ TotalViews ** TotalViews -TotalViews .. 0 + 2 -{"JavaScript": TotalViews, " ": Posts}.FirstName -toJSON(Posts == Posts) -not one(Posts, true) -Authors[2]?.Profile -min(TotalViews) - TotalViews -map(Posts, 0 .. TotalViews) -map(map(Posts, " "), TotalViews) -TotalViews in map(Posts, TotalViews) -TotalViews % TotalViews <= TotalViews -map(Posts, len(Authors)) --min(2) -filter(Posts, !false) -string(TotalViews ^ TotalViews) -int(TotalViews) > TotalViews ? Authors : Posts -TotalViews ^ 0 != TotalViews / TotalViews -float(TotalViews / 2) -none(Posts, Authors == Authors) --max(TotalViews) -map(Posts, Authors) == map(Posts, Authors) -TotalViews == TotalViews ? "Go" : TotalViews -!(0 > TotalViews) -TotalViews ** TotalViews - TotalViews -2 - 0.5 <= TotalViews ? nil : nil -filter(Posts, TotalViews <= 1) -not (0.5 == 2) -map(Posts, 0.5 ** 2) -toJSON(2 >= 0) -count(Posts, 0.5 >= TotalViews) -all(Posts, TotalViews < 0) -toJSON(1 > 0.5) -filter(Posts, TotalViews == TotalViews) -first(Posts)?.Likes -get(Posts, 2).PublishDate -Posts != nil ? Posts : true -abs(TotalViews / 0) -int(TotalViews ** TotalViews) -string(none(Posts, true)) -{"JavaScript": Authors, " ": Authors}.ID -min(TotalViews ^ 0.5) -{"JavaScript": 0.5}.Comments -get(Authors, 0).LastName -{"JavaScript": TotalViews}?.PublishDate -TotalViews - TotalViews + 0.5 -float(abs(TotalViews)) -map(Posts, 2 .. TotalViews) -any(Posts, TotalViews in Authors) -map(map(Posts, Posts), map(Posts, false)) -one(Posts, 0 < 1) -map(Posts, map(Posts, false)) -Posts[-1] -float(string(TotalViews)) -TotalViews % (0 + 1) -TotalViews ^ (TotalViews + 2) -any(Posts, 0 < 0) -any(Posts, TotalViews > 1) -abs(TotalViews) in map(Posts, Authors) -float(TotalViews ^ TotalViews) -all(Posts, nil == TotalViews) -all(Posts, TotalViews in Authors) -max(min(TotalViews)) -TotalViews < 2 / TotalViews -max(len(Posts), TotalViews) -min(-(TotalViews % TotalViews)) -count(Posts, true) / TotalViews -fromJSON(toJSON(0.5)) -TotalViews >= 0 ^ TotalViews -int(2 ^ TotalViews) -not (0 <= 1) -!(TotalViews >= 0.5) -min(TotalViews ** TotalViews) -TotalViews ** TotalViews != TotalViews / 0 -map(Posts, map(Posts, TotalViews)) -!(0 < TotalViews) -0 in Posts ? TotalViews : Authors -abs(2 - TotalViews) -TotalViews .. TotalViews - 0 -not (" " matches " ") -any(Posts, TotalViews < TotalViews) -Authors[1]?.Email -TotalViews < 0.5 * TotalViews -map(Posts, #?.ID) -get(Authors, -(TotalViews + TotalViews)) -not (TotalViews < 2) -get(Posts, abs(TotalViews)) -TotalViews * 0 == TotalViews -TotalViews / TotalViews < TotalViews -get(Posts, 2)?.Comments -filter(Posts, true != nil) -[1 ** 0] -max(abs(TotalViews)) -string(max(1)) -(2 - TotalViews) / TotalViews -TotalViews != TotalViews ^ TotalViews -TotalViews != 0.5 ? Posts : Posts -min(1 ** 0.5, min(TotalViews)) --max(0.5, TotalViews) -string(get(Posts, 1)) -none(Posts, 0 >= TotalViews) -TotalViews > count(Posts, true) -none(Posts, nil == TotalViews) -any(Posts, 0 >= TotalViews) -{"Go": TotalViews}.Content?.Likes -map(Posts, TotalViews % TotalViews) -float(1) ** TotalViews -int(TotalViews ** 1) -TotalViews >= TotalViews + 1 -TotalViews * TotalViews / 1 -len(Authors) ^ TotalViews -any(Posts, !false) -Authors[1]?.ID -Posts[0].Comments -Authors != Authors && TotalViews <= TotalViews -max(-0.5) -all(Posts, nil != 1) -last(filter(Posts, true)) -min(int(TotalViews)) -Posts[2]?.ID -map(0 .. 0, TotalViews) -last(Posts[TotalViews:TotalViews]) -abs(2 ^ 0.5) -WithID(Posts, 1).Likes -int(min(1)) -int(false ? TotalViews : TotalViews) -TotalViews + 0 ** TotalViews -float(0 % TotalViews) -map(Posts, .Title) -Authors != Authors && TotalViews > TotalViews -not true ? 0 : 0.5 -(TotalViews % TotalViews) ** TotalViews -0 + TotalViews - TotalViews -TotalViews * 1 .. TotalViews -string(Authors != Authors) -int(TotalViews - 0) -map(Posts, !true) -string(max(max(TotalViews))) -min(TotalViews) ^ TotalViews -!(1 != nil) -!("Go" != " ") -map(TotalViews .. TotalViews, Posts) --(0 / 0.5) -string(map(Posts, 1)) -{"JavaScript": Posts, "Go": " "}?.PublishDate -not (nil != nil) --(TotalViews % 2) -one(Posts, 1 in Posts) -TotalViews < TotalViews ** TotalViews -len(true ? Posts : TotalViews) -map(Posts, count(Posts, false)) -toJSON(2 ^ 1) -{"JavaScript": Authors}?.AuthorName -get(Authors, 0).Profile -TotalViews / 0 > max(0) -TotalViews - TotalViews * 2 --(TotalViews % 1) -{"JavaScript": 0 == TotalViews} -TotalViews * TotalViews ^ TotalViews -max(0.5) != 0 ? TotalViews : true -TotalViews + TotalViews ** 0.5 -Title(get(Posts, 1)) -min(TotalViews) in filter(Posts, false) -string(not true) -len(toJSON(TotalViews)) -TotalViews * TotalViews == TotalViews * TotalViews --(0.5 ** 0) -TotalViews <= abs(TotalViews) -min(TotalViews + TotalViews) -all(map(Posts, 0.5), TotalViews < 2) -string(TotalViews - 1) -(TotalViews + 0) % TotalViews -{" ": Authors}?.Content -len(string(TotalViews)) -not (nil == TotalViews) -map(map(Posts, TotalViews), Authors) -toJSON(TotalViews / 2) -one(map(Posts, Posts), none(Posts, false)) -max(max(0.5)) -toJSON(false ? Authors : Posts) -Title(get(Posts, 0)) -min(min(TotalViews)) -trim(toJSON(" ")) -max(TotalViews / TotalViews) -map(Posts, # != WithID(Posts, TotalViews)) -min(max(0)) -map(Posts, true and false) -(TotalViews / 0) ^ TotalViews -{" ": TotalViews, " ": TotalViews}?.Comments -float(count(Posts, false)) -string(WithID(Posts, TotalViews)) -TotalViews >= -0 -all([true, Posts], TotalViews <= TotalViews) -Posts == Posts ? Authors : 0.5 -!true ? true : TotalViews -not any(Posts, true) -2 + 0 .. TotalViews -!(0.5 == nil) -{"JavaScript": Posts, " ": Posts}.Biography -TotalViews >= 0.5 - TotalViews -first(map(Posts, TotalViews)) -TotalViews ^ (1 / TotalViews) -count(Posts, 0.5 >= 1) -{"JavaScript": TotalViews}.ID -all(Posts, any(Posts, false)) -TotalViews != 0 == false -map(Posts, get(Posts, 0)) -count(Posts, nil in Authors) -int(-TotalViews) -none(Posts, 0 < TotalViews) -toJSON(0 in Authors) -toJSON(trim("Go")) -toJSON(int(2)) --len("JavaScript") -!(nil != Authors) -get(Posts, 0).Tags -string(get(Authors, TotalViews)) -Posts[0]?.Content -TotalViews / 0 / TotalViews -not (1 > TotalViews) -first(Posts)?.Title -!not false -get(Posts, 1)?.Title -all(Posts, one(Posts, false)) -Posts[0].Tags -toJSON(Posts[0]) -Posts[2].Likes -TotalViews - min(TotalViews) --(0.5 - 0) -toJSON(TotalViews - TotalViews) -WithID(Posts, 0 - TotalViews) -false ? TotalViews : TotalViews > TotalViews -filter(Posts, nil == Authors) -!true and Authors == Authors --0.5 ^ TotalViews ** TotalViews -TotalViews - 1 ** TotalViews -not (2 > TotalViews) -TotalViews >= -TotalViews -TotalViews ^ TotalViews > TotalViews ? TotalViews : Posts -0 * 0 * TotalViews -not (nil in Authors) -Posts[0]?.PublishDate -TotalViews ** 0.5 / TotalViews -not (0.5 > 0.5) -{"Go": TotalViews < 0}?.Author --len(Authors) -0.5 ^ TotalViews - TotalViews -!not true -TotalViews == TotalViews + 0 -Authors[nil]?.Profile -TotalViews != 0 ^ TotalViews --1 in Authors -TotalViews <= 1 ? Authors : Authors -2 + TotalViews + TotalViews -string({" ": Authors}) -map(Posts, trim(string(nil))) -int(TotalViews - TotalViews) -toBase64(string(Authors)) -max(TotalViews * TotalViews) -not ("JavaScript" != nil) -float(0 + 2) -IsZero(get(Posts, 1)) -TotalViews * len(Posts) -string(true ? TotalViews : Posts) -float(-TotalViews) -0 ^ 0 - TotalViews -TotalViews != 1 ? false : 0 -toJSON(map(Posts, Posts)) -min(abs(0)) -len(map(Posts, Authors)) -get(false ? Authors : 0, TotalViews) -last(Posts[1:TotalViews]) -none(Posts, TotalViews != nil) -filter(Posts, 0 in Authors) -map(Posts, 0 + TotalViews) -map(Posts, Posts[1]) -TotalViews - TotalViews >= -TotalViews -0.5 ** TotalViews <= TotalViews -Authors == nil ? "Go" : true -int(TotalViews) < TotalViews -max(min(0.5, 0)) -any(Posts, none(Posts, TotalViews != nil)) -one(Posts, nil != Authors) -string(nil == "JavaScript") -none(Posts, nil != Posts) -!(0 != nil) -TotalViews == 1 ^ TotalViews -TotalViews * (TotalViews - 0) -not true ? Authors : TotalViews -TotalViews != TotalViews ? -TotalViews : Authors -TotalViews + TotalViews / 2 -map(0 .. TotalViews, #) -TotalViews ** (TotalViews / TotalViews) -any(Posts, TotalViews > TotalViews) -abs(min(TotalViews)) -TotalViews >= int(TotalViews) -lower(true ? "Go" : Posts) -max(1 / TotalViews) > TotalViews -map(Posts, TotalViews % 2) -int(toJSON(TotalViews)) -string(toJSON(false)) -!(0.5 <= 2) -upper(string(false)) -first(Posts).Comments -Posts[0]?.Title -len(0 .. TotalViews) -WithID(Posts, 1).ID -Authors == Authors && nil in Posts -{"Go": Authors, " ": Posts}?.Birthday -any(Posts, 1 > 0) -!(TotalViews != 0.5) -last(Posts)?.Author.FirstName -{"JavaScript": 0.5, " ": 0}.Tags -get(Authors, 1).Email -max(int(TotalViews)) -TotalViews ** 0 != TotalViews -all(Posts, 0 == TotalViews) -int(TotalViews / 0) -not (TotalViews <= TotalViews) -map(Posts, int(1)) -toJSON(0 in Posts) -count(Posts, true) != TotalViews -map(Posts, .Likes) -get(Posts, 1).Content -TotalViews / TotalViews / (0 - 0) -[false ? Posts : Posts] -get(Posts, 1).Author -TotalViews + 0.5 >= -2 -Authors == Authors ? TotalViews : Posts -one(Posts, TotalViews == TotalViews) -toJSON(TotalViews != TotalViews) -toJSON(TotalViews >= TotalViews) -TotalViews + TotalViews ^ 0 -not (TotalViews != 0.5) -TotalViews < TotalViews ^ TotalViews -map(Posts[0:TotalViews], TotalViews) -IsZero(Posts[1]) -!(0 <= TotalViews) -TotalViews / TotalViews >= TotalViews + TotalViews -none(TotalViews .. 0, Posts == Posts) -toJSON(float(0)) -!(TotalViews <= 0.5) -count(Posts, 2 >= 0.5) -Authors[-TotalViews] -{"Go": Authors, "Go": false}?.ID -count(Posts, true) <= TotalViews ? TotalViews : Posts -string(0 % TotalViews) -{"Go": 2, " ": nil, "JavaScript": TotalViews, "JavaScript": "JavaScript"}.Birthday -toJSON(filter(Posts, true)) -[Posts != Posts] -Posts[2].Author -get(Posts[TotalViews:TotalViews], TotalViews) -TotalViews + TotalViews != TotalViews -toBase64(string("Go")) -one(Posts, 0 == 2) -max(0 ** 1) -int(TotalViews ** 0) -map(map(Posts, true), TotalViews / TotalViews) -filter(Posts, 1 >= TotalViews) -TotalViews % TotalViews % TotalViews -float(int(TotalViews)) -TotalViews * 0 ^ 0.5 -none(map(Posts, Authors), TotalViews == 0.5) -TotalViews * TotalViews in map(Posts, 0) -abs(0.5 + 2) -filter(Posts, TotalViews < TotalViews) -get(Posts, TotalViews + 0) -{"JavaScript": true}?.Content -TotalViews == nil ? TotalViews : Authors -!(false and true) -not ("JavaScript" == nil) -last(TotalViews .. TotalViews) -TotalViews < TotalViews % TotalViews -TotalViews in Posts ? Posts : " " -max(TotalViews + 1) -string(2 in Posts) -one(Posts, Authors == Authors) -Posts != Posts ? TotalViews : TotalViews -TotalViews - 0 + TotalViews -map(Posts, TotalViews ** TotalViews) -TotalViews ^ TotalViews / 0 ** TotalViews -not (nil != TotalViews) -TotalViews - TotalViews .. TotalViews -!(nil == 0) -!(1 <= TotalViews) -int(TotalViews) + TotalViews -get(Authors, 2)?.ID -TotalViews <= 0 != false -map(map(Posts, 0.5), #) -get(Posts, 2)?.PublishDate -abs(TotalViews) + TotalViews -float(TotalViews) <= TotalViews -IsAdmin(Authors[2]) -Authors[-2] -map(Posts, 0 > 0.5) -string(true ? " " : "JavaScript") -!IsZero(Posts[1]) --0 > TotalViews -abs(TotalViews + TotalViews) -Posts == map(Posts, Posts) -abs(-0) -0 - TotalViews < TotalViews -Authors != nil ? Authors : splitAfter("Go", nil) -one(map(Posts, Posts), 0 > 0.5) -not true ? Posts : "Go" --0.5 ^ TotalViews -(TotalViews - TotalViews) ** TotalViews -float(int(0)) -!("JavaScript" matches "JavaScript") -not (Authors == nil) --0.5 > TotalViews -get(map(Posts, 1), TotalViews) -TotalViews == TotalViews + TotalViews -filter(Posts, TotalViews <= 0) -TotalViews % (TotalViews + 1) -{" ": Posts}.CommentDate -2 + 0 - TotalViews -Posts[2].Comments -any(Posts, 0 in Posts) -count(Posts, TotalViews == 0) -{"JavaScript": TotalViews}?.FirstName -min(0.5 + TotalViews) -max(-TotalViews) -map(filter(Posts, true), TotalViews) -TotalViews / 0 - TotalViews -max(TotalViews - 0) -get(Posts, 1)?.ID -false ? TotalViews : 0 >= TotalViews --int(1) -one(map(Posts, TotalViews), TotalViews >= TotalViews) -last(true ? Posts : 0) -not any(Posts, false) -{" ": " ", "Go": 1}?.Upvotes -get(Authors, 0)?.LastName -TotalViews ^ 2 ** 0 -string(nil == TotalViews) -not (0 > 2) -not true ? map(Posts, Posts) : Posts -TotalViews >= min(TotalViews) -Posts != Posts || TotalViews <= TotalViews -get(Posts, 2 % TotalViews) -map(TotalViews .. TotalViews, Authors) -int(2) > len(" ") -TotalViews <= TotalViews - TotalViews -TotalViews - TotalViews - TotalViews -last(TotalViews .. 1) -string(TotalViews) in first(Posts) -TotalViews <= 0.5 + TotalViews -Authors[nil]?.FirstName -TotalViews - int(0) -get(Posts, 0).Author -all(Posts, Authors != Authors) -get(false ? 2 : Posts, TotalViews) -not (0.5 <= 0) -max(TotalViews) == TotalViews -TotalViews ^ max(0) -toJSON(get(Posts, 0)) -map(Posts, 2 ** TotalViews) -float(TotalViews) / TotalViews ** 1 -!(0.5 < 0) -get(Authors, 2).ID -TotalViews / 1 ** 1 -last(Authors == Authors ? true : "Go") -count(map(Posts, false), #) -all(Posts, TotalViews < 1) -TotalViews % TotalViews == max(TotalViews) -all(Posts, !false) -{"JavaScript": 0}.CommentDate -{"Go": true, "Go": nil}?.Email -float(get(Authors, TotalViews).ID) -TotalViews ^ (0 + TotalViews) -Authors[1].ID -count(Posts, TotalViews < TotalViews) -!(0 == 0) -float(max(TotalViews)) --TotalViews - TotalViews -TotalViews == 2 + TotalViews -float(TotalViews) / TotalViews -TotalViews / count(Posts, true) -min(TotalViews / TotalViews) -count(Posts, TotalViews > 0) -map(Posts[TotalViews:TotalViews], Authors) -toJSON(TotalViews <= 0) -get(Authors, 0).Email -string(0 != nil) -string(Posts != Posts) -Posts != Posts ? false : 0 --(0 * TotalViews) --float(0.5) -Posts != map(Posts, "JavaScript") -TotalViews <= 0.5 / 0.5 --(1 + TotalViews) -TotalViews != nil ? Posts : "Go" -max(0) * TotalViews -TotalViews / min(TotalViews) -count(Posts, true == false) -TotalViews != TotalViews ? 0 : Authors -WithID(Posts, TotalViews).Likes -TotalViews % TotalViews in map(Posts, Posts) -{"Go": TotalViews}.Likes -one(Posts, 0.5 <= 0.5) -TotalViews >= 0.5 + 1 -TotalViews > TotalViews ? nil : nil -abs(TotalViews - 0) -TotalViews > TotalViews - 0 -toJSON(TotalViews * 0) -get(Authors, 0 + 2) -max(TotalViews) ^ TotalViews -Posts[2 + 0] -(0 - TotalViews) / TotalViews * TotalViews -len(map(Posts, Posts)) -all(Posts, 0 == 0.5) -toJSON(!(nil == Posts)) -!("JavaScript" != nil) -get(Authors, 0 * TotalViews) -Authors[TotalViews - TotalViews] -{"Go": Authors}?.ID -{"JavaScript": TotalViews}.Biography?.Age(TotalViews) -TotalViews * 0 < TotalViews -(TotalViews + TotalViews) ** TotalViews -TotalViews + TotalViews > TotalViews -map(map(Posts, Posts), Authors) -IsZero(Posts[2]) -TotalViews >= 0 ** 0 -!(2 > TotalViews) -TotalViews - TotalViews < TotalViews -get(Posts, 0)?.Tags -min(1 - 0) -min(count(Posts, false)) -1 * TotalViews - TotalViews -Authors == Authors != nil ? Posts : Authors -!(TotalViews < 0) -Posts != Posts ? Posts : -TotalViews -TotalViews == abs(TotalViews) -string([Posts]) -TotalViews ** -0 -TotalViews != 2 * TotalViews --2 == TotalViews -first(Posts).Content -any(Posts, TotalViews > 0) -TotalViews ^ (0 / TotalViews) -Authors == nil ? "JavaScript" : TotalViews -toJSON(1 < 1) --(0.5 + 0) -none(Posts, TotalViews < TotalViews) -Posts == nil ? Authors : TotalViews -get(true ? "Go" : Authors, 0.5 <= TotalViews) -TotalViews ^ TotalViews <= TotalViews -any(Posts, 2 < TotalViews) -{" ": Authors}.ID -map(Posts[TotalViews:TotalViews], #) -string(all(Posts, true)) -count(Posts, TotalViews > TotalViews) -one(Posts, nil in Posts) -not (0.5 < TotalViews) -string(nil == Authors) -all(map(Posts, Posts), TotalViews != TotalViews) -map(map(Posts, TotalViews), toJSON(0.5)) -Add(1, 2) / (TotalViews + TotalViews) -false ? nil : TotalViews >= 0.5 ** TotalViews -all(Posts, all(Posts, true)) -{" ": Authors}?.Email -{"Go": 0.5, "Go": Authors}.Tags -filter(Posts, Posts != nil) -filter(Posts, all(Posts, false)) -min(TotalViews) ** TotalViews -all(map(Posts, Authors), 1 >= 0.5) -none(Posts, "Go" == "Go") -{" ": Authors, " ": nil != 1} -string(last(Posts)) -string(2 == 1) -IsAdmin(Authors[1]) -0 .. 0 != Posts ---(0.5 / TotalViews) -TotalViews - TotalViews + TotalViews -any(Posts, TotalViews == 0) -map(Posts, -0.5) --(0.5 + TotalViews) -string({"JavaScript": Posts, " ": Authors}.Title) -any(Posts, nil == TotalViews) -toJSON(int(TotalViews)) -1 * TotalViews - TotalViews % TotalViews -TotalViews == TotalViews == nil -len(Authors) * 0.5 ** TotalViews -int(len(Authors)) -count(Posts, true) > TotalViews -len(map(Posts, 2)) -not true ? TotalViews : false -filter(Posts, IsZero(#)) -one(Posts, TotalViews in Authors) --(2 + 0) -float(TotalViews + TotalViews) -{" ": Posts, "Go": Posts} -none(Posts, any(Posts, false)) -!(1 in Authors) -get(true ? Posts : Authors, string(Authors, Posts, TotalViews)) -TotalViews / TotalViews >= 0 / TotalViews -TotalViews <= TotalViews ? Authors : Posts -0 ** 1 < TotalViews -not !false -float(-2) -TotalViews - 0 .. TotalViews + 1 -toJSON(nil != Posts) -map(Posts, 0 in Posts) -true ? Posts : TotalViews > TotalViews -map(Posts, .PublishDate) -any(Posts, TotalViews <= 0) -map(TotalViews .. TotalViews, #) -Authors[0]?.Email -{"JavaScript": true, " ": TotalViews}.Comments -{" ": Authors}.Website --count(Posts, false) -toJSON(1 < TotalViews) -Title(WithID(Posts, 1)) -map(Posts, 0) != Posts -int(TotalViews + TotalViews) -float(-0) ---2 -get(Authors, 1 * TotalViews) --max(0) -0 * TotalViews - TotalViews -TotalViews > 0 ? nil : 0 -int(0.5 / TotalViews) -WithID(Posts, 0).Tags -all(Posts, 0 >= TotalViews) -min(TotalViews - TotalViews) -get(Posts, 0)?.Comments -string(TotalViews in Authors) -TotalViews ^ (0.5 * TotalViews) -one(Posts, nil == nil) -string(TotalViews == 0.5) -TotalViews ^ min(TotalViews) -toJSON(Posts[TotalViews:1]) -abs(1 ** TotalViews) -min(2 + TotalViews) -TotalViews < len(Posts) -not (nil == Authors) -{"Go": Authors, "JavaScript": TotalViews}.ID -map(Posts, TotalViews != TotalViews) -toJSON(Posts != Posts) -map(2 .. TotalViews, TotalViews) -get(Authors, len(Authors)) -get(Authors, count(Posts, true)) -map(Posts, 0 - TotalViews) -TotalViews ^ TotalViews - TotalViews -TotalViews ^ (TotalViews - TotalViews) -int(TotalViews % TotalViews) -{"Go": Posts, " ": Posts} -min(abs(2)) -string(0 * 0.5) -TotalViews >= TotalViews || TotalViews == nil -get(Posts, 2)?.ID -get(Authors, 1).FirstName -abs(0 - 0) -TotalViews * 1 != TotalViews -float(TotalViews * 0.5) -any(Posts, 1 in Authors) -map(Posts, 2) != Posts -get(true ? Authors : nil, TotalViews) -not (TotalViews > 1) -none(map(Posts, TotalViews), true == false) -TotalViews / abs(TotalViews) -TotalViews == TotalViews ? 2 : Posts -TotalViews <= 0.5 ? Authors : TotalViews -toJSON(nil == 0) -string(TotalViews != nil) -any(Posts, TotalViews > 2) -all(map(Posts, Authors), nil in Posts) -abs(Sub(0, 0)) -Posts == TotalViews .. 0 -WithID(Posts, 1)?.ID -not (0 > TotalViews) -one(Posts, nil == TotalViews) -map(true ? Posts : TotalViews, TotalViews) -Authors[int(TotalViews)] -TotalViews < TotalViews + TotalViews -toJSON("JavaScript" > "JavaScript") -TotalViews - TotalViews > TotalViews -{"Go": TotalViews != TotalViews} -int(-0) -toJSON(TotalViews ^ 0) -TotalViews != TotalViews ? Posts : (false ? TotalViews : 1) -map(Posts, Authors[nil]) -map(Posts[0:TotalViews], "JavaScript" == "JavaScript") -TotalViews * TotalViews .. TotalViews -TotalViews ^ (TotalViews - 0.5) -abs(1 + TotalViews) -TotalViews <= count(Posts, false) -nil == Posts && TotalViews > TotalViews -toJSON(false ? 2 : nil) -toJSON(max(1)) -min(TotalViews * 1) -TotalViews != TotalViews ? Posts : 1 --(TotalViews ^ 0) -int(2) <= TotalViews --TotalViews == 0 - TotalViews -WithID(Posts, 1).Tags -get(Authors, 2)?.LastName -TotalViews ^ 0.5 + TotalViews -toJSON(TotalViews + TotalViews) -any(Posts, 2 in Posts) -get(Authors, 2).Profile -Authors[1].Profile -TotalViews != 0.5 && nil == 0 -{" ": "JavaScript" <= "JavaScript"} -one(Posts, TotalViews == nil) -WithID(Posts, 1).Content -none(Posts, true or false) -max(TotalViews, TotalViews) - TotalViews -TotalViews - -1 -count(Posts, TotalViews in Posts) -Posts != Posts ? true : 0 -map(Posts, one(Posts, true)) -TotalViews .. TotalViews + TotalViews -string(nil == 2) -none(Posts, TotalViews < 0.5) -max(2 + TotalViews) -{"Go": false, "Go": 2}.ID -TotalViews ** Sub(0.5, 0) -!(nil != nil and Authors == Authors) -get(Authors, 0)?.FirstName -map(Posts, map(Posts, Posts)) -map(Posts, 0 ^ 2) -{"Go": TotalViews, " ": Authors}.CommentDate -{" ": Posts}.Content -one(Posts, not false) -abs(TotalViews) in Authors -max(0, TotalViews) >= TotalViews - TotalViews -TotalViews + abs(0) -min(len(" ")) -max(count(Posts, false)) -Posts == TotalViews .. TotalViews -0.5 + TotalViews == TotalViews -TotalViews % TotalViews * 1 -Posts[1].Author -Posts == map(Posts, Authors) -string(TotalViews * TotalViews) -not true ? Posts : Authors -min(TotalViews) * 0 * 2 -float(TotalViews) > TotalViews -abs(0.5 / TotalViews) -not (TotalViews < 0) -Authors[1]?.Profile -map(map(Posts, Authors), toJSON(Authors)) -first(1 .. TotalViews) -last(Posts)?.Comments -!("Go" == nil) -abs(0) / TotalViews * TotalViews -toJSON(Posts != nil) -min(-0.5) -TotalViews > 0 / TotalViews -0.5 ** 0 - TotalViews -filter(Posts, 2 == 0) -int(TotalViews) <= TotalViews -get(Authors, -TotalViews) -map(Posts, nil != Authors) -one(Posts, 0.5 == TotalViews) -map(map(Posts, Authors), map(Posts, Posts)) -toJSON(Authors[nil]) -Posts[1].PublishDate -map(Posts, get(Authors, TotalViews)) --(1 - TotalViews) -{"JavaScript": Posts}.Profile -map(Posts, TotalViews ^ TotalViews) -TotalViews >= 0.5 ? TotalViews : TotalViews -0 - TotalViews + TotalViews -TotalViews != nil ? TotalViews : 0 > TotalViews -2 >= TotalViews || TotalViews <= 2 -TotalViews != TotalViews ? Authors : TotalViews -all([Posts, 0, TotalViews], 2 in Posts) -min(1 ** 0) -{"Go": true}.CommentDate?.Email -abs(TotalViews) < TotalViews -TotalViews ^ (0.5 + TotalViews) -map(Posts, TotalViews - TotalViews) -any(Posts, 1 <= TotalViews) -not false ? Authors : Posts -abs(0 ** TotalViews) -false ? nil : TotalViews == TotalViews -int(1) + TotalViews -[map(Posts, Authors)] -TotalViews * 2 + TotalViews -toJSON(0.5 > 0) -TotalViews * TotalViews == nil ? 0 : TotalViews -WithID(Posts, TotalViews)?.Likes -TotalViews * TotalViews >= TotalViews ? nil : Authors -!(2 == nil) -1 ** 1 <= TotalViews -string(TotalViews <= TotalViews) -TotalViews ** get(Authors, 1).ID -(TotalViews / TotalViews) ** TotalViews -toJSON(TotalViews - 0.5) -float(0.5 / TotalViews) -{"JavaScript": nil, " ": TotalViews, "JavaScript": true, "Go": TotalViews, "Go": TotalViews}?.PublishDate?.ID?.Profile --(2 + TotalViews) -any(Posts, 0 > TotalViews) -TotalViews + TotalViews / TotalViews -TotalViews != nil ? Authors : " " -not (nil == Posts) -get(Posts, 1)?.PublishDate -TotalViews - TotalViews ** TotalViews -{"JavaScript": Authors}?.ID?.Biography -map(Posts, TotalViews - 1) -{" ": 0.5}.ID -Authors == Authors and TotalViews in Posts -min(TotalViews) >= TotalViews --(2 ** 1) -TotalViews ^ TotalViews < TotalViews -!all(Posts, true) -any(Posts, nil == true) -{" ": 0.5}?.ID -TotalViews <= TotalViews ^ TotalViews -none(map(Posts, TotalViews), Authors == nil) -!(0 == 0.5) -TotalViews + abs(TotalViews) -{"Go": TotalViews, "Go": nil, " ": Authors}?.Profile?.Upvotes -string(get(Posts, 0)) -get(Posts, false ? Authors : Posts) -TotalViews == TotalViews ^ TotalViews -none(Posts, nil in Authors) -!(0 != TotalViews) -map(Posts, #) != Posts -{"JavaScript": TotalViews}.Biography -toJSON(TotalViews >= 0) --get(Authors, 0)?.ID -TotalViews > TotalViews / 0 -all(Posts, 0 <= 0) -get(Posts, -TotalViews) -not true ? nil : nil -int(TotalViews) ** TotalViews -map(Posts, TotalViews < 0) -trim(false ? Posts : " ") -TotalViews in 1 .. TotalViews -TotalViews == Authors[TotalViews].ID -string(1 * TotalViews) -TotalViews + TotalViews in Authors -TotalViews ** 0 ** TotalViews -float(max(0.5)) -!(nil in Posts) -{" ": Authors}?.Upvotes -one([" "], 1 != 0.5) -string(not (0.5 >= TotalViews)) -get(true ? Authors : false, "Go" matches "JavaScript") -TotalViews % TotalViews > TotalViews -string(Posts == nil) -{" ": TotalViews}?.Upvotes -Posts[1].Comments -0.5 ** 0 != TotalViews -any(Posts, Posts == Posts) -any(filter(Posts, true), 0 != TotalViews) -2 / TotalViews < TotalViews -TotalViews / 1 == TotalViews -TotalViews ^ (TotalViews + 0.5) -filter(Posts, any(Posts, false)) -not ("JavaScript" startsWith "Go") -min(TotalViews) % TotalViews -0 ^ 1 / TotalViews -TotalViews > TotalViews ? true : 0 -one(map(Posts, Authors), Authors == Authors) -toJSON(!true) -TotalViews >= TotalViews == nil -toJSON(all(Posts, true)) -toJSON(0 == TotalViews) -TotalViews - TotalViews != TotalViews -TotalViews > TotalViews / TotalViews -TotalViews + 0 / TotalViews -[len(Authors)] -fromJSON(string(TotalViews)) -toJSON(2 / TotalViews) -TotalViews .. TotalViews == Posts -TotalViews ^ 0 == TotalViews -TotalViews > TotalViews && Posts == Posts --TotalViews + TotalViews -abs(2) < TotalViews ? TotalViews : Authors -int(TotalViews + 0) -TotalViews >= TotalViews ? Posts : Authors -Posts[min(1)] -toJSON(nil == 1) -0.5 ** TotalViews < 0.5 ^ TotalViews -(TotalViews + TotalViews) ^ max(1) -string(upper("Go")) --TotalViews + 0 * TotalViews -{"Go": Posts}.Website -TotalViews in Posts ? nil : 0 -TotalViews >= TotalViews / 2 --(TotalViews - 0.5) -map(Posts, true ? TotalViews : Authors) -map(Posts, Posts == Posts) -string(TotalViews != 0.5) -max(TotalViews) != TotalViews % 2 -max(TotalViews + 2) -map(Posts, TotalViews * TotalViews) -all(Posts, TotalViews != TotalViews) -Posts[2].Content -map(Posts, TotalViews / 0) -one(map(Posts, TotalViews), !false) -map([Posts, false, Authors], #) --(0 % TotalViews) -count(Posts, TotalViews == TotalViews) -{"JavaScript": Posts, "Go": "Go"}.Likes -TotalViews - max(0) -WithID(Posts, 2).ID -toJSON(0 >= TotalViews) --(1 % TotalViews) -Add(0, 1) ** TotalViews -string("Go" != "JavaScript") -one(false ? Posts : Authors, nil != Authors) -(TotalViews + TotalViews) % TotalViews -!(0 > 2) -min(TotalViews) .. TotalViews -TotalViews < len(Authors) -toJSON(nil != TotalViews) -none(Posts, !false) -[Posts, Authors] -last(Posts)?.PublishDate -0 != nil or TotalViews != nil -get(Authors, min(2)) -toJSON(2 == nil) -{"Go": TotalViews}.Upvotes -get(Authors, TotalViews - TotalViews) -last(filter(Posts, false)) -TotalViews ^ TotalViews >= 1 * TotalViews -one(Posts, TotalViews == 0) -trim(string(TotalViews)) --TotalViews < TotalViews -not false ? 1 : Posts -TotalViews ^ TotalViews ** (TotalViews - 0.5) -any(Posts, 0.5 != 2) --0 in Posts -nil != Posts ? TotalViews : abs(TotalViews) -{"JavaScript": Authors}.ID -map(Posts, 0.5 + TotalViews) -2 / TotalViews != TotalViews -filter(Posts, 0 <= TotalViews) -map(Posts, Authors) == Posts -map(Posts, nil == " ") -string(TotalViews > 0.5) -string(TotalViews != 0) -toJSON(len(Posts)) -get(Posts, 0).Likes -Authors[len(Authors)] -{"Go": TotalViews, "Go": TotalViews}?.Biography -TotalViews != count(Posts, true) -[Authors, TotalViews, TotalViews] == Posts -len(Authors) != max(TotalViews) -!(TotalViews + 0.5 >= TotalViews) -int(1 ** TotalViews) -{" ": TotalViews, "Go": nil}?.PublishDate -TotalViews == 0 ? 0.5 : Posts -not (TotalViews < TotalViews) -TotalViews == 0 and TotalViews >= TotalViews -!(" " endsWith " ") -none(Posts, TotalViews < 0) -TotalViews == TotalViews ? TotalViews : 0 -0 ^ 0 >= TotalViews -max(float(0.5)) -filter(Posts, Posts != Posts) --(1 % 1) -one(Posts, one(Posts, true)) -TotalViews ** float(1) -max(int(2)) -{"JavaScript": Authors, "Go": TotalViews, "Go": Authors, "Go": TotalViews}.Birthday -map(map(Posts, Posts), Posts) -get(false ? false : TotalViews, TotalViews) -one(Posts, TotalViews != TotalViews) -TotalViews >= len("JavaScript") -string(TotalViews <= 0) -true ? TotalViews : Posts != map(Posts, 0) -TotalViews ** (0 + TotalViews) -TotalViews == TotalViews / TotalViews -trim("JavaScript" + "Go") -{"JavaScript": TotalViews <= TotalViews} -string(TotalViews != TotalViews) -{" ": nil, "Go": TotalViews, "Go": TotalViews, " ": Posts, " ": Posts}?.Author -TotalViews % 2 <= TotalViews -TotalViews - 1 % TotalViews -Posts != Posts[TotalViews:TotalViews] -TotalViews != nil or Posts == nil -TotalViews + Add(0.5, 0) -TotalViews != TotalViews && TotalViews <= TotalViews -{"Go": Authors, "Go": Posts, "JavaScript": Authors}.Profile -TotalViews - -TotalViews -map(Posts, -0) -2 ^ TotalViews * TotalViews --(TotalViews ^ 2) -TotalViews * 0 in Posts -TotalViews < TotalViews ? Authors : map(Posts, true) --(TotalViews / 0.5 ** TotalViews) -TotalViews % 1 <= TotalViews --TotalViews != TotalViews -!(TotalViews <= 1) -[Authors, Authors] -!(0 >= TotalViews) -0 * TotalViews + TotalViews -last(false ? TotalViews : Posts) -int(-2) -Add(1, 0.5) >= TotalViews -TotalViews <= TotalViews ? Authors : Authors -TotalViews != TotalViews % TotalViews -trim(string(Authors)) -none(TotalViews .. TotalViews, TotalViews >= TotalViews) -string(TotalViews - 2) -(TotalViews * TotalViews) ** (TotalViews - TotalViews) -abs(0.5) ** TotalViews --1 + TotalViews -int(TotalViews ^ 0) -TotalViews > 0.5 ? Posts : nil -string(TotalViews in Posts) -string(1 in Authors) -TotalViews == TotalViews ? Authors : TotalViews -0.5 * TotalViews + max(0) -TotalViews * 2 * TotalViews -map(map(Posts, TotalViews), TotalViews - 0) -any(Posts, 0.5 < TotalViews) -TotalViews ** TotalViews <= TotalViews -Authors[2].Profile -none(map(Posts, Authors), 2 == 2) -count(Posts, false) - TotalViews -min(TotalViews) <= TotalViews -!(0.5 > 1) -not !true -TotalViews ** TotalViews / TotalViews -len(Authors) != TotalViews -int(0 ^ 2) -TotalViews <= TotalViews == nil -float(1 ** TotalViews) -TotalViews > 0.5 - TotalViews -TotalViews + min(TotalViews, TotalViews) -1 / TotalViews + TotalViews -filter(map(Posts, 0), nil != nil) -0.5 <= TotalViews or Posts == Posts -toJSON(any(Posts, true)) -string(true ? Posts : Authors) -string(count(Posts, true)) -none([Posts, Posts, 0.5, nil], 0 == TotalViews) -WithID(Posts, 0)?.ID -max(1 ^ TotalViews) -string(nil != 0.5) -not (TotalViews >= 1) -count(Posts, nil in Posts) -TotalViews > 1 % 2 -not (2 == TotalViews) -lower(string(TotalViews)) -toJSON(Authors) startsWith " " ? 0 : TotalViews -TotalViews ** TotalViews / int(TotalViews) -any(map(Posts, 0), 0 in Posts) -filter(Posts, 0.5 == 2) -not (2 != TotalViews) -string(false ? Authors : 0) -string(true ? Posts : TotalViews) -map(Posts, 1 ** 0) -fromJSON(string(false)) -TotalViews * Authors[TotalViews].ID -!(false or true) -one(Posts, nil != TotalViews) -last(TotalViews .. 0) -string(0.5 == nil) -TotalViews == TotalViews - TotalViews -TotalViews <= 0.5 ? nil : nil -float(TotalViews ** TotalViews) -toJSON(any(Posts, false)) -TotalViews / TotalViews == TotalViews -one([0.5], TotalViews in Posts) -toBase64(string(0)) --(0.5 / 1) -filter(Posts, 0.5 != nil) -not (TotalViews <= 0) -(TotalViews - TotalViews) * TotalViews -map(true ? Authors : TotalViews, Posts) -not ("Go" < "Go") -max(float(TotalViews)) -!IsAdmin(Authors[nil]) -toJSON(map(Posts, TotalViews)) -0 * 0.5 / (TotalViews - TotalViews) -filter(Posts, not (nil != Posts)) -Posts[0 + 0] -TotalViews ^ (TotalViews / 1) -map(Posts, #?.Content) -{"Go": Authors}?.Author -not (0 != 1) -0 + TotalViews <= TotalViews -one(Posts, Authors != nil) -float(TotalViews) ^ TotalViews -TotalViews - TotalViews ^ TotalViews -!false ? Authors : 1 -WithID(Posts, TotalViews)?.PublishDate -max(TotalViews * 2) -get(Authors, 2)?.FirstName -get(Posts, 0 % TotalViews) -len(Posts) == TotalViews -get(Posts, 1 - 0) -{" ": Posts, " ": Authors}?.Biography -count(Posts, 0 <= TotalViews) -nil != Posts or TotalViews > TotalViews -toJSON(TotalViews == 0) -0 != TotalViews && TotalViews == nil -Title(Posts[0]) -TotalViews % TotalViews * TotalViews -min(TotalViews) > min(TotalViews) -none(Posts, TotalViews in Authors) -TotalViews != float(TotalViews) -map(map(Posts, 0), string(Posts)) -TotalViews ^ TotalViews ^ TotalViews -lower(string(nil)) -TotalViews <= 0.5 - 1 -string(2 % TotalViews) -WithID(Posts, TotalViews).Author.LastName -last(get(Posts, 2)?.Tags) -{" ": 0 != TotalViews} -max(TotalViews / 0) -int(2 / TotalViews) -none(Posts, nil in Posts) -abs(TotalViews ^ 0) -nil != Authors && false ? Posts : TotalViews -TotalViews ^ (TotalViews - 1) -IsAdmin(nil) || true ? TotalViews : Authors -TotalViews % TotalViews .. TotalViews -map(Posts, false or true) -int(max(TotalViews)) -TotalViews <= TotalViews != false -0 % TotalViews / TotalViews -not ("JavaScript" <= "JavaScript") -abs(TotalViews) != 0 ? TotalViews : TotalViews -TotalViews + TotalViews == TotalViews / TotalViews -not (nil != "Go") -TotalViews .. len(Authors) -get(Posts, 0)?.Author -TotalViews * TotalViews >= 0 + TotalViews -abs(float(TotalViews)) -string(2 - TotalViews) -TotalViews - TotalViews % TotalViews --(2 % TotalViews) -[Authors[TotalViews]] -get(map(Posts, 0), -TotalViews) -max(len("JavaScript")) -map(Posts, .Tags) --(2 ^ TotalViews) --(TotalViews / 2) -string(2 + 0) -int(0.5) > TotalViews -all(Posts, TotalViews >= TotalViews) -len(toJSON(Authors)) -toJSON(TotalViews .. TotalViews) -abs(int(TotalViews)) -{"Go": true}.Tags -TotalViews ** 2 == TotalViews ? 0 : 2 -toJSON(TotalViews != nil) -count(Posts, 0 != 0) -TotalViews in Authors && TotalViews != TotalViews -toJSON(get(Authors, 0)) -TotalViews <= TotalViews ? 0 : nil -get(Authors, TotalViews + TotalViews) -0 * TotalViews > TotalViews -TotalViews > TotalViews ^ 0.5 -TotalViews ** -TotalViews -map(map(Posts, 0), get(Posts, TotalViews)) -map(Posts, max(TotalViews)) -max(TotalViews / 0.5) -(TotalViews - 1) ^ TotalViews -map(map(Posts, 0), Authors) -{"Go": get(Posts, TotalViews)} -TotalViews / TotalViews > 0.5 ? Posts : 0.5 -toJSON(count(Posts, false)) -not (2 <= 0) -len(Posts) % TotalViews -filter(Posts, 0 >= TotalViews) -1 / 2 + TotalViews -Posts[2].ID -{"JavaScript": " "}?.ID -fromJSON(toJSON(Posts)) -not (-TotalViews in Authors) -TotalViews + len(Posts) -TotalViews ** (TotalViews + TotalViews) --1 .. -TotalViews --0 == TotalViews -not not (Authors == Authors) -map(Posts, nil in Posts) -toJSON(TotalViews in Posts) -one(Posts, 0.5 < 0.5) --(1 / 1) -2 in Authors || 1 > TotalViews -len(string(0)) -!true ? true : " " -nil != 0 and Posts == Posts -not true ? 0 : Authors -map(Posts, lower("Go")) -toJSON(nil in Authors) -Authors[2].Email -one(map(Posts, Posts), !true) -get(Authors, 1).Profile -TotalViews < abs(TotalViews) -toJSON(toJSON(Authors)) -toJSON(last(Posts)) -not (TotalViews != 2) -len(Posts) in Posts --min(0) -" " >= "Go" && Authors != nil -{"Go": Authors, " ": 0.5, "JavaScript": nil, " ": 0, "JavaScript": Posts}?.PublishDate -TotalViews * 0.5 <= TotalViews * TotalViews -len(Authors) * TotalViews -Posts == map(Posts, 1) -TotalViews / 0.5 >= 0.5 ? " " : true -!(0 >= 0.5) -TotalViews < TotalViews * TotalViews -TotalViews ^ TotalViews <= max(0) -not (0 <= 2) -abs(TotalViews) > 2 == true --int(2) -get(true ? Authors : 0, TotalViews) -string(0 == nil) -Posts != Posts ? 2 : Authors -string(2 / TotalViews) -count(Posts, Posts == nil) -!(nil in Authors) -{"JavaScript": false, "JavaScript": Posts, " ": TotalViews}.Title -2 % TotalViews >= TotalViews -toJSON(2 < 2) -TotalViews % TotalViews >= TotalViews ** TotalViews -int(0.5 ^ TotalViews) -TotalViews / 0.5 ** 1 -{"Go": Posts, " ": Posts, "Go": nil}.Author -TotalViews ^ 0.5 == 0.5 ? Posts : "JavaScript" -0 ** 0 ^ (TotalViews - 2) -first(false ? TotalViews : Posts) -int(0) in Posts -!one(Posts, false) -toJSON(abs(TotalViews)) -get(Posts, 2)?.Tags -Authors[TotalViews % 1] -min(0 % TotalViews) -string(Authors == Authors) -min(-0) -min(0) ^ -2 -count(Posts, "Go" != nil) -one(Posts, 0.5 < 0) -0 / TotalViews > TotalViews ? " " : 1 -first(false ? Posts : TotalViews) -Authors == Authors ? Authors : Authors -map(Posts, Posts) != Posts -map(Posts, false == false) -any(Posts, true) && TotalViews == TotalViews -get(Authors, TotalViews * TotalViews) -TotalViews * 0 / float(TotalViews) -Posts == map(Posts, "Go") -TotalViews < TotalViews - 0.5 -not (TotalViews >= 2) -0 ** TotalViews + TotalViews / TotalViews -TotalViews * 0 + 1 / TotalViews -string(!(nil in Posts)) -none(map(Posts, 1), TotalViews != TotalViews) -!(0.5 <= 0) -TotalViews + 0 != TotalViews -int(float(2)) -not (true and true) -max(0.5 + TotalViews, TotalViews % TotalViews) -one(Posts, nil == Posts) -TotalViews / 0 < TotalViews ? TotalViews : 0.5 -TotalViews >= 0 - 0.5 -count(Posts, 0.5 > TotalViews) -float(TotalViews ^ 0.5) -get(Posts, 0)?.Title -abs(TotalViews ** 1) -true ? " " : TotalViews < TotalViews -not (0.5 > 0) -!(0.5 == TotalViews) -map(map(Posts, Authors), Posts) -TotalViews != TotalViews ** TotalViews -not all(map(Posts, "Go"), TotalViews != TotalViews) -int(0 * TotalViews) -max(TotalViews ^ 0.5) -TotalViews / TotalViews / TotalViews -Posts != map(Posts, TotalViews) -TotalViews / 2 ^ 0 -TotalViews > 1 ? TotalViews : TotalViews --TotalViews < -TotalViews -{"Go": TotalViews}?.LastName -all(Posts, any(Posts, true)) -max(1 ** TotalViews) -max(TotalViews, TotalViews % TotalViews) -max(-(TotalViews * TotalViews)) -float(TotalViews + 1) -Posts[len(Authors)] -map(Posts, 0 != nil) -not (0.5 >= 0.5) -Authors[2 + TotalViews] -map(map(Posts, Posts), TotalViews != nil) -{"Go": "Go", "JavaScript": Posts}.Title -not (true == nil) -string(0 != 0) -TotalViews * 0.5 / TotalViews -int(TotalViews) / TotalViews -get(Posts, 1).Title -Posts != Posts == nil -TotalViews < 0 == nil -(TotalViews % 1) ** TotalViews -float(float(0.5)) -not (0 < 1) -!(0 < 1) -{" ": Posts, "Go": Posts, " ": TotalViews, "JavaScript": 0.5, " ": Posts}.ID --(0 / 1) -{"JavaScript": Authors}?.Email -map(filter(Posts, true), Authors) -not true ? TotalViews : Posts -filter(Posts, nil != 2) -{" ": Posts, " ": TotalViews}.Comments -string(true && true) -Authors == Authors == nil -string(TotalViews >= TotalViews) -map(Posts, 0 == TotalViews) -last(filter(Posts, true)).Content -string(1 ^ 0) -TotalViews + TotalViews * 0 -len(map(Posts, true)) -not (1 < 2) -count(Posts, 0 != TotalViews) -TotalViews * TotalViews in Posts ? 2 : Authors -TotalViews != TotalViews ^ 1 -count(map(Posts, Authors), !false) -filter(Posts, TotalViews >= TotalViews) -filter(Posts, TotalViews >= 0) -max(0) ^ TotalViews -none(Posts, false) != false ? Authors : " " -TotalViews / (0.5 + TotalViews) -all(Posts, !true) -{"Go": Authors}.Author -none(Posts, 0.5 >= 0) -Posts == Posts != false -not (0.5 < 2) -min(1 ^ TotalViews) -any(Posts, # != #) -TotalViews ^ TotalViews > -TotalViews --(0 ^ TotalViews) -TotalViews != TotalViews / TotalViews -abs(TotalViews / TotalViews) -WithID(Posts, 1 * 0) -TotalViews * TotalViews % TotalViews -len(Authors) < -TotalViews -Authors != Authors and Posts != nil -filter(Posts, nil == 1) -not (TotalViews != nil) -TotalViews >= 0.5 || Posts != nil -string(string(nil)) -Authors == Authors ? TotalViews : 0 -{"JavaScript": 0.5 > TotalViews, "JavaScript": Authors} -0.5 ^ TotalViews + TotalViews -one(Posts, Posts == Posts) -Posts == 1 .. TotalViews -[-2, Authors] -one(Posts, 1 == TotalViews) -abs(TotalViews) > min(0, 0.5) -0 ^ TotalViews - 0 % TotalViews -TotalViews ** 2 - TotalViews -TotalViews < TotalViews ** 2 -len(Authors) == TotalViews ** TotalViews -{"Go": TotalViews, "Go": TotalViews, " ": Posts, "JavaScript": Posts, "JavaScript": nil}.ID -min(1) != TotalViews -TotalViews - Sub(2, 0.5) -float(len(Posts)) -0 - TotalViews != float(TotalViews) -map(Posts[0:0], !false) -Posts[2]?.Comments -map(Posts, float(TotalViews % TotalViews)) -string(false ? false : nil) -min(TotalViews / 0) -all(Posts, 0.5 < TotalViews) -count(Posts, TotalViews > 1) -{" ": min(0), " ": -TotalViews} -max(TotalViews % 1) -TotalViews > abs(TotalViews) -TotalViews < 0.5 ? Authors : Posts -not (" " < " ") -TotalViews ^ float(0) -toJSON({" ": Authors}) -TotalViews * TotalViews * 0.5 -float(1 % TotalViews) --0 % TotalViews -any(Posts, 2 != nil) -(0 / 0) ^ TotalViews ^ 0.5 -trim(toJSON(TotalViews)) -TotalViews / TotalViews + TotalViews -TotalViews / int(0.5) -{"JavaScript": map(Posts, Authors)}.Profile -duration(toJSON(0)) -upper(toJSON(TotalViews)) -toJSON(nil == nil) -Add(0, 0) > TotalViews ? Posts : 0.5 -max(1 / 0) -filter(Posts, nil == Posts) -2 ^ TotalViews > TotalViews -!true ? "Go" : Posts -map(true ? Authors : Posts, TotalViews) -min(0.5 * TotalViews) -" " contains "Go" or nil in Authors -one(Posts, 1 != 0) --TotalViews < TotalViews == false -map(Posts, "Go" == "Go") -count(Posts, not false) -TotalViews >= 0.5 / 0 -len(Authors) / TotalViews / TotalViews -one(Posts, 2 == TotalViews) -TotalViews + 2 ^ 1 --(0.5 * TotalViews) -[map(Posts, "JavaScript")] -none(Posts, 0 > TotalViews) -map(Posts, TotalViews == 0.5) -one(Posts, Posts != nil) --max(0, TotalViews) -not (0 == 0.5) -map(Posts, map(Posts, Authors)) -0.5 ^ 0 ^ TotalViews ^ TotalViews -(TotalViews - 0.5) / TotalViews -min(count(Posts, true)) -TotalViews < TotalViews ** TotalViews - -TotalViews -last(map(Posts, false)) -map(map(Posts, Authors), Authors) -TotalViews ^ 0 >= TotalViews -len(true ? Posts : Posts) -Posts != Posts ? Posts : Posts -TotalViews == 0 / TotalViews -0 ** 0 >= TotalViews -TotalViews != 0 ? 0.5 : "Go" -len(trim(" ")) -{" ": nil}.Tags -TotalViews in Authors ? 0 : 2 -TotalViews ^ TotalViews != TotalViews -one(Posts, TotalViews >= TotalViews) -toJSON(true != true) -1 / TotalViews > TotalViews -TotalViews + TotalViews - max(TotalViews) -all(Posts, 1 <= TotalViews) -none(Posts, TotalViews >= 1) -max(0.5 / TotalViews) -TotalViews .. -TotalViews -Posts == Posts ? TotalViews : TotalViews -TotalViews ^ (Posts != nil ? TotalViews : Posts) -TotalViews == count(Posts, false) -0 % TotalViews + TotalViews -string(0.5 + 0) -all(map(Posts, Authors), Posts != Posts) -string(false ? " " : TotalViews) -toJSON(TotalViews * TotalViews) -0 / TotalViews - TotalViews -none(Posts, TotalViews != 2) -count(Posts, Authors != Authors) -0 + TotalViews < TotalViews -toJSON(upper("Go")) -TotalViews ** (0 - 2) -all(Posts, # == #) -{" ": true}?.Biography -nil != Posts and TotalViews < 0 -TotalViews in Authors ? Posts : nil -one(Posts, Posts == nil) -nil == TotalViews and 0.5 <= TotalViews -TotalViews != min(TotalViews) -TotalViews <= TotalViews ? "JavaScript" : Authors -min(TotalViews) * TotalViews -TotalViews ** 2 == TotalViews % TotalViews -string(1 ^ 0.5) -max(min(0, 2)) -TotalViews / Add(0, 2) -count(Posts, false) > TotalViews -Authors == Authors != true -TotalViews >= TotalViews + 0.5 -abs(2) in Authors ? nil : false -string(filter(Posts, false)) -upper(string(float(TotalViews))) -abs(0.5 / 0.5) -Authors != Authors ? Authors : Authors -toJSON(TotalViews == TotalViews) --0 - TotalViews -1 .. TotalViews == Posts --TotalViews >= 1 ? 0.5 : 1 -0 ^ TotalViews / TotalViews --(0.5 ^ 0) -max(TotalViews ** TotalViews) -2 ** 0.5 / count(Posts, false) -string(map(Posts, 0)) -map(map(Posts, TotalViews), abs(TotalViews)) -max(TotalViews) ** TotalViews -string(-0) -TotalViews ** TotalViews >= TotalViews -TotalViews != 0 ? Posts : nil -filter(Posts, 1 == 0) -TotalViews ^ 0 ** TotalViews -count(Posts, Authors == nil) -TotalViews ** (TotalViews * TotalViews) -string("Go" <= " ") -get(Authors, TotalViews - 0) -0.5 + 0 < 0.5 ? nil : TotalViews -toJSON(nil in Posts) -min(TotalViews * 0.5) -!(TotalViews > 0.5) -{" ": -TotalViews} -Authors[min(TotalViews)] -[2 ^ 2] -max(int(0)) -{"Go": "Go"}.Tags -string(TotalViews * 0.5) -all(Posts, TotalViews != nil) -map(Posts, Posts[0:TotalViews]) -TotalViews * 2 > TotalViews -TotalViews - TotalViews + TotalViews - TotalViews -lower(string(false)) -all(Posts, Posts == nil) -all(Posts, 2 >= 2) -len(filter(Posts, true)) -filter(Posts, Authors != Authors) -!(0 == TotalViews) -map(true ? Posts : Posts, Authors) -len(Authors) ** TotalViews -not true and TotalViews == 0 -all(Posts, nil == nil) -TotalViews <= 1 or nil in Authors -TotalViews / 2 == TotalViews ? false : Authors -TotalViews / max(2) -TotalViews + 2 ^ TotalViews -TotalViews in map(Posts, 0) -int(0.5 * TotalViews) -(TotalViews + TotalViews) * TotalViews % 2 -Authors == Authors ? 1 : nil -TotalViews / 0.5 * TotalViews -true ? Authors : 2 >= TotalViews -len(Authors) in Posts == nil -filter(1 .. TotalViews, TotalViews >= TotalViews) -TotalViews ^ 2 != TotalViews -all(Posts, nil == Authors) -string(any(Posts, false)) -TotalViews <= -TotalViews -float(TotalViews) - 0.5 - TotalViews -nil in Posts or true == nil -map(Posts, TotalViews .. TotalViews) -toJSON(TotalViews == 1) -Posts != Posts == false -{" ": Posts, " ": 0.5}?.Author --(2 + 1) --(1 * TotalViews) -get(Posts, TotalViews - TotalViews)?.ID -string(0 == TotalViews) -min(TotalViews, TotalViews) > TotalViews -TotalViews != len(Authors) -string(int(0)) -not (nil != true) -0 ^ TotalViews - TotalViews -all(Posts, 0.5 != TotalViews) -Posts != Posts ? Posts : Authors -!(nil != true) -{"JavaScript": nil}?.PublishDate -int(TotalViews - 2) -min(TotalViews) / 0 ** TotalViews --TotalViews * TotalViews ** TotalViews -min(2 % TotalViews) -0 .. TotalViews != Posts ? TotalViews : 0.5 -int(TotalViews * 2) -0.5 - TotalViews != TotalViews -get(Posts, 1).Tags -TotalViews % TotalViews < TotalViews -get(Posts, false ? Posts : TotalViews) -TotalViews - float(TotalViews) <= TotalViews -{" ": Posts, " ": Posts}.Content != Authors -not (0.5 != 0) -not ("JavaScript" == " ") -(0.5 + TotalViews) / TotalViews -TotalViews / 0.5 < TotalViews -not (0 == 1) -TotalViews != TotalViews ? TotalViews : Posts -upper(toJSON(" ")) -float(2) >= TotalViews ** TotalViews --(TotalViews / 0) -not (TotalViews != 1) -int(0 ^ 0) -TotalViews ^ 0 ^ (TotalViews + TotalViews) -TotalViews * 0.5 > TotalViews -map(Posts, 0.5 / TotalViews) --(TotalViews ** 2) -int(2) - TotalViews -toJSON(nil != 1) -TotalViews > 0 ** TotalViews -TotalViews >= TotalViews ^ 1 -filter(Posts, TotalViews < 0.5) -abs(0.5 ^ TotalViews) -int(0 % TotalViews) -0.5 * TotalViews > TotalViews / TotalViews -int(TotalViews + 0.5) -map(Posts, 0 != TotalViews) -Posts[1].Title -TotalViews * -TotalViews -!(1 == TotalViews) -TotalViews - TotalViews >= TotalViews -max(Add(2, 0)) -1 + 0 < 1 ** 0 -nil != Posts ? TotalViews : Posts == Posts -one(Posts, true != nil) -filter(Posts, 0.5 == nil) -not (0 in Authors) -map(map(Posts, true), Authors) -not ("Go" > "Go") -string(0.5 + TotalViews) -true ? Authors : Posts[TotalViews] -not (false and true) -min(0 + 1) -{"Go": Authors}?.LastName -0.5 * TotalViews / int(TotalViews) -Posts == map(Posts, TotalViews) -count(Posts, nil == Posts) --(TotalViews * 1) -TotalViews * TotalViews in Posts -string(not false) -2 ^ 0 / int(TotalViews) -TotalViews ** -0.5 -!(0.5 >= 0) -string(nil == nil) -!(1 > TotalViews) -abs(TotalViews ^ (TotalViews / TotalViews)) -TotalViews .. 1 - 0 -!(" " <= "Go") -abs(TotalViews + 2) -abs(len("Go")) -string(string(Posts)) -map(Posts, min(TotalViews)) -{"Go": nil}.ID -!(" " > " ") -{" ": TotalViews, "Go": Posts} -last(map(Posts, 0)) --abs(0) -toJSON(true ? 0.5 : 0.5) -float(1 / TotalViews) -not (1 != 0) -max(0 / TotalViews) -int(0) - TotalViews -!not (TotalViews != 0) -string(!(TotalViews < TotalViews)) -int(0.5) == TotalViews -Authors == Authors ? Posts : 1 -WithID(Posts, 1)?.PublishDate --(TotalViews + 0) -Authors[min(0)] -filter(Posts, true) != map(Posts, TotalViews) -trim("Go") > toJSON(TotalViews) -WithID(Posts, 2).Title -int(TotalViews) % TotalViews -max(0.5 - 0) -last(Posts).Author -map(Posts, TotalViews > 0.5) -!true ? 2 : 2 -count(Posts, TotalViews != TotalViews) -string(0 ^ 0) -min(TotalViews) + TotalViews -false ? Posts : TotalViews .. TotalViews -one(Posts, !false) -fromJSON(toJSON(Authors)) -TotalViews - 1 + TotalViews -true ? Posts : TotalViews ^ TotalViews -Authors != nil ? TotalViews : TotalViews -TotalViews ** (TotalViews + 0.5) -get(Authors, abs(TotalViews)) -len(Posts) > TotalViews * TotalViews -TotalViews <= TotalViews ? Authors : TotalViews -one(Posts, true && true) -min(TotalViews * 2) -Posts[1]?.Tags -min(1) != 2 ^ TotalViews -map(Posts, string(Posts)) --(2 ^ 1) -not (TotalViews == 0.5) -count(Posts, nil == 0) -0.5 * 0 != TotalViews -(TotalViews + 0) ^ TotalViews -TotalViews + count(Posts, false) -TotalViews == 0.5 ? TotalViews : TotalViews -map(Posts, true) == Posts -{"JavaScript": 0.5 ** TotalViews} -{"Go": nil, "JavaScript": Posts, " ": Authors}?.Upvotes -one(Posts, IsZero(#)) -!any(Posts, true) -last([TotalViews]) -string(TotalViews <= 0.5) --TotalViews - TotalViews / TotalViews -any(false ? " " : Authors, 0 == 0.5) -one(Posts, !true) -WithID(Posts, false ? TotalViews : TotalViews) -trim(true ? " " : TotalViews) -TotalViews ^ TotalViews != abs(TotalViews) -count(Posts, TotalViews != nil) -{" ": Posts}?.Content -{"JavaScript": TotalViews, "Go": Posts}.Title -none(Posts, !true) -trim(toJSON(1)) -0 .. TotalViews != filter(Posts, true) -count(Posts, true) == TotalViews -filter(TotalViews .. TotalViews, 0 == nil) -WithID(Posts, 2)?.ID -string(TotalViews / 1) -toJSON(len(Authors)) -float(TotalViews ^ 1) -min(TotalViews, TotalViews) % TotalViews -filter(Posts, 0 != TotalViews) -{"JavaScript": nil}?.Tags --(TotalViews + 1) -TotalViews - TotalViews == TotalViews -(0.5 * TotalViews) ** TotalViews -one(Posts, 0 > TotalViews) -TotalViews .. 0 - TotalViews -filter(true ? Posts : Posts, TotalViews <= 0) -len(filter(Posts, false)) -TotalViews - 0.5 * TotalViews -TotalViews * TotalViews >= TotalViews ? "JavaScript" : 1 --float(0) -TotalViews * max(0) -any(Posts, TotalViews != nil) -{"Go": Authors}?.FirstName -int(min(TotalViews)) -TotalViews != nil == nil -{" ": 0.5 != TotalViews} -TotalViews ** -2 -toJSON(map(Posts, "JavaScript")) -map(map(Posts, Authors), TotalViews) -TotalViews / TotalViews ^ 0 -TotalViews != TotalViews ^ 0 -map(Posts, Authors != nil) --TotalViews > count(Posts, false) -2 ^ TotalViews >= TotalViews ? true : 0 -map(Posts, TotalViews / TotalViews) -map(Posts, TotalViews + 0) -one(Posts, TotalViews != 1) -(0 + TotalViews) ** TotalViews -TotalViews .. -1 -{"JavaScript": 0, "JavaScript": Posts, "Go": TotalViews}.FirstName -TotalViews ^ 0.5 / TotalViews -abs(TotalViews % TotalViews) -one(map(Posts, Authors), TotalViews > 0.5) -TotalViews == nil ? Posts : "JavaScript" -toJSON(one(Posts, true)) -toJSON(0.5 ^ TotalViews) -len(true ? Authors : TotalViews) -0 / TotalViews <= TotalViews -Posts != nil ? 2 : nil -2 - 0 >= TotalViews -map(Posts, true ? false : 2) -filter(Posts, !true) -string(TotalViews ^ 0.5) -TotalViews in Posts ? Posts : Authors -int(0) == TotalViews -max(0.5 ^ 0) -filter(Posts, nil in Posts) -toJSON(1 .. TotalViews) -TotalViews != 0 and not true -Posts[TotalViews:TotalViews] == 1 .. TotalViews -!(TotalViews <= 2) -any(Posts, 2 < 1) -TotalViews / (TotalViews - 0.5) -int(1 / 0.5) -!("JavaScript" <= " ") -int(abs(TotalViews)) -map(Posts, TotalViews + TotalViews) -map(Posts, len(Posts)) -lastIndexOf(" ", "Go") ** TotalViews -toJSON(get(Authors, TotalViews).Profile) -min(TotalViews) != TotalViews -any(Posts, 0 != TotalViews) -{" ": Authors, "Go": 0, "Go": Authors, "JavaScript": Authors, "Go": 2}.Content != Posts -filter(map(Posts, Authors), Posts == Posts) -TotalViews > 0.5 ? Posts : Posts -one(Posts, 0.5 >= TotalViews) -none(Posts, IsZero(#)) -Sub(1, 0.5) ** TotalViews -TotalViews >= 0 ** 1 -TotalViews in Posts != false -get(Posts, int(TotalViews)) -!(0.5 != TotalViews) -(1 - TotalViews) ** TotalViews -[TotalViews, TotalViews] -Posts != map(Posts, 0.5) -get(map(Posts, false), TotalViews) -TotalViews ** TotalViews + TotalViews -string(map(Posts, " ")) -any(Posts, TotalViews == TotalViews) -TotalViews * (0 + TotalViews) -[nil != false] -TotalViews <= 0.5 ^ 2 --(0 - 1) -min(TotalViews / 0.5) -TotalViews != TotalViews ** 0.5 -Authors != Authors != nil -TotalViews / TotalViews ** 0 -one(Posts, 1 > TotalViews) -!(nil != 0.5) -get(Authors, 1 + TotalViews) -{"JavaScript": "JavaScript"}.ID -abs(TotalViews + 0) -map(Posts, TotalViews != 0.5) -abs(TotalViews ** 0.5) -[TotalViews .. TotalViews] -0.5 - 0 >= TotalViews --abs(2) -{"JavaScript": Posts, "JavaScript": Authors}.Title -map(Posts, 2 ** 0.5) -string(0 == 2) -map(Posts, nil in Authors) --min(0.5 ^ 0) -min(TotalViews + TotalViews, TotalViews) -Authors[nil].Profile -2 % TotalViews == TotalViews -TotalViews * int(TotalViews) -!(0 in Posts) -string(hasPrefix("JavaScript", " ")) -map(Posts, TotalViews < 0.5) -any(Posts, 0 == TotalViews) -0 >= TotalViews or TotalViews < TotalViews -all(map(Posts, Posts), TotalViews in Authors) -none([TotalViews <= TotalViews], #) -get(Posts, TotalViews)?.Author?.ID -not (0 <= TotalViews) -!(0 > 0.5) -TotalViews in Posts or TotalViews > TotalViews -TotalViews <= TotalViews ? nil : Authors -string(map(Posts, "Go")) -string({" ": false}) -toJSON(Authors != Authors) -!(0.5 > 0.5) -toJSON(get(Posts, 1)) -TotalViews - 2 * TotalViews -TotalViews >= TotalViews ? nil : false -map([Authors], Posts) -TotalViews * 0 % 1 -2 ** TotalViews < TotalViews -float(TotalViews ** 0) -!("JavaScript" >= " ") --TotalViews ** -TotalViews -TotalViews - 2 == TotalViews -last(map(Posts, 2)) -TotalViews / TotalViews > TotalViews -toJSON(TotalViews < 2) -max(2) ^ len(Posts) -!false ? Authors : "JavaScript" -string(all(Posts, false)) -!("Go" > "Go") -TotalViews >= 0 == nil -toJSON(TotalViews != 1) -(TotalViews + TotalViews) ^ TotalViews -TotalViews + TotalViews + TotalViews -last(Posts)?.Title -Add(1, 2) + TotalViews ^ 0 -not (1 == nil) -string(1 / 0) -filter(Posts, Authors == Authors) -get(false ? Posts : TotalViews, TotalViews != Posts) -0 ** TotalViews * TotalViews -{" ": nil, "Go": "JavaScript", "JavaScript": Authors}?.Tags -all(Posts, nil != TotalViews) -abs(0.5 ** TotalViews) -TotalViews <= 2 ** TotalViews -TotalViews ^ (TotalViews / TotalViews) -string(0 / TotalViews) -max(0 + 0) -any([0, TotalViews], TotalViews in Authors) -map(map(Posts, 0), TotalViews - TotalViews) -min(TotalViews) > TotalViews -TotalViews < count(Posts, true) -false ? 1 : TotalViews > TotalViews -TotalViews ** (TotalViews % TotalViews) -Posts == Posts == one(Posts, true) -get(true ? 0.5 : Posts, Posts) -last(map(Posts, #)) -not (TotalViews != 0) -TotalViews ** (0 % TotalViews) -any(Posts, true == nil) -string(0.5 > 2) -Posts != Posts != true -max(TotalViews + 0.5, TotalViews) -Authors != Authors ? 1 : 0 -abs(TotalViews) / TotalViews -TotalViews != len(Posts) -{"JavaScript": Posts, " ": Posts, "Go": nil}.Author -TotalViews == nil ? Authors : TotalViews -{" ": TotalViews, "JavaScript": Authors} -min(1 / TotalViews) -string(1 <= TotalViews) -int(1) >= TotalViews -filter(Posts, not false) -first(Posts[0:2]) --max(TotalViews, TotalViews) -all(Posts, 0.5 > TotalViews) -none(Posts, TotalViews <= 1) -Posts == Posts ? Authors : Authors -0.5 ** TotalViews == TotalViews -get(Posts, TotalViews * 0) -abs(TotalViews * 0.5) -TotalViews / 0 * TotalViews --(1 ** TotalViews) -Posts == Posts and TotalViews in Authors -count(map(Posts, TotalViews), TotalViews == 0.5) -get(Posts, true ? false : TotalViews) -TotalViews >= 2 * 0 -{" ": Authors, "JavaScript": Posts} -toJSON(0 != TotalViews) -2 ** TotalViews == TotalViews -max(TotalViews, TotalViews, TotalViews) -Posts == Posts || TotalViews < 1 -WithID(Posts, 0)?.PublishDate -[TotalViews == 1] -1 .. 1 == Posts -abs(0 % 1) -none(2 .. TotalViews, "Go" >= "JavaScript") -any(Posts, none(Posts, false)) -string(nil != TotalViews) -!(0.5 != nil) -toJSON(string(1)) -WithID(Posts, TotalViews).Title -one(Posts, TotalViews != 0.5) -0 ^ 0 < TotalViews -{"Go": TotalViews}?.CommentDate?.Content -TotalViews + TotalViews < TotalViews -TotalViews / TotalViews * TotalViews -!(false != false) -float(0) < TotalViews -string(-1) --(0 * 1) --(TotalViews > TotalViews ? Posts : TotalViews) -TotalViews != TotalViews == true -1 % TotalViews % TotalViews -TotalViews < float(TotalViews) -string(TotalViews ** 1) -{"JavaScript": Authors != Authors} -Posts != 0 .. TotalViews -count(Posts, any(Posts, false)) -map(map(Posts, true), count(Posts, false)) -TotalViews != 0 ? TotalViews : " " -TotalViews == nil ? TotalViews : Posts -{" ": TotalViews > TotalViews, "Go": Posts} -float(TotalViews) * -0.5 -TotalViews / TotalViews >= TotalViews -Posts != Posts ? 2 : "JavaScript" -!true ? Posts : Posts --(TotalViews ** 1) -string(Posts != nil) -toJSON(Posts == nil) -TotalViews != TotalViews ? 0.5 : nil -lower(toJSON(TotalViews)) -!(nil == false) -all(Posts, 0 >= 0.5) -TotalViews != 0.5 == nil -any(Posts, TotalViews >= TotalViews) -map(map(Posts, true), #) -{"JavaScript": 0}.LastName -abs(0 - TotalViews) -0 <= TotalViews || TotalViews == 2 -(TotalViews / TotalViews) ^ TotalViews -TotalViews != 0 * TotalViews -count(Posts, false) < TotalViews ? Authors : TotalViews -TotalViews > 0.5 + TotalViews -TotalViews % TotalViews in Posts -max(0 % 2) -string(len(Authors)) --(TotalViews + 0.5) -float(min(0.5)) -!("JavaScript" == "Go") -len(map(Posts, false)) -map(Posts, TotalViews == 2) -!true ? TotalViews : 0 -{" ": 0, " ": TotalViews, "JavaScript": 0.5}.Title -toJSON(Authors != nil) -true ? Posts : Authors[TotalViews] -TotalViews * TotalViews ^ 1 -{"Go": Authors, "Go": 0.5}?.Email -filter(Posts, nil != TotalViews) -TotalViews in Authors ? true : false -toJSON(string(Authors)) -first(map(Posts, "Go")) -Posts[1]?.Author -max(TotalViews % 2) -!(nil == 2) -TotalViews != 2 ? true : TotalViews -TotalViews in Posts ? TotalViews : Posts -len(Authors) > 0 * TotalViews -TotalViews .. min(TotalViews) -TotalViews == TotalViews + 2 -string(1 / 0.5) -false ? Authors : 1 in Authors -map(Posts, Posts != Posts) -!(2 != TotalViews) -all(Posts, TotalViews <= TotalViews * TotalViews) -string(2 < 0) -string(0.5 != TotalViews) -map(Posts, # == #) -Authors != Authors ? get(Authors, 2) : Authors -TotalViews ^ (TotalViews * 2) -TotalViews < TotalViews * 0 -TotalViews > 0 * 0 -TotalViews <= 1 ? Posts : true -TotalViews <= TotalViews ? TotalViews : Posts -not (" " > "Go") -TotalViews / -0 -string(float(TotalViews)) -not (0 in Posts) -not false ? " " : 2 -TotalViews ^ int(0) -any(Posts, TotalViews != TotalViews) -map(Posts, IsZero(#)) -get(Authors, 1)?.LastName -toJSON(map(Posts, 1)) -{" ": nil, "JavaScript": 2}?.Upvotes -len(0 .. 1) -TotalViews <= TotalViews / TotalViews -max(0 - TotalViews) -Authors == Authors || 0.5 >= 1 -get(true ? Posts : Posts, TotalViews) -float(1) + TotalViews -{"JavaScript": TotalViews}?.ID -count(Posts, 2 < 0) -map(Posts, 0.5 != 0.5) -{"Go": Authors}.Likes -Posts != Posts ? TotalViews : 0.5 -map(Posts, Posts[TotalViews:TotalViews]) -any(map(Posts, 0), not true) -nil == " " && 0 == TotalViews -string(0 <= 0) -map(Posts, nil != Posts) --TotalViews in 0 .. TotalViews -filter(Posts, TotalViews < 0) -TotalViews ^ TotalViews * min(0) + TotalViews -count(Posts, IsZero(#)) -map(0 .. TotalViews, TotalViews) -!(0 > 0) -1 >= TotalViews ? IsAdmin(nil) : TotalViews -TotalViews <= TotalViews % 1 -first(map(Posts, " ")) -len(Authors) == 0 % TotalViews -max(2 - TotalViews) -{"JavaScript": "Go", " ": " "}?.Title -{"JavaScript": Authors}?.PublishDate -TotalViews * 0.5 >= TotalViews -one(Posts, TotalViews != 0) -none(Posts, one(Posts, false)) -Posts != nil ? Posts : false -Posts[TotalViews:TotalViews + TotalViews] -abs(0.5 + TotalViews) -!(true == nil) -int(TotalViews / 1) -float(Add(0, 0)) -1 - TotalViews == TotalViews ** 0 -TotalViews ** (1 * TotalViews) -string(Title(Posts[0])) -map(Posts, toBase64(" ")) -{"JavaScript": TotalViews, "JavaScript": Authors} -(TotalViews - TotalViews) * -0 -map(Posts, TotalViews * 0) -toJSON(false ? Authors : Authors) -!false != none(Posts, true) -map(Posts, 0.5 < TotalViews) -string(1 ** TotalViews) -min(float(TotalViews)) -TotalViews == 1 ? nil : Authors -Posts == Posts != true -0.5 * TotalViews - TotalViews -TotalViews in TotalViews .. 2 -filter(Posts, "JavaScript" endsWith "Go") --min(1) -TotalViews + 1 in Posts -not (" " != nil) -[0.5 + 0] -max(TotalViews, TotalViews) > TotalViews -string(Add(2, 0)) -all(Posts, nil != Authors) -TotalViews == abs(0) -TotalViews ** 0 != -0 -any(Posts, 0.5 != nil) -not (nil != "JavaScript") -1 + 0 >= TotalViews -TotalViews * 0 ** TotalViews -toJSON(string(TotalViews)) -TotalViews ^ count(Posts, Authors == nil) -0 * 0 in Authors -[TotalViews % 2] -min(float(TotalViews), 0 / TotalViews) -any(map(Posts, 2), TotalViews <= 0.5) -0.5 - TotalViews > TotalViews -string(nil != nil) -(TotalViews - TotalViews) * (2 + 0.5) -int(count(Posts, true)) -0 > TotalViews || 1 >= TotalViews -count(Posts, 0.5 < 0.5) -any(Posts, 2 >= TotalViews) -0.5 + TotalViews + TotalViews -min(TotalViews) in Authors ? nil : nil -not (2 >= TotalViews) -get(Posts, TotalViews - 1) -abs(false ? 0.5 : TotalViews) -TotalViews ** abs(TotalViews) -float(TotalViews * 0) -TotalViews < 0.5 - TotalViews -TotalViews ^ -0 --(TotalViews / 1) -map(Posts, toJSON("JavaScript")) -map(Posts, filter(Posts, false)) -none(Posts, 2 < TotalViews) -2 > TotalViews and nil == Posts -TotalViews in Authors ? nil : Posts ---1 -min(TotalViews ^ TotalViews) -max(TotalViews + 0) -TotalViews * TotalViews >= TotalViews -map(map(Posts, false), Posts) -Add(0, 0.5) + TotalViews -all(Posts, 1 > 2) -TotalViews != TotalViews * TotalViews -{"Go": Posts}?.FirstName -map(map(Posts, 2), Posts) -upper(string(2)) -2 * 0 .. TotalViews -Posts == [TotalViews, Authors] -get(Posts, TotalViews) != get(Posts, TotalViews) -{"Go": 1, " ": Posts}.ID -toJSON(TotalViews ^ 1) -none(Posts, 1 <= 0.5) -0 - TotalViews > TotalViews ? false : nil -TotalViews == 0 ? Authors : Posts -{"JavaScript": " " != nil} -[Authors, Posts] -0.5 - 2 <= TotalViews -len(Posts) <= TotalViews -len(Authors) <= TotalViews --float(2) -0.5 ** TotalViews != TotalViews --TotalViews in filter(Posts, true) -2 ** 0 ^ (TotalViews / TotalViews) -TotalViews ** TotalViews != TotalViews ** TotalViews -float(2 - TotalViews) -map(Posts, nil == Posts) -TotalViews * 1 % TotalViews -toJSON(true ? TotalViews : Posts) -TotalViews % TotalViews == TotalViews --0 != TotalViews -TotalViews ** TotalViews ^ TotalViews -trim(toJSON(nil)) -any(Posts, TotalViews == nil) -string(TotalViews < TotalViews) -int(0.5 ^ 2) -!(TotalViews < 2) -first([" ", TotalViews, TotalViews, Authors, Authors]) -WithID(Posts, 0).ID + TotalViews -none(Posts, 0 in Posts) -first(Posts[0:TotalViews]) -get(Posts, 2).Likes -TotalViews >= 2 - TotalViews -count(map(Posts, Posts), TotalViews in Authors) -TotalViews != TotalViews ? Posts : Posts -TotalViews + TotalViews != count(Posts, true) -TotalViews ** 0 >= TotalViews -Authors[1].Email -min(min(0)) -float(0 * 2) -TotalViews + abs(TotalViews % 1) -0.5 != TotalViews or 0 != nil -abs(1) < TotalViews -{"Go": nil, "JavaScript": "Go"}?.CommentDate -one(Posts, " " != nil) -int(TotalViews) in map(Posts, Posts) -TotalViews + 0 .. TotalViews -TotalViews - TotalViews / 0 -0.5 / TotalViews < TotalViews ** 2 -none(Posts, TotalViews <= 0) -Authors[len(Posts)] -lower(toJSON(Authors)) -!(0.5 != 2) -TotalViews != TotalViews ? nil : TotalViews -int(TotalViews * 0.5) -len(Posts) <= -TotalViews -!(0 < 0) -Posts == nil ? Authors : nil --(TotalViews + 2) -TotalViews * TotalViews - TotalViews -1 < TotalViews || 0 == 0 -not (nil != 0) -TotalViews >= 0.5 != nil -none(Posts, TotalViews < 1) -map(Posts, 0 in Authors) -not true ? Posts : Posts -string(0.5 < TotalViews) -int(TotalViews) != TotalViews -map(Posts[TotalViews:TotalViews], Posts) -(TotalViews - 0) ^ TotalViews -len(Posts) + TotalViews -{"JavaScript": " ", "Go": TotalViews, "Go": 2}?.Tags -!(1 < 0) -one(filter(Posts, false), 0 == nil) -abs(TotalViews) .. TotalViews -TotalViews % 1 < TotalViews ? 0.5 : Authors -map(Posts, 1 + TotalViews) -string(true == true) -TotalViews ** (0.5 * TotalViews) -none(Posts, false == true) -int(0.5 ** TotalViews) -TotalViews .. max(TotalViews) -TotalViews <= count(Posts, true) -!(Posts == nil) -{"JavaScript": Authors, "Go": "Go"}.Upvotes -float(0.5 + TotalViews) -TotalViews % 1 + TotalViews / 0 -"JavaScript" in Authors[TotalViews] -TotalViews + TotalViews + 0.5 -all(Posts, false == false) -TotalViews < 0 / TotalViews -map(Posts, 0.5 * 2) -[-TotalViews] -get(Posts, false ? 0 : Authors) -get(Posts, true ? TotalViews : true) -max(max(TotalViews)) -!(TotalViews >= 1) -Posts == Posts or 2 <= 0 --0.5 == TotalViews -map(TotalViews .. 1, Title(nil)) -not !(TotalViews > TotalViews) -(0.5 + 2) ** len(Posts) -!true ? Posts : Authors -abs(0.5 ** 0) -all(Posts, TotalViews == 1) -string(0 in Posts) -TotalViews + max(0) -get(Authors, int(0)) -get(Posts, true ? 0 : Authors) -TotalViews > TotalViews % TotalViews -len(Posts) != TotalViews -float(TotalViews * 2) -0 % TotalViews / 0.5 / 1 -toJSON(min(TotalViews)) -string(any(Posts, true)) -not !(Authors != Authors) --0.5 ** TotalViews -Authors != Authors && one(Posts, true) -TotalViews * 2 == TotalViews -int(0.5) <= TotalViews ? Posts : 0 -one(Posts, true) && TotalViews in Posts -TotalViews + 0 > 0 ^ 0 -any(Posts, .Equal(#)) -TotalViews ^ TotalViews / TotalViews -0 / 0 != TotalViews / TotalViews -2 ^ TotalViews - TotalViews -map(map(Posts, 0), Posts) --(1 * 0) -map(Posts, 1 != TotalViews) -min(TotalViews ^ 0) -map(false ? " " : Posts, Authors) -{"JavaScript": Authors, "Go": TotalViews}?.Profile -upper(false ? TotalViews : "Go") -min(1 % 1) -max(0.5 - 2) --(TotalViews - 2) -all(Posts, nil in Posts) -TotalViews + 0 + TotalViews -Posts != map(Posts, Authors) -TotalViews * TotalViews < TotalViews -{" ": TotalViews, "JavaScript": TotalViews}?.Content -0 != TotalViews ? TotalViews : TotalViews -{" ": "JavaScript", " ": TotalViews}.ID -min(0 - TotalViews) -TotalViews + 0 in Authors -TotalViews - TotalViews / 0.5 -TotalViews != max(TotalViews, TotalViews) -0.5 ** 1 == TotalViews -len(Authors) in Posts -filter(Posts, Posts == Posts) -TotalViews ^ 0.5 ^ TotalViews -all(map(Posts, 0.5), TotalViews in Authors) -TotalViews + TotalViews >= TotalViews -(0 % TotalViews) ** TotalViews -filter(map(Posts, " "), TotalViews >= 0) -TotalViews in Authors or TotalViews in Posts --max(0.5) -all(Posts, 0 < TotalViews) -WithID(Posts, 1)?.Content -!false ? nil : 1 --0 ** TotalViews -{" ": TotalViews, "JavaScript": nil}?.CommentDate -int(TotalViews ^ 1) -map(Posts, .Content) -string(false != false) -filter(Posts, any(Posts, true)) -abs(true ? TotalViews : Posts) -map(Posts, # != #) -toJSON(0 ^ TotalViews) -not false ? 0.5 : Authors -TotalViews - 0 <= TotalViews -TotalViews ^ TotalViews + TotalViews -TotalViews * TotalViews / 0 -float(0 + 0.5) -abs(count(Posts, true)) -max(0) ** TotalViews -not (1 >= TotalViews) -filter(Posts, false != true) -string(toJSON(true)) -0 % TotalViews < TotalViews -map(map(Posts, TotalViews), 2 != TotalViews) --(2 ** TotalViews) -none(Posts, TotalViews > TotalViews) -get(Authors, 2 * TotalViews) -[Authors] != Posts -Posts[0 % TotalViews] -(0 + TotalViews) / TotalViews -true ? TotalViews : 1 .. TotalViews -float(0.5) ** TotalViews -TotalViews * 1 <= abs(TotalViews) -TotalViews + 1 >= TotalViews -0 * 0.5 - TotalViews -filter(Posts, 0 < 0) -TotalViews == min(TotalViews) -{"JavaScript": " ", "JavaScript": TotalViews}.Comments -TotalViews == TotalViews ** 0 --TotalViews > 0.5 ? "JavaScript" : 2 -TotalViews / (0.5 + 0.5) -TotalViews ^ min(0) -TotalViews * 1 ^ TotalViews -map(map(Posts, TotalViews), -0) -string(0.5 ** 0) -count(Posts, false) > TotalViews ? 1 : Posts -min(TotalViews % 2) -0.5 / TotalViews < TotalViews -!(0 != 0) -!true ? TotalViews : Posts -last(map(Posts, " ")) -TotalViews * 0 % TotalViews -float(TotalViews - 1) -string(TotalViews ** 0.5) -map(Posts, TotalViews <= 0) -TotalViews ** 0 * TotalViews -abs(TotalViews ^ TotalViews) -TotalViews in Posts and nil in Authors -TotalViews / 1 / TotalViews -TotalViews % TotalViews - TotalViews -len(TotalViews .. 0) -Posts[count(Posts, false)] -toJSON(0 <= TotalViews) -any(Posts, nil != 1) -not (2 >= 0) -0.5 > TotalViews and TotalViews <= TotalViews --(TotalViews ** 0.5) -not (false != nil) -TotalViews == TotalViews * TotalViews -not (1 <= TotalViews) -not (0 != 0) -0.5 + TotalViews <= TotalViews -string(1 - 0.5) -TotalViews <= max(TotalViews) --TotalViews in Posts -any(Posts, 0 in Authors) -any(Posts, TotalViews == 1) -abs(0 + TotalViews) -TotalViews / 1 - TotalViews -one(Posts, 2 <= 1) -TotalViews / 1 * 0 -TotalViews == TotalViews ? Authors : Posts -not !(TotalViews in Authors) -(2 - TotalViews) * TotalViews ^ TotalViews -not (1 != TotalViews) -int(0.5 + 0.5) -map(false ? 2 : Posts, #) -count(Posts, 0 < TotalViews) -map(Posts, 0.5 != TotalViews) -TotalViews ** TotalViews ^ 0.5 -abs(0 / TotalViews) -TotalViews <= TotalViews ? TotalViews : 1 -all(Posts, 0 <= 1) -Authors[max(TotalViews)] -0.5 != TotalViews || Posts != Posts -any(map(Posts, true), 1 < TotalViews) -lower(upper(" ")) -TotalViews >= 2 ? TotalViews : true -string(0 / 0.5) -none(Posts, false ? Posts : true) -TotalViews ^ (TotalViews * 0.5) -0 % 1 != 0 ^ TotalViews -Authors[2].LastName -TotalViews in Posts == nil -Posts == Posts ? true : Authors -all(Posts, TotalViews != 0.5) -upper(toBase64("JavaScript")) -int(1) .. TotalViews -TotalViews ^ (TotalViews * TotalViews) -TotalViews / max(TotalViews) -string(nil in Authors) -min(0.5 ^ 0) -2 % TotalViews + TotalViews -not (1 == 0) -max(-0) -(TotalViews + TotalViews) / (TotalViews + 1) -not not true -TotalViews ^ (TotalViews * 0) -not false ? nil : TotalViews -Authors[1 + TotalViews] -toJSON(false ? Posts : Posts) -map(Posts, TotalViews == 0) -(0 + 0) / 1 ** 2 -true ? 1 : 0 / TotalViews -none(Posts, nil != Authors) -nil != Posts or 2 > TotalViews -toJSON(min(TotalViews, 0.5)) -all(Posts, TotalViews <= TotalViews) -any(Posts, 1 > TotalViews) -TotalViews > 1 ^ 2 -one(Posts, not true) -one(Posts, TotalViews > 0) -none(Posts, 2 <= TotalViews) -none(map(Posts, Posts), nil == Posts) -0.5 ** TotalViews ** TotalViews -0 + 1 <= TotalViews -!false ? false : true -abs(true ? TotalViews : TotalViews) --(0 ** 0) -TotalViews * (TotalViews + 0) -TotalViews % (TotalViews + TotalViews) -toJSON(map(Posts, 0.5)) -float(TotalViews) != TotalViews -{"JavaScript": 1, "Go": Posts}?.PublishDate -min(1 % TotalViews) -TotalViews != 0.5 && TotalViews in Posts -TotalViews != 0 % TotalViews -min(0 ^ TotalViews) -WithID(Posts, 0).ID -toJSON(0.5 + 0.5) -TotalViews + 0 / 0 -TotalViews >= 0 ? Authors : Authors -toBase64(string(TotalViews)) -{"JavaScript": "JavaScript"}.Content -any(Posts, 2 != 0.5) -TotalViews + -0 -TotalViews >= TotalViews and 2 in Authors -Posts != Posts == false ? false : TotalViews -[Posts, TotalViews] != Posts diff --git a/testdata/fuzz/FuzzExpr/1fedafb72e35699d b/testdata/fuzz/FuzzExpr/1fedafb72e35699d new file mode 100644 index 000000000..fb2cb204e --- /dev/null +++ b/testdata/fuzz/FuzzExpr/1fedafb72e35699d @@ -0,0 +1,2 @@ +go test fuzz v1 +string("one(m[\"\"],#)") diff --git a/testdata/fuzz/FuzzExpr/37464e3dcb75a05c b/testdata/fuzz/FuzzExpr/37464e3dcb75a05c new file mode 100644 index 000000000..992d44c28 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/37464e3dcb75a05c @@ -0,0 +1,2 @@ +go test fuzz v1 +string("repeat(\"0\",1/0)") diff --git a/testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 b/testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 new file mode 100644 index 000000000..7c21a804e --- /dev/null +++ b/testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("duration(\"0A\")") diff --git a/testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e b/testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e deleted file mode 100644 index 751f951d4..000000000 --- a/testdata/fuzz/FuzzExpr/75dd7c6d4ff6ea8e +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("duration(toJSON(1))") diff --git a/testdata/fuzz/FuzzExpr/87861ab0b9f0abbe b/testdata/fuzz/FuzzExpr/87861ab0b9f0abbe deleted file mode 100644 index 58c76a3b0..000000000 --- a/testdata/fuzz/FuzzExpr/87861ab0b9f0abbe +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("[[0][0]][0][:0]") diff --git a/testdata/fuzz/FuzzExpr/b1aef962e961045a b/testdata/fuzz/FuzzExpr/b1aef962e961045a new file mode 100644 index 000000000..c5c870587 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/b1aef962e961045a @@ -0,0 +1,2 @@ +go test fuzz v1 +string("fn()") diff --git a/testdata/fuzz/FuzzExpr/b65163ca9e44703c b/testdata/fuzz/FuzzExpr/b65163ca9e44703c deleted file mode 100644 index e24cea08f..000000000 --- a/testdata/fuzz/FuzzExpr/b65163ca9e44703c +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("map(false?:Authors,.A)") diff --git a/testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c b/testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c new file mode 100644 index 000000000..fb870a2c8 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c @@ -0,0 +1,2 @@ +go test fuzz v1 +string("fromJSON(\"A\")") diff --git a/testdata/fuzz/FuzzExpr/c6717d9f77902b9c b/testdata/fuzz/FuzzExpr/c6717d9f77902b9c new file mode 100644 index 000000000..0f3984207 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/c6717d9f77902b9c @@ -0,0 +1,2 @@ +go test fuzz v1 +string("toJSON(2^1070)") diff --git a/testdata/fuzz/FuzzExpr/cd662894c578ed90 b/testdata/fuzz/FuzzExpr/cd662894c578ed90 new file mode 100644 index 000000000..d6b71bb6f --- /dev/null +++ b/testdata/fuzz/FuzzExpr/cd662894c578ed90 @@ -0,0 +1,2 @@ +go test fuzz v1 +string("duration(\"\")") diff --git a/testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd b/testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd new file mode 100644 index 000000000..7790bd025 --- /dev/null +++ b/testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd @@ -0,0 +1,2 @@ +go test fuzz v1 +string("fromJSON(\"\")") From d6e36f69fc216947d285bcbec983fa8f4867e71b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 13:46:11 +0200 Subject: [PATCH 078/506] Move memory budget test --- expr_test.go | 19 +++++++++++++++++++ vm/vm_test.go | 13 ------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/expr_test.go b/expr_test.go index 7ea3700d0..ac8d0f548 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1781,3 +1781,22 @@ func TestEval_slices_out_of_bound(t *testing.T) { }) } } + +func TestMemoryBudget(t *testing.T) { + tests := []struct { + code string + }{ + {`map(1..100, {map(1..100, {map(1..100, {0})})})`}, + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + program, err := expr.Compile(tt.code) + require.NoError(t, err, "compile error") + + _, err = expr.Run(program, nil) + assert.Error(t, err, "run error") + assert.Contains(t, err.Error(), "memory budget exceeded") + }) + } +} diff --git a/vm/vm_test.go b/vm/vm_test.go index 499020692..202dd3357 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -133,19 +133,6 @@ func TestRun_Helpers(t *testing.T) { } } -func TestRun_MemoryBudget(t *testing.T) { - input := `map(1..100, {map(1..100, {map(1..100, {0})})})` - - tree, err := parser.Parse(input) - require.NoError(t, err) - - program, err := compiler.Compile(tree, nil) - require.NoError(t, err) - - _, err = vm.Run(program, nil) - require.Error(t, err) -} - type ErrorEnv struct { InnerEnv InnerEnv } From ec7d61521e788de934bebae4ee73f93511acbccf Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:21:10 +0200 Subject: [PATCH 079/506] Fix in op checker --- checker/checker.go | 2 +- checker/checker_test.go | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 8204aa7d0..c04c09f31 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -341,7 +341,7 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { if l == nil { // It is possible to compare with nil. return boolType, info{} } - if !isAny(l) && !isInteger(l) { + if !isAny(l) && !l.AssignableTo(r.Elem()) && !(isInteger(l) && isInteger(r.Elem())) { return v.error(node, "cannot use %v as type %v in array", l, r.Elem()) } return boolType, info{} diff --git a/checker/checker_test.go b/checker/checker_test.go index 74f02ef37..4b4f77c46 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -55,8 +55,10 @@ var successTests = []string{ "(Any ? 0 : nil) == 0", "(Any ? nil : nil) == nil", "!(Any ? Foo : Foo.Bar).Anything", - "Int in ArrayOfFoo", - "Int not in ArrayOfFoo", + "Int in ArrayOfInt", + "Int not in ArrayOfAny", + "String in ArrayOfAny", + "String in ArrayOfString", "String in Foo", "String in MapOfFoo", "String matches 'ok'", From e9b1e312eab9a9f95ba117e71da8dd0fe5dd85af Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:21:25 +0200 Subject: [PATCH 080/506] Add memory budget test --- expr_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/expr_test.go b/expr_test.go index ac8d0f548..3e959bb19 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1787,6 +1787,7 @@ func TestMemoryBudget(t *testing.T) { code string }{ {`map(1..100, {map(1..100, {map(1..100, {0})})})`}, + {`len(1..10000000)`}, } for _, tt := range tests { From 72749ef809321ec5a2fb45c255613444aa00a33d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:21:36 +0200 Subject: [PATCH 081/506] Update fuzz_test.go --- fuzz_test.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/fuzz_test.go b/fuzz_test.go index b9af4ec21..3bbc789d8 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -42,7 +42,7 @@ func FuzzExpr(f *testing.F) { `i <= j`, `i in a`, `i not in a`, - `i in m`, + `s in m`, `m.a`, `m.m.a`, `a[0]`, @@ -59,7 +59,7 @@ func FuzzExpr(f *testing.F) { `string(i)`, `trim(" a ")`, `trim("_a_", "_")`, - `trimPrefix(" a")`, + `trimPrefix(" a", " ")`, `trimSuffix("a ")`, `upper("a")`, `lower("A")`, @@ -116,6 +116,9 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`reflect: call of reflect.Value.Call on .* Value`), regexp.MustCompile(`reflect: call of reflect.Value.Index on map Value`), regexp.MustCompile(`reflect: call of reflect.Value.Len on .* Value`), + regexp.MustCompile(`strings: negative Repeat count`), + regexp.MustCompile(`strings: illegal bytes to escape`), + regexp.MustCompile(`operator "in" not defined on int`), } skipCode := []string{ @@ -125,25 +128,25 @@ func FuzzExpr(f *testing.F) { f.Fuzz(func(t *testing.T, code string) { for _, skipCase := range skipCode { if strings.Contains(code, skipCase) { - t.Skip() + t.Skipf("skip code: %s", skipCase) return } } - program, err := expr.Compile(code, expr.Env(env), fn) + program, err := expr.Compile(code, expr.Env(env), fn, expr.ExperimentalPipes()) if err != nil { - t.Skip() + t.Skipf("compile error: %s", err) } _, err = expr.Run(program, env) if err != nil { for _, okCase := range okCases { if okCase.MatchString(err.Error()) { - t.Skip() + t.Skipf("skip error: %s", err) return } } - t.Errorf("code: %s, err: %s", code, err) + t.Errorf("code: %s\nerr: %s", code, err) } }) } From 7a494d20df535c38980f94c85ecda8c650a404d6 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:21:59 +0200 Subject: [PATCH 082/506] Small fixes --- builtin/utils.go | 1 + checker/types.go | 1 - test/mock/mock.go | 1 + vm/runtime/runtime.go | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/builtin/utils.go b/builtin/utils.go index be258657f..1699c5ddd 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -8,6 +8,7 @@ var ( anyType = reflect.TypeOf(new(interface{})).Elem() integerType = reflect.TypeOf(0) floatType = reflect.TypeOf(float64(0)) + arrayType = reflect.TypeOf([]interface{}{}) ) func kind(t reflect.Type) reflect.Kind { diff --git a/checker/types.go b/checker/types.go index f5fcbdab3..d1a5e85e6 100644 --- a/checker/types.go +++ b/checker/types.go @@ -20,7 +20,6 @@ var ( timeType = reflect.TypeOf(time.Time{}) durationType = reflect.TypeOf(time.Duration(0)) functionType = reflect.TypeOf(new(func(...interface{}) (interface{}, error))).Elem() - errorType = reflect.TypeOf((*error)(nil)).Elem() ) func combined(a, b reflect.Type) reflect.Type { diff --git a/test/mock/mock.go b/test/mock/mock.go index 2ded8e555..b2798a045 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -32,6 +32,7 @@ type Env struct { Abstract Abstract ArrayOfAny []interface{} ArrayOfInt []int + ArrayOfString []string ArrayOfFoo []*Foo MapOfFoo map[string]Foo MapOfAny map[string]interface{} diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 3960b073c..7075c7014 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -267,7 +267,7 @@ func In(needle interface{}, array interface{}) bool { return false } - panic(fmt.Sprintf(`operator "in"" not defined on %T`, array)) + panic(fmt.Sprintf(`operator "in" not defined on %T`, array)) } func Len(a interface{}) int { From d90488d31c9984c60775c5940eab8343658c60e8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:22:21 +0200 Subject: [PATCH 083/506] Add repeat() memory boundary --- builtin/builtin_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 4c8f61fbb..417af5a8c 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -169,3 +169,19 @@ func TestBuiltin_types(t *testing.T) { }) } } + +func TestBuiltin_memory_limits(t *testing.T) { + tests := []struct { + input string + }{ + {`repeat("\xc4<\xc4\xc4\xc4",10009999990)`}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + _, err := expr.Eval(test.input, nil) + assert.Error(t, err) + assert.Contains(t, err.Error(), "memory budget exceeded") + }) + } +} From 31a57fa969fdd9c15e0b214cb789a760025d0389 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:22:31 +0200 Subject: [PATCH 084/506] Add repeat() memory boundary --- builtin/builtin.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 556223420..52738e4cd 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -194,7 +194,11 @@ var Functions = []*Function{ { Name: "repeat", Func: func(args ...interface{}) (interface{}, error) { - return strings.Repeat(args[0].(string), runtime.ToInt(args[1])), nil + n := runtime.ToInt(args[1]) + if n > 1e6 { + panic("memory budget exceeded") + } + return strings.Repeat(args[0].(string), n), nil }, Types: types(strings.Repeat), }, From 386ff5ca38ff27eebd2845c6778218fc7a9fc095 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:22:53 +0200 Subject: [PATCH 085/506] Allow trim* func to take only one arg --- builtin/builtin.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 52738e4cd..34019535f 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -122,16 +122,30 @@ var Functions = []*Function{ { Name: "trimPrefix", Func: func(args ...interface{}) (interface{}, error) { - return strings.TrimPrefix(args[0].(string), args[1].(string)), nil + s := " " + if len(args) == 2 { + s = args[1].(string) + } + return strings.TrimPrefix(args[0].(string), s), nil }, - Types: types(strings.TrimPrefix), + Types: types( + strings.TrimPrefix, + new(func(string) string), + ), }, { Name: "trimSuffix", Func: func(args ...interface{}) (interface{}, error) { - return strings.TrimSuffix(args[0].(string), args[1].(string)), nil + s := " " + if len(args) == 2 { + s = args[1].(string) + } + return strings.TrimSuffix(args[0].(string), s), nil }, - Types: types(strings.TrimSuffix), + Types: types( + strings.TrimSuffix, + new(func(string) string), + ), }, { Name: "upper", From d6ddf088650f71a4557eef90c4a8f6be611d8486 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:23:07 +0200 Subject: [PATCH 086/506] Add keys() and values() builtins --- builtin/builtin.go | 56 +++++++++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 2 ++ 2 files changed, 58 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index 34019535f..a8ced5cf1 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -461,4 +461,60 @@ var Functions = []*Function{ return runtime.Fetch(args[0], args[1]), nil }, }, + { + Name: "keys", + Func: func(args ...interface{}) (interface{}, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot get keys from %s", v.Kind()) + } + keys := v.MapKeys() + out := make([]interface{}, len(keys)) + for i, key := range keys { + out[i] = key.Interface() + } + return out, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Map: + return arrayType, nil + } + return anyType, fmt.Errorf("cannot get keys from %s", args[0]) + }, + }, + { + Name: "values", + Func: func(args ...interface{}) (interface{}, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot get values from %s", v.Kind()) + } + keys := v.MapKeys() + out := make([]interface{}, len(keys)) + for i, key := range keys { + out[i] = v.MapIndex(key).Interface() + } + return out, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Map: + return arrayType, nil + } + return anyType, fmt.Errorf("cannot get values from %s", args[0]) + }, + }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 417af5a8c..03bee3afd 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -82,6 +82,8 @@ func TestBuiltin(t *testing.T) { {`get(ArrayOfAny, 1)`, "2"}, {`get({foo: 1, bar: 2}, "foo")`, 1}, {`get({foo: 1, bar: 2}, "unknown")`, nil}, + {`"foo" in keys({foo: 1, bar: 2})`, true}, + {`1 in values({foo: 1, bar: 2})`, true}, } env := map[string]interface{}{ From f9413ab10e33d39aa9706b090d304a77a540507a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 14:43:24 +0200 Subject: [PATCH 087/506] Do not allow to override builtin function --- builtin/builtin.go | 13 ++++++++++--- builtin/builtin_test.go | 31 +++++++++++++++++++++++++++++++ conf/config.go | 20 ++++++++++++++++++++ conf/types_table.go | 7 +++++++ 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index a8ced5cf1..5a0136175 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -12,13 +12,19 @@ import ( ) type Function struct { - Name string - Func func(args ...interface{}) (interface{}, error) + Name string + Func func(args ...interface{}) (interface{}, error) + Types []reflect.Type + + builtin bool // true if function is builtin Builtin1 func(arg interface{}) interface{} - Types []reflect.Type Validate func(args []reflect.Type) (reflect.Type, error) } +func (f Function) Builtin() bool { + return f.builtin +} + var ( Index map[string]int Names []string @@ -28,6 +34,7 @@ func init() { Index = make(map[string]int) Names = make([]string, len(Functions)) for i, fn := range Functions { + fn.builtin = true Index[fn.Name] = i Names[i] = fn.Name } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 03bee3afd..4cde5ab48 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -187,3 +187,34 @@ func TestBuiltin_memory_limits(t *testing.T) { }) } } + +func TestBuiltin_disallow_builtins_override(t *testing.T) { + t.Run("via env", func(t *testing.T) { + env := map[string]interface{}{ + "len": func() int { return 42 }, + "repeat": func(a string) string { + return a + }, + } + assert.Panics(t, func() { + _, _ = expr.Compile(`string(len("foo")) + repeat("0", 2)`, expr.Env(env)) + }) + }) + t.Run("via expr.Function", func(t *testing.T) { + length := expr.Function("len", + func(params ...interface{}) (interface{}, error) { + return 42, nil + }, + new(func() int), + ) + repeat := expr.Function("repeat", + func(params ...interface{}) (interface{}, error) { + return params[0], nil + }, + new(func(string) string), + ) + assert.Panics(t, func() { + _, _ = expr.Compile(`string(len("foo")) + repeat("0", 2)`, length, repeat) + }) + }) +} diff --git a/conf/config.go b/conf/config.go index 849cdce14..2989eab81 100644 --- a/conf/config.go +++ b/conf/config.go @@ -95,4 +95,24 @@ func (c *Config) Check() { } } } + for name, t := range c.Types { + if kind(t.Type) != reflect.Func { + continue + } + for _, b := range builtin.Names { + if b == name { + panic(fmt.Errorf(`cannot override builtin %s(); it is already defined in expr`, name)) + } + } + } + for _, f := range c.Functions { + if f.Builtin() { + continue + } + for _, b := range builtin.Names { + if b == f.Name { + panic(fmt.Errorf(`cannot override builtin %s(); it is already defined in expr`, f.Name)) + } + } + } } diff --git a/conf/types_table.go b/conf/types_table.go index 7d486480c..592340069 100644 --- a/conf/types_table.go +++ b/conf/types_table.go @@ -121,6 +121,13 @@ func dereference(t reflect.Type) reflect.Type { return t } +func kind(t reflect.Type) reflect.Kind { + if t == nil { + return reflect.Invalid + } + return t.Kind() +} + func FieldName(field reflect.StructField) string { if taggedName := field.Tag.Get("expr"); taggedName != "" { return taggedName From 3475f60925a1753a6413ed3d13a921bf9b759ffc Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 15:17:20 +0200 Subject: [PATCH 088/506] Add gen test --- test/{playground => }/gen/gen.go | 101 +- test/gen/gen_test.go | 26 + test/{playground => }/gen/utils.go | 0 testdata/examples.txt | 20343 ++++++++++++++++++++++ testdata/fuzz/FuzzExpr/1fedafb72e35699d | 2 - testdata/fuzz/FuzzExpr/37464e3dcb75a05c | 2 - testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 | 2 - testdata/fuzz/FuzzExpr/b1aef962e961045a | 2 - testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c | 2 - testdata/fuzz/FuzzExpr/c6717d9f77902b9c | 2 - testdata/fuzz/FuzzExpr/cd662894c578ed90 | 2 - testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd | 2 - 12 files changed, 20415 insertions(+), 71 deletions(-) rename test/{playground => }/gen/gen.go (85%) create mode 100644 test/gen/gen_test.go rename test/{playground => }/gen/utils.go (100%) create mode 100644 testdata/examples.txt delete mode 100644 testdata/fuzz/FuzzExpr/1fedafb72e35699d delete mode 100644 testdata/fuzz/FuzzExpr/37464e3dcb75a05c delete mode 100644 testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 delete mode 100644 testdata/fuzz/FuzzExpr/b1aef962e961045a delete mode 100644 testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c delete mode 100644 testdata/fuzz/FuzzExpr/c6717d9f77902b9c delete mode 100644 testdata/fuzz/FuzzExpr/cd662894c578ed90 delete mode 100644 testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd diff --git a/test/playground/gen/gen.go b/test/gen/gen.go similarity index 85% rename from test/playground/gen/gen.go rename to test/gen/gen.go index 8e0bb17f2..7e1f433ed 100644 --- a/test/playground/gen/gen.go +++ b/test/gen/gen.go @@ -3,19 +3,52 @@ package main import ( "fmt" "math/rand" + "runtime/debug" "github.com/antonmedv/expr" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/test/playground" ) +var env = map[string]interface{}{ + "a": 1, + "b": 2, + "f": 0.5, + "ok": true, + "s": "abc", + "arr": []int{1, 2, 3}, + "obj": map[string]interface{}{ + "a": 1, + "b": 2, + "obj": map[string]interface{}{ + "a": 1, + "b": 2, + "obj": map[string]int{ + "a": 1, + "b": 2, + }, + }, + "fn": func(a int) int { return a + 1 }, + "head": func(xs ...interface{}) interface{} { return xs[0] }, + }, + "add": func(a, b int) int { return a + b }, + "div": func(a, b int) int { return a / b }, +} + +var names []string + +func init() { + for name := range env { + names = append(names, name) + } +} + func main() { var code string defer func() { if r := recover(); r != nil { fmt.Printf("==========================\n%s\n==========================\n", code) - panic(r) + debug.PrintStack() } }() @@ -32,11 +65,11 @@ func main() { {10, 5}, })).String() - program, err := expr.Compile(code, expr.Env(playground.Blog{})) + program, err := expr.Compile(code, expr.Env(env)) if err != nil { continue } - _, err = expr.Run(program, playground.ExampleData()) + _, err = expr.Run(program, env) if err != nil { continue } @@ -98,7 +131,7 @@ func integerNode(depth int) ast.Node { func stringNode(depth int) ast.Node { corpus := []string{ - "Go", "JavaScript", " ", + "a", "b", "c", } return &ast.StringNode{ Value: corpus[rand.Intn(len(corpus))], @@ -112,40 +145,16 @@ func booleanNode(depth int) ast.Node { } func identifierNode(depth int) ast.Node { - cases := []string{ - "Posts", - "Authors", - "TotalViews", - } - return &ast.IdentifierNode{ - Value: cases[rand.Intn(len(cases))], + Value: names[rand.Intn(len(names))], } } func memberNode(depth int) ast.Node { cases := []string{ - "Birthday", - "Biography", - "Website", - "ID", - "FirstName", - "LastName", - "Email", - "Profile", - "ID", - "Title", - "Content", - "PublishDate", - "Author", - "Comments", - "Tags", - "Likes", - "ID", - "AuthorName", - "Content", - "CommentDate", - "Upvotes", + "a", + "b", + "obj", } return &ast.MemberNode{ @@ -205,17 +214,8 @@ func binaryNode(depth int) ast.Node { func methodNode(depth int) ast.Node { cases := []string{ - "Age", - "FullName", - "IsAdmin", - "Published", - "After", - "Before", - "Compare", - "Equal", - "IsZero", - "Upvoted", - "AuthorEmail", + "fn", + "head", } return &ast.MemberNode{ @@ -227,17 +227,8 @@ func methodNode(depth int) ast.Node { func funcNode(depth int) ast.Node { cases := []string{ - "RecentPosts", - "PopularPosts", - "TotalUpvotes", - "TotalComments", - "Add", - "Sub", - "Title", - "HasTag", - "IsAdmin", - "IsZero", - "WithID", + "add", + "div", } return &ast.IdentifierNode{ diff --git a/test/gen/gen_test.go b/test/gen/gen_test.go new file mode 100644 index 000000000..fdb061dc8 --- /dev/null +++ b/test/gen/gen_test.go @@ -0,0 +1,26 @@ +package main + +import ( + "os" + "strings" + "testing" + + "github.com/antonmedv/expr" + "github.com/stretchr/testify/require" +) + +func TestGenerated(t *testing.T) { + b, err := os.ReadFile("../../testdata/examples.txt") + require.NoError(t, err) + + examples := strings.TrimSpace(string(b)) + for _, line := range strings.Split(examples, "\n") { + t.Run(line, func(t *testing.T) { + program, err := expr.Compile(line, expr.Env(env)) + require.NoError(t, err) + + _, err = expr.Run(program, env) + require.NoError(t, err) + }) + } +} diff --git a/test/playground/gen/utils.go b/test/gen/utils.go similarity index 100% rename from test/playground/gen/utils.go rename to test/gen/utils.go diff --git a/testdata/examples.txt b/testdata/examples.txt new file mode 100644 index 000000000..46e90f47f --- /dev/null +++ b/testdata/examples.txt @@ -0,0 +1,20343 @@ +!!(obj?.head(obj, div) == obj.obj) +!!false +!!ok +!!true +!("a" != nil) +!("a" != s) +!("a" < "b") +!("a" < s) +!("a" <= "a") +!("a" == nil) +!("a" == s) +!("a" > s) +!("a" endsWith "a") +!("a" endsWith s) +!("a" in obj) +!("a" matches s) +!("a" startsWith "a") +!("a" startsWith "c") +!("a" startsWith s) +!("b" != "b") +!("b" != s) +!("b" < "c") +!("b" < s) +!("b" <= "c") +!("b" <= s) +!("b" > "b") +!("b" > "c") +!("b" > s) +!("b" >= "c") +!("b" >= s) +!("b" contains "a") +!("b" contains "c") +!("b" contains s) +!("b" endsWith "a") +!("b" endsWith "b") +!("b" in obj) +!("b" startsWith "c") +!("c" != "c") +!("c" != nil) +!("c" < "b") +!("c" < s) +!("c" <= s) +!("c" == "c") +!("c" == nil) +!("c" == s) +!("c" > s) +!("c" >= "b") +!("c" >= s) +!("c" endsWith "b") +!("c" endsWith "c") +!("c" endsWith s) +!("c" in obj) +!("c" matches "c") +!("c" matches s) +!("c" startsWith "a") +!("c" startsWith s) +!(0 != 0) +!(0 != 1) +!(0 != a) +!(0 != f) +!(0 != nil) +!(0 < 0) +!(0 < 0.5) +!(0 < 2) +!(0 < a) +!(0 < b) +!(0 < f) +!(0 <= 0) +!(0 <= 0.5) +!(0 <= 1) +!(0 <= a) +!(0 <= b) +!(0 <= f) +!(0 == 0) +!(0 == 0.5) +!(0 == 1) +!(0 == 2) +!(0 == a) +!(0 == b) +!(0 == f) +!(0 == nil) +!(0 > 0) +!(0 > 2) +!(0 > b) +!(0 > f) +!(0 >= 0) +!(0 >= 0.5) +!(0 >= 1) +!(0 >= 2) +!(0 >= a) +!(0 >= b) +!(0 >= f) +!(0 in arr) +!(0.5 != 0) +!(0.5 != 0.5) +!(0.5 != 2) +!(0.5 != a) +!(0.5 != b) +!(0.5 != f) +!(0.5 != nil) +!(0.5 < 0) +!(0.5 < 2) +!(0.5 < a) +!(0.5 < b) +!(0.5 < f) +!(0.5 <= 0) +!(0.5 <= a) +!(0.5 <= b) +!(0.5 <= f) +!(0.5 == 2) +!(0.5 == a) +!(0.5 == b) +!(0.5 == f) +!(0.5 == nil) +!(0.5 > 0) +!(0.5 > 1) +!(0.5 > 2) +!(0.5 > a) +!(0.5 > b) +!(0.5 > f) +!(0.5 >= 0) +!(0.5 >= 0.5) +!(0.5 >= 1) +!(0.5 >= a) +!(0.5 >= b) +!(0.5 >= f) +!(1 < 0) +!(1 < 1) +!(1 < a) +!(1 < b) +!(1 <= 0) +!(1 <= a) +!(1 <= b) +!(1 <= f) +!(1 == 0) +!(1 == a) +!(1 == f) +!(1 == nil) +!(1 > a) +!(1 > b) +!(1 > f) +!(1 >= 0) +!(1 >= 0.5) +!(1 >= b) +!(1 in arr) +!(2 != 0.5) +!(2 != 2) +!(2 != a) +!(2 != b) +!(2 != f) +!(2 / a < f) +!(2 < 0) +!(2 < 1) +!(2 < 2) +!(2 < a) +!(2 < f) +!(2 <= 2) +!(2 <= b) +!(2 <= f) +!(2 == 0) +!(2 == 0.5) +!(2 == 1) +!(2 == 2) +!(2 == a) +!(2 == b) +!(2 == f) +!(2 > 0) +!(2 > a) +!(2 > f) +!(2 >= a) +!(2 >= b) +!(2 >= f) +!(2 in arr) +!(a != 0.5) +!(a != 1) +!(a != 2) +!(a != a) +!(a != b) +!(a != f) +!(a != nil) +!(a + 0.5 >= a) +!(a < 0) +!(a < 0.5) +!(a < 2) +!(a < a) +!(a < b) +!(a < div(0, a)) +!(a < f) +!(a <= 0) +!(a <= 0.5) +!(a <= 2) +!(a <= a) +!(a <= b) +!(a <= f) +!(a == 0) +!(a == 0.5) +!(a == 1) +!(a == 2) +!(a == a) +!(a == b) +!(a == f) +!(a == nil) +!(a > 0) +!(a > 0.5) +!(a > 1) +!(a > 2 && div == add) +!(a > 2) +!(a > a) +!(a > b) +!(a > f) +!(a >= 0) +!(a >= 0.5) +!(a >= 1) +!(a >= 2) +!(a >= a) +!(a >= b) +!(a >= f) +!(a in arr) +!(add != add) +!(add != div) +!(add != nil) +!(add == add) +!(add == div) +!(add == nil) +!(arr != nil) +!(arr == arr) +!(arr == nil) +!(b != 0) +!(b != 0.5) +!(b != a) +!(b != b) +!(b != f) +!(b != nil) +!(b < 0) +!(b < 0.5 * 0.5) +!(b < 0.5) +!(b < 1) +!(b < a) +!(b < b) +!(b < f) +!(b <= 0) +!(b <= 1) +!(b <= a) +!(b <= b) +!(b <= f) +!(b == 0) +!(b == 0.5) +!(b == a) +!(b == b) +!(b == f) +!(b == nil) +!(b == obj.a) +!(b > 0) +!(b > 0.5) +!(b > 1) +!(b > 2) +!(b > a) +!(b > b) +!(b > f) +!(b >= 0) +!(b >= 0.5) +!(b >= 1) +!(b >= 2) +!(b >= a) +!(b >= b) +!(b >= f) +!(b in arr) +!(div != add) +!(div != div) +!(div != nil) +!(div == add) +!(div == div) +!(f != 0) +!(f != 0.5) +!(f != 1) +!(f != 2) +!(f != a) +!(f != b) +!(f != f) +!(f != nil) +!(f < 0) +!(f < 0.5) +!(f < 1) +!(f < a) +!(f < b) +!(f < f) +!(f < obj.b) +!(f <= 0) +!(f <= 0.5) +!(f <= 2) +!(f <= a) +!(f <= b) +!(f <= f) +!(f <= obj.b) +!(f == 0) +!(f == 0.5) +!(f == 1) +!(f == 2) +!(f == a) +!(f == b) +!(f == f) +!(f == nil) +!(f > 0) +!(f > 0.5) +!(f > 1) +!(f > a) +!(f > b) +!(f > div(b, a)) +!(f > f) +!(f >= 0) +!(f >= 0.5) +!(f >= 1) +!(f >= 2) +!(f >= a) +!(f >= b) +!(f >= f) +!(false != nil) +!(false != ok) +!(false != true) +!(false && false) +!(false && ok) +!(false && true) +!(false == nil) +!(false and ok) +!(false or ok) +!(false || ok) +!(nil != "a") +!(nil != "c") +!(nil != 0) +!(nil != 0.5) +!(nil != 2) +!(nil != a) +!(nil != add) +!(nil != arr) +!(nil != b) +!(nil != div) +!(nil != f) +!(nil != false) +!(nil != nil) +!(nil != obj) +!(nil != ok) +!(nil != s) +!(nil != true) +!(nil == "b") +!(nil == 0) +!(nil == 0.5) +!(nil == 1) +!(nil == a) +!(nil == add) +!(nil == arr) +!(nil == b) +!(nil == div) +!(nil == false) +!(nil == nil) +!(nil == obj) +!(nil == ok) +!(nil == s) +!(nil in arr) +!(nil in obj) +!(obj != nil) +!(obj != obj) +!(obj == nil) +!(obj == obj) +!(obj.b == a ** a) +!(ok != false) +!(ok != nil) +!(ok != ok) +!(ok != true) +!(ok && false) +!(ok && ok) +!(ok && true) +!(ok == false) +!(ok == nil) +!(ok == ok) +!(ok == true) +!(ok and false) +!(ok and ok) +!(ok and true) +!(ok or ok) +!(ok or true) +!(ok || false) +!(ok || ok) +!(ok || true) +!(s != "b") +!(s != "c") +!(s != nil) +!(s != s) +!(s < "a") +!(s < "b") +!(s < "c") +!(s < s) +!(s <= "c") +!(s <= s) +!(s == "a") +!(s == "b") +!(s == "c") +!(s == nil) +!(s == s) +!(s > "b") +!(s > s) +!(s >= "a") +!(s >= s) +!(s contains "c") +!(s contains s) +!(s endsWith "a") +!(s endsWith "c") +!(s endsWith s) +!(s in obj) +!(s matches "a") +!(s matches "b") +!(s matches s || ok) +!(s matches s) +!(s startsWith "a") +!(s startsWith "b") +!(s startsWith s) +!(string(s) startsWith "b" != false) +!(true != ok) +!(true != true) +!(true && false) +!(true && ok) +!(true == ok) +!(true == true) +!(true and true) +!(true or ok) +!(true || false) +!(true || ok) +!(true || true) +!all(arr, 2 != a) +!all(arr, false) +!all(arr, ok) +!all(arr, true) +!any(arr, false) +!any(arr, ok) +!any(arr, true) +!false && obj != obj.obj +!false && obj.b +!false == obj.head(ok) +!false ? "a" : s +!false ? "b" : add +!false ? "b" : f +!false ? "c" : f +!false ? 0 : "b" +!false ? 0 : false +!false ? 0 : s +!false ? 2 : false +!false ? a : add +!false ? a : false +!false ? a : s +!false ? add : ok +!false ? add : s +!false ? b : s +!false ? div : s +!false ? f : f +!false ? f : obj.head(obj) +!false ? false : b +!false ? nil : "a" +!false ? nil : f +!false ? nil : true +!false ? obj : nil +!false ? obj : obj +!false ? ok : obj +!false ? ok : ok +!false ? s : add +!false ? s : nil +!false ? s : obj?.head(a.head("a")) +!false ? true : arr +!false ? true : div +!false or obj.a +!false or obj?.fn(obj, div) +!false or ok +!fromJSON(string(false)) +!hasSuffix("a", s) +!none(arr, false) +!none(arr, ok) +!none(arr, true) +!not (a < 0) +!not (f != 1) +!not (f == 0) +!not (s != s) +!not (s contains s) +!not false +!not ok +!not true +!obj.head(2 == s) +!obj.head(add != nil) +!obj.head(arr != s) +!obj.head(false == add) +!obj.head(false) +!obj.head(ok) +!obj.head(ok, 1, obj) +!obj.head(ok, add) +!obj.head(ok, map("a", 2)) +!obj.head(ok, nil) +!obj.head(ok, s) +!obj.head(ok, s, obj, div, s) +!obj.head(true, 0, arr) +!obj.head(true, a) +!obj.head(true, b, nil, f) +!obj.head(true, s) +!obj?.head(any(s, true)) +!obj?.head(false) +!obj?.head(false, "b") +!obj?.head(false, div, 2, obj) +!obj?.head(false, true) +!obj?.head(ok) +!obj?.head(ok, arr) +!obj?.head(ok, div, ok) +!obj?.head(ok, false) +!obj?.head(ok, nil, "c") +!obj?.head(ok, ok) +!obj?.head(ok, s) +!obj?.head(ok, true, b) +!obj?.head(true) +!obj?.head(true, 0) +!ok +!ok != (ok or false) +!ok != ok +!ok && a == 1 +!ok && obj.b +!ok && ok +!ok == ok +!ok ? "a" : 0.5 +!ok ? "a" : div +!ok ? "b" : 0 +!ok ? "b" : obj.b +!ok ? "b" : ok +!ok ? "c" : 0.5 +!ok ? 0 : add +!ok ? 0.5 : 0 +!ok ? 0.5 : 0.5 +!ok ? 0.5 : div +!ok ? 1 : nil +!ok ? 2 : "b" +!ok ? a : arr +!ok ? a : b +!ok ? a : div +!ok ? a : s +!ok ? a : true +!ok ? add : 1 +!ok ? add : a +!ok ? add : add +!ok ? add : f +!ok ? add : false +!ok ? add : obj +!ok ? add : ok +!ok ? add : s +!ok ? arr : b +!ok ? arr == arr : div +!ok ? b : "a" +!ok ? b : "b" +!ok ? b : 1 +!ok ? b : a +!ok ? b : f +!ok ? div : a +!ok ? div : b +!ok ? div : obj +!ok ? div : s +!ok ? f : a +!ok ? f : div +!ok ? f : s +!ok ? false : 0 +!ok ? false : f +!ok ? nil : div +!ok ? obj : 1 +!ok ? obj : ok +!ok ? ok : a +!ok ? ok : arr +!ok ? ok : false +!ok ? ok : nil +!ok ? ok : ok +!ok ? s : 0.5 +!ok ? s : obj +!ok ? true : s +!ok and a <= b +!ok and arr == nil +!ok and obj.a +!ok and obj.a?.obj +!ok and obj?.a +!ok and obj[nil] +!ok and ok +!ok or nil != a +!ok or obj?.a +!ok or obj?.b +!ok or ok +!ok or ok || false +!ok || nil == s +!ok || obj.a +!ok || obj.fn(2) +!ok || ok +!one(arr, false) +!one(arr, ok) +!true != obj.a +!true && obj?.obj +!true && ok == nil +!true == obj.obj +!true == obj?.obj +!true == ok +!true ? "a" : a +!true ? "a" : ok +!true ? 0 : true +!true ? 0.5 : b +!true ? 1 : add +!true ? a : add +!true ? a : arr +!true ? add : ok +!true ? arr : 0.5 +!true ? div : ok +!true ? div : true +!true ? f : 0 +!true ? f : f +!true ? false : b +!true ? nil : "b" +!true ? nil : "c" +!true ? nil : div +!true ? nil : ok +!true ? obj : add +!true ? ok : add +!true ? ok : obj +!true ? s : "a" +!true ? s : false +!true ? true : a +!true ? true : f +!true and f != b +!true and nil != "a" +!true and obj.a +!true and ok +!true or obj?.head(1, nil, ok, div, arr) +!true || !true +"a" != nil or a <= 0 +"a" != obj.a +"a" != obj.b +"a" != obj.obj +"a" != obj.obj.b +"a" != obj?.a +"a" != obj?.b +"a" != obj?.fn(b) +"a" != obj?.head(add) +"a" != obj?.head(f == ok) +"a" != obj?.head(ok and nil) +"a" != obj?.obj +"a" < "a" ? obj.fn(true, 2, div, arr) : ok +"a" < "c" && obj.head(ok) +"a" < s || ok && false +"a" <= s && ok +"a" == "a" || ok +"a" == nil != ok +"a" == nil == obj?.head(obj, "c", b, 0, true) +"a" == obj.a +"a" == obj.b +"a" == obj.obj +"a" == obj?.a +"a" == obj?.b +"a" == obj?.head(-0.5) +"a" == obj?.head(filter("a", false)) +"a" == obj?.obj +"a" == s && ok +"a" == s == ok +"a" == s ? s : f +"a" > s or obj.fn(b) +"a" >= "a" && 0 == a +"a" >= "b" || obj?.head(div, 2, div) +"a" >= "b" || obj?.obj +"a" >= obj.head(string(s contains "b")) +"a" >= obj?.head(s) +"a" >= s ? s : string(s) +"a" contains "c" && any(arr, true) +"a" contains "c" == obj?.a +"a" contains s and obj?.obj +"a" contains s and ok +"a" endsWith s != ok +"a" endsWith s || obj?.head(div) +"a" in obj && obj.head(1) +"a" in obj.obj +"a" in obj?.obj +"a" matches "b" || obj?.b +"a" matches s and obj?.b +"b" != "b" == true ? b : nil +"b" != obj.a +"b" != obj.b +"b" != obj.head(f) +"b" != obj.obj +"b" != obj.obj.a +"b" != obj.obj?.a +"b" != obj?.a +"b" != obj?.b +"b" != obj?.fn(a) +"b" != obj?.obj +"b" != obj?.obj.obj +"b" != s or ok +"b" + "a" contains s + s +"b" + s == obj.a +"b" + s in obj ? div : f +"b" < "c" != ok +"b" < "c" && obj.head(div, b, b) +"b" < s and obj?.head(div, ok) +"b" <= "a" and ok +"b" <= "a" or obj?.a +"b" <= "b" and nil == ok +"b" <= obj.head(s) +"b" == obj.a +"b" == obj.b +"b" == obj.obj +"b" == obj.obj?.obj +"b" == obj?.a +"b" == obj?.b +"b" == obj?.head(div) +"b" == obj?.obj +"b" == obj[string(add)] +"b" == s != obj.b +"b" == s == obj.obj +"b" > "b" ? f : obj +"b" > "b" and !true +"b" > s && arr != arr +"b" contains "b" || obj.a +"b" endsWith "b" || add != obj.a +"b" in obj.obj +"b" in obj?.head(obj?.obj) +"b" in obj?.obj +"b" matches obj?.head(s) +"b" startsWith s ? a : s +"b" startsWith s or ok +"b" startsWith s || true && false +"c" != "a" || ok +"c" != "a" || ok ? add : add +"c" != "b" && a > a +"c" != "c" == ok +"c" != nil || false or ok +"c" != obj.a +"c" != obj.b +"c" != obj.fn(b) +"c" != obj.obj +"c" != obj.obj?.b +"c" != obj?.a +"c" != obj?.b +"c" != obj?.head(obj?.obj) +"c" != obj?.obj +"c" != obj?.obj.a +"c" != obj?.obj?.b +"c" != s != ok +"c" + s matches s +"c" < "b" != ok +"c" < s == obj.obj +"c" < s ? add : min(0.5) +"c" < s || obj?.fn(b) +"c" == obj.a +"c" == obj.b +"c" == obj.head(0 ^ b) +"c" == obj.obj +"c" == obj.obj?.b +"c" == obj?.a +"c" == obj?.b +"c" == obj?.obj +"c" == s and "c" < "b" +"c" == s || false != nil +"c" > "a" && obj.b +"c" > "c" and obj?.b +"c" > s ? obj : s +"c" >= "b" or obj.fn("c") +"c" >= s ? arr : obj.b +"c" contains "c" || 1 >= a +"c" contains s && obj?.obj.a +"c" endsWith s == obj?.obj +"c" endsWith s or s < s +"c" endsWith s || ok +"c" in obj or obj?.obj +"c" in obj || true ? b : div +"c" in obj.head(arr) +"c" in obj.obj +"c" in obj?.obj +"c" matches s && obj?.obj +"c" matches s ? div : add +"c" startsWith "c" && ok +"c" startsWith "c" ? s : ok +"c" startsWith s and nil != 1 +(0 % a) ^ (a * f) +(0 * 0) ^ f +(0 * 2) ^ obj?.head(1, "b", s, a, s) +(0 * f) ^ f +(0 + 0) ^ obj?.a +(0 + 0.5) ^ (a - b) +(0 + 1) ^ a ^ f +(0 + 2) ^ (a - f) +(0 + a) % a +(0 + a) ^ a +(0 + b) ** b +(0 + f) * f +(0 + f) / b +(0 + f) / obj.b +(0 + f) ^ f +(0 - 0) * f +(0 - 0) ^ (f * b) +(0 - a) * a +(0 - a) ^ a +(0 - b) / 0.5 ** f +(0 - b) / a +(0 - b) ^ f +(0 - f) * max(0) +(0 / 0) ^ f +(0 / 2) ^ obj?.b +(0.5 * 0) ** (0 * 2) +(0.5 * a) ** a +(0.5 * b) ^ obj.a +(0.5 * f) ** f +(0.5 + a) / f +(0.5 + b) ** b +(0.5 + b) ^ obj.b +(0.5 - f) / b +(0.5 / a) ^ a +(0.5 / f) ** max(0.5) +(0.5 / f) ^ obj?.a +(1 % a) ^ obj.head(2) +(1 * a) ^ a +(1 - 0) / f +(1 - 2) ** (a * a) +(1 - b) ^ min(0) +(1 - f) / a +(1 - f) ^ b +(1 / 0) ** obj?.a +(1 / 0) ^ f +(1 / 0.5 + f) * f +(1 / b) ^ f +(1 / f) ** a +(1 / f) ** b +(2 % a) ** f +(2 % a) ^ -b +(2 % b) ** b +(2 % b) ** f +(2 % b) ** obj?.head(f, add, ok, false) +(2 * a) ^ b +(2 + 0) ** a +(2 + 0.5) / min(f) +(2 + 2) ^ len(s) * f +(2 + f) * a ** 0 +(2 + f) ** b +(2 - 2) ** -0 +(2 - 2) ** b +(2 - 2) / f +(2 - a) ^ a +(2 - a) ^ add(0, a) +(2 - f) / obj.a +(2 / f) ** (a - f) +(2 / f) ^ f == b +(2 / f) ^ obj.a +(a % 2) ^ b +(a % a) ** obj.head(b, b) +(a * a) ** f +(a * a) ** obj.b +(a * f) ^ a +(a * f) ^ f ** a +(a + 0) % a +(a + 0) / obj.b +(a + a) % obj?.a +(a + a) / b +(a + b) % a +(a + b) % add(a, b) +(a - 0) / a +(a - 0) / b +(a - 0) ^ int(b) +(a - 0.5) / (0.5 + 0) +(a - 0.5) / obj.head(a) +(a - 0.5) / obj?.b +(a - 0.5) ^ b +(a - 1) ^ f +(a - 2) % a +(a - a) % b +(a - b) * b +(a - b) ** a ** 0 +(a - b) ^ f +(a - f) * b +(a - f) * f +(a - f) * obj.head(f) +(a - f) ^ a +(a / 1) ** f +(a / b) ^ f +(a / f) ** a +(a / f) ^ b +(a / f) ^ min(0) +(b % 2) ** b +(b % 2) ^ add(b, b) +(b % a) ^ b +(b * 0) ** a +(b * 0) ** f +(b * a) ** a +(b * b) ^ a ** 0 +(b * f) ^ float(a) +(b + 0) * div(b, b) +(b + 0) / b +(b + 0.5) ** f +(b + 2) % b +(b + 2) ** f +(b + a) ** f +(b + b) * a +(b + b) ^ b +(b + b) ^ obj?.b +(b + f) / b +(b + f) ^ a +(b - 0) * b +(b - 0) / b != f +(b - 1) * obj?.b +(b - 1) / a +(b - a) ** obj.a +(b - a) / a +(b - b) * b +(b - f) * f +(b - f) ** b +(b - f) ^ (a - 1) +(b / 0) ^ f +(b / 1) ** b +(b / a) ^ (b / 1) +(b / a) ^ obj?.obj.obj?.b +(b / b) ** f +(f * 0.5) ** obj?.a +(f * a) ** obj.fn(1) +(f * b) ** f +(f * b) ^ f +(f * f) ** a ** a +(f * f) ** b +(f * f) ** f +(f * f) ^ b +(f + 0) * b ^ b +(f + 0) ** f +(f + 0.5) ^ f +(f + a) * a +(f + a) ** f +(f + a) ** obj?.a +(f + b) * f +(f + b) ** add(2, b) +(f + b) ** obj.b +(f + f) * b +(f + f) ** arr[2] +(f + f) / b +(f + f) ^ (1 / 2) +(f + f) ^ arr[a] +(f + f) ^ b +(f + f) ^ f +(f - 0) ** obj?.fn(b) +(f - 0) / a +(f - 0) ^ (f / 0.5) +(f - 0) ^ a +(f - 0.5) * f +(f - 0.5) / f +(f - 0.5) ^ a +(f - 2) * a +(f - a) * -a +(f - a) ** b ^ f +(f - a) / add(a, b) +(f - b) ** b +(f / a) ^ f +(f / a) ^ obj.b +(f / b) ** b +(false or false) != obj?.b +(false or false) and s >= "b" +(false or true) != obj.head(add) +(false || true) == obj?.b +(min(f, f) / b) ** (b % obj?.b) +(ok ? true : 0) ? div : arr +(ok ? true : 0) ? obj?.b : (true ? false : true) +(ok and ok) != ok +(ok or false) and false ? 2 : div +(ok or ok) == obj?.a +(ok or ok) == ok +(ok or ok) and obj.obj?.a +(ok or true) and ok +(ok || ok) == ok +(ok || ok) and obj.obj +(ok || ok) and ok +(true and true) != obj.a +(true or ok) != ok +(true || false) and a == 0.5 +(true || ok) == obj.a +(true || true) != a + obj?.b +-((f - 1) ** len(s)) +-(0 % 1) +-(0 % 2) +-(0 % a) +-(0 % b) +-(0 * 0) +-(0 * b) +-(0 * f * obj?.b) +-(0 * f) +-(0 ** 0) +-(0 ** a) +-(0 ** b) +-(0 ** f) +-(0 + 0) +-(0 + 0.5) +-(0 + 1) +-(0 + 2) +-(0 + a) +-(0 + f) +-(0 - 0) +-(0 - 0.5) +-(0 - 1) +-(0 - 2) +-(0 - a) +-(0 - b) +-(0 - f) +-(0 / 0) +-(0 / 0.5) +-(0 / 2) +-(0 / a) +-(0 / b) +-(0 / f) +-(0 ^ 0) +-(0 ^ 0.5) +-(0 ^ 2) +-(0 ^ a) +-(0 ^ b) +-(0 ^ f) +-(0.5 * 0.5) +-(0.5 * 2) +-(0.5 * a) +-(0.5 * b) +-(0.5 * f) +-(0.5 ** 0) +-(0.5 ** 0.5) +-(0.5 ** a) +-(0.5 ** b) +-(0.5 ** f) +-(0.5 + 0) +-(0.5 + 1) +-(0.5 + 2) +-(0.5 + a) +-(0.5 + b) +-(0.5 + f) +-(0.5 - 0) +-(0.5 - 0.5) +-(0.5 - 1) +-(0.5 - 2) +-(0.5 - a) +-(0.5 - b) +-(0.5 - f) +-(0.5 / 0) +-(0.5 / 2) +-(0.5 / a) +-(0.5 / b) +-(0.5 / f) +-(0.5 ^ 0.5) +-(0.5 ^ 2) +-(0.5 ^ a) +-(0.5 ^ b) +-(1 % 2) +-(1 % a) +-(1 % b) +-(1 * 0) +-(1 * 1) +-(1 * a) +-(1 ** a) +-(1 ** f) +-(1 + 1) +-(1 + a) +-(1 + b) +-(1 - 0) +-(1 - 0.5) / a +-(1 - a) +-(1 - b) +-(1 - f) +-(1 / 0) +-(1 / 0.5) +-(1 / 2) +-(1 / f) +-(1 ^ 0.5) +-(1 ^ b) +-(1 ^ f) +-(2 % a) +-(2 % b) +-(2 * 0) +-(2 * 2) +-(2 * b) +-(2 * f) +-(2 ** b) +-(2 + 0.5) +-(2 + a) +-(2 + b) +-(2 + f) +-(2 - 0.5) +-(2 - 2) +-(2 - b) +-(2 / 0) +-(2 / 0.5) +-(2 / a) +-(2 ^ 1) +-(2 ^ 2) +-(2 ^ a) +-(a % 1) +-(a % 2) +-(a % a) +-(a % b) +-(a * 0) +-(a * 1) +-(a * 2) +-(a * a) +-(a * b) +-(a * f) +-(a ** 0) +-(a ** 0.5) +-(a ** a) +-(a ** b) +-(a ** f) +-(a + 0) +-(a + 1) +-(a + 2) +-(a + a) +-(a + b) +-(a + f) +-(a - 0) +-(a - 1) +-(a - 2) +-(a - a) +-(a - b) +-(a - f) +-(a / 0) +-(a / 0.5) +-(a / 1) +-(a / 2) +-(a / a) +-(a / b) +-(a ^ 0) +-(a ^ 0.5) +-(a ^ 2) +-(a ^ a) +-(a ^ b) +-(a ^ f) +-(b % 1) +-(b % a) +-(b % b) +-(b % obj.a) +-(b * 0) +-(b * 0.5) +-(b * 1) +-(b * 2) +-(b * a) +-(b * b) +-(b * f) +-(b ** 0) +-(b ** 0.5) +-(b ** 1) +-(b ** a) +-(b ** b) +-(b ** f) +-(b + 0) +-(b + 1) +-(b + 2) +-(b + a) +-(b + b) +-(b + f) +-(b - 0.5) +-(b - 1) +-(b - 2) +-(b - 2) - b +-(b - a) +-(b - b) +-(b - f) +-(b / 0) +-(b / 0.5) +-(b / 1) +-(b / 2) +-(b / a) +-(b / b) +-(b / f) +-(b ^ 0) +-(b ^ 0.5) +-(b ^ 1) +-(b ^ 2) +-(b ^ a) +-(b ^ b) +-(b ^ f) +-(f * 0) +-(f * 0.5) +-(f * 1) +-(f * 2) +-(f * a) +-(f * b) +-(f * f) +-(f * int(a)) +-(f ** 0) +-(f ** 0.5) +-(f ** 1) +-(f ** a) +-(f ** b) +-(f ** f) +-(f + 2) +-(f + a) +-(f + b) +-(f + f) +-(f + f) - b +-(f - 0) +-(f - 1) +-(f - 2) +-(f - a) +-(f - b) +-(f - f) +-(f - obj.a) +-(f / 0) +-(f / 0.5) +-(f / a) +-(f / b) +-(f / f) +-(f ^ 0) +-(f ^ 0.5) +-(f ^ 1) +-(f ^ 2) +-(f ^ a) +-(f ^ b) +-(f ^ f) +-(obj.fn(b) + b) +-(obj.head(1) - a) +-(obj.head(b, 2, f, nil) / obj.a) +--(a % b) +--(f ** a) +--0 +--0.5 +--1 +--2 +--a +--abs(b) +--b +--f +--int(0.5) +--obj.a +--obj.b +--obj.b % b +-0 != a ? ok : 0 +-0 != b +-0 != f +-0 != obj.b +-0 % a +-0 * obj.fn(2) +-0 ** a +-0 ** b +-0 - a +-0 - abs(2) +-0 - div(a, a) +-0 - obj.a +-0 - obj.b +-0 .. 1 * a +-0 .. obj.b +-0 / b +-0 / obj.a +-0 / obj.head(1, a) +-0 / obj?.a +-0 < a +-0 < b +-0 < f +-0 <= a +-0 <= f +-0 == a +-0 == b / 0 +-0 == nil ? b : obj +-0 > b * f +-0 > f +-0 >= -0 +-0 >= a +-0 >= obj?.b +-0 ^ -0 +-0 ^ a +-0 ^ b +-0 ^ f +-0 in arr +-0.5 != 0.5 ? s : b +-0.5 != a +-0.5 != nil ? false : nil +-0.5 * obj?.b +-0.5 + b +-0.5 - add(0, a) +-0.5 - f +-0.5 / a +-0.5 / obj?.fn(a) +-0.5 < f +-0.5 <= f ? f : add +-0.5 == 0 % b +-0.5 >= 0 == ok +-0.5 >= obj.b +-0.5 ^ (a / b) +-1 % a +-1 * -b +-1 ** b +-1 ** obj.b +-1 + b +-1 - b +-1 - f +-1 .. obj?.a +-1 / b +-1 > 2 != nil +-1 > a +-1 > b +-1 > obj?.b +-1 >= f ? arr : div +-1 ^ (f / a) +-1 ^ b +-1 ^ obj.head(a) +-2 != b +-2 != f +-2 * f +-2 ** f +-2 ** min(0, f) +-2 - 0.5 ^ 0 +-2 .. -b +-2 .. a +-2 < abs(1) +-2 < f ** a +-2 < obj.b +-2 == obj?.b +-2 ^ a +-2 ^ b +-2 ^ f +-a +-a != f +-a != obj.fn(a) +-a != obj.obj?.a +-a % int(a) +-a * b +-a * obj.a +-a ** a +-a ** f +-a ** float(2) +-a ** max(a) +-a + b +-a + obj.b +-a - f +-a .. a +-a .. obj.a +-a / f +-a / max(0.5) +-a < f +-a < obj?.a +-a <= a ** b +-a == 0 + b +-a == a +-a > add(a, a) +-a > b +-a > get(arr, 1) +-a > obj.b +-a >= a - 0 +-a >= obj?.b +-a ^ a +-a ^ f +-abs(0) +-abs(0.5) +-abs(1) +-abs(2 / f) +-abs(2) +-abs(a) +-abs(b) +-abs(f) +-add(0, 0) +-add(0, 2) +-add(0, a) +-add(0, b) +-add(1, 0) +-add(1, 1) +-add(1, 2) +-add(1, a) +-add(1, b) +-add(2, 0) +-add(a, 0) +-add(a, 2) +-add(a, a) +-add(a, b) +-add(b, 0) +-add(b, 1) +-add(b, 2) +-add(b, a) +-add(b, b) +-add(b, ok ? a : "b") +-arr[0] +-arr[1] +-arr[2] +-arr[a] +-arr[b] +-b +-b != a +-b != b +-b != f +-b != obj.a +-b % b +-b % b % obj.b +-b % obj.b +-b % obj.fn(a) +-b * a +-b * b +-b ** a +-b + a +-b + obj?.b +-b - a +-b - b +-b - f +-b - obj.a +-b .. b +-b / a ^ 0.5 +-b / b +-b / obj?.a +-b < 2 / 0 +-b < b +-b < f +-b <= f +-b <= obj?.a +-b <= obj?.b +-b == int(0) +-b == len("b") +-b == max(0) +-b > a +-b > a * 0.5 +-b > b +-b > b ? b : 1 +-b > div(2, b) +-b > obj.b +-b >= a +-b >= b +-b >= f +-b >= f ? b : true +-b >= obj.head(a) +-b ^ (b - 0.5) +-b ^ a +-count(arr, false) +-count(arr, ok) +-count(arr, true) +-div(0, 2) +-div(0, a) +-div(0, b) +-div(1, 1) +-div(1, 2) +-div(1, b) +-div(2, 1) +-div(2, 1) / a +-div(2, a) +-div(2, b) +-div(a, 1) +-div(a, 2) +-div(a, a) +-div(a, b) +-div(a, obj.a) +-div(b, 1) +-div(b, a) +-div(b, b) +-f +-f != a +-f != f +-f != f != true +-f != len(s) +-f != obj.b +-f != obj.fn(b) +-f * a +-f * b ^ a +-f ** -a +-f ** b +-f + a +-f + b +-f + f +-f + int(b) +-f + obj.a +-f - a * 1 +-f - arr[b] +-f - b +-f - f +-f / add(a, b) +-f / b +-f / f +-f / f ^ b +-f < a +-f < f ? ok : b +-f < f ^ b +-f < obj.a +-f <= a +-f <= f +-f == add(0, b) +-f == f +-f == obj.obj +-f == obj?.obj +-f > a +-f > f / a +-f > len(s) +-f > obj.a +-f >= 0 / b +-f >= a +-f >= a * a +-f >= b +-f >= obj.a +-f ^ a +-f ^ a ** f +-f ^ f +-first(arr) +-first(arr) < f +-first(arr) ^ a +-float(0) +-float(0.5) +-float(2) +-float(a) +-float(b) +-float(f) +-get(arr, 0) +-get(arr, 1) +-get(arr, 2) +-get(arr, a) +-get(arr, b) +-indexOf(s, "c") +-indexOf(s, s) +-int(0) +-int(0.5) +-int(1) +-int(2) +-int(a) +-int(b) +-int(f) +-int(obj?.a) +-last(arr) +-len("b") +-len(arr) +-len(map(arr, obj)) +-len(obj) +-len(s) +-max(0) +-max(0.5) +-max(0.5, f) +-max(1) +-max(1, 2) +-max(1, a) +-max(2) +-max(a) +-max(a, f) +-max(b) +-max(b, 0, f) +-max(f) +-max(f, b) +-min(0) +-min(0, b) +-min(0.5, b) +-min(1) +-min(2) +-min(a) +-min(a, b) +-min(b) +-min(b, 1) +-min(f) +-min(f, 0) +-obj.a +-obj.a > f +-obj.a ^ b +-obj.b +-obj.fn(0) +-obj.fn(1) +-obj.fn(2) +-obj.fn(a - b) +-obj.fn(a) +-obj.fn(b) +-obj.fn(count("c", true)) +-obj.head(0) +-obj.head(0, arr) +-obj.head(0, obj) +-obj.head(0, s) +-obj.head(0.5) +-obj.head(0.5, add) +-obj.head(0.5, b, add) +-obj.head(0.5, div, ok) +-obj.head(0.5, f) +-obj.head(0.5, true) +-obj.head(1) +-obj.head(1, "a", nil) +-obj.head(1, f) +-obj.head(1, ok, arr) +-obj.head(2) +-obj.head(2, 1, b) +-obj.head(2, arr) +-obj.head(2, ok, 2) +-obj.head(a) +-obj.head(a, div, "a", b) +-obj.head(a, f, add, "a") +-obj.head(a, nil) +-obj.head(a, true, obj) +-obj.head(b) +-obj.head(b, "b", s, ok) +-obj.head(b, add) +-obj.head(b, b, ok, obj) +-obj.head(b, f) +-obj.head(b, nil, add, ok) +-obj.head(b, nil, f) +-obj.head(b, nil, true) +-obj.head(f) +-obj.head(f, 0, add) +-obj.head(f, b) +-obj.head(f, ok) +-obj.head(first("a")) +-obj.head(obj, 0.5)?.b +-obj.obj.a +-obj.obj.b +-obj.obj.obj?.a +-obj.obj.obj?.b +-obj.obj?.a +-obj.obj?.b +-obj.obj?.obj?.obj +-obj?.a +-obj?.a != a +-obj?.a > b +-obj?.b +-obj?.fn(0) +-obj?.fn(1) +-obj?.fn(2) +-obj?.fn(a) +-obj?.fn(b) +-obj?.head(0) +-obj?.head(0, 0.5, s) +-obj?.head(0, 2) +-obj?.head(0, add) +-obj?.head(0, b) +-obj?.head(0, nil) +-obj?.head(0, nil, obj, obj, 2) +-obj?.head(0, obj, ok, nil) +-obj?.head(0, s) +-obj?.head(0.5) +-obj?.head(0.5, a) +-obj?.head(0.5, add) +-obj?.head(0.5, f, arr) +-obj?.head(0.5, obj) +-obj?.head(1) +-obj?.head(2) +-obj?.head(a) +-obj?.head(a, "c", "a") +-obj?.head(a, 0, f, b, a) +-obj?.head(a, 1, a) +-obj?.head(a, a) +-obj?.head(a, obj, obj) +-obj?.head(a, ok, b) +-obj?.head(a, s) +-obj?.head(b) +-obj?.head(b, 0) +-obj?.head(b, 0, obj) +-obj?.head(b, 0.5, arr) +-obj?.head(b, 1) +-obj?.head(b, false, add) +-obj?.head(b, nil) +-obj?.head(b, ok) +-obj?.head(f) +-obj?.head(f, add, ok) +-obj?.head(f, obj) +-obj?.head(f, obj, 0) +-obj?.head(f, ok) +-obj?.head(f, true, nil) +-obj?.head(min(nil, 2, a), a) +-obj?.obj.a +-obj?.obj.b +-obj?.obj?.a +-obj?.obj?.b +-obj?.obj?.obj.b +-obj?.obj?.obj?.obj +0 != 0.5 == obj?.head(a) +0 != 0.5 ? s <= s : obj?.head(false) +0 != 2 && s != "c" +0 != a || a != f +0 != arr[b] +0 != arr[obj.a] +0 != b and f != 0 +0 != b and obj.head(b, "b", div) +0 != b || obj.b +0 != b || obj.obj +0 != f or 0.5 == 1 +0 != nil and obj?.b +0 != obj.a +0 != obj.a % a +0 != obj.b +0 != obj.head(arr) +0 != obj.head(obj) +0 != obj.obj +0 != obj.obj?.a +0 != obj.obj?.obj +0 != obj.obj?.obj?.b +0 != obj?.a +0 != obj?.b +0 != obj?.b ^ b +0 != obj?.head(b) +0 != obj?.head(ok, a) +0 != obj?.obj +0 != obj?.obj.a +0 % 1 - obj.b +0 % 1 < b ^ 0 +0 % 1 == f +0 % 1 >= obj.a +0 % a - b +0 % a < a +0 % a <= a * f +0 % arr[b] +0 % b != f +0 % b % div(b, b) +0 % b * a +0 % b * f +0 % b + add(a, a) +0 % b + b +0 % b + obj?.a +0 % b / b / 0.5 +0 % b == obj.head(s, 0) +0 % b >= a +0 % obj.a +0 % obj.b +0 % obj?.a +0 % obj?.b +0 % obj?.fn(b) +0 % obj?.head(b) +0 % obj?.obj.b +0 * 0 / b +0 * 0 < f +0 * 0 <= a +0 * 0 <= obj.a +0 * 0 == a +0 * 0 >= a +0 * 0.5 + a +0 * 0.5 / b +0 * 0.5 < b +0 * 0.5 <= int(a) +0 * 0.5 >= max(0) +0 * 1 < 0 - a +0 * 1 == a +0 * 1 > f +0 * a + obj?.b +0 * a / f +0 * a == f ** 0 +0 * a == obj[s] +0 * a > f +0 * a in arr +0 * arr[0 - 0] +0 * arr[b] +0 * b != f +0 * b * f +0 * b + f +0 * b + obj?.a +0 * b < obj.b +0 * b == b +0 * f != a +0 * f != a % 1 +0 * f != f +0 * f * b +0 * f + b +0 * f - b +0 * f < obj?.b +0 * f < obj?.head(f, obj) +0 * f <= b + 0 +0 * f <= obj.a +0 * f >= b ^ 2 +0 * obj.a +0 * obj.b +0 * obj.head(b + f) +0 * obj?.a +0 * obj?.b +0 * obj?.fn(abs(obj.b)) +0 ** 0 - f +0 ** 0 <= f != ok +0 ** 0 ^ a +0 ** 0.5 + a +0 ** 0.5 - b +0 ** 0.5 <= a +0 ** 0.5 <= f +0 ** 0.5 <= obj.fn(a) +0 ** 0.5 ^ (b - 0) +0 ** 1 * add(0, a) +0 ** 1 > b +0 ** 2 * f +0 ** 2 * obj?.b +0 ** 2 <= a ? true : div +0 ** 2 > b +0 ** a * -2 +0 ** a == b +0 ** a ^ (0 % 2) +0 ** b != f +0 ** b - b ^ 2 +0 ** b > f ? s : add +0 ** f * obj?.b +0 ** f + b +0 ** f > f +0 ** f >= f +0 ** obj.a +0 ** obj.b +0 ** obj?.a +0 ** obj?.b +0 ** obj?.head(b) +0 + 0 == obj?.a +0 + 0.5 == obj?.head(nil, true, b, arr) +0 + 2 < f +0 + a != f +0 + a + b +0 + a .. a +0 + a .. get(arr, 0) +0 + a > b +0 + b + a +0 + b < a +0 + b == f * f +0 + f - b +0 + f < obj.a +0 + f < obj.b +0 + f > b +0 + f >= a +0 + obj.a +0 + obj.a != div +0 + obj.b +0 + obj.b == s +0 + obj.obj?.b +0 + obj?.a +0 + obj?.b +0 - 0 .. obj?.a +0 - 0 in arr +0 - 0.5 != obj.b +0 - 0.5 >= obj.a +0 - 1 + a +0 - 1 + b +0 - 1 > obj.head(f, a) +0 - a - a +0 - a .. a +0 - a < a +0 - a <= a +0 - a > a +0 - a >= a +0 - b .. obj?.b +0 - b < 0 / 2 +0 - b < a +0 - b < obj.a +0 - b <= a +0 - b >= b +0 - b in arr +0 - f != 0.5 == false +0 - f + div(b, a) +0 - f < a +0 - f <= b +0 - obj.a +0 - obj.b +0 - obj.obj.b +0 - obj?.a +0 - obj?.b +0 .. b != arr +0 .. obj.a +0 .. obj.b +0 .. obj.fn(a) +0 .. obj.obj.a +0 .. obj?.a +0 .. obj?.b +0 .. obj?.obj.a +0 / 0 - f +0 / 0 > f ? arr : b +0 / 0.5 - a +0 / 1 / abs(0) +0 / 1 > b +0 / 2 <= b +0 / a != f / f +0 / arr[a] +0 / arr[b] +0 / b != f + 2 +0 / b * obj.b +0 / b / a +0 / b == obj?.a +0 / b >= f +0 / f / f +0 / f == b +0 / obj.a +0 / obj.b +0 / obj.head(min(a), arr in arr) +0 / obj?.a +0 / obj?.b +0 / obj?.fn(true and 2) +0 / obj?.obj?.a +0 < 0 && obj?.obj +0 < 0 and obj?.fn(s, arr).b +0 < 0.5 == ok +0 < 1 || !ok +0 < a && "c" in obj +0 < arr[a] +0 < b != obj?.b +0 < b && 2 <= b +0 < f && ok +0 < f && true ? nil : 1 +0 < f or a in arr +0 < obj.a +0 < obj.b +0 < obj.obj?.a +0 < obj?.a +0 < obj?.b +0 <= 0 and obj.a +0 <= 0 or obj?.b +0 <= 0.5 != obj?.obj +0 <= 0.5 and one(arr, true) +0 <= 1 and 0 >= f +0 <= a == none(arr, false) +0 <= a || ok ? f : obj +0 <= b ? a <= a : f +0 <= obj.a +0 <= obj.b +0 <= obj?.a +0 <= obj?.b +0 <= obj?.obj.b +0 <= obj?.obj?.b +0 == 0 and div == nil +0 == 2 or ok +0 == a != ok +0 == b or ok +0 == b || ok +0 == f == !true +0 == f and obj?.a +0 == nil or one(arr, true) +0 == nil || obj.b +0 == obj.a +0 == obj.b +0 == obj.obj +0 == obj.obj.a +0 == obj?.a +0 == obj?.b +0 == obj?.head(!(obj != div)) +0 == obj?.head(arr) +0 == obj?.head(obj) +0 == obj?.obj +0 == obj?.obj.b +0 == obj[toJSON(nil)] +0 > 0 != nil == ok +0 > 0.5 ? add : ok +0 > 1 ? s : s +0 > 2 && ok +0 > a || 0 != 2 +0 > b != obj.a +0 > b && "b" == s +0 > b == ok +0 > b or 0 == nil +0 > f && 0 != b +0 > f && obj.head(s) +0 > obj.a +0 > obj.b +0 > obj.fn(obj?.b) +0 > obj?.a +0 > obj?.b +0 > obj?.fn(a) +0 > obj?.head(b) +0 > obj?.obj.a +0 >= 0.5 and ok ? arr : s +0 >= 2 && obj?.a +0 >= b != ok ? b : nil +0 >= b && obj?.fn(true) +0 >= b == obj?.head(b, s) +0 >= b and b in obj?.obj +0 >= f && obj.head(obj) +0 >= f or ok +0 >= obj.a +0 >= obj.b +0 >= obj.head(obj?.fn(b)) +0 >= obj?.a +0 >= obj?.b +0 >= obj?.obj.b +0 >= obj?.obj?.a +0 ^ 0 / f +0 ^ 0 == f +0 ^ 0.5 ** obj?.a +0 ^ 0.5 - b +0 ^ 0.5 <= f +0 ^ 1 * a +0 ^ 2 < a / b +0 ^ 2 < f +0 ^ 2 ^ f +0 ^ a != a / a +0 ^ a + b +0 ^ a - obj.a +0 ^ a - obj?.b +0 ^ a < a +0 ^ a <= b +0 ^ b != b +0 ^ b - -b +0 ^ b / b +0 ^ b >= b +0 ^ b ^ f +0 ^ f < obj.b +0 ^ f <= obj?.a +0 ^ f > f +0 ^ obj.a +0 ^ obj.b +0 ^ obj.obj.b +0 ^ obj.obj?.a +0 ^ obj?.a +0 ^ obj?.b +0 in arr or s != nil +0 in arr || ok +0.5 != 0 == ok +0.5 != 0 and ok +0.5 != 0 || obj?.a +0.5 != 0.5 == true ? a : arr +0.5 != 0.5 || nil != s +0.5 != 1 && s <= "b" +0.5 != a || obj?.obj +0.5 != b and false ? nil : add +0.5 != b or ok +0.5 != f and ok +0.5 != nil && s >= s +0.5 != obj.a +0.5 != obj.b +0.5 != obj.obj +0.5 != obj.obj.obj +0.5 != obj?.a +0.5 != obj?.b +0.5 != obj?.head(arr, obj) +0.5 != obj?.obj +0.5 != obj?.obj.b +0.5 * 0 >= obj.head(a) +0.5 * 0.5 * f +0.5 * 0.5 / add(b, 0) +0.5 * 0.5 < f ? obj : obj +0.5 * 1 < f +0.5 * a < f +0.5 * a == f +0.5 * a >= 0.5 ? "b" : b +0.5 * arr[a] +0.5 * b <= f +0.5 * f < div(b, b) +0.5 * f > div(a, b) +0.5 * f > f +0.5 * obj.a +0.5 * obj.b +0.5 * obj.fn(b) +0.5 * obj.obj?.a +0.5 * obj?.a +0.5 * obj?.b +0.5 * obj?.head(obj.a) +0.5 * obj?.obj?.b +0.5 ** 0 / a +0.5 ** 0 <= b +0.5 ** 0 ^ a +0.5 ** 0.5 > f +0.5 ** 0.5 >= f +0.5 ** 1 != b +0.5 ** 1 > b +0.5 ** a + b +0.5 ** a > b +0.5 ** a > b ** 0 +0.5 ** a >= b +0.5 ** a ^ obj?.b +0.5 ** arr[b] +0.5 ** arr[obj.a] +0.5 ** b < a + b +0.5 ** b > a +0.5 ** b ^ obj?.a +0.5 ** f * f +0.5 ** f ** (a - 0) +0.5 ** f <= -a +0.5 ** f <= a +0.5 ** f >= b +0.5 ** obj.a +0.5 ** obj.b +0.5 ** obj.obj?.a +0.5 ** obj?.a +0.5 ** obj?.b +0.5 ** obj?.obj?.b +0.5 + 0 >= b ? f : s +0.5 + 2 + a +0.5 + 2 + b ^ a +0.5 + a - -0 +0.5 + a - f +0.5 + f != obj?.b +0.5 + f == b / f +0.5 + obj.a +0.5 + obj.b +0.5 + obj?.a +0.5 + obj?.b +0.5 - 0.5 > 0.5 - b +0.5 - 1 + b +0.5 - a != f + b +0.5 - f != obj.head(s) +0.5 - f - div(b, a) +0.5 - f < f * a +0.5 - f == obj.a +0.5 - obj.a +0.5 - obj.b +0.5 - obj.head(f) +0.5 - obj.head(min(0, b)) +0.5 - obj.obj.a +0.5 - obj?.a +0.5 - obj?.a * b > obj?.a +0.5 - obj?.b +0.5 - obj?.obj.a +0.5 - obj?.obj.b +0.5 - obj?.obj?.b +0.5 / 0 * b +0.5 / 0.5 * div(0, b) +0.5 / 0.5 - b +0.5 / 1 < b +0.5 / 1 == obj.a +0.5 / a * a +0.5 / a <= b ? f : div +0.5 / a > obj.head(b, s) +0.5 / arr[a % 1] +0.5 / b != f +0.5 / b / f +0.5 / b == get(arr, b) +0.5 / b > a +0.5 / b >= a +0.5 / obj.a +0.5 / obj.b +0.5 / obj.obj.a +0.5 / obj?.a +0.5 / obj?.b +0.5 / obj?.obj.a +0.5 / obj?.obj.b +0.5 < 0 && true ? ok : obj +0.5 < 0 or obj?.b +0.5 < 0 or obj?.obj +0.5 < 0 || obj?.obj +0.5 < 0 || ok +0.5 < 0.5 && !false +0.5 < 0.5 ? b - a : s +0.5 < 0.5 in obj.head(arr, ok) +0.5 < f != ok +0.5 < obj.a +0.5 < obj.b +0.5 < obj.fn(a) +0.5 < obj?.a +0.5 < obj?.b +0.5 <= 0 || arr != arr +0.5 <= a != ok +0.5 <= arr[b] +0.5 <= b || obj.fn(true).a.obj +0.5 <= f && ok +0.5 <= f == obj.b +0.5 <= obj.a +0.5 <= obj.b +0.5 <= obj?.a +0.5 <= obj?.b +0.5 <= obj?.b * b +0.5 == 1 and obj.head(obj, f, true) +0.5 == 2 || 0.5 < 0 +0.5 == a && obj?.b +0.5 == b && ok +0.5 == f != obj.a +0.5 == f ? 0.5 ** 0 : div +0.5 == f ? ok : obj +0.5 == f or ok +0.5 == nil != obj.obj +0.5 == nil == obj.fn(b) +0.5 == nil == obj.obj +0.5 == obj.a +0.5 == obj.a + b +0.5 == obj.b +0.5 == obj.fn(a) +0.5 == obj.fn(b) +0.5 == obj.head(s == add, arr) +0.5 == obj.obj +0.5 == obj?.a +0.5 == obj?.b +0.5 == obj?.fn(a) +0.5 == obj?.obj +0.5 > 0 == obj?.b +0.5 > 0 ? b : b +0.5 > 0.5 ? a ** 1 : add +0.5 > 0.5 and obj?.a +0.5 > 1 == true ? add : nil +0.5 > a != not false +0.5 > a == ok +0.5 > b ? a : obj +0.5 > f ? (false ? arr : ok) : obj.head(0.5, s, arr) +0.5 > f and div == add +0.5 > obj.a +0.5 > obj.b +0.5 > obj.head(a ** a) +0.5 > obj.head(f) +0.5 > obj?.a +0.5 > obj?.b +0.5 > obj?.head(obj.head(obj?.b)) +0.5 > obj?.obj?.b +0.5 >= 0.5 && obj.head(add, 0, arr, 0.5, s) +0.5 >= a and ok +0.5 >= b == true ? nil : div +0.5 >= b ? div : string(0.5) +0.5 >= obj.a +0.5 >= obj.b +0.5 >= obj.obj?.a +0.5 >= obj.obj?.b +0.5 >= obj?.a +0.5 >= obj?.b +0.5 ^ 0 - 0 * 1 +0.5 ^ 0 - a +0.5 ^ 0 <= a * a +0.5 ^ 0 > f +0.5 ^ 0.5 + a +0.5 ^ 0.5 ^ f +0.5 ^ 1 >= a +0.5 ^ 2 == f +0.5 ^ a + obj?.b +0.5 ^ a ^ (b * 0) +0.5 ^ arr[a] +0.5 ^ b > a +0.5 ^ b > f +0.5 ^ b >= obj.a +0.5 ^ f * b +0.5 ^ f > add(2, b) +0.5 ^ f > f +0.5 ^ f >= f +0.5 ^ obj.a +0.5 ^ obj.b +0.5 ^ obj?.a +0.5 ^ obj?.b +0.5 ^ obj?.obj?.b +1 != 0 != obj.a +1 != 0 or obj?.head(false, div, div) +1 != 0.5 || b < a +1 != b != ok +1 != f == ok +1 != obj.a +1 != obj.b +1 != obj.fn(b) +1 != obj.obj +1 != obj?.a +1 != obj?.b +1 != obj?.obj +1 != obj?.obj?.b +1 % 1 .. 2 - a +1 % 1 > f +1 % a * add(1, b) +1 % a - b +1 % a / f +1 % a > b + f +1 % b / b +1 % b == b +1 % b >= b +1 % obj.a +1 % obj.b +1 % obj?.a +1 % obj?.b +1 % obj?.obj.b +1 * 0 .. obj?.head(b) +1 * 2 == f +1 * b != 0 ^ a +1 * b < a +1 * f < a / b +1 * f > b +1 * obj.a +1 * obj.b +1 * obj.obj.b +1 * obj?.a +1 * obj?.b +1 ** 0 != obj.obj +1 ** 0 ** float(2) +1 ** 0 ^ a +1 ** 0 ^ b +1 ** 0.5 / obj?.a +1 ** 2 ** count(arr, false) +1 ** 2 < b +1 ** a >= b +1 ** b != b +1 ** b + f +1 ** b <= -b +1 ** b >= 1 ** f +1 ** obj.a +1 ** obj.b +1 ** obj.fn(b) +1 ** obj?.a +1 ** obj?.b +1 + 0 == len(arr) +1 + 0 == obj?.fn(b) +1 + a > 0 != false +1 + a > f +1 + b - a +1 + f != a +1 + f >= 0 == false +1 + f >= add(b, 0) +1 + obj.a +1 + obj.b +1 + obj?.a +1 + obj?.b +1 - 0 .. abs(1) +1 - 1 != a +1 - 1 < a +1 - 2 <= f +1 - a != b ? arr : f +1 - a > f +1 - b != f +1 - b > f +1 - b >= add(b, 2) +1 - b in arr ? s : b +1 - obj.a +1 - obj.b +1 - obj.fn(2 - b) +1 - obj?.a +1 - obj?.b +1 - obj?.obj.a +1 .. 0 == obj.a +1 .. obj.a +1 .. obj.b +1 .. obj.obj.b +1 .. obj?.a +1 .. obj?.b +1 / 0 < f +1 / 0 in obj?.head(arr) +1 / 2 * f +1 / a < f +1 / a <= abs(a) +1 / f * b +1 / f == b +1 / obj.a +1 / obj.b +1 / obj.obj.a +1 / obj?.a +1 / obj?.b +1 < a && obj?.head(ok).b +1 < a ? a : a +1 < a ? ok : b +1 < a || nil != obj +1 < b == obj.obj +1 < obj.a +1 < obj.b +1 < obj.head(obj?.b) +1 < obj?.a +1 < obj?.b +1 < obj?.fn(b) +1 <= 0 ? ok : add +1 <= 1 or obj.head(a) +1 <= 2 != true == ok +1 <= a == obj?.b +1 <= a or obj.a +1 <= f != obj?.a +1 <= f == all(arr, ok) +1 <= f == obj?.head(nil) +1 <= obj.a +1 <= obj.b +1 <= obj?.a +1 <= obj?.b +1 <= obj?.head(a) +1 <= obj?.head(b) +1 <= obj?.obj.obj.a +1 == a or obj.head(any(ok and ok, #), div.fn(b, arr, 0, a).a) +1 == b || obj?.a +1 == nil != true ? ok : f +1 == obj.a +1 == obj.b +1 == obj.head(first(true, "b", add)) +1 == obj.obj +1 == obj?.a +1 == obj?.b +1 == obj?.obj +1 > 0.5 and obj?.obj +1 > 0.5 || 0 == f +1 > f and ok +1 > obj.a +1 > obj.b +1 > obj?.a +1 > obj?.b +1 > obj?.obj?.b +1 >= 0 || one(arr, ok) +1 >= 2 ? arr : a +1 >= f == not false +1 >= f || obj?.obj +1 >= obj.a +1 >= obj.b +1 >= obj.fn(b) +1 >= obj?.a +1 >= obj?.b +1 >= obj?.fn(b) +1 ^ 0 != a +1 ^ 1 != f +1 ^ 1 != obj?.obj +1 ^ b ^ f +1 ^ f - a +1 ^ obj.a +1 ^ obj.b +1 ^ obj.head(b) +1 ^ obj.obj.b +1 ^ obj?.a +1 ^ obj?.b +2 != 0 != obj?.b +2 != 0 != ok +2 != b != ok +2 != b && b != f +2 != b or obj?.b +2 != nil != ok +2 != nil == ok ? nil : div +2 != obj.a +2 != obj.b +2 != obj.head(add) +2 != obj.obj +2 != obj.obj?.a +2 != obj?.a +2 != obj?.b +2 != obj?.fn(b) +2 != obj?.obj +2 % 2 == a +2 % a % a +2 % a .. a +2 % a .. obj.b +2 % a > 0.5 ? b : obj +2 % b + arr[a] +2 % b > b +2 % obj.a +2 % obj.b +2 % obj?.a +2 % obj?.b +2 * 0 * b +2 * 0 <= f +2 * 0.5 - a - b +2 * 0.5 < b +2 * 0.5 >= f +2 * a >= b +2 * arr[b] +2 * f != b +2 * obj.a +2 * obj.b +2 * obj?.a +2 * obj?.b +2 ** 0 != 0 - f +2 ** 0 / a +2 ** 0 > a +2 ** 0 > f +2 ** 0.5 ** f +2 ** 0.5 > a +2 ** 2 * obj.b +2 ** a * f +2 ** a >= f +2 ** b / a +2 ** b ^ a +2 ** obj.a +2 ** obj.b +2 ** obj?.a +2 ** obj?.b +2 ** obj?.obj.a +2 + 0 > b +2 + 0.5 <= f - f +2 + 2 + obj.b +2 + arr[b] +2 + b >= 0 ? arr : true +2 + f != obj?.b +2 + f + add(a, b) +2 + obj.a +2 + obj.a > f +2 + obj.b +2 + obj?.a +2 + obj?.b +2 + obj?.obj?.a +2 - 0 > a ? div : 0 +2 - a == f - f +2 - a in arr +2 - b + len("c") +2 - f < obj?.a +2 - f == a +2 - obj.a +2 - obj.b +2 - obj?.a +2 - obj?.b +2 - obj?.obj?.a +2 .. obj.a +2 .. obj.b +2 .. obj.obj?.a +2 .. obj?.a +2 .. obj?.b +2 .. obj?.obj.a +2 / 0.5 - a +2 / 0.5 >= obj.a +2 / 1 > a +2 / 2 * a +2 / a >= obj.head(0.5) +2 / b * obj.b +2 / b > a ? arr : f +2 / f - obj?.b +2 / obj.a +2 / obj.b +2 / obj?.a +2 / obj?.b +2 / obj?.fn(a) +2 < a and obj.obj +2 < arr[b] +2 < b ? fromBase64(s) : ok +2 < f and obj?.head(f, true, false) +2 < f || none(arr, ok) +2 < obj.a +2 < obj.b +2 < obj?.a +2 < obj?.b +2 < obj?.obj.a +2 <= a == obj.b +2 <= a ? ok : s +2 <= a and one(arr, ok) +2 <= obj.a +2 <= obj.b +2 <= obj?.a +2 <= obj?.b +2 <= obj?.fn(a) +2 <= obj?.fn(b) +2 == 0 || b > f +2 == arr[b - a] +2 == f && a in arr +2 == f and nil != f +2 == nil == obj?.a +2 == obj.a +2 == obj.b +2 == obj.obj +2 == obj.obj.a +2 == obj?.a +2 == obj?.b +2 == obj?.fn(a) +2 == obj?.obj +2 == obj?.obj?.a +2 == obj?.obj?.b +2 > 1 and obj.b +2 > a || obj.b +2 > obj.a +2 > obj.b +2 > obj?.a +2 > obj?.b +2 > obj?.obj.a +2 >= 1 or f <= a +2 >= a == nil ? ok : a +2 >= b and ok +2 >= f or obj.fn("b", false) +2 >= obj.a +2 >= obj.b +2 >= obj.fn(count(s, true)) +2 >= obj?.a +2 >= obj?.b +2 >= obj?.fn(obj?.head(0, 0.5)) +2 ^ 0 / -a +2 ^ 0 < b +2 ^ 0 < b ? 0.5 : a +2 ^ 0 <= float(0) +2 ^ 0 >= -0 +2 ^ 0.5 >= add(b, b) +2 ^ 1 != 0 ? add : false +2 ^ 1 * b +2 ^ 1 > b +2 ^ 2 > b +2 ^ a <= a +2 ^ b - a +2 ^ b - b +2 ^ b <= max(b) +2 ^ b == b +2 ^ f == f +2 ^ f >= a +2 ^ obj.a +2 ^ obj.b +2 ^ obj.obj.a +2 ^ obj?.a +2 ^ obj?.b +2 ^ obj?.fn(obj.head(0)) +[!ok] +["a"] != arr +[-0.5] +[-0] +[-a] +[0 ** 2] +[0.5 + 1] +[0.5 > 0] +[0.5 > 2] +[2 == a, a] +[2] == obj.head(f, 2, "a", f) +[a % a, a, add] +[a % a] +[a ** 0.5] +[a ^ b] +[a, "b" != s] +[a] +[abs(f)] +[add(div(a, b), last(arr))] +[add, add] +[add] +[arr, 2 == 0] +[arr, add] +[arr, div] +[arr[b]] +[arr] +[b - f] +[b / a] +[b <= 0] +[b <= 2] +[b, arr] +[b, obj] +[b] +[div, b] +[div, f] +[div] +[f * f] +[f + 0] +[f / a] +[f >= 0] +[f, a] +[f, f ** 0] +[f] +[false ? add : f] +[len(obj)] +[lower("a")] +[map(arr, div), ok, a] +[min(0.5)] +[min(f)] +[obj, div] +[obj, obj] +[obj.b] +[obj.fn(a)] +[obj.head(b, arr)] +[obj.head(b, div)] +[obj.head(f)] +[obj.head(obj)] +[obj.obj.obj] +[obj.obj] +[obj?.a] +[obj?.b] +[obj?.fn(a)] +[obj?.fn(b)] +[obj?.head("b")] +[obj?.head("c")] +[obj?.head(a, ok, nil, add, nil)] +[obj?.head(div), f] +[obj?.head(div, 0)] +[obj?.head(s)] +[obj?.obj] +[obj] +[ok, 0.5 / f] +[ok, add] +[ok, arr] +[ok, obj?.obj.b] +[ok, obj] +[ok, s] +[ok] +[s != "a"] +[s != nil] +[s != s] +[s + "a"] +[s endsWith "c"] +[s matches "a"] +[s, b] +[s] +[string(f)] +[true] != arr +a +a != -a +a != 0 % 1 +a != 0 * b +a != 0 + b +a != 0 ? b : nil +a != 0 ? div : obj +a != 0 ? f : ok +a != 0 ? s : arr +a != 0 ^ 1 +a != 0 ^ b +a != 0.5 * f +a != 0.5 / b +a != 0.5 ? false : ok +a != 0.5 ? s : nil +a != 1 != false +a != 1 * b +a != 1 ? 0 : obj +a != 2 ** 0 +a != a +a != a + 0.5 +a != a - 0 +a != a - a +a != a / 0 +a != a == nil +a != a == ok +a != a ? "c" : 0.5 +a != a ? 0 : div +a != a and ok != nil +a != add(0, a) +a != add(0, b) +a != add(b, a) +a != arr[1] +a != arr[b] +a != arr[obj?.a] +a != b +a != b != true +a != b && b > f +a != b && ok +a != b ** 0.5 +a != b ** a +a != b ** f +a != b / a +a != b == nil +a != b == obj?.b +a != b ? 0 : add +a != b and obj.head(arr) +a != b and obj.obj +a != b and obj?.a +a != div(b, a) +a != f +a != f ** f +a != f == ok +a != f ? 1 : obj +a != f ^ a +a != f || ok +a != first(arr) +a != float(a) +a != min(0.5) +a != min(a, 1, b) +a != min(b) +a != nil != obj.a +a != nil != ok ? ok : a +a != nil ? 0 : a +a != nil or obj.head(obj) +a != obj.a +a != obj.b +a != obj.head(add, ok) +a != obj.head(arr, 2, add) +a != obj.head(div) +a != obj.head(ok) +a != obj.head(true) +a != obj.obj +a != obj.obj?.b +a != obj?.a +a != obj?.b +a != obj?.fn(a) +a != obj?.head(0.5) +a != obj?.head(a * a) +a != obj?.head(obj, a) +a != obj?.obj +a != obj?.obj.a +a != obj?.obj.obj +a != obj?.obj?.b +a != obj?.obj?.obj +a % (b - a) +a % -a +a % -b +a % 1 != -b +a % 1 != b +a % 1 / 0 +a % 1 / f +a % 1 < a +a % 1 >= f +a % 2 != a + a +a % 2 != b +a % 2 * f +a % a +a % a % a +a % a * add(2, 0) +a % a * b +a % a - obj?.b +a % a / b +a % a < b +a % a <= f +a % a > 0 ? add : obj?.obj.a +a % a > a +a % add(a, b) +a % add(b, a) +a % arr[b] +a % arr[obj.head(f)] +a % b +a % b != b +a % b % a +a % b * f +a % b * obj.b +a % b - a +a % b .. obj?.head(f) +a % b / a +a % b == -f +a % b == f +a % b > b +a % b > f +a % b >= a +a % count(arr, ok) +a % div(1, a) +a % div(b, 1) +a % int(max(a)) +a % len("b") +a % len(obj) +a % min(a) +a % obj.a +a % obj.b +a % obj.b < a +a % obj.head(a) +a % obj.head(a, add(b, a)) +a % obj.head(b) +a % obj.obj.a +a % obj.obj?.a +a % obj.obj?.b +a % obj?.a +a % obj?.b +a % obj?.head(a) +a % obj?.obj?.a +a % obj?.obj?.b +a * (0.5 + b) +a * (1 - 1) +a * (1 - f) +a * (2 - 0) +a * (2 - b) +a * (a + 1) +a * (b - f) +a * -a +a * -f +a * 0 % a +a * 0 * f +a * 0 ** b +a * 0 / a +a * 0 > obj.head(b) +a * 0 > obj?.head(b, add) +a * 0.5 / b +a * 0.5 < f +a * 2 % b +a * 2 % div(a, a) +a * 2 == a != false +a * a +a * a != obj.b +a * a % b +a * a ** 0 +a * a - obj.a +a * a .. a +a * a .. b +a * a / 2 +a * a / f +a * a < f +a * a >= f +a * a >= f ? nil : a +a * abs(a) +a * abs(f) +a * add(1, a) +a * add(a, 0) +a * add(b, 0) +a * add(b, a) +a * b +a * b % a +a * b * obj.b +a * b ** f +a * b + a +a * b - a +a * b - b +a * b - f - 0 +a * b - obj.a +a * b <= b +a * b >= f +a * div(0, 1) +a * div(0, b) +a * div(a, 1) +a * div(a, a) +a * f +a * f != b * b +a * f * f +a * f ** 0.5 +a * f - a +a * f / a +a * f / b +a * f < a +a * f <= f +a * f <= f ^ 0.5 +a * f == max(a) +a * f >= f +a * f ^ 0.5 +a * f ^ 1 +a * float(1) +a * len("a") +a * min(a) +a * min(b) +a * obj.a +a * obj.b +a * obj.head(0.5, a) +a * obj.head(a) +a * obj.head(obj).b +a * obj?.a +a * obj?.b +a * obj?.fn(0) +a * obj?.fn(b) +a * obj?.fn(get(arr, b)) +a * obj?.head(b) +a * obj?.head(obj).a +a * obj?.obj.a +a * obj?.obj?.a +a ** (0 * f) +a ** (0.5 - 2) +a ** (0.5 - b) +a ** (0.5 / a) +a ** (2 * 0.5) +a ** (2 * b) +a ** (2 - f) +a ** (a / b) +a ** (b * a) +a ** (b - 0.5) +a ** (b / b) +a ** (f * a) +a ** (f * b) +a ** (f - 0) +a ** (f / 2) +a ** -0 +a ** -0.5 +a ** -a +a ** -b +a ** 0 != a +a ** 0 ** 0 +a ** 0 - b +a ** 0 ^ add(b, a) +a ** 0.5 ** 0.5 +a ** 0.5 / a +a ** 0.5 <= b +a ** 0.5 > b +a ** 0.5 ^ a +a ** 1 / a +a ** 1 > f +a ** 1 ^ f +a ** 2 != 2 - f +a ** 2 ** (f + 2) +a ** 2 <= b +a ** a +a ** a ** (f / b) +a ** a ** f +a ** a - f +a ** a / b +a ** a / obj.head(f) +a ** a <= a +a ** a <= obj.head(0) +a ** a == a +a ** a == b * 0.5 +a ** a > a +a ** a ^ 2 ** f +a ** abs(-f) +a ** abs(2) +a ** add(1, 2) +a ** add(b, a) +a ** arr[-0] +a ** arr[a] +a ** arr[b] +a ** b +a ** b != b +a ** b != f +a ** b != min(1) +a ** b ** a +a ** b - a +a ** b > f +a ** b ^ f +a ** div(2, b) +a ** div(a, 2) +a ** f +a ** f != obj?.head(obj).b +a ** f ** 0 +a ** f ** f +a ** f ** obj?.a +a ** f <= a +a ** f ^ a +a ** f ^ f +a ** float(f) +a ** int(f) +a ** len(obj) +a ** max(0) +a ** max(a, f) +a ** min(b) +a ** obj.a +a ** obj.b +a ** obj.fn(a) +a ** obj.fn(b) +a ** obj.head(f) +a ** obj.obj.a +a ** obj?.a +a ** obj?.b +a ** obj?.b ^ b +a ** obj?.head(1, ok) +a ** obj?.head(a) +a ** obj?.head(a, 0.5, add, "c") +a ** obj?.head(f, ok) +a ** obj?.obj?.a +a + -0 +a + -2 * f +a + -f +a + 0 + a +a + 0 + f +a + 0 - f +a + 0 <= b +a + 0 <= f +a + 0 == obj?.a +a + 0 ^ b +a + 0.5 != b +a + 0.5 * 2 +a + 0.5 > f +a + 0.5 ^ f +a + a +a + a % a +a + a % b +a + a * 1 +a + a * f +a + a + a +a + a + f +a + a - a +a + a - b +a + a / 0 +a + a / b +a + a < a + a +a + a >= f +a + a ^ b +a + add(0, 2) +a + add(b, b) +a + b +a + b % a +a + b - 0 +a + b - f +a + b .. a +a + count(arr, a != a) +a + div(0, 2) +a + div(a, b) +a + div(b, b) +a + f +a + f * 0.5 +a + f + b * 0 +a + f + f +a + f - a - 2 +a + f - b +a + f <= b +a + f == f +a + f == obj?.obj +a + f > float(b) +a + f >= obj.b +a + f ^ b +a + f ^ f +a + get(arr, 1) +a + int(f) +a + last(arr) +a + len(s) +a + min(f, 2) +a + obj.a +a + obj.b +a + obj.fn(2) +a + obj.fn(a) +a + obj.fn(b) +a + obj.fn(obj.head(b)) +a + obj.head(1, ok) +a + obj.head(a) +a + obj.head(a, ok, arr, nil) +a + obj.obj.a +a + obj.obj.b +a + obj?.a +a + obj?.b +a + obj?.head(f) +a + obj?.head(f, "c" != f) +a + obj?.head(obj?.a) +a + obj?.obj.a +a - -2 +a - -a +a - -b +a - 0 != a +a - 0 != f +a - 0 != obj?.obj?.a +a - 0 ** f +a - 0 - b +a - 0 / 0 +a - 0 < obj.b +a - 0 <= min(1) +a - 0 == obj.b +a - 0 > a +a - 0 ^ f +a - 0 in arr +a - 0.5 != f +a - 0.5 * 0.5 +a - 0.5 > b +a - 0.5 >= a +a - 1 .. obj.b +a - 1 == obj?.head(div, div) +a - 1 > b +a - 2 * f +a - 2 - 0.5 +a - 2 .. b +a - a +a - a != nil != false +a - a * 0 +a - a * f +a - a ** b +a - a - f +a - a .. -2 +a - a .. a +a - a < b / 0 +a - a <= a +a - a <= f ** 0.5 +a - a == a +a - a == obj?.a +a - a > 0 ? f : obj +a - a in arr +a - add(a, 0) +a - add(b, 0) +a - b +a - b * f +a - b + b - b +a - b + float(0) +a - b - a +a - b / 0 +a - b / 0.5 +a - div(a, 1) +a - f +a - f != b +a - f ** 1 +a - f + b +a - float(f) +a - get(arr, a) +a - len("c") +a - max(f) +a - obj.a +a - obj.b +a - obj.fn(a) +a - obj.head(0.5, b, b) +a - obj.head(2, obj) +a - obj.head(f) +a - obj.head(f, "b") +a - obj.obj?.b +a - obj?.a +a - obj?.b +a - obj?.head(a) +a - obj?.head(b, arr) +a - obj?.obj.b +a .. -2 +a .. 0 - 1 +a .. a +a .. a + 2 +a .. a + b +a .. a + obj.obj.a +a .. a - 1 +a .. add(b, b) +a .. arr[a] +a .. arr[b] +a .. b +a .. b + obj?.b +a .. b - a +a .. b - b +a .. b == arr +a .. div(1, 2) +a .. div(a, b) +a .. len(arr) +a .. len(s) +a .. min(0, 2) +a .. obj.a +a .. obj.b +a .. obj.head(a) +a .. obj.head(b, "a") +a .. obj.obj?.a +a .. obj?.a +a .. obj?.b +a .. obj?.head(1, obj, ok, false) +a .. obj?.head(2, s, nil) +a .. obj?.head(a, true, nil) +a .. obj?.obj.a +a .. obj?.obj.b +a .. obj?.obj.obj?.b +a / (0 - 0) +a / (1 + 0.5) +a / (a - a) +a / (f + 0) +a / (f + f) +a / -0 +a / -a +a / -b +a / -obj.obj.b +a / 0 != obj?.obj +a / 0 * 1 +a / 0 ** a +a / 0 + obj.a +a / 0 / obj.b +a / 0 < obj.a +a / 0 <= a +a / 0 == f +a / 0 >= a +a / 0 >= b +a / 0.5 < f +a / 0.5 == obj?.a +a / 1 - b +a / 1 / a +a / 1 < obj?.b +a / a +a / a != f +a / a - a ^ 2 +a / a < b +a / a <= add(1, 0) +a / a == f +a / a > float(f) +a / add(0, b) +a / add(a, b) +a / add(b, 0) +a / add(b, b) +a / arr[a] +a / b +a / b * obj?.head(f, arr, 0.5) +a / b ** b +a / b / (b + 0) +a / b / 2 +a / b < a +a / b == a +a / b > f +a / b >= 1 * obj?.a +a / b ^ b +a / count(arr, false) +a / div(0, a) +a / div(a, a) +a / div(b, b) +a / f +a / f * f +a / f ** 0.5 +a / f + a +a / f - f +a / f / b +a / f / f +a / f < obj?.b +a / f <= 0 % b +a / int(0) +a / max(0, 1, a) +a / max(2, b) +a / min(f) +a / obj.a +a / obj.b +a / obj.fn(a) +a / obj.fn(b) +a / obj.head(0, a) +a / obj.head(a, arr, 0.5) +a / obj.head(f) +a / obj.head(f, a) +a / obj?.a +a / obj?.b +a / obj?.fn(obj?.a) +a / obj?.head(0, obj, b, f, "b") +a / obj?.head(2, add) +a / obj?.head(a) +a / obj?.head(b, div) +a / obj?.head(f) +a / obj?.obj?.a +a < -0 +a < -a +a < -obj.a +a < 0 && obj.head(obj) +a < 0 * 0.5 +a < 0 ** b +a < 0 ** f +a < 0 / a +a < 0.5 != ok +a < 0.5 + f +a < 0.5 ? 0 : arr +a < 0.5 ? a != nil : f +a < 1 && obj.fn(ok, "a", obj) +a < 1 * 2 +a < 1 ? obj : true +a < 1 ^ b +a < 2 && obj?.a +a < 2 ** 2 +a < a +a < a % b +a < a * f +a < a - f +a < a / a +a < a == false +a < a ? 0 : ok +a < a ? 0.5 : arr +a < a ? a : add +a < a ? div : add +a < a ? f : add +a < a ? nil : 2 +a < a ? s : a +a < abs(a) +a < abs(b) +a < add(2, b) +a < add(a, a) +a < arr[a] +a < b +a < b != ok +a < b + 0.5 +a < b + b +a < b + f +a < b - f +a < b == obj?.head(ok) +a < b ? "c" : ok +a < b or obj.obj +a < div(b, 1) +a < f +a < f && obj.b?.b +a < f * b +a < f * f +a < f - 0 +a < f ? "b" : false +a < f ? a : ok +a < f ? add : b +a < f ? s : arr +a < f || ok +a < get(arr, b) +a < last(arr) +a < min(a) +a < min(f) +a < obj.a +a < obj.b +a < obj.fn(a) +a < obj.head(0) +a < obj.head(0, a, a) +a < obj.head(a, obj) +a < obj.head(b) +a < obj.obj.b +a < obj.obj?.a +a < obj?.a +a < obj?.b +a < obj?.obj.b +a <= -0 +a <= -0.5 +a <= -1 +a <= -b +a <= -f +a <= 0 != nil +a <= 0 && obj?.a +a <= 0 && obj?.fn(add) +a <= 0 * b +a <= 0 + 0.5 +a <= 0 - 1 +a <= 0 ? obj : s startsWith "c" +a <= 0 ^ 0.5 +a <= 0 || !ok +a <= 0 || ok +a <= 0.5 && obj?.head(true) +a <= 0.5 == obj.b +a <= 0.5 ? f != b : b +a <= 0.5 ? false : ok +a <= 0.5 ? obj : a +a <= 1 + 0 +a <= 2 != ok +a <= 2 ** a +a <= a +a <= a != true +a <= a ** 0 +a <= a / 2 +a <= a ? arr : "c" +a <= a || ok +a <= add(b, 1) +a <= arr[b] +a <= b +a <= b != nil ? 1 : s +a <= b % a +a <= b ** a +a <= b + 2 +a <= b - a +a <= b ? f : a +a <= b ? f : nil +a <= b ? f : obj.a +a <= b ? false : b +a <= b and obj.a +a <= f +a <= f ** a +a <= f ? 2 : f +a <= f ? obj?.head(b) : obj?.b +a <= f ? true : ok +a <= f and ok +a <= float(a) +a <= get(arr, b) +a <= len(obj) +a <= max(a) +a <= obj.a +a <= obj.b +a <= obj.head(a, "a", b, b, a) +a <= obj.head(b * 0.5) +a <= obj.head(b) +a <= obj.head(f) +a <= obj.obj.b +a <= obj?.a +a <= obj?.b +a <= obj?.fn(b) +a <= obj?.obj.a +a == -obj?.b +a == 0 != nil +a == 0 % a +a == 0 && obj?.b +a == 0 + 1 +a == 0 ? obj?.b : arr +a == 0 ? s : b +a == 0.5 != obj?.a +a == 0.5 + b +a == 0.5 ? b : b +a == 0.5 and obj.fn("b", nil) +a == 1 + b +a == 1 - f +a == 1 ? div : obj +a == 1 ? s : f +a == 1 ^ b +a == 2 * f +a == 2 or obj.a +a == a +a == a && obj.obj +a == a * b +a == a + a +a == a ? 1 : a +a == a ? 2 : f +a == a ? f : obj +a == a ? s : 0 +a == add(2, a) +a == arr[b] +a == b +a == b != nil +a == b % b +a == b * 1 +a == b ? b : obj.b +a == b ? s : add +a == b ^ 0.5 +a == b and "a" endsWith s +a == b or obj.b +a == b or ok +a == f +a == f != nil +a == f != nil ? s : obj +a == f != ok +a == f && obj == obj +a == f * a +a == f == obj?.a +a == f ? f : "b" +a == f ? ok : div +a == f and obj?.obj +a == f or obj.b +a == f || obj.head(b) +a == first(obj?.a) +a == int(b) +a == last(arr) +a == len("b") +a == len(obj) +a == nil != true +a == nil == ok +a == nil ? 0 : b +a == nil ? a : "b" +a == nil ? s : div +a == nil and obj.head(false) +a == obj.a +a == obj.b +a == obj.head("c") +a == obj.head(a, s) +a == obj.head(add) +a == obj.head(arr) +a == obj.head(f) +a == obj.head(obj, s, 0).obj +a == obj.head(ok, nil, add, "c") +a == obj.head(s, "a", ok, b) +a == obj.obj +a == obj.obj.b +a == obj?.a +a == obj?.b +a == obj?.b / a +a == obj?.b or ok +a == obj?.c +a == obj?.head(0.5) +a == obj?.head(add) +a == obj?.head(arr) +a == obj?.head(b or true) +a == obj?.head(b) +a == obj?.head(b, obj, "c") +a == obj?.head(s) +a == obj?.head(s, map(s, obj), a) +a == obj?.obj +a == obj?.obj?.b +a == obj?.obj?.obj +a > -a +a > -b +a > -f +a > 0 != obj?.b +a > 0 != ok +a > 0 && ok +a > 0 * 0.5 +a > 0 + 1 +a > 0 ^ 0.5 +a > 0 or nil == add +a > 1 != ok +a > 1 * 0 +a > 1 - 0 +a > 1 || obj?.obj +a > 2 * 0 +a > 2 ? add : div +a > 2 and obj.obj +a > a +a > a != ok +a > a != true +a > a * a +a > a ** f +a > a - b +a > a / f +a > a ? add : 1 +a > a ? add : ok +a > add(a, b) +a > add(b, a) +a > arr[a] +a > b +a > b != ok +a > b && !true +a > b * b +a > b + b +a > b ? "b" : 0 >= f +a > b ^ 0 +a > div(1, b) +a > f +a > f != ok +a > f ** b +a > f ** f +a > f / 0 +a > f ? f : add +a > f ? s : div +a > f ^ a +a > f || obj.head(0, add) +a > get(arr, b) +a > int(f) +a > len(obj) +a > len(s) +a > max(a) +a > min(b, f) +a > obj.a +a > obj.a % a +a > obj.a ? obj.head(f, obj) : add +a > obj.b +a > obj.fn(b) +a > obj.head(0.5) +a > obj.head(a) +a > obj.head(b) +a > obj.obj.a +a > obj?.a +a > obj?.b +a > obj?.fn(0) +a > obj?.fn(b) +a > obj?.head(f) +a > obj?.obj.a +a > obj?.obj.b +a > obj?.obj?.a +a > obj?.obj?.b +a >= -0 +a >= -a +a >= -f +a >= 0 != !ok +a >= 0 != obj.head(a, nil) +a >= 0 && ok +a >= 0 ** 0 +a >= 0 ** 1 +a >= 0 ** a +a >= 0 + b +a >= 0 ? s : b +a >= 0 ^ 0 +a >= 0 ^ a +a >= 0 or ok +a >= 0.5 && obj?.a +a >= 0.5 ? div : f ** 1 +a >= 0.5 || !ok +a >= 1 && f >= b +a >= 1 + 1 +a >= 1 ? add : obj.obj +a >= 1 ^ a +a >= 1 ^ f +a >= 1 || any(arr, true) +a >= 2 ? s : -f +a >= a +a >= a != nil +a >= a != ok +a >= a != true +a >= a * a +a >= a ** 2 +a >= a ** a +a >= a ** b +a >= a - b +a >= a ? arr : a +a >= a ^ 0 +a >= a ^ 1 * b +a >= a and obj?.b +a >= a || obj.head("a", f).head(f.head(div ^ ok), add contains b.b) +a >= add(a, 0) +a >= add(a, a) +a >= add(b, b) +a >= arr[b] +a >= b +a >= b % 1 +a >= b && f < f +a >= b - 0.5 +a >= b ? 1 : false +a >= b ^ a +a >= b and obj.obj +a >= b or ok +a >= b || b >= 0.5 +a >= f +a >= f * 2 +a >= f ** 2 +a >= f ? arr : add +a >= f ? b : ok +a >= f and ok +a >= f || obj.b.fn(add(f, any(obj, arr))?.b) +a >= float(b) +a >= get(arr, 0) +a >= int(0) +a >= int(f) +a >= len("c") +a >= min(f) +a >= obj.a +a >= obj.b +a >= obj.b || 0.5 <= obj.a +a >= obj.fn(1) +a >= obj.fn(a * a) +a >= obj.fn(div(a, b)) +a >= obj.head(1, nil, "a") +a >= obj.head(a, nil) +a >= obj.head(f) +a >= obj.obj?.b +a >= obj?.a +a >= obj?.a / b +a >= obj?.b +a >= obj?.fn(0) +a >= obj?.head(a) +a >= obj?.obj.a +a >= obj?.obj?.a +a >= obj?.obj?.b +a ^ (0 / b) +a ^ (2 + 0.5) +a ^ (a % 2) +a ^ (a % b) +a ^ (a * a) +a ^ (a - a) +a ^ (a - f) +a ^ (b - 2) +a ^ (b / 0) +a ^ (f - f) +a ^ (f / 2) +a ^ -0 +a ^ -0.5 +a ^ -a +a ^ -b +a ^ -f +a ^ 0 * b +a ^ 0 + f +a ^ 0 - a +a ^ 0 >= a +a ^ 0.5 ** b +a ^ 0.5 + -1 +a ^ 0.5 < f +a ^ 0.5 >= a +a ^ 1 ** f +a ^ 1 > obj?.b +a ^ 1 ^ obj.a +a ^ 2 * f +a ^ 2 + b +a ^ 2 == obj?.obj?.a +a ^ 2 ^ a +a ^ a +a ^ a ** a +a ^ a ** f +a ^ a + a * f +a ^ a / (b + f) +a ^ a / a +a ^ a / b +a ^ a < obj.a +a ^ a == 2 == nil +a ^ a > f +a ^ a ^ arr[a] +a ^ a ^ obj?.head(0) +a ^ abs(a) +a ^ add(1, 1) +a ^ add(a, b) +a ^ add(b, 2) +a ^ arr[0] +a ^ arr[a] +a ^ arr[b] +a ^ b +a ^ b != obj.obj?.a +a ^ b ** f +a ^ b ** obj?.b +a ^ b + 2 ^ f +a ^ b + a +a ^ b - b - a +a ^ b < 0 == ok +a ^ b > a +a ^ b ^ a +a ^ div(a, 2) +a ^ f +a ^ f != a +a ^ f ** 0.5 +a ^ f ** f +a ^ f + a +a ^ f + b +a ^ f - a +a ^ f / b +a ^ f > 0 ? div : arr +a ^ f ^ obj?.a +a ^ first(arr) +a ^ get(arr, 0) +a ^ min(f) +a ^ obj.a +a ^ obj.b +a ^ obj.fn(b) +a ^ obj.fn(obj.a) +a ^ obj.head(a) +a ^ obj.head(f) +a ^ obj.obj.b +a ^ obj.obj?.b +a ^ obj?.a +a ^ obj?.b +a ^ obj?.head(b) +a ^ obj?.obj?.b +a in a .. 0 +a in a .. 2 +a in arr +a in arr && obj.a +a in arr == true +a in arr ? 0.5 : 0.5 +a in arr ? 1 : obj +a in arr ? f : nil +a in arr ? f : ok +a in arr || 0.5 == f +a in b .. 0 +a in filter(arr, false) +a in filter(arr, ok) +a in map(arr, #) +a in obj?.head(nil)?.obj +a in obj[nil] +abs(-0.5) +abs(-1) +abs(-2) +abs(-a) +abs(-b) +abs(-f) +abs(0 % 2) +abs(0 % a) +abs(0 % b) +abs(0 * 0.5) +abs(0 * b) +abs(0 + 0) +abs(0 + a) +abs(0 + b) +abs(0 + f) +abs(0 - a) +abs(0 / a) +abs(0 / b) +abs(0 / f) +abs(0 ^ 0.5) +abs(0 ^ b) +abs(0) ** lastIndexOf("b", "b") +abs(0) ** obj?.b +abs(0) / b +abs(0) < b * 0 +abs(0) <= f +abs(0) == obj.a +abs(0) ^ obj?.a +abs(0.5 * f) +abs(0.5 ** 0.5) +abs(0.5 ** b) +abs(0.5 + 0.5) +abs(0.5 + f) +abs(0.5 - 1) +abs(0.5 - b) +abs(0.5 - f) +abs(0.5 ^ b) +abs(0.5) != obj.a +abs(0.5) == a +abs(0.5) == f != ok +abs(1 % 1) +abs(1 ** b) +abs(1 - a) +abs(1 / 0) +abs(1 / a) +abs(1 / f) +abs(1 ^ a) +abs(1) * 0 * a +abs(1) - min(a, 0) +abs(1) / f +abs(1) == f +abs(1) > obj?.b +abs(2 - 0) +abs(2 - 1) +abs(2 - a) +abs(2 ^ f) +abs(a * 0) +abs(a * a) +abs(a ** 0.5) +abs(a ** a) +abs(a ** f) +abs(a + 0) +abs(a + b) +abs(a - a) +abs(a / 1) +abs(a / b) +abs(a / f) +abs(a ^ 0.5) +abs(a ^ 1) +abs(a ^ f) +abs(a) +abs(a) * obj?.a +abs(a) + b +abs(a) + f +abs(a) - a == a +abs(a) <= b +abs(a) <= b % 1 +abs(a) > f +abs(a) >= add(0, b) +abs(abs(0.5)) +abs(abs(a)) +abs(abs(f)) +abs(abs(obj.head(b))) +abs(add(0, 0)) +abs(add(0, a)) +abs(add(0, b)) +abs(add(1, b)) +abs(add(2, b)) +abs(add(a, 0)) +abs(add(a, a)) +abs(add(a, b)) +abs(add(b, 1)) +abs(add(b, a)) +abs(add(b, b)) +abs(arr[a]) +abs(arr[a]) ** b +abs(b % a) +abs(b % b) +abs(b * 1) +abs(b * b) +abs(b ** 0) +abs(b ** 0.5) +abs(b ** 2) +abs(b ** b) +abs(b ** f) +abs(b + b) +abs(b + f) +abs(b - a) +abs(b - f) +abs(b / 0.5) +abs(b / a) +abs(b / f) +abs(b ^ 0) +abs(b ^ 2) +abs(b ^ a) +abs(b ^ f) +abs(b ^ obj.b) +abs(b) +abs(b) % a +abs(b) * a +abs(b) * b +abs(b) - f +abs(b) .. a +abs(b) < a +abs(b) < b +abs(b) <= f +abs(b) <= obj?.b +abs(b) >= b ? "c" : 0 +abs(div(0, 1)) +abs(div(0, a)) +abs(div(a, a)) +abs(div(a, b)) +abs(div(b, a)) +abs(div(b, b)) +abs(f * 1) +abs(f ** 0) +abs(f ** 2) +abs(f ** a) +abs(f ** b) +abs(f ** f) +abs(f + 0) +abs(f + 2) +abs(f + a) +abs(f + b) +abs(f - a) +abs(f - f) +abs(f / b) +abs(f / f) +abs(f ^ 0) +abs(f ^ 1) +abs(f ^ f) +abs(f ^ obj.a) +abs(f ^ obj?.b) +abs(f) +abs(f) != f +abs(f) * obj.b +abs(f) ** f +abs(f) + b +abs(f) < obj?.a +abs(f) == a +abs(false ? "b" : 2) +abs(false ? s : 0) +abs(float(0)) +abs(float(0.5)) +abs(float(add(b, b))) +abs(float(b)) +abs(float(f ^ a)) +abs(get(arr, 2)) +abs(get(arr, b)) +abs(int(0)) +abs(int(1)) +abs(int(b)) +abs(int(f)) +abs(len("b")) +abs(len(arr)) +abs(max(a)) +abs(max(f)) +abs(max(f, f)) +abs(min(0, f)) +abs(min(a)) +abs(min(b)) +abs(min(b, f)) +abs(min(f)) +abs(obj.a) +abs(obj.a) != b +abs(obj.b) +abs(obj.fn(0)) +abs(obj.fn(a)) +abs(obj.fn(b)) +abs(obj.head(0.5, b)) +abs(obj.head(1)) +abs(obj.head(2)) +abs(obj.head(2, nil, obj)) +abs(obj.head(a)) +abs(obj.head(a, a)) +abs(obj.head(b)) +abs(obj.head(b, 0.5)) +abs(obj.head(f)) +abs(obj.obj.b) +abs(obj?.a) +abs(obj?.b ** (a / b)) +abs(obj?.b) +abs(obj?.fn(0)) +abs(obj?.fn(1)) +abs(obj?.fn(a)) +abs(obj?.fn(b)) +abs(obj?.head(0)) +abs(obj?.head(2)) +abs(obj?.head(a)) +abs(obj?.head(a, 2)) +abs(obj?.head(a, b, add)) +abs(obj?.head(a, ok, b)) +abs(obj?.head(b)) +abs(obj?.head(b, a)) +abs(obj?.head(b, arr, div, f)) +abs(obj?.head(f, add, 0.5)) +abs(obj?.obj.a) +abs(obj?.obj.b) +abs(obj?.obj?.a) +abs(ok ? 0.5 : 0.5) +abs(ok ? 0.5 : nil) +abs(ok ? a : b) +abs(ok ? b : arr) +abs(true ? b : b) +abs(true ? f : ok) +abs(true ? f : s) +add +add != add +add != add != ok +add != add && obj?.b +add != add ? add : !ok +add != add ? add(a, a) : add +add != add ? arr : "b" +add != add ? b : a +add != add ? obj : obj +add != add ? s : nil +add != div +add != div && obj.b +add != div == ok +add != div ? 0 : a +add != div ? f : obj +add != div ? nil : false +add != div ? ok : ok +add != div || obj?.head(0) +add != nil ? 1 : 2 +add != nil ? div : s +add != nil and obj?.obj +add != nil || obj.a +add != obj.a +add != obj.a + a +add != obj.b +add != obj.head("a") +add != obj.head(-a) +add != obj.head(0 == obj) +add != obj.head(0, s, ok) +add != obj.head(add, "c") +add != obj.head(arr) +add != obj.head(arr, "a", f) +add != obj.head(b) +add != obj.head(f) +add != obj.head(f, 0, a, 2, f) +add != obj.head(ok, a, 0) +add != obj.head(s) +add != obj.obj +add != obj.obj.a +add != obj.obj.obj +add != obj.obj?.a +add != obj.obj?.b +add != obj.obj?.obj +add != obj?.a +add != obj?.b +add != obj?.head(0.5) +add != obj?.head(a, div, add) +add != obj?.head(add, 0.5) +add != obj?.head(div, ok) +add != obj?.head(f, nil, obj, true, nil) +add != obj?.head(s, add, div) +add != obj?.obj +add != obj?.obj.obj?.a +add != obj?.obj?.a +add != obj[nil] +add == add +add == add != ok +add == add == true +add == add ? 1 : f +add == add ? ok : a +add == add ? ok : f +add == add or obj.obj +add == add or ok +add == div +add == div != nil +add == div && obj.fn(nil, 0) +add == div ? f : a +add == div || s >= "b" +add == get(obj, s) +add == nil == nil +add == nil or obj.obj +add == nil or ok +add == obj.a +add == obj.b +add == obj.head("c", s) +add == obj.head(2, a) +add == obj.head(add, add, obj) +add == obj.head(f, "b", false, f) +add == obj.head(f, arr) +add == obj.head(obj) +add == obj.obj +add == obj.obj.b +add == obj.obj?.a +add == obj.obj?.b +add == obj?.a +add == obj?.b +add == obj?.c?.b +add == obj?.fn(b) +add == obj?.head("c") +add == obj?.head(add) +add == obj?.head(add, f, nil) +add == obj?.head(b, nil) +add == obj?.head(div) +add == obj?.head(obj) +add == obj?.head(s) +add == obj?.obj +add == obj?.obj.a +add == obj?.obj.obj +add == obj?.obj?.a +add in [b] +add in obj.head(nil) +add in obj?.head(arr) +add in obj?.head(arr, ok) +add in obj[toJSON(nil)] +add(-0, a) +add(-0, b) +add(-0, obj?.b) +add(-0, ok ? b : div) +add(-1, a) +add(-2, a) +add(-2, b) +add(-a, a) +add(-a, obj.a) +add(-b, b) +add(0 * b, obj?.a) +add(0 - a, a - a) +add(0, 0) <= f +add(0, 0) == obj.head(f) +add(0, 0) > last(arr) +add(0, 1) + f +add(0, 1) .. obj.b +add(0, 2) % (0 - b) +add(0, 2) > b +add(0, 2) > f +add(0, 2) ^ obj.b +add(0, a) != f +add(0, a) % (0 + a) +add(0, a) + a +add(0, a) + f +add(0, a) + obj.head(f) +add(0, a) <= f +add(0, a) > 0.5 ? obj : div +add(0, b) ** (f * f) +add(0, b) ** 0.5 ^ f +add(0, b) ** b +add(0, b) - max(f) +add(0, b) - obj.b +add(0, b) .. a +add(0, b) .. b +add(0, b) <= a + 0 +add(1 % b, b) +add(1 + 0, b) +add(1, 0) == f +add(1, 0) ^ a +add(1, 1) > f +add(1, 2) ^ f +add(1, a) * obj.b +add(1, a) in arr +add(1, b) % a +add(1, b) + obj.head(a) +add(1, b) == f +add(2 - a, obj.fn(a)) +add(2 - b, min(0)) +add(2, 0) < a +add(2, 0) <= div(b, 2) +add(2, 2) + f +add(2, 2) / obj.fn(b) +add(2, 2) > b +add(2, a) - a +add(2, a) .. a +add(2, a) ^ a +add(2, b) != a +add(2, b) / b +add(2, b) > b +add(2, b) >= a +add(2, b) ^ obj.b +add(a % 2, a) +add(a % a, obj.b) +add(a % b, b) +add(a * 0, a) +add(a * 0, b * b) +add(a * a, a) +add(a * a, get(arr, b)) +add(a * b, obj?.head(b)) +add(a - 0, obj.b) +add(a - 1, a) +add(a - 2, a) +add(a - b, b) +add(a, -0) +add(a, -1) +add(a, -a) +add(a, -b) +add(a, 0) ** f +add(a, 0) - f ** 0.5 +add(a, 0) .. -b +add(a, 0) .. obj?.a +add(a, 0) < 2 ? f : 1 +add(a, 0) < b +add(a, 0) > a +add(a, 0) >= float(2) +add(a, 0) ^ f +add(a, 1) != 0.5 ? ok : add +add(a, 1) ** a +add(a, 1) - f +add(a, 1) < b +add(a, 1) > obj.a +add(a, 1) >= a +add(a, 1) in 1 .. a +add(a, 2) ** f +add(a, 2) / f +add(a, a * 2) +add(a, a - a) +add(a, a) +add(a, a) != 0.5 ? s : b +add(a, a) != f +add(a, a) != obj?.obj +add(a, a) % obj?.a +add(a, a) % obj?.fn(b) +add(a, a) - f +add(a, a) .. obj.a +add(a, a) / a +add(a, a) / b +add(a, a) / f +add(a, a) < b +add(a, a) < f +add(a, a) == a +add(a, a) > 1 - a +add(a, a) >= -b +add(a, a) >= 0.5 * 0 +add(a, a) >= a +add(a, a) ^ f +add(a, abs(b)) +add(a, add(a, 2)) +add(a, add(a, b)) +add(a, add(b, a)) +add(a, add(b, b)) +add(a, arr[a]) +add(a, arr[b]) +add(a, b * a) +add(a, b) +add(a, b) ** obj.b +add(a, b) ** obj.head(1, div) +add(a, b) + f / a +add(a, b) - b +add(a, b) - obj.a +add(a, b) / int(b) +add(a, b) == a +add(a, b) == b +add(a, b) == obj.obj +add(a, b) ^ b +add(a, b) ^ obj.b +add(a, count(arr, ok)) +add(a, div(1, 1)) +add(a, get(arr, a)) +add(a, int(a)) +add(a, int(f)) +add(a, len(obj)) +add(a, max(1)) +add(a, obj.a) +add(a, obj.b) +add(a, obj?.a) +add(a, obj?.b) +add(a, obj?.fn(a)) +add(a, obj?.head(0)) +add(a, obj?.head(0, div, nil)) +add(a, obj?.obj.b) +add(abs(0), b) +add(abs(a), obj?.a) +add(add(0, a), b) +add(add(2, a), b) +add(add(a, 0), -2) +add(add(a, 2), b) +add(add(a, b), b) +add(add(b, 0), a) +add(add(b, 0), b) +add(add(b, 2), a) +add(add(b, 2), b) +add(add(b, b), a) +add(arr[b], b) +add(b % 1, b + b) +add(b % a, a) +add(b * b, -a) +add(b + 0, a) +add(b + 0, len("b")) +add(b + 1, obj?.b) +add(b + 2, get(arr, 1)) +add(b - 0, b) +add(b - 0, get(arr, 1)) +add(b - 1, a) +add(b - a, obj.a) +add(b, -1) +add(b, -2) +add(b, -a) +add(b, -b) +add(b, 0 * a) +add(b, 0 + b) +add(b, 0) != b ? arr : obj +add(b, 0) != f +add(b, 0) * obj.b +add(b, 0) ** a +add(b, 0) ** obj.a +add(b, 0) + a +add(b, 0) + f +add(b, 0) == b + 0 +add(b, 0) > a - f +add(b, 0) >= b +add(b, 0) >= obj?.b +add(b, 0) ^ (0 + 0.5) +add(b, 1) ** -2 +add(b, 1) + a +add(b, 1) <= a +add(b, 1) == obj?.head(add, f) +add(b, 1) ^ f +add(b, 2 % a) +add(b, 2) == obj.obj.a +add(b, a * b) +add(b, a) +add(b, a) != a ? s : obj +add(b, a) != f +add(b, a) * obj.a +add(b, a) + a +add(b, a) - b +add(b, a) .. obj?.head(0, nil, f) +add(b, a) > a % b +add(b, a) > b == true +add(b, a) >= b +add(b, a) ^ b +add(b, a) ^ obj?.a +add(b, add(0, b)) +add(b, add(1, b)) +add(b, add(2, b)) +add(b, add(b, 2)) +add(b, arr[0]) +add(b, b % a) +add(b, b * a) +add(b, b + a) +add(b, b) +add(b, b) % div(a, 1) +add(b, b) + b +add(b, b) - -b +add(b, b) - a +add(b, b) - f +add(b, b) < a + 0 +add(b, b) >= a + 0.5 +add(b, b) ^ obj?.b +add(b, div(0, a)) +add(b, div(1, b)) +add(b, div(a, a)) +add(b, div(b, a)) +add(b, div(b, b)) +add(b, first(arr)) +add(b, get(arr, b)) +add(b, int(a)) +add(b, len(arr)) +add(b, max(b)) +add(b, min(a)) +add(b, obj.a) +add(b, obj.a) % a +add(b, obj.b) +add(b, obj.head(a)) +add(b, obj.obj.a) +add(b, obj.obj?.b) +add(b, obj?.a) +add(b, obj?.b) +add(b, obj?.head(a)) +add(b, obj?.obj.b) +add(b, ok ? 1 : a) +add(div(0, a), b) +add(div(a, a), add(0, 0)) +add(div(a, b), b) +add(div(b, 2), a) +add(div(b, a), -a) +add(div(b, a), obj?.head(a, div)) +add(div(b, b), b) +add(div(b, b), obj?.a) +add(false ? add : 0, 0 + a) +add(get(arr, 0), last(arr)) +add(get(arr, a), a) +add(get(arr, a), b) +add(get(arr, b), b) +add(indexOf("a", "b"), b) +add(indexOf(s, s), a) +add(int(0), 0 - a) +add(int(0), b) +add(int(2), div(b, b)) +add(int(a), b) +add(int(b), a) +add(int(f), 1 * b) +add(last(arr), a) +add(len(obj), b) +add(len(s), a) +add(max(0), a) +add(max(2), int(a)) +add(min(0), len(arr)) +add(min(2), a) +add(min(a), b) +add(min(a), len(arr)) +add(min(a), obj.a) +add(obj.a, a) +add(obj.a, b) +add(obj.a, obj.a) +add(obj.a, obj.b) +add(obj.b, a * a) +add(obj.b, a) +add(obj.b, arr[0]) +add(obj.b, b) +add(obj.b, obj.a) +add(obj.b, obj.b) +add(obj.b, obj.fn(b)) +add(obj.b, obj?.a) +add(obj.b, obj?.b) +add(obj.b, obj?.head(0)) +add(obj.b, obj?.head(b)) +add(obj.fn(0), b) +add(obj.fn(a), obj.a) +add(obj.fn(b), a) +add(obj.head(0), 2 * a) +add(obj.head(0), obj?.head(b)) +add(obj.head(1, add), obj.a) +add(obj.head(2, 0, "a"), b) +add(obj.head(a), b) +add(obj.head(b), a) +add(obj.head(b), b) +add(obj.head(b, obj), b) +add(obj.obj?.b, a) +add(obj?.a, -a) +add(obj?.a, a + 0) +add(obj?.a, a - b) +add(obj?.a, a) +add(obj?.a, b % 1) +add(obj?.a, b) +add(obj?.a, div(a, b)) +add(obj?.a, div(b, a)) +add(obj?.a, obj.a) +add(obj?.a, obj.b) +add(obj?.a, obj?.head(a, f, obj)) +add(obj?.b, -0) +add(obj?.b, -1) +add(obj?.b, 0 * a) +add(obj?.b, 0 * b) +add(obj?.b, 2 + a) +add(obj?.b, a) +add(obj?.b, add(0, a)) +add(obj?.b, b) +add(obj?.b, min(0)) +add(obj?.b, obj.a) +add(obj?.b, obj.b) +add(obj?.b, obj?.a) +add(obj?.b, obj?.b) +add(obj?.b, obj?.head(0)) +add(obj?.fn(0), int(a)) +add(obj?.fn(0), obj.a) +add(obj?.fn(b), obj.a) +add(obj?.head(0, 0, false), arr[a]) +add(obj?.head(a), b) +add(obj?.head(b), b) +add(obj?.head(b, s), a) +add(obj?.obj.a, b) +add(ok ? 2 : f, obj.b) +add(ok ? a : f, obj.b) +add(ok ? a : s, b) +all(0 .. 0, nil != 0) +all(0 .. 2, "c" startsWith s) +all(0 .. 2, ok) +all(0 .. a, ok) +all(0 .. b, ok) +all(a .. 0, "a" matches s) +all(a .. 0, a > b) +all(a .. b, !ok) +all(arr, "a" <= s) +all(arr, "a" contains "b") +all(arr, "a" in obj) +all(arr, "b" matches "a") +all(arr, "c" in obj) +all(arr, "c" matches s) +all(arr, # != f) +all(arr, 0 == nil) +all(arr, 0 > b) +all(arr, 0.5 != b) +all(arr, 0.5 <= a) +all(arr, 0.5 >= a) +all(arr, 2 != 1) +all(arr, 2 < 0) +all(arr, 2 < a) +all(arr, 2 <= a) +all(arr, 2 > f) +all(arr, a != a) +all(arr, a < 0) +all(arr, a < 1) +all(arr, a < b) +all(arr, a < obj.b) +all(arr, a <= f) +all(arr, a == a) +all(arr, a == f) +all(arr, a > f) +all(arr, a >= b) +all(arr, add != add) +all(arr, add == nil) +all(arr, all(arr, ok)) +all(arr, all(arr, true)) +all(arr, any(arr, ok)) +all(arr, b < 0) +all(arr, b <= b) +all(arr, b == a) +all(arr, f != a) +all(arr, f < #) +all(arr, f == b) +all(arr, f == f) +all(arr, f >= b) +all(arr, f >= f) +all(arr, false == ok) +all(arr, false ? div : false) +all(arr, false and ok) +all(arr, false) and f <= b +all(arr, nil != 2) +all(arr, nil != nil) +all(arr, nil == "b") +all(arr, nil == add) +all(arr, nil == arr) +all(arr, none(arr, ok)) +all(arr, not true) +all(arr, obj.head(false)) +all(arr, obj?.head(true)) +all(arr, ok != nil) +all(arr, ok && ok) +all(arr, ok == obj.b) +all(arr, ok || false) +all(arr, ok) +all(arr, ok) != obj?.b +all(arr, ok) != obj?.obj +all(arr, ok) or obj.b +all(arr, ok) or obj?.head(a) +all(arr, one(arr, ok)) +all(arr, s != s) +all(arr, s <= "b") +all(arr, s > "a") +all(arr, s contains s) +all(arr, s matches s) +all(arr, true or false) +all(arr, true or true) +all(arr, true) && a == nil +all(b .. a, a > f) +all(filter(arr, false), ok || ok) +all(filter(arr, true), "a" >= "a") +all(map(arr, "b"), ok) +all(map(arr, 0), ok) +all(map(arr, 0.5), 1 < 2) +all(map(arr, 0.5), ok) +all(map(arr, 2), b != b) +all(map(arr, add), 2 < f) +all(map(arr, arr), 2 == b) +all(map(arr, b), b >= b) +all(map(arr, b), not true) +all(map(arr, b), ok) +all(map(arr, f), a > f) +all(map(arr, false), #) +all(map(arr, obj), 0 <= f) +all(map(arr, ok), #) +all(map(arr, s), ok) +all(obj.head("c"), ok) +all(obj.head(arr, 0.5, div), true or false) +all(obj.head(obj, a), ok) +all(obj.head(obj, f, b), ok) +all(obj.head(obj, s), 0 >= f) +all(obj.head(s), b < 0) +all(obj.obj, "a" == s) +all(obj.obj, a >= a) +all(obj.obj, add == add) +all(obj.obj, all(arr, ok)) +all(obj.obj, div == nil) +all(obj.obj, f <= a) +all(obj.obj, obj.head(ok, div)) +all(obj.obj, ok || ok) +all(obj.obj, ok) +all(obj?.head("b", ok, add, 0), ok) +all(obj?.head("c", b), 0 < a) +all(obj?.head(arr), 0.5 > f) +all(obj?.head(arr), b < f) +all(obj?.head(arr), obj.head(ok)) +all(obj?.head(arr, 0.5, add, nil), f != 0.5) +all(obj?.head(obj), a <= 0) +all(obj?.head(obj, nil), ok) +all(obj?.head(s), 1 == f) +all(obj?.obj, 0 > 0) +all(obj?.obj, b == 0.5) +all(obj?.obj, b >= 1) +all(obj?.obj, b >= a) +all(obj?.obj, div != nil) +all(obj?.obj, nil in arr) +all(obj?.obj, obj.head(ok)) +all(obj?.obj, obj?.head(ok, ok)) +all(obj?.obj, ok && false) +all(obj?.obj, ok) +all(obj?.obj, s endsWith "c") +all(obj?.obj, s matches s) +all(ok ? arr : s, ok or true) +all(ok ? obj : f, b > f) +any(0 .. a, ok) +any([false, "c"], ok) +any([ok, false], #) +any(a .. b, ok ? ok : obj) +any(a .. b, ok) +any(arr, !false) +any(arr, !true) +any(arr, "a" == obj.b) +any(arr, "b" < s) +any(arr, "c" != obj?.obj) +any(arr, "c" startsWith "c") +any(arr, # != a) +any(arr, # != b) +any(arr, 0 != 0.5) +any(arr, 0.5 != b) +any(arr, 0.5 >= f) +any(arr, 1 != 0) +any(arr, 2 < 0.5) +any(arr, a != b) +any(arr, a < b) +any(arr, a == 0.5) +any(arr, a == f) +any(arr, a > 0.5) +any(arr, a > b) +any(arr, a in arr) +any(arr, add != div) +any(arr, any(arr, true)) +any(arr, b != f) +any(arr, b < f) +any(arr, b <= f) +any(arr, b == 0) +any(arr, b > 0) +any(arr, b > f) +any(arr, div == div) +any(arr, f < a) +any(arr, f < b) +any(arr, f <= 0.5) +any(arr, f > 0.5) +any(arr, f >= a) +any(arr, false and false) +any(arr, false and ok) +any(arr, false || false) +any(arr, false) != ok +any(arr, false) && ok +any(arr, false) ? div(nil, a) : obj +any(arr, false) || false ? div : 0 +any(arr, nil != add) +any(arr, nil != f) +any(arr, nil != s) +any(arr, nil == "b") +any(arr, nil == "c") +any(arr, nil == 1) +any(arr, nil == a) +any(arr, nil == add) +any(arr, nil == b) +any(arr, nil == s) +any(arr, not ok) +any(arr, obj.head(false)) +any(arr, obj.head(false, div, 0, add)) +any(arr, obj.head(false, true)) +any(arr, obj.head(ok, add)) +any(arr, ok != nil) +any(arr, ok ? ok : b) +any(arr, ok) +any(arr, ok) && obj.a +any(arr, ok) && obj.obj +any(arr, ok) && ok +any(arr, ok) == ok +any(arr, ok) ? s : keys(obj) +any(arr, ok) and obj.a +any(arr, ok) or obj.b +any(arr, ok) or ok +any(arr, one(arr, false)) +any(arr, s <= s) +any(arr, s contains "c") +any(arr, s endsWith "b") +any(arr, string(2) != s) +any(arr, true) != ok +any(arr, true) && obj?.head(false) +any(arr, true) and b != f +any(arr, true) or obj?.a +any(arr, true) || obj.obj +any(arr[0:b], div != div) +any(b .. 2, a == b) +any(b .. a, obj?.a) +any(false ? add : obj, nil == f) +any(false ? div : "a", ok) +any(false ? false : s, !true) +any(filter(arr, ok), a != a) +any(filter(arr, ok), ok ? ok : 0) +any(filter(arr, ok), ok) +any(filter(arr, true), "b" in obj) +any(keys(obj), ok) +any(map(arr, 0), a < a) +any(map(arr, 0), b <= 0) +any(map(arr, 0), nil != "b") +any(map(arr, 0.5), a <= a) +any(map(arr, a), false && ok) +any(map(arr, add), ok) +any(map(arr, arr), 2 == nil) +any(map(arr, div), 0 > f) +any(map(arr, div), ok) +any(map(arr, f), b == 0) +any(map(arr, f), nil != a) +any(map(arr, f), ok) +any(map(arr, ok), #) +any(map(obj.head(s), a), ok) +any(obj.head("b"), ok) +any(obj.head("c", obj), 1 != nil) +any(obj.head(arr), 0 < b) +any(obj.head(obj), a < b) +any(obj.head(s), 0 >= 0) +any(obj.obj, 0.5 > b) +any(obj.obj, 2 == 0.5) +any(obj.obj, a < f) +any(obj.obj, obj != obj) +any(obj.obj, ok && false) +any(obj.obj, ok and ok) +any(obj.obj, ok) +any(obj.obj, s <= s) +any(obj.obj, s > "a") +any(obj?.head(arr), ok) +any(obj?.head(upper(a, 0, "c")), ok) +any(obj?.obj, 0 >= 0.5) +any(obj?.obj, a <= 0.5) +any(obj?.obj, arr == arr) +any(obj?.obj, b == b) +any(obj?.obj, f == 1) +any(obj?.obj, f == nil) +any(obj?.obj, f > a) +any(obj?.obj, not false) +any(obj?.obj, not ok) +any(obj?.obj, ok != nil) +any(obj?.obj, ok) +any(obj?.obj, s >= "c") +any(obj?.obj?.obj, ok) +any(ok ? "b" : ok, 2 != b) +any(ok ? arr : ok, ok) +any(ok ? obj : 0, b < b) +any(ok ? obj : ok, 0 < 0.5) +arr +arr != arr +arr != arr && ok ? arr : f +arr != arr == obj.head(a) +arr != b .. 0 +arr != filter(arr, true) +arr != map(arr, 0) +arr != map(arr, arr) +arr != map(arr, obj) +arr != nil ? ok : f +arr != nil ? ok : ok +arr != nil and f != b +arr != nil or a == 0 +arr != nil || true && false +arr != obj.a +arr != obj.b +arr != obj.head(0.5) +arr != obj.head(add, add) +arr != obj.head(all("c", ok)) +arr != obj.head(arr, add) +arr != obj.head(arr, s) +arr != obj.head(b) +arr != obj.head(b, 0) +arr != obj.head(b, b, b, true) +arr != obj.head(nil) +arr != obj.head(s) +arr != obj.head(true, b, "a") +arr != obj.obj +arr != obj.obj.a +arr != obj?.a +arr != obj?.b +arr != obj?.head("a" >= s) +arr != obj?.head(0) +arr != obj?.head(0.5) +arr != obj?.head(div) +arr != obj?.head(false) +arr != obj?.head(nil) +arr != obj?.head(obj, add) +arr != obj?.head(obj, s, arr, add).a +arr != obj?.head(s) +arr != obj?.obj +arr != obj?.obj.b +arr != obj?.obj?.a +arr == a .. a +arr == arr +arr == arr != ok +arr == arr == ok +arr == arr ? "b" : add +arr == arr ? a : 0 +arr == arr ? add : obj +arr == arr ? nil : "a" +arr == arr ? obj : nil +arr == arr ? obj?.head(div, "b") : s +arr == arr ? ok : a +arr == arr ? s : a +arr == arr and obj?.fn(a) +arr == arr and obj?.head(a, 0.5, arr, arr) +arr == arr or obj.b != b +arr == map(arr, true) +arr == nil ? a : ok +arr == nil ? ok : div +arr == nil or add == div +arr == nil or obj.fn(b) +arr == nil || obj.b +arr == obj.a +arr == obj.b +arr == obj.head(0, div) +arr == obj.head(arr, f, ok) +arr == obj.head(f, obj) +arr == obj.head(s, 0) +arr == obj.obj +arr == obj.obj ? arr : obj +arr == obj.obj.b +arr == obj.obj.obj +arr == obj?.a +arr == obj?.b +arr == obj?.head(a) +arr == obj?.head(a, nil) +arr == obj?.head(arr) +arr == obj?.head(arr, "c") +arr == obj?.head(b, ok) +arr == obj?.head(div) +arr == obj?.head(false) +arr == obj?.head(nil, f, "b") +arr == obj?.head(obj, arr) +arr == obj?.head(s, 0.5) +arr == obj?.head(s, a) +arr == obj?.obj +arr == obj?.obj.b +arr == obj?.obj.obj +arr == obj?.obj.obj?.a +arr in keys(obj) +arr in obj.head(arr) +arr in obj?.head(get(0, b)) +arr[-a] +arr[0 * 2] +arr[0 * a] +arr[0 + 0] +arr[0 + 2:a] +arr[0] % b +arr[0] - a +arr[0] / obj?.head(f, 0) +arr[0] <= min(1) +arr[0] >= f +arr[1 % b] +arr[1 * a] +arr[1] < a +arr[1] == b +arr[2 % b] +arr[2 * 0:b] +arr[2] * obj.a +arr[a + a] +arr[a - b] +arr[a] +arr[a] != f +arr[a] != f + 1 +arr[a] * a +arr[a] ** a +arr[a] + f +arr[a] - 1 / 1 +arr[a] .. b +arr[a] <= a +arr[a] > -a +arr[a] >= f +arr[a] ^ f +arr[add(a, 0)] +arr[add(b, 0):b] +arr[add(b, 0)] +arr[b % b] +arr[b - 0] +arr[b - a] +arr[b:a * b] +arr[b:obj.b] +arr[b] +arr[b] % a +arr[b] * (b + a) +arr[b] ** a +arr[b] - add(b, 1) +arr[b] - arr[a] +arr[b] - b +arr[b] - f +arr[b] - obj?.b +arr[b] == obj.b +arr[b] > -0 +arr[b] > a +arr[b] > b +arr[b] > get(arr, 0) +arr[b] > last(arr) +arr[div(a, 1)] +arr[div(a, 2)] +arr[div(a, b)] +arr[len("a")] +arr[max(0)] +arr[max(b)] +arr[obj.a] +arr[obj.b:obj?.fn(2)] +arr[obj.b] +arr[obj.fn(a)] +arr[obj.head(a)] +arr[obj.head(a, obj)] +arr[obj.head(f)] +arr[obj?.a] +arr[obj?.b] +arr[obj?.fn(0)] +arr[obj?.head(b)] +arr[obj?.head(f)] +arr[true ? b : obj] +b +b != -a +b != -f +b != 0 % b +b != 0 && obj?.head("c", 0.5) +b != 0 * a +b != 0 ? false : 1 +b != 0 ? obj : arr +b != 0 ? ok : nil +b != 0 ? true : arr +b != 0 or s <= "b" +b != 0.5 * a +b != 0.5 == ok != ok +b != 0.5 ? ok : ok +b != 0.5 ^ obj?.b +b != 1 - b +b != 1 - f +b != 1 / a +b != 1 == ok +b != 2 || f > a +b != a +b != a % a +b != a * a +b != a - a +b != a / 0.5 +b != a ? "b" : arr +b != a ? "c" : obj +b != a ? a : "a" +b != a ? f : div +b != a ? obj : add +b != add(2, 0) +b != add(2, a) +b != add(a, a) +b != b +b != b != false +b != b - a +b != b - b +b != b == nil +b != b == ok +b != b ? ok : div +b != b ? s : obj.a +b != div(2, b) +b != f +b != f != ok +b != f / a +b != f == true +b != f ? 0.5 : arr +b != f ? arr : ok +b != f ? obj : add +b != f or obj.b +b != float(a) +b != get(arr, 2) +b != get(obj, s) +b != nil ? nil : s +b != nil ? obj : f +b != nil || ok +b != obj.a +b != obj.b +b != obj.c +b != obj.head("b", obj) +b != obj.head(add) +b != obj.head(arr) +b != obj.head(arr, f < b) +b != obj.head(b, obj, false) +b != obj.head(div, f) +b != obj.head(nil, s) +b != obj.head(obj)?.a +b != obj.head(ok or not b) +b != obj.head(ok) +b != obj.obj +b != obj.obj.obj +b != obj?.a +b != obj?.a ** b +b != obj?.b +b != obj?.head(div) +b != obj?.head(false, ok) +b != obj?.head(map(obj, add)) +b != obj?.head(not (0 == 0)) +b != obj?.head(obj) +b != obj?.obj +b != obj?.obj.obj +b != obj?.obj?.a +b % (0 + b) +b % (0 - a) +b % (b - a) +b % -1 +b % -a +b % -obj.b +b % -obj?.b +b % 1 - f - b +b % 1 / 0.5 +b % 2 >= obj?.head(f) +b % 2 in arr +b % a +b % a % a +b % a % b +b % a * a +b % a * f +b % a + 0.5 + b +b % a - a +b % a - f +b % a .. b +b % a / a +b % a <= a +b % a == b +b % a > b +b % a in arr +b % add(0, b) +b % add(1, 2) +b % add(a, a) +b % arr[a] +b % arr[obj?.b] +b % b +b % b != a +b % b % obj.a +b % b * b +b % b + -0.5 +b % b - b +b % b - f +b % b < a +b % b < f +b % b <= f ? s : s +b % b == b +b % get(arr, b) +b % max(0, a) +b % obj.a +b % obj.b +b % obj.fn(1) +b % obj.head(a, div) +b % obj.obj.a +b % obj?.a +b % obj?.b +b % obj?.fn(b) +b % obj?.head(a) +b % obj?.head(a, obj) +b % obj?.head(b) +b % obj?.head(b, ok, div) +b % obj?.head(obj, false).b +b % obj?.obj?.a +b % obj?.obj?.b +b * (0 + f) +b * (2 + 0.5) +b * (a + f) +b * (a - 1) +b * -0 +b * -0.5 +b * -a +b * -b +b * -f +b * 0 != a +b * 0 * 0 +b * 0 ** 1 +b * 0 - get(arr, a) +b * 0 .. a +b * 0 / a +b * 0 / f +b * 0 < b +b * 0 >= b +b * 0 >= f +b * 0.5 / (b - b) +b * 0.5 / b +b * 0.5 <= f +b * 0.5 == b +b * 1 * a +b * 1 * min(b) +b * 2 == f +b * 2 > obj.b +b * a +b * a * a +b * a ** f +b * a + a +b * a - a +b * a .. b +b * a / 0.5 +b * a <= f +b * a == 0.5 - f +b * a == obj?.a +b * a > 2 ** f +b * a > f +b * a ^ 0 +b * abs(0) +b * abs(a) +b * abs(b) +b * add(2, b) +b * b +b * b != 0 % a +b * b != f +b * b % a +b * b * obj.a +b * b + b +b * b - obj.a +b * b / a +b * b / f +b * b / obj?.a +b * b == f +b * b == len(s) +b * b > f +b * b ^ a +b * b in arr +b * f +b * f * 0 +b * f * 2 +b * f * b +b * f + b +b * f + obj.a +b * f / b +b * f <= a == true +b * f <= b +b * f == b +b * f ^ 0.5 +b * first(arr) +b * float(0.5) +b * float(f) +b * get(arr, 0) +b * get(arr, 1) +b * int(a) +b * max(2) +b * obj.a +b * obj.b +b * obj.fn(b) +b * obj.head(a) +b * obj.head(b) +b * obj.obj.a +b * obj.obj.b +b * obj.obj?.a +b * obj.obj?.b +b * obj?.a +b * obj?.b +b * obj?.fn(obj.b) +b * obj?.fn(obj?.b) +b * obj?.head(b, a) * obj.a +b * obj?.head(f) +b * obj?.head(f, f < 0) +b * obj?.obj.b +b ** (0 * 0.5) +b ** (0 * f) +b ** (0 - a) +b ** (0 / b) +b ** (1 % 1) +b ** (2 * a) +b ** (a % b) +b ** (a - a) +b ** (b + b) +b ** (b / f) +b ** (f * b) +b ** (f + 0) +b ** (f - 0) +b ** (f - 2) +b ** (f / f) +b ** -a +b ** -b +b ** 0 * b * a +b ** 0 - b +b ** 0 < f +b ** 0 < obj?.fn(2) +b ** 0 == a +b ** 0 ^ a ** f +b ** 0 ^ obj.b +b ** 0.5 ** a +b ** 0.5 ** f +b ** 0.5 + obj?.a +b ** 0.5 >= b +b ** 0.5 ^ (a * b) +b ** 0.5 ^ b +b ** 1 / a +b ** 1 / f +b ** 2 ** a +b ** 2 ** b +b ** 2 + 0.5 ^ f +b ** 2 - a +b ** a +b ** a != obj?.a +b ** a != obj?.b +b ** a * b +b ** a * obj.b +b ** a ** b +b ** a + obj?.head(0) +b ** a - obj?.fn(b) +b ** a / b +b ** a / obj.fn(a) +b ** a < a +b ** a == obj?.fn(b) +b ** a > b +b ** a ^ 2 +b ** a ^ a +b ** arr[0] +b ** arr[a] +b ** b +b ** b * obj?.b +b ** b ** 0 +b ** b ** 0.5 +b ** b + a +b ** b < a % 2 +b ** b ^ f +b ** div(a, a) +b ** div(b, 2) +b ** f +b ** f != f +b ** f != obj.a +b ** f * a +b ** f * f +b ** f * obj.b +b ** f ** f +b ** f < 0 * 0.5 +b ** f < b +b ** f ^ a +b ** f ^ b +b ** int(0.5) +b ** int(a) +b ** int(b) +b ** max(1) +b ** max(a, a, f) +b ** min(1) +b ** obj.a +b ** obj.b +b ** obj.fn(2) +b ** obj.fn(b) +b ** obj.head(a) +b ** obj.head(b) +b ** obj.obj?.a +b ** obj.obj?.b +b ** obj?.a +b ** obj?.b +b ** obj?.fn(b) +b ** obj?.head(0.5) +b ** obj?.head(0.5, arr, "c") +b ** obj?.head(b, arr) +b ** obj?.obj.b +b ** obj?.obj?.a +b + -2 +b + -b +b + -f +b + 0 % b +b + 0 + a +b + 0 + b +b + 0 - b +b + 0 - obj.head(0.5, obj, div, obj, a) +b + 0 >= a +b + 0 ^ 1 +b + 0.5 != b - 0 +b + 0.5 + -0 +b + 0.5 + a % a +b + 0.5 / 2 +b + 0.5 / b +b + 0.5 >= b ? "c" : arr +b + 1 == obj.obj +b + 2 < -b +b + 2 < b +b + 2 <= b +b + 2 == obj.b +b + 2 ^ 0 +b + a +b + a != 1 * b +b + a != obj.obj +b + a % a +b + a ** 0 +b + a .. a +b + a .. b +b + a < a == false +b + a <= b +b + a > a +b + add(b, a) +b + b +b + b % b +b + b - a +b + b - obj?.head(0.5) +b + b / 1 +b + b / b +b + b <= a +b + b == a +b + b >= get(arr, 0) +b + b ^ 1 +b + count(arr, true) +b + div(0, 1) +b + f +b + f != b ? nil : f +b + f ** a +b + f + a +b + f - b +b + f - b - b +b + f - obj.fn(a) +b + f == f +b + f == obj?.a +b + f > b +b + f > div(2, a) +b + float(0.5) +b + int(f) +b + len("c") +b + max(f) +b + min(0.5) +b + obj.a +b + obj.a > f +b + obj.b +b + obj.head(b) +b + obj.head(f, "c", 0) +b + obj.head(f, 1, 0.5) +b + obj.obj.a +b + obj.obj.b +b + obj.obj?.b +b + obj?.a +b + obj?.b +b + obj?.head(0, 0.5, nil, b, obj) +b + obj?.head(0, add) +b + obj?.head(1, a, obj, obj) +b + obj?.head(b) +b + obj?.obj.b +b + obj?.obj?.a +b + obj?.obj?.b +b - -2 +b - -b +b - -f +b - 0 - 0 +b - 0 == a ? obj : false +b - 0 > b +b - 0 > f +b - 0 ^ 0 +b - 0.5 != f +b - 0.5 / b +b - 1 - b +b - 1 .. b +b - 1 / 0 +b - 1 / 2 +b - 1 / a +b - 1 / f +b - 1 < b +b - 1 <= add(b, 0) +b - 2 ** 2 +b - 2 - 2 +b - 2 / a +b - 2 < b +b - a +b - a % b +b - a * f +b - a ** 1 +b - a + f +b - a - 0.5 +b - a .. a +b - a == a +b - a == f +b - a ^ 0 +b - a ^ b +b - a in arr +b - abs(0) +b - add(2, b) +b - add(a, 0) +b - arr[0] +b - arr[obj.b] +b - b +b - b + a +b - b - b +b - b - f +b - b .. a +b - b < a +b - b < a ^ 0.5 +b - b ^ 0 +b - b ^ f +b - div(2, 2) +b - div(a, a) +b - f +b - f ** a +b - f + 0 +b - f + 1 +b - f + obj?.b +b - f - 0 ** a +b - f - 0.5 +b - f - f +b - f < f +b - f == a +b - f >= len(arr) +b - get(arr, a) +b - int(0.5) +b - max(0, a) +b - max(a) +b - min(2) +b - obj.a +b - obj.a + a +b - obj.a == b +b - obj.b +b - obj.fn(b) +b - obj.fn(true && a) +b - obj.head(0, obj) +b - obj.head(f, 2, f) +b - obj.obj.a +b - obj.obj?.a +b - obj?.a +b - obj?.b +b - obj?.fn(b) +b - obj?.head(1) +b - obj?.head(f) +b - obj?.obj.b +b - obj?.obj?.a +b - obj?.obj?.b +b .. -2 +b .. -a +b .. -b +b .. 0 * a +b .. 0 + b +b .. 0 == obj.b +b .. 1 * 2 +b .. a +b .. a % a +b .. a + b +b .. add(a, count(arr, false)) +b .. add(b, 0) +b .. add(b, a) +b .. add(b, b) +b .. arr[b % 2] +b .. b +b .. b * a +b .. b + b +b .. count(arr, ok) +b .. first(obj.head("b", obj)) +b .. get(arr, 0) +b .. get(arr, b) +b .. len(s) +b .. min(b) +b .. obj.a +b .. obj.b +b .. obj.head(b) +b .. obj?.a +b .. obj?.b +b .. obj?.fn(a) +b .. obj?.head(2) +b .. obj?.head(a) +b .. obj?.head(obj, s, div)?.b +b .. obj?.obj.b +b .. obj?.obj?.a +b / (0 + 0) +b / (1 + b) +b / (a + f) +b / (a - 0.5) +b / (a - 2) +b / (b - b) +b / (f + b) +b / (f - f) +b / -0 +b / -0.5 +b / 0 * f +b / 0 - b +b / 0 / a +b / 0 < a +b / 0 > b +b / 0 > b ? f : s +b / 0 >= f +b / 0.5 * a +b / 0.5 * f +b / 0.5 ** 2 +b / 0.5 + b +b / 0.5 - b +b / 0.5 <= a +b / 0.5 <= obj?.a +b / 0.5 >= 0.5 ? obj : arr +b / 1 / b +b / 2 != a +b / 2 <= abs(1) +b / 2 ^ 2 +b / a +b / a != a +b / a != obj.obj +b / a ** f +b / a + a +b / a + b +b / a / 0 +b / a / a +b / a / b +b / a == obj?.b +b / a > 2 ? div : arr +b / a > b +b / add(1, a) +b / add(a, a) +b / add(b, 1) +b / add(b, b) +b / arr[a] +b / b +b / b * 0 ** b +b / b ** f +b / b < b +b / b < obj.b +b / b <= b +b / b ^ 0 +b / f +b / f != a +b / f != abs(0.5) +b / f * f +b / f ** 0.5 +b / f + b +b / f / f +b / f < f +b / f <= b +b / f <= f +b / f <= obj?.a +b / f == a +b / f >= a +b / get(arr, 0) +b / get(arr, b) +b / int(a) +b / min(1) +b / min(b) +b / obj.a +b / obj.b +b / obj.fn(2) +b / obj.fn(a) +b / obj.fn(b) +b / obj.head(a, arr, add, a) +b / obj.obj.a +b / obj.obj.b +b / obj.obj?.obj.a +b / obj?.a +b / obj?.b +b / obj?.head(b, arr, f) +b / obj?.obj.a +b / obj?.obj.b +b < -2 +b < 0 != obj.b +b < 0 % b +b < 0 + 1 +b < 0 - a +b < 0 or ok +b < 0 || ok +b < 0.5 ? a : b +b < 0.5 ? nil : div +b < 1 == ok +b < 1 ? b : 0 +b < 2 && obj.fn(b) +b < 2 ** 1 +b < 2 / 1 +b < 2 / a +b < 2 ^ a +b < a +b < a ** 0.5 +b < a + a +b < a - 1 +b < a - f +b < a / b +b < a ? "a" : obj +b < a ? 0 : nil +b < a ? div : s +b < a ? obj : f +b < a ^ a and obj.head("c", 2)?.a +b < a ^ f +b < a and ok +b < add(b, 1) +b < add(b, a) +b < b +b < b && ok +b < b - 1 +b < b == ok +b < b ? b : true +b < b ? f : arr +b < b ? nil : ok +b < b ? s : s +b < b ^ b +b < b and "b" in obj +b < b and nil != 0 +b < b and obj.a +b < b and ok +b < b or obj?.a +b < f +b < f != ok +b < f ** b +b < f == ok +b < f ? 1 : div +b < f ? obj : b +b < f ? obj.fn(arr, nil, nil, div) : obj +b < f ? ok : s +b < float(0) +b < float(b) +b < int(0) +b < int(f) +b < obj.a +b < obj.a != obj?.obj +b < obj.b +b < obj.head(f) +b < obj.obj.a +b < obj?.a +b < obj?.b +b < obj?.b == true != obj.a +b < obj?.fn(0) +b < obj?.head(0) +b < obj?.head(0, s, a) +b < obj?.head(b) +b < obj?.head(b, nil) +b < obj?.obj?.a +b < obj?.obj?.b +b <= -0 +b <= -1 +b <= -a +b <= 0 != ok +b <= 0 % b +b <= 0 && obj[s] +b <= 0 * 0.5 +b <= 0 - 0.5 +b <= 0.5 + 0.5 +b <= 0.5 ? ok : b +b <= 1 - f +b <= 1 ? b : a +b <= 1 || ok +b <= 2 ? s : obj +b <= 2 and ok +b <= a +b <= a * 1 +b <= a ** 0 +b <= a == nil +b <= a ? 0 : div +b <= a ? obj : arr +b <= a ^ a +b <= a || obj?.a +b <= a || ok +b <= abs(a) +b <= abs(f) +b <= add(b, 1) +b <= arr[b] +b <= b +b <= b != nil +b <= b % b +b <= b * a +b <= b + b +b <= b / f +b <= b ? add : ok +b <= b ^ b +b <= b or b < b +b <= b or obj.b +b <= b || ok +b <= count(arr, ok) +b <= div(b, b) +b <= f +b <= f != false +b <= f != ok +b <= f != ok ? arr : add +b <= f * f +b <= f ** f +b <= f + b +b <= f - obj?.b +b <= float(b) +b <= get(arr, 0) +b <= int(a) +b <= int(arr[0]) +b <= len(keys(obj)) +b <= max(0) +b <= max(a) +b <= max(f, f, a, f, f) +b <= min(b, 0) +b <= obj.a +b <= obj.b +b <= obj.head(1) +b <= obj.head(a, 0) +b <= obj.head(b) +b <= obj.obj.b +b <= obj?.a +b <= obj?.b +b <= obj?.fn(a) +b <= obj?.fn(arr[0.5]) +b <= obj?.head(0, ok, false) +b <= obj?.obj.a +b == -0.5 +b == -b +b == -f +b == 0 != true ? b : arr +b == 0 * 0 +b == 0 + 0 +b == 0 / a +b == 0 == obj.b +b == 0 ? arr : a +b == 0 ? s : 0.5 +b == 0 and obj?.obj +b == 0 or obj?.head(s) +b == 0 || obj.obj +b == 0.5 != obj.head(a, s, ok) +b == 1 + obj.a +b == 1 ? add : false +b == 1 ^ b +b == 2 ^ a +b == a +b == a != nil +b == a / 1 +b == a == nil +b == a ? a : b +b == a ? div : ok +b == a ? f : false +b == a ? f : ok +b == a or ok +b == abs(f) +b == add(0, b) +b == add(a, 2) +b == add(a, a) +b == add(a, b) +b == arr[a] +b == arr[b] +b == b +b == b != obj?.obj +b == b != ok +b == b && 0 != 0 +b == b * 2 +b == b - a +b == b - b +b == b / 0.5 +b == b / b +b == b == not false +b == b or f < 0 +b == div(b, a) +b == f +b == f && ok +b == f * 0 +b == f - b +b == f == ok +b == f ? add : div +b == f or ok +b == f || obj.b +b == float(b) +b == get(arr, 0) +b == get(arr, 1) +b == get(obj.head(nil, 0.5, div), a) +b == int(0) +b == len("a") +b == max(f) +b == min(0) +b == nil != obj.a +b == obj.a +b == obj.b +b == obj.b != obj.obj +b == obj.fn(0) +b == obj.fn(a) +b == obj.fn(add(a, 1)) +b == obj.fn(b) +b == obj.head(arr) +b == obj.head(div) +b == obj.head(f) +b == obj.head(obj?.head(ok, 0, div)) +b == obj.head(ok, b, 2) +b == obj.head(one(arr, ok)) +b == obj.head(true, add, div) +b == obj.obj +b == obj?.a +b == obj?.b +b == obj?.head("b") +b == obj?.head(0) +b == obj?.head(a) +b == obj?.head(div) +b == obj?.head(nil, add, ok) +b == obj?.head(obj).a +b == obj?.head(obj?.b) +b == obj?.head(s) +b == obj?.obj +b == obj?.obj.b +b == obj?.obj?.obj +b == obj[s] +b > 0 != true +b > 0 - 2 +b > 0 / a +b > 0 || ok +b > 0 || ok ? 0 : a +b > 0.5 ? arr : div +b > 0.5 ^ 2 +b > 0.5 || nil == "a" +b > 0.5 || obj.head(1 .. s.obj) +b > 1 * f +b > 1 ? 0 : 0 +b > 1 ? false : f +b > 1 and 2 <= b +b > 2 != ok +b > 2 ? "a" : false +b > a +b > a != false +b > a != nil +b > a * a +b > a * f +b > a ** 0 +b > a ** b +b > a ** f +b > a / 2 +b > a / obj?.b +b > a ^ b +b > a or 0.5 > 2 +b > a or a != 0 +b > a || f != 0 +b > a || obj?.fn(div, arr).obj +b > a || ok +b > abs(0.5) +b > arr[0] +b > arr[a] +b > b +b > b % a +b > b * 0.5 +b > b * f +b > b ** a +b > b + f +b > b - 0.5 +b > b - f +b > b ? ok : ok +b > b ? ok : s +b > b ^ a +b > b or obj?.head(a, 1) +b > b || ok +b > div(a, -b) +b > div(b, a) +b > f +b > f != obj?.b +b > f * a +b > f / b +b > f == obj.b +b > f ? arr : div +b > f ? b : s +b > f ? f : "c" +b > f ^ b +b > f and not ok +b > f or obj.obj +b > float(b) +b > float(f) +b > int(0) +b > len(obj) +b > obj.a +b > obj.b +b > obj.fn(a) +b > obj.head(f) +b > obj.obj.b +b > obj?.a +b > obj?.b +b > obj?.head(0) +b > obj?.head(0.5, 0) +b > obj?.obj.a +b > obj?.obj?.b +b >= -a +b >= -b +b >= -f +b >= 0 != ok +b >= 0 - b +b >= 0 ? 0.5 : true +b >= 0 ? add : arr +b >= 0 ? s : "c" +b >= 0 ^ 0.5 +b >= 0 and obj.head(s, f, arr, 0) +b >= 0.5 == ok +b >= 0.5 ? f : 0 +b >= 0.5 and obj.a +b >= a +b >= a - 0.5 +b >= a == nil +b >= a ? obj.obj : add +b >= a ^ f +b >= a and 0.5 >= b +b >= abs(1) +b >= b +b >= b % a +b >= b % b +b >= b && nil != arr +b >= b ** 0 +b >= b ** obj.b +b >= b + 0.5 +b >= b and obj.b +b >= b in obj?.head(nil, 0.5)?.obj +b >= b or obj.fn(b)?.a +b >= b || f - obj?.obj +b >= div(a, b) +b >= div(b, a) +b >= div(b, b) +b >= f +b >= f != false +b >= f ** b +b >= f ? 0.5 : s +b >= f ? nil : false +b >= f ^ 0.5 +b >= f ^ b +b >= f || a == f +b >= f || obj?.head(nil, s) +b >= int(0) != obj?.obj +b >= int(a) +b >= last(arr) +b >= min(b) +b >= obj.a +b >= obj.b +b >= obj.head(a) +b >= obj.head(f, arr, add) +b >= obj.obj?.a +b >= obj?.a +b >= obj?.a + a +b >= obj?.b +b >= obj?.b and ok +b >= obj?.fn(0) +b >= obj?.fn(a) +b >= obj?.fn(b) +b >= obj?.head(f) +b >= obj?.obj.a +b ^ (0 * 1) +b ^ (0.5 + 0) +b ^ (0.5 + b) +b ^ (0.5 - a) +b ^ (1 - 0.5) +b ^ (1 / 0) +b ^ (a * b) +b ^ (a - a) +b ^ (a / a) +b ^ (b * a) +b ^ (b + 0) +b ^ (b + 0.5) +b ^ (b / 0) +b ^ (b / b) +b ^ (f * 0) +b ^ (f * 0.5) +b ^ (f + b) +b ^ (f - b) +b ^ (f / 0.5) +b ^ -a +b ^ -b +b ^ 0 != count(arr, ok) +b ^ 0 != f ? arr : obj +b ^ 0 + f +b ^ 0 / f / f +b ^ 0 ^ b +b ^ 0.5 * f +b ^ 0.5 < f +b ^ 0.5 <= f +b ^ 0.5 > obj?.a +b ^ 0.5 >= b +b ^ 1 - f +b ^ 1 == obj?.obj +b ^ 1 > f - f +b ^ 1 ^ b +b ^ 2 < obj.b +b ^ 2 <= a +b ^ 2 > a +b ^ 2 ^ f +b ^ 2 ^ obj?.fn(0) +b ^ a +b ^ a ** (f / a) +b ^ a ** a +b ^ a + f +b ^ a - b + a +b ^ a - max(a) +b ^ a - min(b) +b ^ a <= arr[a] +b ^ a <= f ? add : true +b ^ a == b +b ^ a == obj.obj +b ^ a ^ f +b ^ add(0, a) +b ^ add(2, a) +b ^ add(a, b) +b ^ add(b, 2) +b ^ b +b ^ b < -0.5 +b ^ b < f +b ^ b == 0 / 1 +b ^ b == a +b ^ b == a + 0 +b ^ b > f +b ^ count(arr, true) +b ^ div(0, b) +b ^ div(1, a) +b ^ div(b, a) +b ^ f +b ^ f >= 0 ? b : b +b ^ f ^ 0.5 +b ^ f ^ a +b ^ f ^ b +b ^ get(arr, b) +b ^ int(f) +b ^ len(arr) +b ^ min(f) +b ^ obj.a +b ^ obj.b +b ^ obj.head(1) +b ^ obj.head(b) +b ^ obj.obj?.a +b ^ obj?.a +b ^ obj?.b +b ^ obj?.fn(2) +b ^ obj?.head(0.5, div, a) +b ^ obj?.head(a, a) +b ^ obj?.head(b) +b ^ obj?.obj.a +b ^ obj?.obj?.a +b ^ obj?.obj?.b +b in arr +b in arr && true ? obj : div +b in arr == not ok +b in arr == true +b in arr || nil == obj +b in arr[2:1] +b in filter(arr, ok) +b in map(arr, 0) +b in obj.head(arr) +b in obj.head(nil, b, arr, 0, 0.5)?.a +b in obj[s] +count([f], ok) +count([nil, arr, ok], ok) +count(a .. 0, obj.a) +count(a .. 0, ok || ok) +count(arr, "b" < s) +count(arr, "b" <= "a") +count(arr, "c" > s) +count(arr, # != #) +count(arr, # == f) +count(arr, # >= a) +count(arr, # >= add(b, 0)) +count(arr, 0 != a) +count(arr, 0 != f) +count(arr, 0 <= 0) +count(arr, 0 <= 0.5) +count(arr, 0 == a) +count(arr, 0 > 0.5) +count(arr, 0 > a) +count(arr, 0 > f) +count(arr, 0.5 == 0.5) +count(arr, 0.5 > 0.5) +count(arr, 0.5 >= 0.5) +count(arr, 1 < f) +count(arr, 1 == b) +count(arr, 2 < a) +count(arr, 2 >= f) +count(arr, a <= b) +count(arr, a == nil) +count(arr, a >= 0.5) +count(arr, a >= a) +count(arr, add != div) +count(arr, add == add) +count(arr, all(arr, false)) +count(arr, any(arr, ok)) +count(arr, any(arr, true)) +count(arr, arr == nil) +count(arr, b != b) +count(arr, b <= 1) +count(arr, b == 0) +count(arr, b == b) +count(arr, b > 1) +count(arr, b >= 1) +count(arr, b >= a) +count(arr, b in arr) +count(arr, f != nil) +count(arr, f < b) +count(arr, f > a) +count(arr, false or false) +count(arr, false) % b +count(arr, false) + abs(0.5) +count(arr, false) == a +count(arr, false) == f +count(arr, false) > f +count(arr, false) >= f + 0 +count(arr, false) >= obj?.a +count(arr, false) ^ f +count(arr, false) in arr +count(arr, nil != 0) +count(arr, nil != arr) +count(arr, nil != div) +count(arr, nil == 0.5) +count(arr, nil == a) +count(arr, nil == s) +count(arr, not false) +count(arr, obj != obj) +count(arr, obj.head(ok)) +count(arr, obj?.a == arr) +count(arr, ok != ok) +count(arr, ok or 0 > 0.5) +count(arr, ok) +count(arr, ok) != b ? "b" : a +count(arr, ok) % add(0, b) +count(arr, ok) ** a +count(arr, ok) + b +count(arr, ok) - int(a) +count(arr, ok) / a +count(arr, ok) < a +count(arr, ok) == b +count(arr, ok) > a +count(arr, ok) > b +count(arr, ok) > obj.a +count(arr, ok) in arr +count(arr, one(arr, false)) +count(arr, s != s) +count(arr, s contains "c") +count(arr, s endsWith "a") +count(arr, true) * obj?.a +count(arr, true) - b +count(arr, true) <= a +count(arr, true) == b +count(arr, true) > a +count(arr, true) >= arr[b] +count(b .. a, a == 0) +count(b .. a, obj?.head(ok, obj, f, ok, arr)) +count(b .. a, ok) +count(b .. b, not false) +count(b .. b, ok == false) +count(false ? f : obj, not true) +count(false ? true : obj, 2 <= 1) +count(filter(arr, false), obj?.obj) +count(keys(obj), b >= f) +count(keys(obj), ok) +count(map(arr, "b"), ok) +count(map(arr, 0.5), ok) +count(map(arr, a), ok) +count(map(arr, add), ok) +count(map(arr, arr), f == b) +count(map(arr, arr), ok) +count(map(arr, f), ok) +count(map(arr, obj), 0 != b) +count(map(arr, obj), f == f) +count(map(arr, true), #) +count(map(obj.obj, arr), ok) +count(obj.head("b", arr, add), 0.5 == 0.5) +count(obj.head(obj), nil == nil) +count(obj.head(obj, obj, s), ok) +count(obj.head(s), any(arr, false)) +count(obj.head(s, s, arr, add, obj), ok) +count(obj.obj, 0 < 0) +count(obj.obj, all(arr, false)) +count(obj.obj, b > 0) +count(obj.obj, f != 0) +count(obj.obj, nil == s) +count(obj.obj, obj != nil) +count(obj.obj, obj != obj) +count(obj.obj, obj?.head(ok)) +count(obj.obj, ok) +count(obj?.head("a", a), ok) != f +count(obj?.head("c", a, obj), f == 0) +count(obj?.head(s), ok) +count(obj?.head(s, s), f <= a) +count(obj?.obj, "c" >= "c") +count(obj?.obj, 0 == nil) +count(obj?.obj, a != nil) +count(obj?.obj, a == 1) +count(obj?.obj, f >= f) +count(obj?.obj, none(arr, false)) +count(obj?.obj, obj.head(true)) +count(obj?.obj, obj?.head(false)) +count(obj?.obj, ok != true) +count(obj?.obj, ok) +count(values(obj), ok) +count(values(obj), true and ok) +date(s, s) +div +div != add +div != add != true +div != add ? 0.5 : ok +div != add and 1 == f +div != add or ok +div != div +div != div ? arr : b +div != div ? false : false +div != div and 0 >= 2 +div != div or obj?.a +div != nil && obj.b +div != nil == ok ? s : 0 +div != nil == true +div != nil ? s : obj +div != nil ? s : ok +div != nil || obj?.obj +div != obj.a +div != obj.b +div != obj.fn(a) +div != obj.fn(b) +div != obj.head(a) +div != obj.head(div) +div != obj.head(div, "b") +div != obj.head(f, arr) +div != obj.head(obj) +div != obj.head(ok) +div != obj.obj +div != obj.obj.obj +div != obj.obj?.a +div != obj.obj?.obj +div != obj?.a +div != obj?.b +div != obj?.head(add) +div != obj?.head(arr) +div != obj?.head(b, "a") +div != obj?.head(div) +div != obj?.head(f) +div != obj?.head(s) +div != obj?.head(s, arr, 1, true) +div != obj?.obj +div != obj?.obj.obj +div != obj?.obj?.obj +div == add +div == add != obj?.obj +div == add != ok +div == add ? 0 : ok +div == add or ok +div == div +div == div != obj.b +div == div != obj?.b +div == div != ok +div == div == ok +div == div ? 1 / f : obj +div == div ? obj : div +div == get(obj, s) +div == nil ? "a" : "c" +div == nil ? 0 : b +div == nil ? a : true +div == nil ? ok : arr +div == nil or obj.obj +div == nil or obj?.a +div == nil || ok ? obj : true +div == obj.a +div == obj.b +div == obj.head(a, b) +div == obj.head(arr, nil, false, obj) +div == obj.head(f) +div == obj.head(f, a, nil) +div == obj.head(obj) +div == obj.head(ok) +div == obj.head(true, obj) +div == obj.obj +div == obj.obj?.b +div == obj?.a +div == obj?.b +div == obj?.head(arr) +div == obj?.head(b) +div == obj?.head(obj) +div == obj?.head(ok) +div == obj?.head(s) +div == obj?.obj +div == obj?.obj.a +div == obj?.obj?.b +div in map(arr, add) +div in obj?.head(nil) +div in obj[s]?.b +div(-1, b) +div(-a, a) +div(-a, get(arr, 2)) +div(-a, obj.b) +div(-b, a + 2) +div(-b, a) +div(-b, b) +div(-obj.head(a, s), b) +div(0 * a, a) +div(0 * obj.b, a) +div(0 - a, a) +div(0, 1) != count(arr, false) +div(0, 1) % b +div(0, 1) + b ^ f +div(0, 1) - b +div(0, 2) ** b +div(0, 2) < b +div(0, 2) > obj.a +div(0, 2) >= abs(0.5) +div(0, a) != f +div(0, a) * b +div(0, a) .. obj.fn(b) +div(0, a) < b +div(0, a) <= b +div(0, a) ^ a +div(0, a) ^ f +div(0, a) in arr +div(0, b) != b +div(0, b) + b +div(0, b) + obj.a +div(0, b) + obj?.a +div(0, b) < a +div(0, b) > b +div(0, b) >= b +div(1 - b, a) +div(1, 2) % a +div(1, 2) * f ** b +div(1, 2) / -2 +div(1, 2) >= f +div(1, a) ** b +div(1, a) - b +div(1, a) / obj?.a +div(1, a) < a ? s : ok +div(1, b) - obj.a +div(1, b) - obj?.a +div(1, b) > b +div(2 % 1, min(1)) +div(2 * 0, a) +div(2 * 2, obj?.b) +div(2 + b, b) +div(2, 2) * a +div(2, a) + 1 ** 1 +div(2, a) == b ? obj : 0 +div(2, a) > obj?.a +div(2, b) != obj?.obj +div(2, b) % a +div(2, b) ** a +div(2, b) - b +div(2, b) / a +div(a % a, a) +div(a % a, obj.b) +div(a * 0, b) +div(a * 2, b) +div(a * b, obj.b) +div(a * b, obj?.b) +div(a - 1, b) +div(a - 2, b) +div(a - b, get(arr, 0)) +div(a, -2) +div(a, -a) +div(a, 0 + a) +div(a, 1) % a +div(a, 1) ** obj.a +div(a, 1) - a +div(a, 1) < b +div(a, 1) < obj?.a +div(a, 1) <= obj.b +div(a, 1) == a +div(a, 1) >= a * b +div(a, 2) ** a +div(a, 2) + obj.b +div(a, 2) < a +div(a, 2) <= f ? s : s +div(a, 2) <= obj.b +div(a, 2) == b +div(a, 2) > obj.b +div(a, 2) ^ obj?.a +div(a, a * a) +div(a, a - 0) +div(a, a) +div(a, a) != 0 ? a : add +div(a, a) != obj?.b +div(a, a) % b +div(a, a) * obj?.b +div(a, a) ** b +div(a, a) - f +div(a, a) .. b +div(a, a) / get(arr, 0) +div(a, a) <= 2 ? b : "b" +div(a, a) == b +div(a, a) > 0 ? div : s +div(a, a) > a +div(a, a) > f +div(a, a) >= a +div(a, a) >= b +div(a, a) ^ -f +div(a, a) ^ f +div(a, abs(b)) +div(a, add(0, b)) +div(a, add(2, 0)) +div(a, add(a, 0)) +div(a, add(a, b)) +div(a, add(b, 0)) +div(a, b + 0) +div(a, b) +div(a, b) % a +div(a, b) % b +div(a, b) ** (a % 1) +div(a, b) ** a +div(a, b) ** f +div(a, b) + div(a, b) +div(a, b) + f ^ a +div(a, b) .. a +div(a, b) / a +div(a, b) < obj?.a +div(a, b) <= b +div(a, b) ^ get(arr, a) +div(a, div(a, 1)) +div(a, div(a, a)) +div(a, div(b, 1)) +div(a, div(b, b)) +div(a, false ? b : a) +div(a, get(arr, a)) +div(a, get(arr, b)) +div(a, int(1)) +div(a, int(a)) +div(a, last(arr)) +div(a, len(s)) +div(a, max(2)) +div(a, min(a)) +div(a, obj.a) +div(a, obj.b) +div(a, obj.fn(0)) +div(a, obj.fn(b)) +div(a, obj.head(1, obj)) +div(a, obj.obj?.a) +div(a, obj.obj?.b) +div(a, obj?.a) +div(a, obj?.b) +div(a, obj?.head(b)) +div(a, true ? 2 : div) +div(abs(a), b) +div(abs(b), a) +div(add(0, a), b) +div(add(2, a), a) +div(add(2, a), b) +div(add(a, 0), max(a)) == a +div(add(a, a), obj.b) +div(add(a, b), -2) +div(add(b, 0), a) +div(add(b, b), obj?.b) +div(arr[1], a * b) +div(arr[b], div(b, b)) +div(b % a, a) +div(b % a, obj.a) +div(b % b, a) +div(b % b, b) +div(b * 0, obj.a) +div(b * a, a) +div(b * a, obj?.b) +div(b, -a) +div(b, 1) % obj.b +div(b, 1) * max(a) +div(b, 1) / a +div(b, 1) >= 0 ^ f +div(b, 2 * b) +div(b, 2) ** add(b, a) +div(b, 2) ** f +div(b, 2) ** f ** 1 +div(b, 2) + float(0) +div(b, 2) > b +div(b, 2) in arr +div(b, a + 0) +div(b, a) +div(b, a) != a + 0.5 +div(b, a) != obj?.a +div(b, a) % b +div(b, a) * 0 / b +div(b, a) + a +div(b, a) - f +div(b, a) < a ^ f +div(b, a) < obj.obj.obj.b +div(b, a) <= a +div(b, a) == obj?.obj +div(b, a) > a +div(b, a) >= 0 ? add : "a" +div(b, a) >= obj.b +div(b, a) ^ a +div(b, a) in arr +div(b, add(0, a)) +div(b, add(b, 2)) +div(b, b * a) +div(b, b * b) +div(b, b) +div(b, b) != b +div(b, b) != obj?.obj +div(b, b) * -b +div(b, b) ** a +div(b, b) ** obj?.a +div(b, b) + obj.b +div(b, b) / a +div(b, b) / obj?.a +div(b, b) < f +div(b, b) <= b +div(b, b) <= b != nil +div(b, b) == a +div(b, b) == f +div(b, b) > obj.a +div(b, b) ^ -f +div(b, b) ^ a +div(b, div(b, a)) +div(b, get(arr, 0)) +div(b, int(a)) +div(b, last(arr)) +div(b, obj.a) +div(b, obj.b) +div(b, obj.fn(a)) +div(b, obj.head(a)) +div(b, obj.head(a, nil)) +div(b, obj.head(b)) +div(b, obj?.a) +div(b, obj?.b) +div(b, obj?.head(a)) +div(b, obj?.head(get(arr, 0))) +div(b, ok ? b : s) +div(count(arr, false), b) +div(count(arr, ok), a) +div(count(arr, ok), b) +div(div(2, a), a) +div(div(a, 2), a) +div(div(a, a), b) +div(div(b, b), add(b, 2)) +div(false ? arr : a, a) +div(first(arr), b) +div(first(arr), obj.b) +div(get(arr, 0), b) +div(get(arr, 2), obj.a) +div(get(arr, a), a) +div(get(arr, b), b) +div(int(1 - f), b) +div(int(b), a) +div(int(b), obj.b) +div(int(obj.a), b) +div(last(arr), a) +div(last(arr), b) +div(len(obj), a) +div(len(obj), obj.a) +div(len(obj), obj.fn(a)) +div(len(s), max(2, a)) +div(max(1), b) +div(max(b), b) +div(max(b), obj.b) +div(min(1), b) +div(min(2), a) +div(min(a), b) +div(obj.a, -2) +div(obj.a, a) +div(obj.a, add(b, 1)) +div(obj.a, b) +div(obj.a, obj.b) +div(obj.a, obj?.a) +div(obj.a, obj?.b) +div(obj.b, a + 0) +div(obj.b, a) +div(obj.b, add(b, b)) +div(obj.b, b) +div(obj.b, len("c")) +div(obj.b, obj.b) +div(obj.b, obj.head(2)) +div(obj.b, obj?.a) +div(obj.b, obj?.b) +div(obj.fn(2), a) +div(obj.fn(a), b) +div(obj.fn(b), 0 - a) +div(obj.fn(b), b) +div(obj.head(0, nil), b) +div(obj.head(1), b) +div(obj.head(a, arr), b + b) +div(obj?.a, 1 * a) +div(obj?.a, a) +div(obj?.a, add(a, b)) +div(obj?.a, b) +div(obj?.a, div(b, a)) +div(obj?.a, int(2)) +div(obj?.a, obj.a) +div(obj?.a, obj.fn(2)) +div(obj?.a, obj?.a) +div(obj?.a, obj?.b) +div(obj?.b, -b) +div(obj?.b, a) +div(obj?.b, add(b, 0)) +div(obj?.b, b * 2) +div(obj?.b, b * a) +div(obj?.b, b) +div(obj?.b, div(b, 1)) +div(obj?.b, obj.a) +div(obj?.b, obj.b) +div(obj?.b, obj.head(a, div, nil, nil, nil)) +div(obj?.b, obj?.a) +div(obj?.b, obj?.b) +div(obj?.fn(0), obj.a) +div(obj?.fn(a), int(1)) +div(obj?.head(0), obj?.a) +div(obj?.head(0, 0), a) +div(obj?.head(0, add), b * a) +div(obj?.head(0, b, a, f), obj.head(a)) +div(obj?.head(2), b) +div(obj?.head(a), a) +div(obj?.head(a, a, f, b), b) +div(obj?.head(b, 2), get(arr, b)) +div(obj?.head(b, add, "c", 0.5), len(arr)) +div(obj?.head(b, b), obj?.a) +div(ok ? 1 : a, a) +div(true ? a : f, 0 + b) +div(true ? b : 0.5, b) +duration(string(0)) +duration(toJSON(0)) +f +f != -0.5 +f != 0 % b +f != 0 ? 1 : b +f != 0 || obj?.b +f != 0.5 ? arr : a +f != 0.5 ? obj.b : arr +f != 0.5 ^ a +f != 0.5 and obj.head(div(add)).fn(add(obj && b, div(f), none(0.5, f), div(true, obj, true))?.head(s, arr)) +f != 0.5 and obj?.obj +f != 1 * b +f != 1 / 1 +f != 1 == ok +f != 1 ? 0.5 : a +f != 1 ? arr : "b" +f != 2 != true +f != 2 % b +f != 2 / 0 +f != 2 / a +f != 2 ^ 0 +f != a +f != a != not ok +f != a && ok +f != a ** 0 +f != a - 0.5 +f != a - 2 +f != a / f +f != a == nil +f != a ? add : 0 +f != a ? obj : arr +f != a ? obj.head(0.5, b, 0, obj, 0) : arr +f != a and obj?.a +f != abs(b) +f != add(2, b) +f != arr[0] +f != arr[b] +f != b +f != b != obj.head(div) +f != b % 2 +f != b % a +f != b && obj.b +f != b && s != "b" +f != b ** b +f != b + 0 +f != b ? b : false +f != b ^ 0 +f != b ^ f +f != b and ok ? 0 : nil +f != b or b >= f +f != b or obj.b.head(get(nil, add).b)?.obj +f != f +f != f && obj.obj +f != f - 0 +f != f / b +f != f ? a : s +f != f ? s : "c" +f != f ^ 0.5 +f != f and f >= f +f != f || b <= a +f != f || obj?.head("b") +f != f || ok ? arr : 0 +f != get(arr, 0) +f != get(arr, b) +f != indexOf("a", s) +f != int(a) +f != max(0, f) +f != nil != obj.b +f != nil != ok +f != nil == ok +f != nil ? div : s +f != nil and obj.obj +f != obj.a +f != obj.b +f != obj.fn(b) +f != obj.head("a", false) +f != obj.head(0.5) +f != obj.head(0.5, div) +f != obj.head(1) +f != obj.head(b, ok, false) +f != obj.head(div, false, f, b) +f != obj.head(ok) +f != obj.obj +f != obj.obj || ok +f != obj.obj.a +f != obj?.a +f != obj?.b +f != obj?.fn(a) +f != obj?.head(0) +f != obj?.head(a, "b", 0) +f != obj?.head(arr, div, 0, div, 0) +f != obj?.head(b) +f != obj?.head(div) +f != obj?.head(f, nil, f) +f != obj?.head(false) +f != obj?.head(get(obj, ok)) +f != obj?.head(nil) +f != obj?.head(nil, add, f) +f != obj?.head(nil, s)?.b +f != obj?.head(obj?.obj) +f != obj?.head(s) +f != obj?.obj +f != obj?.obj.obj +f != obj?.obj?.a +f * (0.5 - a) +f * (a + 0) +f * (b + b) +f * (b - f) +f * -(a + b) +f * -0.5 +f * -f +f * -obj?.b +f * 0 ** 0 +f * 0 ** 1 +f * 0 == b ? div : f +f * 0 >= obj.head(0, add, div) +f * 0.5 != a +f * 0.5 != f +f * 0.5 * 2 +f * 0.5 / 1 +f * 0.5 / b +f * 0.5 >= f ^ 0 +f * 0.5 ^ 0.5 +f * 1 * a +f * 1 == b +f * 2 - f * 0.5 +f * 2 >= a + a +f * a +f * a != obj?.b +f * a + f +f * a / (0 + f) +f * a / (f + b) +f * a / b +f * a / f +f * a / obj.fn(b) +f * a < a +f * a <= -0 +f * a == obj?.b +f * a > a +f * a ^ b +f * abs(b) +f * add(a, 0) +f * arr[0] +f * arr[a] +f * b +f * b != 0 + a +f * b * f +f * b / -a +f * b / 0.5 +f * b / b ** b +f * b == f +f * b ^ 0 +f * f +f * f != a +f * f != b +f * f != obj.a +f * f + 0 ^ 0 +f * f == b +f * f ^ a +f * get(arr, a) +f * int(0) +f * int(f) +f * min(0) +f * obj.a +f * obj.a < b +f * obj.b +f * obj.fn(a) +f * obj.head(f) +f * obj.obj.b +f * obj.obj?.b +f * obj?.a +f * obj?.a ^ f +f * obj?.b +f * obj?.fn(0) +f * obj?.head(0, a) +f * obj?.obj.b +f * obj?.obj?.a +f ** (0 % a) +f ** (0 % b) +f ** (0.5 + f) +f ** (0.5 / b) +f ** (2 + a) +f ** (2 + f) +f ** (2 - f) +f ** (2 / 0) +f ** (2 / f) +f ** (a * 0) +f ** (a * 2) +f ** (a * b) +f ** (a + a) +f ** (a - a) +f ** (a - f) +f ** (a / b) +f ** (b * a) +f ** (b + 1) +f ** (b + b) +f ** (b - a) +f ** (b / 0) +f ** (f * 0) +f ** (f * f) +f ** -0.5 +f ** 0 != f +f ** 0 * obj?.a +f ** 0 + obj?.head(b, add) +f ** 0 / obj?.b +f ** 0 < 0 * 0 +f ** 0 < f +f ** 0 >= b +f ** 0.5 != f +f ** 0.5 - b +f ** 0.5 / obj.fn(b) +f ** 0.5 >= b +f ** 0.5 ^ a +f ** 1 != a +f ** 1 / min(f) +f ** 1 <= b +f ** 2 * a +f ** 2 ** 0 +f ** 2 - b +f ** 2 ^ obj?.a +f ** a +f ** a ** 0 ** f +f ** a < a / f +f ** a <= b +f ** a <= max(f) +f ** a > obj.b +f ** a >= b +f ** a ^ b +f ** add(1, a) +f ** arr[0] +f ** arr[add(1, a)] +f ** arr[obj.a] +f ** arr[obj?.head(b)] +f ** b +f ** b != 1 ** 2 +f ** b ** a +f ** b ** f +f ** b ** obj?.fn(b) +f ** b + a / f +f ** b / f +f ** b < float(f) +f ** b <= b +f ** b <= f +f ** b > b +f ** f +f ** f != b / 0 +f ** f - f +f ** f > b +f ** f >= a +f ** f ^ 1 +f ** get(arr, a) +f ** int(f) +f ** len(arr) <= a +f ** max(b, 1) +f ** min(a) +f ** obj.a +f ** obj.b +f ** obj.head(0) +f ** obj.head(add(0, b)) +f ** obj.obj.b +f ** obj?.a +f ** obj?.b +f ** obj?.fn(a) +f ** obj?.head(2, s) +f ** obj?.head(a) +f ** obj?.head(b, add, obj) +f ** obj?.obj.a +f + -0.5 +f + -f +f + 0 + a +f + 0 - b +f + 0 < a +f + 0 == a +f + 0 == add(b, b) +f + 0.5 * b +f + 0.5 - b +f + 0.5 <= a +f + 0.5 ^ 1 +f + 1 ** b +f + 1 - f +f + 1 >= obj?.b +f + 2 < obj.b +f + 2 == b +f + 2 >= max(b) +f + a +f + a != last(arr) +f + a * 2 +f + a + 2 +f + a / 0 +f + a >= obj?.a +f + a ^ a +f + a ^ f +f + add(b, 2) +f + add(b, a) +f + b +f + b != a +f + b ** 2 +f + b ** b +f + b + 2 +f + b + b +f + b - a +f + b - f +f + b ^ 2 +f + count(arr, false) +f + div(2, 1) +f + div(b, a) +f + div(b, b) +f + f +f + f != f +f + f + 1 +f + f + a +f + f + a ** 0 +f + f - b +f + f / 2 +f + f / a +f + f < f +f + f > b +f + float(0) +f + get(arr, a) +f + int(b) +f + len("a") +f + min(0.5) +f + obj.a +f + obj.b +f + obj.head(0.5) +f + obj.head(f) +f + obj.obj.obj.b +f + obj.obj?.a +f + obj?.a +f + obj?.b +f + obj?.b .. a +f + obj?.fn(0) +f + obj?.fn(b) +f + obj?.obj.a +f + obj?.obj?.a +f - -f +f - 0 != a +f - 0 * a +f - 0 ** a +f - 0 + a +f - 0 - 2 +f - 0 >= a % a +f - 0.5 != b +f - 0.5 ** b +f - 1 - a +f - 1 == 0 ? arr : f +f - 1 > obj?.b +f - 2 + 1 +f - 2 >= f +f - a +f - a % a +f - a + 0 +f - a + b +f - a - a +f - a < b +f - a < obj.fn(b) +f - a < obj?.b +f - a > b ** a +f - a >= b +f - add(b, b) +f - arr[1] +f - arr[b] +f - arr[obj?.a] +f - b +f - b != b +f - b * f +f - b + f +f - b + obj.head(b) +f - b - b +f - b / a +f - b / b +f - b < 0 ? 1 : 0 +f - b <= abs(a) +f - b <= b - 0.5 +f - b == obj.obj +f - b > f +f - b >= a ? div : ok +f - b >= f +f - div(a, b) +f - f +f - f + a +f - f - div(a, b) +f - f / 2 +f - f / b +f - f < a +f - f <= obj.a +f - f == b +f - f == div(0, a) +f - float(1) +f - float(f) +f - get(arr, b) +f - int(0) +f - int(2) +f - obj.a +f - obj.b +f - obj.head(b) +f - obj.obj.a +f - obj.obj.obj.a +f - obj.obj?.b +f - obj?.a +f - obj?.b +f - obj?.head(f) +f - obj?.head(f, a, add) +f - obj?.obj.b +f / (0 - f) +f / (0.5 + b) +f / (1 + 2) +f / (2 + 0) +f / (a + b) +f / (a + f) +f / (b + f) +f / (b - f) +f / (f - a) +f / -a +f / -b +f / -f +f / 0 * 0 +f / 0 * f +f / 0 + obj?.b +f / 0 / a +f / 0.5 != b +f / 0.5 * obj?.a +f / 0.5 - a +f / 0.5 - b +f / 0.5 == obj?.b +f / 1 != obj?.obj?.a +f / 1 / b +f / 2 != nil ? 0.5 : 0 +f / 2 / obj?.b +f / 2 == obj?.b +f / 2 >= f +f / a +f / a != a +f / a != b - 1 +f / a != obj.b +f / a != obj?.b +f / a ** 0 +f / a - f +f / a < 2 ** f +f / a <= b +f / a == a +f / a == b +f / a >= b ^ a +f / a >= obj?.b +f / add(a, 0) +f / add(a, 2) +f / add(a, b) +f / add(b, a) +f / b +f / b != add(0, 1) +f / b * 0 +f / b * b +f / b ** 0.5 +f / b / a +f / b <= b / a +f / b <= f +f / b == b +f / b > a +f / f +f / f != obj.obj?.b +f / f * 0 +f / f ** a +f / f + add(2, b) +f / f - -a +f / f - a ^ a +f / f - f +f / f < a +f / float(0) +f / int(b) +f / len(s) +f / min(0) +f / obj.a +f / obj.b +f / obj.fn(a) +f / obj.head(b) +f / obj.obj.a +f / obj.obj?.a +f / obj?.a +f / obj?.b +f / obj?.fn(0) +f / obj?.fn(1) +f / obj?.fn(2) +f / obj?.fn(a) +f / obj?.head(a, nil) +f / obj?.head(f) +f / obj?.head(f, nil) +f / obj?.obj?.b +f < -0 +f < -0.5 +f < 0 * b +f < 0 - 0 +f < 0 == false +f < 0 ? obj : add +f < 0 ^ b +f < 0 and obj.a +f < 0 or 0.5 != b +f < 0.5 == obj?.b +f < 0.5 == obj?.head("a", div) +f < 0.5 ? b : "b" +f < 0.5 ? nil : add +f < 0.5 ? obj : ok +f < 1 != nil +f < 1 * obj.a +f < 2 - b +f < 2 / 0.5 +f < a +f < a && obj.b +f < a && ok +f < a ** b +f < a + 1 +f < a / f +f < a ? add : div +f < a ? s : "c" +f < a or obj?.a +f < a or ok +f < arr[0] +f < b +f < b != ok +f < b - 0 +f < b ? a : a +f < b ? a : f +f < b ^ 0 +f < b ^ a +f < b and f < 0.5 +f < b or nil == div +f < div(a, a) +f < div(a, b) +f < f +f < f != false +f < f && obj.a +f < f * 0 +f < f * 0.5 +f < f - 0 +f < f - b +f < f == nil +f < f == true +f < f ? 0 : nil +f < f ? 0.5 : a +f < f ^ f +f < f and obj.obj +f < f or obj.b +f < f or obj?.b +f < float(0) +f < float(b) +f < float(f) +f < get(arr, 0) +f < get(arr, b) +f < len(obj) +f < min(0 % b) +f < min(a) +f < obj.a +f < obj.b +f < obj.fn(a) +f < obj.head(0, arr, add, b) +f < obj.head(b, b) +f < obj.head(obj.b) and ok +f < obj.obj?.a +f < obj.obj?.b ^ f +f < obj?.a +f < obj?.b +f < obj?.fn(b) +f < obj?.head(0.5, true, add) +f < obj?.head(a) +f <= -a +f <= -b +f <= -f +f <= 0 % b +f <= 0 * 0 +f <= 0 ? "a" : "c" +f <= 0 ? b : a +f <= 0 ^ b +f <= 0 and obj.obj +f <= 0.5 ** b +f <= 0.5 - b +f <= 0.5 / a +f <= 0.5 ? false : div +f <= 0.5 ? obj : 0 +f <= 0.5 ^ 1 +f <= 0.5 and obj?.head(false) +f <= 1 ** 0 +f <= 1 ** f +f <= 1 - 2 +f <= 2 != false +f <= 2 ? div : nil +f <= 2 ? f : nil +f <= a +f <= a != ok +f <= a % a +f <= a && "c" <= s +f <= a + 0 +f <= a / a +f <= a / b +f <= a ? 1 : 2 +f <= a and b == a +f <= a or ok ? s : s +f <= a || obj.fn(add) +f <= add(2, b) +f <= add(a, b) +f <= arr[a] +f <= arr[b] +f <= arr[div(a, a)] +f <= b +f <= b != ok +f <= b != true +f <= b && ok +f <= b * a +f <= b == nil +f <= b ? arr : add +f <= b ? b : 2 != a +f <= b ^ b +f <= div(a, 1) +f <= f +f <= f - a +f <= f - obj?.b +f <= f / f +f <= f ? a : div +f <= f ? nil : true +f <= f ^ a +f <= f ^ b +f <= f and obj.obj +f <= f or false ? nil : s +f <= f or ok +f <= f || obj?.fn(s, 2)?.obj.fn(b) +f <= float(f) +f <= get(arr, b) +f <= int(a) +f <= last(arr) +f <= obj.a +f <= obj.a ** b +f <= obj.b +f <= obj.fn(0) +f <= obj.head(0, nil) +f <= obj?.a +f <= obj?.b +f <= obj?.head(a) +f <= obj?.obj.a +f <= obj?.obj?.b +f == -0 +f == -b +f == 0 ? b >= 1 : div +f == 0 ? false : s +f == 0.5 == ok +f == 0.5 ? add : add +f == 1 * 0 +f == 1 ** 0.5 +f == 1 ** b +f == 1 / a +f == 1 / f +f == 1 ? true : "c" +f == 2 ? ok : a +f == a +f == a != ok +f == a * 0 +f == a * b +f == a + a +f == a and b < 2 +f == a and obj.head(obj, add) +f == a || obj?.obj +f == abs(b) +f == add(b, 0) +f == arr[b] +f == b +f == b != false +f == b ** 0 +f == b + 0.5 +f == b + b +f == b - 0 +f == b - 2 +f == b == nil +f == b and obj?.b +f == b or not ok +f == div(a, b) +f == div(b, b) +f == f +f == f != nil +f == f ? arr : b +f == f ^ 0 +f == f ^ a +f == int(a) +f == int(b) +f == max(0) +f == max(a) +f == max(b) +f == nil && obj?.fn(count(s == 0, "b" matches div)) +f == nil && ok ? f : obj +f == nil == true ? obj : add +f == nil ? arr : add +f == nil ? nil == div : a +f == nil and obj.fn(s) +f == nil and ok +f == nil || obj?.obj +f == obj.a +f == obj.b +f == obj.b == ok +f == obj.head(1) +f == obj.head(2 != ok) +f == obj.head(b) +f == obj.head(f) +f == obj.head(obj == div) +f == obj.head(obj) +f == obj.head(ok) +f == obj.head(s) +f == obj.obj +f == obj.obj.obj +f == obj.obj?.obj +f == obj.obj?.obj?.b +f == obj.obj?.obj?.obj +f == obj?.a +f == obj?.a % b +f == obj?.b +f == obj?.fn(0) +f == obj?.head(b < 0) +f == obj?.head(b, add) +f == obj?.head(div) +f == obj?.head(div, b, 2, b) +f == obj?.obj +f == obj?.obj.b +f == {"a": b, "b": add, "a": arr}.obj +f > -1 +f > -a +f > -b +f > -f +f > 0 / f +f > 0.5 ** 1 +f > 0.5 == ok +f > 0.5 or not ok +f > 0.5 or obj?.a +f > 1 != ok +f > 1 && s <= s +f > 2 != false +f > 2 - a +f > 2 == obj.b +f > a +f > a != obj.b +f > a * a +f > a + 0 +f > a + f +f > a / 0.5 +f > a ? arr : "c" +f > a ? div : obj +f > a ? f : obj?.obj +f > a || div == nil +f > a || true ? 1 : arr +f > abs(a) +f > add(b, 0) +f > add(b, b) +f > arr[a] +f > arr[obj?.head(0.5)] +f > b +f > b && "a" <= "b" +f > b ** 0 +f > b ** b +f > b ** obj?.a +f > b + 0 +f > b + 1 +f > b == ok +f > b ? obj : f +f > b || obj.head(0) +f > count(arr, true) +f > div(2, a) +f > f +f > f * b +f > f ** 2 +f > f - a +f > f / a +f > f ? obj : nil +f > f ^ b +f > f in obj?.head(nil, "c") +f > f or obj.head(nil) +f > f or obj?.head(obj) +f > int(0) +f > len(obj) +f > obj.a +f > obj.b +f > obj.fn(b) +f > obj.obj.b +f > obj.obj?.a +f > obj.obj?.b +f > obj?.a +f > obj?.b +f > obj?.fn(a) +f > obj?.fn(b) +f > obj?.head(a) +f > obj?.obj.a +f > obj?.obj?.obj?.b +f >= -0 +f >= -1 +f >= -a +f >= 0 != obj?.head(s, f) +f >= 0 ** b +f >= 0 + f +f >= 0 - 0 +f >= 0 / b +f >= 0 == ok +f >= 0 ? nil : div +f >= 0.5 != false +f >= 0.5 ^ a +f >= 1 * b +f >= 1 ? a : add +f >= 1 ? add : true +f >= 1 ? obj : 1 +f >= 1 ^ a +f >= 2 ^ a +f >= a +f >= a % b +f >= a * a +f >= a ? 0 : arr +f >= a and obj?.head(a) +f >= a in obj?.c +f >= a or ok +f >= add(a, a) +f >= arr[b] +f >= b +f >= b != ok +f >= b % 2 +f >= b && ok +f >= b ** a +f >= b + 2 +f >= b + a +f >= b / a +f >= b == false +f >= b == obj.a +f >= b ? s : div +f >= b ^ a +f >= b and obj?.b +f >= count(arr, ok) +f >= div(2, a) +f >= div(b, b) +f >= f +f >= f && false ? f : a +f >= f && ok +f >= f * 0 +f >= f * 0.5 +f >= f ** 0 +f >= f ** a +f >= f == ok +f >= f == true +f >= f ? "b" : 0 +f >= f ? b : f +f >= first(arr) +f >= float(b) +f >= get(arr, a) +f >= obj.a +f >= obj.b +f >= obj.fn(2) +f >= obj.head(0.5, nil) +f >= obj.head(a) +f >= obj.head(b, add) +f >= obj.obj.b +f >= obj.obj?.b +f >= obj?.a +f >= obj?.b +f >= obj?.b && ok +f >= obj?.head(obj, b, 1)?.a +f >= obj?.obj.b +f >= obj?.obj?.a +f ^ (0 + 1) +f ^ (0 + a) +f ^ (0 - b) +f ^ (0.5 * a) +f ^ (1 / a) +f ^ (2 - b) +f ^ (a * 0.5) +f ^ (a * b) +f ^ (a + a) +f ^ (a + b) +f ^ (a - f) +f ^ (a / a) +f ^ (b + 0) +f ^ (f * f) +f ^ (f / 0.5) +f ^ -0 +f ^ -2 +f ^ -a +f ^ 0 ** obj?.b +f ^ 0 <= f +f ^ 0 == a +f ^ 0 >= obj.a +f ^ 0 ^ 1 +f ^ 0.5 ** a +f ^ 0.5 ** b +f ^ 0.5 ** f +f ^ 0.5 ** obj?.head(0, arr) +f ^ 0.5 < a +f ^ 0.5 ^ 0 +f ^ 0.5 ^ 0.5 +f ^ 0.5 ^ f +f ^ 1 * a +f ^ 1 ** 2 +f ^ 1 > a +f ^ 1 > b ? nil : a +f ^ 2 + div(a, 1) +f ^ a +f ^ a != obj.a +f ^ a - a +f ^ a <= b +f ^ a == obj?.b +f ^ a > a +f ^ a > f +f ^ a > obj.b +f ^ a ^ obj?.b +f ^ abs(b) +f ^ abs(f) +f ^ b +f ^ b ** b ** obj?.b +f ^ b + f +f ^ b >= a + a +f ^ div(b, 2) +f ^ f +f ^ f != b +f ^ f * a +f ^ f ** b +f ^ f ** f +f ^ f - b +f ^ f / 0 ^ 2 +f ^ f / b +f ^ f < b * b +f ^ f <= 0.5 * b +f ^ f >= f +f ^ f ^ (b % a) +f ^ f ^ abs(a) +f ^ max(b) +f ^ min(b, 2 * 2) +f ^ obj.a +f ^ obj.b +f ^ obj.fn(0) +f ^ obj.head(0.5, true) +f ^ obj.head(f) +f ^ obj.obj?.a +f ^ obj?.a +f ^ obj?.b +f ^ obj?.obj.a +f in get(obj.b, b) +f in get(obj?.head(ok), s >= "c") +f in map(arr, f) +f in obj?.c +f in obj?.head(get(f, obj))?.obj +f in obj[nil] +false != nil ? add : f +false != nil ? f : ok +false != obj.a +false != obj.b +false != obj.head(b) +false != obj.head(ok) +false != obj.obj +false != obj.obj.b +false != obj.obj?.a +false != obj.obj?.obj +false != obj?.a +false != obj?.b +false != obj?.head(add) +false != obj?.obj +false != obj?.obj.obj +false != obj?.obj?.b +false != ok or ok +false != true or obj?.fn(0, nil) +false && false && obj.b +false && obj.a +false && obj.b +false && obj.fn(0 / div) +false && obj.fn(add(f)) +false && obj.fn(filter(div .. obj, add.b), arr) +false && obj.fn(obj)?.b +false && obj.fn(ok?.b.a) +false && obj.head(add?.b, add(b, f, s, add) contains add(arr, "a")) +false && obj.head(any(ok, "c")) +false && obj.head(div(0), duration(s, a, add)) +false && obj.head(div(filter(nil, arr), get(ok, nil))) +false && obj.head(f?.obj, toBase64(nil, add, false)) +false && obj.head(none(arr, true), "a" / obj) +false && obj.head(ok.fn(obj?.b, 0.5 endsWith obj)) +false && obj.obj +false && obj?.a +false && obj?.b +false && obj?.b?.obj +false && obj?.fn(add?.fn(map(b, 1))) +false && obj?.fn(b - f <= div(0.5, "c")) +false && obj?.fn(count(0, a)?.obj, arr?.head(nil) in div(true, 0, f), lastIndexOf(filter(nil, 0)), b?.head(none(0, obj), nil <= div, a .. s, "b" ** arr)) +false && obj?.fn(f * s ? nil : nil) +false && obj?.head(a) +false && obj?.head(a.obj) +false && obj?.head(add(0, s)?.obj, arr startsWith div?.b) +false && obj?.head(add(nil - b)) +false && obj?.head(add) +false && obj?.head(all(0.5, ok), count(f, ok), f ? a : 0) +false && obj?.head(all(f, add) && count("c", b), add.head(arr?.obj)) +false && obj?.obj +false && obj[obj.fn(obj)] +false && ok && obj.obj +false && ok && obj[nil] +false == nil == obj.a +false == nil and obj.obj +false == nil or ok +false == obj.a +false == obj.b +false == obj.head(arr) +false == obj.head(ok) +false == obj.obj +false == obj.obj?.a +false == obj?.a +false == obj?.b +false == obj?.head(ok) +false == obj?.obj +false ? "b" : 0 >= obj.b +false ? "c" : 0 / b +false ? 0 : obj.a +false ? 0 : obj.b +false ? 0 : obj.obj +false ? 0 : obj?.head(arr) +false ? 0 : obj?.obj +false ? 0.5 : a <= 0 + b +false ? 0.5 : b / f +false ? 0.5 : f * a +false ? 0.5 : obj.obj +false ? 0.5 : obj?.obj +false ? 1 : obj.a +false ? 1 : obj.b +false ? 1 : obj?.obj +false ? 2 : obj.obj +false ? 2 : obj?.a +false ? 2 : obj?.obj +false ? a : 1 > min(f, f) +false ? a : a != f +false ? a : f + b +false ? a : obj?.a +false ? a : obj?.obj +false ? a : true or obj?.b +false ? add : a / a +false ? add : f != a +false ? add : obj.a +false ? add : obj.b +false ? add : obj?.a +false ? add : obj?.b +false ? add : obj?.obj +false ? arr : 0 == a ^ 0.5 +false ? arr : obj.obj +false ? arr : obj?.a +false ? arr : obj?.b +false ? b : 0 >= 0.5 - f +false ? b : obj.b +false ? b : obj.obj +false ? b : obj.obj?.obj +false ? b : obj?.a +false ? b : obj?.obj +false ? div : 1 - a +false ? div : f * (2 - 2) +false ? div : obj.a +false ? div : obj.b +false ? div : obj.obj +false ? div : obj?.b +false ? f : a ** f +false ? f : obj.a +false ? f : obj.obj +false ? f : obj?.a +false ? f : obj?.obj +false ? false : obj.a +false ? false : obj.obj +false ? false : obj?.obj +false ? nil : 0.5 ^ b +false ? nil : 2 == a ? 0.5 : "b" +false ? nil : obj.obj +false ? nil : obj?.b +false ? obj : 0.5 + b +false ? obj : 2 != f ^ f +false ? obj : a - b +false ? obj : b <= add(0, b) +false ? obj : obj?.a +false ? obj : obj?.obj +false ? ok : 0.5 > f ^ a +false ? ok : b <= a +false ? ok : b <= f +false ? ok : b == a ? true : b +false ? ok : obj?.a +false ? s : 1 != obj.b +false ? s : obj.b +false ? s : obj?.a +false ? true : obj.b +false ? true : obj?.b +false and false and obj.obj +false and obj.a +false and obj.a.obj +false and obj.a?.b +false and obj.b +false and obj.b.a +false and obj.fn((obj or b) + ok.fn(b, a)) +false and obj.fn(add?.a >= add(arr)) +false and obj.fn(any(obj, f startsWith obj)) +false and obj.fn(arr endsWith obj.obj) +false and obj.fn(div(add?.obj), div.b != add) +false and obj.fn(div, div(obj).a, a == div >= div(0.5, f)) +false and obj.fn(one(s, obj).b) +false and obj.head("c" <= b, b, ok / obj) +false and obj.head(any(arr, b)) +false and obj.head(div(nil, s)?.b) +false and obj.head(div?.a) +false and obj.head(get(false, obj)) +false and obj.head(s.head(arr), all(f, ok))?.b +false and obj.obj +false and obj?.a +false and obj?.a?.a +false and obj?.b +false and obj?.b?.fn(all(map(a, get(add, 1)), !s[b]), lower(f) % f) +false and obj?.b?.head(map(b, 0.5 - 1)) +false and obj?.b?.head(obj[ok].obj.b) +false and obj?.b?.obj +false and obj?.fn(a + a == div(0.5, obj, ok, div)) +false and obj?.fn(div or obj) +false and obj?.head((ok or 0) in b.a, 0.5 / a.obj) +false and obj?.head(1 != a) +false and obj?.head(a && b) +false and obj?.head(a) +false and obj?.head(add && a, map(true, ok)) +false and obj?.head(add(1, false, 1, b)) +false and obj?.head(any(b, 0)) +false and obj?.head(arr <= f, ok.head(ok, "a", ok), arr, arr && ok) +false and obj?.head(b <= add) +false and obj?.head(f) +false and obj?.head(ok.b or div endsWith div, div) +false and obj?.head(s.head(b, false, s)?.a) +false and obj?.head(toBase64(add)) +false and obj?.obj +false and obj?.obj || obj?.b +false and ok ? obj?.head(obj) : obj +false and ok and obj.obj +false or false or obj?.a +false or obj.a +false or obj.b +false or obj.head(b) +false or obj.obj +false or obj.obj.a +false or obj.obj.obj +false or obj.obj?.obj +false or obj?.a +false or obj?.b +false or obj?.fn(obj?.head(0, "b", b, 0)) +false or obj?.head(arr) +false or obj?.head(s, arr) +false or obj?.obj +false or obj?.obj?.b +false or ok ? f : div +false or ok or obj?.obj +false or true or obj.a +false || false || true ? obj : 0 +false || obj.a +false || obj.a == a +false || obj.b +false || obj.head(b) +false || obj.obj +false || obj?.a +false || obj?.b +false || obj?.fn(a) +false || obj?.fn(b) +false || obj?.obj +false || true or obj?.obj +filter(0 .. b, ok) +filter(a .. a, 2 < f) +filter(a .. b, ok) +filter(arr, !false) +filter(arr, !ok) +filter(arr, "a" <= "c") +filter(arr, "a" > "b") +filter(arr, "a" endsWith s) +filter(arr, "b" > "a") +filter(arr, "c" > s) +filter(arr, 0 == f) +filter(arr, 0.5 != b) +filter(arr, 0.5 < 0.5) +filter(arr, 0.5 == 1) +filter(arr, 1 == nil) +filter(arr, 1 in arr) +filter(arr, 2 < obj?.b) +filter(arr, 2 > 2) +filter(arr, 2 > a) +filter(arr, a != nil) +filter(arr, a < a) +filter(arr, a <= 0) +filter(arr, a > obj.b) +filter(arr, a >= f) +filter(arr, add == add) +filter(arr, add == div) +filter(arr, any(arr, ok)) +filter(arr, any(arr, true)) +filter(arr, arr == arr) +filter(arr, b < 0) +filter(arr, b < 0.5) +filter(arr, b < b) +filter(arr, b <= b) +filter(arr, b > f) +filter(arr, b >= a) +filter(arr, f != nil) +filter(arr, f != obj.obj) +filter(arr, f < 0) +filter(arr, f < f) +filter(arr, f == b) +filter(arr, f == nil) +filter(arr, false) == arr +filter(arr, false) == nil ? 2 : ok +filter(arr, nil != add) +filter(arr, nil != div) +filter(arr, nil == "a") +filter(arr, nil == a) +filter(arr, nil == div) +filter(arr, nil == false) +filter(arr, nil == s) +filter(arr, none(map(arr, 0), ok)) +filter(arr, not ok) +filter(arr, obj.head(ok, "b")) +filter(arr, obj?.head(false)) +filter(arr, obj?.head(ok)) +filter(arr, ok && ok) +filter(arr, ok && true) +filter(arr, ok == true) +filter(arr, ok or ok) +filter(arr, ok || ok) +filter(arr, ok) +filter(arr, ok) != b .. 1 +filter(arr, s == nil) +filter(arr, s matches s) +filter(arr, s startsWith "c") +filter(arr[2:0], ok) +filter(b .. 1, obj.obj) +filter(b .. a, nil != a) +filter(false ? a : arr, s != nil) +filter(filter(arr, ok), 0.5 != nil) +filter(filter(arr, ok), ok) +filter(filter(arr, true), a <= 0) +filter(keys(obj), ok) +filter(map(arr, 0), s != s) +filter(map(arr, 0.5), f != nil) +filter(map(arr, 1), a != 2) +filter(map(arr, add), ok) +filter(map(arr, arr), ok) +filter(map(arr, b), !ok) +filter(map(arr, b), ok) +filter(map(arr, div), add != add) +filter(map(arr, div), ok) +filter(map(arr, ok), #) +filter(map(arr, ok), ok) +filter(map(arr, s), ok) +filter(map(obj?.obj, a == a), #) +filter(obj.head(s), ok) +filter(obj.obj, "b" endsWith s) +filter(obj.obj, f < f) +filter(obj.obj, s in obj) +filter(obj?.head("b"), ok) +filter(obj?.head("c"), ok) +filter(obj?.head(s), ok) +filter(obj?.head(s, s), ok) +filter(ok ? "c" : true, ok) +filter(ok ? arr : obj, a in arr) +filter(ok ? s : arr, b in arr) +filter(ok ? s : true, nil != f) +filter(true ? arr : add, not true) +filter(true ? arr : f, b == nil) +first(0 .. 0) +first(2 .. b) +first([ok]) +first(a * obj?.b) +first(a .. 0) +first(a .. 1) +first(a .. 2) +first(a .. a) +first(arr) +first(arr) != a +first(arr) != max(2, a) +first(arr) != obj.b +first(arr) % a +first(arr) * f +first(arr) ** -0.5 +first(arr) - 0 / a +first(arr) - f ** a +first(arr) .. obj.fn(b) +first(arr) > f +first(arr) ^ a +first(arr[b:0]) +first(b * obj?.a) +first(b .. 1) +first(b .. b) +first(false ? "a" : 0.5) +first(false ? add : 1) +first(false ? add : true) +first(false ? b : arr) +first(false ? false : "a") +first(filter(arr, false)) +first(filter(arr, ok)) +first(filter(arr, true)) +first(get(obj, s)) +first(keys(obj)) +first(map(arr, "c")) +first(map(arr, 0.5)) +first(map(arr, a)) +first(map(arr, add)) +first(map(arr, arr)) +first(map(arr, b)) +first(map(arr, div)) +first(map(arr, f)) +first(map(arr, false)) +first(map(arr, obj)) +first(map(arr, ok)) +first(map(arr, s)) +first(obj.a) +first(obj.a)?.a +first(obj.b) +first(obj.b)?.a +first(obj.fn(0)) +first(obj.fn(a)) +first(obj.fn(a))?.b +first(obj.fn(b)) +first(obj.head("a")) +first(obj.head("b")) +first(obj.head(0.5)) +first(obj.head(0.5, add)) +first(obj.head(1)) +first(obj.head(1, 0, true)) +first(obj.head(1, add, add)) +first(obj.head(2, div)) +first(obj.head(a)) +first(obj.head(a, arr)) +first(obj.head(add, obj, div)) +first(obj.head(arr, "b")) == add +first(obj.head(arr, 0, nil)) +first(obj.head(b)) +first(obj.head(b, "c")) +first(obj.head(b, a)) +first(obj.head(b, a, 0)) +first(obj.head(b, s)) +first(obj.head(div)) +first(obj.head(f)) +first(obj.head(f, false, 0, a)) +first(obj.head(nil)) +first(obj.head(nil, 0)) +first(obj.head(obj, a)?.a) +first(obj.head(ok)) +first(obj.head(ok, add, b)) +first(obj.head(s)) +first(obj.head(s, 0)) +first(obj.head(s, add)) +first(obj.head(s, div, f, add)) +first(obj.head(s, ok, add)) +first(obj.head(true)) +first(obj.obj) +first(obj?.a) +first(obj?.a)?.obj +first(obj?.b) +first(obj?.fn(0 + a)) +first(obj?.fn(0)) +first(obj?.fn(a)) +first(obj?.fn(b)) +first(obj?.head("a", false)) +first(obj?.head("b")) +first(obj?.head("c", f)) +first(obj?.head(0)) +first(obj?.head(1)) +first(obj?.head(2)) +first(obj?.head(a)) +first(obj?.head(a, div)) +first(obj?.head(a, f)) +first(obj?.head(a, f, div, "b", a)) +first(obj?.head(a, f, nil)) +first(obj?.head(add)) +first(obj?.head(add, nil, f))?.obj +first(obj?.head(arr)) +first(obj?.head(b)) +first(obj?.head(b, "b", false, add)) +first(obj?.head(b, s, div)) +first(obj?.head(div)) +first(obj?.head(f)) +first(obj?.head(false, nil, a, obj, f)) +first(obj?.head(get(s, obj))) +first(obj?.head(nil)) +first(obj?.head(nil, f)) +first(obj?.head(obj)) +first(obj?.head(obj, f, 2).a) +first(obj?.head(obj, nil, s)) +first(obj?.head(ok)) +first(obj?.head(ok, b)) +first(obj?.head(true)) +first(obj?.obj) +first(obj?.obj.a) +first(obj?.obj?.obj) +first(obj[nil]) +first(obj[s]) +first(ok ? a : ok) +first(ok ? obj : "b") +first(ok ? obj : false) +first(ok ? obj : ok) +first(ok ? ok : s) +first(ok ? s : ok) +first(split(s, s)) +first(true ? arr : false) +first(values(obj)) +float(-(f * 0)) +float(-0) +float(-0.5) +float(-1) +float(-2) +float(-a) +float(-add(b, a)) +float(-b) +float(-f) +float(0 * a) +float(0 * b) +float(0 * f) +float(0 ** 0) +float(0 + 2) +float(0 + b) +float(0 - 0.5) +float(0 - b) +float(0 - f) +float(0 / b) +float(0 / f) +float(0 ^ 0) +float(0 ^ 0.5) +float(0 ^ a) +float(0 ^ f) +float(0) != b ** a +float(0) - f +float(0) - obj.a +float(0) == b +float(0.5 * b) +float(0.5 * f) +float(0.5 - 0.5) +float(0.5 - a) +float(0.5 - b) +float(0.5 ^ 1) +float(0.5 ^ f) +float(0.5) != a + a +float(0.5) * obj?.head(0.5) +float(0.5) ** (0 - 0) +float(0.5) / b ** 0 +float(0.5) <= a +float(0.5) >= b +float(0.5) >= f / 0 +float(1 % a) +float(1 - 1) +float(1 - a) +float(1 - b) +float(1 - f) +float(1) + a +float(1) > a +float(2 % a) +float(2 ** b) +float(2 + b) +float(2 + f) +float(2 / f) +float(2 ^ 0) +float(2 ^ 0.5) +float(2) ** obj?.head(0, 0, "a", 0.5, obj) +float(2) - obj?.a +float(2) < float(b) +float(2) <= a +float(2) > b +float(2) > f +float(2) ^ b +float(a % a) +float(a % b) +float(a * 0) +float(a * 2) +float(a * a) +float(a * b) +float(a ** 1) +float(a ** f) +float(a + 0) +float(a + 2) +float(a + a) +float(a + b) +float(a + f) +float(a - 0) +float(a - a) +float(a - b) +float(a - f) +float(a / 0) +float(a / a) +float(a / b) +float(a ^ 1) +float(a ^ a) +float(a ^ b) +float(a ^ f) +float(a) +float(a) != add(a, a) +float(a) ** f +float(a) + a +float(a) - a +float(a) / obj?.head(f) +float(a) < a +float(a) < f +float(a) <= obj.a +float(a) > f +float(a) >= -0 +float(abs(a)) +float(abs(b)) +float(abs(f)) +float(add(0, a)) +float(add(1, b)) +float(add(2, a)) +float(add(2, b)) +float(add(a, 0)) +float(add(a, 2)) +float(add(a, a)) +float(add(a, b)) +float(add(b, 0)) +float(add(b, a)) +float(add(b, b)) +float(arr[a]) +float(arr[b]) +float(b % b) +float(b * 0) +float(b * a) +float(b * b) +float(b ** a) +float(b ** b) +float(b + 0) +float(b + f) +float(b - 0) +float(b - b) +float(b / a) +float(b ^ 0.5) +float(b ^ a) +float(b ^ b) +float(b) +float(b) * a +float(b) * b +float(b) ** (a / 0.5) +float(b) + a +float(b) + b +float(b) + obj?.a +float(b) - b +float(b) - f +float(b) / a - obj?.b +float(b) == a +float(count(arr, ok)) +float(div(0, a)) +float(div(0, b)) +float(div(1, a)) +float(div(2, a)) +float(div(a, a)) +float(div(b, 1)) +float(div(b, b)) +float(f * 0) +float(f * a) +float(f * b) +float(f * f) +float(f ** 0) +float(f ** b) +float(f ** f) +float(f + 0) +float(f + a) +float(f + obj.a) +float(f - 0) +float(f - a) +float(f - b) +float(f - f) +float(f / a) +float(f / f) +float(f ^ a) +float(f) +float(f) * a +float(f) + f +float(f) + obj.a +float(f) / a +float(f) < a ^ b +float(f) > a +float(f) >= b +float(f) ^ obj.b +float(false ? obj : b) +float(false ? ok : b) +float(first(arr)) +float(float(0.5)) +float(float(1)) +float(float(2)) +float(float(a)) +float(float(b)) +float(float(f)) +float(get(arr, 0)) +float(get(arr, a)) +float(get(arr, b)) +float(int(0.5)) +float(int(a)) +float(int(b)) +float(last(arr)) +float(len(arr)) +float(max(0.5)) +float(max(b)) +float(min(0)) +float(min(a ** a)) +float(min(a, 0)) +float(min(f)) +float(obj.a) +float(obj.b) +float(obj.fn(0)) +float(obj.fn(2)) +float(obj.fn(a)) +float(obj.fn(b)) +float(obj.head(0)) +float(obj.head(0.5, 1)) +float(obj.head(1)) +float(obj.head(2)) +float(obj.head(a)) +float(obj.head(a, obj)) +float(obj.head(b)) +float(obj.head(b, arr, obj, nil)) +float(obj.head(b, b, a)) +float(obj.head(b, nil)) +float(obj.head(f)) +float(obj.obj.b) +float(obj.obj?.b) +float(obj?.a) +float(obj?.b) +float(obj?.fn(0)) +float(obj?.fn(a)) +float(obj?.fn(b)) +float(obj?.head(0)) +float(obj?.head(0, arr, ok)) +float(obj?.head(0, false, false)) +float(obj?.head(0.5)) +float(obj?.head(a)) +float(obj?.head(a, s)) +float(obj?.head(b)) +float(obj?.head(b, div, div)) +float(obj?.head(b, nil)) +float(obj?.head(b, obj?.obj)) +float(obj?.head(f, s)) +float(obj?.obj?.a) +float(ok ? 0 : arr) +float(ok ? 0 : true) +float(ok ? 2 : 2) +float(ok ? b : b) +float(ok ? f : s) +float(string(0)) +float(string(f)) +float(toJSON(0)) +float(toJSON(1)) +float(toJSON(2)) +float(toJSON(b)) +float(toJSON(f)) +float(true ? a : a) +float(true ? a : add) +float(true ? b : f) +float(true ? f : obj?.obj) +fromBase64(s + "a") +fromBase64(s[2:b]) +fromBase64(s[a:0]) +fromBase64(s[a:a]) +fromBase64(s[b:b]) +fromBase64(string(ok)) +fromBase64(toBase64(s)) +fromBase64(toJSON(nil)) +fromBase64(toJSON(ok)) +fromBase64(toJSON(true)) +fromJSON(string(b)) +fromJSON(string(ok)) +fromJSON(toJSON(b)) +fromJSON(toJSON(f)) +fromJSON(toJSON(nil)) +fromJSON(toJSON(s)) +fromJSON(toJSON(true)) +get(0 .. b, -b) +get(0 .. b, a) +get(0 .. b, obj.obj) +get(1 .. 0, a) +get(1 .. 1, get(arr, a)) +get(2 .. 2, b) +get(2 .. a, a) +get(2 .. b, true ? div : "c") +get([1, arr], obj.a) +get([a, "a", div, 0, a], obj?.b) +get([b], obj.head(s)) +get([f], b) +get(a .. 0, b) +get(a .. b, b) +get(arr, -a) +get(arr, -b) +get(arr, 0 % a) +get(arr, 0 % b) +get(arr, 0) != obj?.head(s) +get(arr, 0) + a +get(arr, 0) - a +get(arr, 0) - b +get(arr, 0) == f +get(arr, 0) ^ 0 ** f +get(arr, 1 + a) +get(arr, 1) != b +get(arr, 1) ** a +get(arr, 1) - a +get(arr, 1) >= get(arr, b) +get(arr, 2) / obj?.b +get(arr, 2) == obj.a +get(arr, a) +get(arr, a) != b +get(arr, a) * a +get(arr, a) * b +get(arr, a) * obj.head(0, add) +get(arr, a) ** f ^ f +get(arr, a) .. b +get(arr, a) < f +get(arr, a) > f ** f +get(arr, a) ^ min(f) +get(arr, a) in arr +get(arr, add(0, a)) +get(arr, add(a, 0)) +get(arr, b * 1) +get(arr, b + 2) +get(arr, b + a) +get(arr, b - obj.a) +get(arr, b) +get(arr, b) != b +get(arr, b) != obj.head("a") +get(arr, b) % a * f +get(arr, b) % b +get(arr, b) * b +get(arr, b) ** f +get(arr, b) + b +get(arr, b) - 0 * 1 +get(arr, b) - b +get(arr, b) .. obj?.a +get(arr, b) < a +get(arr, b) <= obj?.b +get(arr, b) == a ? f : 1 +get(arr, b) >= obj?.b +get(arr, b) ^ f +get(arr, b) ^ obj?.a +get(arr, div(2, a)) +get(arr, div(a, b)) +get(arr, div(b, b)) +get(arr, int(0.5)) +get(arr, max(a, a, 0.5)) +get(arr, obj.a) +get(arr, obj.b) +get(arr, obj.fn(a)) +get(arr, obj.head(a, nil)) +get(arr, obj.head(add)) +get(arr, obj.head(add, 0, 0)) +get(arr, obj.head(arr)) +get(arr, obj.head(f)) +get(arr, obj.head(s, "c")) +get(arr, obj.obj) +get(arr, obj.obj?.obj) +get(arr, obj?.a) +get(arr, obj?.b) +get(arr, obj?.head(0.5)) +get(arr, obj?.head(1)) +get(arr, obj?.head(1, ok, 0)) +get(arr, obj?.head(add, add)) +get(arr, obj?.head(arr)) +get(arr, obj?.head(arr, "c")) +get(arr, obj?.head(false)) +get(arr, obj?.head(nil)) +get(arr, obj?.head(obj)) +get(arr, obj?.head(obj, f, div)?.b) +get(arr, obj?.obj) +get(arr, obj?.obj.a) +get(arr, obj[nil]) +get(arr, ok ? "a" : add) +get(arr, ok ? arr : div) +get(arr, ok ? obj : 0) +get(arr, ok ? obj : b) +get(arr[0:1], b) +get(arr[0:2], obj?.head(ok)) +get(arr[b:a], obj.b) +get(b .. 2, obj.head(arr, ok)) +get(b .. a, a) +get(b .. b, ok ? b : div) +get(false ? "a" : ok, get(add, f)) +get(false ? "b" : b, f != b) +get(false ? 0 : 0.5, s) +get(false ? 0 : add, obj.head(add, div)) +get(false ? 0 : arr, arr) +get(false ? 0 : ok, a) +get(false ? 0.5 : arr, div) +get(false ? 0.5 : s, f) +get(false ? 2 : f, 0.5 .. 0.5) +get(false ? arr : b, upper(0, true, "c")) +get(false ? div : b, 0 / f) +get(false ? div : b, s) +get(false ? f : add, ok) +get(false ? false : s, s) +get(false ? obj : 0, s) +get(false ? obj : ok, obj.head(s, div, "b")) +get(false ? ok : arr, count(arr, ok)) +get(filter(arr, ok), a) +get(get(obj, s), add) +get(get(obj, s), int(1)) +get(get(obj, s), now(0)) +get(get(obj, s), obj.a) +get(get(obj, s), s) +get(map(arr, "b"), obj.head(b, s)) +get(map(arr, 0.5), obj.a) +get(map(arr, add), a) +get(map(arr, add), obj.head(b)) +get(map(arr, b), a - a) +get(map(arr, b), add(b, 0)) +get(map(arr, div), b) +get(map(arr, false), a) +get(map(arr, obj), b) +get(map(arr, s), min(b, b)) +get(map(arr, s), obj.a) +get(map(arr, true), b) +get(obj, get(obj, s)) +get(obj, lower("a")) +get(obj, lower("c")) +get(obj, obj.a) +get(obj, obj.b) +get(obj, obj.head("b", add, 0.5)) +get(obj, obj.head(0)) +get(obj, obj.head(b, a)) +get(obj, obj.head(div)) +get(obj, obj.head(div, add)) +get(obj, obj.head(f, add)) +get(obj, obj.head(obj)) +get(obj, obj.head(obj, "b", b)) +get(obj, obj.head(ok, add, 0, 2, obj)) +get(obj, obj.head(s)) +get(obj, obj.obj) +get(obj, obj.obj.b) +get(obj, obj.obj?.obj) +get(obj, obj?.a) +get(obj, obj?.b) +get(obj, obj?.fn(0)) +get(obj, obj?.fn(1)) +get(obj, obj?.head("b", nil, a, f, f)) +get(obj, obj?.head(2)) +get(obj, obj?.head(a)) +get(obj, obj?.head(f, ok)) +get(obj, obj?.head(false, false, b)) +get(obj, obj?.head(s)) +get(obj, obj?.head(s))?.b +get(obj, obj?.head(true)) +get(obj, obj?.obj) +get(obj, ok ? "a" : a) +get(obj, ok ? a : true) +get(obj, ok ? obj : div) +get(obj, ok ? s : obj) +get(obj, s) +get(obj, s) != f +get(obj, s) != ok +get(obj, s)?.a +get(obj, s)?.a?.b +get(obj, s)?.a?.head(f, div) +get(obj, s)?.a?.obj +get(obj, s)?.b +get(obj, s)?.b?.b +get(obj, s)?.fn(a) +get(obj, s)?.fn(div) +get(obj, s)?.fn(s) +get(obj, s)?.head(add) +get(obj, s)?.head(add, int(1)) +get(obj, s)?.head(s) +get(obj, s)?.obj +get(obj, s)?.obj.b +get(obj, s)?.obj?.b +get(obj, string(b)) +get(obj, string(div)) +get(obj, string(ok)) +get(obj, toBase64(s)) +get(obj, toJSON(b)) +get(obj, toJSON(f)) +get(obj, toJSON(false)) +get(obj, toJSON(nil == add)) +get(obj, toJSON(ok))?.a +get(obj, trimPrefix("a")) +get(obj, trimSuffix(s)) +get(obj.a, "a" matches s) +get(obj.a, -f) +get(obj.a, 0 != a) +get(obj.a, 0 - 0) +get(obj.a, 0 .. a) +get(obj.a, 0 == arr) +get(obj.a, 0.5 * b) +get(obj.a, 0.5 >= f) +get(obj.a, 1 <= b) +get(obj.a, 1 > f) +get(obj.a, 2 == add) +get(obj.a, [s, a, obj]) +get(obj.a, a != nil) +get(obj.a, a / a) +get(obj.a, a) +get(obj.a, a)?.a +get(obj.a, abs(arr, false, 0)) +get(obj.a, add) +get(obj.a, arr and false) +get(obj.a, arr) +get(obj.a, b + a) +get(obj.a, b <= a) +get(obj.a, b == a) +get(obj.a, b) +get(obj.a, div) +get(obj.a, f * f) +get(obj.a, f ** 2) +get(obj.a, f <= 1) +get(obj.a, f == add) +get(obj.a, f == div) +get(obj.a, f == s) +get(obj.a, f) +get(obj.a, false != "b") +get(obj.a, float(nil, 2)) +get(obj.a, get("c", obj)) +get(obj.a, get(div, div)) +get(obj.a, get(div, obj)) +get(obj.a, get(f, 1)) +get(obj.a, get(false, b)) +get(obj.a, get(obj, true)) +get(obj.a, get(ok, true)) +get(obj.a, last(a, "a")) +get(obj.a, len(true, s, ok, "c", s)) +get(obj.a, lower(add, "c"))?.b +get(obj.a, map("c", 1)) +get(obj.a, map(arr, b)) +get(obj.a, map(obj, f)) +get(obj.a, map(s, s)) +get(obj.a, max(false)) +get(obj.a, obj != "c") +get(obj.a, obj) +get(obj.a, obj)?.b +get(obj.a, obj.b) +get(obj.a, obj.b)?.a +get(obj.a, obj.head(div, nil)) +get(obj.a, obj?.head(ok)) +get(obj.a, ok == f) +get(obj.a, ok || nil) +get(obj.a, ok) +get(obj.a, s != nil) +get(obj.a, s) +get(obj.a, s[f]) +get(obj.a, string(ok)) +get(obj.a, toJSON(0, b, 0, f)) +get(obj.a, toJSON(2)) +get(obj.a, true != s) +get(obj.a, true and "c") +get(obj.b, !true) +get(obj.b, "a" startsWith "a") +get(obj.b, "b" != add) +get(obj.b, "c" in nil) +get(obj.b, 0 + 0.5) +get(obj.b, 0 < f) +get(obj.b, 0.5 .. 0) +get(obj.b, a == nil) +get(obj.b, a == ok) +get(obj.b, a >= a) +get(obj.b, a and true)?.head(arr) +get(obj.b, a) +get(obj.b, a)?.head(s) +get(obj.b, add) +get(obj.b, arr == obj)?.a +get(obj.b, arr) +get(obj.b, b != f) +get(obj.b, b .. a) +get(obj.b, b >= b) +get(obj.b, b) +get(obj.b, div) +get(obj.b, f != ok) +get(obj.b, f) +get(obj.b, false != "b") +get(obj.b, filter(f .. 0.5, b or true)) +get(obj.b, get("b")) +get(obj.b, get(2, false)) +get(obj.b, get(arr, a)) +get(obj.b, get(b, div)) +get(obj.b, get(div, 0)) +get(obj.b, get(ok)) +get(obj.b, last("b", 0)) +get(obj.b, lower("b")) +get(obj.b, lower(f, s)) +get(obj.b, map(arr, arr)) +get(obj.b, map(obj, nil)) +get(obj.b, map(s, s)) +get(obj.b, max(nil, div)) +get(obj.b, not ok) +get(obj.b, now(add, a, div)) +get(obj.b, obj == 0.5) +get(obj.b, obj || true) +get(obj.b, obj) +get(obj.b, obj)?.b +get(obj.b, obj)?.b?.b +get(obj.b, obj.a) +get(obj.b, obj.fn(1)) +get(obj.b, obj.head(f, obj, 0)) +get(obj.b, obj.obj) +get(obj.b, obj?.a) +get(obj.b, obj?.b) +get(obj.b, obj?.head("b", nil, f)) +get(obj.b, obj?.head(div)) +get(obj.b, ok && s) +get(obj.b, ok == a) +get(obj.b, ok and arr) +get(obj.b, ok) +get(obj.b, one("b", true)) +get(obj.b, s == ok) +get(obj.b, s) +get(obj.b, s)?.a +get(obj.b, toJSON(2)) +get(obj.b, upper(s)) +get(obj.c, a) +get(obj.c, arr) +get(obj.c, ok) +get(obj.fn(0), a) +get(obj.fn(0), add) +get(obj.fn(0), arr) +get(obj.fn(0), f in nil) +get(obj.fn(0), int(b)) +get(obj.fn(0), ok) +get(obj.fn(1) + obj?.fn(0), obj) +get(obj.fn(1), div == a) +get(obj.fn(1), div) +get(obj.fn(1), f && false) +get(obj.fn(1), now(arr)) +get(obj.fn(2), arr) +get(obj.fn(a), f * f) +get(obj.fn(a), get(nil)) +get(obj.fn(a), now(nil)) +get(obj.fn(b), 0 + a) +get(obj.fn(b), 2 < 0.5) +get(obj.fn(b), arr) +get(obj.fn(b), div) +get(obj.fn(b), ok) +get(obj.fn(b), s) +get(obj.head("a"), obj?.obj) +get(obj.head("a", "a"), false ? obj : s) +get(obj.head("a", nil), add != div) +get(obj.head("b"), f) +get(obj.head("b", f, add), div) +get(obj.head("b", s, nil), a) +get(obj.head(0), div) +get(obj.head(0), f) +get(obj.head(0, "c"), get("a", arr)) +get(obj.head(0, "c"), toJSON(a)) +get(obj.head(0, "c", b), add) +get(obj.head(0, 0.5, div, s, a), b ** a) +get(obj.head(0, add), a) +get(obj.head(0, add, f), f) +get(obj.head(0, nil), arr) +get(obj.head(0.5), s) +get(obj.head(0.5, 0, ok), obj) +get(obj.head(0.5, false), add) +get(obj.head(1, false, obj, f, arr), obj) +get(obj.head(2, ok), get(obj, b)) +get(obj.head(a), a) +get(obj.head(a), add) +get(obj.head(a), obj == div) +get(obj.head(a), obj?.a) +get(obj.head(a), s) +get(obj.head(a, 0, "a"), f) +get(obj.head(a, 2, a, obj), div != ok) +get(obj.head(a, a, arr), ok || f) +get(obj.head(a, nil, a), arr) +get(obj.head(a, s, add), obj.b) +get(obj.head(add), add) +get(obj.head(add), first(s)) +get(obj.head(add), float(s, 1)) +get(obj.head(add), ok && a) +get(obj.head(add, 1), arr[0:a]) +get(obj.head(add, a, 2), b) +get(obj.head(add, add, add), div) +get(obj.head(arr), !ok) +get(obj.head(arr), a) +get(obj.head(arr), arr) +get(obj.head(arr), f != arr) +get(obj.head(arr), get(s, 2)) +get(obj.head(arr), ok) +get(obj.head(arr, 0), f) +get(obj.head(arr, 2), arr == nil) +get(obj.head(arr, nil), -0.5) +get(obj.head(arr, nil, nil), ok) +get(obj.head(b), a) +get(obj.head(b), arr) +get(obj.head(b), f ** a) +get(obj.head(b, 0), f != ok) +get(obj.head(b, 1), div) +get(obj.head(b, arr), "a" < s) +get(obj.head(b, b), get(1, s)) +get(obj.head(b, div, f), a / b) +get(obj.head(b, obj, s, true), 0 <= a) +get(obj.head(div), add) +get(obj.head(div), b - b) +get(obj.head(div), b) +get(obj.head(div), div != 1)?.b +get(obj.head(div), obj) +get(obj.head(div, "c", add), arr) +get(obj.head(div, a), obj and false) +get(obj.head(div, arr), a)?.b?.a +get(obj.head(div, div), s matches s) +get(obj.head(div, false), false != arr) +get(obj.head(div, ok), !ok) +get(obj.head(f), arr) +get(obj.head(f), obj.a)?.obj +get(obj.head(f), upper("c")) +get(obj.head(f, add, f, ok), 0.5 and false) +get(obj.head(f, b), obj.b) +get(obj.head(f, false), arr) +get(obj.head(f, nil), add) +get(obj.head(f, s), arr[a]) +get(obj.head(false), add != s) +get(obj.head(false), add) +get(obj.head(false), div) +get(obj.head(false), s) +get(obj.head(false, add), s) +get(obj.head(false, arr), div) +get(obj.head(false, b, 0, obj), get(f, b)) +get(obj.head(false, div), s in obj) +get(obj.head(get(s, 1)), div) +get(obj.head(nil), add) +get(obj.head(nil), obj?.head(true, "a")) +get(obj.head(nil), obj?.obj) +get(obj.head(nil), s) +get(obj.head(nil), s[b]) +get(obj.head(nil, obj, arr, add, arr), b) +get(obj.head(nil, true), string(b)) +get(obj.head(obj), div) +get(obj.head(obj), get(add, s)) +get(obj.head(obj), get(div, ok, obj)) +get(obj.head(obj), ok) +get(obj.head(obj), true || false) +get(obj.head(obj, "a"), s) +get(obj.head(obj, "c", nil), a) +get(obj.head(obj, 0, "a"), obj.obj)?.b +get(obj.head(obj, f), a) +get(obj.head(obj, f, obj), toJSON(s)) +get(obj.head(obj, nil), nil != a) +get(obj.head(obj, s, 0), arr) +get(obj.head(ok), a != true) +get(obj.head(ok), b ** 2) +get(obj.head(ok), get(1, add)) +get(obj.head(ok), obj) +get(obj.head(ok), obj?.a) +get(obj.head(ok), s) +get(obj.head(ok), toJSON(nil)) +get(obj.head(ok), true ? a : nil) +get(obj.head(ok, "a"), add) +get(obj.head(ok, 0.5, add, div), obj) +get(obj.head(ok, 1), 0.5 != 0) +get(obj.head(ok, a), "b" contains "b") +get(obj.head(ok, arr, div, true, s), get(2, nil)) +get(obj.head(ok, s), map(obj, true)) +get(obj.head(s), add && true) +get(obj.head(s), b) +get(obj.head(s), div == "a") +get(obj.head(s), get(obj, f)) +get(obj.head(s), map(s, f)) +get(obj.head(s), obj.head(0.5, true, ok)) +get(obj.head(s, a), get(div, nil)) +get(obj.head(s, arr, f), "a" in obj) +get(obj.head(s, f), last(nil, arr)) +get(obj.head(true), ok != 0.5) +get(obj.head(true, "c"), get(b, ok)) +get(obj.head(true, false, obj), true != f) +get(obj.obj, !true) +get(obj.obj, "a" == obj) +get(obj.obj, "a" == ok) +get(obj.obj, 0 <= 0) +get(obj.obj, 0 == nil) +get(obj.obj, 0 == s) +get(obj.obj, 0 == true) +get(obj.obj, 0 > a) +get(obj.obj, 0.5 ^ b) +get(obj.obj, a + f) +get(obj.obj, a - 0) +get(obj.obj, a) +get(obj.obj, a)?.a +get(obj.obj, abs(0)) +get(obj.obj, add(b, b)) +get(obj.obj, add) +get(obj.obj, all("b", ok)) != b +get(obj.obj, arr) +get(obj.obj, b) +get(obj.obj, count(s, false)) +get(obj.obj, div != "a") +get(obj.obj, div != add) +get(obj.obj, div) +get(obj.obj, f != obj) +get(obj.obj, f .. 0) +get(obj.obj, f < a) +get(obj.obj, f) +get(obj.obj, false or false) +get(obj.obj, false or s) +get(obj.obj, filter(obj, false)) +get(obj.obj, get(arr)) +get(obj.obj, get(arr, obj)) +get(obj.obj, get(arr, s)) +get(obj.obj, get(b, a)) +get(obj.obj, get(f, false)) +get(obj.obj, get(nil, s)) +get(obj.obj, get(obj, true)) +get(obj.obj, int(b, 0.5)) +get(obj.obj, int(b, b)) +get(obj.obj, last("c")) +get(obj.obj, map(arr, "a")) +get(obj.obj, map(s, "a")) +get(obj.obj, min(arr)) +get(obj.obj, nil != a) +get(obj.obj, now(obj)) +get(obj.obj, obj) +get(obj.obj, obj)?.obj +get(obj.obj, obj?.a) +get(obj.obj, obj?.b) +get(obj.obj, obj?.obj) +get(obj.obj, obj[s]) +get(obj.obj, ok != b) +get(obj.obj, ok) +get(obj.obj, one(obj, ok)) +get(obj.obj, one(s, ok)) +get(obj.obj, s) +get(obj.obj, s)?.obj +get(obj.obj, s[f]) +get(obj.obj, string(a, b)) +get(obj.obj, toBase64("a", 1)) +get(obj.obj, toJSON(arr)) +get(obj.obj, true or nil) +get(obj.obj.a, obj)?.fn(a) +get(obj.obj?.b, f) +get(obj?.a, "b" in arr) +get(obj?.a, -a) +get(obj?.a, -f) +get(obj?.a, 0 + a) +get(obj?.a, 0 - a) +get(obj?.a, 0 / a) +get(obj?.a, 0 <= f)?.a +get(obj?.a, 0.5 != 1) +get(obj?.a, 0.5 > 0.5) +get(obj?.a, 1 + f) +get(obj?.a, 1 <= 1) +get(obj?.a, a - a) +get(obj?.a, a == nil) +get(obj?.a, a) +get(obj?.a, a)?.b +get(obj?.a, add(a, a))?.obj +get(obj?.a, add) +get(obj?.a, all(s, false)) +get(obj?.a, arr) +get(obj?.a, b ** a) +get(obj?.a, b - a) +get(obj?.a, b < b) +get(obj?.a, b) +get(obj?.a, div(0, b)) +get(obj?.a, div) +get(obj?.a, f .. b) +get(obj?.a, f ^ f) +get(obj?.a, f) +get(obj?.a, false != ok) +get(obj?.a, false && s) +get(obj?.a, false ? 0 : false) +get(obj?.a, false || s) +get(obj?.a, get("a", nil)) +get(obj?.a, get(0, ok)) +get(obj?.a, get(0.5, 2)) +get(obj?.a, get(2, true)) +get(obj?.a, get(s, f)) +get(obj?.a, get(s, s)) +get(obj?.a, get(true, nil)) +get(obj?.a, int(f)) +get(obj?.a, last(0.5, add, 0.5)) +get(obj?.a, last(add)) +get(obj?.a, map(arr, div)) +get(obj?.a, max(f)) +get(obj?.a, min(a, 0.5) <= 2 != ok) +get(obj?.a, not ok) +get(obj?.a, now(0.5, 1, s, 0, f)) +get(obj?.a, now(div)) +get(obj?.a, obj) +get(obj?.a, obj.a) +get(obj?.a, obj.b) +get(obj?.a, obj.head(ok, 0)) +get(obj?.a, obj?.b) +get(obj?.a, obj?.head(f)) +get(obj?.a, ok && "a") +get(obj?.a, ok ? div : "a") +get(obj?.a, ok || f) +get(obj?.a, ok) +get(obj?.a, s) +get(obj?.a, string(div)) +get(obj?.a, toJSON(f, nil, s)) +get(obj?.a, true && false) +get(obj?.a, true ? false : add) +get(obj?.b, -f) +get(obj?.b, 0 or true) +get(obj?.b, 0 || false)?.fn(f) +get(obj?.b, 1 - b) +get(obj?.b, 2 % b) +get(obj?.b, 2 == 0) +get(obj?.b, a .. 0) +get(obj?.b, a < b) +get(obj?.b, a) +get(obj?.b, a)?.obj +get(obj?.b, add == s) +get(obj?.b, add in arr) +get(obj?.b, add) +get(obj?.b, arr == 0.5) +get(obj?.b, arr == a) +get(obj?.b, arr) +get(obj?.b, arr)?.b +get(obj?.b, arr[b]) +get(obj?.b, b % a) +get(obj?.b, b + 1) +get(obj?.b, b) +get(obj?.b, count(obj, true)) +get(obj?.b, div != "b") +get(obj?.b, div) +get(obj?.b, f != ok) +get(obj?.b, f + 0) +get(obj?.b, f / b) +get(obj?.b, f == div) +get(obj?.b, f) +get(obj?.b, false == nil) +get(obj?.b, false and f) +get(obj?.b, float(a)) +get(obj?.b, get(0.5, ok)) +get(obj?.b, get(a, 2)) +get(obj?.b, get(a, a)) +get(obj?.b, get(add)) +get(obj?.b, get(add, arr)) +get(obj?.b, get(add, s)) +get(obj?.b, get(f, 0.5)) +get(obj?.b, get(f, arr))?.obj +get(obj?.b, get(false, false)) +get(obj?.b, get(obj, div)) +get(obj?.b, get(obj, nil)) +get(obj?.b, get(ok, f)) +get(obj?.b, get(s)) +get(obj?.b, get(s, 0)) +get(obj?.b, int(2)) +get(obj?.b, last(ok, true, 0.5)) +get(obj?.b, map("a", s)) +get(obj?.b, map(obj, 0)) +get(obj?.b, map(obj, nil)) +get(obj?.b, map(s, 1)) +get(obj?.b, map(s, b)) +get(obj?.b, max(f)) +get(obj?.b, min(nil)) +get(obj?.b, nil or true) +get(obj?.b, nil || false) +get(obj?.b, now(s)) +get(obj?.b, now(true)) +get(obj?.b, obj == b) +get(obj?.b, obj) +get(obj?.b, obj.a) +get(obj?.b, obj.b) +get(obj?.b, obj.head(false)) +get(obj?.b, obj?.head(a, 0.5)) +get(obj?.b, obj?.head(obj, 0)) +get(obj?.b, obj?.head(ok)) +get(obj?.b, ok && arr) +get(obj?.b, ok ? f : arr) +get(obj?.b, ok and div) +get(obj?.b, ok) +get(obj?.b, s != obj) +get(obj?.b, s == s) +get(obj?.b, s > "a") +get(obj?.b, s) +get(obj?.b, s)?.obj +get(obj?.b, toJSON(f)) +get(obj?.c?.a?.b, ok) +get(obj?.fn(0), a) +get(obj?.fn(0), ok) +get(obj?.fn(0), s) +get(obj?.fn(1 + 0), ok ? ok : s?.a) +get(obj?.fn(1), obj) +get(obj?.fn(2), a / 0) +get(obj?.fn(2), a) +get(obj?.fn(2), none(s, true)) +get(obj?.fn(a), add) +get(obj?.fn(a), f) +get(obj?.fn(a), get(arr, b)) +get(obj?.fn(a), get(nil, 0)) +get(obj?.fn(a), obj) +get(obj?.fn(a), s) +get(obj?.fn(b + b), a) +get(obj?.fn(b), div) +get(obj?.fn(b), f .. f) +get(obj?.fn(b), obj) +get(obj?.head("a"), arr) +get(obj?.head("a"), map("a", a)) +get(obj?.head("a", f), obj?.b)?.b +get(obj?.head("b"), add) +get(obj?.head("b", 2, arr), ok) +get(obj?.head("c"), s > "c") +get(obj?.head("c"), s matches s) +get(obj?.head("c", 0.5, a), "a" || false) +get(obj?.head("c", b), nil == div) +get(obj?.head("c", div, ok), count("b", true)) +get(obj?.head(0), b .. b) +get(obj?.head(0), div) +get(obj?.head(0), map(s, add)) +get(obj?.head(0), obj) +get(obj?.head(0), obj?.b) +get(obj?.head(0), ok) +get(obj?.head(0), s) +get(obj?.head(0, 0), b) +get(obj?.head(0, 0, add, "b", 2), arr) +get(obj?.head(0, a, 0.5, a), a - b) +get(obj?.head(0, b, add, false, nil), b) +get(obj?.head(0, nil, obj, 0, add), div) +get(obj?.head(0.5), min(arr)) +get(obj?.head(0.5), s) +get(obj?.head(0.5, b), ok or b) +get(obj?.head(0.5, b), s) +get(obj?.head(0.5, div), add) +get(obj?.head(0.5, s, a, "c", b), obj?.head(add, 0)) +get(obj?.head(1), get(ok, 0)) +get(obj?.head(1, a), add) +get(obj?.head(1, a, f), get(f, nil)) +get(obj?.head(2), a) +get(obj?.head(2), max(0.5)) +get(obj?.head(2, true, a, ok), arr) +get(obj?.head(a), add) +get(obj?.head(a), arr) +get(obj?.head(a), b) +get(obj?.head(a), obj?.obj) +get(obj?.head(a), s) +get(obj?.head(a, "c", "c"), a) +get(obj?.head(a, add, b), div) +get(obj?.head(a, div), obj.head(b)) +get(obj?.head(a, s, s), map("a", a)) +get(obj?.head(add), b) +get(obj?.head(add), none(obj, false)) +get(obj?.head(add), now(obj, 1, add)) +get(obj?.head(add), s) +get(obj?.head(add, a, obj, "b", a), obj.obj) +get(obj?.head(add, b), div) +get(obj?.head(add, false), div != b) +get(obj?.head(add, float(f)), s) +get(obj?.head(add, obj, a), s) +get(obj?.head(add, obj, a, 0.5), add) +get(obj?.head(add, obj, obj), f) +get(obj?.head(add, ok), a) +get(obj?.head(arr), get(s, arr)) +get(obj?.head(arr), obj) +get(obj?.head(arr), s) +get(obj?.head(arr, 0.5, false), 0 > f) +get(obj?.head(arr, a), obj.obj) +get(obj?.head(arr, add), 0.5 / a) +get(obj?.head(arr, add), b) +get(obj?.head(arr, add), div) +get(obj?.head(arr, nil), f) +get(obj?.head(arr, nil, arr, ok), obj) +get(obj?.head(arr, obj, "a"), false == div) +get(obj?.head(arr, ok, arr), obj?.head(true, 0)) +get(obj?.head(arr, s), div) +get(obj?.head(arr, s), obj.a) +get(obj?.head(b), all(s, ok)) +get(obj?.head(b), b) +get(obj?.head(b), f)?.obj +get(obj?.head(b), false && 0) +get(obj?.head(b), get(0.5, b)) +get(obj?.head(b), obj?.b) +get(obj?.head(b, "b", nil), arr) +get(obj?.head(b, 0), obj.b) +get(obj?.head(b, div), add) +get(obj?.head(b, nil, ok), nil == f) +get(obj?.head(div), a) +get(obj?.head(div), arr) +get(obj?.head(div), div) +get(obj?.head(div, 1, ok, a), div) +get(obj?.head(div, a), obj && false) +get(obj?.head(div, arr), nil == "c") +get(obj?.head(div, false), f) +get(obj?.head(div, false, arr), map(s, b)) +get(obj?.head(div, obj), f) +get(obj?.head(f), arr) +get(obj?.head(f), obj.obj) +get(obj?.head(f), s) +get(obj?.head(f, nil), ok ? f : div) +get(obj?.head(f, ok, add), "a" == f) +get(obj?.head(false), false and f) +get(obj?.head(false), ok && obj) +get(obj?.head(false), ok) +get(obj?.head(false, b, ok, "a"), any(obj, ok)) +get(obj?.head(false, obj, 0, arr), div) +get(obj?.head(false, s, 0, f), true or s) +get(obj?.head(nil), a) +get(obj?.head(nil), add) +get(obj?.head(nil), f) +get(obj?.head(nil), get(false, add)) +get(obj?.head(nil), ok) +get(obj?.head(nil), s == arr) +get(obj?.head(nil), s) +get(obj?.head(nil, "c"), arr) +get(obj?.head(nil, arr), ok or obj) +get(obj?.head(nil, obj), first(f, nil)) +get(obj?.head(obj), add != true) +get(obj?.head(obj), arr) +get(obj?.head(obj), f) +get(obj?.head(obj), obj) +get(obj?.head(obj), ok) +get(obj?.head(obj, "a", add), ok == ok) +get(obj?.head(obj, arr), arr) +get(obj?.head(obj, f), obj) +get(obj?.head(obj, obj, ok), div) +get(obj?.head(obj?.a), a) +get(obj?.head(ok), a) +get(obj?.head(ok), b) +get(obj?.head(ok, 1), b == b) +get(obj?.head(ok, 1), ok) +get(obj?.head(ok, arr, div), get(add, s)) +get(obj?.head(ok, f, 0.5, b), 1 != true) +get(obj?.head(s), b % 2) +get(obj?.head(s), f) +get(obj?.head(s), get(a, obj)) +get(obj?.head(s), obj) +get(obj?.head(s), ok) +get(obj?.head(s, 0, arr), false or s) +get(obj?.head(s, 2, f, div), get(f, 0.5)) +get(obj?.head(s, add, s), hasPrefix("b", s)) +get(obj?.head(s, div, arr), s) +get(obj?.head(s, false), obj == add) +get(obj?.head(true), b) +get(obj?.head(true), f != s) +get(obj?.head(true), f) +get(obj?.head(true), first(div, b)) +get(obj?.head(true, add), a) +get(obj?.head(true, add, add), obj.head(ok, obj, 2, nil, 2)) +get(obj?.head(true, b), obj) +get(obj?.head(true, div), a) +get(obj?.head(true, f), filter(s, true)) +get(obj?.head(true, obj, 1, b), div) +get(obj?.obj, "a" matches s) +get(obj?.obj, -b) +get(obj?.obj, 0 != f) +get(obj?.obj, 0 != s) +get(obj?.obj, 0 / a) +get(obj?.obj, 0.5 + a)?.a +get(obj?.obj, 1 .. a) +get(obj?.obj, 2 + 2) +get(obj?.obj, a != 2) +get(obj?.obj, a * f) +get(obj?.obj, a ** f) +get(obj?.obj, a < b) +get(obj?.obj, a or true) +get(obj?.obj, a) +get(obj?.obj, add and false) +get(obj?.obj, add(a, b)) +get(obj?.obj, add) +get(obj?.obj, arr) +get(obj?.obj, b * b) +get(obj?.obj, b ** 2) +get(obj?.obj, b > a) +get(obj?.obj, b) +get(obj?.obj, div == 0) +get(obj?.obj, div) +get(obj?.obj, f < 0) +get(obj?.obj, f) +get(obj?.obj, false or "c") +get(obj?.obj, filter("a", ok)) +get(obj?.obj, filter(s, ok)) +get(obj?.obj, get("b", arr)) +get(obj?.obj, get("c", arr)) +get(obj?.obj, get(0, a)) +get(obj?.obj, get(add, s)) +get(obj?.obj, get(arr, 0)) +get(obj?.obj, get(nil, a)) +get(obj?.obj, get(nil, b)) +get(obj?.obj, int(false, arr, b)) +get(obj?.obj, map(obj, "b")) +get(obj?.obj, map(obj, div)) +get(obj?.obj, min(arr)) +get(obj?.obj, now("c", obj)) +get(obj?.obj, obj) +get(obj?.obj, obj)?.a?.a +get(obj?.obj, obj.a) +get(obj?.obj, obj.b) +get(obj?.obj, obj.head(nil)) +get(obj?.obj, obj.obj) +get(obj?.obj, obj?.a) +get(obj?.obj, obj?.head(add)) +get(obj?.obj, obj?.head(s, 0)) +get(obj?.obj, obj?.obj) +get(obj?.obj, ok != a) +get(obj?.obj, ok != false) +get(obj?.obj, ok ? 2 : true) +get(obj?.obj, ok and nil) +get(obj?.obj, ok or ok) +get(obj?.obj, ok) +get(obj?.obj, ok)?.obj +get(obj?.obj, one(obj, true)) +get(obj?.obj, s) +get(obj?.obj, string(f)) +get(obj?.obj, string(f, 0)) +get(obj?.obj, string(ok, s, s)) +get(obj?.obj, toJSON(b, b, nil)) +get(obj?.obj, toJSON(f)) +get(obj?.obj, true || 1) +get(obj?.obj.b, arr) +get(obj?.obj?.a, div) +get(obj?.obj?.b, obj) +get(obj?.obj?.b, s) +get(obj?.obj?.obj, f) +get(obj[nil], add) +get(obj[nil], arr) +get(obj[nil], f) +get(obj[nil], get(s, a)) +get(obj[nil], ok) +get(obj[nil], s) +get(obj[s], obj) +get(obj[s], obj?.a) +get(ok ? "a" : add, ok ? s : add) +get(ok ? "a" : arr, arr) +get(ok ? 0 : "c", obj) +get(ok ? 0 : arr, arr) +get(ok ? add : 0.5, b) +get(ok ? add : obj, ok) +get(ok ? arr : add, div) +get(ok ? arr : b, f) +get(ok ? arr : f, toJSON("c")) +get(ok ? b : div, first(nil)) +get(ok ? div : 1, add) +get(ok ? f : "a", f) +get(ok ? f : div, arr) +get(ok ? f : obj, div) +get(ok ? f : ok, obj.obj) +get(ok ? false : arr, s) +get(ok ? obj : 0, arr) +get(ok ? obj : a, a) +get(ok ? obj : div, div) +get(ok ? ok : b, ok and ok) +get(ok ? ok : f, last(ok)) +get(ok ? ok : obj, a) +get(ok ? ok : obj, arr) +get(ok ? s : f, arr) +get(ok ? s : false, 0 != f) +get(ok ? s : obj, obj?.head(ok, add))?.b +get(ok ? true : a, count(arr, ok)) +get(true ? "c" : 0, get("b", div)) +get(true ? 0.5 : 0, s) +get(true ? 1 : arr, f) +get(true ? 1 : ok, f == a) +get(true ? 1 : ok, ok or add) +get(true ? a : ok, f * 0.5) +get(true ? a : ok, get(nil, "c")) +get(true ? add : "a", a) +get(true ? add : 0.5, s[0.5:b]) +get(true ? b : s, div) +get(true ? div : 2, add) +get(true ? f : "c", get(arr)) +get(true ? obj : add, arr) +get(true ? ok : 0, 0 / a) +get(true ? s : 0.5, get(obj, f)) +get(values(obj), obj.a) +get({"b": b, "c": "c", "a": nil}?.b, obj.obj) +indexOf("b", s) != a +indexOf(s, s) +indexOf(s, upper(s)) +int(-0) +int(-0.5) +int(-1) +int(-a) +int(-b) +int(-f) +int(0 % 1) +int(0 % a) +int(0 * 0) +int(0 * 0.5) +int(0 * f) +int(0 ** 0.5) +int(0 + 0) +int(0 + a) +int(0 + b) +int(0 + f) +int(0 - 0) +int(0 - a) +int(0 - b) +int(0 - f) +int(0 / a) +int(0 / f) +int(0 ^ a) +int(0) != -f +int(0) != a ? nil : a +int(0) != obj.obj +int(0) ** obj.b +int(0) + get(arr, 0) +int(0) .. b +int(0) / f +int(0) < min(1) +int(0) <= obj.b +int(0) > obj.head(b) +int(0) ^ f +int(0.5 * a) +int(0.5 * f) +int(0.5 ** 2) +int(0.5 ** a) +int(0.5 + f) +int(0.5 - f) +int(0.5 / 0.5) +int(0.5 / a) +int(0.5 / b) +int(0.5 / f) +int(0.5 ^ 0) +int(0.5 ^ 0.5) +int(0.5) != f ? 0.5 : arr +int(0.5) < b +int(0.5) > f +int(1 % 1 % b) +int(1 * f) +int(1 ** 0) +int(1 ** a) +int(1 ** b) +int(1 / b) +int(1) != a +int(1) * a +int(1) ** a +int(1) / 0 ^ f +int(1) <= b +int(2 % b) +int(2 ** 1) +int(2 ** f) +int(2 + 0) +int(2 - b) +int(2 / a) +int(2) != a +int(2) ** a +int(2) + int(b) +int(2) .. b +int(2) <= a * f +int(2) > b +int(a % 2) +int(a % b) +int(a * 0) +int(a * 0.5) +int(a * f) +int(a ** 0) +int(a ** b) +int(a ** f) +int(a + a) +int(a + b) +int(a - 0.5) +int(a - a) +int(a / 0) +int(a / a) +int(a / b) +int(a / f) +int(a ^ 0) +int(a ^ 0.5) +int(a ^ b) +int(a) +int(a) != b +int(a) != f != true +int(a) * a +int(a) * f +int(a) ** a +int(a) + -f +int(a) + a +int(a) - b +int(a) - f +int(a) / a +int(a) / obj.a +int(a) < obj.head(obj).a +int(a) <= b +int(a) == b +int(a) >= a +int(a) >= obj.fn(a) +int(a) ^ b +int(abs(a)) +int(abs(b)) +int(abs(f)) +int(add(0, 0)) +int(add(0, 2)) +int(add(a, 0)) +int(add(a, 2)) +int(add(a, a)) +int(add(a, b)) +int(add(add(0, b), b)) +int(add(add(b, a), b)) +int(add(b, 0)) +int(add(b, b)) +int(arr[0]) +int(arr[a]) +int(arr[b]) +int(b % a) +int(b * a) +int(b * b) +int(b ** a) +int(b ** b) +int(b ** f) +int(b + 0.5) +int(b + 2) +int(b + a) +int(b + b) +int(b - 0) +int(b - 2) +int(b - b) +int(b - f) +int(b / 1) +int(b / b) +int(b ^ b) +int(b ^ f) +int(b) +int(b) != 0 * 0 +int(b) != f +int(b) % a +int(b) * 0 % 2 +int(b) * a +int(b) - a +int(b) - b +int(b) .. a +int(b) / a +int(b) ^ f +int(count(arr, true)) +int(div(0, 2)) +int(div(0, a)) +int(div(1, a)) +int(div(1, b)) +int(div(2, a)) +int(div(2, b)) +int(div(a, 1)) +int(div(a, b)) +int(div(b, a)) +int(div(b, b)) +int(f * 0.5) +int(f * a) +int(f * b) +int(f ** b) +int(f + 0) +int(f + 0.5) +int(f + 2) +int(f + a) +int(f + b) +int(f + f) +int(f - 0) +int(f - 1) +int(f - a) +int(f - b) +int(f / 0) +int(f / f) +int(f ^ 0) +int(f ^ a) +int(f ^ b) +int(f ^ obj?.a) +int(f) +int(f) != a +int(f) * obj.a +int(f) * obj.fn(b) +int(f) ** b +int(f) .. a +int(f) < obj?.a +int(f) == obj?.b +int(f) >= 2 / a +int(f) ^ b +int(false ? "a" : a) +int(false ? 0 : a) +int(false ? add : 0) +int(first(arr)) +int(float(0)) +int(float(2)) +int(float(a)) +int(float(f)) +int(get(arr, 0)) +int(get(arr, a)) +int(get(arr, b)) +int(int(1)) +int(int(a)) +int(int(f)) +int(last(arr)) +int(len(arr)) +int(len(obj)) +int(len(s)) +int(max(0.5)) +int(max(0.5, 0)) +int(max(1, b, f)) +int(max(b)) +int(max(b, f)) +int(max(f)) +int(min(0)) +int(min(0.5)) +int(min(2)) +int(min(a)) +int(min(b)) +int(min(f)) +int(obj.a + f) +int(obj.a) +int(obj.b / f) +int(obj.b) +int(obj.fn(0)) +int(obj.fn(1)) +int(obj.fn(a)) +int(obj.fn(b)) +int(obj.head(0)) +int(obj.head(0, obj)) +int(obj.head(a)) +int(obj.head(a, "a", div)) +int(obj.head(a, f)) +int(obj.head(a, nil, nil)) +int(obj.head(a, obj)) +int(obj.head(b)) +int(obj.head(b, s, nil, 0)) +int(obj.head(f)) +int(obj.head(f, s, "a")) +int(obj.obj?.b) +int(obj?.a) +int(obj?.b) +int(obj?.fn(0)) +int(obj?.fn(b)) +int(obj?.fn(obj.b)) +int(obj?.head(0.5, add)) +int(obj?.head(2, 1, obj)) +int(obj?.head(a)) +int(obj?.head(a, 0.5)) +int(obj?.head(a, a == b)) +int(obj?.head(b)) +int(obj?.head(b, add, 0)) +int(obj?.head(f)) +int(obj?.head(f, a, 1)) +int(obj?.obj.a) +int(obj?.obj?.b) +int(ok ? 0 : ok) +int(ok ? 0.5 : add) +int(ok ? 1 : 0.5) +int(ok ? a : f) +int(ok ? b : ok) +int(ok ? f : s) +int(string(a)) +int(string(b)) +int(toJSON(0)) +int(toJSON(a)) +int(toJSON(b)) +int(true ? 0 : nil) +join(map(arr, s)) +keys(obj) +keys(obj) == obj?.head(0, obj) +keys(obj)[a] +keys(ok ? obj : nil) +keys({"b": 1, "c": obj}) +last(0 .. b) +last(2 .. 1) +last(["b"]) +last([nil, obj, b]) +last(a .. 0) +last(a .. 2) +last(a .. a) +last(abs(obj?.head(a, add, div))) +last(arr) +last(arr) * 0 * 0 +last(arr) * abs(b) +last(arr) * f * a +last(arr) * obj.head(obj, arr).a +last(arr) < b / 0.5 +last(arr) >= b +last(arr[b:a]) +last(b + obj?.b) +last(b - obj.b) +last(b .. 2) +last(b .. a) +last(div(0, a) > a ? "c" : false) +last(false ? f : a) +last(false ? f : s) +last(false ? obj : s) +last(false ? s : 1) +last(false ? s : obj) +last(filter(arr, false)) +last(filter(arr, true)) +last(first(obj?.obj)) +last(get(obj.a, obj.b)) +last(get(obj.b, ok != 0.5)) +last(get(obj.obj, ok)) +last(last(obj?.b)) +last(map(arr, "a")) +last(map(arr, 0)) +last(map(arr, 0.5)) +last(map(arr, a)) +last(map(arr, add)) +last(map(arr, arr)) +last(map(arr, b)) +last(map(arr, div)) +last(map(arr, false)) +last(map(arr, ok)) +last(map(arr, s)) +last(map(obj?.head("b"), b)) +last(obj.a) +last(obj.b) +last(obj.b)?.a +last(obj.b)?.obj +last(obj.fn(0)) +last(obj.fn(1)) +last(obj.fn(a)) +last(obj.fn(b)) +last(obj.head("a")) +last(obj.head("c", 0, ok)) +last(obj.head(0)) +last(obj.head(0, nil)) +last(obj.head(0, ok, ok)) +last(obj.head(0.5)) +last(obj.head(2)) +last(obj.head(2, add, "a", "a", "a")) +last(obj.head(a)) +last(obj.head(a, f)) +last(obj.head(a, true, f)) +last(obj.head(add, 2)) +last(obj.head(arr == div)) +last(obj.head(arr, s)) +last(obj.head(div)) +last(obj.head(div, 0.5, obj, s, 2)) +last(obj.head(f, a, s, a)) +last(obj.head(obj)) +last(obj.head(obj, b, add).a) +last(obj.head(ok)) +last(obj.head(ok, false)) +last(obj.head(s)) +last(obj.head(s, a, ok)) +last(obj.head(true)) +last(obj.head(true, div)) +last(obj.obj) +last(obj.obj)?.b +last(obj.obj.a) +last(obj.obj?.a) +last(obj.obj?.obj.a) +last(obj?.a) +last(obj?.a)?.b +last(obj?.b) +last(obj?.b)?.obj +last(obj?.fn(0)) +last(obj?.fn(a)) +last(obj?.fn(b)) +last(obj?.fn(b))?.b +last(obj?.head("a", 0, 1)) +last(obj?.head(0, 0.5, a)) +last(obj?.head(1, s, "a", obj)) +last(obj?.head(2)) +last(obj?.head(a, b)) +last(obj?.head(a, obj)) +last(obj?.head(add)) +last(obj?.head(add, false, 0, div, f)) +last(obj?.head(arr)) +last(obj?.head(arr, 1)) +last(obj?.head(b)) +last(obj?.head(div, add, nil, ok)) +last(obj?.head(div, nil, ok)) +last(obj?.head(f)) +last(obj?.head(f, div, s)) +last(obj?.head(nil)?.obj) +last(obj?.head(nil, div, ok)) +last(obj?.head(obj)) +last(obj?.head(obj))?.b +last(obj?.head(obj, a)) +last(obj?.head(obj, false)) +last(obj?.head(ok, arr, div)) +last(obj?.head(ok, div)) +last(obj?.head(s)) +last(obj?.head(true)) +last(obj?.obj) +last(obj?.obj)?.a +last(obj?.obj)?.b +last(obj?.obj.a) +last(obj?.obj.b) +last(obj?.obj?.obj) +last(obj[nil]) +last(obj[obj[nil]]) +last(ok ? "a" : div) +last(ok ? "c" : a) +last(ok ? 0 : obj) +last(ok ? a : s) +last(ok ? add : arr) +last(ok ? arr : false) +last(ok ? div : 0.5) +last(ok ? div : b) +last(ok ? div : f) +last(ok ? div : true) +last(ok ? f : "c") +last(ok ? f : b) +last(ok ? f : ok) +last(ok ? false : s) +last(ok ? obj : div) +last(ok ? obj : s) +last(ok ? ok : 2) +last(ok ? ok : f)?.obj +last(ok ? true : "c") +last(ok ? true : b) +last(split(s, "c")) +last(splitAfter("a", "a")) +last(true ? a : ok) +last(true ? add : f) +last(true ? div : false) +last(true ? div : ok) +last(true ? obj : 0.5) +last(true ? ok : b) +last(true ? ok : div) +lastIndexOf("a", "a") + f +lastIndexOf("b", s) * a +lastIndexOf(s, ok ? s : 0) +lastIndexOf(s, s) +len("a" + s) +len("a") .. b +len("a") == a +len("a") >= 0 * b +len("b" + "c") +len("b") ** b +len("b") >= f +len("c" + "a") +len(0 .. 0) +len(0 .. a) +len(2 .. 0) +len([s]) +len(a .. 1) +len(a .. a) +len(a .. b) +len(add != add or ok ? "c" : div) +len(arr) +len(arr) != f +len(arr) != obj?.obj +len(arr) - f +len(arr) - int(a) +len(arr) / a +len(arr) > f +len(arr) > last(arr) +len(arr) ^ -f +len(arr[a:2]) +len(filter(arr, false)) +len(filter(arr, ok)) +len(filter(arr, true)) +len(keys(obj)) +len(map(arr, "b")) +len(map(arr, 0)) +len(map(arr, 1)) +len(map(arr, a)) +len(map(arr, arr)) +len(map(arr, b)) +len(map(arr, f)) +len(map(arr, ok)) +len(map(arr, s)) +len(obj) +len(obj) % b +len(obj) ** f +len(obj) ** obj.b +len(obj) + b +len(obj) .. -b +len(obj) / obj?.a +len(obj) <= f +len(obj) <= min(0) +len(obj) == a +len(obj) > get(arr, a) +len(obj) > obj.a +len(obj) >= a +len(obj) >= count(arr, true) +len(obj.head("a", 2, false)) +len(obj.head("b")) +len(obj.head("c", ok)) +len(obj.head("c", true, obj, false, obj)) +len(obj.head(arr)) +len(obj.head(arr, div, b)) +len(obj.head(obj)) +len(obj.head(obj, 2)) +len(obj.head(s)) +len(obj.head(s, 0, div, s, add)) +len(obj.head(s, nil)) +len(obj.obj) +len(obj.obj) > b +len(obj?.head("c", b)) +len(obj?.head(arr, nil, f)) +len(obj?.head(arr, s, "c", div, "c")) +len(obj?.head(obj)) +len(obj?.head(s)) +len(obj?.head(s, add)) +len(obj?.obj) +len(obj?.obj.obj) +len(obj?.obj?.obj) +len(ok ? arr : a) +len(ok ? arr : obj) +len(s + "c") +len(s + s) +len(s) +len(s) != a +len(s) != obj.b +len(s) ** obj?.a +len(s) + a +len(s) + f +len(s) / f +len(s) >= a +len(s) >= b +len(s) ^ f +len(string(0)) +len(string(0.5)) +len(string(1)) +len(string(div == div)) +len(string(f)) +len(string(false)) +len(string(nil)) +len(string(obj)) +len(string(ok)) +len(string(s)) +len(toBase64("c")) +len(toJSON("a")) +len(toJSON("c")) +len(toJSON(a)) +len(toJSON(b)) +len(toJSON(f)) +len(toJSON(nil == ok)) +len(toJSON(s)) +len(trim("b")) +len(trim(s)) +len(trimPrefix("a")) +len(trimPrefix(s)) +len(trimSuffix("a")) +len(trimSuffix(s)) +len(true ? arr : add) +len(true ? arr : obj) +len(upper("b")) +len(values(obj)) +len({"a": arr, "b": a}) +lower("b") != obj.head(f, ok) +lower("b") contains s +lower("b") matches "c" ? f : b +lower("c" + s) +lower(false ? 0 : "c") +lower(obj.head(s)) +lower(obj.head(s, 2, s, "c")) +lower(obj?.head(s)) +lower(s + "b") +lower(s + "c") +lower(s) +lower(s) contains s +lower(s) in obj?.obj +lower(s[b:0]) +lower(string("a")) +lower(string(0)) +lower(string(0.5)) +lower(string(2)) +lower(string(a)) +lower(string(b)) +lower(string(f)) +lower(string(false)) +lower(string(nil)) +lower(string(ok)) +lower(string(s)) +lower(string(true)) +lower(toBase64("b")) +lower(toBase64("c")) +lower(toBase64(s)) +lower(toJSON("b")) +lower(toJSON("c")) +lower(toJSON(a)) +lower(toJSON(f)) +lower(toJSON(ok)) +lower(toJSON(s)) +lower(trim("a")) +lower(trim(s)) +lower(trimPrefix("a")) +lower(trimPrefix("c")) +lower(trimPrefix(s)) +lower(trimSuffix(s)) +lower(upper(s)) +map(0 .. 0, a) +map(0 .. 0, b) +map(0 .. 1, #) +map(0 .. a, !ok) +map(0 .. a, arr) +map(0 .. a, ok) +map(0 .. a, s) +map(0 .. b, #) +map(1 .. 0, count(arr, ok)) +map(1 .. 1, b) +map(1 .. a, #) +map(1 .. b, #) +map(1 .. b, obj.head(div)) +map(2 .. 1, b) +map(2 .. 2, map(arr, a)) +map(2 .. 2, true ? obj : a) +map(2 .. b, arr) +map([a], add) +map([nil], div) +map([obj, s], add) +map([ok], #) +map([s], arr) +map([true, obj, s], not ok) +map(a .. 0, #) +map(a .. 0, arr) +map(a .. 0, b) +map(a .. 1, f) +map(a .. a, #) +map(a .. a, div(0, a)) +map(a .. a, s) +map(a .. b, b) +map(a .. b, f) +map(a .. obj?.obj?.a, f != #) +map(arr, !any(arr, ok)) +map(arr, "a" startsWith "b") +map(arr, "b")[b] +map(arr, # * #) +map(arr, # + #) +map(arr, # + b) +map(arr, #) +map(arr, -#) +map(arr, -0) +map(arr, -1) +map(arr, -a) +map(arr, -b) +map(arr, -f) +map(arr, 0 != nil) +map(arr, 0 * 0) +map(arr, 0 * 0.5 > b) +map(arr, 0 + a) +map(arr, 0 >= 0) +map(arr, 0 ^ 0) +map(arr, 0 in arr) +map(arr, 0) != arr +map(arr, 0.5 != nil) +map(arr, 0.5 + 2) +map(arr, 0.5 - b) +map(arr, 0.5 <= b) +map(arr, 0.5 > b) +map(arr, 0.5 ^ a) +map(arr, 0.5 ^ f) +map(arr, 0.5) == arr +map(arr, 0.5) == obj.head(1, a) +map(arr, 1 + b) +map(arr, 1 - 0) +map(arr, 1 / a) +map(arr, 1 == b) +map(arr, 2 != nil) +map(arr, 2 * a) +map(arr, 2 ** 0.5) +map(arr, 2 - f) +map(arr, 2 ^ 2) +map(arr, a != nil) +map(arr, a % 2) +map(arr, a % a <= #) +map(arr, a * 0.5) +map(arr, a ** a) +map(arr, a + b) +map(arr, a - f) +map(arr, a / f) +map(arr, a < 2) +map(arr, a > 0) +map(arr, a > a) +map(arr, a > b) +map(arr, a ^ b) +map(arr, a) +map(arr, abs(0)) +map(arr, add != add) +map(arr, add != nil) +map(arr, add == add) +map(arr, add(#, #)) +map(arr, add(0, a)) +map(arr, add(0, b)) +map(arr, add(2, b)) +map(arr, add) +map(arr, add)[a] +map(arr, any(arr, ok)) +map(arr, arr) +map(arr, b != 0.5) +map(arr, b * 0.5) +map(arr, b * b) +map(arr, b + f) +map(arr, b - 0.5) +map(arr, b / f) +map(arr, b <= 0.5) +map(arr, b <= 2) +map(arr, b <= a) +map(arr, b > 1) +map(arr, b > a) +map(arr, b >= a) +map(arr, b ^ f) +map(arr, b) +map(arr, b) != obj.b +map(arr, b)[obj.b] +map(arr, count(arr, ok)) +map(arr, count(arr, true)) +map(arr, div == add) +map(arr, div(1, 1)) +map(arr, div(1, 2)) +map(arr, div(b, b)) +map(arr, div) +map(arr, div) == arr +map(arr, div)[obj.b] +map(arr, div)[obj?.a] +map(arr, f != b) +map(arr, f != nil) +map(arr, f ** 2) +map(arr, f + a) +map(arr, f + f) +map(arr, f - 0.5) +map(arr, f - f) +map(arr, f / f) +map(arr, f < b) +map(arr, f <= 0) +map(arr, f <= a) +map(arr, f == a) +map(arr, f == nil) +map(arr, f > a) +map(arr, f > f) +map(arr, f >= a) +map(arr, f ^ 0.5) +map(arr, f ^ 1) +map(arr, f) +map(arr, false ? 0 : f) +map(arr, false ? 0.5 : arr) +map(arr, false ? div : a) +map(arr, false) == obj.obj +map(arr, filter(arr, ok)) +map(arr, float(1)) +map(arr, float(b)) +map(arr, get(arr, 0)) +map(arr, get(obj, s)) +map(arr, int(f)) +map(arr, len("b")) +map(arr, lower(s)) +map(arr, map(arr, 0)) +map(arr, map(arr, 0.5)) +map(arr, map(arr, arr)) +map(arr, map(arr, true)) +map(arr, max(f)) +map(arr, min(0)) +map(arr, min(2)) +map(arr, min(b)) +map(arr, min(f)) +map(arr, nil != a) +map(arr, nil != div) +map(arr, nil == obj) +map(arr, not ok) +map(arr, not true) +map(arr, obj != nil) +map(arr, obj != obj?.b) +map(arr, obj) +map(arr, obj) != arr ? false : nil +map(arr, obj) != obj.b +map(arr, obj)[obj.a] +map(arr, obj)[obj?.b] +map(arr, obj.a) +map(arr, obj.b) +map(arr, obj.c) +map(arr, obj.head(add, nil)) +map(arr, obj.head(arr)) +map(arr, obj.head(div)) +map(arr, obj.head(ok, f)) +map(arr, obj.obj) +map(arr, obj.obj?.b) +map(arr, obj?.a) +map(arr, obj?.b) +map(arr, obj?.fn(0)) +map(arr, obj?.fn(a)) +map(arr, obj?.head("a", b, obj)) +map(arr, obj?.head(0)) +map(arr, obj?.head(1)) +map(arr, obj?.head(add, ok, f)) +map(arr, obj?.head(arr)) +map(arr, obj?.head(b)) +map(arr, obj?.head(s)) +map(arr, obj?.obj) +map(arr, obj?.obj.b) +map(arr, obj?.obj?.a) +map(arr, ok ? arr : s) +map(arr, ok) +map(arr, ok)[a] +map(arr, ok)[b] +map(arr, one(arr, ok)) +map(arr, repeat(s, a)) +map(arr, s + "a") +map(arr, s < s) +map(arr, s > s) +map(arr, s endsWith s) +map(arr, s in obj) +map(arr, s) +map(arr, s) != obj.a +map(arr, s) != obj?.obj +map(arr, s)[obj?.a] +map(arr, s)[ok ? f : ok:a] +map(arr, split(s, s)) +map(arr, string(arr)) +map(arr, toJSON(a)) +map(arr, trimPrefix(s)) +map(arr, true || ok) +map(arr[b:a], ok) +map(arr[b:b], b) +map(arr[b:b], ok) +map(b .. 0, b / b) +map(b .. 1, #) +map(b .. 1, s) +map(b .. a, arr != arr) +map(b .. a, b) +map(b .. a, f > 0.5) +map(b .. a, obj?.fn(ok, add)) +map(b .. a, s) +map(b .. b, #) +map(b .. b, ok) +map(b .. b, string(arr)) +map(div(1, b) <= a ? arr : ok, #) +map(false ? 0 : "a", obj?.obj) +map(false ? 0 : obj, b) +map(false ? 0.5 : arr, #) +map(false ? a : arr, s) +map(false ? b : "b", #) +map(false ? div : arr, 2 * f) +map(false ? obj : s, a) +map(false ? s : arr, #) +map(filter(arr, false), obj?.fn(nil)) +map(filter(arr, false), s) +map(filter(arr, ok), 1 >= b) +map(filter(arr, ok), 2 == nil) +map(filter(arr, ok), a) +map(filter(arr, ok), arr) +map(filter(arr, ok), div) +map(filter(arr, ok), obj) +map(filter(arr, ok), s) +map(filter(arr, true), #) +map(keys(obj), #) +map(keys(obj), b) +map(map(arr, "a"), arr) +map(map(arr, "a"), b) +map(map(arr, "b"), f) +map(map(arr, "b"), s) +map(map(arr, "c"), #) +map(map(arr, 0), #) +map(map(arr, 0), obj.head(ok)) +map(map(arr, 0.5), #) +map(map(arr, 0.5), a) +map(map(arr, 0.5), arr) +map(map(arr, 0.5), f) +map(map(arr, 1), #) +map(map(arr, 1), arr) +map(map(arr, 1), b) +map(map(arr, a), #) +map(map(arr, a), arr) +map(map(arr, add), "a" == nil) +map(map(arr, add), #) +map(map(arr, add), b) +map(map(arr, add), obj) +map(map(arr, arr), #) +map(map(arr, arr), div) +map(map(arr, arr), obj) +map(map(arr, arr), obj?.b) +map(map(arr, arr), ok) +map(map(arr, b), #) +map(map(arr, b), add) +map(map(arr, b), f) +map(map(arr, b), map(arr, ok)) +map(map(arr, b), obj) +map(map(arr, b), ok) +map(map(arr, b), s) +map(map(arr, div), !true) +map(map(arr, div), #) +map(map(arr, div), add(b, 1)) +map(map(arr, div), add) +map(map(arr, div), obj) +map(map(arr, div), obj?.a) +map(map(arr, div), split(s, s)) +map(map(arr, f), #) +map(map(arr, f), s) +map(map(arr, false), #) +map(map(arr, false), add) +map(map(arr, false), arr) +map(map(arr, obj), 0 >= a) +map(map(arr, obj), a in arr) +map(map(arr, obj), a) +map(map(arr, obj), add) +map(map(arr, obj), b) +map(map(arr, obj), ok) +map(map(arr, ok), #) +map(map(arr, s), #) +map(map(arr, s), f) +map(map(arr, s), obj) +map(map(arr, true), #) +map(map(arr, true), add) +map(map(arr, true), f > f) +map(map(arr, true), f ^ 1) +map(map(arr, true), obj) +map(obj.head("a"), #) +map(obj.head("a", a, 0), #) +map(obj.head("a", add, ok), b) +map(obj.head("a", obj, "b", obj), #) +map(obj.head("b"), a) +map(obj.head("b"), ok) +map(obj.head("b", nil, a, div, true), obj.a) +map(obj.head("c"), b * 1) +map(obj.head("c", 1, div, "a", f), #) +map(obj.head("c", arr), #) +map(obj.head("c", b), 0 * b) +map(obj.head("c", b), arr) +map(obj.head(arr), #) +map(obj.head(arr), a) +map(obj.head(arr), add) +map(obj.head(arr), obj.obj) +map(obj.head(arr), s) +map(obj.head(arr, 0.5), a) +map(obj.head(arr, arr, 0), a) +map(obj.head(arr, false), arr) +map(obj.head(arr, ok), #) +map(obj.head(obj), a .. 0) +map(obj.head(obj), a) +map(obj.head(obj), arr) +map(obj.head(obj), f) +map(obj.head(obj), obj) +map(obj.head(obj, a), 1 .. b) +map(obj.head(obj, div), obj.obj) +map(obj.head(s), #) +map(obj.head(s), 0 + f) +map(obj.head(s), a) +map(obj.head(s), arr) +map(obj.head(s), b % a) +map(obj.head(s), b) +map(obj.head(s), f) +map(obj.head(s), ok) +map(obj.head(s), s) +map(obj.head(s, add, div), f) +map(obj.head(s, b, f, ok, f), #) +map(obj.head(s, ok, 0), a / 0.5) +map(obj.obj, !false) +map(obj.obj, "b" startsWith s) +map(obj.obj, "c" > s) +map(obj.obj, -0.5) +map(obj.obj, -obj?.b) +map(obj.obj, 0 == 1) +map(obj.obj, 0.5 >= b) +map(obj.obj, 2 + a) +map(obj.obj, 2 .. b) +map(obj.obj, a) +map(obj.obj, add) +map(obj.obj, arr) +map(obj.obj, b ** b) +map(obj.obj, b == 2) +map(obj.obj, b) +map(obj.obj, div(0, a)) +map(obj.obj, div) +map(obj.obj, f) +map(obj.obj, false || true) +map(obj.obj, not false) +map(obj.obj, obj) +map(obj.obj, obj.a) +map(obj.obj, obj.b) +map(obj.obj, obj.fn(a)) +map(obj.obj, obj.head(a, obj, f, f)) +map(obj.obj, obj?.a) +map(obj.obj, obj?.head(f, add, s)) +map(obj.obj, obj?.head(nil, true)) +map(obj.obj, obj?.head(obj, arr)) +map(obj.obj, ok) +map(obj.obj, s > s) +map(obj.obj, s matches s) +map(obj.obj, s startsWith s) +map(obj.obj, s) +map(obj.obj, string(0.5)) +map(obj.obj, toBase64("c")) +map(obj.obj, toJSON(ok)) +map(obj.obj.obj, a) +map(obj.obj?.obj, b) +map(obj?.head("a"), a) +map(obj?.head("a"), add) +map(obj?.head("a"), obj) +map(obj?.head("b"), add) +map(obj?.head("b", a, arr, ok, true), add) +map(obj?.head("b", b), obj) +map(obj?.head("c"), #) +map(obj?.head("c"), ok && ok) +map(obj?.head("c", add, f, "b"), #) +map(obj?.head("c", arr, true), f ^ 0) +map(obj?.head("c", false), #) +map(obj?.head(arr), a) +map(obj?.head(arr), s) +map(obj?.head(arr, "b"), #) +map(obj?.head(arr, 2), obj) +map(obj?.head(arr, add), b) +map(obj?.head(arr, b, nil, arr), toJSON(ok)) +map(obj?.head(arr, true, f), s) +map(obj?.head(obj), -a) +map(obj?.head(obj), b) +map(obj?.head(obj), obj.b) +map(obj?.head(obj), ok) +map(obj?.head(obj, "c"), s) +map(obj?.head(obj, 0.5), add) +map(obj?.head(obj, a, false), arr) +map(obj?.head(obj, f, add, s, true), s >= "b") +map(obj?.head(obj, ok, b, a), div) +map(obj?.head(s), b > 0.5) +map(obj?.head(s), b) +map(obj?.head(s), f) +map(obj?.head(s), obj) +map(obj?.head(s, "a", arr, obj), arr) +map(obj?.head(s, b), obj?.a) +map(obj?.head(s, obj), #) +map(obj?.head(s, ok), a / 2) +map(obj?.obj, -2) +map(obj?.obj, 0 + a) +map(obj?.obj, 0 == f) +map(obj?.obj, 1 != 0) +map(obj?.obj, 1 .. 0) +map(obj?.obj, a != nil) +map(obj?.obj, a + 0) +map(obj?.obj, a) +map(obj?.obj, abs(0)) +map(obj?.obj, add) +map(obj?.obj, arr) +map(obj?.obj, b > a) +map(obj?.obj, b > f) +map(obj?.obj, b) +map(obj?.obj, count(arr, false)) +map(obj?.obj, count(arr, true)) +map(obj?.obj, div == add) +map(obj?.obj, div) +map(obj?.obj, f * a) +map(obj?.obj, f) +map(obj?.obj, first(arr)) +map(obj?.obj, len(s)) +map(obj?.obj, max(f, f * a)) +map(obj?.obj, nil != add) +map(obj?.obj, nil == obj?.a) +map(obj?.obj, obj) +map(obj?.obj, obj.a) +map(obj?.obj, obj.b) +map(obj?.obj, obj.fn(0)) +map(obj?.obj, obj.head(b)) +map(obj?.obj, obj.obj) +map(obj?.obj, obj?.a) +map(obj?.obj, obj?.b) +map(obj?.obj, obj?.fn(0)) +map(obj?.obj, obj?.head(ok, 0)) +map(obj?.obj, obj?.obj) +map(obj?.obj, ok == true) +map(obj?.obj, ok ? 0.5 : s) +map(obj?.obj, ok ? false : ok) +map(obj?.obj, ok) +map(obj?.obj, s) +map(obj?.obj, toBase64(s)) +map(obj?.obj, true ? 0 : arr) +map(obj?.obj.obj, a) +map(obj?.obj.obj, add) +map(obj?.obj.obj, div) +map(obj?.obj.obj, obj.a) +map(obj?.obj.obj, ok) +map(ok ? arr : "b", 1 + a) +map(ok ? arr : nil, a) +map(ok ? obj : "c", ok) +map(ok ? obj : 0, arr) +map(ok ? obj : add, div(b, a)) +map(ok ? obj : arr, arr) +map(ok ? s : arr, b) +map(ok ? s : div, #) +map(ok ? s : div, add) +map(split(s, "c"), #) +map(true ? "a" : obj, #) +map(true ? "b" : div, s) +map(true ? arr : arr, #) +map(true ? arr : f, abs(0.5)) +map(true ? arr : nil, arr) +map(true ? obj : f, obj.head(0, true, 0.5, s)) +map(true ? s : 0, a) +map(values(obj), f) +map(values(obj), filter(arr, ok)) +max(-0) +max(-0.5) +max(-2) +max(-a) +max(-a, 0 + a) +max(-b) +max(-f) +max(0 % 2, b) +max(0 % a) +max(0 ** 0.5) +max(0 ** 2) +max(0 ** b) +max(0 ** f) +max(0 + 0.5) +max(0 + a) +max(0 - 2) +max(0 - a) +max(0 / 0) +max(0 / b) +max(0 / f) +max(0 ^ b) +max(0 ^ f) +max(0) != obj.head(false, f) +max(0) + b +max(0) .. a +max(0) <= b +max(0) == b +max(0) > b != ok +max(0, 0) != f +max(0, a) < f +max(0, b) * f +max(0.5 * f) +max(0.5 - a) +max(0.5 - f) +max(0.5 ^ 0) +max(0.5) != obj?.a +max(0.5) + f +max(0.5) <= 0 * b +max(0.5) ^ obj.head(b) +max(0.5, 2) != obj?.b +max(0.5, b) < b ? div : 2 +max(0.5, b, 0.5) < obj?.a +max(1 % 1) +max(1 * a) +max(1 ** f) +max(1 - a) +max(1 / 2) +max(1 / f) +max(1 ^ f) +max(1) .. b +max(1) / int(f) +max(1) / max(b, a, 0.5, 2) +max(1) > 0.5 ? add : ok +max(2 * 2) +max(2 * f) +max(2 + f) +max(2 - 0.5) +max(2 / a) +max(2 / f) +max(2 ^ 1) +max(2 ^ f) +max(2) * b +max(2) - 0 % a +max(2) ^ a ^ 0 +max(2, b) != b +max(a % a) +max(a % b) +max(a * 0.5) +max(a * f) +max(a ** a) +max(a ** f) +max(a + 0.5) +max(a + 1) +max(a + 1, f) +max(a + a) +max(a - 0) +max(a - 1) +max(a - f) +max(a / a, a) +max(a / obj?.b) +max(a / obj?.head(0.5, s, div)) +max(a ^ 0) +max(a ^ f) +max(a) +max(a) - b +max(a) - div(0, b) +max(a) .. a +max(a) < f +max(a) <= b +max(a) <= f +max(a) == b ? 0 : nil +max(a) > f +max(a, -b) +max(a, 0) - b +max(a, 1) ^ b ** f +max(a, a) +max(a, a, b) +max(a, b) +max(a, f) +max(abs(a)) +max(abs(arr[b])) +max(abs(b)) +max(abs(f ^ 0.5)) +max(add(0, 0)) +max(add(0, b)) +max(add(1, 1)) +max(add(1, 2)) +max(add(2, a)) +max(add(a, 1)) +max(add(a, 2)) +max(add(a, a)) +max(add(b - a, obj.a)) +max(add(b, b)) +max(arr[0]) +max(arr[0], a) +max(arr[1]) +max(arr[a]) +max(arr[b]) +max(b % b) +max(b * 0) +max(b * a) +max(b * f) +max(b ** 0) +max(b ** 0.5) +max(b ** 2) +max(b ** a) +max(b ** f) +max(b + a) +max(b - b) +max(b - f) +max(b / 0) +max(b / 2) +max(b / b) +max(b / f) +max(b ^ 0) +max(b ^ 0.5) +max(b ^ 1) +max(b ^ b) +max(b ^ f) +max(b) +max(b) != 0.5 ** 0 +max(b) * f +max(b) ** a +max(b) < b +max(b) == div(b, b) +max(b) == max(b) +max(b, 2) ^ b +max(b, a) +max(b, a) >= float(f) +max(b, b) +max(b, f) +max(b, float(a)) +max(count(arr, true)) +max(div(0, 2)) +max(div(0, a)) +max(div(1, 1)) +max(div(1, a)) +max(div(1, b)) +max(div(a, 2)) +max(div(a, b)) +max(div(b, 2)) +max(div(b, a)) +max(div(b, b)) +max(f * 0) +max(f * a) +max(f * b) +max(f * b, a) +max(f * f) +max(f ** a) +max(f ** obj.b) +max(f + 0) +max(f + a) +max(f + b) +max(f - 0) +max(f - 1) +max(f - 2) +max(f - b) +max(f - f) +max(f / 0) +max(f / 0.5) +max(f / 1) +max(f / a) +max(f / b) +max(f / f) +max(f ^ a) +max(f ^ b) +max(f ^ f) +max(f ^ f) ^ b +max(f) +max(f) != obj.a +max(f) * a +max(f) - int(0) +max(f) / obj?.head(a, ok) +max(f, 2 / f) +max(f, a) +max(f, b) +max(f, f) +max(false ? 0 : b) +max(false ? b : b) +max(float(0.5)) +max(float(2)) +max(float(b)) +max(float(f)) +max(get(arr, 0), a) +max(get(arr, a)) +max(get(arr, b)) +max(int(0)) +max(int(0.5)) +max(int(a)) +max(int(b)) +max(last(arr)) +max(len("a")) +max(len("c"), b) +max(len(obj.head(s))) +max(max(0, f, b, a)) +max(max(2)) +max(max(a, 0.5)) +max(max(b)) +max(max(b, 2, f)) +max(max(f)) +max(min(0.5)) +max(min(2)) +max(min(a)) +max(min(a, b)) +max(min(b, 0)) +max(min(f)) +max(true ? a : 0) +min(-(0.5 ^ b)) +min(-0) +min(-2) +min(-a) +min(-b) +min(-f) +min(-f, a) +min(0 % 2) +min(0 % b) +min(0 * a) +min(0 * b, b) +min(0 ** a) +min(0 ** b) +min(0 ** f, f) +min(0 + 0) +min(0 - b) +min(0 / 1) +min(0 / 2) +min(0 / f) +min(0 ^ 0) +min(0) % b +min(0) % obj.b +min(0) * obj?.b +min(0) + b +min(0) - b +min(0) / a +min(0) / obj?.head(a) +min(0) > a / b +min(0) ^ get(arr, a) +min(0, 2) ^ f +min(0.5 * 0) +min(0.5 ** a) +min(0.5 - f) +min(0.5 / a) +min(0.5 / b) +min(0.5 / f) +min(0.5 ^ 0) +min(0.5 ^ 1) +min(0.5 ^ a) +min(0.5) != f +min(0.5) * a +min(0.5) ** a +min(0.5) - f +min(0.5) > a +min(1 % b) +min(1 * f) +min(1 ** b) +min(1 + 1) +min(1 + a) +min(1 - a) +min(1 / a) +min(1 / b) +min(1 ^ 0) +min(1) .. obj?.b +min(1) == obj.obj +min(1) >= f ? b : arr +min(1) ^ b +min(2 % b + a) +min(2 % b) +min(2 * b) +min(2 ** 0) +min(2 ** f) +min(2 + 0.5) +min(2 - b) +min(2 ^ a) +min(2) ** f +min(a % 1) +min(a % a) +min(a % b) +min(a * a) +min(a * b, int(0)) +min(a * f) +min(a ** 0) +min(a ** a, b) +min(a ** b) +min(a ** f) +min(a - 2) +min(a - a) +min(a - f) +min(a / a) +min(a / b) +min(a ^ 0.5) +min(a ^ b) +min(a ^ obj.a) +min(a) +min(a) != f +min(a) % a +min(a) ** f +min(a) - obj.b +min(a) / b +min(a) < a / 0 +min(a) == a +min(a) > b +min(a) > obj?.a +min(a) >= a ^ b +min(a) >= obj.head(f, nil) +min(a) ^ a +min(a) ^ f +min(a, 0.5 / a) +min(a, 2) ^ f +min(a, a ** f) +min(a, a) +min(a, a) > f ** 0.5 +min(a, b) +min(a, b) != f / a +min(abs(0)) +min(abs(a)) +min(abs(b)) +min(add(0, 0)) +min(add(0, 1)) +min(add(0, 2)) +min(add(0, a)) +min(add(2, b)) +min(add(a, a)) +min(add(a, a), b) +min(add(a, b)) +min(add(b, 0)) +min(add(b, 1)) +min(add(b, a)) +min(add(b, b)) +min(arr[0]) +min(arr[1]) +min(arr[a]) +min(arr[b]) +min(b % a) +min(b * b) +min(b * f) +min(b ** 0) +min(b ** 0.5) +min(b ** a) +min(b + 1) +min(b + a) +min(b + b) +min(b + f) +min(b - 0) +min(b - 0.5) +min(b - a) +min(b / f) +min(b / obj.a) +min(b ^ a) +min(b ^ f) +min(b) +min(b) * obj.a +min(b) * obj.head(f, b) +min(b) ** a +min(b) + div(0, a) +min(b) .. obj.a +min(b) < -f +min(b) <= a / f +min(b) <= len(s) +min(b) == obj.a +min(b) ^ b +min(b, 0) >= b +min(b, 0, f) - b +min(b, 1) != obj?.head(f) +min(b, a - a) +min(b, a) +min(b, a) % obj.b +min(b, a) ^ 0.5 ^ 0.5 +min(b, f) +min(count(arr, ok)) +min(count(map(arr, add), f != nil)) +min(div(0, a) / f) +min(div(0, b)) +min(div(1, a)) +min(div(2, a)) +min(div(2, b)) +min(div(a, 1)) +min(div(a, 2)) +min(div(a, b)) +min(div(a, b), a) +min(div(b, 2)) +min(div(b, b)) +min(f * a, a) +min(f ** 0.5) +min(f ** a) +min(f ** b) +min(f ** f) +min(f - 0.5) +min(f - a) +min(f / 0) +min(f / a) +min(f / b) +min(f / f) +min(f ^ 0) +min(f ^ 0.5) +min(f ^ b) +min(f) +min(f) * a ^ f +min(f) ** obj?.head(b, nil, true, 2, add) +min(f) / obj.a +min(f) > f +min(f, a) +min(f, f) +min(first(arr)) +min(float(0)) +min(float(b)) +min(get(arr, 0)) +min(get(arr, 1)) +min(get(arr, 2)) +min(get(arr, a)) +min(get(arr, b)) +min(indexOf(s, s)) +min(int(0)) +min(int(1)) +min(int(a)) +min(int(b)) +min(last(arr)) +min(len("c")) +min(len(arr)) +min(len(obj)) +min(len(obj?.obj)) +min(len(s)) +min(len(s), a) +min(max(a)) +min(max(b)) +min(max(b, 0.5)) +min(max(f)) +min(min(1)) +min(min(a)) +min(min(b, 0)) +min(min(f)) +min(min(int(f), b)) +min(ok ? b : 2) +min(ok ? b : a) +min(true ? 2 : 2) +nil != "a" == ok +nil != "a" || b <= 0 +nil != "c" or ok +nil != 0 && obj.a +nil != 0 || ok +nil != 0.5 != ok +nil != a and ok +nil != a or ok +nil != add && b > 0 +nil != add or obj.b +nil != arr != obj.obj +nil != arr or ok +nil != b != obj.obj +nil != b && obj.b +nil != b and ok ? ok : add +nil != b || obj.fn(s, ok).b +nil != div != obj?.head(ok) +nil != div != ok +nil != div and ok +nil != f and f < 2 +nil != f or obj?.obj +nil != false or obj.obj +nil != obj != (ok or ok) +nil != obj && "c" > "b" +nil != obj or ok +nil != obj.a +nil != obj.b +nil != obj.obj +nil != obj.obj.a +nil != obj.obj.obj +nil != obj?.a +nil != obj?.b +nil != obj?.b .. b +nil != obj?.obj +nil != obj?.obj?.b +nil != obj?.obj?.obj +nil != ok ? obj.a : add +nil != s and 0.5 == 2 +nil != s or obj?.fn(1) +nil != s or ok +nil != true ? ok != ok : int("c") +nil == "a" or nil != false +nil == "c" and obj.fn("b", s, a) +nil == a || 2 != b +nil == a || ok +nil == add != obj?.head(nil, add) +nil == add != obj?.obj +nil == add && obj.b +nil == add and obj == nil +nil == arr != true ? b : b +nil == arr && obj.b +nil == arr && obj?.head(obj, nil, a) +nil == arr and obj.head(div(arr, a)?.head(add?.fn(nil), arr ? "c" : 0), 0 matches a.obj) +nil == arr and ok +nil == div || any(arr, true) +nil == f != obj.a +nil == f && obj.a +nil == f and obj.obj +nil == false and nil == arr +nil == false and not false +nil == nil || 0 >= 0 +nil == obj && obj?.obj +nil == obj ? f / b : obj +nil == obj and ok +nil == obj || obj?.a +nil == obj || ok +nil == obj.a +nil == obj.b +nil == obj.head(add) +nil == obj.obj +nil == obj.obj.obj +nil == obj?.a +nil == obj?.b +nil == obj?.obj +nil == obj?.obj.a +nil == obj?.obj.obj +nil == obj[s] +nil == ok && !true +nil == ok && obj?.fn(b) +nil == ok ? s : b +nil == ok and obj.obj +nil == ok and obj?.head("c") +nil == ok or ok +nil == ok || obj.a +nil == ok || ok +nil == s != ok +nil == s and obj?.fn(true, 1) +nil == s or ok +nil == true and {"b": arr}.b +nil in arr && obj.a +nil in arr == ok +nil in arr ? 2 .. 2 : obj +nil in obj && ok +nil in obj or 2 < 0 +nil in obj.obj +nil in obj?.head(obj) +nil in obj?.obj +nil in obj?.obj?.obj +none(0 .. a, ok) +none(1 .. b, ok) +none([true], ok) +none(a .. 0, obj.a) +none(a .. a, "b" > "b") +none(a .. a, nil == obj) +none(arr, "a" < s) +none(arr, "a" contains s) +none(arr, "a" startsWith s) +none(arr, 0 < 1) +none(arr, 0 <= b) +none(arr, 0 == nil) +none(arr, 0 > 0.5) +none(arr, 0 >= 0) +none(arr, 0 >= b) +none(arr, 0.5 < b) +none(arr, 0.5 == b) +none(arr, 0.5 >= 0) +none(arr, 1 != a) +none(arr, 1 <= b) +none(arr, 1 in arr) +none(arr, 2 <= a) +none(arr, a != 0) +none(arr, a != 2) +none(arr, a != a) +none(arr, a != nil) +none(arr, a < 0) +none(arr, a < f) +none(arr, a <= 0.5) +none(arr, a == nil) +none(arr, a in arr) +none(arr, add != add) +none(arr, add == nil) +none(arr, all(arr, ok)) +none(arr, arr != arr) +none(arr, b != get(arr, 0)) +none(arr, b < 0) +none(arr, b < f) +none(arr, b == a) +none(arr, b >= a) +none(arr, div != obj.obj) +none(arr, div == div) +none(arr, f != 0) +none(arr, f != nil) +none(arr, f == 0.5) +none(arr, f > f) +none(arr, false) and ok +none(arr, nil != add) +none(arr, nil != b) +none(arr, nil != f) +none(arr, nil == 0) +none(arr, nil == arr) +none(arr, nil == f) +none(arr, nil == obj) +none(arr, none(arr, false)) +none(arr, not ok) +none(arr, obj.head(false, "b", nil)) +none(arr, obj?.head(false)) +none(arr, obj?.obj == (true and false)) +none(arr, ok ? true : b) +none(arr, ok and false) +none(arr, ok or ok) +none(arr, ok || false) +none(arr, ok) +none(arr, ok) && obj.obj +none(arr, ok) && obj?.obj +none(arr, ok) == obj.b +none(arr, ok) == obj?.obj +none(arr, ok) == ok +none(arr, s != "b") +none(arr, s != "c") +none(arr, s != s) +none(arr, s endsWith "c") +none(arr, s matches s) +none(arr, s startsWith "c") +none(arr, true) != obj.b +none(arr, true) and obj.b +none(arr, true) or obj.head(s, arr) +none(b .. 0, obj.a) +none(b .. 2, ok) +none(false ? 0.5 : arr, s <= "b") +none(filter(arr, ok), any(arr, ok)) +none(filter(arr, ok), ok and false) +none(keys(obj), nil == obj) +none(map(arr, "b"), f < b) +none(map(arr, add), 0 == f) +none(map(arr, add), b > a) +none(map(arr, b), ok) +none(map(arr, f), ok) +none(map(arr, false), #) +none(map(arr, false), ok) +none(map(arr, obj), s > s) +none(map(arr, ok), "b" <= "b") +none(map(arr, ok), #) +none(map(arr, s), b != nil) +none(map(arr, s), ok && ok) +none(map(arr, s), ok || ok) +none(obj.head(arr), nil == s) +none(obj.head(obj), s matches "b") +none(obj.head(obj, true), ok) +none(obj.head(s), !ok) +none(obj.obj, 1 < f) +none(obj.obj, b != a) +none(obj.obj, b == b) +none(obj.obj, nil != arr) +none(obj.obj, ok and true) +none(obj.obj, ok) +none(obj.obj, s endsWith s) +none(obj.obj, s matches s) +none(obj.obj, true ? ok : "c") +none(obj?.head("a"), 1 <= 0.5) +none(obj?.head("b", nil), ok) +none(obj?.head("b", true), f < f) +none(obj?.head(obj, b, obj), ok) +none(obj?.head(obj, nil), ok) +none(obj?.obj, !ok) +none(obj?.obj, 1 > b) +none(obj?.obj, a != f) +none(obj?.obj, a > f) +none(obj?.obj, div != add) +none(obj?.obj, f < 0.5) +none(obj?.obj, f >= f) +none(obj?.obj, ok != false) +none(obj?.obj, ok) +none(obj?.obj, s contains "b") +none(obj?.obj, s startsWith s) +none(obj?.obj, true == false) +none(obj?.obj.obj, ok) +none(ok ? "b" : false, ok == ok) +not !!true +not !(nil == 0.5) +not !all(arr, true) +not !false +not !ok +not !true +not ("a" != "b") +not ("a" != nil) +not ("a" <= "c") +not ("a" <= s) +not ("a" == "a") +not ("a" == "c") +not ("a" == nil) +not ("a" > s) +not ("a" >= s) +not ("a" contains "a") +not ("a" contains "b") +not ("a" contains s) +not ("a" endsWith "b") +not ("a" endsWith s) +not ("a" in obj) +not ("a" matches "c") +not ("a" startsWith "a") +not ("a" startsWith "b") +not ("b" != "a") +not ("b" != nil) +not ("b" <= "a") +not ("b" <= "c") +not ("b" <= s) +not ("b" == "a") +not ("b" == "c") +not ("b" == nil) +not ("b" == s) +not ("b" > s) +not ("b" >= s) +not ("b" contains "a") +not ("b" contains "b") +not ("b" contains s) +not ("b" endsWith "a") +not ("b" endsWith "b") +not ("b" endsWith s) +not ("b" in obj) +not ("b" matches "b") +not ("b" startsWith "b") +not ("b" startsWith s) +not ("c" != "a") +not ("c" != s) +not ("c" <= "c") +not ("c" == "a") +not ("c" > "b") +not ("c" >= "a") +not ("c" >= s) +not ("c" contains "a") +not ("c" contains "c") +not ("c" contains s) +not ("c" endsWith s) +not ("c" in obj) +not ("c" matches "a") +not ("c" matches "b") +not ("c" matches s) +not ("c" startsWith s) +not (-0.5 < a) +not (0 != 0) +not (0 != 2) +not (0 != a) +not (0 != b) +not (0 != f) +not (0 != nil) +not (0 < 0.5) +not (0 < 2) +not (0 < a) +not (0 < b) +not (0 < f) +not (0 <= 0) +not (0 <= 0.5) +not (0 <= 1) +not (0 <= a) +not (0 <= b) +not (0 <= f) +not (0 == 0.5) +not (0 == 1) +not (0 == 2) +not (0 == a) +not (0 == f) +not (0 == nil) +not (0 > 0) +not (0 > 0.5) +not (0 > 2) +not (0 > a) +not (0 > b) +not (0 > f) +not (0 >= 0) +not (0 >= 0.5) +not (0 >= 1) +not (0 >= 2) +not (0 >= a) +not (0 >= b) +not (0 >= f) +not (0 in arr) +not (0.5 != 0) +not (0.5 != 0.5) +not (0.5 != a) +not (0.5 != b) +not (0.5 != f) +not (0.5 != nil) +not (0.5 < 0.5) +not (0.5 < a) +not (0.5 < b) +not (0.5 < f) +not (0.5 <= 0) +not (0.5 <= a) +not (0.5 <= b) +not (0.5 == 0) +not (0.5 == 0.5) +not (0.5 == 2) +not (0.5 == a) +not (0.5 == b) +not (0.5 == f) +not (0.5 == nil) +not (0.5 > 0) +not (0.5 > 1) +not (0.5 > a) +not (0.5 > b) +not (0.5 > f) +not (0.5 >= 0) +not (0.5 >= 0.5) +not (0.5 >= a) +not (0.5 >= b) +not (0.5 >= f) +not (1 != 0) +not (1 != b) +not (1 != f) +not (1 != nil) +not (1 < 0) +not (1 < a) +not (1 < f) +not (1 <= f) +not (1 == 0.5) +not (1 == b) +not (1 == f) +not (1 > 0.5) +not (1 > b) +not (1 > f) +not (1 >= 0) +not (1 >= 0.5) +not (1 >= 2) +not (1 >= a) +not (1 >= f) +not (1 in arr) +not (2 != 0.5) +not (2 != 2) +not (2 != a) +not (2 != f) +not (2 != nil) +not (2 < 0.5) +not (2 < b) +not (2 < f) +not (2 <= 0.5) +not (2 <= b) +not (2 <= f) +not (2 == a) +not (2 > 0) +not (2 > 1) +not (2 > a) +not (2 > b) +not (2 > f) +not (2 >= a) +not (2 >= b) +not (2 >= b) && ok +not (2 in arr) +not (a != 0) +not (a != 0.5) +not (a != 2) +not (a != a) +not (a != b) +not (a != f) +not (a < 0) +not (a < 1) +not (a < 2) +not (a < a) +not (a < b) +not (a < f) +not (a <= 0) +not (a <= 0.5) +not (a <= 1) +not (a <= a) +not (a <= b) +not (a <= f) +not (a == 0) +not (a == 0.5) +not (a == 1) +not (a == 2) +not (a == a) +not (a == b) +not (a == f) +not (a == nil) +not (a > 0) +not (a > 1) +not (a > a) +not (a > b) +not (a > f) +not (a >= 0) +not (a >= 0.5) +not (a >= 1) +not (a >= a) +not (a >= b) +not (a >= f) +not (a in arr) +not (add != add) +not (add != div) +not (add != nil) +not (add == add) +not (add == div) +not (add == nil) +not (arr != arr) +not (arr != nil) +not (arr == arr) +not (arr == nil) +not (b != 0) +not (b != 0.5) +not (b != 1) +not (b != 2) +not (b != a) +not (b != b) +not (b != f) +not (b != nil) +not (b ** 0 >= a) +not (b < 0) +not (b < 0.5) +not (b < a) +not (b < b) +not (b < f) +not (b <= 0.5) +not (b <= 1) +not (b <= 2) +not (b <= a) +not (b <= b) +not (b <= f) +not (b == 0) +not (b == 0.5) +not (b == 1) +not (b == 2) +not (b == a) +not (b == b) +not (b == f) +not (b == nil) +not (b > 0) +not (b > 1) +not (b > 2) +not (b > a) +not (b > b) +not (b > f) +not (b >= 0) +not (b >= 0.5) +not (b >= a) +not (b >= b) +not (b >= f) +not (b in arr) +not (div != add) +not (div != div) +not (div != nil) +not (div == add) +not (div == div) +not (div == nil) +not (f != 0) +not (f != 0.5) +not (f != a) +not (f != b) +not (f != f) +not (f < 0) +not (f < 1) +not (f < 2) +not (f < a) +not (f < b) +not (f < f) +not (f <= 1) +not (f <= a) +not (f <= b) +not (f <= f) +not (f == 0) +not (f == 0.5) +not (f == 1) +not (f == 2) +not (f == a) +not (f == b) +not (f == f) +not (f == nil) +not (f > 0) +not (f > 0.5) +not (f > 1) +not (f > 2) +not (f > a) +not (f > b) +not (f > f) +not (f > obj.b) +not (f >= 0) +not (f >= 1) +not (f >= 2) +not (f >= a) +not (f >= b) +not (f >= f) +not (false != false) +not (false != nil) +not (false != ok) +not (false && ok) +not (false && true) +not (false == nil) +not (false == ok) +not (false == true) +not (false and true) +not (false or false) +not (false || false) +not (false || ok) +not (false || true) +not (nil != "b") +not (nil != "c") +not (nil != 0) +not (nil != 2) +not (nil != a) +not (nil != add) +not (nil != arr) +not (nil != b) +not (nil != div) +not (nil != f) +not (nil != nil) +not (nil != obj) +not (nil != ok) +not (nil != s) +not (nil != true) +not (nil == "b") +not (nil == 0) +not (nil == 0.5) +not (nil == a) +not (nil == add) +not (nil == arr) +not (nil == b) +not (nil == div) +not (nil == f) +not (nil == false) +not (nil == nil) +not (nil == obj) +not (nil == ok) +not (nil == s) +not (nil == true) +not (nil in arr) +not (nil in obj) +not (obj != nil) +not (obj != obj) +not (obj == nil) +not (obj == obj) +not (obj.b != a ** a) +not (obj.b == ok) +not (obj.head(a) ** f <= f) +not (obj.head(b, div) == s) +not (obj.obj == f) +not (obj?.a != f ** 1) +not (obj?.b < b) +not (obj?.b == ok) +not (ok != false) +not (ok != nil) +not (ok != ok) +not (ok != true) +not (ok && false) +not (ok && ok) +not (ok && true) +not (ok == false) +not (ok == nil) +not (ok == true) +not (ok and false) +not (ok and ok) +not (ok and true) +not (ok or false) +not (ok or ok) +not (ok || obj.b) +not (ok || ok) +not (ok || true) +not (s != "a") +not (s != "b") +not (s != "c") +not (s != nil) +not (s != s) +not (s < "a") +not (s < "b") +not (s < "c") +not (s < s) +not (s <= "a") +not (s <= "b") +not (s <= "c") +not (s <= s) +not (s == "a") +not (s == "b") +not (s == "c") +not (s == nil) +not (s == s) +not (s > "c") +not (s > s) +not (s >= "a") +not (s >= "b") +not (s >= "c") +not (s >= s) +not (s contains "c") +not (s contains s) +not (s endsWith "a") +not (s endsWith "b") +not (s endsWith lower("b")) +not (s endsWith s) +not (s in obj) +not (s matches "a") +not (s matches "c") +not (s matches s) +not (s startsWith "a") +not (s startsWith "b") +not (s startsWith s) +not (true != false) +not (true != nil) +not (true != ok) +not (true != true) +not (true && false) +not (true && true) +not (true == nil) +not (true == ok) +not (true == true) +not (true and false) +not (true and ok) +not (true or false) +not (true or ok) +not (true or true) +not (true || ok) +not (true || true) +not all(arr, false) +not all(arr, ok) +not all(arr, true) +not any(arr, false) +not any(arr, ok) +not any(arr, true) +not false ? "a" : obj +not false ? "c" : 0.5 +not false ? 0 : obj.obj +not false ? 0.5 : 0.5 +not false ? 0.5 : a +not false ? 2 : 1 +not false ? a : div +not false ? a : s +not false ? add : 2 +not false ? add : obj +not false ? arr : arr +not false ? b : div +not false ? b : ok +not false ? b : s +not false ? div : nil +not false ? div : ok +not false ? f : "a" +not false ? f : 0 +not false ? f : 1 +not false ? false : s +not false ? nil : "b" +not false ? nil : f +not false ? obj : "c" +not false ? obj : add +not false ? ok : nil +not false ? ok : ok +not false ? s : 0 +not false ? s : add +not false ? s : b +not false ? s : obj +not false ? s : true +not false ? true : false +not false and obj.head(add) +not false and obj?.obj.obj +not false or b == nil +not false or obj?.fn(false) +not false or obj?.head(arr, obj)?.b +not false or obj?.obj +not false || a <= b +not hasPrefix(s, "c") +not hasSuffix("a", "a") +not hasSuffix(s, "a") +not none(arr, false) +not none(arr, ok) +not none(arr, true) +not not (f > f) +not not (nil == div) +not not false +not not obj.head(ok, ok) +not not ok +not not true +not obj.head(f != true) +not obj.head(false) +not obj.head(false, add) +not obj.head(false, div) +not obj.head(obj, arr, b, nil).head(f <= 0) +not obj.head(ok) +not obj.head(ok, a) +not obj.head(ok, add, a, s) +not obj.head(ok, b, s) +not obj.head(ok, div) +not obj.head(true == "c") +not obj.head(true) +not obj?.head(0.5 <= a) +not obj?.head(false) +not obj?.head(false, 1) +not obj?.head(false, b) +not obj?.head(false, nil) +not obj?.head(ok) +not obj?.head(ok, "c") +not obj?.head(ok, 0) +not obj?.head(ok, a) +not obj?.head(ok, div) +not obj?.head(ok, div, a) +not obj?.head(ok, f, true) +not obj?.head(ok, s) +not obj?.head(true) +not ok +not ok != obj.obj +not ok != obj.obj?.obj +not ok != ok +not ok && obj.obj +not ok && obj?.b +not ok && obj?.head(b).a +not ok && s > obj?.a +not ok == obj?.a +not ok == obj?.b +not ok == ok +not ok ? "a" : b +not ok ? "a" : f +not ok ? "b" : a +not ok ? "b" : f +not ok ? "b" : s +not ok ? "c" : a +not ok ? 0 : obj +not ok ? 0 : true +not ok ? 0.5 : false +not ok ? 1 : b +not ok ? 1 : f +not ok ? 1 : true +not ok ? 2 : div +not ok ? 2 : true +not ok ? a : 1 +not ok ? a : a +not ok ? a : obj +not ok ? a : s +not ok ? add : 1 +not ok ? add : b +not ok ? add : nil +not ok ? add : s +not ok ? arr : nil +not ok ? arr : ok +not ok ? arr : true +not ok ? b : a +not ok ? b : add +not ok ? b : div +not ok ? b : obj +not ok ? div : 1 +not ok ? div : a +not ok ? div : b +not ok ? div : obj.b +not ok ? f : "c" +not ok ? f : false +not ok ? f : obj?.obj +not ok ? f : s +not ok ? false : "c" +not ok ? obj : arr +not ok ? obj : b +not ok ? obj : div +not ok ? ok : "c" +not ok ? ok : 0 +not ok ? ok : a +not ok ? ok : add +not ok ? ok : arr +not ok ? ok : ok +not ok ? s : a +not ok ? true : add +not ok ? true : false +not ok and obj?.a.obj +not ok or obj.a +not ok or ok +not ok || 0 <= f +not ok || obj.head(0, nil) +not ok || obj?.obj +not ok || ok +not one(arr, false) +not one(arr, ok) +not one(arr, true) +not true != obj?.b +not true ? "b" : b +not true ? 0 : div +not true ? 0.5 : ok +not true ? 1 : obj +not true ? a : a +not true ? arr : 1 +not true ? arr : b +not true ? b : "a" +not true ? b : 2 +not true ? b : a +not true ? b : div +not true ? b : obj +not true ? div : nil +not true ? div : true +not true ? f : false +not true ? f : obj +not true ? f : true +not true ? nil : "c" +not true ? nil : a +not true ? obj : arr +not true ? obj : f +not true ? obj : ok +not true ? s : ok +not true and obj[s] +not true and ok +not true or obj.obj?.a +not true || ok +obj +obj != get(obj, s) +obj != nil == true +obj != nil ? f : "b" +obj != nil and obj?.fn(a) +obj != nil and s <= "a" +obj != nil || b <= obj.fn(fromJSON(a), trimSuffix(div(true), true % s, a startsWith obj, f ^ add), f) +obj != obj +obj != obj != ok +obj != obj && obj?.head(0, true) +obj != obj == ok +obj != obj ? 0 : obj +obj != obj ? 1 : 0.5 +obj != obj or obj.obj +obj != obj || obj?.obj +obj != obj.a +obj != obj.b +obj != obj.c +obj != obj.fn(a) +obj != obj.fn(b) +obj != obj.head(b, f) +obj != obj.head(f, s, s, ok) +obj != obj.head(false) +obj != obj.head(nil or false) +obj != obj.head(ok) +obj != obj.obj +obj != obj.obj.b +obj != obj.obj?.b +obj != obj.obj?.obj +obj != obj?.a +obj != obj?.b +obj != obj?.fn(b) +obj != obj?.head(0, b) +obj != obj?.head(a, 0) +obj != obj?.head(obj) +obj != obj?.obj +obj != obj?.obj.b +obj != obj?.obj.obj +obj != obj?.obj?.b +obj != obj?.obj?.obj +obj != obj[s] +obj != {"a": 2, "b": b} +obj == nil && obj?.fn(nil) +obj == nil == true ? 0.5 : obj +obj == nil ? add : add +obj == nil ? arr : arr +obj == nil ? b : 1 +obj == nil ? obj : "c" +obj == obj +obj == obj != any(arr, true) +obj == obj != ok +obj == obj && ok +obj == obj ? false : f +obj == obj ? ok : s +obj == obj or obj?.head(f, false, obj) +obj == obj.a +obj == obj.b +obj == obj.head(0.5) +obj == obj.head(2 == s) +obj == obj.head(a) +obj == obj.head(b) +obj == obj.head(false) +obj == obj.head(int(arr, ok, b, a), 2 * b) +obj == obj.head(obj, s) +obj == obj.head(s == div) +obj == obj.obj +obj == obj.obj.b +obj == obj?.a +obj == obj?.b +obj == obj?.fn(0 + b) +obj == obj?.fn(2) +obj == obj?.head(0, f) +obj == obj?.head(a) +obj == obj?.head(add, "c", add, "a") +obj == obj?.head(add, ok) +obj == obj?.head(filter(arr, ok)) +obj == obj?.head(nil) +obj == obj?.head(obj, 0) +obj == obj?.obj +obj == obj?.obj.a +obj == obj?.obj?.a +obj == obj?.obj?.b +obj == obj[nil] +obj in [0.5, a, true, obj] +obj in [arr] +obj in obj?.head(arr) +obj in obj[s] +obj.a +obj.a != "c" ? obj : a +obj.a != 0.5 - b +obj.a != a +obj.a != a * 0.5 +obj.a != add +obj.a != add ? false : ok +obj.a != arr +obj.a != b +obj.a != b / a && ok +obj.a != div +obj.a != div != false +obj.a != div ? s : a +obj.a != div or ok +obj.a != f +obj.a != last(arr) +obj.a != obj +obj.a != obj ? f : ok +obj.a != obj.a +obj.a != obj.head(add, obj) +obj.a != obj.obj.obj +obj.a != obj?.b +obj.a != obj?.obj.a +obj.a != ok +obj.a != ok ? ok : 0.5 +obj.a != s +obj.a != string(nil) +obj.a != string(ok) +obj.a != toJSON(0.5) +obj.a % a +obj.a % b +obj.a % int(b) +obj.a % obj.a +obj.a % obj?.b +obj.a * (0.5 + 0) +obj.a * -a +obj.a * 0 ^ f +obj.a * a +obj.a * b +obj.a * count(arr, ok) +obj.a * div(0, b) +obj.a * f +obj.a * len(arr) +obj.a * obj.b +obj.a * obj?.b +obj.a ** (a % 2) +obj.a ** (a + a) +obj.a ** (b - f) +obj.a ** 0 ** a +obj.a ** 0.5 ^ 0.5 +obj.a ** a +obj.a ** b +obj.a ** div(a, 1) +obj.a ** f +obj.a + -b +obj.a + a +obj.a + b +obj.a + f +obj.a + int(b) +obj.a + max(b, 2) +obj.a + obj.a +obj.a + obj.b +obj.a + obj.head(a, true, nil) +obj.a + obj?.a +obj.a + obj?.b +obj.a + obj?.fn(0) +obj.a - 0 + f +obj.a - a +obj.a - a - 0.5 +obj.a - b +obj.a - f +obj.a - obj.a +obj.a - obj.b +obj.a - obj.head(obj).a +obj.a - obj?.b +obj.a .. a +obj.a .. add(a, a) +obj.a .. b +obj.a .. div(0, a) +obj.a .. max(a) +obj.a / -f +obj.a / 0 ^ b +obj.a / a +obj.a / b +obj.a / f +obj.a / f * b +obj.a / obj.head(a, nil) +obj.a / obj?.b +obj.a < -2 +obj.a < 0 ? f : a +obj.a < a +obj.a < b +obj.a < b ^ f +obj.a < f +obj.a < obj.b +obj.a <= 0.5 / b +obj.a <= 1 / a +obj.a <= a +obj.a <= a + f +obj.a <= a ? 0 : nil +obj.a <= a ? 2 : 0.5 +obj.a <= b +obj.a <= b ** f +obj.a <= count(arr, ok) +obj.a <= f +obj.a <= f ** a +obj.a <= obj.a +obj.a == (true && ok) +obj.a == 2 / b +obj.a == a +obj.a == a * a +obj.a == abs(0.5) +obj.a == add +obj.a == arr +obj.a == arr != true +obj.a == arr[0] +obj.a == b +obj.a == div +obj.a == div == obj?.b +obj.a == f +obj.a == false ? div : add +obj.a == filter(arr, ok) +obj.a == map(arr, true) +obj.a == not false +obj.a == obj +obj.a == obj ? 0 : a +obj.a == obj ? arr : 0.5 +obj.a == obj.a +obj.a == obj.b +obj.a == obj.obj +obj.a == obj?.b +obj.a == obj?.obj +obj.a == ok +obj.a == s +obj.a == string(false) +obj.a > a +obj.a > a ** f +obj.a > a ? div : s +obj.a > add(a, a) +obj.a > add(b, 0) +obj.a > b +obj.a > f +obj.a > f ? f : 0 +obj.a > max(f) +obj.a > obj?.a +obj.a > obj?.b +obj.a >= 0 - 0 +obj.a >= a +obj.a >= abs(0) +obj.a >= add(b, 1) +obj.a >= b +obj.a >= f +obj.a >= f ^ 0.5 +obj.a >= obj.a +obj.a >= obj.b +obj.a >= obj?.b +obj.a ^ (a % a) +obj.a ^ a +obj.a ^ b +obj.a ^ f +obj.a ^ len(arr) +obj.a ^ obj.a +obj.a ^ obj.b +obj.a ^ obj.fn(a) +obj.a ^ obj?.a +obj.a and !true +obj.a in arr +obj.a or not false +obj.a or true || obj?.a +obj.b +obj.b != "c" ? s : ok +obj.b != 0 / a +obj.b != 1 / a +obj.b != a +obj.b != a ** f +obj.b != add +obj.b != arr +obj.b != arr[1] +obj.b != b +obj.b != div +obj.b != f +obj.b != f - 0.5 +obj.b != f ? ok : add +obj.b != int(f) +obj.b != nil ? f : obj.b +obj.b != obj +obj.b != obj.a +obj.b != obj.b +obj.b != obj?.a +obj.b != obj?.head(b, obj) +obj.b != obj?.obj +obj.b != ok +obj.b != ok ? 0 : b +obj.b != s +obj.b != s ? nil : arr +obj.b != trimSuffix("b") +obj.b % 2 * f +obj.b % a +obj.b % abs(a) +obj.b % b +obj.b % len(arr) +obj.b % len(obj) +obj.b % obj.a +obj.b % obj?.a +obj.b && false ? 0.5 : f +obj.b * (0.5 - b) +obj.b * (a + 0.5) +obj.b * 0.5 / a +obj.b * a +obj.b * add(0, a) +obj.b * b +obj.b * div(b, b) +obj.b * f +obj.b * f / f +obj.b * get(arr, a) +obj.b * obj.a +obj.b * obj.b +obj.b * obj.head(2, add, false, arr) +obj.b ** a +obj.b ** add(1, 2) +obj.b ** add(b, a) != f +obj.b ** b +obj.b ** f +obj.b ** f ^ 1 +obj.b ** obj.a +obj.b ** obj.b +obj.b ** obj?.b +obj.b ** obj?.head(f, obj, 0.5, arr, ok) +obj.b + -b +obj.b + 0 / 2 +obj.b + a +obj.b + a % 2 +obj.b + b +obj.b + f +obj.b + f / 2 +obj.b + len(s) +obj.b + obj.b +obj.b + obj?.a +obj.b + obj?.b +obj.b - 0 * f +obj.b - 0 ^ a +obj.b - a +obj.b - b +obj.b - div(a, a) +obj.b - f +obj.b - obj.b +obj.b - obj?.a +obj.b - obj?.b +obj.b .. 0 - b +obj.b .. 2 - a +obj.b .. a +obj.b .. b +obj.b .. b * 0 +obj.b .. b - 0 +obj.b .. obj.a +obj.b .. obj.b +obj.b .. obj?.head(f, ok, obj, add, 0.5) +obj.b / (0.5 + a) +obj.b / -f +obj.b / 0.5 ** a +obj.b / 0.5 / a +obj.b / a +obj.b / b +obj.b / f +obj.b / obj?.a +obj.b / obj?.head(a, div) +obj.b < 0 - b +obj.b < 1 / a +obj.b < 2 * 0 +obj.b < 2 + b +obj.b < a +obj.b < b +obj.b < f +obj.b < get(obj, "b") +obj.b < len("c") +obj.b < min(f) +obj.b < obj.a +obj.b < obj.b +obj.b <= 0.5 == nil +obj.b <= 2 ? "a" : a +obj.b <= a +obj.b <= a * f +obj.b <= a - f +obj.b <= a ? a : 0 +obj.b <= arr[a] +obj.b <= b +obj.b <= f +obj.b <= f != ok +obj.b <= get(arr, a) +obj.b <= min(b) +obj.b <= obj.a +obj.b <= obj.fn(0) +obj.b <= obj?.a +obj.b <= obj?.b +obj.b <= obj?.head(b, 0) +obj.b == !false +obj.b == "c" ? a : nil +obj.b == (ok && true) +obj.b == (ok and true) +obj.b == 0.5 ? arr : "c" +obj.b == a +obj.b == a .. a +obj.b == a ? false : false +obj.b == a ^ a +obj.b == add +obj.b == arr +obj.b == b +obj.b == b / 0 +obj.b == div +obj.b == f +obj.b == f ? 1 : "c" +obj.b == f ? nil : b +obj.b == f ? obj : ok +obj.b == f ? s : arr +obj.b == int(0.5) +obj.b == map(arr, 0) +obj.b == obj +obj.b == obj.a +obj.b == obj.b +obj.b == obj.head(nil) +obj.b == obj.obj +obj.b == obj?.a +obj.b == obj?.b +obj.b == ok +obj.b == s +obj.b == toBase64(s) +obj.b > -a +obj.b > 0 ? b : f +obj.b > a +obj.b > a ** a +obj.b > b +obj.b > b + 0 +obj.b > f +obj.b > int(1) +obj.b > obj.a +obj.b > obj.b +obj.b > obj?.b +obj.b > obj?.fn(0) +obj.b >= 0 ** 1 +obj.b >= 0.5 / f +obj.b >= 0.5 ^ 1 +obj.b >= 1 ? 2 : obj +obj.b >= a +obj.b >= a ? ok : b +obj.b >= b +obj.b >= b + b +obj.b >= f +obj.b >= max(b) +obj.b >= obj.a +obj.b >= obj.fn(b) +obj.b >= obj?.a +obj.b >= obj?.head(b) +obj.b ^ a +obj.b ^ b +obj.b ^ f +obj.b ^ obj.head(a, true, arr, s) +obj.b ^ obj.obj.b +obj.b ^ obj?.b +obj.b and !false +obj.b and !true +obj.b and false == true +obj.b in arr +obj.b or false and true +obj.c in obj +obj.c?.a +obj.c?.b +obj.c?.b.b +obj.c?.b?.b +obj.c?.fn(b) +obj.c?.head("a" != arr) +obj.c?.head(a) +obj.c?.head(b) +obj.c?.obj +obj.c?.obj?.head(div) +obj.fn(-0) +obj.fn(-1) +obj.fn(-2) +obj.fn(-a) +obj.fn(-b) +obj.fn(0 && true) +obj.fn(0 * a) +obj.fn(0 + 0) +obj.fn(0 + b) +obj.fn(0 - 0) +obj.fn(0 and true) +obj.fn(0 || false) +obj.fn(0) != b +obj.fn(0) * a +obj.fn(0) ** f +obj.fn(0) + f +obj.fn(0) - b +obj.fn(0) / a +obj.fn(0) / b +obj.fn(0) <= b + 0 +obj.fn(0) == a +obj.fn(0) == b +obj.fn(0) == s +obj.fn(0) >= a +obj.fn(0) ^ f +obj.fn(1 % b) +obj.fn(1 * b) +obj.fn(1 + b) +obj.fn(1 and true) +obj.fn(1) ** obj?.b +obj.fn(1) + b +obj.fn(1) == add +obj.fn(2 % 1) +obj.fn(2 * 1) +obj.fn(2 * a) +obj.fn(2 + b) +obj.fn(2) != add +obj.fn(2) < f +obj.fn(a % a) +obj.fn(a * 0) +obj.fn(a + 1) +obj.fn(a + 2) +obj.fn(a + a) +obj.fn(a - 1) +obj.fn(a - 2) +obj.fn(a and true) +obj.fn(a or false) +obj.fn(a) +obj.fn(a) != 2 - b +obj.fn(a) != b +obj.fn(a) != f +obj.fn(a) != ok +obj.fn(a) % a +obj.fn(a) % b +obj.fn(a) * a +obj.fn(a) ** a +obj.fn(a) ** b +obj.fn(a) - a +obj.fn(a) < a +obj.fn(a) == add +obj.fn(a) == arr +obj.fn(a) == map(arr, arr) +obj.fn(a) > b +obj.fn(a) >= b +obj.fn(a) ^ f +obj.fn(a) and !true +obj.fn(abs(1)) +obj.fn(abs(2)) +obj.fn(abs(f, s, b, b)) +obj.fn(add(0, 2)) +obj.fn(add(0, a)) +obj.fn(add(0, b)) +obj.fn(add(1, 1)) +obj.fn(add(1, b)) +obj.fn(add(2, a)) +obj.fn(add(a, 0)) +obj.fn(add(a, a)) +obj.fn(add(a, b)) +obj.fn(add(b, 2)) +obj.fn(add(b, b)) +obj.fn(arr[0]) +obj.fn(arr[a]) +obj.fn(arr[b]) +obj.fn(b % a) +obj.fn(b % b) +obj.fn(b && true) +obj.fn(b * 0) +obj.fn(b * 1) +obj.fn(b * b) +obj.fn(b + obj?.a) +obj.fn(b - 1) +obj.fn(b - 2) +obj.fn(b - a) +obj.fn(b or false) +obj.fn(b || false) +obj.fn(b) +obj.fn(b) != a +obj.fn(b) != div +obj.fn(b) * b ^ f +obj.fn(b) ** b +obj.fn(b) + b +obj.fn(b) .. a % 2 +obj.fn(b) .. b * b +obj.fn(b) < b +obj.fn(b) < f +obj.fn(b) <= 0 % b +obj.fn(b) <= b +obj.fn(b) == a / 1 +obj.fn(b) == div ? obj : div +obj.fn(b) == ok +obj.fn(b) > f +obj.fn(b) ^ obj?.a +obj.fn(count("a", false)) +obj.fn(count("b", ok)) +obj.fn(count("b", true)) +obj.fn(count("c", ok)) +obj.fn(count("c", true)) +obj.fn(count(1 .. f, s)) +obj.fn(count(arr, false)) +obj.fn(count(arr, ok)) +obj.fn(count(obj, ok)) +obj.fn(count(s, ok)) +obj.fn(div(0, a)) +obj.fn(div(0, b)) +obj.fn(div(1, 1)) +obj.fn(div(1, b)) +obj.fn(div(a, a)) +obj.fn(div(a, b)) +obj.fn(div(b, a)) +obj.fn(div(b, b)) +obj.fn(f == obj or b) +obj.fn(false ? 0 : b) +obj.fn(false or 0) +obj.fn(false or a) +obj.fn(false || 0) +obj.fn(false || 2) +obj.fn(false || a) +obj.fn(get(arr, 0)) +obj.fn(get(arr, 0.5)) +obj.fn(get(arr, b)) +obj.fn(int("b", a)) +obj.fn(int(0)) +obj.fn(int(1)) +obj.fn(int(a)) +obj.fn(int(a, 0)) +obj.fn(int(b)) +obj.fn(int(b, s, a, "a", f)) +obj.fn(int(obj, true, b)) +obj.fn(int(true, f)) +obj.fn(last(arr)) +obj.fn(last(arr, b)) +obj.fn(len("b")) +obj.fn(len(0, obj)) +obj.fn(len(arr)) +obj.fn(len(arr, s)) +obj.fn(len(f, arr)) +obj.fn(len(false, 1, s, obj)) +obj.fn(len(nil, arr)) +obj.fn(len(s)) +obj.fn(max(0)) +obj.fn(max(0, b)) +obj.fn(max(1)) +obj.fn(max(1, 0.5)) +obj.fn(max(a)) +obj.fn(max(b)) +obj.fn(min(0)) +obj.fn(min(0, f, a)) +obj.fn(min(1)) +obj.fn(min(a)) +obj.fn(min(b)) +obj.fn(min(f, f, 0)) +obj.fn(obj.a) +obj.fn(obj.a) < b +obj.fn(obj.b) +obj.fn(obj.fn(1)) +obj.fn(obj.fn(2)) +obj.fn(obj.fn(a)) +obj.fn(obj.head(0)) +obj.fn(obj.head(0, add)) +obj.fn(obj.head(2)) +obj.fn(obj.head(a)) +obj.fn(obj.head(a, s)) +obj.fn(obj.head(b)) +obj.fn(obj?.a) +obj.fn(obj?.b) +obj.fn(obj?.fn(0)) +obj.fn(obj?.fn(a)) +obj.fn(obj?.fn(b)) +obj.fn(obj?.head(0)) +obj.fn(obj?.head(0, div)) +obj.fn(obj?.head(1)) +obj.fn(obj?.head(a, arr)) +obj.fn(obj?.head(b)) +obj.fn(ok && 2) +obj.fn(ok && a) +obj.fn(ok && b) +obj.fn(ok ? 1 : 0) +obj.fn(ok ? a : s) +obj.fn(ok ? b : "b" .. all(obj, ok)) +obj.fn(ok and 0) +obj.fn(ok and a) +obj.fn(ok and b) +obj.fn(s, obj, nil) || true ? 0 : b +obj.fn(true && 0) +obj.fn(true && 2) +obj.fn(true ? 0 : add) +obj.fn(true and a) +obj.head(!false) +obj.head(!false, s, div) +obj.head(!ok) +obj.head(!true) +obj.head(!true, div) +obj.head(!true, ok ? true : add) +obj.head("a" != "c") +obj.head("a" != a) +obj.head("a" != add) +obj.head("a" != b) +obj.head("a" != div) +obj.head("a" != s) +obj.head("a" < s) +obj.head("a" == "c") +obj.head("a" == 0) +obj.head("a" == arr) +obj.head("a" == b) +obj.head("a" == f) +obj.head("a" >= "c") +obj.head("a" contains "a") +obj.head("a" in arr, obj) +obj.head("a" in nil) +obj.head("a" or true) +obj.head("a" || true) +obj.head("a") == add +obj.head("a", a) == b - 0.5 +obj.head("b" != "c", last(arr, ok, f), arr) +obj.head("b" != 1) +obj.head("b" != a) +obj.head("b" != add) +obj.head("b" != arr) +obj.head("b" != b) +obj.head("b" != s) +obj.head("b" + "b") +obj.head("b" <= "b") +obj.head("b" == f) +obj.head("b" == obj) +obj.head("b" || false) +obj.head("b") + s +obj.head("b") startsWith s +obj.head("b", ok) != add +obj.head("c" != a) +obj.head("c" != ok) +obj.head("c" + "a") +obj.head("c" + s) +obj.head("c" == "c") +obj.head("c" == add, ok) +obj.head("c" == arr) +obj.head("c" == div) +obj.head("c" == false) +obj.head("c" >= "b") +obj.head("c" >= s, get(0, ok)) +obj.head("c" and false) +obj.head("c" and true) +obj.head("c" contains "b") +obj.head("c" endsWith "c") +obj.head("c" startsWith "c") +obj.head("c" || false) +obj.head("c") endsWith s +obj.head("c", "c") > s +obj.head((nil || true) == arr) +obj.head(-0) +obj.head(-0.5) +obj.head(-0.5, add) +obj.head(-2) +obj.head(-a) +obj.head(-b) +obj.head(-f) +obj.head(-f, obj?.head(obj, ok, arr)) +obj.head(0 != arr) +obj.head(0 != b) +obj.head(0 != div) +obj.head(0 != nil) +obj.head(0 != nil, b) +obj.head(0 != ok) +obj.head(0 && true) +obj.head(0 * 0.5) +obj.head(0 * a) +obj.head(0 ** 0) +obj.head(0 ** 1) +obj.head(0 ** b) +obj.head(0 ** f) +obj.head(0 + 2) +obj.head(0 + a) +obj.head(0 + f) +obj.head(0 - 0.5) +obj.head(0 - 1) +obj.head(0 - a) +obj.head(0 - f) +obj.head(0 .. 0) +obj.head(0 .. 0.5) +obj.head(0 .. b) +obj.head(0 / b) +obj.head(0 < 0) +obj.head(0 < b, obj?.head(obj, obj, add, "a")) +obj.head(0 <= 0.5) +obj.head(0 <= 0.5, obj.a) +obj.head(0 <= 1) +obj.head(0 == "a") +obj.head(0 == 0) +obj.head(0 == 1) +obj.head(0 == add, f) +obj.head(0 == arr) +obj.head(0 == div) +obj.head(0 == f) +obj.head(0 == false) +obj.head(0 == ok) +obj.head(0 == s, float(b)) +obj.head(0 == true) +obj.head(0 > 0) +obj.head(0 > b) +obj.head(0 >= 0) +obj.head(0 >= a, s) +obj.head(0 ^ 0.5) +obj.head(0 ^ 1) +obj.head(0 ^ a) +obj.head(0 ^ f) +obj.head(0 in nil) +obj.head(0 || true) +obj.head(0) != s +obj.head(0) - b +obj.head(0) .. obj?.head(1) +obj.head(0) / a +obj.head(0) / b +obj.head(0) < b ^ b +obj.head(0) == b +obj.head(0) > a - b +obj.head(0) >= 0.5 ? 2 : obj +obj.head(0) >= a +obj.head(0) ^ (b % 1) +obj.head(0) ^ b +obj.head(0, "a") - f +obj.head(0, "b") + f +obj.head(0, "b") .. add(b, b) +obj.head(0, 0) == "c" ? nil : a +obj.head(0, 0, "c") == obj?.a +obj.head(0, 0.5, "b", 0) <= 0.5 != true +obj.head(0, 1, div) < a +obj.head(0, add) / a +obj.head(0, arr) > b +obj.head(0, arr, add, nil) < a +obj.head(0, b, s) .. a +obj.head(0, div) + f +obj.head(0, div, a) < obj?.a +obj.head(0, f) <= b +obj.head(0, f, arr) == ok +obj.head(0, f, b) == s +obj.head(0, f, obj, 0, "a") + a +obj.head(0, ok) - a +obj.head(0, ok) > -b +obj.head(0, true, b) - a +obj.head(0.5 != 1) +obj.head(0.5 != a) +obj.head(0.5 != add) +obj.head(0.5 != arr) +obj.head(0.5 != b) +obj.head(0.5 != f) +obj.head(0.5 != obj) +obj.head(0.5 * 0) +obj.head(0.5 * a, arr) +obj.head(0.5 ** a) +obj.head(0.5 + a) +obj.head(0.5 + f) +obj.head(0.5 - 1) +obj.head(0.5 - a) +obj.head(0.5 - f) +obj.head(0.5 .. 0) +obj.head(0.5 .. a, max(div)) +obj.head(0.5 / 0) +obj.head(0.5 < 0.5) +obj.head(0.5 <= 0) +obj.head(0.5 <= b) +obj.head(0.5 == a) +obj.head(0.5 == add, div) +obj.head(0.5 == obj) +obj.head(0.5 >= a) +obj.head(0.5 >= f) +obj.head(0.5 ^ 1) +obj.head(0.5 and true) +obj.head(0.5 in nil) +obj.head(0.5) - b / f +obj.head(0.5) / obj.head(2, obj) +obj.head(0.5, f) != a +obj.head(0.5, false, b) + obj.a +obj.head(0.5, nil) >= f +obj.head(0.5, nil, s) > a +obj.head(1 != add, obj.a) +obj.head(1 != arr) +obj.head(1 != nil) +obj.head(1 != obj) +obj.head(1 != s) +obj.head(1 && true) +obj.head(1 * 0) +obj.head(1 ** 2) +obj.head(1 - a) +obj.head(1 .. b) +obj.head(1 / 0.5) +obj.head(1 / 1) +obj.head(1 / a) +obj.head(1 / f) +obj.head(1 < 1) +obj.head(1 < a) +obj.head(1 == 0, get(div, b)) +obj.head(1 == b) +obj.head(1 == div) +obj.head(1 == div, get(div, false)) +obj.head(1 == s, 0 ** 0, ok) +obj.head(1 >= 0) +obj.head(1 >= a, ok) +obj.head(1 >= f) +obj.head(1 and false) +obj.head(1) + a +obj.head(1) + a + a +obj.head(1) == f +obj.head(1) ^ obj.b +obj.head(1, a, ok) <= a +obj.head(1, add, ok) > a +obj.head(1, div) == b ? a : a +obj.head(2 != "a") +obj.head(2 != b) +obj.head(2 != true) +obj.head(2 % b) +obj.head(2 * b) +obj.head(2 ** b) +obj.head(2 + 2) +obj.head(2 + b) +obj.head(2 - 1) +obj.head(2 - f, obj, get(obj, a)) +obj.head(2 .. a) +obj.head(2 / 0) +obj.head(2 / a, add) +obj.head(2 / f) +obj.head(2 == ok) +obj.head(2 >= 0.5) +obj.head(2 >= b) +obj.head(2 >= f) +obj.head(2 ^ b, 0.5 && false) +obj.head(2 ^ f) +obj.head(2 in arr) +obj.head(2 in nil, a) +obj.head(2) != s +obj.head(2) + f +obj.head(2) == obj.a +obj.head(2, 0.5) % obj?.b +obj.head(2, 0.5) - obj.a +obj.head(2, arr, 2, obj, div) > f +obj.head(2, div, ok) in 2 .. 2 +obj.head(["c"]) +obj.head([arr, add]) +obj.head(a != 0) +obj.head(a != a) +obj.head(a != arr) +obj.head(a != b) +obj.head(a != f) +obj.head(a != nil) +obj.head(a != obj) +obj.head(a != ok) +obj.head(a != ok, obj.b) +obj.head(a % 2) +obj.head(a % b) +obj.head(a * 0) +obj.head(a * 0.5) +obj.head(a * 1) +obj.head(a * a) +obj.head(a * b) +obj.head(a * b, get(0.5, nil)) +obj.head(a * f) +obj.head(a ** a) +obj.head(a ** f) +obj.head(a + 0) +obj.head(a + 0.5, none(obj, true), a) +obj.head(a - 0) +obj.head(a - 0.5) +obj.head(a - 1) +obj.head(a - 2) +obj.head(a - a) +obj.head(a - b) +obj.head(a - b, 0 && false, f) +obj.head(a - f) +obj.head(a .. f) +obj.head(a / 0) +obj.head(a / 1) +obj.head(a < 0) +obj.head(a < 1) +obj.head(a < a) +obj.head(a < b) +obj.head(a <= a) +obj.head(a <= b, false in arr) +obj.head(a <= b, ok ? a : div) +obj.head(a <= f) +obj.head(a == "b") +obj.head(a == 0) +obj.head(a == 0, f == nil) +obj.head(a == add) +obj.head(a == b) +obj.head(a == f) +obj.head(a == f, ok ? obj : arr) +obj.head(a == obj) +obj.head(a > 1) +obj.head(a >= a) +obj.head(a >= f) +obj.head(a ^ 0) +obj.head(a ^ a) +obj.head(a ^ a, add) +obj.head(a ^ f) +obj.head(a and true) +obj.head(a in arr) +obj.head(a or true) +obj.head(a) +obj.head(a) != div +obj.head(a) * a +obj.head(a) * b +obj.head(a) ** f +obj.head(a) + b +obj.head(a) + f +obj.head(a) < add(b, a) +obj.head(a) < b ** 0 +obj.head(a) <= 0.5 - 0.5 +obj.head(a) >= 0.5 ^ f +obj.head(a) >= int(a) +obj.head(a) ^ a +obj.head(a, "a", false, 0) % b +obj.head(a, "b", "b") == obj ? "b" : arr +obj.head(a, 1 != arr) +obj.head(a, a) +obj.head(a, add) +obj.head(a, add) != div ? 0 : 0.5 +obj.head(a, arr) +obj.head(a, arr) < obj.a +obj.head(a, b) +obj.head(a, b, f) +obj.head(a, div) +obj.head(a, f) +obj.head(a, f) == f +obj.head(a, f, div, "b") ^ b +obj.head(a, f, f) * b ** a +obj.head(a, f, obj.a) +obj.head(a, false) ^ 0.5 ** a +obj.head(a, nil) == f +obj.head(a, nil) == obj +obj.head(a, obj, ok, nil, ok) <= b +obj.head(a, obj.a) +obj.head(a, obj.b) +obj.head(a, obj.obj) +obj.head(a, obj?.head(s)) +obj.head(a, ok) +obj.head(a, s) +obj.head(a, s) - a +obj.head(a, string(0.5, 1), f) +obj.head(a, true || arr) +obj.head(abs(0)) +obj.head(abs(1), ok && add) +obj.head(abs(2)) +obj.head(abs(b)) +obj.head(abs(b, add, true, b)) +obj.head(abs(div, "b", b)) +obj.head(abs(div, arr, f)) +obj.head(abs(f)) +obj.head(abs(f, "b", a)) +obj.head(abs(obj, b), add != obj) +obj.head(abs(obj, div, 1), a, get(0, f)) +obj.head(add != "a") +obj.head(add != "c", ok) +obj.head(add != 0) +obj.head(add != 2) +obj.head(add != add) +obj.head(add != arr) +obj.head(add != b) +obj.head(add != f) +obj.head(add != false, a) +obj.head(add != nil, s) +obj.head(add != obj) +obj.head(add != ok) +obj.head(add != true) +obj.head(add && false, map(obj, obj)) +obj.head(add && true) +obj.head(add == 0.5) +obj.head(add == add) +obj.head(add == arr) +obj.head(add == f) +obj.head(add == ok) +obj.head(add == s) +obj.head(add == true) +obj.head(add in arr) +obj.head(add in nil) +obj.head(add or true) +obj.head(add(0, 0)) +obj.head(add(0, 1), obj, s) +obj.head(add(0, a)) +obj.head(add(1, a), int(0)) +obj.head(add(2, 0)) +obj.head(add(2, b)) +obj.head(add(a, 0)) +obj.head(add(a, 0), div) +obj.head(add(a, a)) +obj.head(add(a, a), get(s, a)) +obj.head(add(b, 0)) +obj.head(add(b, a)) +obj.head(add(b, b)) +obj.head(add) +obj.head(add) != div +obj.head(add) != f +obj.head(add) == f ** 1 +obj.head(add, a) +obj.head(add, a, b, arr) == add +obj.head(add, add) +obj.head(add, b) +obj.head(add, b, s) == ok +obj.head(add, div) +obj.head(add, f) +obj.head(add, filter(arr, true)) +obj.head(add, obj) +obj.head(add, s <= "b") +obj.head(add, s) +obj.head(add, s, arr) != add(a, 0) +obj.head(add, string(b)) +obj.head(all("b", ok)) +obj.head(all("b", true)) +obj.head(all("c", false)) +obj.head(all("c", ok)) +obj.head(all(arr, false) == map(s, nil)) +obj.head(all(arr, ok)) +obj.head(all(arr, true)) +obj.head(all(arr, true), a) +obj.head(all(obj, false)) +obj.head(all(obj, true)) +obj.head(all(s, ok)) +obj.head(any("a", false)) +obj.head(any("b", false)) +obj.head(any(arr, ok)) +obj.head(any(arr, true)) +obj.head(any(obj, false)) +obj.head(any(obj, true)) +obj.head(arr != 2) +obj.head(arr != a) +obj.head(arr != add) +obj.head(arr != arr) +obj.head(arr != b) +obj.head(arr != div) +obj.head(arr != f) +obj.head(arr != false) +obj.head(arr != s) +obj.head(arr && false) +obj.head(arr && true) +obj.head(arr == "a") +obj.head(arr == a) +obj.head(arr == arr) +obj.head(arr == b) +obj.head(arr == f) +obj.head(arr == nil) +obj.head(arr == nil, all("b", ok), b) +obj.head(arr == obj) +obj.head(arr == s) +obj.head(arr in nil) +obj.head(arr || true) +obj.head(arr) +obj.head(arr) != a +obj.head(arr) != a ** b +obj.head(arr) != add +obj.head(arr) != obj +obj.head(arr) != obj.head(ok) +obj.head(arr) in arr +obj.head(arr)[obj?.a] +obj.head(arr, 0) != obj?.head(obj) +obj.head(arr, a) == 0.5 * f +obj.head(arr, add) +obj.head(arr, add)[obj.b] +obj.head(arr, arr) +obj.head(arr, b) +obj.head(arr, b, arr) +obj.head(arr, div) +obj.head(arr, div, 0, "b", arr) != f +obj.head(arr, div, arr) +obj.head(arr, div, false, a, div) != arr +obj.head(arr, f or true) +obj.head(arr, f) +obj.head(arr, f, arr, 0) != ok +obj.head(arr, map(obj, false)) +obj.head(arr, obj) +obj.head(arr, obj, add) == ok +obj.head(arr, obj?.a) +obj.head(arr, ok) +obj.head(arr, ok, false) == add +obj.head(arr[0:f]) +obj.head(arr[0], get(ok, f), arr) +obj.head(arr[1]) +obj.head(arr[1], ok) +obj.head(arr[a]) +obj.head(arr[b:f]) +obj.head(arr[b]) +obj.head(arr[b], s) +obj.head(arr[f]) +obj.head(b != 0, ok, a) +obj.head(b != a) +obj.head(b != arr) +obj.head(b != arr, s) +obj.head(b != f) +obj.head(b != false) +obj.head(b != obj) +obj.head(b != ok) +obj.head(b != true) +obj.head(b % 1, obj.b) +obj.head(b % b, get(arr, arr)) +obj.head(b * 0.5) +obj.head(b * 1) +obj.head(b * a) +obj.head(b * b, b) +obj.head(b * f) +obj.head(b ** 0) +obj.head(b ** 0.5, add) +obj.head(b ** b) +obj.head(b ** f, div) +obj.head(b + a) +obj.head(b + b) +obj.head(b + f) +obj.head(b - 0) +obj.head(b - 0, b ** b) +obj.head(b - 0.5) +obj.head(b - 1) +obj.head(b - 2, obj.head(obj)) +obj.head(b - a) +obj.head(b - f) +obj.head(b .. a) +obj.head(b .. a, 2 <= a) +obj.head(b .. b) +obj.head(b .. f, get(obj, a), map(arr, true)) +obj.head(b / 0) +obj.head(b / b) +obj.head(b / b, a) +obj.head(b < a) +obj.head(b < b) +obj.head(b < f) +obj.head(b <= a) +obj.head(b <= f) +obj.head(b == "a") +obj.head(b == "b") +obj.head(b == 0) +obj.head(b == a) +obj.head(b == add) +obj.head(b == arr) +obj.head(b == b) +obj.head(b == div) +obj.head(b == nil) +obj.head(b == obj) +obj.head(b == ok) +obj.head(b == ok, div) +obj.head(b == s) +obj.head(b > 0) +obj.head(b > 0.5) +obj.head(b > 1) +obj.head(b > a) +obj.head(b >= a, arr) +obj.head(b >= b, obj.a) +obj.head(b >= f) +obj.head(b ^ 0.5) +obj.head(b ^ 1, not ok) +obj.head(b ^ a) +obj.head(b in arr) +obj.head(b in nil) +obj.head(b or false) +obj.head(b || false) +obj.head(b || true) +obj.head(b) +obj.head(b) != a +obj.head(b) % a +obj.head(b) % b +obj.head(b) * b +obj.head(b) ** div(1, 1) +obj.head(b) ** obj?.a +obj.head(b) - -0 +obj.head(b) - a +obj.head(b) - b +obj.head(b) .. div(a, a) +obj.head(b) / (b + a) +obj.head(b) / b +obj.head(b) < -f +obj.head(b) <= a + a +obj.head(b) <= obj.b +obj.head(b) == add +obj.head(b) == map(arr, add) +obj.head(b) == obj +obj.head(b) > obj.b +obj.head(b) >= a +obj.head(b) ^ obj.a +obj.head(b) in arr +obj.head(b, 0 / 2, max(div)) +obj.head(b, 0.5, add, nil) == f +obj.head(b, 2) != first(arr) +obj.head(b, a + a) +obj.head(b, a - a) +obj.head(b, a) +obj.head(b, a) ^ b +obj.head(b, a, obj) <= b ? ok : "c" +obj.head(b, a, obj) ^ f +obj.head(b, a, s) >= obj?.a +obj.head(b, add) - f +obj.head(b, add, false, false, false) == s ? 1 : div +obj.head(b, add, s, arr) < 0.5 + b +obj.head(b, add, true) == f +obj.head(b, arr) +obj.head(b, arr) != add +obj.head(b, arr) ** b +obj.head(b, arr) >= b +obj.head(b, b + f) +obj.head(b, b) +obj.head(b, b) != obj.obj +obj.head(b, b, ok) / b +obj.head(b, div) +obj.head(b, f != "b") +obj.head(b, f) != add +obj.head(b, f, b, obj, a) ^ f ** f +obj.head(b, f, false) + a +obj.head(b, f, s, div, b) > b +obj.head(b, false, b) - obj?.a +obj.head(b, first(0.5)) +obj.head(b, get(b, arr)) +obj.head(b, get(div, true), "a" != 0) +obj.head(b, get(s, 0)) +obj.head(b, get(true, obj)) +obj.head(b, last(nil)) +obj.head(b, nil != div) +obj.head(b, nil or false) +obj.head(b, obj) +obj.head(b, obj) % b +obj.head(b, obj.a) +obj.head(b, obj.head(add)) +obj.head(b, ok or ok?.a) +obj.head(b, ok) +obj.head(b, s) +obj.head(b, true) == div +obj.head(count("a", true)) +obj.head(count("c", ok)) +obj.head(count(arr, false)) +obj.head(count(arr, ok)) +obj.head(count(arr, ok), 0 == arr) +obj.head(count(arr, true)) +obj.head(count(obj, false)) +obj.head(count(obj, ok)) +obj.head(count(s, false)) +obj.head(count(s, ok)) +obj.head(count(s, ok), obj.b) +obj.head(count(s, true)) +obj.head(date(s, s)) +obj.head(div != "a") +obj.head(div != 1) +obj.head(div != a) +obj.head(div != add) +obj.head(div != arr) +obj.head(div != b, f) +obj.head(div != f) +obj.head(div != false) +obj.head(div != obj, arr) +obj.head(div != s) +obj.head(div && true) +obj.head(div == "b", div, b == nil) +obj.head(div == 0) +obj.head(div == 0.5) +obj.head(div == 1) +obj.head(div == 2) +obj.head(div == a) +obj.head(div == a, add) +obj.head(div == div) +obj.head(div == f) +obj.head(div == f, add) +obj.head(div == nil) +obj.head(div == obj, b) +obj.head(div == obj, toBase64(s)) +obj.head(div and true) +obj.head(div in arr) +obj.head(div in nil) +obj.head(div || true) +obj.head(div(0, a)) +obj.head(div(0, b), ok ? b : "a") +obj.head(div(1, a)) +obj.head(div(1, a), obj, "b" in arr) +obj.head(div(a, 2)) +obj.head(div(a, a)) +obj.head(div(a, b)) +obj.head(div(a, b), s) +obj.head(div(b, 2)) +obj.head(div(b, a)) +obj.head(div(b, b)) +obj.head(div) +obj.head(div) != ok +obj.head(div) == a +obj.head(div) == b +obj.head(div) == div +obj.head(div) == obj +obj.head(div, 0 > f) +obj.head(div, 0.5) != -0.5 +obj.head(div, a == f) +obj.head(div, a) +obj.head(div, add) +obj.head(div, b ** a) +obj.head(div, b + a, b, a) +obj.head(div, b) == a +obj.head(div, b, div) +obj.head(div, b, obj, add) == b +obj.head(div, div != obj) +obj.head(div, div(0, 2)) +obj.head(div, div) +obj.head(div, f != false) +obj.head(div, f >= f) +obj.head(div, f) +obj.head(div, false, "c", s) != obj.head(add, "c") +obj.head(div, get(a, 0)) +obj.head(div, get(false, f)) +obj.head(div, get(false, obj)) +obj.head(div, max(b)) +obj.head(div, not ok) +obj.head(div, obj) +obj.head(div, obj.a) +obj.head(div, ok != arr) +obj.head(div, ok and div) +obj.head(div, ok) +obj.head(div, s != div) +obj.head(div, s < s, a) +obj.head(div, s) +obj.head(div, s[2]) +obj.head(f != "c") +obj.head(f != "c", 0 * 0.5) +obj.head(f != a) +obj.head(f != a, ok, obj) +obj.head(f != add) +obj.head(f != b) +obj.head(f != nil) +obj.head(f != ok) +obj.head(f != s) +obj.head(f != s, upper(0.5, s)) +obj.head(f != true) +obj.head(f * 0) +obj.head(f * 0.5) +obj.head(f * 2) +obj.head(f * b) +obj.head(f * f) +obj.head(f ** 0) +obj.head(f ** 2) +obj.head(f ** b) +obj.head(f ** obj.a) +obj.head(f + 0) +obj.head(f + a) +obj.head(f + b) +obj.head(f - 0) +obj.head(f - 0.5) +obj.head(f - 2) +obj.head(f - a) +obj.head(f - b, f ** f) +obj.head(f - f) +obj.head(f .. a) +obj.head(f .. b, add == nil) +obj.head(f .. f) +obj.head(f .. f) != arr +obj.head(f / 0.5) +obj.head(f / 1) +obj.head(f / a) +obj.head(f / f) +obj.head(f < b) +obj.head(f <= 1, obj) +obj.head(f <= b) +obj.head(f == "b", now(ok, 2)) +obj.head(f == "c", one(arr, true)) +obj.head(f == 0) +obj.head(f == add) +obj.head(f == b) +obj.head(f == f) +obj.head(f == obj, div) +obj.head(f == s) +obj.head(f == s, ok) +obj.head(f > 0) +obj.head(f > 1) +obj.head(f > f) +obj.head(f > f, any(s, ok), f ^ 0) +obj.head(f >= 0) +obj.head(f >= 0.5) +obj.head(f >= f) +obj.head(f >= f, int(s, nil, f)) +obj.head(f ^ 2, a) +obj.head(f ^ b) +obj.head(f ^ f) +obj.head(f ^ f, s < s) +obj.head(f in arr) +obj.head(f in arr, f == 0) +obj.head(f in nil) +obj.head(f or false) +obj.head(f) +obj.head(f) != abs(0.5) +obj.head(f) != div +obj.head(f) != ok +obj.head(f) * b +obj.head(f) .. int(0.5) +obj.head(f) / a +obj.head(f) < b +obj.head(f) < f / 0 +obj.head(f) == f +obj.head(f) == obj.a +obj.head(f) == ok +obj.head(f) == s +obj.head(f) >= b +obj.head(f) ^ f +obj.head(f, 0 / f, a - a) +obj.head(f, 0, 0.5) * a +obj.head(f, 0, arr, a) >= f +obj.head(f, a) +obj.head(f, arr != div) +obj.head(f, arr) +obj.head(f, arr) == obj +obj.head(f, b + f) +obj.head(f, b and true, s) +obj.head(f, b) +obj.head(f, b, s) * f / 1 +obj.head(f, div != arr) +obj.head(f, div) != ok +obj.head(f, div, get(f, obj)) +obj.head(f, div, true, div) ** obj.a +obj.head(f, f) +obj.head(f, f) != obj.a +obj.head(f, false ? true : 0) +obj.head(f, float(b)) +obj.head(f, get(false, false)) +obj.head(f, last(obj)) +obj.head(f, nil != ok) +obj.head(f, obj) +obj.head(f, obj) != add +obj.head(f, ok && f) +obj.head(f, ok) +obj.head(f, ok, f ** f) +obj.head(f, s) && false ? add : ok +obj.head(f, s) >= a / b +obj.head(f, s, obj) +obj.head(f, s[b]) +obj.head(false != 0) +obj.head(false != add) +obj.head(false != arr) +obj.head(false != b) +obj.head(false != div) +obj.head(false != f) +obj.head(false != obj) +obj.head(false != s) +obj.head(false && add) +obj.head(false && b) +obj.head(false && f) +obj.head(false && obj) +obj.head(false && s, obj?.head("a", nil, b)) +obj.head(false && s, s[2]) +obj.head(false == 0.5) +obj.head(false == a) +obj.head(false == add) +obj.head(false == f, true != 2) +obj.head(false == nil) +obj.head(false == obj) +obj.head(false ? add : add) +obj.head(false ? arr : ok) +obj.head(false ? obj : 0) +obj.head(false ? obj : s) +obj.head(false and "c") +obj.head(false and add) +obj.head(false and b) +obj.head(false and div) +obj.head(false and false) +obj.head(false and obj) +obj.head(false and s) +obj.head(false in nil) +obj.head(false or "b") +obj.head(false or b) +obj.head(false or f, get("a", arr)) +obj.head(false or ok) +obj.head(false or s) +obj.head(false or s, ok ? 0 : 0.5) +obj.head(false || 0) +obj.head(false || 1) +obj.head(false || add) +obj.head(false || arr) +obj.head(false || b) +obj.head(false || obj, get(arr, div)) +obj.head(false || s) +obj.head(false || true) +obj.head(false) && 2 == nil +obj.head(false) && arr == nil +obj.head(false) == a +obj.head(false, "b") || "b" startsWith "a" +obj.head(false, 0, nil, "c") == obj +obj.head(false, a) != arr +obj.head(false, arr, obj, 2, div) == arr +obj.head(false, f) != div +obj.head(false, obj) != a == ok +obj.head(false, ok) == obj.b +obj.head(filter("b", ok)) +obj.head(filter("c", ok), obj, get("c", add)) +obj.head(filter(arr, true)) +obj.head(filter(obj, false)) +obj.head(filter(s, ok)) +obj.head(first("a", 0.5, s)) +obj.head(first("b", add, nil, div)) +obj.head(first(0)) +obj.head(first(0.5)) +obj.head(first(0.5), obj?.a) == obj +obj.head(first(0.5, ok)) +obj.head(first(2)) +obj.head(first(a)) +obj.head(first(a, 1, f)) +obj.head(first(add)) +obj.head(first(arr)) +obj.head(first(b, arr)) +obj.head(first(false, obj)) +obj.head(first(nil, "b", obj)) +obj.head(first(obj)) +obj.head(first(ok, b)) +obj.head(first(ok, ok)) +obj.head(first(s)) +obj.head(float("a", a)) +obj.head(float(0)) +obj.head(float(1)) +obj.head(float(2)) +obj.head(float(a)) +obj.head(float(a), ok and f) +obj.head(float(a, 0, a)) +obj.head(float(a, b), add) +obj.head(float(add, 2)) +obj.head(float(arr, b)) +obj.head(float(b)) +obj.head(float(div, obj, add, 0), false && obj) +obj.head(float(f)) +obj.head(float(f), f) +obj.head(float(f, 0)) +obj.head(float(ok, b)) +obj.head(get("a")) +obj.head(get("a"))?.a +obj.head(get("a"), b) +obj.head(get("a", arr)) +obj.head(get("a", b)) +obj.head(get("a", div)) +obj.head(get("a", f)) +obj.head(get("a", obj)) +obj.head(get("a", ok)) +obj.head(get("b")) +obj.head(get("b", 0)) +obj.head(get("b", a)) +obj.head(get("b", add)) +obj.head(get("b", arr)) +obj.head(get("b", nil)) +obj.head(get("b", obj, a)) +obj.head(get("b", ok)) +obj.head(get("b", s)) +obj.head(get("c", a)) +obj.head(get("c", arr)) +obj.head(get("c", arr)) == a +obj.head(get("c", b)) +obj.head(get(0)) +obj.head(get(0, 0)) +obj.head(get(0, add)) +obj.head(get(0, arr)) +obj.head(get(0, arr), obj) +obj.head(get(0, arr)?.b) +obj.head(get(0, b)) +obj.head(get(0, div)) +obj.head(get(0, f), b) +obj.head(get(0, ok)) +obj.head(get(0, s)) +obj.head(get(0, true)) +obj.head(get(0.5)) +obj.head(get(0.5, 0)) +obj.head(get(0.5, arr)) +obj.head(get(0.5, false)) +obj.head(get(0.5, nil, arr, 1, 2)) +obj.head(get(0.5, obj)) +obj.head(get(0.5, obj), ok) +obj.head(get(1), map(arr, obj))?.b +obj.head(get(1, a)) +obj.head(get(1, div)) +obj.head(get(1, f)) +obj.head(get(1, false)) +obj.head(get(1, s)) +obj.head(get(2, f)) +obj.head(get(a, 0)) +obj.head(get(a, 0.5)) +obj.head(get(a, add)) +obj.head(get(a, b)) +obj.head(get(a, b), min(false)) +obj.head(get(a, div)) +obj.head(get(a, nil)) +obj.head(get(a, nil), arr) +obj.head(get(a, obj)) +obj.head(get(a, obj), div == nil) +obj.head(get(a, s)) +obj.head(get(add, 0.5)) +obj.head(get(add, 0.5), ok) +obj.head(get(add, 1)) +obj.head(get(add, 2)) +obj.head(get(add, a)) +obj.head(get(add, arr)) +obj.head(get(add, b)) +obj.head(get(add, div)) +obj.head(get(add, f)) +obj.head(get(add, f, a, s)) +obj.head(get(add, nil)) +obj.head(get(add, obj)) +obj.head(get(add, ok)) +obj.head(get(add, s)) +obj.head(get(arr)) +obj.head(get(arr, 0.5)) +obj.head(get(arr, 2)) +obj.head(get(arr, a)) +obj.head(get(arr, add)) +obj.head(get(arr, arr)) +obj.head(get(arr, f)) +obj.head(get(arr, f)) * f +obj.head(get(arr, f), add) +obj.head(get(arr, f, obj, a)) +obj.head(get(arr, nil)) +obj.head(get(arr, obj))?.a +obj.head(get(arr, ok)) +obj.head(get(arr, s)) +obj.head(get(b)) +obj.head(get(b, 0.5)) +obj.head(get(b, 2)) +obj.head(get(b, a)) +obj.head(get(b, add)) +obj.head(get(b, b)) +obj.head(get(b, b), div, toJSON(arr)) +obj.head(get(b, b), ok) +obj.head(get(b, div)) +obj.head(get(b, f)) +obj.head(get(b, nil)) +obj.head(get(b, obj)) +obj.head(get(b, ok)) +obj.head(get(b, s)) +obj.head(get(b, s))?.obj +obj.head(get(b, true)) +obj.head(get(b, true), ok)?.a +obj.head(get(div)) +obj.head(get(div, 0.5)) +obj.head(get(div, a)) +obj.head(get(div, add)) +obj.head(get(div, b)) +obj.head(get(div, b))?.obj +obj.head(get(div, div)) +obj.head(get(div, nil)) +obj.head(get(div, obj.b)) +obj.head(get(div, ok)) +obj.head(get(div, s)?.obj) +obj.head(get(div, true)) +obj.head(get(f, 0)) +obj.head(get(f, 0.5)) +obj.head(get(f, a)) +obj.head(get(f, add)) +obj.head(get(f, arr)) +obj.head(get(f, b)) +obj.head(get(f, div)) +obj.head(get(f, div, arr)) +obj.head(get(f, nil)) +obj.head(get(f, nil), add) +obj.head(get(f, nil, a), a) +obj.head(get(f, obj)) +obj.head(get(f, true)) +obj.head(get(false ? s : arr, obj?.head(a, add))) +obj.head(get(false, arr)) +obj.head(get(false, div)) +obj.head(get(false, false)) +obj.head(get(false, ok)) +obj.head(get(nil)) +obj.head(get(nil, 0)) +obj.head(get(nil, 0.5)) +obj.head(get(nil, 1)) +obj.head(get(nil, a), arr) +obj.head(get(nil, add)) +obj.head(get(nil, add))?.b +obj.head(get(nil, div)) +obj.head(get(nil, div)) != float(a ** 0) +obj.head(get(nil, f)) +obj.head(get(nil, nil)) +obj.head(get(nil, obj)) +obj.head(get(nil, ok)) +obj.head(get(nil, s)) +obj.head(get(nil, s), a) +obj.head(get(nil, true)) +obj.head(get(obj)) +obj.head(get(obj), ok) +obj.head(get(obj, 0)) +obj.head(get(obj, 1)) +obj.head(get(obj, 1))?.b +obj.head(get(obj, a)) +obj.head(get(obj, arr) != a) +obj.head(get(obj, arr)) +obj.head(get(obj, arr))?.obj +obj.head(get(obj, b)) +obj.head(get(obj, div)) +obj.head(get(obj, f)) +obj.head(get(obj, false)) +obj.head(get(obj, nil)) +obj.head(get(obj, obj)) +obj.head(get(obj, ok)) +obj.head(get(obj, s)) +obj.head(get(obj, true)) +obj.head(get(ok)) +obj.head(get(ok, 0)) +obj.head(get(ok, 0.5)) +obj.head(get(ok, 1)) +obj.head(get(ok, a))?.b +obj.head(get(ok, add)) +obj.head(get(ok, add), obj) +obj.head(get(ok, arr)) +obj.head(get(ok, div)) +obj.head(get(ok, f)) +obj.head(get(ok, false), map(arr, "a"), toJSON(0.5)) +obj.head(get(ok, nil)) +obj.head(get(ok, ok)) +obj.head(get(ok, ok), 0 + 0.5) +obj.head(get(ok, s), a > 0.5) +obj.head(get(ok, s), arr[0:b]) +obj.head(get(s)) +obj.head(get(s, "a", ok)) +obj.head(get(s, 0.5)) +obj.head(get(s, 1)) +obj.head(get(s, 1), b) +obj.head(get(s, a)) +obj.head(get(s, a), obj.head(0.5, div)) +obj.head(get(s, add)) +obj.head(get(s, arr)) +obj.head(get(s, div)) +obj.head(get(s, div))?.b +obj.head(get(s, f)) +obj.head(get(s, nil)) +obj.head(get(s, obj)) +obj.head(get(s, obj), get(a, f)) +obj.head(get(s, ok), true ? b : "a") +obj.head(get(s, true)) +obj.head(get(true && nil)) +obj.head(get(true)) +obj.head(get(true, 0)) +obj.head(get(true, 0), arr) +obj.head(get(true, a)) +obj.head(get(true, add)) +obj.head(get(true, add), arr) +obj.head(get(true, arr)) +obj.head(get(true, f), ok || 1) +obj.head(get(true, nil)) +obj.head(int("b", arr, f)) +obj.head(int("b", nil, a)) +obj.head(int(a)) +obj.head(int(a), string(true)) +obj.head(int(arr, a, f)) +obj.head(int(s, 0)) +obj.head(keys(obj)) +obj.head(last(0.5)) +obj.head(last(0.5), arr) +obj.head(last(0.5), get(nil, ok)) +obj.head(last(a)) +obj.head(last(a, "a")) +obj.head(last(a, obj)) +obj.head(last(add)) +obj.head(last(add), ok) +obj.head(last(add, obj, add)) +obj.head(last(arr)) +obj.head(last(arr, s), f) +obj.head(last(b)) +obj.head(last(b, b)) +obj.head(last(div)) +obj.head(last(f)) +obj.head(last(f, b, b)) +obj.head(last(false)) +obj.head(last(obj)) +obj.head(last(obj, 2, obj)) +obj.head(last(obj, a, s)) +obj.head(last(ok, arr, nil, ok)) +obj.head(last(s)) +obj.head(last(s, ok, a), nil == arr) +obj.head(len(add, add, s, obj)) +obj.head(len(add, obj)) +obj.head(len(arr)) +obj.head(len(b, s)) +obj.head(len(obj)) +obj.head(len(obj, "a")) +obj.head(len(s) <= f) +obj.head(len(s)) +obj.head(len(s, arr, "b"), obj?.b) +obj.head(lower(a, "b")) +obj.head(lower(a, div, "b")) +obj.head(lower(s)) +obj.head(map("a", 0.5)) +obj.head(map("a", a)) +obj.head(map("a", nil)) +obj.head(map("a", s)) +obj.head(map("b", 0)) +obj.head(map("b", div)) +obj.head(map("b", f)) +obj.head(map("b", nil)) +obj.head(map("b", s)) +obj.head(map("b", true)) +obj.head(map("c", "b")) +obj.head(map("c", a)) +obj.head(map("c", a), get(arr, div)) +obj.head(map("c", arr)) +obj.head(map("c", arr), ok) +obj.head(map("c", b)) +obj.head(map("c", f)) +obj.head(map("c", s)) +obj.head(map(arr, "c")) +obj.head(map(arr, 0)) +obj.head(map(arr, 1)) +obj.head(map(arr, a)) +obj.head(map(arr, arr)) +obj.head(map(arr, b)) +obj.head(map(arr, b), div != obj) +obj.head(map(arr, div)) +obj.head(map(arr, f)) +obj.head(map(arr, false)) +obj.head(map(arr, nil)) +obj.head(map(arr, obj), toJSON(b)) +obj.head(map(arr, ok) == b) +obj.head(map(arr, ok)) +obj.head(map(arr, s)) +obj.head(map(obj, "a")) +obj.head(map(obj, "b")) +obj.head(map(obj, "c")) +obj.head(map(obj, 0)) +obj.head(map(obj, 0.5)) +obj.head(map(obj, a)) +obj.head(map(obj, add)) +obj.head(map(obj, div)) +obj.head(map(obj, f)) +obj.head(map(obj, false)) +obj.head(map(obj, nil)) +obj.head(map(obj, obj)) +obj.head(map(obj, ok)) +obj.head(map(obj, s)) +obj.head(map(s, "a")) +obj.head(map(s, 0)) +obj.head(map(s, 0.5)) +obj.head(map(s, a)) +obj.head(map(s, add)) +obj.head(map(s, arr)) +obj.head(map(s, div)) +obj.head(map(s, f)) +obj.head(map(s, false)) +obj.head(map(s, get(f, f))) +obj.head(map(s, nil)) +obj.head(map(s, nil), obj.a) +obj.head(map(s, obj)) +obj.head(map(s, ok)) +obj.head(map(s, ok), int(b)) +obj.head(map(s, s)) +obj.head(map(s, true)) +obj.head(max("a")) +obj.head(max("c")) +obj.head(max(0.5)) +obj.head(max(1)) +obj.head(max(a)) +obj.head(max(add)) +obj.head(max(b)) +obj.head(max(f)) +obj.head(max(f), a) +obj.head(max(nil, 0), div) +obj.head(max(obj)) +obj.head(max(ok)) +obj.head(max(s)) +obj.head(min(0)) +obj.head(min(0, 0)) +obj.head(min(0, a, f, f)) +obj.head(min(a)) +obj.head(min(a, f), obj) +obj.head(min(add)) +obj.head(min(arr)) +obj.head(min(div)) +obj.head(min(f)) +obj.head(min(nil)) +obj.head(min(ok)) +obj.head(min(s)) +obj.head(min(true)) +obj.head(nil != 0) +obj.head(nil != 0, a) +obj.head(nil != a) +obj.head(nil != add) +obj.head(nil != add, f) +obj.head(nil != f) +obj.head(nil != false) +obj.head(nil != obj) +obj.head(nil != true) +obj.head(nil != true, obj?.b) +obj.head(nil && true) +obj.head(nil == "a") +obj.head(nil == 0) +obj.head(nil == 0.5) +obj.head(nil == a) +obj.head(nil == add) +obj.head(nil == b, arr) +obj.head(nil == f) +obj.head(nil == nil, div, a) +obj.head(nil == obj) +obj.head(nil == s) +obj.head(nil and false) +obj.head(nil and true) +obj.head(nil in arr, a) +obj.head(nil in obj) +obj.head(nil || true, b % a) +obj.head(nil) != div +obj.head(nil) != s +obj.head(nil) == f / f +obj.head(nil) in obj?.obj +obj.head(nil)?.a +obj.head(nil)?.a?.a +obj.head(nil)?.b +obj.head(nil)?.b.obj +obj.head(nil)?.fn(div) +obj.head(nil)?.fn(map(arr, arr)) +obj.head(nil)?.head(arr) +obj.head(nil)?.head(f ^ b) +obj.head(nil)?.obj +obj.head(nil)?.obj.a +obj.head(nil, "a", 0)?.obj +obj.head(nil, "b")?.a +obj.head(nil, "b")?.obj +obj.head(nil, "c")?.head(arr) +obj.head(nil, 0)?.b +obj.head(nil, 0, nil)?.obj +obj.head(nil, 0, obj, s)?.a +obj.head(nil, 0, s)?.b +obj.head(nil, 1)?.obj +obj.head(nil, 1, arr)?.obj +obj.head(nil, a)?.a.head(s, a) +obj.head(nil, a)?.b +obj.head(nil, a, 0)?.head(false or a) +obj.head(nil, a, a, arr)?.b +obj.head(nil, a, add)?.a +obj.head(nil, a, arr)?.b +obj.head(nil, a, b, true, a)?.b +obj.head(nil, a, f)?.b +obj.head(nil, add)?.b +obj.head(nil, add)?.b?.a +obj.head(nil, add, 2, ok) == ok +obj.head(nil, add, a)?.obj +obj.head(nil, add, b)?.a +obj.head(nil, add, b)?.fn(a) +obj.head(nil, add, b)?.obj +obj.head(nil, arr) == arr +obj.head(nil, arr)?.b +obj.head(nil, arr)?.b.obj +obj.head(nil, arr)?.obj +obj.head(nil, arr, 0.5, obj, ok)?.b +obj.head(nil, arr, arr)?.a +obj.head(nil, arr, div)?.a +obj.head(nil, arr, f)?.a +obj.head(nil, b)?.a +obj.head(nil, b)?.b?.obj +obj.head(nil, b)?.obj +obj.head(nil, b, 0, s, f)?.b +obj.head(nil, b, div) in arr +obj.head(nil, b, s)?.obj +obj.head(nil, div) == f +obj.head(nil, div)?.a +obj.head(nil, div)?.b +obj.head(nil, div, 0, b)?.b +obj.head(nil, div, a)?.b +obj.head(nil, div, nil, 1)?.obj +obj.head(nil, f)?.a +obj.head(nil, f)?.b.obj +obj.head(nil, f)?.obj +obj.head(nil, f, b, a)?.a?.b +obj.head(nil, f, div)?.a +obj.head(nil, f, div, arr)?.b +obj.head(nil, f, f)?.a +obj.head(nil, f, obj)?.a +obj.head(nil, false)?.a +obj.head(nil, false)?.b +obj.head(nil, nil)?.b +obj.head(nil, nil)?.obj +obj.head(nil, nil, add)?.a +obj.head(nil, nil, arr, nil, s)?.obj +obj.head(nil, obj)?.a +obj.head(nil, obj)?.b +obj.head(nil, obj)?.obj +obj.head(nil, obj, 1)?.b +obj.head(nil, obj, f, div, a)?.b +obj.head(nil, ok)?.a +obj.head(nil, ok)?.b +obj.head(nil, ok)?.obj +obj.head(nil, ok, 0.5)?.a +obj.head(nil, ok, f)?.head(ok) +obj.head(nil, ok, ok)?.obj +obj.head(nil, s)?.b +obj.head(nil, s)?.obj +obj.head(nil, s, a)?.b +obj.head(nil, true)?.a +obj.head(nil, true)?.b +obj.head(nil, true, 0)?.a +obj.head(nil, true, s)?.a +obj.head(none("c", false)) +obj.head(none(arr, false)) +obj.head(none(arr, ok)) +obj.head(none(obj, false)) +obj.head(none(obj, ok)) +obj.head(none(s, false)) +obj.head(none(s, ok)) +obj.head(none(s, true)) +obj.head(none(s, true), a) +obj.head(not (obj == obj)) +obj.head(not false) +obj.head(not ok) +obj.head(not true) +obj.head(now("b")) +obj.head(now("c")) +obj.head(now(1, s, 0), add) +obj.head(now(a)) +obj.head(now(add)) +obj.head(now(arr)) +obj.head(now(b)) +obj.head(now(b, nil)) +obj.head(now(div)) +obj.head(now(f)) +obj.head(now(f, a, s)) +obj.head(now(false, a, 0.5, arr)) +obj.head(now(nil)) +obj.head(now(nil, obj)) +obj.head(now(obj)) +obj.head(now(obj, div, ok, obj)) +obj.head(now(obj, ok)) +obj.head(now(ok)) +obj.head(now(ok, "b")) +obj.head(obj != "a") +obj.head(obj != 0) +obj.head(obj != a) +obj.head(obj != add) +obj.head(obj != arr) +obj.head(obj != b) +obj.head(obj != div) +obj.head(obj != f, filter("c", ok)) +obj.head(obj != obj) +obj.head(obj != obj, b, true and 2) +obj.head(obj != obj, get(add, a)) +obj.head(obj != ok) +obj.head(obj != s) +obj.head(obj && true) +obj.head(obj == 0) +obj.head(obj == 1) +obj.head(obj == add) +obj.head(obj == b) +obj.head(obj == div) +obj.head(obj == false) +obj.head(obj == nil) +obj.head(obj in nil) +obj.head(obj or true) +obj.head(obj) +obj.head(obj) != a ? nil : 2 +obj.head(obj) != add +obj.head(obj) == obj.a +obj.head(obj) == s +obj.head(obj).a +obj.head(obj).b +obj.head(obj).b * a +obj.head(obj).fn(add(b, b)) +obj.head(obj).head(add) +obj.head(obj).obj +obj.head(obj).obj != obj +obj.head(obj).obj.b +obj.head(obj)?.a +obj.head(obj)?.b +obj.head(obj)?.fn(a) +obj.head(obj)?.head(-0.5) +obj.head(obj)?.head(arr) +obj.head(obj)?.head(get(0.5 / f)) +obj.head(obj)?.head(last(ok, "b" contains "a")) +obj.head(obj)?.head(s) +obj.head(obj)?.obj +obj.head(obj)?.obj == add +obj.head(obj)?.obj.obj +obj.head(obj)?.obj?.a +obj.head(obj)?.obj?.obj +obj.head(obj, "a").a +obj.head(obj, "a")?.obj +obj.head(obj, "a", add, arr, div)?.b +obj.head(obj, "b" in arr) +obj.head(obj, "b").b +obj.head(obj, "b").obj +obj.head(obj, "b")?.a +obj.head(obj, "b", "b", arr)?.a +obj.head(obj, "b", a).a +obj.head(obj, "b", b)?.a +obj.head(obj, "b", div, div, a).obj +obj.head(obj, "c").obj +obj.head(obj, "c")?.obj +obj.head(obj, "c", obj)?.a +obj.head(obj, 0 ** f) +obj.head(obj, 0) == add +obj.head(obj, 0).b +obj.head(obj, 0).obj +obj.head(obj, 0)?.a +obj.head(obj, 0)?.b +obj.head(obj, 0)?.obj +obj.head(obj, 0, "b")?.a +obj.head(obj, 0, "b")?.b +obj.head(obj, 0, 0.5)?.obj?.obj?.b +obj.head(obj, 0, 1, nil).obj +obj.head(obj, 0, b).b +obj.head(obj, 0, f, true).b +obj.head(obj, 0, false)?.b +obj.head(obj, 0, ok)?.obj +obj.head(obj, 0, s)?.a +obj.head(obj, 0.5 ^ b) +obj.head(obj, 0.5).a +obj.head(obj, 0.5).b +obj.head(obj, 0.5).obj +obj.head(obj, 0.5)?.a +obj.head(obj, 0.5, "c")?.a +obj.head(obj, 0.5, div)?.obj +obj.head(obj, 0.5, obj).b +obj.head(obj, 1).b +obj.head(obj, 1).obj +obj.head(obj, 1)?.a +obj.head(obj, 1, a).obj?.obj?.a +obj.head(obj, 1, false).obj +obj.head(obj, 2, "a")?.b +obj.head(obj, 2, true) != s +obj.head(obj, a) +obj.head(obj, a).a +obj.head(obj, a).b +obj.head(obj, a)?.b +obj.head(obj, a)?.obj +obj.head(obj, a, 0).a +obj.head(obj, a, 1)?.b +obj.head(obj, a, 2, a).b +obj.head(obj, a, a).b +obj.head(obj, a, a, false).b +obj.head(obj, a, add, add, s).a +obj.head(obj, a, add, s)?.obj +obj.head(obj, a, arr).b +obj.head(obj, a, ok, b)?.obj +obj.head(obj, a, s, 2).obj +obj.head(obj, add) +obj.head(obj, add).a +obj.head(obj, add).b +obj.head(obj, add).obj +obj.head(obj, add)?.a +obj.head(obj, add)?.b +obj.head(obj, add)?.head(div) +obj.head(obj, add)?.obj +obj.head(obj, add, "c", false, div).b +obj.head(obj, add, 0, add).b +obj.head(obj, add, obj)?.b +obj.head(obj, add, ok, ok).a +obj.head(obj, arr) +obj.head(obj, arr).a +obj.head(obj, arr).b +obj.head(obj, arr)?.a +obj.head(obj, arr)?.b +obj.head(obj, arr, add)?.a +obj.head(obj, arr, arr).obj +obj.head(obj, arr, b).b +obj.head(obj, arr, b)?.obj +obj.head(obj, arr, b, obj, div)?.b +obj.head(obj, arr, obj, add)?.b +obj.head(obj, arr, ok).b +obj.head(obj, arr, ok).obj +obj.head(obj, arr, ok)?.obj +obj.head(obj, arr, ok, 0).a +obj.head(obj, arr, ok, arr).b +obj.head(obj, arr, s, b, add)?.obj +obj.head(obj, b) +obj.head(obj, b).a +obj.head(obj, b).b +obj.head(obj, b).obj +obj.head(obj, b)?.b +obj.head(obj, b)?.obj +obj.head(obj, b)?.obj?.obj +obj.head(obj, b, add).obj +obj.head(obj, b, b)?.a +obj.head(obj, b, b, a).obj +obj.head(obj, b, nil)?.obj +obj.head(obj, b, true)?.b +obj.head(obj, div) +obj.head(obj, div).a +obj.head(obj, div).obj +obj.head(obj, div)?.a +obj.head(obj, div)?.b +obj.head(obj, div)?.head(div) +obj.head(obj, div)?.obj +obj.head(obj, div, "a", a).obj +obj.head(obj, div, "b")?.a +obj.head(obj, div, "b")?.b +obj.head(obj, div, 0).a +obj.head(obj, div, 0, ok).b +obj.head(obj, div, arr, add)?.b +obj.head(obj, div, f, div, add)?.obj +obj.head(obj, div, f, obj, ok)?.obj +obj.head(obj, div, obj) +obj.head(obj, div, obj, a)?.obj +obj.head(obj, div, s) +obj.head(obj, f <= 0.5)?.a +obj.head(obj, f) +obj.head(obj, f).a +obj.head(obj, f).b +obj.head(obj, f).obj +obj.head(obj, f)?.a +obj.head(obj, f)?.b +obj.head(obj, f, 2)?.head(arr) +obj.head(obj, f, arr, a, "a").b +obj.head(obj, f, f, true, s)?.obj +obj.head(obj, f, obj).b +obj.head(obj, f, obj)?.a +obj.head(obj, false).a +obj.head(obj, false).b +obj.head(obj, false).obj +obj.head(obj, false)?.a +obj.head(obj, false, f).obj +obj.head(obj, false, ok, f).obj +obj.head(obj, false, s, ok).a +obj.head(obj, get(arr, b), b < b).b +obj.head(obj, get(ok, arr)) +obj.head(obj, last(add)) +obj.head(obj, map(obj, nil)) +obj.head(obj, nil).a +obj.head(obj, nil).b +obj.head(obj, nil)?.a +obj.head(obj, nil)?.b +obj.head(obj, nil)?.obj +obj.head(obj, nil, 1)?.obj +obj.head(obj, nil, a).b +obj.head(obj, nil, arr)?.a +obj.head(obj, nil, div).obj +obj.head(obj, nil, obj).a +obj.head(obj, not ok) +obj.head(obj, obj) +obj.head(obj, obj).b +obj.head(obj, obj).obj +obj.head(obj, obj)?.a +obj.head(obj, obj)?.obj +obj.head(obj, obj, arr).obj +obj.head(obj, obj, b).a +obj.head(obj, obj, b, ok, div).obj +obj.head(obj, obj, div) +obj.head(obj, obj, div)?.b +obj.head(obj, obj, false)?.a +obj.head(obj, obj, s)?.a +obj.head(obj, obj.obj) +obj.head(obj, ok in nil) +obj.head(obj, ok or 0, s == "a", add, max("c")) +obj.head(obj, ok) +obj.head(obj, ok) and false ? 1 : arr +obj.head(obj, ok).a +obj.head(obj, ok).b +obj.head(obj, ok)?.a +obj.head(obj, ok)?.b +obj.head(obj, ok)?.obj +obj.head(obj, ok, "b")?.a +obj.head(obj, ok, a)?.head(f) +obj.head(obj, ok, add).obj +obj.head(obj, ok, b).b +obj.head(obj, ok, f)?.b +obj.head(obj, ok, nil)?.a +obj.head(obj, ok, obj)?.b +obj.head(obj, ok, s)?.a +obj.head(obj, ok, true, s)?.obj +obj.head(obj, s) +obj.head(obj, s).a +obj.head(obj, s).b +obj.head(obj, s)?.a +obj.head(obj, s)?.b +obj.head(obj, s)?.obj +obj.head(obj, s, 0, nil).a +obj.head(obj, s, 2, b)?.obj +obj.head(obj, s, a)?.b +obj.head(obj, s, b)?.a +obj.head(obj, s, div, s)?.obj +obj.head(obj, true != 0.5, add, abs(b)) +obj.head(obj, true) == obj?.b +obj.head(obj, true).b +obj.head(obj, true)?.obj +obj.head(obj, true)[s] +obj.head(obj, true, "a").b +obj.head(obj, true, "a", div, true)?.a +obj.head(obj.a) +obj.head(obj.a, f && false) +obj.head(obj.a, map(obj, "a"), obj) +obj.head(obj.b) +obj.head(obj.b, 0 == obj) +obj.head(obj.b, 0.5 != nil) +obj.head(obj.b, arr) +obj.head(obj.b, false ? 0 : add) +obj.head(obj.b, true ? arr : 0) +obj.head(obj.fn(0)) +obj.head(obj.fn(a)) +obj.head(obj.fn(b)) +obj.head(obj.head(0)) +obj.head(obj.head(0, b, b, obj)) +obj.head(obj.head(0.5), string(f, a)) +obj.head(obj.head(1, ok, b, 0, div)) +obj.head(obj.head(a)) +obj.head(obj.head(a), arr) +obj.head(obj.head(a, b)) +obj.head(obj.head(add)) +obj.head(obj.head(add, a, false)) +obj.head(obj.head(arr)) +obj.head(obj.head(arr), f) +obj.head(obj.head(arr), ok) +obj.head(obj.head(arr, 0.5)) +obj.head(obj.head(b, add)) +obj.head(obj.head(b, obj, ok)) +obj.head(obj.head(div)) +obj.head(obj.head(false)) +obj.head(obj.head(false, false, "a", "c", 2)) +obj.head(obj.head(nil)) +obj.head(obj.head(nil, b)) +obj.head(obj.head(nil, nil)) +obj.head(obj.head(obj)) +obj.head(obj.head(obj, s, a, s, add)).obj +obj.head(obj.head(ok)) +obj.head(obj.head(ok, b)) +obj.head(obj.head(ok, s, 0)) +obj.head(obj.head(s)) +obj.head(obj.head(true)) +obj.head(obj.obj) +obj.head(obj.obj)?.a +obj.head(obj.obj)?.b +obj.head(obj.obj, div, b) +obj.head(obj.obj, f) +obj.head(obj?.a) +obj.head(obj?.a, first(div)) +obj.head(obj?.a, get(div, add)) +obj.head(obj?.a, ok) +obj.head(obj?.b) +obj.head(obj?.b, a) +obj.head(obj?.b, div) +obj.head(obj?.b, f) +obj.head(obj?.b, get(0, div)) +obj.head(obj?.b, s) +obj.head(obj?.c) +obj.head(obj?.fn(1)) +obj.head(obj?.fn(a)) +obj.head(obj?.fn(b)) +obj.head(obj?.head("a", 1)) +obj.head(obj?.head("a", ok, 0.5, a)) +obj.head(obj?.head("b")) +obj.head(obj?.head(0.5)) +obj.head(obj?.head(0.5), obj?.obj) +obj.head(obj?.head(0.5, add)) +obj.head(obj?.head(1)) +obj.head(obj?.head(2)) +obj.head(obj?.head(2, f, 0.5, "b", b)) +obj.head(obj?.head(a)) +obj.head(obj?.head(a, f, obj, obj, nil)) +obj.head(obj?.head(add)) +obj.head(obj?.head(arr)) +obj.head(obj?.head(arr, true)) +obj.head(obj?.head(b)) +obj.head(obj?.head(b, a), a && true) +obj.head(obj?.head(b, b)) +obj.head(obj?.head(div)) +obj.head(obj?.head(div), get(s, 1)) +obj.head(obj?.head(f), get(nil, a, "b")) +obj.head(obj?.head(false)) +obj.head(obj?.head(false, arr)) +obj.head(obj?.head(false, false)) +obj.head(obj?.head(false, obj), b) +obj.head(obj?.head(nil)) +obj.head(obj?.head(nil, a)) +obj.head(obj?.head(nil, true), a / f) +obj.head(obj?.head(obj)) +obj.head(obj?.head(obj).head(arr)) +obj.head(obj?.head(obj, div, obj)) +obj.head(obj?.head(ok)) +obj.head(obj?.head(ok, "b", true, b, f)) +obj.head(obj?.head(ok, b, false)) +obj.head(obj?.head(ok, ok, ok)) +obj.head(obj?.head(s)) +obj.head(obj?.head(s, "b"), b, a) +obj.head(obj?.head(true, ok)) +obj.head(obj?.obj) +obj.head(obj?.obj).a +obj.head(obj?.obj).obj +obj.head(obj?.obj)?.obj +obj.head(obj?.obj, add != nil) +obj.head(obj?.obj, b) +obj.head(obj?.obj, obj?.obj) +obj.head(obj[s])?.obj +obj.head(ok != "b", obj.a) +obj.head(ok != 0) +obj.head(ok != add) +obj.head(ok != arr) +obj.head(ok != f) +obj.head(ok != nil) +obj.head(ok != obj) +obj.head(ok != ok) +obj.head(ok != s) +obj.head(ok != true) +obj.head(ok && "c") +obj.head(ok && "c", ok) +obj.head(ok && 0) +obj.head(ok && 0, s) +obj.head(ok && 0.5) +obj.head(ok && a) +obj.head(ok && add) +obj.head(ok && add, div) +obj.head(ok && arr) +obj.head(ok && arr, a ^ 0, add) +obj.head(ok && b) +obj.head(ok && div) +obj.head(ok && f) +obj.head(ok && false) +obj.head(ok && nil) +obj.head(ok && s) +obj.head(ok && true) +obj.head(ok == 0) +obj.head(ok == 0.5) +obj.head(ok == 2, a / 0.5) +obj.head(ok == a) +obj.head(ok == add) +obj.head(ok == arr) +obj.head(ok == b) +obj.head(ok == f) +obj.head(ok == false) +obj.head(ok == ok) +obj.head(ok == s) +obj.head(ok ? 0 : add) +obj.head(ok ? 2 : s) +obj.head(ok ? add : 0) +obj.head(ok ? arr : false) +obj.head(ok ? arr : ok) +obj.head(ok ? b : f) +obj.head(ok ? b : nil) +obj.head(ok ? div : 0) +obj.head(ok ? obj : s) +obj.head(ok ? ok : obj) +obj.head(ok ? ok : s) +obj.head(ok ? s : add) +obj.head(ok and a) == obj +obj.head(ok and add) +obj.head(ok and arr) +obj.head(ok and div) +obj.head(ok and f) +obj.head(ok and obj) +obj.head(ok and true) +obj.head(ok in map("b", nil)) +obj.head(ok or "a") +obj.head(ok or "c") +obj.head(ok or 0) +obj.head(ok or 1) +obj.head(ok or a) +obj.head(ok or add) +obj.head(ok or div) +obj.head(ok or false) +obj.head(ok or int(a)?.a?.b) +obj.head(ok or obj) +obj.head(ok or ok) +obj.head(ok or s, get(0, nil)) +obj.head(ok || "a") +obj.head(ok || a) +obj.head(ok || add) +obj.head(ok || arr) +obj.head(ok || arr, any(obj, ok), b) +obj.head(ok || div) +obj.head(ok || f) +obj.head(ok || nil) +obj.head(ok || ok) +obj.head(ok || s) +obj.head(ok) +obj.head(ok) != add +obj.head(ok) != arr +obj.head(ok) != f +obj.head(ok) != obj.a +obj.head(ok) && obj.a +obj.head(ok) == add +obj.head(ok) == string(a) +obj.head(ok) ? arr : ok +obj.head(ok) or !false +obj.head(ok) or ok +obj.head(ok, 1) == obj?.a +obj.head(ok, 2, 0) != ok +obj.head(ok, a + a) +obj.head(ok, a <= a) +obj.head(ok, a) == obj +obj.head(ok, add) +obj.head(ok, add) && obj.b +obj.head(ok, arr, "a") or f != nil +obj.head(ok, div) +obj.head(ok, div) || obj.a.head(ok, a.head(nil, div) < false < "c", add) +obj.head(ok, f != "a") +obj.head(ok, f) +obj.head(ok, false) == add(1, 1) +obj.head(ok, get(a, obj)) +obj.head(ok, get(nil, a)) +obj.head(ok, map(obj, f)) +obj.head(ok, obj) +obj.head(ok, obj.head(f)) +obj.head(ok, obj.obj) +obj.head(ok, ok, div) +obj.head(ok, s && false) +obj.head(ok, s) +obj.head(ok, s, add) +obj.head(one("c", ok)) +obj.head(one(obj, ok)) +obj.head(one(s, false)) +obj.head(one(s, ok)) +obj.head(repeat("b", b)) +obj.head(repeat(s, 0)) +obj.head(s != "c") +obj.head(s != 2, 0 .. b) +obj.head(s != add, f ^ 0) +obj.head(s != arr) +obj.head(s != false) +obj.head(s != obj) +obj.head(s != ok) +obj.head(s != s) +obj.head(s + "a") +obj.head(s + s) +obj.head(s < "b") +obj.head(s < s) +obj.head(s <= "b", arr) +obj.head(s <= s) +obj.head(s == a) +obj.head(s == arr) +obj.head(s == b) +obj.head(s == div) +obj.head(s == f, a) +obj.head(s == false) +obj.head(s == ok) +obj.head(s == true) +obj.head(s > "b") +obj.head(s >= "c") +obj.head(s and false) +obj.head(s contains s) +obj.head(s contains s, obj.a) +obj.head(s matches "b") +obj.head(s matches "c") +obj.head(s startsWith s) +obj.head(s) +obj.head(s) != "a" ? ok : s +obj.head(s) != a +obj.head(s) != obj?.obj +obj.head(s) != string(b) +obj.head(s) != true ? f : true +obj.head(s) == 0 .. b +obj.head(s) == div +obj.head(s) == div != ok +obj.head(s) == f +obj.head(s) == nil ? arr : 0 +obj.head(s) == obj +obj.head(s) in obj +obj.head(s) in obj.obj +obj.head(s) matches s ? obj : b +obj.head(s) or false and ok +obj.head(s)[a] +obj.head(s)[obj?.b] +obj.head(s, "a" == "a") +obj.head(s, 0) <= s +obj.head(s, 0, nil, a) <= s +obj.head(s, 0.5 ** 1) +obj.head(s, 0.5, 0.5) >= s +obj.head(s, 2)[obj?.a] +obj.head(s, a + f) +obj.head(s, a) +obj.head(s, all(arr, true), 0.5 * 0.5) +obj.head(s, b ^ 0) +obj.head(s, b) +obj.head(s, b) == div +obj.head(s, div) +obj.head(s, f * b) +obj.head(s, f == obj) +obj.head(s, f) +obj.head(s, f, obj) +obj.head(s, false and nil) +obj.head(s, false, true)[b] +obj.head(s, get("a", obj), s != f) +obj.head(s, nil != arr, ok) +obj.head(s, now(add)) +obj.head(s, now(nil)) +obj.head(s, obj == arr) +obj.head(s, obj) +obj.head(s, ok, a) +obj.head(s, s) +obj.head(s, s) != obj.a +obj.head(s[0]) +obj.head(s[a:1]) +obj.head(s[f]) +obj.head(splitAfter("c", "b", s, nil)) +obj.head(splitAfter("c", "c")) +obj.head(string("a"), obj, a) +obj.head(string("c", ok, ok)) +obj.head(string(0, ok)) +obj.head(string(0.5, "a", b)) +obj.head(string(1)) +obj.head(string(2, nil)) +obj.head(string(a)) +obj.head(string(a, nil)) +obj.head(string(add)) +obj.head(string(add, a, arr, f)) +obj.head(string(arr)) +obj.head(string(arr, b, f, s, f)) +obj.head(string(arr, obj, s, arr), all("c", ok)) +obj.head(string(b)) +obj.head(string(b, arr)) +obj.head(string(div)) +obj.head(string(div), ok == 1) +obj.head(string(f, ok)) +obj.head(string(obj, false)) +obj.head(string(ok)) +obj.head(string(ok, true)) +obj.head(string(s)) +obj.head(string(s), div) +obj.head(string(s, 0, obj)) +obj.head(string(true, div, obj, b)) +obj.head(toBase64("a", "b")) +obj.head(toBase64("c")) +obj.head(toBase64("c", b, a)) +obj.head(toBase64(s)) +obj.head(toJSON("a")) +obj.head(toJSON("b")) +obj.head(toJSON("b"), obj) +obj.head(toJSON("c")) +obj.head(toJSON("c", s)) +obj.head(toJSON(0)) +obj.head(toJSON(0, 0.5)) +obj.head(toJSON(0.5 < a)) +obj.head(toJSON(0.5)) +obj.head(toJSON(0.5, f, arr)) +obj.head(toJSON(1, ok, arr)) +obj.head(toJSON(2), f, 0.5 < f) +obj.head(toJSON(a, f, 0, f)) +obj.head(toJSON(arr)) +obj.head(toJSON(b, add, ok)) +obj.head(toJSON(b, f, b)) +obj.head(toJSON(f)) +obj.head(toJSON(f, "b")) +obj.head(toJSON(f, add, nil, obj)) +obj.head(toJSON(f, div)) +obj.head(toJSON(false), ok) +obj.head(toJSON(false, f)) +obj.head(toJSON(nil)) +obj.head(toJSON(nil, div)) +obj.head(toJSON(ok)) +obj.head(toJSON(ok, obj, f)) +obj.head(toJSON(s, nil, ok)) +obj.head(toJSON(true), string(nil)) +obj.head(trim(s)) +obj.head(trimPrefix("c")) +obj.head(trimPrefix(s), s) +obj.head(trimSuffix("b")) +obj.head(trimSuffix("c")) +obj.head(trimSuffix(s)) +obj.head(true != 0) +obj.head(true != add) +obj.head(true != add, b == false) +obj.head(true != div) +obj.head(true != f, a) +obj.head(true != obj) +obj.head(true != ok, string(false, b, b, arr)) +obj.head(true && a) != f +obj.head(true && add, get(nil, ok)) +obj.head(true && ok) +obj.head(true && s) +obj.head(true == "a") +obj.head(true == 0.5) +obj.head(true == a) +obj.head(true == arr, ok) +obj.head(true == f) +obj.head(true == nil) +obj.head(true ? add : false) +obj.head(true ? arr : b) +obj.head(true ? b : ok startsWith add.fn(true)) +obj.head(true ? div : arr, b) +obj.head(true ? f : "b", s) +obj.head(true ? obj : f) +obj.head(true ? obj : nil) +obj.head(true ? s : "a") +obj.head(true and a) +obj.head(true and arr) +obj.head(true and b, s) +obj.head(true and div) +obj.head(true and nil) +obj.head(true and obj) +obj.head(true in arr) +obj.head(true in nil) +obj.head(true or 0) +obj.head(true or 1, b) +obj.head(true or a) +obj.head(true or arr) +obj.head(true or b) +obj.head(true or obj) +obj.head(true or ok) +obj.head(true || arr) +obj.head(true || obj) +obj.head(true) != b +obj.head(true) != obj +obj.head(true) && obj?.obj?.b +obj.head(true) == f +obj.head(true, 0) or ok +obj.head(true, add) or obj.b +obj.head(true, add, b) && ok +obj.head(true, div) || 0 == f +obj.head(true, f) == s +obj.head(upper("b"), b) +obj.head(upper("c")) +obj.head(upper("c"), b) +obj.head(upper(a, "c")) +obj.head(upper(s)) +obj.head(upper(s, a, 0.5, s)) +obj.head(upper(true, "a")) +obj.head(values(obj)) +obj.head({"a": add}) +obj.head({"b": add, "b": b, "c": s}) +obj.obj +obj.obj != 2 % 1 +obj.obj != a +obj.obj != a / 1 +obj.obj != a == true +obj.obj != a ? f : true +obj.obj != add +obj.obj != add(a, a) +obj.obj != any(arr, true) +obj.obj != arr +obj.obj != arr ? false : b +obj.obj != b +obj.obj != b .. b +obj.obj != b ? a : s +obj.obj != div +obj.obj != div(b, b) +obj.obj != f +obj.obj != f != nil +obj.obj != f / f +obj.obj != float(b) +obj.obj != min(b) +obj.obj != obj +obj.obj != obj.a +obj.obj != obj.head(0) +obj.obj != obj?.a +obj.obj != obj?.b +obj.obj != ok +obj.obj != s +obj.obj != string(0.5) +obj.obj != string(2) +obj.obj && !false +obj.obj == -b +obj.obj == 0 == nil ? get(arr, a) : ok +obj.obj == 2 ** f +obj.obj == a +obj.obj == a ** f +obj.obj == add +obj.obj == add ? arr : obj +obj.obj == add ? div : "c" +obj.obj == add(a, 0) +obj.obj == any(arr, false) +obj.obj == arr +obj.obj == b +obj.obj == div +obj.obj == div != ok +obj.obj == f +obj.obj == f == ok +obj.obj == f ? div : 0.5 +obj.obj == none(arr, ok) +obj.obj == not true +obj.obj == obj +obj.obj == obj.obj +obj.obj == obj.obj?.obj +obj.obj == obj?.b +obj.obj == obj?.head(0, ok) +obj.obj == ok +obj.obj == ok == ok +obj.obj == s +obj.obj == true ? 1 : a +obj.obj == true ? nil : "a" +obj.obj in arr +obj.obj in map(arr, "a") +obj.obj or "b" == "a" +obj.obj or false and obj?.b?.b +obj.obj.a +obj.obj.a != b +obj.obj.a ** a +obj.obj.b +obj.obj.b ** b +obj.obj.b .. b +obj.obj.b < b +obj.obj.b ^ -f ^ -f +obj.obj.obj +obj.obj.obj.a +obj.obj.obj.b +obj.obj.obj.obj +obj.obj.obj?.a +obj.obj.obj?.b +obj.obj.obj?.obj +obj.obj?.a +obj.obj?.a ** f +obj.obj?.a == arr +obj.obj?.b +obj.obj?.b != add +obj.obj?.b * f +obj.obj?.obj +obj.obj?.obj != b +obj.obj?.obj.a +obj.obj?.obj.b +obj.obj?.obj.obj +obj.obj?.obj?.a +obj.obj?.obj?.b +obj.obj?.obj?.obj +obj.obj?.obj[s] +obj.obj[obj.head(nil)] +obj.obj[s] +obj.obj[toJSON(s)] +obj.obj[trimPrefix(s)] +obj?.a +obj?.a != (ok and ok) +obj?.a != a +obj?.a != add +obj?.a != arr +obj?.a != b +obj?.a != div +obj?.a != f +obj?.a != f ** a +obj?.a != obj +obj?.a != obj.head(s, div, "b", 1) +obj?.a != obj.obj +obj?.a != obj?.a +obj?.a != obj?.b +obj?.a != ok +obj?.a != ok ? b : arr +obj?.a != s +obj?.a != s != false +obj?.a != toJSON(arr) +obj?.a != trimPrefix("a") +obj?.a % a +obj?.a % b +obj?.a % obj.a +obj?.a % obj?.b +obj?.a * -0.5 +obj?.a * a +obj?.a * arr[a] +obj?.a * b +obj?.a * f +obj?.a * min(f, f) +obj?.a * obj.a +obj?.a ** a +obj?.a ** abs(0) +obj?.a ** add(b, 0) +obj?.a ** b +obj?.a ** f +obj?.a ** obj?.head(f, ok) +obj?.a + a +obj?.a + abs(a) +obj?.a + add(0, 0) +obj?.a + arr[b] +obj?.a + b +obj?.a + f +obj?.a + f ** a +obj?.a + obj.a +obj?.a + obj?.a +obj?.a + obj?.b +obj?.a - 0 % 1 +obj?.a - 0 * 0 +obj?.a - 0 * 0.5 +obj?.a - 0 * 2 +obj?.a - a +obj?.a - b +obj?.a - f +obj?.a - obj.b +obj?.a - obj?.a +obj?.a .. a +obj?.a .. b +obj?.a .. count(arr, true) +obj?.a .. div(b, 2) +obj?.a .. obj.b +obj?.a .. obj?.a +obj?.a / (b + f) +obj?.a / a +obj?.a / b +obj?.a / b ** f +obj?.a / f +obj?.a / obj.head(b, a) +obj?.a / obj?.b +obj?.a < a +obj?.a < a ? "c" : add +obj?.a < a ? s : false +obj?.a < b +obj?.a < f +obj?.a < float(b) +obj?.a < obj.a +obj?.a < obj?.a +obj?.a <= 0 * 0.5 +obj?.a <= 0 == false +obj?.a <= 2 ? b : ok +obj?.a <= a +obj?.a <= a + f +obj?.a <= b +obj?.a <= b + a +obj?.a <= count(arr, ok) +obj?.a <= div(b, a) +obj?.a <= f +obj?.a <= f ^ f +obj?.a <= len(arr) +obj?.a <= obj.head(0.5, add, false, nil) +obj?.a <= obj?.b +obj?.a == -1 +obj?.a == 0.5 ^ a +obj?.a == a +obj?.a == a ** f +obj?.a == add +obj?.a == arr +obj?.a == b +obj?.a == b ? ok : obj +obj?.a == count(arr, ok) +obj?.a == div +obj?.a == div ? 2 : true +obj?.a == div ? b : div +obj?.a == div ? s : b +obj?.a == f +obj?.a == f != ok +obj?.a == f ^ 0.5 +obj?.a == min(2, 0) +obj?.a == nil ? 0 : a +obj?.a == obj +obj?.a == ok +obj?.a == s +obj?.a == toJSON(s) +obj?.a > -1 +obj?.a > 1 ? 2 : 0.5 +obj?.a > a +obj?.a > a ^ f +obj?.a > b +obj?.a > b + a +obj?.a > b ? "b" : obj.a +obj?.a > f +obj?.a > f * b +obj?.a > get(arr, 0) +obj?.a > obj.a +obj?.a > obj?.a +obj?.a > obj?.b +obj?.a >= 0 != nil +obj?.a >= 0 * 0 +obj?.a >= 2 != nil +obj?.a >= 2 / a +obj?.a >= a +obj?.a >= b +obj?.a >= div(b, a) +obj?.a >= f +obj?.a >= f ? true : a == obj?.a?.a +obj?.a >= obj.a +obj?.a >= obj.b +obj?.a >= obj.head(2, obj) +obj?.a >= obj?.a +obj?.a >= obj?.head(f, f) +obj?.a ^ (b * 1) +obj?.a ^ -b +obj?.a ^ a +obj?.a ^ arr[b] +obj?.a ^ b +obj?.a ^ f +obj?.a ^ len(s) +obj?.a ^ obj.a +obj?.a ^ obj?.a +obj?.a ^ obj?.b +obj?.a ^ obj?.head(b, "c", 1) +obj?.a in arr +obj?.a in values(obj) +obj?.a || !true +obj?.a || not false +obj?.b +obj?.b != "a" ? f : false +obj?.b != "a" ? nil : nil +obj?.b != 0 ** f +obj?.b != 0.5 + b +obj?.b != 2 * b +obj?.b != a +obj?.b != a ? a : add +obj?.b != a ? false : b +obj?.b != add +obj?.b != add == nil +obj?.b != add ? 0 : "a" +obj?.b != arr +obj?.b != arr[a] +obj?.b != b +obj?.b != b ** 0 +obj?.b != div +obj?.b != div ? div : 2 +obj?.b != f +obj?.b != float(b) +obj?.b != map(arr, a) +obj?.b != map(arr, arr) +obj?.b != max(0) +obj?.b != min(a) +obj?.b != obj +obj?.b != obj.head(b, b) +obj?.b != obj.obj +obj?.b != obj?.a +obj?.b != ok +obj?.b != s +obj?.b != toBase64(s) +obj?.b % -a +obj?.b % a +obj?.b % b +obj?.b % get(arr, 2) +obj?.b % obj.a +obj?.b % obj.head(a, f, arr) +obj?.b % obj?.a +obj?.b % obj?.head(1) +obj?.b * (a + a) +obj?.b * (f + b) +obj?.b * 0 ^ f +obj?.b * a +obj?.b * a ** b +obj?.b * a / f +obj?.b * b +obj?.b * div(b, a) +obj?.b * f +obj?.b * float(b) +obj?.b * obj.a +obj?.b * obj.head(2, add) +obj?.b * obj.head(b, 0) +obj?.b * obj?.b +obj?.b ** (0 + b) +obj?.b ** (b + b) +obj?.b ** a +obj?.b ** add(a, 0) +obj?.b ** b +obj?.b ** b ^ 0.5 +obj?.b ** f +obj?.b ** max(0) +obj?.b ** obj.a +obj?.b ** obj.b +obj?.b ** obj.head(a) +obj?.b ** obj?.a +obj?.b + a +obj?.b + add(b, 2) +obj?.b + b +obj?.b + b * f +obj?.b + div(a, 2) +obj?.b + obj.a +obj?.b + obj.b +obj?.b + obj?.b +obj?.b - -a +obj?.b - 0 * 0 +obj?.b - 0 + a +obj?.b - 0 ^ b +obj?.b - a +obj?.b - a + a +obj?.b - b +obj?.b - b - 1 +obj?.b - f +obj?.b - f ** a +obj?.b - obj.a +obj?.b - obj.b +obj?.b - obj?.a +obj?.b .. 2 - 0 +obj?.b .. a +obj?.b .. add(b, a) +obj?.b .. b +obj?.b .. obj.b +obj?.b .. obj?.a +obj?.b .. obj?.b +obj?.b .. obj?.fn(a) +obj?.b / (0 - b) +obj?.b / 0 * f +obj?.b / 0.5 ** b +obj?.b / a +obj?.b / b +obj?.b / count(arr, ok) +obj?.b / div(a, b) +obj?.b / f +obj?.b / get(arr, 0) +obj?.b / obj.b +obj?.b / obj?.a +obj?.b / obj?.b +obj?.b < 0 != ok +obj?.b < 1 + 2 +obj?.b < 1 - a +obj?.b < a +obj?.b < add(b, 0) +obj?.b < b +obj?.b < b != ok +obj?.b < f +obj?.b < f * b +obj?.b < obj?.b +obj?.b <= -a +obj?.b <= a +obj?.b <= add(0, 1) +obj?.b <= b +obj?.b <= f +obj?.b <= f + b +obj?.b <= f / 2 +obj?.b <= f / b +obj?.b <= obj?.b +obj?.b == !false +obj?.b == 0 * a +obj?.b == 1 .. 0 +obj?.b == a +obj?.b == a + f +obj?.b == add +obj?.b == arr +obj?.b == arr ? add : s +obj?.b == b +obj?.b == b - a +obj?.b == div +obj?.b == f +obj?.b == obj +obj?.b == obj.obj +obj?.b == obj?.b +obj?.b == obj?.obj +obj?.b == ok +obj?.b == s +obj?.b == s == nil +obj?.b == s == ok +obj?.b == s ? 0.5 : "a" +obj?.b == s ? add : obj +obj?.b == upper("c") +obj?.b > 0 * a +obj?.b > a +obj?.b > b +obj?.b > b ^ 0 +obj?.b > f +obj?.b > max(1) +obj?.b > min(0.5) +obj?.b >= -a +obj?.b >= 0 ** a +obj?.b >= 0.5 != true +obj?.b >= 0.5 ? div : arr +obj?.b >= a +obj?.b >= b +obj?.b >= b + 0 +obj?.b >= b + b +obj?.b >= div(b, 1) +obj?.b >= f +obj?.b >= max(f, f) +obj?.b >= obj.a +obj?.b >= obj.head(a, arr, add) +obj?.b >= obj?.b +obj?.b ^ (0 * f) +obj?.b ^ -b +obj?.b ^ a +obj?.b ^ arr[2] +obj?.b ^ b +obj?.b ^ f +obj?.b ^ int(f) +obj?.b ^ obj.a +obj?.b ^ obj.head(0) +obj?.b ^ obj?.head(obj, obj, a).a +obj?.b and (true || false) +obj?.b in arr +obj?.b in arr ? arr : a +obj?.b in map(arr, true) +obj?.c != div +obj?.c != obj +obj?.c?.a +obj?.c?.a?.b +obj?.c?.b +obj?.c?.b.obj +obj?.c?.fn(div) +obj?.c?.obj +obj?.c?.obj.b +obj?.fn(-0) +obj?.fn(-1) +obj?.fn(-2) +obj?.fn(-a) +obj?.fn(-b) +obj?.fn(0 % a) +obj?.fn(0 * a) +obj?.fn(0 + 0) +obj?.fn(0 + a) +obj?.fn(0 + b) +obj?.fn(0 - 0) +obj?.fn(0 - b) +obj?.fn(0 or false) +obj?.fn(0) != a +obj?.fn(0) != ok +obj?.fn(0) != {"b": 1, "a": div} +obj?.fn(0) ** f +obj?.fn(0) + b +obj?.fn(0) / b +obj?.fn(0) == a +obj?.fn(0) == add +obj?.fn(0) == obj +obj?.fn(0) >= b +obj?.fn(0) ^ b +obj?.fn(0) ^ obj?.a +obj?.fn(1 % a) +obj?.fn(1 * b) +obj?.fn(1 + 0) +obj?.fn(1 + a) +obj?.fn(1 - b) +obj?.fn(1) != string(f) +obj?.fn(1) * f / b +obj?.fn(1) / b +obj?.fn(1) < obj.head(0.5, s) +obj?.fn(1) < obj?.head(a) +obj?.fn(2 - 0) +obj?.fn(2 - b) +obj?.fn(2) % a +obj?.fn(2) - obj.head(0.5, 0, b, 0.5) +obj?.fn(2) <= a +obj?.fn(2) == arr ? obj : b +obj?.fn(a % 2) +obj?.fn(a % a) +obj?.fn(a % b) +obj?.fn(a * 0) +obj?.fn(a * 1) +obj?.fn(a * 2) +obj?.fn(a * a) +obj?.fn(a + 2) +obj?.fn(a + a) +obj?.fn(a + b) +obj?.fn(a - 1) +obj?.fn(a - 2) +obj?.fn(a - b) +obj?.fn(a || false) +obj?.fn(a) +obj?.fn(a) != 0 .. b +obj?.fn(a) != arr +obj?.fn(a) != b +obj?.fn(a) != div +obj?.fn(a) != toBase64(s) +obj?.fn(a) - 0.5 ** f +obj?.fn(a) .. b +obj?.fn(a) / a +obj?.fn(a) == add +obj?.fn(a) == s +obj?.fn(a) > b +obj?.fn(a) > obj.a +obj?.fn(a) >= a +obj?.fn(a) ^ a +obj?.fn(a) || ok || true +obj?.fn(abs(0.5, div, a)) +obj?.fn(abs(2)) +obj?.fn(abs(a)) +obj?.fn(abs(add, b, "b", a)) +obj?.fn(abs(arr, a)) +obj?.fn(abs(b)) +obj?.fn(abs(s, a)) +obj?.fn(add(0, 1)) +obj?.fn(add(0, b)) +obj?.fn(add(1, 0)) +obj?.fn(add(1, 2)) +obj?.fn(add(2, a)) +obj?.fn(add(2, b)) +obj?.fn(add(a, 0)) +obj?.fn(add(a, 2)) +obj?.fn(add(a, b)) +obj?.fn(add(b, a)) +obj?.fn(add(b, b)) +obj?.fn(arr[0.5]) +obj?.fn(arr[1]) +obj?.fn(arr[b]) +obj?.fn(arr[f]) +obj?.fn(b % 2) +obj?.fn(b % a) +obj?.fn(b && true) +obj?.fn(b * b) +obj?.fn(b + 0) +obj?.fn(b + a) +obj?.fn(b + b) +obj?.fn(b - a) +obj?.fn(b - b) +obj?.fn(b) +obj?.fn(b) != (false and ok) +obj?.fn(b) != obj +obj?.fn(b) != ok +obj?.fn(b) != string("c") +obj?.fn(b) * obj.obj?.a +obj?.fn(b) - a +obj?.fn(b) - f +obj?.fn(b) - obj.b +obj?.fn(b) .. b +obj?.fn(b) < a +obj?.fn(b) < b +obj?.fn(b) == obj +obj?.fn(b) > div(b, a) +obj?.fn(b) ^ a +obj?.fn(b) ^ b +obj?.fn(b) in arr +obj?.fn(count("a", false)) +obj?.fn(count("a", true)) +obj?.fn(count(arr, false)) +obj?.fn(count(arr, ok)) +obj?.fn(count(obj, false)) +obj?.fn(count(s, ok)) +obj?.fn(count(s, true)) +obj?.fn(div(0, 1)) +obj?.fn(div(0, b)) +obj?.fn(div(1, a)) +obj?.fn(div(2, 1)) +obj?.fn(div(2, a)) +obj?.fn(div(2, b)) +obj?.fn(div(a, 1)) +obj?.fn(div(a, a)) +obj?.fn(div(a, b)) +obj?.fn(div(b, 1)) +obj?.fn(div(b, 2)) +obj?.fn(div(b, a)) +obj?.fn(div(b, b)) +obj?.fn(false ? false : a) +obj?.fn(false or 2) +obj?.fn(false || 0) +obj?.fn(get(arr, 0)) +obj?.fn(get(arr, 1)) +obj?.fn(get(arr, 2)) +obj?.fn(get(arr, a)) +obj?.fn(get(arr, b)) +obj?.fn(get(arr, f)) +obj?.fn(get(obj, "b")) +obj?.fn(int(0)) +obj?.fn(int(0.5)) +obj?.fn(int(2)) +obj?.fn(int(a)) +obj?.fn(int(a, nil, 0)) +obj?.fn(int(add, b)) +obj?.fn(int(b)) +obj?.fn(int(b, 1)) +obj?.fn(int(f)) +obj?.fn(int(f, a, s, a)) +obj?.fn(int(ok, ok, 0)) +obj?.fn(int(s, "c", 0.5)) +obj?.fn(last(arr)) +obj?.fn(last(arr, 0.5)) +obj?.fn(len(0, f, obj, nil, "c")) +obj?.fn(len(arr)) +obj?.fn(len(f, arr, obj)) +obj?.fn(len(obj)) +obj?.fn(len(ok, s)) +obj?.fn(max(0)) +obj?.fn(max(a)) +obj?.fn(max(b, a)) +obj?.fn(min(0)) +obj?.fn(min(2)) +obj?.fn(min(a)) +obj?.fn(obj.a) +obj?.fn(obj.b) +obj?.fn(obj.fn(1)) +obj?.fn(obj.head(0)) +obj?.fn(obj.head(0, nil)) +obj?.fn(obj.head(2, f, 0)) +obj?.fn(obj.head(a)) +obj?.fn(obj.head(a, arr)) +obj?.fn(obj.head(b)) +obj?.fn(obj.head(b, nil, 2)) +obj?.fn(obj.head(b, true)) +obj?.fn(obj.obj?.b) +obj?.fn(obj?.a) +obj?.fn(obj?.a) == b +obj?.fn(obj?.b) +obj?.fn(obj?.fn(0)) +obj?.fn(obj?.fn(1)) +obj?.fn(obj?.fn(2)) +obj?.fn(obj?.fn(a)) +obj?.fn(obj?.fn(b)) +obj?.fn(obj?.head(0)) +obj?.fn(obj?.head(0, arr)) +obj?.fn(obj?.head(0, s)) +obj?.fn(obj?.head(a)) +obj?.fn(obj?.head(a, 0, nil)) +obj?.fn(obj?.head(a, arr)) +obj?.fn(obj?.head(a, div, add)) +obj?.fn(obj?.head(b, 2)) +obj?.fn(obj?.head(b, add)) +obj?.fn(obj?.head(b, add, b)) +obj?.fn(obj?.head(b, add, nil)) +obj?.fn(obj?.obj.a) +obj?.fn(ok ? 2 : 0) +obj?.fn(ok ? b : obj) +obj?.fn(ok and 1) +obj?.fn(ok and a) +obj?.fn(ok and b) +obj?.fn(ok) and not true +obj?.fn(true && 0) +obj?.fn(true and 0) +obj?.fn(true and a) +obj?.head(!(add == arr)) +obj?.head(!false) +obj?.head(!ok) +obj?.head(!true) +obj?.head("a" != 2) +obj?.head("a" != arr) +obj?.head("a" != b) +obj?.head("a" != false) +obj?.head("a" != true) +obj?.head("a" < "b") +obj?.head("a" == add) +obj?.head("a" == arr, div) +obj?.head("a" == false) +obj?.head("a" > "b") +obj?.head("a" > s) +obj?.head("a" matches "c") +obj?.head("a" startsWith "a") +obj?.head("a" startsWith "b") +obj?.head("a") <= s +obj?.head("a") == arr +obj?.head("a") > s +obj?.head("a") contains s +obj?.head("a") in 0 .. a +obj?.head("a") in obj.obj +obj?.head("a", 0) == b ** 0 +obj?.head("a", a) != arr ? s : false +obj?.head("b" != "c") +obj?.head("b" != 0) +obj?.head("b" != 1) +obj?.head("b" != 2) +obj?.head("b" != arr) +obj?.head("b" != nil) +obj?.head("b" + "a") +obj?.head("b" + s) +obj?.head("b" == 0) +obj?.head("b" == b, indexOf(s, s), a, b) +obj?.head("b" == nil) +obj?.head("b" > s) +obj?.head("b" endsWith "a") +obj?.head("b" in obj) +obj?.head("b" matches s) +obj?.head("b") == obj.a +obj?.head("b", s, arr) == obj +obj?.head("c" != "a") +obj?.head("c" != arr) +obj?.head("c" != div) +obj?.head("c" + s) +obj?.head("c" == arr) +obj?.head("c" == div) +obj?.head("c" == obj) +obj?.head("c" == s) +obj?.head("c" >= s) +obj?.head("c" startsWith s) +obj?.head("c") != ok +obj?.head("c") == false == false +obj?.head("c") == s +obj?.head("c", 2, 0) + s +obj?.head("c", add) contains s +obj?.head("c", add) in obj +obj?.head("c", b) != arr +obj?.head("c", b) in arr +obj?.head((b + 0) * a < b) +obj?.head(-0) +obj?.head(-0.5) +obj?.head(-1) +obj?.head(-a) +obj?.head(-a, add) +obj?.head(-b) +obj?.head(-b, obj?.head("c", 0)) +obj?.head(-f) +obj?.head(-f, add) +obj?.head(0 != 0) +obj?.head(0 != 1) +obj?.head(0 != a) +obj?.head(0 != arr) +obj?.head(0 != b) +obj?.head(0 != div) +obj?.head(0 != f) +obj?.head(0 != false) +obj?.head(0 != nil) +obj?.head(0 != obj) +obj?.head(0 != obj, obj, -b) +obj?.head(0 != obj?.obj) +obj?.head(0 % 2) +obj?.head(0 % a) +obj?.head(0 % b) +obj?.head(0 && false) +obj?.head(0 * 0) +obj?.head(0 * f) +obj?.head(0 + 0) +obj?.head(0 + 2) +obj?.head(0 + a) +obj?.head(0 + b) +obj?.head(0 - 0) +obj?.head(0 - 0.5) +obj?.head(0 - 2) +obj?.head(0 - a) +obj?.head(0 - b) +obj?.head(0 - f) +obj?.head(0 .. 2) +obj?.head(0 .. b) +obj?.head(0 / 0) +obj?.head(0 < 0.5) +obj?.head(0 < a) +obj?.head(0 <= 0) +obj?.head(0 <= 0.5) +obj?.head(0 <= a, get("a", b)) +obj?.head(0 <= b, obj) +obj?.head(0 <= f) +obj?.head(0 == "b") +obj?.head(0 == 1) +obj?.head(0 == add) +obj?.head(0 == arr) +obj?.head(0 == b) +obj?.head(0 == div) +obj?.head(0 == div, f != b) +obj?.head(0 == nil) +obj?.head(0 == obj) +obj?.head(0 == s) +obj?.head(0 > 0) +obj?.head(0 > b) +obj?.head(0 > f) +obj?.head(0 > f, false or "b") +obj?.head(0 >= 0) +obj?.head(0 >= 2) +obj?.head(0 >= a) +obj?.head(0 >= f) +obj?.head(0 ^ 0) +obj?.head(0 ^ 0, f != obj) +obj?.head(0 ^ 0, string(div, f, b, s)) +obj?.head(0 ^ b, obj, now(0.5)) +obj?.head(0 or true) +obj?.head(0) != add +obj?.head(0) != b +obj?.head(0) != div +obj?.head(0) != filter(arr, ok) +obj?.head(0) % obj.a +obj?.head(0) ** b +obj?.head(0) - obj?.fn(b) +obj?.head(0) .. a +obj?.head(0) .. obj.b +obj?.head(0) / obj?.a +obj?.head(0) < div(b, b) +obj?.head(0) in map(arr, false) +obj?.head(0, 1) != f +obj?.head(0, 1) != nil ? "a" : arr +obj?.head(0, 2, ok) == f +obj?.head(0, 2, s) * b +obj?.head(0, arr) .. b +obj?.head(0, arr, ok, ok) % b +obj?.head(0, f, 0, ok) .. a +obj?.head(0, ok) % a +obj?.head(0, ok) % b +obj?.head(0.5 != 0) +obj?.head(0.5 != 1) +obj?.head(0.5 != 2) +obj?.head(0.5 != a, add, 0 == ok) +obj?.head(0.5 != arr, obj) +obj?.head(0.5 != false) +obj?.head(0.5 != obj) +obj?.head(0.5 && true) +obj?.head(0.5 * 0.5) +obj?.head(0.5 * b) +obj?.head(0.5 * b, f <= a) +obj?.head(0.5 ** 0) +obj?.head(0.5 ** 0.5, a) +obj?.head(0.5 ** a) +obj?.head(0.5 + 2) +obj?.head(0.5 + f) +obj?.head(0.5 - f) +obj?.head(0.5 - f, add, a) +obj?.head(0.5 .. f) +obj?.head(0.5 / 0.5) +obj?.head(0.5 / 2) +obj?.head(0.5 < 0) +obj?.head(0.5 <= 0) +obj?.head(0.5 <= f) +obj?.head(0.5 == "c") +obj?.head(0.5 == a) +obj?.head(0.5 == arr) +obj?.head(0.5 == ok) +obj?.head(0.5 == true) +obj?.head(0.5 > f) +obj?.head(0.5) != a +obj?.head(0.5) != arr +obj?.head(0.5) != b +obj?.head(0.5) - f +obj?.head(0.5) <= f ? true : a +obj?.head(0.5) == b +obj?.head(0.5) == ok ? 0 : obj +obj?.head(0.5) > f +obj?.head(0.5) > f / f +obj?.head(0.5, a) in arr ? add : f +obj?.head(0.5, a, f) + 2 * f +obj?.head(0.5, arr, div, f, "a") >= f +obj?.head(0.5, arr, true) > obj?.b +obj?.head(0.5, b) == obj +obj?.head(0.5, nil) != b +obj?.head(0.5, nil) ^ b +obj?.head(0.5, nil, 0) / add(b, a) +obj?.head(0.5, ok) <= a +obj?.head(0.5, true) < obj?.a +obj?.head(1 != 0) +obj?.head(1 != ok) +obj?.head(1 % b, ok, obj) +obj?.head(1 * a) +obj?.head(1 * b) +obj?.head(1 + 0) +obj?.head(1 + b, obj.head(add, ok)) +obj?.head(1 - b) +obj?.head(1 - f, get(add, 1)) +obj?.head(1 .. b) +obj?.head(1 < b) +obj?.head(1 == add) +obj?.head(1 == arr) +obj?.head(1 == s) +obj?.head(1 > b) +obj?.head(1 >= f) +obj?.head(1 ^ 1) +obj?.head(1 ^ a) +obj?.head(1 ^ f) +obj?.head(1 and false) +obj?.head(1 in nil) +obj?.head(1 or true) +obj?.head(1) != div +obj?.head(1) * a +obj?.head(1) >= f +obj?.head(1, add) != obj.a +obj?.head(1, add, s, ok) / obj.a +obj?.head(1, s) + obj.head(0) +obj?.head(2 != 0.5, filter(arr, false)) +obj?.head(2 != b) +obj?.head(2 != div) +obj?.head(2 != f) +obj?.head(2 != nil) +obj?.head(2 != nil, one("c", false)) +obj?.head(2 != s) +obj?.head(2 != true) +obj?.head(2 * f) +obj?.head(2 ** b, upper(false, s)) +obj?.head(2 ** f) +obj?.head(2 + 0.5) +obj?.head(2 - b) +obj?.head(2 .. 0) +obj?.head(2 .. 0, f, s endsWith s) +obj?.head(2 .. a) +obj?.head(2 .. f) +obj?.head(2 / a, arr, obj.obj) +obj?.head(2 < 0.5) +obj?.head(2 <= 0) +obj?.head(2 <= a) +obj?.head(2 <= f, f && false, add) +obj?.head(2 == nil) +obj?.head(2 == true) +obj?.head(2 ^ b) +obj?.head(2 in arr) +obj?.head(2 || false) +obj?.head(2) != a +obj?.head(2) * a +obj?.head(2) ** a +obj?.head(2) - f +obj?.head(2) == arr +obj?.head(2) > a * f +obj?.head(2) in obj?.head(nil) +obj?.head(2, 1, arr, b, add) in arr +obj?.head(2, arr, div) == a +obj?.head(2, obj, "a", div) <= b % a +obj?.head(2, obj, nil) .. b +obj?.head(2, s, b) in arr +obj?.head(["c", "a"]) +obj?.head(a != "a") +obj?.head(a != "b") +obj?.head(a != arr) +obj?.head(a != div) +obj?.head(a != false) +obj?.head(a != nil) +obj?.head(a != obj) +obj?.head(a != obj, arr) +obj?.head(a != ok) +obj?.head(a % b) +obj?.head(a * 0) +obj?.head(a * a, obj) +obj?.head(a ** 0) +obj?.head(a ** 0.5) +obj?.head(a ** a) +obj?.head(a ** b) +obj?.head(a ** f) +obj?.head(a + 0) +obj?.head(a + 0.5) +obj?.head(a + 1) +obj?.head(a + a) +obj?.head(a + b) +obj?.head(a - 0) +obj?.head(a - 0.5) +obj?.head(a - 1) +obj?.head(a - b) +obj?.head(a - f, ok) +obj?.head(a .. 1) +obj?.head(a .. a) +obj?.head(a .. f) +obj?.head(a / 0) +obj?.head(a / a) +obj?.head(a / b) +obj?.head(a < 0) +obj?.head(a < 0.5) +obj?.head(a < a) +obj?.head(a < a, a) +obj?.head(a < b) +obj?.head(a <= 0) +obj?.head(a <= b) +obj?.head(a == 0.5, string(2, true)) +obj?.head(a == add) +obj?.head(a == arr) +obj?.head(a == obj) +obj?.head(a == obj, a, obj in nil, s) +obj?.head(a == obj, obj.b) +obj?.head(a == ok) +obj?.head(a == s) +obj?.head(a > 0) +obj?.head(a > a) +obj?.head(a >= 0) +obj?.head(a >= 0, a) +obj?.head(a ^ 0.5) +obj?.head(a ^ 2, map(arr, obj)) +obj?.head(a ^ a) +obj?.head(a ^ b) +obj?.head(a ^ f) +obj?.head(a and false) +obj?.head(a in arr) +obj?.head(a || false) +obj?.head(a) +obj?.head(a) != s +obj?.head(a) * 2 ^ f +obj?.head(a) ** (b * 0) +obj?.head(a) ** b +obj?.head(a) + obj?.a +obj?.head(a) - 0.5 / f +obj?.head(a) / b +obj?.head(a) / obj?.head(2, s, arr) +obj?.head(a) < -a +obj?.head(a) <= a +obj?.head(a) == nil ? nil : nil +obj?.head(a) == one(arr, ok) +obj?.head(a) > f +obj?.head(a) > obj?.b +obj?.head(a) >= b - b +obj?.head(a) ^ a +obj?.head(a, "c", 1, div, nil) != ok +obj?.head(a, "c", arr) % a +obj?.head(a, 0, ok, add) .. b +obj?.head(a, 0.5, s, f) ^ a +obj?.head(a, a) +obj?.head(a, a, add) +obj?.head(a, all(obj, true)) +obj?.head(a, arr) +obj?.head(a, arr, obj) +obj?.head(a, b > b) +obj?.head(a, b) <= a +obj?.head(a, b) == 0 + f +obj?.head(a, div, div, ok) +obj?.head(a, f ** f, a != 0.5) +obj?.head(a, f, s) >= b +obj?.head(a, false or f) +obj?.head(a, false) != div +obj?.head(a, max(a, f, f)) +obj?.head(a, obj) +obj?.head(a, obj, f, 0) ^ obj?.a +obj?.head(a, obj.head(b)) +obj?.head(a, obj?.a) +obj?.head(a, ok, a) +obj?.head(a, ok, b, s, add) in arr +obj?.head(a, s) +obj?.head(a, s, a) +obj?.head(a, true, a) * b +obj?.head(abs(0)) +obj?.head(abs(0, b)) +obj?.head(abs(0, b, s, obj, 0)) +obj?.head(abs(0.5)) +obj?.head(abs(2)) +obj?.head(abs(a, s, a)) +obj?.head(abs(b)) +obj?.head(abs(f)) +obj?.head(abs(obj, a)) +obj?.head(abs(obj, b)) +obj?.head(abs(obj, true, a)) +obj?.head(abs(s, a)) +obj?.head(abs(s, a), add, f) +obj?.head(add != 0.5) +obj?.head(add != a) +obj?.head(add != add) +obj?.head(add != div) +obj?.head(add != false) +obj?.head(add != nil) +obj?.head(add != ok) +obj?.head(add != s) +obj?.head(add != true) +obj?.head(add && false) +obj?.head(add && true) +obj?.head(add == "a") +obj?.head(add == 0.5, b != nil) +obj?.head(add == a, s != obj) +obj?.head(add == arr) +obj?.head(add == b) +obj?.head(add == div) +obj?.head(add == f) +obj?.head(add == obj) +obj?.head(add == ok) +obj?.head(add == ok, obj) +obj?.head(add == s) +obj?.head(add and true) +obj?.head(add in arr) +obj?.head(add in arr, div) +obj?.head(add in nil) +obj?.head(add or false) +obj?.head(add || false) +obj?.head(add(0, 0)) +obj?.head(add(1, 0)) +obj?.head(add(1, 1)) +obj?.head(add(1, b)) +obj?.head(add(2, a)) +obj?.head(add(a, 0)) +obj?.head(add(b, 0)) +obj?.head(add(b, a)) +obj?.head(add(b, b)) +obj?.head(add) +obj?.head(add) != arr +obj?.head(add) != s +obj?.head(add) == arr +obj?.head(add) in arr +obj?.head(add, "a") == div +obj?.head(add, 0.5 ^ b) +obj?.head(add, 2 / f) +obj?.head(add, add) +obj?.head(add, add, nil) == ok +obj?.head(add, arr == add) +obj?.head(add, arr) != s +obj?.head(add, arr, s) != a +obj?.head(add, b) +obj?.head(add, div) +obj?.head(add, f) +obj?.head(add, f) != upper("c") +obj?.head(add, get(b, s)) +obj?.head(add, get(false, obj)) +obj?.head(add, get(ok, b)) +obj?.head(add, obj) +obj?.head(add, obj?.b) +obj?.head(add, ok) +obj?.head(add, s) +obj?.head(add, string(s)) +obj?.head(all("a", ok)) +obj?.head(all("b", ok)) +obj?.head(all(arr, false)) +obj?.head(all(arr, ok)) +obj?.head(all(obj, false)) +obj?.head(all(s, ok)) +obj?.head(all(s, true)) +obj?.head(any("c", ok)) +obj?.head(any(obj, false)) +obj?.head(any(obj, ok)) +obj?.head(any(obj, ok), 1 == arr, b == 0.5) +obj?.head(any(obj, true)) +obj?.head(any(s, ok), ok) +obj?.head(arr != "b") +obj?.head(arr != "c") +obj?.head(arr != "c", arr) +obj?.head(arr != 0.5) +obj?.head(arr != div) +obj?.head(arr != nil) +obj?.head(arr != obj) +obj?.head(arr != s) +obj?.head(arr && true, ok and obj) +obj?.head(arr == 0) +obj?.head(arr == 0.5) +obj?.head(arr == 1) +obj?.head(arr == a) +obj?.head(arr == add) +obj?.head(arr == arr) +obj?.head(arr == b) +obj?.head(arr == div) +obj?.head(arr == f) +obj?.head(arr == nil) +obj?.head(arr == obj) +obj?.head(arr == ok) +obj?.head(arr and false) +obj?.head(arr) +obj?.head(arr) != div(a, a) +obj?.head(arr) != s +obj?.head(arr) == a ? 1 : b +obj?.head(arr) == arr +obj?.head(arr) == obj.b +obj?.head(arr) == obj?.obj +obj?.head(arr) == ok +obj?.head(arr)[-1] +obj?.head(arr)[0.5 - a] +obj?.head(arr)[b] +obj?.head(arr, 0) == ok +obj?.head(arr, 1 - f, ok) +obj?.head(arr, a, a) +obj?.head(arr, a, false) == 2 ? obj : "b" +obj?.head(arr, add(0, 0), 0 - 0.5) +obj?.head(arr, add) +obj?.head(arr, all(obj, false), obj.a) +obj?.head(arr, all(s, ok)) +obj?.head(arr, arr) in arr +obj?.head(arr, b) +obj?.head(arr, b) != a +obj?.head(arr, b, div) != ok +obj?.head(arr, div(a, b)) +obj?.head(arr, div) +obj?.head(arr, filter(obj, false)) +obj?.head(arr, map(arr, obj)) +obj?.head(arr, max(ok)) +obj?.head(arr, none(obj, ok), any(arr, true)) +obj?.head(arr, obj) +obj?.head(arr, obj?.head(a, 0)) +obj?.head(arr, obj?.head(add, add, 0)) +obj?.head(arr, obj?.obj) +obj?.head(arr, ok) +obj?.head(arr, ok)[b] +obj?.head(arr, one(arr, ok)) +obj?.head(arr, s && true) +obj?.head(arr, s) +obj?.head(arr, string(div, 0)) +obj?.head(arr, true) == a +obj?.head(arr[0.5:0]) +obj?.head(arr[0]) +obj?.head(arr[a]) +obj?.head(arr[a], s) +obj?.head(arr[b]) +obj?.head(arr[f]) +obj?.head(b != "c") +obj?.head(b != 0) +obj?.head(b != 0.5) +obj?.head(b != a) +obj?.head(b != a, ok) +obj?.head(b != add) +obj?.head(b != arr) +obj?.head(b != b) +obj?.head(b != div) +obj?.head(b != nil) +obj?.head(b != obj) +obj?.head(b != obj?.obj) +obj?.head(b != ok) +obj?.head(b != s) +obj?.head(b != true) +obj?.head(b % 2, f) +obj?.head(b % a) +obj?.head(b % a, s in nil) +obj?.head(b && true) +obj?.head(b * 0.5) +obj?.head(b * a) +obj?.head(b * b) +obj?.head(b ** b) +obj?.head(b + 0) +obj?.head(b + 1) +obj?.head(b + a) +obj?.head(b + f) +obj?.head(b - 0) +obj?.head(b - 1) +obj?.head(b - a) +obj?.head(b - b) +obj?.head(b - f) +obj?.head(b .. 0.5) +obj?.head(b .. 2) +obj?.head(b .. a) +obj?.head(b / 0) +obj?.head(b / f) +obj?.head(b < 0.5) +obj?.head(b < 2) +obj?.head(b < a) +obj?.head(b < a, arr) +obj?.head(b < f) +obj?.head(b <= 0) +obj?.head(b <= 1) +obj?.head(b <= b) +obj?.head(b == "b") +obj?.head(b == "c") +obj?.head(b == 0) +obj?.head(b == 0.5) +obj?.head(b == arr) +obj?.head(b == div) != ok +obj?.head(b == obj) +obj?.head(b == ok) +obj?.head(b > f) +obj?.head(b >= 0) +obj?.head(b >= 0.5) +obj?.head(b >= 2) +obj?.head(b >= b) +obj?.head(b >= f) +obj?.head(b ^ 0) +obj?.head(b ^ b) +obj?.head(b ^ f) +obj?.head(b and false) +obj?.head(b and true) +obj?.head(b in nil) +obj?.head(b or true) +obj?.head(b || false) +obj?.head(b) +obj?.head(b) != 1 == ok +obj?.head(b) % obj?.head(obj, div).a +obj?.head(b) + 0.5 - b +obj?.head(b) + b +obj?.head(b) .. a +obj?.head(b) / a +obj?.head(b) <= a +obj?.head(b) <= f +obj?.head(b) == -f +obj?.head(b) == b +obj?.head(b) == f +obj?.head(b) > 0 * 2 +obj?.head(b) >= a + b +obj?.head(b, "a") .. b +obj?.head(b, 0, b) > b +obj?.head(b, 1 < f) +obj?.head(b, 1 > b) +obj?.head(b, add(b, 1)) +obj?.head(b, add) +obj?.head(b, arr) - f +obj?.head(b, arr) == div +obj?.head(b, arr) == s +obj?.head(b, arr) ^ b +obj?.head(b, b > 1) +obj?.head(b, b) +obj?.head(b, b) ^ b +obj?.head(b, b, b - a) +obj?.head(b, div != ok) +obj?.head(b, div) <= 0 ^ f +obj?.head(b, f) +obj?.head(b, f, a and false) +obj?.head(b, f, div) <= f +obj?.head(b, f, f) < obj?.b +obj?.head(b, false, nil) / (0.5 - f) +obj?.head(b, first(nil)) +obj?.head(b, get(nil, 0)) +obj?.head(b, get(s, a)) +obj?.head(b, max(arr)) +obj?.head(b, obj) +obj?.head(b, obj) ** f +obj?.head(b, obj, ok) .. 0 + a +obj?.head(b, obj.a) +obj?.head(b, obj.fn(b)) +obj?.head(b, obj?.obj) +obj?.head(b, ok && add) +obj?.head(b, ok ? b : 0) +obj?.head(b, ok, 0.5) != b +obj?.head(b, s) +obj?.head(b, trim(s), b) +obj?.head(count("a", ok)) +obj?.head(count("b", ok)) +obj?.head(count("c", ok)) +obj?.head(count(arr, ok)) +obj?.head(count(arr, true)) +obj?.head(count(obj, false)) +obj?.head(count(obj, ok)) +obj?.head(count(obj, true)) +obj?.head(count(s, false)) +obj?.head(count(s, ok)) +obj?.head(count(s, true), div, map("c", add)) +obj?.head(div != "c") +obj?.head(div != 2, obj) +obj?.head(div != a) +obj?.head(div != f) +obj?.head(div != f, div) +obj?.head(div != s) +obj?.head(div && false) +obj?.head(div == "b", arr) +obj?.head(div == 0) +obj?.head(div == 2) +obj?.head(div == a) +obj?.head(div == arr) +obj?.head(div == arr, arr) +obj?.head(div == arr, ok) +obj?.head(div == div) +obj?.head(div == f) +obj?.head(div == nil) +obj?.head(div == obj) +obj?.head(div == ok) +obj?.head(div in arr) +obj?.head(div or false) +obj?.head(div || false) +obj?.head(div(0, 1)) +obj?.head(div(0, 2)) +obj?.head(div(2, a)) +obj?.head(div(a, 1)) +obj?.head(div(a, 2), b) +obj?.head(div(a, a)) +obj?.head(div(a, b)) +obj?.head(div(b, 1)) +obj?.head(div(b, a)) +obj?.head(div(b, b)) +obj?.head(div) +obj?.head(div) != add +obj?.head(div) != arr +obj?.head(div) != f +obj?.head(div) != s +obj?.head(div) == obj +obj?.head(div, 0, ok) != add +obj?.head(div, 0.5 .. f) +obj?.head(div, a == f) +obj?.head(div, a) +obj?.head(div, add == nil, get(0, arr)) +obj?.head(div, add) +obj?.head(div, arr) +obj?.head(div, arr, ok) +obj?.head(div, b .. 0) +obj?.head(div, b) +obj?.head(div, b, arr) != arr +obj?.head(div, div) +obj?.head(div, f) +obj?.head(div, f, ok) != f ** f +obj?.head(div, false && "b") +obj?.head(div, get(b, b)) +obj?.head(div, get(nil, div, nil, ok)) +obj?.head(div, nil) != s +obj?.head(div, now(f, ok, ok, a), f) +obj?.head(div, now(ok)) +obj?.head(div, obj) +obj?.head(div, obj.a, s != 0.5) +obj?.head(div, obj.head(f)) +obj?.head(div, obj?.a) +obj?.head(div, ok) +obj?.head(div, s) +obj?.head(div, s) == ok ? f : a +obj?.head(div, s, string(ok)) +obj?.head(f != "c") +obj?.head(f != 0) +obj?.head(f != 2) +obj?.head(f != any(obj, ok)) +obj?.head(f != arr) +obj?.head(f != b) +obj?.head(f != div) +obj?.head(f != f, ok) +obj?.head(f != false) +obj?.head(f != obj) +obj?.head(f != s, b or true) +obj?.head(f && false) +obj?.head(f * 0) +obj?.head(f * 0.5) +obj?.head(f * 1) +obj?.head(f * 2) +obj?.head(f * a) +obj?.head(f * f) +obj?.head(f ** 0) +obj?.head(f ** 2) +obj?.head(f ** b) +obj?.head(f ** f) +obj?.head(f + 0.5) +obj?.head(f + 1) +obj?.head(f + f) +obj?.head(f - 0) +obj?.head(f - 0.5) +obj?.head(f - 1) +obj?.head(f - 2) +obj?.head(f - b) +obj?.head(f .. a) +obj?.head(f .. b) +obj?.head(f .. f) +obj?.head(f / 0) +obj?.head(f / 2) +obj?.head(f / a) +obj?.head(f / b) +obj?.head(f < a) +obj?.head(f < b) +obj?.head(f < f) +obj?.head(f <= 0) +obj?.head(f <= a) +obj?.head(f <= a, a) +obj?.head(f <= f) +obj?.head(f == add) +obj?.head(f == arr) +obj?.head(f == f) +obj?.head(f == obj) +obj?.head(f == ok) +obj?.head(f == s) +obj?.head(f == true, obj != false) +obj?.head(f > b) +obj?.head(f >= 0) +obj?.head(f >= 0.5) +obj?.head(f >= b) +obj?.head(f >= f) +obj?.head(f ^ 2) +obj?.head(f ^ a) +obj?.head(f in arr) +obj?.head(f in nil) +obj?.head(f or false) +obj?.head(f or true) +obj?.head(f) +obj?.head(f) * b +obj?.head(f) ** -f +obj?.head(f) + obj?.a +obj?.head(f) - b +obj?.head(f) / a +obj?.head(f) <= a +obj?.head(f) == 0 ^ 0.5 +obj?.head(f) == b != true +obj?.head(f) == f +obj?.head(f) > 1 + 1 +obj?.head(f) > a +obj?.head(f) >= b +obj?.head(f) >= b ^ b +obj?.head(f) in arr +obj?.head(f, 0) <= a - f +obj?.head(f, 2, arr, false, a) > a +obj?.head(f, a) +obj?.head(f, add) +obj?.head(f, add, f) < add(a, a) +obj?.head(f, add, obj) - a +obj?.head(f, arr, 0.5, b) + f +obj?.head(f, arr, f) + f +obj?.head(f, b != "a") +obj?.head(f, b, s, b) ^ obj.a +obj?.head(f, div == arr) +obj?.head(f, div) +obj?.head(f, div, f) ** b +obj?.head(f, f * b) +obj?.head(f, f) +obj?.head(f, f) + -b +obj?.head(f, f, obj) != f +obj?.head(f, f, ok, arr) <= f + 0 +obj?.head(f, get(0.5, arr), map(arr, nil)) +obj?.head(f, get(ok, add)) +obj?.head(f, nil) - a +obj?.head(f, obj != arr) +obj?.head(f, obj != b) +obj?.head(f, obj) +obj?.head(f, obj?.head(b, arr, "c"), b) +obj?.head(f, ok ? add : b) +obj?.head(f, ok ? s : 0) +obj?.head(f, ok and add, string(add)) +obj?.head(f, ok) +obj?.head(f, s) +obj?.head(f, true and f) +obj?.head(f, true || a) +obj?.head(false != a) +obj?.head(false != f) +obj?.head(false != false) +obj?.head(false != ok) +obj?.head(false != s) +obj?.head(false != s, upper(0, "b"), obj) +obj?.head(false && a, a) +obj?.head(false && add) +obj?.head(false && b) +obj?.head(false && obj) +obj?.head(false == obj) +obj?.head(false == s) +obj?.head(false ? "c" : false) +obj?.head(false ? a : 0, obj.fn(2)) +obj?.head(false ? a : add) +obj?.head(false ? a : false) +obj?.head(false ? add : ok, a ^ b) +obj?.head(false ? arr : nil) +obj?.head(false ? nil : 0.5) +obj?.head(false ? obj : s, obj?.head("c")) +obj?.head(false ? s : add) +obj?.head(false ? s : f, div) +obj?.head(false and "a", b) +obj?.head(false and "b") +obj?.head(false and 0.5) +obj?.head(false and a) +obj?.head(false and add) +obj?.head(false and arr) +obj?.head(false and obj) +obj?.head(false or add) +obj?.head(false or arr) +obj?.head(false or b) +obj?.head(false or f) +obj?.head(false or true) +obj?.head(false || add, arr != "a") +obj?.head(false || arr) +obj?.head(false || b) +obj?.head(false || ok) +obj?.head(false) == obj +obj?.head(false) ? 0 % 1 : obj.obj +obj?.head(false) in arr +obj?.head(false, 0, b) == s + "a" +obj?.head(false, 0.5, div) || obj.head(add, obj) +obj?.head(false, 1) || b > 2 +obj?.head(false, b) == b +obj?.head(false, b, "a") || obj?.a +obj?.head(false, obj) in arr +obj?.head(filter(arr, false)) +obj?.head(filter(arr, ok)) +obj?.head(filter(arr, true)) +obj?.head(filter(s, ok)) +obj?.head(filter(s, true)) +obj?.head(first(0)) +obj?.head(first(0.5, 1, arr, obj, arr)) +obj?.head(first(a), map(arr, add)) +obj?.head(first(a, 0.5)) +obj?.head(first(a, div)) +obj?.head(first(add)) +obj?.head(first(b, div)) +obj?.head(first(b, false, a)) +obj?.head(first(b, nil)) +obj?.head(first(div)) +obj?.head(first(f)) +obj?.head(first(f))?.b +obj?.head(first(f), f) +obj?.head(first(f, a), true != nil) +obj?.head(first(false)) +obj?.head(first(false, nil), a != f)?.a +obj?.head(first(false, ok)) +obj?.head(first(nil, nil)) +obj?.head(first(obj, 0), b * b) +obj?.head(first(ok)) +obj?.head(first(ok, arr)) +obj?.head(first(s)) +obj?.head(first(s, b)) +obj?.head(first(s, s), abs(0.5)) +obj?.head(first(true, div, 0)) +obj?.head(float(0)) +obj?.head(float(0.5)) +obj?.head(float(2)) +obj?.head(float(b)) +obj?.head(float(b, 0.5)) +obj?.head(float(f)) +obj?.head(float(f, div, f)) +obj?.head(get("a", "b"))?.b +obj?.head(get("a", nil)) +obj?.head(get("a", nil), f) +obj?.head(get("a", ok)) +obj?.head(get("b", a)) +obj?.head(get("b", add)) +obj?.head(get("b", b)) +obj?.head(get("b", div)) +obj?.head(get("b", false)) +obj?.head(get("c", arr), a) +obj?.head(get(0, 0)) +obj?.head(get(0, 0.5)) +obj?.head(get(0, a)) +obj?.head(get(0, add)) +obj?.head(get(0, arr)) +obj?.head(get(0, b)) +obj?.head(get(0, b), add) +obj?.head(get(0, f)) +obj?.head(get(0, f), add) +obj?.head(get(0, nil)) +obj?.head(get(0, obj))?.b +obj?.head(get(0, ok)) +obj?.head(get(0, ok)?.b) +obj?.head(get(0.5), get(ok, false)) +obj?.head(get(0.5, 0.5)) +obj?.head(get(0.5, b)) +obj?.head(get(0.5, false)) +obj?.head(get(0.5, nil)) +obj?.head(get(0.5, obj)) +obj?.head(get(0.5, ok)) +obj?.head(get(0.5, s)) +obj?.head(get(0.5, true)) +obj?.head(get(1, 0)) +obj?.head(get(1, a)) +obj?.head(get(1, add)) +obj?.head(get(1, b)) +obj?.head(get(1, nil)) +obj?.head(get(1, obj)) +obj?.head(get(1, ok)) +obj?.head(get(1, s)) +obj?.head(get(1, s), obj.head(nil), div) +obj?.head(get(2)) +obj?.head(get(2, 0)) +obj?.head(get(2, a)) +obj?.head(get(2, add)) +obj?.head(get(2, div)) +obj?.head(get(a)) +obj?.head(get(a), ok) +obj?.head(get(a, 0)) +obj?.head(get(a, 2)) +obj?.head(get(a, a)) +obj?.head(get(a, b)) +obj?.head(get(a, b))?.a +obj?.head(get(a, div)) +obj?.head(get(a, f)) +obj?.head(get(a, false)) +obj?.head(get(a, obj)) +obj?.head(get(a, obj), b in nil) +obj?.head(get(a, s)) +obj?.head(get(add, 0)) +obj?.head(get(add, 2)) +obj?.head(get(add, arr)) +obj?.head(get(add, b)) +obj?.head(get(add, div)) +obj?.head(get(add, f)) +obj?.head(get(add, false)) +obj?.head(get(add, nil)) +obj?.head(get(add, ok)) +obj?.head(get(add, s)) +obj?.head(get(add, true)) +obj?.head(get(arr)) +obj?.head(get(arr, 0.5)) +obj?.head(get(arr, a)) +obj?.head(get(arr, arr)) +obj?.head(get(arr, div)) +obj?.head(get(arr, false)) +obj?.head(get(arr, nil)) +obj?.head(get(arr, s)) +obj?.head(get(b)) +obj?.head(get(b, 0.5)) +obj?.head(get(b, 1), add) +obj?.head(get(b, 2)) +obj?.head(get(b, a)) +obj?.head(get(b, arr)) +obj?.head(get(b, b)) +obj?.head(get(b, b), obj) +obj?.head(get(b, div), obj.obj) +obj?.head(get(b, nil)) +obj?.head(get(b, obj)) +obj?.head(get(b, ok)) +obj?.head(get(div, 0)) +obj?.head(get(div, 0.5)) +obj?.head(get(div, a)) +obj?.head(get(div, a, nil), ok || div) +obj?.head(get(div, add)) +obj?.head(get(div, b)) +obj?.head(get(div, div)) +obj?.head(get(div, f)) +obj?.head(get(div, nil)) +obj?.head(get(div, obj)) +obj?.head(get(div, s)) +obj?.head(get(div, s), f == nil) +obj?.head(get(div, true)) +obj?.head(get(f, 0)) +obj?.head(get(f, 0.5)) +obj?.head(get(f, 1)) +obj?.head(get(f, 2)) +obj?.head(get(f, a))?.a +obj?.head(get(f, add)) +obj?.head(get(f, b), toBase64("c", ok, f)) +obj?.head(get(f, f)) +obj?.head(get(f, false)) +obj?.head(get(f, nil)) +obj?.head(get(f, ok)) +obj?.head(get(false, 0)) +obj?.head(get(false, 0)?.a) +obj?.head(get(false, 0.5), s == div) +obj?.head(get(false, div)) +obj?.head(get(false, nil)) +obj?.head(get(false, ok)) +obj?.head(get(false, s)) +obj?.head(get(nil)) +obj?.head(get(nil, add)) +obj?.head(get(nil, arr)) +obj?.head(get(nil, arr, s)) +obj?.head(get(nil, b), obj?.fn(b)) +obj?.head(get(nil, div)) +obj?.head(get(nil, nil)) +obj?.head(get(nil, nil), ok) +obj?.head(get(nil, ok)) +obj?.head(get(nil, ok), map("c", add)) +obj?.head(get(nil, ok), ok) +obj?.head(get(nil, s)) +obj?.head(get(obj)?.fn(ok)) +obj?.head(get(obj, 0)) +obj?.head(get(obj, 0.5)) +obj?.head(get(obj, 2)) +obj?.head(get(obj, a)) +obj?.head(get(obj, add)) +obj?.head(get(obj, arr)) +obj?.head(get(obj, b)) +obj?.head(get(obj, obj)) +obj?.head(get(obj, s)) +obj?.head(get(obj, s)?.obj?.obj) +obj?.head(get(obj, s, arr)) +obj?.head(get(ok)) +obj?.head(get(ok, a)) +obj?.head(get(ok, add)) +obj?.head(get(ok, arr)) +obj?.head(get(ok, b)) +obj?.head(get(ok, div)) +obj?.head(get(ok, nil)) +obj?.head(get(ok, nil), false and add) +obj?.head(get(ok, obj)) +obj?.head(get(ok, obj))?.b +obj?.head(get(ok, obj), s) +obj?.head(get(ok, s)) +obj?.head(get(ok, true)) +obj?.head(get(s)) +obj?.head(get(s), f == a) +obj?.head(get(s)?.a) +obj?.head(get(s, 1)) +obj?.head(get(s, 2), add) +obj?.head(get(s, a)) +obj?.head(get(s, a, true)) +obj?.head(get(s, add)) +obj?.head(get(s, arr)) +obj?.head(get(s, arr), get(arr, arr)) +obj?.head(get(s, b)) +obj?.head(get(s, div)) +obj?.head(get(s, div), a, a) +obj?.head(get(s, f)) +obj?.head(get(s, nil)) +obj?.head(get(s, obj))?.b +obj?.head(get(s, ok)) +obj?.head(get(s, ok))?.a +obj?.head(get(s, s)) +obj?.head(get(s, true)) +obj?.head(get(s, true), obj) +obj?.head(get(true, 0.5), arr) +obj?.head(get(true, a)) +obj?.head(get(true, add)) +obj?.head(get(true, div)) +obj?.head(get(true, div), any("b", false)) +obj?.head(get(true, f)) +obj?.head(get(true, false)) +obj?.head(get(true, s)) +obj?.head(int("b", a)) +obj?.head(int(2)) +obj?.head(int(a)) +obj?.head(int(b)) +obj?.head(int(f)) +obj?.head(int(false, s, false, a)) +obj?.head(last(0)) +obj?.head(last(0.5)) +obj?.head(last(0.5, add)) +obj?.head(last(0.5, b, f, "b")) +obj?.head(last(1, true, a, s)) +obj?.head(last(a)) +obj?.head(last(a, false, f, "a")) +obj?.head(last(add)) +obj?.head(last(arr, arr)) +obj?.head(last(b)) +obj?.head(last(b, add, ok, 2)) +obj?.head(last(div)) +obj?.head(last(div, b)) +obj?.head(last(f)) +obj?.head(last(f, arr, arr)) +obj?.head(last(obj)) +obj?.head(last(obj, "c", a, ok)) +obj?.head(last(ok)) +obj?.head(last(ok, ok)) +obj?.head(last(s)) +obj?.head(len("a")) +obj?.head(len(add, "a")) +obj?.head(len(arr)) +obj?.head(len(arr), arr) +obj?.head(len(false, div, obj)) +obj?.head(len(obj, "c")) +obj?.head(lower("a")) +obj?.head(lower("b")) +obj?.head(lower(arr, s)) +obj?.head(lower(false, true, s)) +obj?.head(lower(s)) +obj?.head(map("a", "a")) +obj?.head(map("a", "b")) +obj?.head(map("a", 0)) +obj?.head(map("a", 2)) +obj?.head(map("a", a), obj.head(a)) +obj?.head(map("a", add), s, get(arr, b)) +obj?.head(map("a", arr)) +obj?.head(map("a", div)) +obj?.head(map("a", f)) +obj?.head(map("b", add)) +obj?.head(map("b", f)) +obj?.head(map("b", nil)) +obj?.head(map("b", ok), add) +obj?.head(map("c", 0.5)) +obj?.head(map("c", div), b) +obj?.head(map("c", nil), get(s)) +obj?.head(map("c", obj)) +obj?.head(map("c", s)) +obj?.head(map(arr, "a")) +obj?.head(map(arr, "b")) +obj?.head(map(arr, 0)) +obj?.head(map(arr, 0.5)) +obj?.head(map(arr, arr)) +obj?.head(map(arr, b)) +obj?.head(map(arr, div)) +obj?.head(map(arr, f)) +obj?.head(map(arr, false)) +obj?.head(map(arr, false), f) +obj?.head(map(arr, nil)) +obj?.head(map(arr, obj)) +obj?.head(map(arr, ok)) +obj?.head(map(arr, s)) +obj?.head(map(arr, true)) +obj?.head(map(obj, 0.5)) +obj?.head(map(obj, 1), add == f) +obj?.head(map(obj, add)) +obj?.head(map(obj, arr)) +obj?.head(map(obj, b)) +obj?.head(map(obj, b), get(nil, ok), arr) +obj?.head(map(obj, b), obj) +obj?.head(map(obj, div)) +obj?.head(map(obj, f)) +obj?.head(map(obj, nil), ok || true) +obj?.head(map(obj, obj)) +obj?.head(map(obj, obj), obj.b) +obj?.head(map(obj, ok)) +obj?.head(map(obj, s)) +obj?.head(map(obj.obj, a or false)) +obj?.head(map(s, #)) +obj?.head(map(s, 0)) +obj?.head(map(s, 0.5)) +obj?.head(map(s, 1)) +obj?.head(map(s, 2), arr) +obj?.head(map(s, a)) +obj?.head(map(s, add)) +obj?.head(map(s, arr)) +obj?.head(map(s, div)) +obj?.head(map(s, f)) +obj?.head(map(s, nil), add(a, a)) +obj?.head(map(s, obj), f, b + 2) +obj?.head(map(s, ok)) +obj?.head(map(s, ok), 0 ** f) +obj?.head(map(s, s)) +obj?.head(max("a")) +obj?.head(max("b")) +obj?.head(max("c")) +obj?.head(max(1, b)) +obj?.head(max(b, b)) +obj?.head(max(div)) +obj?.head(max(f != 0)) +obj?.head(max(false)) +obj?.head(max(get(ok, b))) +obj?.head(max(obj)?.obj) +obj?.head(max(ok)) +obj?.head(max(s)) +obj?.head(min("a")) +obj?.head(min("c"), arr) +obj?.head(min(0)) +obj?.head(min(a)) +obj?.head(min(add)) +obj?.head(min(arr)) +obj?.head(min(b)) +obj?.head(min(f)) +obj?.head(min(nil)) +obj?.head(min(nil, 1), 0 / f) +obj?.head(min(ok)) +obj?.head(min(ok), arr, f) +obj?.head(min(s, s), f) +obj?.head(nil != 0) +obj?.head(nil != 0.5) +obj?.head(nil != 1) +obj?.head(nil != 2) +obj?.head(nil != a) +obj?.head(nil != add, obj.fn(b)) +obj?.head(nil != arr) +obj?.head(nil != b, "b" != 0) +obj?.head(nil != false) +obj?.head(nil != nil) +obj?.head(nil != obj) +obj?.head(nil != ok) +obj?.head(nil != true) +obj?.head(nil == "b") or add(a, 0) - obj.b +obj?.head(nil == "c" || add == f) +obj?.head(nil == arr) +obj?.head(nil == div) +obj?.head(nil == nil) +obj?.head(nil == obj) +obj?.head(nil == ok) +obj?.head(nil == s) +obj?.head(nil in arr) +obj?.head(nil || false) +obj?.head(nil || true) +obj?.head(nil) != add +obj?.head(nil) != arr +obj?.head(nil) != div +obj?.head(nil) != f +obj?.head(nil) == 2 + a +obj?.head(nil) == add +obj?.head(nil) == map(arr, "b") +obj?.head(nil) == obj.obj +obj?.head(nil) in obj +obj?.head(nil) in obj?.obj +obj?.head(nil)?.a +obj?.head(nil)?.a.b +obj?.head(nil)?.a?.b +obj?.head(nil)?.b +obj?.head(nil)?.b.a +obj?.head(nil)?.b.obj +obj?.head(nil)?.b?.obj +obj?.head(nil)?.fn(obj.obj) +obj?.head(nil)?.fn(s, "b" != f) +obj?.head(nil)?.head(ok) +obj?.head(nil)?.obj +obj?.head(nil)?.obj?.a +obj?.head(nil)?.obj?.b +obj?.head(nil, "a")?.obj +obj?.head(nil, "b")?.b +obj?.head(nil, "b", obj)?.b +obj?.head(nil, "b", s)?.b +obj?.head(nil, "b", s, f)?.obj +obj?.head(nil, "c")?.obj +obj?.head(nil, "c", 0.5)?.obj +obj?.head(nil, "c", f)?.a +obj?.head(nil, 0)?.a +obj?.head(nil, 0)?.b +obj?.head(nil, 0)?.obj +obj?.head(nil, 0, b, s)?.a +obj?.head(nil, 0.5, 0, s)?.b +obj?.head(nil, 1)?.b +obj?.head(nil, 1)?.obj +obj?.head(nil, 1, false)?.a +obj?.head(nil, 1, nil)?.obj +obj?.head(nil, 2)?.b +obj?.head(nil, 2)?.obj +obj?.head(nil, 2, 0, nil)?.a +obj?.head(nil, a) != s ? add : obj?.b +obj?.head(nil, a) == s +obj?.head(nil, a)?.a +obj?.head(nil, a)?.obj +obj?.head(nil, a, 0.5, a)?.a +obj?.head(nil, a, 0.5, add, false)?.b +obj?.head(nil, a, add)?.a +obj?.head(nil, a, ok, nil)?.obj +obj?.head(nil, a, s)?.b +obj?.head(nil, add)?.a +obj?.head(nil, add)?.obj +obj?.head(nil, add, "b")?.obj +obj?.head(nil, add, b)?.obj.obj +obj?.head(nil, add, false)?.a +obj?.head(nil, add, false)?.b +obj?.head(nil, add, nil, add)?.obj +obj?.head(nil, arr)?.a +obj?.head(nil, arr)?.b +obj?.head(nil, arr)?.obj +obj?.head(nil, arr, "a")?.obj +obj?.head(nil, arr, "c")?.b +obj?.head(nil, arr, 1)?.b +obj?.head(nil, arr, s)?.a +obj?.head(nil, b)?.a +obj?.head(nil, b)?.b +obj?.head(nil, b)?.obj +obj?.head(nil, b, a, ok, ok)?.b +obj?.head(nil, b, add)?.a +obj?.head(nil, b, b)?.b +obj?.head(nil, b, false)?.a +obj?.head(nil, b, s)?.a +obj?.head(nil, div)?.a +obj?.head(nil, div)?.obj +obj?.head(nil, div, arr)?.b +obj?.head(nil, f)?.b +obj?.head(nil, f)?.obj +obj?.head(nil, f, add, add)?.b +obj?.head(nil, f, nil)?.a +obj?.head(nil, f, s)?.a +obj?.head(nil, false)?.a +obj?.head(nil, false)?.obj +obj?.head(nil, false, s)?.a +obj?.head(nil, nil)?.a +obj?.head(nil, nil, 0.5)?.obj +obj?.head(nil, nil, add)?.b +obj?.head(nil, nil, add, arr)?.obj +obj?.head(nil, nil, ok)?.obj +obj?.head(nil, obj) in obj +obj?.head(nil, obj)?.a +obj?.head(nil, obj)?.b +obj?.head(nil, obj)?.b.a +obj?.head(nil, obj)?.obj +obj?.head(nil, ok)?.a +obj?.head(nil, ok)?.b +obj?.head(nil, ok)?.obj +obj?.head(nil, ok, "b")?.b +obj?.head(nil, ok, 0.5)?.a +obj?.head(nil, ok, arr)?.b +obj?.head(nil, ok, div, arr, obj)?.obj +obj?.head(nil, ok, nil, ok)?.obj +obj?.head(nil, ok, s, 1, true)?.obj.a +obj?.head(nil, s)?.a +obj?.head(nil, s)?.obj +obj?.head(nil, s, 0.5)?.obj +obj?.head(nil, s, a)?.obj +obj?.head(nil, s, false, s)?.a +obj?.head(nil, s, s)?.b +obj?.head(nil, true)?.a +obj?.head(nil, true)?.head(f, arr) +obj?.head(nil, true)?.obj +obj?.head(none("b", true), s == f) +obj?.head(none("c", false)) +obj?.head(none("c", ok)) +obj?.head(none("c", true)) +obj?.head(none(arr, ok), get(nil, 1), now(div, "a", s, div, f), a) +obj?.head(none(obj, false)) +obj?.head(none(obj, ok)) +obj?.head(none(s, false)) +obj?.head(not false) +obj?.head(not ok) +obj?.head(not true) +obj?.head(now(0, s)) +obj?.head(now(0, s), f + b) +obj?.head(now(0.5), arr, obj.a) +obj?.head(now(1)) +obj?.head(now(a)) +obj?.head(now(a, a, a)) +obj?.head(now(arr)) +obj?.head(now(b, b)) +obj?.head(now(b, div, f)) +obj?.head(now(b, s)) +obj?.head(now(div)) +obj?.head(now(div, div, "b", obj, 1)) +obj?.head(now(f, add)) +obj?.head(now(false)) +obj?.head(now(nil)) +obj?.head(now(nil, obj)) +obj?.head(now(obj), 0 == 1) +obj?.head(now(obj, 0)) +obj?.head(now(ok)) +obj?.head(now(ok, arr)) +obj?.head(now(ok, b)) +obj?.head(now(ok, b, arr, nil)) +obj?.head(now(ok, f), true == 0.5) +obj?.head(now(ok, true, a)) +obj?.head(now(s)) +obj?.head(now(s, b, s), "a" startsWith s) +obj?.head(now(s, nil)) +obj?.head(now(true)) +obj?.head(now(true, "b", add)) +obj?.head(obj != "a") +obj?.head(obj != 0) +obj?.head(obj != 0.5) +obj?.head(obj != add) +obj?.head(obj != nil) +obj?.head(obj != s) +obj?.head(obj && true) +obj?.head(obj == 0.5) +obj?.head(obj == 1) +obj?.head(obj == a) +obj?.head(obj == div) +obj?.head(obj == f, now(1)) +obj?.head(obj == false) +obj?.head(obj == obj) +obj?.head(obj == ok) +obj?.head(obj and true, 2 .. b) +obj?.head(obj in arr) +obj?.head(obj in nil) +obj?.head(obj or true) +obj?.head(obj) +obj?.head(obj) != a ** 0.5 +obj?.head(obj) != a ? obj : s +obj?.head(obj) != div +obj?.head(obj) != map(arr, s) +obj?.head(obj) != ok +obj?.head(obj) != s +obj?.head(obj) == add +obj?.head(obj) == div +obj?.head(obj) == f +obj?.head(obj) == s +obj?.head(obj) in arr +obj?.head(obj).a +obj?.head(obj).b +obj?.head(obj).head(b) +obj?.head(obj).head(get(div, f)) +obj?.head(obj).obj +obj?.head(obj).obj.obj +obj?.head(obj).obj?.a +obj?.head(obj).obj?.b +obj?.head(obj)?.a +obj?.head(obj)?.b +obj?.head(obj)?.head(0 <= f) +obj?.head(obj)?.head(a) +obj?.head(obj)?.head(add) +obj?.head(obj)?.obj +obj?.head(obj)?.obj.obj +obj?.head(obj)[s] +obj?.head(obj, "a").b +obj?.head(obj, "a").obj +obj?.head(obj, "a")?.a +obj?.head(obj, "a")?.obj +obj?.head(obj, "a", arr, obj)?.head(obj == s) +obj?.head(obj, "b").a +obj?.head(obj, "b").b +obj?.head(obj, "b", nil).b +obj?.head(obj, "c").b +obj?.head(obj, "c")?.a +obj?.head(obj, "c")?.obj +obj?.head(obj, 0 > a) +obj?.head(obj, 0).a +obj?.head(obj, 0).b +obj?.head(obj, 0).obj +obj?.head(obj, 0)?.a +obj?.head(obj, 0)?.b +obj?.head(obj, 0, add).b +obj?.head(obj, 0.5).a +obj?.head(obj, 0.5).obj +obj?.head(obj, 0.5)[s] +obj?.head(obj, 0.5, div)?.b +obj?.head(obj, 0.5, nil).b +obj?.head(obj, 1).b +obj?.head(obj, 1, 0).obj +obj?.head(obj, 1, 0)?.head(add) +obj?.head(obj, 1, ok)?.b +obj?.head(obj, 2).a +obj?.head(obj, 2).obj +obj?.head(obj, 2)?.obj +obj?.head(obj, 2, true).a +obj?.head(obj, a <= a) +obj?.head(obj, a) +obj?.head(obj, a).a +obj?.head(obj, a).b +obj?.head(obj, a).obj +obj?.head(obj, a)?.a +obj?.head(obj, a)?.b +obj?.head(obj, a)?.obj +obj?.head(obj, a, "c").a +obj?.head(obj, a, 1, add, s)?.obj +obj?.head(obj, a, 2, obj).obj +obj?.head(obj, a, a).a +obj?.head(obj, a, add, "b").b +obj?.head(obj, a, b)?.b * b +obj?.head(obj, a, f, b, a)?.b +obj?.head(obj, a, obj, 0.5).obj?.b +obj?.head(obj, a, ok, 1).obj?.a +obj?.head(obj, a, ok, add).b +obj?.head(obj, a, s)?.obj +obj?.head(obj, a, s, ok).b +obj?.head(obj, a, true)?.b +obj?.head(obj, add == ok) +obj?.head(obj, add) +obj?.head(obj, add).b +obj?.head(obj, add).obj +obj?.head(obj, add)?.a +obj?.head(obj, add)?.b +obj?.head(obj, add)?.obj +obj?.head(obj, add, nil).b +obj?.head(obj, add, s).a +obj?.head(obj, arr).a +obj?.head(obj, arr).a == ok +obj?.head(obj, arr).b +obj?.head(obj, arr).obj +obj?.head(obj, arr)?.b +obj?.head(obj, arr)?.obj +obj?.head(obj, arr, 0).b +obj?.head(obj, arr, a, b, s)?.a +obj?.head(obj, arr, f).b +obj?.head(obj, arr, f)?.b +obj?.head(obj, arr, nil).a +obj?.head(obj, arr, nil).b +obj?.head(obj, b) +obj?.head(obj, b).obj +obj?.head(obj, b)?.a +obj?.head(obj, b)?.b +obj?.head(obj, b)?.obj +obj?.head(obj, b, "a")?.obj +obj?.head(obj, b, 0.5).b +obj?.head(obj, b, b).obj +obj?.head(obj, b, div)?.b +obj?.head(obj, b, f).obj +obj?.head(obj, b, false, s)?.b +obj?.head(obj, b, nil, arr, true).a +obj?.head(obj, b, obj)?.b +obj?.head(obj, b, obj)?.obj +obj?.head(obj, b, ok).obj +obj?.head(obj, b, s).obj +obj?.head(obj, div != a) +obj?.head(obj, div) +obj?.head(obj, div).a +obj?.head(obj, div).head(add) +obj?.head(obj, div).obj +obj?.head(obj, div)?.a +obj?.head(obj, div)?.b +obj?.head(obj, div)?.fn(-b) +obj?.head(obj, div, "b")?.a +obj?.head(obj, div, "b", 0, "b").obj +obj?.head(obj, div, 0).b +obj?.head(obj, div, 0)?.a +obj?.head(obj, div, 1, false, b).a +obj?.head(obj, div, f).obj +obj?.head(obj, div, nil).a +obj?.head(obj, div, nil).obj +obj?.head(obj, div, obj.b) +obj?.head(obj, div, ok).b +obj?.head(obj, div, ok, nil).a +obj?.head(obj, div, true, a)?.b +obj?.head(obj, f * b) +obj?.head(obj, f) +obj?.head(obj, f) != obj?.head(arr, div) +obj?.head(obj, f) == b +obj?.head(obj, f).b +obj?.head(obj, f).obj +obj?.head(obj, f)?.b +obj?.head(obj, f)?.obj +obj?.head(obj, f, a).a +obj?.head(obj, f, a, f).a +obj?.head(obj, f, div).obj +obj?.head(obj, f, f)?.b +obj?.head(obj, f, false, b).b +obj?.head(obj, f, obj).a +obj?.head(obj, f, obj)?.obj?.b +obj?.head(obj, f, ok, obj.a) +obj?.head(obj, f, true).a +obj?.head(obj, false).a +obj?.head(obj, false).b +obj?.head(obj, false)?.b +obj?.head(obj, false, obj)?.obj +obj?.head(obj, false, ok)?.obj +obj?.head(obj, filter(arr, ok), arr) +obj?.head(obj, first(0.5), f).obj +obj?.head(obj, get(0.5), 0.5 ^ a) +obj?.head(obj, get(a, obj)) +obj?.head(obj, get(add, add), add) +obj?.head(obj, get(div, 0)) +obj?.head(obj, nil).a +obj?.head(obj, nil).obj +obj?.head(obj, nil)?.b +obj?.head(obj, nil, 1, s, obj).b +obj?.head(obj, nil, a).b +obj?.head(obj, nil, add, obj).obj?.b +obj?.head(obj, nil, b, a)?.obj +obj?.head(obj, nil, f).obj +obj?.head(obj, obj) +obj?.head(obj, obj).a +obj?.head(obj, obj).head(add) +obj?.head(obj, obj)?.a +obj?.head(obj, obj)?.b +obj?.head(obj, obj)?.obj +obj?.head(obj, obj, 0)?.b +obj?.head(obj, obj, a, "a", a)?.b +obj?.head(obj, obj, arr).a +obj?.head(obj, obj, b)?.a +obj?.head(obj, obj, false, f, 1).obj +obj?.head(obj, obj, nil, true)?.obj +obj?.head(obj, obj.b) +obj?.head(obj, obj.fn(b)) +obj?.head(obj, obj?.head(f)).b +obj?.head(obj, obj?.obj) +obj?.head(obj, ok == arr)?.b +obj?.head(obj, ok) +obj?.head(obj, ok).obj +obj?.head(obj, ok)?.a +obj?.head(obj, ok)?.b +obj?.head(obj, ok)?.obj +obj?.head(obj, ok, 0.5).obj +obj?.head(obj, ok, a).b +obj?.head(obj, ok, a, "b")?.obj +obj?.head(obj, ok, a, div, 0.5).a +obj?.head(obj, ok, a, true)?.a +obj?.head(obj, ok, b).obj +obj?.head(obj, ok, f).obj +obj?.head(obj, ok, false, f, div)?.obj +obj?.head(obj, ok, nil)?.b +obj?.head(obj, ok, obj).a +obj?.head(obj, s) +obj?.head(obj, s).a +obj?.head(obj, s).obj +obj?.head(obj, s).obj.a +obj?.head(obj, s)?.head(get(b, a)?.obj) +obj?.head(obj, s, 0, 0)?.obj +obj?.head(obj, s, a, a, ok).b +obj?.head(obj, s, add) +obj?.head(obj, s, add, obj)?.a +obj?.head(obj, s, f, a, b)?.b +obj?.head(obj, s, nil, s)?.a +obj?.head(obj, s, s, a, 2).b +obj?.head(obj, s[2]) +obj?.head(obj, string(a)) +obj?.head(obj, true).a +obj?.head(obj, true)?.a +obj?.head(obj, true)?.b +obj?.head(obj, true, 1, arr)?.b +obj?.head(obj, true, div, obj)?.b +obj?.head(obj, true, nil).obj +obj?.head(obj.a) +obj?.head(obj.a, add) +obj?.head(obj.a, get(a, add)) +obj?.head(obj.b) +obj?.head(obj.b, get(a, 2)) +obj?.head(obj.b, obj.head(ok, 0, add, 0.5, add)) +obj?.head(obj.b, string("a")) +obj?.head(obj.fn(2)) +obj?.head(obj.fn(a)) +obj?.head(obj.head("c", "c"), map(obj, true)) +obj?.head(obj.head(0)) +obj?.head(obj.head(0, false, s)) +obj?.head(obj.head(0.5, true)) +obj?.head(obj.head(2)) +obj?.head(obj.head(add)) +obj?.head(obj.head(arr)) +obj?.head(obj.head(arr, add)) +obj?.head(obj.head(arr, div)) +obj?.head(obj.head(b)) +obj?.head(obj.head(b), b, 0 == add) +obj?.head(obj.head(b, 0.5, a)) +obj?.head(obj.head(div)) +obj?.head(obj.head(div, div)) +obj?.head(obj.head(f)) +obj?.head(obj.head(false, b, f, b, a)) +obj?.head(obj.head(obj)) +obj?.head(obj.head(ok)) +obj?.head(obj.head(ok, nil, f)) +obj?.head(obj.head(s, a, add, add, add)) +obj?.head(obj.head(s, ok)) +obj?.head(obj.head(true)) +obj?.head(obj.obj) +obj?.head(obj.obj).b +obj?.head(obj.obj)?.b +obj?.head(obj.obj, f) +obj?.head(obj.obj, get(add, 0)) +obj?.head(obj.obj, obj) +obj?.head(obj.obj, ok) +obj?.head(obj?.a) +obj?.head(obj?.a, div) +obj?.head(obj?.a, obj) +obj?.head(obj?.a, obj.a) +obj?.head(obj?.a, ok or false) +obj?.head(obj?.a, s) +obj?.head(obj?.b) +obj?.head(obj?.b, "c" <= s) +obj?.head(obj?.b, f) +obj?.head(obj?.b, filter(arr, ok)) +obj?.head(obj?.fn(a), b) +obj?.head(obj?.fn(b)) +obj?.head(obj?.head("a")) +obj?.head(obj?.head(0)) +obj?.head(obj?.head(0.5)) +obj?.head(obj?.head(1)) +obj?.head(obj?.head(a)) +obj?.head(obj?.head(a, arr)) +obj?.head(obj?.head(a, ok, obj, add)) +obj?.head(obj?.head(add)) +obj?.head(obj?.head(add, add)) +obj?.head(obj?.head(add, false)) +obj?.head(obj?.head(arr, nil)) +obj?.head(obj?.head(b)) +obj?.head(obj?.head(b, a)) +obj?.head(obj?.head(b, a, div)) +obj?.head(obj?.head(b, false)) +obj?.head(obj?.head(b, s)) +obj?.head(obj?.head(f, a, 1)) +obj?.head(obj?.head(false)) +obj?.head(obj?.head(false, "c")) +obj?.head(obj?.head(obj)) +obj?.head(obj?.head(obj)).obj +obj?.head(obj?.head(obj, 0)) +obj?.head(obj?.head(ok)) +obj?.head(obj?.head(ok), div) +obj?.head(obj?.head(ok, 0)) +obj?.head(obj?.head(ok, 0, add), obj?.a) +obj?.head(obj?.head(s)) +obj?.head(obj?.head(s, arr, 0.5)) +obj?.head(obj?.head(s, arr, true)) +obj?.head(obj?.head(s, nil, 0)) +obj?.head(obj?.head(s, true)) +obj?.head(obj?.obj) +obj?.head(obj?.obj).obj +obj?.head(obj?.obj)?.obj +obj?.head(obj?.obj, a) +obj?.head(obj?.obj, map(obj, ok)) +obj?.head(obj[nil]) +obj?.head(obj[s]) +obj?.head(ok != "c", b) +obj?.head(ok != a) +obj?.head(ok != arr) +obj?.head(ok != b) +obj?.head(ok != div) +obj?.head(ok != f) +obj?.head(ok != false) +obj?.head(ok != obj) +obj?.head(ok != s, get(s, 1), add) +obj?.head(ok && "a") +obj?.head(ok && 0) +obj?.head(ok && 1 % b) +obj?.head(ok && a) +obj?.head(ok && a, obj != f) +obj?.head(ok && arr) +obj?.head(ok && f) +obj?.head(ok && obj) +obj?.head(ok && ok) +obj?.head(ok == 0) +obj?.head(ok == 0, f) +obj?.head(ok == 1, add == obj) +obj?.head(ok == 2) +obj?.head(ok == a) +obj?.head(ok == b) +obj?.head(ok == div) +obj?.head(ok == div, f) +obj?.head(ok == obj) +obj?.head(ok == ok) +obj?.head(ok == s) +obj?.head(ok == true) +obj?.head(ok ? "b" : add) +obj?.head(ok ? "c" : "b") +obj?.head(ok ? 1 : arr) +obj?.head(ok ? 1 : div.b) +obj?.head(ok ? a : "c") +obj?.head(ok ? a : f) +obj?.head(ok ? a : obj, add) +obj?.head(ok ? add : div) +obj?.head(ok ? add : obj, s, obj.head(a, obj)) +obj?.head(ok ? arr : div) +obj?.head(ok ? arr : nil) +obj?.head(ok ? b : 0.5) +obj?.head(ok ? b : b) +obj?.head(ok ? b : nil && div) +obj?.head(ok ? div : 0.5) +obj?.head(ok ? div : arr) +obj?.head(ok ? div : nil) +obj?.head(ok ? f : 1) +obj?.head(ok ? false : ok) +obj?.head(ok ? nil : 0.5) +obj?.head(ok ? nil : arr) +obj?.head(ok ? nil : b, obj?.b) +obj?.head(ok ? nil : f, arr) +obj?.head(ok ? nil : ok) +obj?.head(ok ? obj : add) +obj?.head(ok ? obj : b) +obj?.head(ok ? obj : s) +obj?.head(ok ? ok : arr) +obj?.head(ok ? true : add) +obj?.head(ok and "a") +obj?.head(ok and a, last(0.5)) +obj?.head(ok and add) +obj?.head(ok and b) +obj?.head(ok and div, get(0, arr)) +obj?.head(ok and f) +obj?.head(ok and nil, f)?.obj +obj?.head(ok and obj) +obj?.head(ok and obj).obj +obj?.head(ok and ok) +obj?.head(ok and s) +obj?.head(ok in arr) +obj?.head(ok or "a") +obj?.head(ok or "c") +obj?.head(ok or 2) +obj?.head(ok or a) +obj?.head(ok or add) +obj?.head(ok or arr) +obj?.head(ok or div) +obj?.head(ok or get(div >= b, arr?.head("b"))) +obj?.head(ok or nil) +obj?.head(ok or obj) +obj?.head(ok or true, a) +obj?.head(ok || 0) +obj?.head(ok || 0, f) +obj?.head(ok || a) +obj?.head(ok || add) +obj?.head(ok || arr.obj in map("b" / a, min(f)).obj) +obj?.head(ok || b || add.fn(0.5, obj)) +obj?.head(ok || div) +obj?.head(ok || div, 1 != add) +obj?.head(ok || s) +obj?.head(ok) +obj?.head(ok) != a +obj?.head(ok) != f +obj?.head(ok) != obj?.a +obj?.head(ok) != obj?.b +obj?.head(ok) && not ok +obj?.head(ok) && ok +obj?.head(ok) == a +obj?.head(ok) == obj.obj +obj?.head(ok) == ok +obj?.head(ok) ? s : arr +obj?.head(ok) and 0 == nil +obj?.head(ok) and 0.5 != a +obj?.head(ok) or ok +obj?.head(ok) || obj?.a?.head(b <= a ? s : a / a || lastIndexOf(2) % (arr matches 0.5)) +obj?.head(ok, "a" contains "b") +obj?.head(ok, 2) == keys(obj) +obj?.head(ok, a) +obj?.head(ok, add != a) +obj?.head(ok, arr) +obj?.head(ok, b) +obj?.head(ok, div) +obj?.head(ok, f) +obj?.head(ok, f) == s +obj?.head(ok, f, b) +obj?.head(ok, false or ok) +obj?.head(ok, false) or ok +obj?.head(ok, map(arr, false)) +obj?.head(ok, none(s, false)) +obj?.head(ok, not ok) +obj?.head(ok, obj) +obj?.head(ok, obj) != add ? b : nil +obj?.head(ok, obj.head(s), obj) +obj?.head(ok, obj?.obj) +obj?.head(ok, ok or 0.5) +obj?.head(ok, s) +obj?.head(ok, s, ok, 0.5) == obj +obj?.head(ok, s, s) == a +obj?.head(one("a", ok)) +obj?.head(one("b", true)) +obj?.head(one(arr, false)) +obj?.head(one(arr, ok)) +obj?.head(one(arr, ok), ok) +obj?.head(one(arr, true)) +obj?.head(one(obj, false)) +obj?.head(one(obj, ok)) +obj?.head(one(obj, true)) +obj?.head(one(s, # < #)) +obj?.head(one(s, ok)) +obj?.head(one(s, true)) +obj?.head(s != "a", f) +obj?.head(s != "b") +obj?.head(s != 0) +obj?.head(s != 1) +obj?.head(s != 2) +obj?.head(s != 2, obj) +obj?.head(s != a) +obj?.head(s != add) +obj?.head(s != arr) +obj?.head(s != b) +obj?.head(s != div) +obj?.head(s != f) +obj?.head(s != nil) +obj?.head(s != obj) +obj?.head(s != ok) +obj?.head(s + s) +obj?.head(s <= "b") +obj?.head(s <= s) +obj?.head(s == "b") +obj?.head(s == "c") +obj?.head(s == 0) +obj?.head(s == 2) +obj?.head(s == a) +obj?.head(s == add) +obj?.head(s == arr) +obj?.head(s == f) +obj?.head(s == false) +obj?.head(s == obj) +obj?.head(s == ok) +obj?.head(s == s) +obj?.head(s == true) +obj?.head(s > s) +obj?.head(s >= s) +obj?.head(s and false) +obj?.head(s contains "a") +obj?.head(s contains s, add != 0.5) +obj?.head(s endsWith "a") +obj?.head(s endsWith s) +obj?.head(s in arr) +obj?.head(s in obj) +obj?.head(s matches s, ok or ok) +obj?.head(s or false) +obj?.head(s startsWith "b") +obj?.head(s startsWith s) +obj?.head(s) +obj?.head(s) != div +obj?.head(s) != obj.a +obj?.head(s) == arr +obj?.head(s) == ok +obj?.head(s) endsWith string(0.5) +obj?.head(s)[a] +obj?.head(s, "a") != s +obj?.head(s, "b" == a) +obj?.head(s, "b", 0.5) == div +obj?.head(s, a % a) +obj?.head(s, a) +obj?.head(s, add) +obj?.head(s, add, nil, arr) != f +obj?.head(s, arr) +obj?.head(s, arr) == f +obj?.head(s, arr) == ok +obj?.head(s, arr, div) +obj?.head(s, b == add) +obj?.head(s, div) +obj?.head(s, f) +obj?.head(s, get(0, div)) +obj?.head(s, get(f, obj)) +obj?.head(s, nil) != ok +obj?.head(s, nil, add)[2 + 0] +obj?.head(s, nil, ok, f)[a] +obj?.head(s, none(s, ok)) +obj?.head(s, now(0.5, f, ok)) +obj?.head(s, obj.obj) +obj?.head(s, ok in nil) +obj?.head(s, ok) +obj?.head(s, ok) in obj +obj?.head(s, ok, ok) != f == nil +obj?.head(s, s) +obj?.head(s[0.5]) +obj?.head(s[a]) +obj?.head(s[b]) +obj?.head(s[f]) +obj?.head(string("a")) +obj?.head(string("a", b)) +obj?.head(string("c")) +obj?.head(string(1, nil)) +obj?.head(string(2)) +obj?.head(string(a)) +obj?.head(string(a), 0 or false) +obj?.head(string(arr)) +obj?.head(string(arr), arr) +obj?.head(string(arr), b == 2) +obj?.head(string(div)) +obj?.head(string(div, f)) +obj?.head(string(f)) +obj?.head(string(nil)) +obj?.head(string(nil, "c", s)) +obj?.head(string(nil, s)) +obj?.head(string(obj)) +obj?.head(string(obj, arr, ok, nil)) +obj?.head(string(s)) +obj?.head(string(s, "b")) +obj?.head(string(s, 2)) +obj?.head(string(s, arr, ok, obj)) +obj?.head(toBase64("a")) +obj?.head(toBase64("b")) +obj?.head(toBase64(s)) +obj?.head(toBase64(s, 0.5)) +obj?.head(toBase64(s, 1)) +obj?.head(toJSON("a")) +obj?.head(toJSON("c")) +obj?.head(toJSON("c", nil)) +obj?.head(toJSON(0.5, nil)) +obj?.head(toJSON(2, "c")) +obj?.head(toJSON(2, b)) +obj?.head(toJSON(a)) +obj?.head(toJSON(a, 0)) +obj?.head(toJSON(a, s)) +obj?.head(toJSON(arr)) +obj?.head(toJSON(arr), div) +obj?.head(toJSON(b)) +obj?.head(toJSON(b, 0, s)) +obj?.head(toJSON(f)) +obj?.head(toJSON(f, "b")) +obj?.head(toJSON(false), ok) +obj?.head(toJSON(nil)) +obj?.head(toJSON(nil, nil, 2, div)) +obj?.head(toJSON(true, a)) +obj?.head(trim("c")) +obj?.head(trimPrefix("a", ok, "c", s, 0.5)) +obj?.head(trimPrefix("c")) +obj?.head(trimPrefix("c", s)) +obj?.head(trimSuffix("b")) +obj?.head(true != 0.5) +obj?.head(true != ok) +obj?.head(true != s) +obj?.head(true != true) +obj?.head(true && a) +obj?.head(true && arr) +obj?.head(true && arr, any(arr, ok)) +obj?.head(true && b) +obj?.head(true == add) +obj?.head(true == div) +obj?.head(true == obj, div(2, 1)) +obj?.head(true == ok) +obj?.head(true ? "b" : obj) +obj?.head(true ? a : obj) +obj?.head(true ? add : div) +obj?.head(true ? arr : add) +obj?.head(true ? div : b) +obj?.head(true ? nil : arr) +obj?.head(true ? obj : arr) +obj?.head(true ? obj : ok) +obj?.head(true ? ok : b) +obj?.head(true and "c") +obj?.head(true and nil) +obj?.head(true and obj) +obj?.head(true and true, b) +obj?.head(true in nil) +obj?.head(true or b, string("c")) +obj?.head(true or nil) +obj?.head(true or obj) +obj?.head(true or s) +obj?.head(true || div) +obj?.head(true || false, s contains s) +obj?.head(true || nil, add) +obj?.head(true) != div +obj?.head(true) or f < 1 +obj?.head(true, div) or obj.b +obj?.head(true, f, ok, obj) and add == add +obj?.head(true, obj) == b ? 0 : obj.b +obj?.head(true, ok, b, 0) or obj.a +obj?.head(true, s, div, f) == obj.b +obj?.head(upper("a")) +obj?.head(upper("b")) +obj?.head(upper(1, s)) +obj?.head(upper(s)) +obj?.head(upper(true, f, 1, s)) +obj?.head(values(obj)) +obj?.head({"a": 0, "b": div}) +obj?.head({"b": s}) +obj?.head({"c": f}) +obj?.obj +obj?.obj != -a +obj?.obj != -f +obj?.obj != a +obj?.obj != add +obj?.obj != any(arr, false) +obj?.obj != arr +obj?.obj != arr ? ok : s +obj?.obj != arr ? s : nil +obj?.obj != b +obj?.obj != div +obj?.obj != div(b, a) +obj?.obj != f +obj?.obj != float(0.5) +obj?.obj != map(arr, true) +obj?.obj != max(0.5) +obj?.obj != nil == nil +obj?.obj != nil == ok +obj?.obj != obj ? arr : ok +obj?.obj != obj.obj +obj?.obj != obj?.a +obj?.obj != obj?.b +obj?.obj != ok +obj?.obj != s +obj?.obj == -a +obj?.obj == a +obj?.obj == a ** a +obj?.obj == a ** f +obj?.obj == add +obj?.obj == add(2, b) +obj?.obj == add(a, b) +obj?.obj == add(b, 0) +obj?.obj == arr +obj?.obj == b +obj?.obj == b ? 2 : div +obj?.obj == b ? add : a +obj?.obj == div +obj?.obj == div ? arr : a +obj?.obj == f +obj?.obj == map(arr, ok) +obj?.obj == obj +obj?.obj == obj ? b : false +obj?.obj == obj.obj +obj?.obj == obj.obj.a +obj?.obj == obj?.b +obj?.obj == ok +obj?.obj == s +obj?.obj == s + "a" +obj?.obj in arr +obj?.obj in obj.head(arr, obj) +obj?.obj or 1 == 0 +obj?.obj.a +obj?.obj.a != add +obj?.obj.a != arr +obj?.obj.a == arr +obj?.obj.a == f +obj?.obj.b +obj?.obj.b > b +obj?.obj.b >= a +obj?.obj.obj +obj?.obj.obj == arr +obj?.obj.obj.a +obj?.obj.obj.b +obj?.obj.obj.b == add +obj?.obj.obj.obj +obj?.obj.obj?.a +obj?.obj.obj?.b +obj?.obj.obj?.obj +obj?.obj?.a +obj?.obj?.a <= b +obj?.obj?.a == add +obj?.obj?.b +obj?.obj?.b == div +obj?.obj?.b == obj +obj?.obj?.obj +obj?.obj?.obj != ok +obj?.obj?.obj.a +obj?.obj?.obj.b +obj?.obj?.obj.obj +obj?.obj?.obj?.a +obj?.obj?.obj?.b +obj?.obj?.obj?.obj +obj?.obj[obj.head(s, 0)] == add +obj?.obj[obj?.head(nil, "a")] +obj?.obj[obj?.head(s)] +obj?.obj[s] +obj?.obj[string(0.5)]?.a +obj[nil] != div +obj[nil] != s +obj[nil] == add +obj[nil] == arr +obj[nil] == f +obj[nil]?.a +obj[nil]?.a.a +obj[nil]?.a.b +obj[nil]?.a.obj +obj[nil]?.a?.a +obj[nil]?.b +obj[nil]?.b?.b +obj[nil]?.fn(b) +obj[nil]?.fn(ok) +obj[nil]?.head(arr) +obj[nil]?.obj +obj[nil]?.obj.obj +obj[obj.head(s)] +obj[ok ? "b" : add] +obj[s[a:b]] +obj[s] +obj[s] != arr +obj[s] != div +obj[s] != f +obj[s] != f ? add : div +obj[s] != s +obj[s] == !ok +obj[s] == add +obj[s] == obj.head(s) +obj[s]?.a +obj[s]?.a.b +obj[s]?.a?.b +obj[s]?.b +obj[s]?.b.a +obj[s]?.b.b +obj[s]?.b?.obj +obj[s]?.fn(a > 0).b +obj[s]?.fn(f) +obj[s]?.head(get(b == a)) +obj[s]?.head(obj.a) +obj[s]?.head(ok || a) +obj[s]?.obj +obj[s]?.obj.b +obj[s]?.obj.obj +obj[s]?.obj?.a +obj[s]?.obj?.b.obj +obj[s]?.obj?.obj +obj[string("a")] +obj[string(2)]?.a +obj[string(add)] +obj[string(nil)] +obj[string(obj)] +obj[toJSON("b")] +obj[toJSON(a)] +obj[toJSON(f)] +obj[toJSON(ok)]?.obj +obj[trimPrefix("b")] +obj[upper(s)] +ok +ok != !true +ok != (arr != arr || a > a) +ok != (ok or true) +ok != (true || true) +ok != false ? 1 : "b" +ok != first(obj?.head(0.5)) +ok != nil != nil +ok != nil != ok +ok != nil != true +ok != nil == ok +ok != nil ? true : f +ok != nil || one(arr, ok) +ok != none(arr, false) +ok != obj.a +ok != obj.b +ok != obj.head("a", true) +ok != obj.head(add) +ok != obj.head(arr) +ok != obj.head(f, "c") +ok != obj.head(ok, "c", nil, nil) +ok != obj.obj +ok != obj.obj.obj +ok != obj?.a +ok != obj?.b +ok != obj?.fn(a) +ok != obj?.fn(b) +ok != obj?.head(1) +ok != obj?.head(get(ok, obj))?.b +ok != obj?.head(nil, add) +ok != obj?.head(obj == obj) +ok != obj?.head(ok) +ok != obj?.obj +ok != obj?.obj.a +ok != obj?.obj.obj == nil ? s : obj.obj?.obj +ok != obj?.obj?.a +ok != obj?.obj?.b +ok != ok +ok != ok != ok +ok != ok and obj.fn(f, nil) +ok != ok or b >= a +ok != one(arr, false) +ok != true ? "b" : nil +ok && !ok +ok && "a" > "a" +ok && "a" >= s +ok && "c" < s +ok && (true || ok) +ok && 0 != f +ok && 0 <= f +ok && 0 == nil +ok && 0.5 != b +ok && 0.5 >= f +ok && 1 != 2 +ok && 2 != f +ok && 2 > f +ok && a < 1 +ok && a < b +ok && a <= 0 +ok && a <= a +ok && a <= f +ok && a == 0 +ok && a >= f +ok && all(arr, ok) +ok && all(arr, true) +ok && arr != arr +ok && arr == arr +ok && b < 0.5 +ok && b == b +ok && b >= f +ok && b in arr +ok && div == nil +ok && f != 0 +ok && f != f +ok && f < f +ok && false && ok +ok && false ? f : toJSON("c") +ok && nil == "c" +ok && nil == f +ok && none(arr, ok) +ok && not ok +ok && obj.a +ok && obj.b +ok && obj.head(a) +ok && obj.head(b) +ok && obj.head(b, obj) +ok && obj.head(false) +ok && obj.obj +ok && obj.obj?.a +ok && obj.obj?.obj +ok && obj?.a +ok && obj?.b +ok && obj?.head(a, b) +ok && obj?.head(add, b, nil, obj) +ok && obj?.head(arr) +ok && obj?.head(false) +ok && obj?.head(nil) +ok && obj?.obj +ok && obj?.obj != obj.b +ok && obj?.obj?.a +ok && obj?.obj?.b +ok && ok +ok && ok ? a : ok +ok && ok ? add : s +ok && ok ? b : a +ok && ok ? f : obj +ok && ok and obj?.obj +ok && ok or nil == a +ok && ok or obj?.head(div, f) +ok && ok || ok +ok && s != s +ok && s contains "b" +ok && true && obj.obj +ok && true and ok +ok && true or obj?.obj +ok == !true +ok == (false || ok) +ok == (ok and true) +ok == false == ok ? b : obj +ok == false || 0.5 >= f +ok == false || s != nil +ok == nil ? 2 : arr +ok == nil ? add : arr +ok == nil ? div : "a" +ok == nil ? div : obj.b +ok == nil ? f : ok +ok == nil ? nil : "c" +ok == obj.a +ok == obj.b +ok == obj.head(a) +ok == obj.head(add) +ok == obj.head(b) +ok == obj.head(div) +ok == obj.head(f, s, 0, 2) +ok == obj.head(ok) +ok == obj.head(s) +ok == obj.head(true) +ok == obj.obj +ok == obj?.a +ok == obj?.b +ok == obj?.head(0, s) +ok == obj?.head(a != a) +ok == obj?.head(a, 0, obj) +ok == obj?.head(a, obj, 0, s, obj) +ok == obj?.head(add) +ok == obj?.head(add, add) +ok == obj?.head(b, "a", add) +ok == obj?.head(div, "b") +ok == obj?.head(nil, false) +ok == obj?.head(obj.head(arr, b)) +ok == obj?.head(ok) +ok == obj?.head(ok, div, f, nil, 0.5) +ok == obj?.obj +ok == ok +ok == ok != (ok or true) +ok == ok == obj?.a +ok == ok ? add : nil +ok == ok ? b : s +ok == ok and arr == arr +ok == ok || obj.obj +ok == one(arr, ok) +ok == true != nil +ok == true ? add : s +ok == true and ok +ok ? "a" : a != b / b +ok ? "a" : f == obj.b +ok ? "a" : obj.a +ok ? "a" : obj.b +ok ? "a" : obj?.a +ok ? "b" : b % obj.head(ok) +ok ? "b" : obj.b +ok ? "b" : obj.obj +ok ? "b" : obj?.b?.b +ok ? "b" : obj?.obj +ok ? "b" : s endsWith obj.head(add) +ok ? "c" : 0 % a +ok ? "c" : 0.5 * f +ok ? "c" : obj?.b +ok ? "c" : obj?.fn(add(arr, a) in none(0, b)) +ok ? "c" : obj?.head(arr?.head(a), arr.head(!arr, div?.head(obj, "c"), int(div, div))) +ok ? 0 * b : obj?.obj +ok ? 0 : 1 / obj.fn(add, false, add) +ok ? 0 : a == b +ok ? 0 : f * b +ok ? 0 : obj != obj +ok ? 0 : obj.a +ok ? 0 : obj.obj +ok ? 0 : obj?.a +ok ? 0 : obj?.b +ok ? 0 : obj?.b.head(add(map(f / b, add(0.5)), add(arr * s, upper(b)))) +ok ? 0 : obj?.fn(add?.obj).b +ok ? 0 : obj?.fn(any(a, ok)) +ok ? 0 : obj?.fn(div(a.head("c", obj), div(div))) +ok ? 0 : obj?.fn(div(false))?.a +ok ? 0 : obj?.head(any(ok, div(obj))) +ok ? 0 : obj?.head(hasPrefix(true, "c", add, f), div.a) +ok ? 0 : obj?.obj +ok ? 0 : s <= obj.b +ok ? 0 == 0 : s +ok ? 0.5 != 0 : trim(nil, s) +ok ? 0.5 : add == obj.fn(s) +ok ? 0.5 : b == obj?.a +ok ? 0.5 : f ^ f +ok ? 0.5 : obj.a +ok ? 0.5 : obj.b +ok ? 0.5 : obj.fn(obj) +ok ? 0.5 : obj.head(add.a * div.fn(0, f)) +ok ? 0.5 : obj.obj +ok ? 0.5 : obj?.a +ok ? 0.5 : obj?.b +ok ? 0.5 : obj?.head(nil - arr) +ok ? 0.5 : obj?.obj +ok ? 1 + b : a +ok ? 1 : obj in obj.b +ok ? 1 : obj.b +ok ? 1 : obj?.head(arr[0:obj], a?.a) +ok ? 1 : obj?.obj +ok ? 2 : add == div +ok ? 2 : obj.b +ok ? 2 : obj.obj +ok ? 2 : obj?.a +ok ? a : "a" != s +ok ? a : -0 +ok ? a : 0 < b +ok ? a : 0 > a +ok ? a : 0.5 / a +ok ? a : 1 + f +ok ? a : 2 / a +ok ? a : a / obj.obj +ok ? a : a >= a +ok ? a : add +ok ? a : obj.a +ok ? a : obj.b +ok ? a : obj.head(all(b, a)) +ok ? a : obj.obj +ok ? a : obj.obj < a +ok ? a : obj?.a +ok ? a : obj?.b +ok ? a : obj?.head(add).head(join(nil, ok) + f) +ok ? a : obj?.head(div(add(arr, div, b, "a", b))) +ok ? a : obj?.head(now(add(div, obj, add), add.obj, get(ok, b), div(arr))) +ok ? a : obj?.obj +ok ? a : s +ok ? a < 1 : add +ok ? a < a : obj +ok ? abs(0) : f +ok ? add : 0.5 * a +ok ? add : 0.5 >= a +ok ? add : a +ok ? add : arr +ok ? add : b .. a +ok ? add : div +ok ? add : f +ok ? add : nil != obj.b +ok ? add : nil == div +ok ? add : obj +ok ? add : obj in obj.b +ok ? add : obj.a +ok ? add : obj.b +ok ? add : obj.b?.obj +ok ? add : obj.fn("c", b).obj +ok ? add : obj.fn(f.a < a?.head(1), f) +ok ? add : obj.head(arr, s) +ok ? add : obj.head(true)?.obj +ok ? add : obj.obj +ok ? add : obj.obj != obj.obj +ok ? add : obj?.a +ok ? add : obj?.b +ok ? add : obj?.b.b +ok ? add : obj?.fn(a?.fn(filter(0.5, "b"), add(a, arr))) +ok ? add : obj?.fn(add(obj endsWith obj), obj) +ok ? add : obj?.fn(none(arr, ok) > f - arr) +ok ? add : obj?.obj +ok ? add : ok +ok ? add : s +ok ? arr : "c" == obj?.obj +ok ? arr : 0 ** a +ok ? arr : a +ok ? arr : a + add(b, nil) +ok ? arr : a > b +ok ? arr : add +ok ? arr : arr +ok ? arr : arr in fromJSON(s) +ok ? arr : arr in obj?.fn(a) +ok ? arr : b +ok ? arr : b .. a +ok ? arr : b > obj.head(0.5, 0, ok) +ok ? arr : div == obj?.head(nil) +ok ? arr : f +ok ? arr : obj.b +ok ? arr : obj.fn(arr)?.a +ok ? arr : obj.head(all(f, a) matches div?.head("a", a), all(arr, b) / s?.fn(2), obj?.b?.a, count("b", add).b) +ok ? arr : obj.head(div(add(a), arr?.fn(nil)), none(nil, ok) < hasSuffix(true, add), min(0.5, "c", true, div) ? div.obj : lower(false, a, 0)) +ok ? arr : obj.head(f.head(ok) + a) +ok ? arr : obj.head(s, s) +ok ? arr : obj.obj +ok ? arr : obj?.b +ok ? arr : obj?.b.b +ok ? arr : obj?.fn(f startsWith len(true, obj, 0), arr matches b?.a).b +ok ? arr : obj?.fn(obj in min(true, ok), all(a .. arr, f), ("c" == ok) * a) +ok ? arr : obj?.obj +ok ? arr : ok +ok ? arr : s + s +ok ? arr : s contains obj.a +ok ? arr : s matches obj?.b +ok ? arr[a:a] : nil != false +ok ? b ** f : arr +ok ? b + f : obj?.b +ok ? b : (false ? b : nil) +ok ? b : 0 + b +ok ? b : add +ok ? b : b +ok ? b : div +ok ? b : f >= f +ok ? b : int(s) +ok ? b : obj +ok ? b : obj.a +ok ? b : obj.obj +ok ? b : obj?.a +ok ? b : obj?.b +ok ? b : obj?.fn("b" .. 0) +ok ? b : obj?.fn(b?.obj, none(obj, ok)) +ok ? b : obj?.obj +ok ? b : ok +ok ? b : s < s +ok ? b : s endsWith obj.b +ok ? div : 1 * obj.a +ok ? div : a +ok ? div : a < f +ok ? div : add +ok ? div : b +ok ? div : b - b ^ 0 +ok ? div : div +ok ? div : f +ok ? div : keys(obj) +ok ? div : nil == ok +ok ? div : obj.b +ok ? div : obj.fn(ok != f, div?.obj) +ok ? div : obj.obj +ok ? div : obj?.a +ok ? div : obj?.b +ok ? div : obj?.fn(add) +ok ? div : obj?.fn(obj.head(1)) +ok ? div : obj?.head(div, a.a) +ok ? div : obj?.head(false ** true <= date(arr, s)) +ok ? div : obj?.head(obj?.head(s, 0, obj) .. add, none(div.a, false != 2)) +ok ? div : obj?.head(ok, add.fn(add)) * a +ok ? div : obj?.obj +ok ? div : obj[obj?.head(arr)] +ok ? div : ok +ok ? div : s <= s +ok ? div : s contains s != true +ok ? div : toJSON(0) +ok ? div(a, b) : f +ok ? f - 0 : a / a +ok ? f : (true ? arr : "b")?.a +ok ? f : 0 == obj.obj +ok ? f : 0.5 ** b +ok ? f : 0.5 - f +ok ? f : 0.5 > f +ok ? f : 2 % obj.fn(div) +ok ? f : a * a +ok ? f : a <= obj.head(true, ok) +ok ? f : add +ok ? f : b +ok ? f : f +ok ? f : f - obj.obj +ok ? f : f >= f +ok ? f : obj.a?.a +ok ? f : obj.b +ok ? f : obj.fn(any(div, f)) +ok ? f : obj.head(obj.head(1), all(s, b), add(true)) +ok ? f : obj.obj +ok ? f : obj?.a +ok ? f : obj?.b +ok ? f : obj?.fn(div.obj, a, map(f, f), one(s, b)) +ok ? f : obj?.obj +ok ? f : obj[obj.head("c")]?.b +ok ? false : a / obj.a?.fn(div(arr, a, ok).b, add(obj[nil])) +ok ? false : b - f +ok ? false : obj.a +ok ? false : obj.b +ok ? false : obj.fn(div).a +ok ? false : obj.head(ok) +ok ? false : obj.head(s.fn(obj, add, obj)) +ok ? false : obj.obj +ok ? false : obj?.a +ok ? false : obj?.head(map(b, ok)).b +ok ? false : obj?.obj +ok ? map(arr, f) : arr +ok ? map(arr, f) : obj?.b +ok ? max(b) : s +ok ? nil : 0 * get(arr, b) +ok ? nil : a == f * b +ok ? nil : arr[a:obj.obj] +ok ? nil : b .. obj.b?.obj +ok ? nil : f == a - a +ok ? nil : obj.a +ok ? nil : obj.b +ok ? nil : obj.fn(0 % add.a) +ok ? nil : obj.fn(div(s)) +ok ? nil : obj.obj +ok ? nil : obj?.a +ok ? nil : obj?.fn(add(arr, nil, b, obj)) +ok ? nil : obj?.fn(arr != ok, f.obj) +ok ? nil : obj?.fn(filter(obj, b) and div(ok, b))?.head(b) +ok ? nil : obj?.head(get("b" ** div, count(ok, add))) +ok ? nil : obj?.obj +ok ? nil == add : s +ok ? not false : true || false +ok ? obj : "b" startsWith obj.a +ok ? obj : "c" < "a" +ok ? obj : 0 - a ^ b +ok ? obj : 0.5 * obj.b +ok ? obj : 2 >= obj?.obj +ok ? obj : a +ok ? obj : a >= f +ok ? obj : add +ok ? obj : b ^ b +ok ? obj : div +ok ? obj : f +ok ? obj : nil != s +ok ? obj : obj +ok ? obj : obj.a +ok ? obj : obj.b +ok ? obj : obj.fn(indexOf(map(add, div))) +ok ? obj : obj.head(none(a, a / 0), nil .. f?.obj, div(0).a) +ok ? obj : obj.obj +ok ? obj : obj?.a +ok ? obj : obj?.b +ok ? obj : obj?.head(add.obj.a) +ok ? obj : obj?.head(arr) +ok ? obj : obj?.obj +ok ? obj : ok +ok ? obj : s +ok ? obj : true != nil +ok ? obj.a : 0.5 != 1 +ok ? obj.b : (ok ? 2 : add) +ok ? obj.b : a +ok ? obj.head(a) : a +ok ? obj.head(nil, div, 0.5, add) : add +ok ? obj.obj : s +ok ? obj?.fn(0) : 1 * a +ok ? obj?.obj : obj +ok ? ok : a +ok ? ok : a ^ obj.fn(a, 1) +ok ? ok : add +ok ? ok : arr +ok ? ok : b > a - 0 +ok ? ok : div +ok ? ok : obj.b +ok ? ok : obj.b?.obj?.b +ok ? ok : obj.fn(0.5 ^ f, none(arr, b), f?.obj, all(b, obj), splitN(true)) +ok ? ok : obj.fn(a || 0.5) +ok ? ok : obj.fn(add.head(true && f, arr.head(f))) +ok ? ok : obj.fn(arr.a, obj.head(a), any(f, obj), 0.5 - obj) +ok ? ok : obj.fn(div, hasSuffix(f, 1)[ok], get(0 ? add : div, one(arr, s))) +ok ? ok : obj.head(a) +ok ? ok : obj.obj?.b +ok ? ok : obj?.a +ok ? ok : obj?.b +ok ? ok : obj?.obj +ok ? ok : obj?.obj.fn(arr) +ok ? ok : s >= obj?.fn(false, "b") +ok ? s : 0 - -0 +ok ? s : 0 - f +ok ? s : 2 in arr ? a : a +ok ? s : a % b +ok ? s : add +ok ? s : add in map(arr, add) +ok ? s : add(b, a) +ok ? s : arr +ok ? s : arr == arr +ok ? s : div +ok ? s : f +ok ? s : f + 2 +ok ? s : map(arr, #) +ok ? s : nil == div +ok ? s : obj +ok ? s : obj.a +ok ? s : obj.a.fn(add(s?.fn(a)).obj, get(arr.head("c"), 0 <= 0.5) > count(obj.a, s startsWith obj)) +ok ? s : obj.b +ok ? s : obj.fn(a) +ok ? s : obj.fn(div, a, false) +ok ? s : obj.fn(filter(nil, arr) ^ div(ok, nil, f, s), arr?.head(not 0.5), div?.a) +ok ? s : obj.fn(join(1)) +ok ? s : obj.fn(one(add, 1), div?.b) +ok ? s : obj.head(div % f?.b) +ok ? s : obj.obj +ok ? s : obj?.a +ok ? s : obj?.b +ok ? s : obj?.obj +ok ? s : obj?.obj.a +ok ? s : s endsWith s +ok ? trimSuffix("b") : obj +ok ? true : false and 0 < a +ok ? true : obj.a +ok ? true : obj.fn((a startsWith add) - ok ? false : obj) +ok ? true : obj.head(s <= div) +ok ? true : obj?.a +ok ? true : obj?.b +ok ? true : obj?.obj +ok ? true || obj?.a : obj +ok and !ok +ok and "a" == obj.a +ok and "a" > "a" +ok and 0 >= 0 +ok and 0.5 != b +ok and 0.5 < f +ok and 0.5 <= f +ok and 0.5 > f +ok and 1 >= 0 +ok and 2 >= 1 +ok and a < b +ok and a == 0 +ok and a > b +ok and b != 2 +ok and div != div +ok and div == add +ok and f <= a +ok and f <= f +ok and f == nil +ok and f >= 0.5 +ok and f >= f +ok and false && nil != obj +ok and false && ok +ok and false and ok +ok and nil == "b" +ok and nil == div +ok and nil == obj +ok and not ok +ok and obj.a +ok and obj.b +ok and obj.fn(b) +ok and obj.head(1, 0.5) +ok and obj.head(f, "a", s) +ok and obj.head(s) +ok and obj.obj +ok and obj.obj.b +ok and obj.obj.obj +ok and obj?.a +ok and obj?.b +ok and obj?.fn(not false ? 1 : arr) +ok and obj?.head(add) +ok and obj?.head(div) +ok and obj?.head(obj?.head(arr)) +ok and obj?.head(one("c", ok)) +ok and obj?.obj +ok and obj?.obj.obj +ok and obj?.obj?.a +ok and obj?.obj?.obj +ok and obj[s] +ok and ok +ok and ok && ok +ok and ok ? 1 > b : a ** 1 +ok and ok ? add : !ok +ok and ok ? arr : "c" +ok and ok ? div : s +ok and ok ? nil : arr +ok and ok ? s : f +ok and ok and true == false +ok and s contains s +ok and true or arr == arr +ok in obj.head(nil, div, s) +ok in obj?.head(arr, ok, add) +ok in values(obj) +ok or !obj?.obj +ok or !ok +ok or "b" <= s +ok or "b" == nil +ok or "b" > s +ok or 0 < f +ok or 0 <= b +ok or 0 == f +ok or 0 >= b +ok or 0.5 != 0 +ok or 0.5 >= 0 +ok or 2 <= 0 +ok or a < 0 +ok or a <= b +ok or a == nil +ok or add != nil +ok or add == div +ok or b > f +ok or b in arr +ok or div != div +ok or div != nil +ok or div == div +ok or f != 0.5 +ok or f != b +ok or f < 0 +ok or f == f +ok or f > 0 +ok or f >= b +ok or false && ok +ok or false ? s : nil +ok or false or 2 < a +ok or fromJSON(nil) +ok or nil != add +ok or nil != arr +ok or nil == ok +ok or nil in obj?.fn(obj != splitN("c", true, "b"), count(nil * f, div), add(0.5)?.b) +ok or not false +ok or not ok +ok or not true +ok or obj.a +ok or obj.a.b +ok or obj.a.head(all(0 && nil, add(obj, false, "b"))) +ok or obj.a.obj +ok or obj.a?.b +ok or obj.a?.obj +ok or obj.b +ok or obj.b?.head(f) +ok or obj.fn(-nil endsWith (nil || nil)) +ok or obj.fn(a, div) +ok or obj.fn(a, s[div:arr]?.a) +ok or obj.fn(add(arr)[arr:f], none(none(f, b), 0 .. 0)) +ok or obj.fn(arr .. a)?.b?.b +ok or obj.fn(arr.b <= ok, b in add?.fn(obj))?.fn(add(arr, nil)?.head(b?.fn(nil, "b", false) .. none(add, b), filter(a.obj, div >= a), 0.5 ? div : arr matches date(nil), 0 ** nil * obj.head(ok), count(add(div), map(0, a))).a) +ok or obj.fn(arr.fn(ok.head(0, add, a, a))) +ok or obj.fn(b?.head(1, nil, 1, a, nil) matches add(s, a)) +ok or obj.fn(div(div .. 0, add(div)), indexOf(nil endsWith add)) +ok or obj.fn(div).head(filter(count(s, 0.5), add(obj)), arr startsWith obj || obj != div) +ok or obj.fn(f, nil, arr)?.head(true contains b, ok.head(ok, arr)).b +ok or obj.fn(fromBase64(any(b, true), s, add(div)), s)?.obj +ok or obj.fn(map(2, b)?.obj, arr * 0.5 > filter(a, a)) +ok or obj.fn(obj ? div : div - add(add), b, none(div, a).obj) +ok or obj.fn(ok, 0) +ok or obj.head(0.5) +ok or obj.head(0.5, obj) +ok or obj.head(1, b, add, obj).b +ok or obj.head(2 matches b, float(obj), none(b, div), add[add:1], 0.5 && s) +ok or obj.head(a) +ok or obj.head(add(div(0.5)), f) +ok or obj.head(add.fn(2) matches obj?.head(nil, "c")) +ok or obj.head(arr) +ok or obj.head(arr?.obj, count(s, 0)) +ok or obj.head(b - nil) +ok or obj.head(b ? s : "b" < div(arr), f.obj.fn(map(s, b))) +ok or obj.head(b, b[nil] startsWith filter(false, b), s, div?.fn("a", obj, f) ? obj ** false : ok) +ok or obj.head(div(count(2, obj), false || obj), filter(ok.fn(add), add?.head(ok))) +ok or obj.head(div(count(nil, b), add("c"))) +ok or obj.head(div, a) +ok or obj.head(div, ok) +ok or obj.head(f) +ok or obj.head(filter(add.head(s), one(a, 0.5)), add) +ok or obj.head(obj) +ok or obj.head(obj?.head(f)) +ok or obj.head(split(b)) +ok or obj.head(splitAfterN(a?.a) != (f && div(nil, 0)) != -min(div, 1), b) +ok or obj.head(true) +ok or obj.head(true, add) +ok or obj.obj +ok or obj.obj.a +ok or obj.obj.obj +ok or obj?.a +ok or obj?.a.a +ok or obj?.a.obj +ok or obj?.a?.b +ok or obj?.b +ok or obj?.b.obj +ok or obj?.fn("c" + 0) +ok or obj?.fn("c", ok) +ok or obj?.fn(a) +ok or obj?.fn(a, div(filter(2, f)), add(first(a, true, s, "c"))) +ok or obj?.fn(add(a), b != b.b) +ok or obj?.fn(add(s)) +ok or obj?.fn(add.b, ok endsWith arr) +ok or obj?.fn(add?.b > s) +ok or obj?.fn(arr, 1 ** nil) +ok or obj?.fn(b) +ok or obj?.fn(b?.head(s), arr) +ok or obj?.fn(count(s?.head(0.5), add in f), join(add.a)) +ok or obj?.fn(div(s, obj, add))?.a.b +ok or obj?.fn(f?.a) +ok or obj?.fn(float(div)) +ok or obj?.fn(min(arr)[b:get(0.5, nil)]) +ok or obj?.fn(ok?.head(add(ok)), add(add?.obj)) +ok or obj?.fn(one(add(f, obj), a.fn(a))) +ok or obj?.fn(one(arr, false) <= ok?.a) +ok or obj?.fn(s) +ok or obj?.fn(s?.b) +ok or obj?.head(0) +ok or obj?.head(2, a) +ok or obj?.head(a in false matches add(nil), last(add(0), a.a), arr ^ obj == keys(nil, add), ok.obj) +ok or obj?.head(add <= obj, "b" || a, a, get(a, div)) +ok or obj?.head(add == f, filter("a", ok)) +ok or obj?.head(add.obj, s) +ok or obj?.head(all(div, add), max(s, ok)) +ok or obj?.head(arr).b +ok or obj?.head(b) +ok or obj?.head(f, a) +ok or obj?.head(f, div) +ok or obj?.head(fromJSON(b) endsWith b.a, none(map(b, b), s?.fn(arr, b))) +ok or obj?.head(nil ? ok : f.a) +ok or obj?.head(nil) +ok or obj?.head(nil, ok, ok, a) +ok or obj?.head(none(f.head(ok), f)) +ok or obj?.head(obj >= "c") +ok or obj?.head(obj, f) +ok or obj?.head(s) +ok or obj?.head(s?.a) +ok or obj?.obj +ok or obj?.obj.b +ok or obj?.obj?.b +ok or obj[toJSON("b")] +ok or ok +ok or ok != false +ok or ok == ok +ok or ok ? 0 : a +ok or ok ? false : a +ok or ok ? obj : "b" +ok or ok || !obj?.a +ok or ok || nil != s +ok or s != nil +ok or s <= "b" +ok or s == nil +ok or s endsWith s +ok or true ? 0 : true +ok or true || ok +ok || !ok +ok || !true +ok || "b" in obj +ok || "c" != s +ok || "c" > obj.obj +ok || 0 in arr +ok || 0.5 != 2 +ok || 0.5 <= f +ok || 0.5 >= 0.5 +ok || 2 < f +ok || 2 > f +ok || a < f +ok || a == 1 +ok || arr != arr +ok || b != 2 +ok || b == a +ok || b == f +ok || b > 0 +ok || b > f +ok || div == div +ok || f == obj?.b +ok || f > 0 +ok || f > b +ok || f >= 0.5 +ok || f in obj.head(obj) +ok || false ? obj : 0 +ok || false or obj.fn(div) +ok || get(false ? b : 0.5, add.head(0.5, div))?.a +ok || nil != b +ok || nil == "b" +ok || nil == f +ok || nil == nil +ok || nil == s +ok || not obj?.head(b.head(div(ok)).a) +ok || obj != obj +ok || obj.a +ok || obj.a startsWith toJSON(nil) +ok || obj.a.b +ok || obj.a?.a +ok || obj.b +ok || obj.b.b +ok || obj.b.obj +ok || obj.b?.b +ok || obj.b?.obj +ok || obj.fn(a.head(arr)) +ok || obj.fn(add(add.b, div?.a), s?.head(add.fn("b", b)), count(div, obj) % int(a, b, "c", false), obj) +ok || obj.fn(add(f)) +ok || obj.fn(add, nil)?.head(arr contains a) +ok || obj.fn(b) +ok || obj.fn(div(obj), obj / obj, div(a, nil)) +ok || obj.fn(div).a +ok || obj.fn(int(ok, nil, s, obj)[ok.a]) +ok || obj.fn(map("c", add), div(ok)) +ok || obj.fn(map(arr, div(f))) +ok || obj.fn(nil, div)?.a +ok || obj.fn(not 0 || nil - nil) +ok || obj.fn(ok, obj) +ok || obj.fn(ok.fn(nil)) +ok || obj.fn(s) +ok || obj.fn(s[1], f < add) +ok || obj.fn(true < arr matches div?.fn(a, s), div(add startsWith obj)) +ok || obj.fn(true <= a || f) +ok || obj.head(0.5) +ok || obj.head(2) +ok || obj.head(a) +ok || obj.head(add) +ok || obj.head(arr) +ok || obj.head(arr, filter(div(obj), -arr), fromBase64(1)?.obj, filter(f, 1) && b?.head(s, b)) +ok || obj.head(arr?.a?.obj) +ok || obj.head(div.a) +ok || obj.head(f, b) +ok || obj.head(f, nil)?.obj.obj +ok || obj.head(f.head(0 in arr, arr.head(s, s), div && a), s).b +ok || obj.head(get(arr, false) && a ^ s) +ok || obj.head(get(s?.b, f.a), s?.a ** ok) +ok || obj.head(obj ? s : f, b * nil, one(false, nil)) +ok || obj.head(obj[add(b)], ok[add] in arr, arr) +ok || obj.head(trim(false) matches filter(f, ok)) +ok || obj.obj +ok || obj.obj.a +ok || obj.obj?.a +ok || obj.obj?.b +ok || obj.obj?.fn(count(div(add || true, f, a?.fn(f, a, ok, nil)), add(a.b, add(nil)))) +ok || obj?.a +ok || obj?.a?.b +ok || obj?.a?.obj +ok || obj?.b +ok || obj?.b.b +ok || obj?.b?.a +ok || obj?.b?.head(f?.b ** arr.a) +ok || obj?.b?.obj +ok || obj?.fn("a", s)?.a +ok || obj?.fn(-map(f, a), arr.fn(obj) == 0 .. arr) +ok || obj?.fn(0, a)?.a +ok || obj?.fn(0, nil, false) +ok || obj?.fn(2, s) +ok || obj?.fn(a) +ok || obj?.fn(a.a) +ok || obj?.fn(a.b, string(arr), ok).a +ok || obj?.fn(a?.b >= hasSuffix(add)) +ok || obj?.fn(add("a"), arr matches nil, a?.obj) +ok || obj?.fn(add(obj)) +ok || obj?.fn(add?.a) +ok || obj?.fn(add[arr] in obj) +ok || obj?.fn(any(a, arr), add(add, arr, f, 0.5, obj)) +ok || obj?.fn(arr) +ok || obj?.fn(div >= true, a - arr, obj <= nil) +ok || obj?.fn(div(0, arr, 0.5, b, div), ok ^ a) +ok || obj?.fn(div, trimPrefix(add, arr, s, div)) +ok || obj?.fn(f?.a, b[0:false]) +ok || obj?.fn(f?.head(ok, div, add) < (arr or ok), div(0.5, s).b) +ok || obj?.fn(get(f, ok) ^ div(2)) +ok || obj?.fn(get(get(ok, obj), div(b, 0.5, div))) +ok || obj?.fn(hasPrefix(2), div.head(1)) +ok || obj?.fn(hasPrefix(b)) +ok || obj?.fn(map(none(add, 0), div)) +ok || obj?.fn(obj ** a, arr.fn("a", add, s)).head(ok) +ok || obj?.fn(ok.fn(f, ok), get(nil, f)) +ok || obj?.fn(ok.head(arr), s) +ok || obj?.fn(s[ok .. s]) +ok || obj?.head(-ok[ok], add(s < div)) +ok || obj?.head(0)?.a +ok || obj?.head(0, "a", f, 0) +ok || obj?.head(0.5, nil) +ok || obj?.head(a in 2) +ok || obj?.head(a) +ok || obj?.head(add(b, add), div && nil) +ok || obj?.head(add) +ok || obj?.head(any(arr, true)) +ok || obj?.head(arr) +ok || obj?.head(b) +ok || obj?.head(b, ok, 2) +ok || obj?.head(div || s) +ok || obj?.head(div, div).a +ok || obj?.head(f) +ok || obj?.head(fromBase64(add(div)), b.b.obj) +ok || obj?.head(ok && f) +ok || obj?.head(ok) +ok || obj?.head(ok, "c", 0, nil, s) +ok || obj?.head(one(add, ok)) +ok || obj?.head(s) +ok || obj?.head(s, f) +ok || obj?.head(s.a) +ok || obj?.head(true) +ok || obj?.obj +ok || obj?.obj.a +ok || obj?.obj.b +ok || obj?.obj.obj?.obj +ok || obj?.obj?.b +ok || obj[obj.b] +ok || obj[s]?.b +ok || ok +ok || ok && true +ok || ok == nil +ok || ok ? false : arr +ok || ok ? obj : s +ok || ok or obj?.obj +ok || s <= s +ok || s >= s +ok || s endsWith "b" +ok || true ? f : ok +ok || true or 1 != f +ok || true or s matches s +ok || true || obj?.c +one(0 .. 2, ok) +one(0 .. b, ok) +one(2 .. 0, f > 0) +one([add, false], ok) +one(arr, !false) +one(arr, !ok) +one(arr, "b" contains "b") +one(arr, "b" endsWith s) +one(arr, "b" startsWith "c") +one(arr, "c" contains "c") +one(arr, # <= #) +one(arr, 0 != 0.5) +one(arr, 0 != nil) +one(arr, 0 != obj?.obj) +one(arr, 0 == 1) +one(arr, 0 == nil) +one(arr, 0 > b) +one(arr, 0.5 <= b) +one(arr, 0.5 == obj.obj) +one(arr, 0.5 >= b) +one(arr, 1 == 0) +one(arr, a != 0.5) +one(arr, a != a) +one(arr, a < 0) +one(arr, a <= b) +one(arr, a == 0.5) +one(arr, a == a) +one(arr, a >= 0) +one(arr, a >= a) +one(arr, a >= b) +one(arr, any(arr, ok)) +one(arr, arr != arr) +one(arr, arr != nil) +one(arr, arr == nil) +one(arr, b != b) +one(arr, b < #) +one(arr, b < f) +one(arr, b == f) +one(arr, div != div) +one(arr, div != nil) +one(arr, div == div) +one(arr, f != a) +one(arr, f <= 0) +one(arr, f <= a) +one(arr, f == nil) +one(arr, f >= 0) +one(arr, false != obj.b) +one(arr, false == obj.obj) +one(arr, false) ? (true ? s : b) : 0 < 0 +one(arr, false) and ok +one(arr, hasSuffix(s, "b")) +one(arr, nil != 0) +one(arr, nil != arr) +one(arr, nil != f) +one(arr, nil == add) +one(arr, not ok) +one(arr, obj.head(true, a)) +one(arr, ok != nil) +one(arr, ok == ok) +one(arr, ok) +one(arr, ok) != obj.obj +one(arr, ok) != ok +one(arr, ok) && obj.obj +one(arr, ok) && ok +one(arr, ok) && ok ? a : div +one(arr, ok) == obj.fn(0) +one(arr, ok) and obj?.b +one(arr, one(arr, ok)) +one(arr, s != "b") +one(arr, s > s) +one(arr, s endsWith s) +one(arr, true && true) +one(arr, true ? false : add) +one(arr, true and true) +one(arr, true) or obj?.head(0.5) +one(b .. 0, obj.b) +one(b .. 1, ok) +one(b .. 2, any(arr, true)) +one(b .. a, ok) +one(b .. b, "a" == nil) +one(b .. b, f != nil) +one(false ? 0 : arr, "a" < s) +one(filter(arr, false), obj?.a) +one(filter(arr, ok), nil == div) +one(map(arr, "b"), div != add) +one(map(arr, 0), f != f) +one(map(arr, 0), ok == false) +one(map(arr, 0), ok) +one(map(arr, 0.5), ok) +one(map(arr, 2), b <= 0.5) +one(map(arr, a), ok) +one(map(arr, add), ok) +one(map(arr, arr), ok) +one(map(arr, b), ok) +one(map(arr, div), div != add) +one(map(arr, div), ok) +one(map(arr, f), s contains "b") +one(map(arr, false), #) +one(map(arr, ok), #) +one(map(arr, ok), 0.5 < 0.5) +one(map(arr, ok), ok) +one(map(arr, true), #) +one(obj.head("c"), obj == obj) +one(obj.head("c", add), b == f) +one(obj.head(arr), ok) +one(obj.head(obj), ok) +one(obj.head(s, obj), ok) +one(obj.obj, b <= a) +one(obj.obj, b > 1) +one(obj.obj, f < 0.5) +one(obj.obj, ok) +one(obj?.head("c"), ok) +one(obj?.head(arr), "a" matches "b") +one(obj?.head(arr), "c" < s) +one(obj?.head(s), b == nil) +one(obj?.head(s), ok) +one(obj?.head(s), s > s) +one(obj?.obj, "b" != nil) +one(obj?.obj, a == b) +one(obj?.obj, b != 0) +one(obj?.obj, false == true) +one(obj?.obj, nil in obj) +one(obj?.obj, obj.head(ok, 0, "b", 1, div)) +one(obj?.obj, ok) +one(ok ? arr : f, ok) +one(ok ? s : ok, ok) +one(values(obj), nil == ok) +repeat(s, a) +repeat(s, b) +repeat(toJSON(arr), obj?.a) +s +s != "b" ? add : add +s != "b" ? obj : f +s != "c" && nil != b +s != nil != obj.a +s != nil == ok +s != nil ? arr : ok +s != nil ? b : false +s != nil and "b" < "c" +s != nil || obj.b +s != obj.a +s != obj.b +s != obj.head(0) +s != obj.head(a) +s != obj.head(arr) +s != obj.head(div, arr) +s != obj.head(f) +s != obj.head(nil, add, f, s) +s != obj.head(ok, "b", add) +s != obj.head(s) +s != obj.obj +s != obj.obj.obj +s != obj.obj?.a +s != obj.obj?.b +s != obj.obj?.obj +s != obj?.a +s != obj?.b +s != obj?.b or add != obj.a +s != obj?.fn(1) +s != obj?.fn(int(b)) +s != obj?.head(add) +s != obj?.head(add, 0.5, arr, add) +s != obj?.obj +s != obj?.obj.a +s != obj?.obj?.obj +s != s +s != s != obj.head(obj) +s != s != true +s != s == ok +s != s ? 1 : ok +s != s ? b : s +s != s || ok +s != string(0.5) +s != string(b) +s != toJSON(1) +s != toJSON(b) +s != toJSON(true) +s != trim("c") +s + lower("a") +s + repeat(s, 0) +s + s +s + s != s +s + s + trimPrefix("a") +s + s == obj?.obj +s + s >= s +s + s matches lower(s) +s + string("c") +s + string(f) +s + toJSON("b") +s + toJSON(ok) +s + trim(s) +s < "a" + s +s < "a" ? 2 : ok +s < "a" and obj?.obj +s < "c" && s <= "b" +s < "c" ? b : arr +s < "c" and a > f +s < "c" or obj.a +s < "c" or obj?.head(s, obj) +s < lower(s) +s < obj.head(s) +s < obj?.head("b", 0.5) +s < s +s < s != nil +s < s || a == 1 +s < s || ok +s < s[a:0] +s < string(s) +s < toJSON(0) +s < trimPrefix("b") +s <= "a" != nil +s <= "a" ? nil : f +s <= "b" ? "c" : nil +s <= "c" ? "b" : a +s <= "c" ? 1 : 2 +s <= "c" ? obj : add +s <= "c" || obj.fn(b, b) +s <= obj.head(s, b, "a", add) +s <= s +s <= s != ok +s <= s == obj.b +s <= s == ok +s <= s ? 2 : 0.5 +s <= s ? b : ok +s <= s || !ok +s <= string(obj) +s == "a" + "b" +s == "b" ? obj : s +s == -obj?.b +s == f + obj.b +s == get(obj, s) +s == nil != nil +s == nil != obj?.a +s == nil == obj.obj +s == nil ? obj : f +s == nil ? obj : s +s == nil or ok +s == nil || obj?.b +s == nil || true ? 2 : s +s == obj.a +s == obj.b +s == obj.head(0.5) +s == obj.head(0.5, b, true) +s == obj.head(arr) +s == obj.head(b) +s == obj.head(nil, arr)?.fn(arr)?.obj +s == obj.head(true or f) +s == obj.obj +s == obj.obj.b +s == obj.obj?.b +s == obj.obj?.obj?.b +s == obj?.a +s == obj?.b +s == obj?.fn(a) +s == obj?.head(arr) +s == obj?.head(f, div) +s == obj?.head(obj) +s == obj?.head(obj).b +s == obj?.head(obj, ok) +s == obj?.head(ok) +s == obj?.obj +s == obj?.obj.obj +s == obj?.obj?.a +s == s +s == s != ok +s == s ? arr : "c" +s == s || obj.b +s == s[1:a] +s == string("c") +s == string(0) +s == string(1) +s == string(arr) +s == string(div) +s == toJSON(a) +s == trimPrefix("b") +s > "b" ? "c" : obj +s > "b" ? b : 0.5 +s > "b" ? div : "b" +s > "c" && obj.head(s, obj) +s > obj.head(s) +s > obj?.head(s) +s > s +s > s != true +s > s && ok +s > s + "c" +s > s == obj?.a +s > s ? add : ok +s > s ? div : obj?.fn(2) +s > s ? div : true +s > s ? ok : obj.a +s > s ? s : add +s > s and b == 0 +s > s || obj.a +s > string(2) +s > string(arr) +s > string(s) +s > toBase64("c") +s > toJSON(false) +s > trimPrefix(s) +s >= "a" + s +s >= "a" == obj.a +s >= "a" ? arr : b +s >= "c" ? b : ok +s >= "c" ? f : obj +s >= "c" and obj.obj +s >= "c" or obj?.head(add, 0, 2, add) +s >= obj.head("c", s) +s >= s +s >= s != obj?.fn(b) +s >= s && obj.b +s >= s && obj?.a +s >= s and obj?.a +s >= s or obj.head(a) +s >= string(0) +s >= string(a) +s >= string(nil) +s >= string(s) +s >= toJSON(arr) +s >= toJSON(b) +s >= trim(s) +s contains "a" && a < f +s contains "a" ? arr : true +s contains "b" == ok +s contains "b" ? a : f +s contains "b" ? s : a +s contains "c" ? "c" : b +s contains "c" ? a : obj?.a +s contains "c" ? b : obj.fn(obj) +s contains "c" || obj?.obj +s contains obj.head(s) +s contains obj.head(s, div, add) +s contains obj?.head("c") +s contains obj?.head(s) +s contains s +s contains s == ok +s contains s ? f : obj +s contains s and !ok +s contains s or obj?.head(b, b, obj)?.a in obj +s contains s or ok +s contains string(ok) +s contains toBase64(s) +s contains toJSON(nil) +s contains toJSON(ok) +s contains toJSON(s) +s endsWith "a" && obj.head(0) +s endsWith "a" == nil +s endsWith "a" ? obj : 0 +s endsWith "b" and (ok || true) +s endsWith "c" != ok ? arr : obj +s endsWith "c" == ok +s endsWith "c" ? b : arr +s endsWith lower("c") +s endsWith lower(s) +s endsWith s +s endsWith s != nil +s endsWith s && ok +s endsWith s + s +s endsWith s == nil +s endsWith s ? 0 : 0 +s endsWith s ? div : f +s endsWith s ? div : obj?.b +s endsWith s ? obj : arr +s endsWith s ? ok : add +s endsWith s and obj.head(arr, s) +s endsWith s and ok +s endsWith s or a < b +s endsWith s || obj.fn(nil) +s endsWith s || ok +s endsWith string(add) +s endsWith string(arr) +s endsWith string(s) +s endsWith toJSON(2) +s in [0.5] +s in map(arr, s) +s in obj +s in obj && s matches s +s in obj == ok +s in obj ? div : arr +s in obj ? div : div +s in obj or obj?.a +s in obj.head(arr, div) +s in obj.head(nil) +s in obj.obj +s in obj.obj.obj +s in obj?.head(last(b)) +s in obj?.obj +s in obj?.obj?.obj +s matches "a" ? false : true +s matches "b" != obj.b +s matches "b" == ok +s matches "b" ? arr : ok +s matches "b" ? b : b < b +s matches "b" ? nil : obj +s matches "b" or "c" contains "b" +s matches "b" or obj.head(add)?.obj +s matches "c" && obj?.obj +s matches "c" ? add : 1 +s matches "c" ? ok : nil +s matches "c" ? s : add +s matches obj?.head("a") +s matches obj?.head(lower(s, s)) +s matches s +s matches s == obj.b +s matches s == obj?.head(a) +s matches s == ok +s matches s ? a : 2 +s matches s ? add : a +s matches s ? nil : a >= a +s matches s ? obj : arr +s matches s and ok +s matches toJSON(f) +s matches toJSON(s) +s matches trimSuffix(s, s) +s startsWith "a" ? s : false +s startsWith "c" || obj.b +s startsWith s +s startsWith s == false +s startsWith s ? "a" : b +s startsWith s ? arr : f +s startsWith s ? obj : arr +s startsWith s ? s : "a" +s startsWith s || add == add +s startsWith s || ok +s startsWith string(arr) +s startsWith toJSON(arr) +s startsWith trimSuffix("b") +s[0 + 2:min(0)] +s[2:b] >= s +s[a:a] +s[a:a] == obj?.head(ok) +s[a:b] +s[a:obj?.a] +s[add(a, a):obj.b] +s[b:a] +split(s, s) +splitAfter(s, s) +splitAfter(s[b:b], s) +string(!false) +string(!ok) +string(!true) +string("a" < s) +string("a" == nil) +string("a" == s) +string("a" >= s) +string("b" + "a") +string("b" + s) +string("b" <= "c") +string("b" contains "c") +string("b" matches "a") +string("b" matches s) +string("b") matches s +string("c" != "b") +string("c" != nil) +string("c" <= "c") +string("c" == "a") +string("c" matches s) +string("c") != string(s) +string("c") <= string(s) +string("c") in obj +string(-(f >= 0 ? f : add)) +string(-0) +string(-0.5) +string(-2) +string(-a) +string(-b) +string(-f) +string(-obj.obj?.b) +string(-obj?.b) +string(0 != 0) +string(0 != 1) +string(0 != a) +string(0 != nil) +string(0 % 1) +string(0 % 2) +string(0 % a) +string(0 % b) +string(0 * 0) +string(0 * a) +string(0 * f) +string(0 ** 1) +string(0 ** 2) +string(0 ** a) +string(0 ** f) +string(0 + 0) +string(0 + 2) +string(0 + b) +string(0 - 1) +string(0 - 2) +string(0 - a) +string(0 - b) +string(0 / 2) +string(0 / f) +string(0 < a) +string(0 < f) +string(0 < obj.b) +string(0 <= 0) +string(0 <= 0.5) +string(0 <= a) +string(0 <= b) +string(0 <= f) +string(0 == a) +string(0 == b) +string(0 == f) +string(0 > 2) +string(0 > b) +string(0 >= b) +string(0 ^ 0) +string(0 ^ 2) +string(0) < s +string(0) > s +string(0) startsWith string(a) +string(0.5 != a) +string(0.5 != b) +string(0.5 ** 1) +string(0.5 ** b) +string(0.5 ** f) +string(0.5 + 1) +string(0.5 + a) +string(0.5 - b) +string(0.5 / 0.5) +string(0.5 / a) +string(0.5 / f) +string(0.5 < 2) +string(0.5 < arr[-1]) +string(0.5 < b) +string(0.5 < f) +string(0.5 == 0) +string(0.5 == b) +string(0.5 == f) +string(0.5 == nil) +string(0.5 > a) +string(0.5 > b) +string(0.5 > f) +string(0.5 ^ 0) +string(0.5 ^ 0.5) +string(1 != nil) +string(1 % a) +string(1 ** a) +string(1 + b) +string(1 + f) +string(1 - 0) +string(1 .. a) +string(1 / 0.5) +string(1 < 0) +string(1 < b) +string(1 <= 0) +string(1 <= f) +string(1 == 2) +string(1 == b) +string(1 == nil) +string(1 > 1) +string(1 > f) +string(1 ^ 0) +string(1 ^ f) +string(1) != s +string(1) == obj.b +string(2 != 0) +string(2 != nil) +string(2 != obj.b) +string(2 * f) +string(2 + 0) +string(2 + a) +string(2 - a) +string(2 .. a) +string(2 / 0.5) +string(2 < 0) +string(2 <= 0) +string(2 <= a) +string(2 == f) +string(2 > b) +string(2 >= 0) +string(2 >= a) +string(2 ^ 0) +string(2 in arr) +string([arr]) +string([div, a]) +string(a != 0.5) +string(a != a) +string(a != b) +string(a % b) +string(a * 0.5) +string(a * 2) +string(a * b) +string(a ** f) +string(a + a) +string(a + f) +string(a - 0) +string(a - a) +string(a - f) +string(a .. a) +string(a .. b) +string(a / 0) +string(a / f) +string(a < 0) +string(a < a) +string(a < f) +string(a <= 0.5) +string(a <= a) +string(a <= f) +string(a == b) +string(a == nil) +string(a > b) +string(a > f) +string(a >= 0) +string(a >= 1) +string(a >= a) +string(a in arr) +string(a) +string(a) == s +string(a) > lower("c") +string(a) endsWith s +string(a) in obj +string(a)[b:b] +string(abs(0.5)) +string(abs(a)) +string(add != add) +string(add != div) +string(add == nil) +string(add(0, 1)) +string(add(0, b)) +string(add(1, 2)) +string(add(2, a)) +string(add(b, 0)) +string(add(b, 1)) +string(add(b, a)) +string(add(b, b)) +string(add) +string(add) + s +string(add) < s +string(add) <= s +string(add) > s +string(add) >= s +string(add) startsWith "b" ? div : f +string(any(arr, true)) +string(arr != nil) +string(arr == obj.obj) +string(arr) +string(arr) <= s +string(arr) == lower(s) +string(arr) contains s +string(arr) in obj +string(arr) matches s == nil +string(arr) matches trim("b", s) +string(arr) startsWith lower(s) +string(arr[0]) +string(arr[1]) +string(arr[2:0]) +string(arr[a]) +string(arr[b:a]) +string(b != 0) +string(b != a) +string(b != b) +string(b != f) +string(b % 1) +string(b % b) +string(b * 0) +string(b ** 0.5) +string(b ** 1) +string(b ** 2) +string(b ** a) +string(b ** b) +string(b + 1) +string(b + 2) +string(b + b) +string(b - a) +string(b - f) +string(b .. 0) +string(b .. b) +string(b / 0.5) +string(b / 1) +string(b / a) +string(b < 0) +string(b < 1) +string(b < a) +string(b < b) +string(b < f == nil) +string(b <= a) +string(b <= b) +string(b <= f) +string(b == 0) +string(b == 0.5) +string(b == 1) +string(b == a) +string(b == f) +string(b == nil) +string(b > 0.5) +string(b > 1) +string(b > b) +string(b ^ 0.5) +string(b ^ 2) +string(b ^ b) +string(b ^ f) +string(b) +string(b) < s +string(b) <= s +string(b) >= s +string(b) matches s +string(count(arr, false)) +string(count(arr, ok)) +string(div != nil) +string(div == div) +string(div == nil) +string(div(0, 2)) +string(div(0, a)) +string(div(0, b)) +string(div(2, a)) +string(div(a, 1)) +string(div(a, a)) +string(div(a, b)) +string(div(b, 1)) +string(div(b, 2)) +string(div(b, a)) +string(div(b, b)) +string(div) +string(div) != string(b) +string(div) >= s +string(div) endsWith s +string(div)[a:count(arr, true)] +string(f != 0.5) +string(f != f) +string(f != nil) +string(f * 0) +string(f * a) +string(f * f) +string(f ** b) +string(f ** f) +string(f + b) +string(f - 2) +string(f - a) +string(f - b) +string(f / 0) +string(f / 0.5) +string(f / a) +string(f / f) +string(f / obj.a) +string(f < 0.5) +string(f < a) +string(f < b) +string(f < f) +string(f <= a) +string(f <= b) +string(f <= f) +string(f == 0) +string(f == 0.5) +string(f == b) +string(f == nil) +string(f > a) +string(f > b) +string(f > f) +string(f >= 0) +string(f >= 1) +string(f ^ a) +string(f ^ b) +string(f ^ f) +string(f) +string(f) + s +string(f) < s +string(f) > s +string(f) >= s +string(f) endsWith s +string(false != nil) +string(false != ok) +string(false && ok) +string(false && true) +string(false == nil) +string(false ? arr : f) +string(false ? div : div) +string(false ? f : a) +string(false || true) +string(filter(arr, ok)) +string(float(0)) +string(float(0.5)) +string(float(a)) +string(float(b)) +string(float(f)) +string(get(arr, a)) +string(get(obj, s)) +string(int(0)) +string(int(b)) +string(int(f)) +string(keys(obj)) +string(last(arr)) +string(len("b")) +string(len(obj)) +string(len(s)) +string(lower("c")) +string(map(arr, 0.5)) +string(map(arr, a)) +string(map(arr, add)) +string(map(arr, arr)) +string(map(arr, b)) +string(map(arr, div)) +string(map(arr, obj)) +string(map(arr, ok)) +string(max(0)) +string(max(0.5)) +string(max(f)) +string(min(2)) +string(min(f)) +string(nil != "b") +string(nil != "c") +string(nil != 2) +string(nil != a) +string(nil != add) +string(nil != b) +string(nil != f) +string(nil != obj) +string(nil != ok) +string(nil != s) +string(nil == 2) +string(nil == add) +string(nil == b) +string(nil == div) +string(nil == false) +string(nil == obj) +string(nil == ok) +string(nil == s) +string(nil in arr) +string(nil in obj) +string(nil) != toJSON(true) +string(nil) + s +string(nil) == obj.a +string(nil) in obj +string(nil) matches s +string(none(arr, false)) +string(none(arr, ok)) +string(none(arr, true)) +string(not false) +string(not ok) +string(not true) +string(obj == obj) +string(obj) +string(obj) < s +string(obj) <= s +string(obj) contains s +string(obj.a) +string(obj.b) +string(obj.fn(1)) +string(obj.fn(2)) +string(obj.fn(a)) +string(obj.fn(b)) +string(obj.head("a")) +string(obj.head("c", b, "b", 2)) +string(obj.head(2)) +string(obj.head(a)) +string(obj.head(a, 0, arr, obj, b)) +string(obj.head(a, div)) +string(obj.head(add)) +string(obj.head(add, b, arr)) +string(obj.head(arr)) +string(obj.head(arr, f, obj)) +string(obj.head(arr, obj)) +string(obj.head(b)) +string(obj.head(b, a, s)) +string(obj.head(div)) +string(obj.head(f, "b", a, 0)) +string(obj.head(f, arr, "b", 2)) +string(obj.head(f, nil, a, f)) +string(obj.head(nil, 1)) +string(obj.head(obj, f)) +string(obj.head(ok)) +string(obj.head(ok, div, add)) +string(obj.head(s)) +string(obj.head(s, b, b, arr)) +string(obj.head(s, true)) +string(obj.obj == s) +string(obj.obj) +string(obj.obj.b) +string(obj.obj.obj) +string(obj.obj?.b) +string(obj?.a) +string(obj?.b <= f) +string(obj?.b) +string(obj?.b) contains s +string(obj?.fn(0)) +string(obj?.fn(a)) +string(obj?.fn(b)) +string(obj?.head("c", 0.5, f)) +string(obj?.head(0, "a")) +string(obj?.head(0.5)) +string(obj?.head(0.5, s)) +string(obj?.head(a)) +string(obj?.head(a, add)) +string(obj?.head(add)) +string(obj?.head(add, f, "a")) +string(obj?.head(arr)) +string(obj?.head(arr, true)) +string(obj?.head(b, obj, arr)) +string(obj?.head(div)) +string(obj?.head(div, s, arr)) +string(obj?.head(f)) +string(obj?.head(false, true)) +string(obj?.head(nil)) +string(obj?.head(nil)?.a) +string(obj?.head(obj)) +string(obj?.head(ok)) +string(obj?.head(s, b, s)) +string(obj?.obj) +string(obj?.obj.a) +string(obj?.obj.obj) +string(obj[nil]) +string(obj[s]) +string(obj[s]?.a) +string(obj[s]?.b) +string(ok != ok) +string(ok && false) +string(ok && ok) +string(ok ? a : b) +string(ok ? add : 1) +string(ok ? add : a) +string(ok ? add : div) +string(ok ? arr : div) +string(ok ? b : true) +string(ok ? div : nil) +string(ok ? s : obj) +string(ok ? true : add) +string(ok and ok) +string(ok or true) +string(ok || ok) +string(ok || true) +string(ok) +string(ok) < s == ok +string(one(arr, true)) +string(s != "c") +string(s != nil) +string(s != s) +string(s < "b") +string(s <= "a") +string(s <= s) +string(s == s) +string(s > s) +string(s >= "b") +string(s >= s) +string(s contains "c") +string(s contains s) +string(s endsWith s) +string(s in obj) +string(s startsWith s) +string(s) +string(s) startsWith s +string(s[a:a]) +string(string("b")) +string(string("c")) +string(string(0.5)) +string(string(1)) +string(string(2)) +string(string(a)) +string(string(add)) +string(string(arr)) +string(string(b)) +string(string(div)) +string(string(nil)) +string(string(obj?.head(obj, a))) +string(string(ok)) +string(string(s)) +string(toJSON(2)) +string(toJSON(a)) +string(toJSON(arr)) +string(toJSON(b)) +string(toJSON(f)) +string(toJSON(nil)) +string(toJSON(ok)) +string(toJSON(s)) +string(trim("a")) +string(trimSuffix("a")) +string(true != nil) +string(true ? "a" : div) +string(true ? a : ok) +string(true ? add : add) +string(true ? arr : f) +string(true ? div : b) +string(true ? s : div) +string(true) == s +string(values(obj)) +string({"b": div, "b": nil}) +toBase64("c" + "c") +toBase64(lower(s)) +toBase64(obj.head("b", add)) +toBase64(obj.head("b", arr, s, 2)) +toBase64(obj.head("c")) +toBase64(obj.head(s)) +toBase64(obj.head(s, ok, 0)) +toBase64(obj?.head("c", div)) +toBase64(obj?.head(s)) +toBase64(obj?.head(s, arr, 1, b)) +toBase64(ok ? "a" : obj) +toBase64(ok ? s : obj?.fn(div(1, ok), true ** obj)) +toBase64(s + s) +toBase64(s) +toBase64(s) != "a" ? false : 0 +toBase64(s) + s[b:a] +toBase64(s) == obj.head(ok, false) +toBase64(s) endsWith s +toBase64(string(2)) +toBase64(string(a)) +toBase64(string(add)) +toBase64(string(arr)) +toBase64(string(b)) +toBase64(string(obj)) +toBase64(string(true)) +toBase64(toBase64("a")) +toBase64(toBase64(s)) +toBase64(toJSON(a)) +toBase64(toJSON(b)) +toBase64(toJSON(f)) +toBase64(toJSON(nil)) +toBase64(toJSON(ok)) +toBase64(toJSON(s)) +toBase64(trim("c")) +toBase64(trimPrefix("b")) +toBase64(trimPrefix(s)) +toBase64(trimSuffix("b")) +toBase64(trimSuffix(s)) +toBase64(true ? "b" : arr) +toBase64(upper("b")) +toJSON(!false) +toJSON(!ok) +toJSON(!true) +toJSON("a" != nil) +toJSON("a" == "b") +toJSON("a" == nil) +toJSON("a" == s) +toJSON("a" contains s) +toJSON("a" matches s) +toJSON("a") >= trimSuffix("c") +toJSON("b" != s) +toJSON("b" < s) +toJSON("b" <= "a") +toJSON("b" == nil) +toJSON("b" > "b") +toJSON("b" >= s) +toJSON("b" in obj) +toJSON("b" matches "b") +toJSON("b" matches s) +toJSON("b") <= s +toJSON("b") matches s +toJSON("c" < "a") +toJSON("c" <= s) +toJSON("c" == nil) +toJSON("c" endsWith "a") +toJSON("c" matches "c") +toJSON("c" startsWith "c") +toJSON("c" startsWith s) +toJSON("c") in obj +toJSON("c") startsWith lower("c") +toJSON(-(a - 0)) +toJSON(-(f - 0.5)) +toJSON(-0) +toJSON(-0.5) +toJSON(-1) +toJSON(-2) +toJSON(-a) +toJSON(-b) +toJSON(-f) +toJSON(0 != 0) +toJSON(0 != 1) +toJSON(0 != 2) +toJSON(0 != b) +toJSON(0 != f) +toJSON(0 % a) +toJSON(0 % b) +toJSON(0 * 1) +toJSON(0 * f) +toJSON(0 ** 0.5) +toJSON(0 ** a) +toJSON(0 + 1) +toJSON(0 + a) +toJSON(0 + b) +toJSON(0 + f) +toJSON(0 - 0) +toJSON(0 - a) +toJSON(0 - b) +toJSON(0 .. 1) +toJSON(0 .. 2) +toJSON(0 .. a) +toJSON(0 < 0) +toJSON(0 < a) +toJSON(0 < f) +toJSON(0 <= 0) +toJSON(0 <= a) +toJSON(0 <= obj?.a) +toJSON(0 == 0) +toJSON(0 == 0.5) +toJSON(0 == 1) +toJSON(0 == a) +toJSON(0 == nil) +toJSON(0 >= 1) +toJSON(0 >= a) +toJSON(0 >= b) +toJSON(0 >= f) +toJSON(0 ^ 0.5) +toJSON(0 ^ b) +toJSON(0 in arr) +toJSON(0) + s +toJSON(0) in obj?.obj +toJSON(0.5 != 1) +toJSON(0.5 != a) +toJSON(0.5 * 0.5) +toJSON(0.5 * b) +toJSON(0.5 * f) +toJSON(0.5 ** 2) +toJSON(0.5 - b) +toJSON(0.5 / b) +toJSON(0.5 < 0) +toJSON(0.5 < b) +toJSON(0.5 == b) +toJSON(0.5 == f) +toJSON(0.5 == nil) +toJSON(0.5 > a) +toJSON(0.5 >= 1) +toJSON(0.5 >= f) +toJSON(0.5 ^ 0) +toJSON(0.5 ^ f) +toJSON(0.5) contains s +toJSON(1 != 2) +toJSON(1 != b) +toJSON(1 % a) +toJSON(1 % b) +toJSON(1 * 0) +toJSON(1 ** 0) +toJSON(1 + b) +toJSON(1 - 0) +toJSON(1 - 0.5) +toJSON(1 - a) +toJSON(1 == a) +toJSON(1 > 0.5) +toJSON(1 > b) +toJSON(1 >= b) +toJSON(1) startsWith s +toJSON(1) startsWith string(0) +toJSON(2 != 1) +toJSON(2 != f) +toJSON(2 % obj.a) +toJSON(2 * 0) +toJSON(2 * b) +toJSON(2 + 2) +toJSON(2 + f) +toJSON(2 - 0.5) +toJSON(2 - a) +toJSON(2 .. a) +toJSON(2 <= 1) +toJSON(2 == f) +toJSON(2 >= f) +toJSON(2 ^ 0) +toJSON(2 ^ a) +toJSON(2 ^ b) +toJSON([0]) +toJSON([b]) +toJSON(a != 0) +toJSON(a != 0.5 and obj?.b) +toJSON(a != b) +toJSON(a != nil) +toJSON(a % a) +toJSON(a % b) +toJSON(a * b) +toJSON(a ** 0) +toJSON(a ** 0.5) +toJSON(a ** f) +toJSON(a + 0.5) +toJSON(a + 2) +toJSON(a + b) +toJSON(a + f) +toJSON(a - 0) +toJSON(a - 0.5) +toJSON(a - a) +toJSON(a .. 0) +toJSON(a .. a) +toJSON(a .. b) +toJSON(a / 0.5) +toJSON(a / b) +toJSON(a < a) +toJSON(a <= 0) +toJSON(a <= 0.5) +toJSON(a <= 1) +toJSON(a <= a) +toJSON(a <= b) +toJSON(a <= f) +toJSON(a == 0) +toJSON(a == 0.5) +toJSON(a == 2) +toJSON(a == b) +toJSON(a > 0) +toJSON(a > 0.5) +toJSON(a > b) +toJSON(a > f) +toJSON(a >= 0.5) +toJSON(a >= a) +toJSON(a >= b) +toJSON(a >= f) +toJSON(a >= obj.a) +toJSON(a ^ f) +toJSON(a) +toJSON(a) != obj.obj +toJSON(a) < s +toJSON(a) == "c" ? 0.5 : nil +toJSON(abs(0.5)) +toJSON(abs(a)) +toJSON(abs(b)) +toJSON(abs(obj.a)) +toJSON(add != div) +toJSON(add != nil) +toJSON(add != obj.b) +toJSON(add == add) +toJSON(add(0, a)) +toJSON(add(1, 2)) +toJSON(add(a, 0)) +toJSON(add(a, 1)) +toJSON(add(a, a)) +toJSON(add(b, 0)) +toJSON(add(b, 2)) +toJSON(add(b, b)) +toJSON(all(arr, ok)) +toJSON(any(arr, ok)) +toJSON(arr == arr) +toJSON(arr == nil) +toJSON(arr) +toJSON(arr) > s +toJSON(arr) endsWith s +toJSON(arr) in obj?.obj +toJSON(arr) matches "b" ? b : obj +toJSON(arr[0]) +toJSON(arr[a]) +toJSON(arr[b:b]) +toJSON(arr[b]) +toJSON(b != 0) +toJSON(b != b) +toJSON(b % 1) +toJSON(b * 0.5) +toJSON(b * a) +toJSON(b ** a) +toJSON(b ** b) +toJSON(b ** f) +toJSON(b + 0.5) +toJSON(b + 2) +toJSON(b + f) +toJSON(b + obj.a) +toJSON(b - 0) +toJSON(b - 2) +toJSON(b - a) +toJSON(b - b) +toJSON(b - f) +toJSON(b / b) +toJSON(b < a) +toJSON(b < f) +toJSON(b <= 0) +toJSON(b <= 2) +toJSON(b <= a) +toJSON(b <= b) +toJSON(b == 0) +toJSON(b == 0.5) +toJSON(b == a) +toJSON(b == f) +toJSON(b == nil) +toJSON(b > a) +toJSON(b > b) +toJSON(b > obj.a) +toJSON(b >= b) +toJSON(b >= f) +toJSON(b ^ 2) +toJSON(b) +toJSON(b) != s +toJSON(b) >= s +toJSON(b) contains s +toJSON(b) startsWith s +toJSON(count(arr, false)) +toJSON(count(arr, true)) +toJSON(date("b", "b")) +toJSON(div == add) +toJSON(div == div) +toJSON(div == nil) +toJSON(div == obj.a) +toJSON(div == obj?.b) +toJSON(div(0, a)) +toJSON(div(1, a)) +toJSON(div(a, 2)) +toJSON(div(a, a)) +toJSON(div(a, b)) +toJSON(div(b, 2)) +toJSON(div(b, a)) +toJSON(div(b, b)) +toJSON(f != b) +toJSON(f != f) +toJSON(f != obj?.b) +toJSON(f * a) +toJSON(f * b) +toJSON(f * f) +toJSON(f ** a) +toJSON(f ** b) +toJSON(f ** f) +toJSON(f + 0.5) +toJSON(f + a) +toJSON(f + b) +toJSON(f - 0.5) +toJSON(f - a) +toJSON(f - b) +toJSON(f - f) +toJSON(f / a) +toJSON(f < 0) +toJSON(f < f) +toJSON(f <= 0) +toJSON(f <= f) +toJSON(f == a) +toJSON(f > 0) +toJSON(f > 0.5) +toJSON(f > a) +toJSON(f > f) +toJSON(f >= b) +toJSON(f ^ 0.5) +toJSON(f ^ 1) +toJSON(f) +toJSON(f) endsWith s +toJSON(f) startsWith s +toJSON(false ? false : 0) +toJSON(false ? false : b) +toJSON(false ? obj : 1) +toJSON(false or ok) +toJSON(false || true) +toJSON(false) contains s +toJSON(filter(arr, false)) +toJSON(filter(arr, ok)) +toJSON(first(arr)) +toJSON(float(2)) +toJSON(float(a)) +toJSON(float(b)) +toJSON(get(arr, 0)) +toJSON(get(arr, b)) +toJSON(get(obj, s)) +toJSON(get(obj, s)?.a) +toJSON(int(0)) +toJSON(int(2)) +toJSON(int(a)) +toJSON(int(b)) +toJSON(int(f)) +toJSON(last(arr)) +toJSON(len("c")) +toJSON(len(arr)) +toJSON(len(s)) +toJSON(lower("c")) +toJSON(lower(s)) +toJSON(map(arr, "c")) +toJSON(map(arr, 0)) +toJSON(map(arr, 0.5)) +toJSON(map(arr, 2)) +toJSON(map(arr, a)) +toJSON(map(arr, b)) +toJSON(map(arr, f)) +toJSON(map(arr, false)) +toJSON(map(arr, s)) +toJSON(max(0)) +toJSON(max(b)) +toJSON(max(f)) +toJSON(min(2)) +toJSON(min(a)) +toJSON(min(f)) +toJSON(nil != "b") +toJSON(nil != 0) +toJSON(nil != a) +toJSON(nil != add) +toJSON(nil != b) +toJSON(nil != div) +toJSON(nil != true) +toJSON(nil == 0) +toJSON(nil == a) +toJSON(nil == arr) +toJSON(nil == f) +toJSON(nil == false) +toJSON(nil == nil) +toJSON(nil == s) +toJSON(nil == true) +toJSON(nil in arr) +toJSON(nil in obj) +toJSON(nil) < s +toJSON(nil) endsWith s +toJSON(nil) in obj +toJSON(none(arr, false)) +toJSON(none(arr, true)) +toJSON(not false) +toJSON(not ok) +toJSON(not true) +toJSON(obj != obj) +toJSON(obj == nil) +toJSON(obj.a <= f) +toJSON(obj.a) +toJSON(obj.b / a) +toJSON(obj.b) +toJSON(obj.c) +toJSON(obj.fn(0)) +toJSON(obj.fn(a)) +toJSON(obj.fn(b)) +toJSON(obj.head(!true)) +toJSON(obj.head(0.5)) +toJSON(obj.head(1, 0.5, nil, f)) +toJSON(obj.head(2, a, div)) +toJSON(obj.head(a)) +toJSON(obj.head(a, "a")) +toJSON(obj.head(a, ok)) +toJSON(obj.head(arr)) +toJSON(obj.head(arr, "c")) +toJSON(obj.head(b)) +toJSON(obj.head(b, "a")) +toJSON(obj.head(f)) +toJSON(obj.head(f, f)) +toJSON(obj.head(false)) +toJSON(obj.head(nil)) +toJSON(obj.head(nil, add)) +toJSON(obj.head(obj).a) +toJSON(obj.head(obj)?.obj) +toJSON(obj.head(obj?.b)) +toJSON(obj.head(ok)) +toJSON(obj.head(ok, div, ok, b, nil)) +toJSON(obj.head(s == f, div != s)) +toJSON(obj.head(s)) +toJSON(obj.head(s, add, 1)) +toJSON(obj.head(true, "b")) +toJSON(obj.head(true, div)) +toJSON(obj.obj) +toJSON(obj.obj.b) +toJSON(obj.obj.obj) +toJSON(obj.obj?.a) +toJSON(obj.obj?.obj) +toJSON(obj?.a) +toJSON(obj?.b) +toJSON(obj?.c) +toJSON(obj?.fn(a)) +toJSON(obj?.fn(b)) +toJSON(obj?.head("a", 0, 0.5, "a")) +toJSON(obj?.head("a", div)) +toJSON(obj?.head("c")) +toJSON(obj?.head(-a)) +toJSON(obj?.head(0)) +toJSON(obj?.head(0, true)) +toJSON(obj?.head(1)) +toJSON(obj?.head(1, s, 1)) +toJSON(obj?.head(a)) +toJSON(obj?.head(a, 0, arr)) +toJSON(obj?.head(arr, nil, s, arr, "b")) +toJSON(obj?.head(f)) +toJSON(obj?.head(f, b)) +toJSON(obj?.head(false)) +toJSON(obj?.head(nil)) +toJSON(obj?.head(ok, add, arr, ok)) +toJSON(obj?.obj) +toJSON(obj?.obj[s]) +toJSON(obj[nil]) +toJSON(obj[s]) +toJSON(ok != nil) +toJSON(ok != obj?.obj) +toJSON(ok != ok) +toJSON(ok != true) +toJSON(ok && false) +toJSON(ok == false) +toJSON(ok == nil) +toJSON(ok ? "b" : "c") +toJSON(ok ? "b" : ok) +toJSON(ok ? "c" : 0) +toJSON(ok ? 0.5 : s) +toJSON(ok ? 1 : a) +toJSON(ok ? a : add) +toJSON(ok ? a : arr) +toJSON(ok ? arr : arr) +toJSON(ok ? b : b) +toJSON(ok ? f : div) +toJSON(ok ? f : obj) +toJSON(ok ? nil : div) +toJSON(ok ? nil : true) +toJSON(ok ? ok : b) +toJSON(ok ? s : obj) +toJSON(ok and ok) +toJSON(ok || obj?.b) +toJSON(ok || true) +toJSON(ok) +toJSON(ok) == obj?.a +toJSON(ok) >= s +toJSON(ok) >= toJSON(b) +toJSON(one(arr, true)) +toJSON(repeat(s, 2)) +toJSON(s != "a") +toJSON(s != nil) +toJSON(s + "b") +toJSON(s < "b") +toJSON(s <= s) +toJSON(s == "b") +toJSON(s == nil) +toJSON(s == s) +toJSON(s > "a") +toJSON(s > s) +toJSON(s >= s) +toJSON(s contains s) +toJSON(s matches "b") +toJSON(s matches s) +toJSON(s startsWith "a") +toJSON(s startsWith "c") +toJSON(s startsWith s) +toJSON(s) +toJSON(s) in obj +toJSON(s[0:0]) +toJSON(splitAfterN(s, s, 0)) +toJSON(string("a")) +toJSON(string("c")) +toJSON(string(0.5)) +toJSON(string(add)) +toJSON(string(arr)) +toJSON(string(div)) +toJSON(string(false)) +toJSON(string(obj)) +toJSON(string(ok)) +toJSON(string(true)) +toJSON(toBase64(s)) +toJSON(toJSON(0)) +toJSON(toJSON(2)) +toJSON(toJSON(a)) +toJSON(toJSON(arr)) +toJSON(toJSON(b)) +toJSON(toJSON(f)) +toJSON(toJSON(nil)) +toJSON(toJSON(ok)) +toJSON(toJSON(s)) +toJSON(trimPrefix("a")) +toJSON(trimPrefix(s)) +toJSON(trimSuffix("b")) +toJSON(trimSuffix("c")) +toJSON(true != false) +toJSON(true != ok) +toJSON(true && ok) +toJSON(true && true) +toJSON(true ? arr : arr) +toJSON(true ? b : add) +toJSON(true ? false : s) +toJSON(true ? ok : obj) +toJSON(true ? ok : s) +toJSON(true and false) +toJSON(true and obj.obj) +toJSON(true and ok) +toJSON(true || ok) +toJSON(true) + upper("a") +toJSON(true) > obj?.head("a") +toJSON(upper("a")) +toJSON(upper(s)) +toJSON({"a": true, "b": 2, "c": a}) +trim("a") != s +trim("b" + "a") +trim("c" + "c") +trim(b != b ? s : "b") +trim(false ? obj : s) +trim(lower(s)) +trim(obj.head("a")) +trim(obj.head("a", 0)) +trim(obj.head("c")) +trim(obj.head("c", obj)) +trim(obj.head("c", ok, 0.5)) +trim(obj.head(s)) +trim(obj.head(s, 1, ok)) +trim(obj.head(s, false, f), s) +trim(obj?.head("c")) +trim(obj?.head("c", a, nil, s, "a")) +trim(obj?.head(s)) +trim(ok ? "a" : false) +trim(s + s) +trim(s) +trim(s) != obj?.head(div, s, nil, add) +trim(s) in obj?.obj +trim(s) startsWith string(nil) +trim(s, s) +trim(s, toBase64("a")) +trim(s, toBase64(s)) +trim(s[a:1]) +trim(s[a:b]) +trim(string("a")) +trim(string(a)) +trim(string(b)) +trim(string(div)) +trim(string(false)) +trim(string(nil)) +trim(string(obj)) +trim(string(ok)) +trim(toBase64("a")) +trim(toBase64(s)) +trim(toBase64(trim(s))) +trim(toJSON(0 != a)) +trim(toJSON(0 + 0.5)) +trim(toJSON(b)) +trim(toJSON(false)) +trim(toJSON(nil != div)) +trim(toJSON(nil)) +trim(toJSON(ok)) +trim(toJSON(s)) +trim(toJSON(true)) +trim(trim(s)) +trim(trim(trimSuffix(s))) +trim(trimPrefix("b")) +trim(trimPrefix("c")) +trim(trimSuffix("a")) +trim(trimSuffix(s)) +trim(true ? "c" : add) +trim(upper(s)) +trimPrefix("a" + "b") +trimPrefix("a") == obj.head(b) +trimPrefix("b" + "b") +trimPrefix("c" + s) +trimPrefix(lower("c")) +trimPrefix(lower(s)) +trimPrefix(obj.head("b", s)) +trimPrefix(obj.head("c", f)) +trimPrefix(obj.head(s)) +trimPrefix(obj?.head("a", div)) +trimPrefix(obj?.head("c")) +trimPrefix(obj?.head(s)) +trimPrefix(ok ? "c" : div) +trimPrefix(ok ? s : obj) +trimPrefix(s + s) +trimPrefix(s) +trimPrefix(s) > s +trimPrefix(s, s) +trimPrefix(s[0:2]) +trimPrefix(string("b")) +trimPrefix(string(a)) +trimPrefix(string(arr)) +trimPrefix(string(b)) +trimPrefix(string(f)) +trimPrefix(string(false)) +trimPrefix(string(obj)) +trimPrefix(string(ok)) +trimPrefix(string(s)) +trimPrefix(toBase64("b")) +trimPrefix(toBase64(s)) +trimPrefix(toJSON(0.5)) +trimPrefix(toJSON(1)) +trimPrefix(toJSON(2)) +trimPrefix(toJSON(ok)) +trimPrefix(toJSON(s)) +trimPrefix(trim("b")) +trimPrefix(trim("c", "a")) +trimPrefix(trim(s)) +trimPrefix(trimPrefix("b")) +trimPrefix(trimPrefix(s)) +trimPrefix(trimSuffix("b")) +trimPrefix(trimSuffix("c")) +trimPrefix(trimSuffix(s)) +trimSuffix("b" + s) +trimSuffix("b") contains s +trimSuffix("c") endsWith s +trimSuffix(false ? obj : s) +trimSuffix(lower("b")) +trimSuffix(obj.head("c", 0.5, arr, obj)) +trimSuffix(obj.head(s, nil, obj)) +trimSuffix(obj.head(toJSON(b, b, s, 0.5, nil))) +trimSuffix(obj?.head("a")) +trimSuffix(obj?.head("c")) +trimSuffix(obj?.head("c", 0.5)) +trimSuffix(obj?.head(s)) +trimSuffix(obj?.head(s, 2, div)) +trimSuffix(obj?.head(s, div, true, b)) +trimSuffix(ok ? s : add) +trimSuffix(repeat(s, 0)) +trimSuffix(s + "a") +trimSuffix(s + "b") +trimSuffix(s + "c") +trimSuffix(s + s) +trimSuffix(s) +trimSuffix(s) == s +trimSuffix(s) > s +trimSuffix(s, "b") startsWith s +trimSuffix(s, s) +trimSuffix(string("a")) +trimSuffix(string("b")) +trimSuffix(string(0.5)) +trimSuffix(string(a)) +trimSuffix(string(add)) +trimSuffix(string(arr)) +trimSuffix(string(b)) +trimSuffix(string(false)) +trimSuffix(string(nil)) +trimSuffix(toJSON("a")) +trimSuffix(toJSON("b")) +trimSuffix(toJSON(a)) +trimSuffix(toJSON(arr)) +trimSuffix(toJSON(b)) +trimSuffix(toJSON(f)) +trimSuffix(toJSON(nil)) +trimSuffix(toJSON(obj?.head("b", add))) +trimSuffix(toJSON(obj?.obj)) +trimSuffix(toJSON(ok)) +trimSuffix(toJSON(toJSON(s))) +trimSuffix(toJSON(true)) +trimSuffix(trim("c")) +trimSuffix(trim(s)) +trimSuffix(trimPrefix("a")) +trimSuffix(trimPrefix("b")) +trimSuffix(trimPrefix(s)) +trimSuffix(trimSuffix("b")) +trimSuffix(trimSuffix("c")) +trimSuffix(trimSuffix(s)) +trimSuffix(true ? s : a) +trimSuffix(upper("b")) +trimSuffix(upper(s)) +true != false && a != a +true != false == obj.a +true != nil or ok && ok +true != obj.a +true != obj.b +true != obj.head(a % a) +true != obj.obj +true != obj.obj.a +true != obj?.a +true != obj?.b +true != obj?.obj +true != ok and arr != nil +true != true || obj?.obj +true && false or false ? f : add +true && obj.a +true && obj.b +true && obj.obj +true && obj.obj?.obj +true && obj?.a +true && obj?.b +true && obj?.head(add) +true && obj?.head(s) +true && obj?.obj +true && obj?.obj?.obj +true && ok ? arr : b +true && ok or ok +true && true || ok +true == nil != obj?.head(obj) +true == nil in obj?.head(arr, div, obj) +true == obj.a +true == obj.b +true == obj.head(ok ? one("b", ok) : arr) +true == obj.obj +true == obj.obj?.b +true == obj?.a +true == obj?.b +true == obj?.head(b) +true == obj?.obj +true == ok != ok +true == ok == obj.head(add) +true == ok or obj.b +true ? "a" : f > f +true ? "b" : obj.obj +true ? "b" : obj?.a +true ? "b" : obj?.b +true ? "c" : nil == ok +true ? "c" : obj?.b +true ? 0 : arr != nil != ok +true ? 0 : obj?.b +true ? 0 : obj?.obj +true ? 0.5 : obj.a +true ? 0.5 : obj.b +true ? 0.5 : obj?.a +true ? 1 : obj.head(s or obj) +true ? 1 : obj?.head(s[obj]) +true ? 2 : obj.fn(b?.fn(div)) +true ? 2 : obj.fn(div(obj), keys(2), a?.a, ok * div) +true ? 2 : obj.head(filter(arr, any(arr, div))) +true ? 2 : obj.obj +true ? 2 : obj?.fn(ok, b startsWith obj) +true ? 2 : obj?.obj +true ? a : b + f +true ? a : obj.b +true ? a : obj.fn(abs(true).a) +true ? a : obj.obj +true ? a : obj?.a +true ? a : obj?.b +true ? a : obj?.fn(f.a) +true ? a : obj?.obj +true ? add : obj.b +true ? add : obj.fn(all(div(b), div(add))) +true ? add : obj.obj +true ? add : obj?.head(add(f, b)) +true ? arr : "c" + s +true ? arr : a == obj.a +true ? arr : nil == f +true ? arr : obj.a +true ? arr : obj.b +true ? arr : obj.fn(arr?.head(f.fn(false))) +true ? arr : obj.fn(s matches s) +true ? arr : obj.head(keys(s >= obj, 1 .. true, any("a", a)), add(div.fn(add, 0.5, nil), a, add(f, false), a.a, -f)).b +true ? arr : obj.obj +true ? arr : obj?.a +true ? b : 0 / b +true ? b : 2 * obj.a +true ? b : a >= b +true ? b : div == div +true ? b : nil != b +true ? b : obj.a +true ? b : obj.fn(a > obj) +true ? b : obj.head(1 matches f.b, div(count(s, div), f < obj, obj?.obj, div(f))) +true ? b : obj.obj +true ? b : obj.obj?.obj +true ? b : obj?.a +true ? b : obj?.a.obj +true ? b : obj?.b +true ? div : obj.b +true ? div : obj?.a +true ? div : obj?.obj +true ? f : 2 + a +true ? f : arr[b] +true ? f : f != obj.a +true ? f : f < a ** 2 +true ? f : obj.head(add(f.b, ok, a?.head(s, 0, f, true))) +true ? f : obj.head(none(b, "b"), a.a) +true ? f : obj.obj +true ? f : obj?.a?.obj +true ? f : obj?.b +true ? f : obj?.obj +true ? f : obj?.obj.fn(div(obj)?.obj .. none(ok, s).obj) +true ? f : obj?.obj?.obj +true ? false : obj.a +true ? false : obj.fn(none(obj, arr) startsWith b?.fn(f)) +true ? false : obj.head(div(any(0, b))) +true ? false : obj?.head(add and div) +true ? false : obj?.head(b) +true ? nil : 0 % b +true ? nil : a - f +true ? nil : a <= obj.head(nil, "a", ok, nil) +true ? nil : nil != b +true ? nil : obj.head(all(add(add), f and 0.5)) +true ? nil : obj.obj +true ? nil : obj.obj?.a +true ? nil : obj?.b +true ? nil : obj?.head(obj.obj < a.fn(false)) +true ? nil : obj?.obj +true ? obj : f * f +true ? obj : f + b - 1 +true ? obj : obj.a +true ? obj : obj.b +true ? obj : obj.fn(none(a, div or arr)).obj +true ? obj : obj.fn(s.head(arr), ok > ok) +true ? obj : obj.head(ok, map(arr, !ok))?.a?.a +true ? obj : obj.head(values(s?.b), -b <= (ok and add)) +true ? obj : obj?.a +true ? ok : b in obj.b +true ? ok : obj.b +true ? ok : obj.obj.obj +true ? ok : obj?.b.b +true ? ok : obj?.fn(not 0) +true ? ok : obj?.obj +true ? s : "a" matches s +true ? s : arr in obj?.head(b) +true ? s : f ^ (0.5 / b) +true ? s : obj.a +true ? s : obj.b +true ? s : obj.head(div(add?.head(arr, f, 0.5))) +true ? s : obj.obj +true ? s : obj?.a +true ? s : obj?.head(obj.a, div) +true ? true : nil == obj.obj +true ? true : obj.obj +true ? true : ok && ok +true and false ? b : obj +true and obj.a +true and obj.b +true and obj.head(obj.obj) +true and obj.obj +true and obj?.a +true and obj?.a >= b +true and obj?.b +true and obj?.obj +true and obj?.obj == ok +true and obj?.obj.obj +true and ok and obj?.head(div) +true or obj.a +true or obj.a.a +true or obj.a.obj +true or obj.b +true or obj.fn(a?.obj, b?.b, ok) +true or obj.fn(b, add(add)?.obj).a +true or obj.fn(div?.fn(add), ok?.head(div, b)) +true or obj.fn(join(b)) +true or obj.fn(s != add) +true or obj.head(add?.a, false > div) +true or obj.head(any(f, ok)) +true or obj.head(div(arr != b, add(add), 2 != arr, div || ok), b[b] >= ok > s, fromJSON(get(obj))) +true or obj.head(duration(f.a)) +true or obj.head(filter(div, a) endsWith div.fn(obj, s, obj, b), arr.obj.obj, not b or a ? ok : true) +true or obj.head(join(1)) +true or obj.head(none(ok?.b, count(0, 0.5))) +true or obj.obj +true or obj.obj.a?.obj +true or obj.obj?.head(map(0.5, f) matches one(obj, "c")) +true or obj?.a +true or obj?.a.fn(ok + b?.fn(obj)) +true or obj?.a.head("c" * b matches not div) +true or obj?.a?.a +true or obj?.b +true or obj?.fn(arr.b && obj?.head(b), ok.fn(obj .. arr)) +true or obj?.fn(div(b, arr) and obj?.b, obj[add(b)]) +true or obj?.fn(f, f).a +true or obj?.fn(hasPrefix(add(ok))) +true or obj?.fn(map(not ok, "b" < add), map("b" && a, one(0, add))) +true or obj?.head(add(f)) +true or obj?.head(one(none(add, add), add?.b)) +true or obj?.obj +true or obj?.obj.head(get(add(s), div)) +true or ok || obj.a +true || obj.a +true || obj.a.a +true || obj.b +true || obj.fn((add || div) - b) +true || obj.fn(arr, any(add(arr, ok, div), 0 startsWith false)) +true || obj.head(a?.fn(arr contains b, div?.head(0, add, false), obj.head(0.5), values(f), s.b))?.a +true || obj.head(add(abs(b))) +true || obj.head(add(ok.obj), any(add, f) != obj.head(b, add, arr)) +true || obj.head(all(f, 0), div("a", true)) +true || obj.head(count("a", obj)) +true || obj.head(f.b) +true || obj.head(f?.fn(0) <= b.b) +true || obj.head(filter(add.head(s), map(s, 0.5))) +true || obj.head(obj.b) +true || obj.head(obj?.fn(b)) +true || obj.obj +true || obj.obj == add +true || obj.obj.a +true || obj.obj?.b +true || obj.obj?.obj +true || obj?.a +true || obj?.b +true || obj?.fn(a?.head(div(div)), 2 .. add?.b) +true || obj?.fn(div * a == ok?.b) +true || obj?.fn(div(0.5 && 0.5, s?.head(0.5))).a +true || obj?.fn(get(a, arr)) +true || obj?.head(all(f.b, #)) +true || obj?.head(div(nil, "b"), add(nil, f)) +true || obj?.head(repeat(now(true, div, b, ok)), now(s, div(add, "c"))).a +true || obj?.head(true == nil) +true || obj?.obj +true || true or obj.obj +upper("a" + "a") +upper("a") startsWith s +upper("b") < s +upper("b") <= s +upper("c") <= s +upper(f >= 2 ? b : s) +upper(false ? 0.5 : s) +upper(lower(s)) +upper(obj.head(s)) +upper(obj.head(s, arr, obj)) +upper(obj.head(s, ok)) +upper(obj?.head("a")) +upper(obj?.head("b")) +upper(obj?.head(s)) +upper(obj?.head(s, f)) +upper(ok ? s : ok) +upper(s + s) +upper(s) +upper(s) <= s +upper(s) matches s +upper(string("a")) +upper(string("b")) +upper(string(0)) +upper(string(0.5)) +upper(string(a)) +upper(string(add)) +upper(string(b)) +upper(string(f)) +upper(string(nil)) +upper(string(obj)) +upper(string(ok)) +upper(string(true)) +upper(toBase64("c")) +upper(toBase64(s)) +upper(toJSON("c")) +upper(toJSON(2)) +upper(toJSON(a)) +upper(toJSON(arr)) +upper(toJSON(f)) +upper(toJSON(false)) +upper(toJSON(ok)) +upper(toJSON(s)) +upper(toJSON(true)) +upper(trim("c")) +upper(trim(s)) +upper(trimPrefix(s)) +upper(trimSuffix("a")) +upper(trimSuffix(s)) +upper(upper(s)) +values(obj) +values(obj) != obj?.obj +values(obj)[a] +{"a": "a", "c": a}.obj +{"a": "a"}?.obj +{"a": "c"}?.a +{"a": 0 > b} +{"a": 0, "a": "a", "a": nil, "c": ok}.b +{"a": 0, "b": f}.obj +{"a": 0, "c": 0.5}.a +{"a": 0.5, "a": s}?.b +{"a": 0.5, "b": b}?.obj +{"a": 0.5, "b": obj}?.obj +{"a": 0.5, "c": a}.b +{"a": 0.5, "c": false, "c": arr, "c": obj}.b +{"a": 0}.b +{"a": 0}?.a +{"a": 0}?.b +{"a": 0}?.obj +{"a": 1}.b +{"a": 1}.obj +{"a": 2 >= 1} +{"a": 2, "a": obj, "b": ok}?.obj +{"a": 2, "b": a, "b": f}.b +{"a": 2}.b +{"a": a - 1} +{"a": a / 0.5} +{"a": a, "a": arr} +{"a": a, "a": b, "a": "b", "c": f, "c": ok}?.obj +{"a": a, "a": div}?.obj?.a +{"a": a, "a": ok}?.b +{"a": a, "b": obj?.b} +{"a": a, "c": add, "c": nil}?.obj?.b +{"a": a, "c": obj.a} +{"a": a, "c": s, "b": nil}?.a +{"a": add(b, 2)} +{"a": add(b, b)} +{"a": add, "a": ok ? add : obj}?.b +{"a": add, "a": s, "b": div}.b +{"a": add} +{"a": add}.a +{"a": arr, "b": 1, "c": 0.5, "b": f}?.b +{"a": arr, "c": arr} +{"a": arr} +{"a": arr} == obj +{"a": arr}.a +{"a": arr}.b +{"a": a} +{"a": a}.obj +{"a": a}?.a +{"a": a}?.obj +{"a": b + b} +{"a": b - a} +{"a": b - f} +{"a": b / b} +{"a": b, "a": obj, "a": div}?.b +{"a": b, "a": ok} +{"a": b, "b": a, "c": 0}?.b +{"a": b, "b": s, "b": s}.b +{"a": b, "c": "b"}.a +{"a": b, "c": b}?.a +{"a": b} +{"a": b}.a +{"a": b}.b +{"a": b}.obj +{"a": b}?.a +{"a": b}?.b +{"a": b}?.obj +{"a": b}?.obj?.obj +{"a": div == nil} +{"a": div, "a": b, "c": nil, "a": 0}?.obj +{"a": div, "a": ok, "b": s}.a +{"a": div, "b": arr}.b +{"a": div, "c": nil}.a +{"a": div, "c": true}.b +{"a": div} +{"a": div}.b +{"a": div}.obj +{"a": div}?.obj +{"a": f, "a": add}.b +{"a": f, "a": obj}?.b +{"a": f, "b": div(b, a)} +{"a": false, "b": 1}?.b +{"a": false}.obj +{"a": f} +{"a": f}.a +{"a": f}.obj +{"a": f}?.a +{"a": f}?.obj +{"a": map(arr, a)} +{"a": map(arr, obj)} +{"a": nil, "a": b}.a +{"a": nil, "b": 1}?.b +{"a": nil}.obj +{"a": nil}?.a +{"a": obj, "a": arr}.a +{"a": obj, "a": nil}?.b +{"a": obj, "b": obj?.obj, "a": add} +{"a": obj, "b": obj}.b +{"a": obj, "c": f, "a": true}.obj +{"a": obj, "c": false, "b": arr, "b": "b"}?.a +{"a": obj.a} +{"a": obj.b} +{"a": obj.head(b, ok, nil)} +{"a": obj.obj} +{"a": obj?.a} +{"a": obj?.head(arr)} +{"a": obj?.head(b)} +{"a": obj?.head(f)} +{"a": obj?.head(obj, nil, s, false)} +{"a": obj?.obj}.b +{"a": obj} +{"a": obj}.b +{"a": obj}.obj +{"a": obj}?.b +{"a": ok, "b": f} +{"a": ok, "b": ok}?.obj +{"a": ok} +{"a": ok}.a +{"a": ok}.b +{"a": ok}?.a +{"a": ok}?.obj +{"a": s, "a": "a", "a": b}.a +{"a": s, "a": arr}?.obj +{"a": s, "a": b}.obj +{"a": s, "a": obj}.b +{"a": s, "b": nil, "c": add}?.b?.obj +{"a": s, "c": div}.obj +{"a": s, "c": div}?.a +{"a": string(f)} +{"a": s} +{"a": s}.a +{"a": toBase64("a")} +{"a": true || true} +{"a": true}.a +{"a": true}.b +{"a": true}?.a +{"b": "a", "a": "b", "a": add}.a +{"b": "a", "b": add, "a": div}?.obj +{"b": "a"}?.a +{"b": "b", "b": "b"}.a +{"b": "b", "b": arr, "b": a}.obj +{"b": "b", "b": true}?.a +{"b": "c", "b": "a"}.a +{"b": 0 == a, "a": ok} +{"b": 0, "c": arr}.b +{"b": 0.5, "b": arr, "a": 0}?.b +{"b": 0.5, "c": f, "b": div, "c": ok}?.b +{"b": 0.5, "c": ok}.b +{"b": 0}.obj +{"b": 0}.obj?.obj != div +{"b": 0}?.a +{"b": 0}?.obj +{"b": 1 .. a} +{"b": 1 < b} +{"b": 1, "c": f}?.a +{"b": 1}.a +{"b": 2, "b": a}?.a +{"b": 2}?.b +{"b": a, "a": add} +{"b": a, "a": false, "c": arr}.obj +{"b": a, "c": b != a} +{"b": add, "a": a, "a": div, "a": nil, "a": a}.obj +{"b": add, "a": true, "b": 0, "c": 0.5, "b": nil}.obj +{"b": add, "b": ok}?.a +{"b": add, "b": s}.b +{"b": add} +{"b": add}.b +{"b": add}.obj?.obj +{"b": add}?.obj +{"b": arr, "a": arr, "b": add}?.obj +{"b": arr, "a": div} +{"b": arr, "b": add} +{"b": arr, "b": f, "b": arr, "b": 0}?.b +{"b": arr, "c": f, "a": nil}[s]?.a +{"b": arr} +{"b": arr}?.a +{"b": a} +{"b": a}.a +{"b": a}.b +{"b": a}?.obj +{"b": b .. b} +{"b": b < f} +{"b": b == a} +{"b": b, "a": ok}?.a +{"b": b, "b": 0, "b": b}.obj +{"b": b, "b": a}?.a +{"b": b, "b": div, "b": arr, "b": add}.a +{"b": b, "b": obj.obj} +{"b": b, "c": a}.obj +{"b": b} +{"b": b}.a +{"b": b}.obj +{"b": b}?.a +{"b": b}?.obj +{"b": div, "a": a > a} +{"b": div, "a": arr, "a": obj, "c": 0}.a +{"b": div, "b": add}?.b +{"b": div, "c": ok, "c": 2}?.obj +{"b": div} +{"b": div}.b +{"b": div}?.a +{"b": div}?.obj +{"b": f != 0} +{"b": f <= 0.5} +{"b": f, "a": false}?.a +{"b": f, "b": add}?.obj +{"b": f, "b": s}?.obj +{"b": f, "c": arr, "b": div}?.obj +{"b": f, "c": arr, "b": f}.a +{"b": f, "c": f}?.a +{"b": false ? 0 : 2} +{"b": false, "a": obj}.b +{"b": false, "c": s}.a +{"b": f} +{"b": f}?.a?.a +{"b": f}?.obj +{"b": nil == nil, "c": obj?.obj}?.b +{"b": nil, "a": f, "b": "c"}.obj +{"b": nil, "a": f, "c": 1}.obj +{"b": nil, "a": obj, "a": f}.a +{"b": nil, "a": obj}.b +{"b": nil, "b": b}.b +{"b": nil, "b": div}.b +{"b": nil, "b": true}.b +{"b": nil, "c": div, "c": div}.b +{"b": nil}.obj +{"b": nil}?.a +{"b": not ok, "a": a} +{"b": not ok} +{"b": obj != obj.b} +{"b": obj, "a": add, "c": s}.a +{"b": obj, "a": a}?.obj +{"b": obj, "c": f, "b": nil}?.a +{"b": obj.a} +{"b": obj.b} +{"b": obj.head("b")} +{"b": obj.head(nil, b, obj)} +{"b": obj.head(s)} +{"b": obj.obj} +{"b": obj?.a} +{"b": obj?.b} +{"b": obj} +{"b": obj}.b +{"b": obj}.b?.a +{"b": obj}.obj +{"b": obj}?.b +{"b": ok, "a": a}.obj +{"b": ok, "a": b}.obj +{"b": ok, "c": 1, "c": f}?.a +{"b": ok} +{"b": ok}.obj +{"b": ok}?.a +{"b": s, "a": b, "c": obj, "b": f}?.obj +{"b": s, "b": 0, "b": nil, "c": 0}?.a +{"b": s, "b": f}?.obj +{"b": s, "c": "a", "b": div, "c": 1}.b +{"b": string(div)} +{"b": s} +{"b": s}.a +{"b": s}?.a +{"b": true ? obj : add} +{"b": true, "b": arr, "a": add} == obj ? add : b +{"b": true}.obj +{"b": true}?.obj +{"c": "a", "a": obj, "c": "b"}?.b?.obj?.b +{"c": "a", "c": obj}.b +{"c": "a"}?.a +{"c": "b", "b": false}?.obj +{"c": "b"}.a +{"c": "b"}.obj +{"c": "b"}?.obj +{"c": "c"}?.obj?.fn(arr) +{"c": 0 ** 0, "c": ok ? arr : f} +{"c": 0, "a": s, "c": add}.b +{"c": 0, "c": 0, "a": "b", "b": false}.b +{"c": 0, "c": f, "b": false}?.obj +{"c": 0, "c": f}.a +{"c": 0, "c": obj}?.a?.a +{"c": 0, "c": s, "b": s, "c": false, "b": obj}.a +{"c": 0.5, "b": b, "c": a, "b": 2}?.b +{"c": 0.5, "c": b, "b": 0}.b +{"c": 0.5, "c": true, "a": true}.b +{"c": 0}.b +{"c": 0}.obj +{"c": 1, "b": ok}?.b +{"c": 1}?.a +{"c": 2, "a": "c"}.b +{"c": 2}.a +{"c": 2}?.b +{"c": a != 1} +{"c": a .. 2}.obj +{"c": a / 0} +{"c": a <= 1} +{"c": a, "a": arr}?.obj +{"c": a, "a": b, "b": div, "b": f, "b": div}.b +{"c": a, "b": ok ? "c" : div} +{"c": a, "b": s, "a": s, "c": b, "a": add}.obj +{"c": a, "c": true}?.obj +{"c": abs(a)} +{"c": add, "a": true, "b": s}?.a +{"c": add, "b": 0, "b": b, "b": 1}?.obj +{"c": add, "b": 0.5, "c": arr}?.obj +{"c": add, "b": a, "b": s}?.a +{"c": add, "b": arr}?.obj +{"c": add, "b": obj, "b": false}?.b +{"c": add, "b": ok, "b": f, "b": s}.a +{"c": add, "c": arr} +{"c": add, "c": b}?.b +{"c": add} +{"c": add}.a?.obj +{"c": add}.b +{"c": add}.obj +{"c": add}?.a +{"c": arr != nil} +{"c": arr == arr} +{"c": arr, "a": nil, "b": b}.obj +{"c": arr, "c": arr}?.a +{"c": arr, "c": s}.obj +{"c": arr} +{"c": arr}.a +{"c": arr}.obj +{"c": arr}?.b +{"c": arr}?.obj +{"c": arr}?.obj?.b +{"c": a} +{"c": a}.a +{"c": a}.obj +{"c": a}?.a +{"c": b % a} +{"c": b, "a": obj, "b": 0.5, "a": obj, "a": s}.b +{"c": b, "c": "c", "a": f, "b": div, "c": b}?.obj +{"c": b, "c": f, "a": arr}?.b +{"c": b} +{"c": b}.a +{"c": b}.obj +{"c": b}?.b +{"c": b}?.obj +{"c": div, "a": a} +{"c": div, "a": ok, "b": obj}?.obj +{"c": div, "b": add}.obj +{"c": div, "b": b, "a": arr, "b": true}.b +{"c": div, "c": ok}?.a +{"c": div} +{"c": div}.a +{"c": div}.b +{"c": div}.obj +{"c": div}?.b +{"c": f - f} +{"c": f, "a": "b", "b": "a", "b": 0.5}?.b +{"c": f, "b": 0.5}.b +{"c": f, "b": add, "a": a}.b +{"c": f, "b": obj, "b": 2}?.obj +{"c": false}?.b +{"c": first(arr)}.a +{"c": f} +{"c": f}.a +{"c": f}.obj +{"c": f}?.a +{"c": f}?.obj +{"c": get(arr, a), "a": a != nil} +{"c": get(arr, b)} +{"c": get(obj, s)} +{"c": nil, "a": false, "c": arr, "a": f, "a": nil}.b +{"c": nil, "b": false}?.a +{"c": nil}.a +{"c": nil}.b +{"c": nil}?.a +{"c": obj, "a": div}.b +{"c": obj, "b": b}?.a +{"c": obj, "c": add} +{"c": obj, "c": nil}?.b +{"c": obj.fn(a)} +{"c": obj.head(arr, f), "a": div, "b": s}.obj +{"c": obj.head(div)} +{"c": obj.obj} +{"c": obj?.a} +{"c": obj?.obj} +{"c": obj} +{"c": obj}.a +{"c": obj}.b +{"c": obj}.obj +{"c": obj}?.a +{"c": obj}?.b +{"c": ok and ok} +{"c": ok, "c": 0}?.a +{"c": ok} +{"c": ok}.b +{"c": s, "a": b}?.a +{"c": s, "b": a}?.b +{"c": s, "b": f}?.a +{"c": s, "b": obj, "a": div}?.a +{"c": s, "c": "c", "b": false, "a": a}?.a +{"c": s, "c": add, "b": arr, "a": ok, "b": obj}?.obj +{"c": s, "c": div}.obj +{"c": s} +{"c": s}.b +{"c": s}.obj +{"c": toBase64(s)} +{"c": toJSON(a)} +{"c": true, "c": a}.obj +{"c": true}?.b diff --git a/testdata/fuzz/FuzzExpr/1fedafb72e35699d b/testdata/fuzz/FuzzExpr/1fedafb72e35699d deleted file mode 100644 index fb2cb204e..000000000 --- a/testdata/fuzz/FuzzExpr/1fedafb72e35699d +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("one(m[\"\"],#)") diff --git a/testdata/fuzz/FuzzExpr/37464e3dcb75a05c b/testdata/fuzz/FuzzExpr/37464e3dcb75a05c deleted file mode 100644 index 992d44c28..000000000 --- a/testdata/fuzz/FuzzExpr/37464e3dcb75a05c +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("repeat(\"0\",1/0)") diff --git a/testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 b/testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 deleted file mode 100644 index 7c21a804e..000000000 --- a/testdata/fuzz/FuzzExpr/42564f0e9eda1ad1 +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("duration(\"0A\")") diff --git a/testdata/fuzz/FuzzExpr/b1aef962e961045a b/testdata/fuzz/FuzzExpr/b1aef962e961045a deleted file mode 100644 index c5c870587..000000000 --- a/testdata/fuzz/FuzzExpr/b1aef962e961045a +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("fn()") diff --git a/testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c b/testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c deleted file mode 100644 index fb870a2c8..000000000 --- a/testdata/fuzz/FuzzExpr/bb7a381b0a9ef95c +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("fromJSON(\"A\")") diff --git a/testdata/fuzz/FuzzExpr/c6717d9f77902b9c b/testdata/fuzz/FuzzExpr/c6717d9f77902b9c deleted file mode 100644 index 0f3984207..000000000 --- a/testdata/fuzz/FuzzExpr/c6717d9f77902b9c +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("toJSON(2^1070)") diff --git a/testdata/fuzz/FuzzExpr/cd662894c578ed90 b/testdata/fuzz/FuzzExpr/cd662894c578ed90 deleted file mode 100644 index d6b71bb6f..000000000 --- a/testdata/fuzz/FuzzExpr/cd662894c578ed90 +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("duration(\"\")") diff --git a/testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd b/testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd deleted file mode 100644 index 7790bd025..000000000 --- a/testdata/fuzz/FuzzExpr/d0974d3e16e6f0fd +++ /dev/null @@ -1,2 +0,0 @@ -go test fuzz v1 -string("fromJSON(\"\")") From 7a61bfd5b60328c824c8b65be2aeab32308b6817 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 15:33:04 +0200 Subject: [PATCH 089/506] Update README.md --- README.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5c0a1e027..4456f456d 100644 --- a/README.md +++ b/README.md @@ -145,20 +145,24 @@ func main() { ## Who uses Expr? -* [Aviasales](https://aviasales.ru) uses Expr as a business rule engine for our flight search engine. -* [Wish.com](https://www.wish.com) uses Expr for decision-making rule engine in the Wish Assistant. -* [Argo](https://argoproj.github.io) uses Expr in Argo Rollouts and Argo Workflows for Kubernetes. -* [Crowdsec](https://crowdsec.net) uses Expr in a security automation tool. -* [FACEIT](https://www.faceit.com) uses Expr to allow customization of its eSports matchmaking algorithm. -* [qiniu](https://www.qiniu.com) uses Expr in trade systems. -* [Junglee Games](https://www.jungleegames.com/) uses Expr for an in house marketing retention tool [Project Audience](https://www.linkedin.com/pulse/meet-project-audience-our-no-code-swiss-army-knife-product-bharti). -* [OpenTelemetry](https://opentelemetry.io) uses Expr in the OpenTelemetry Collector. -* [Philips Labs](https://github.com/philips-labs/tabia) uses Expr in Tabia, a tool for collecting insights on the characteristics of our code bases. -* [CoreDNS](https://coredns.io) uses Expr in CoreDNS, a DNS server. -* [Chaos Mesh](https://chaos-mesh.org) uses Expr in Chaos Mesh, a cloud-native Chaos Engineering platform. -* [Milvus](https://milvus.io) uses Expr in Milvus, an open-source vector database. -* [Visually.io](https://visually.io) uses Expr as a business rule engine for our personalization targeting algorithm. -* [Akvorado](https://github.com/akvorado/akvorado) uses Expr to classify exporters and interfaces in network flows. +* [Google](https://google.com) uses Expr as one of its expression languages on the [Google Cloud Platform](https://cloud.google.com). +* [Uber](https://uber.com) uses Expr to allow customization of its Uber Eats marketplace. +* [GoDaddy](https://godaddy.com) employs Expr for the customization of its GoDaddy Pro product. +* [ByteDance](https://bytedance.com) incorporates Expr into its internal business rule engine. +* [Aviasales](https://aviasales.ru) utilizes Expr as a business rule engine for its flight search engine. +* [Wish.com](https://www.wish.com) employs Expr in its decision-making rule engine for the Wish Assistant. +* [Argo](https://argoproj.github.io) integrates Expr into Argo Rollouts and Argo Workflows for Kubernetes. +* [Crowdsec](https://crowdsec.net) incorporates Expr into its security automation tool. +* [FACEIT](https://www.faceit.com) uses Expr to enhance customization of its eSports matchmaking algorithm. +* [qiniu](https://www.qiniu.com) implements Expr in its trade systems. +* [Junglee Games](https://www.jungleegames.com/) uses Expr for its in-house marketing retention tool, Project Audience. +* [OpenTelemetry](https://opentelemetry.io) integrates Expr into the OpenTelemetry Collector. +* [Philips Labs](https://github.com/philips-labs/tabia) employs Expr in Tabia, a tool designed to collect insights on the characteristics of their code bases. +* [CoreDNS](https://coredns.io) uses Expr in CoreDNS, which is a DNS server. +* [Chaos Mesh](https://chaos-mesh.org) incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform. +* [Milvus](https://milvus.io) integrates Expr into Milvus, an open-source vector database. +* [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. +* [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. [Add your company too](https://github.com/antonmedv/expr/edit/master/README.md) From 06dd006d14f6b2d9fa3edf6ffa178484457ff3d4 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 15:36:31 +0200 Subject: [PATCH 090/506] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4456f456d..054409df2 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ func main() { * [qiniu](https://www.qiniu.com) implements Expr in its trade systems. * [Junglee Games](https://www.jungleegames.com/) uses Expr for its in-house marketing retention tool, Project Audience. * [OpenTelemetry](https://opentelemetry.io) integrates Expr into the OpenTelemetry Collector. -* [Philips Labs](https://github.com/philips-labs/tabia) employs Expr in Tabia, a tool designed to collect insights on the characteristics of their code bases. +* [Philips Labs](https://github.com/philips-labs/tabia) employs Expr in Tabia, a tool designed to collect insights on their code bases. * [CoreDNS](https://coredns.io) uses Expr in CoreDNS, which is a DNS server. * [Chaos Mesh](https://chaos-mesh.org) incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform. * [Milvus](https://milvus.io) integrates Expr into Milvus, an open-source vector database. From b22c301c16c31f65951d258e557a7753398034af Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 18 Aug 2023 22:08:19 +0200 Subject: [PATCH 091/506] Add crowdsec testdata --- test/crowdsec/crowdsec.go | 196 ++++++++++ test/crowdsec/crowdsec_test.go | 47 +++ test/crowdsec/funcs.go | 353 +++++++++++++++++ testdata/crowdsec.json | 675 +++++++++++++++++++++++++++++++++ 4 files changed, 1271 insertions(+) create mode 100644 test/crowdsec/crowdsec.go create mode 100644 test/crowdsec/crowdsec_test.go create mode 100644 test/crowdsec/funcs.go create mode 100644 testdata/crowdsec.json diff --git a/test/crowdsec/crowdsec.go b/test/crowdsec/crowdsec.go new file mode 100644 index 000000000..e1ec1becb --- /dev/null +++ b/test/crowdsec/crowdsec.go @@ -0,0 +1,196 @@ +package crowdsec + +import ( + "time" +) + +type Event struct { + Type int `yaml:"Type,omitempty" json:"Type,omitempty"` + ExpectMode int `yaml:"ExpectMode,omitempty" json:"ExpectMode,omitempty"` + Whitelisted bool `yaml:"Whitelisted,omitempty" json:"Whitelisted,omitempty"` + WhitelistReason string `yaml:"WhitelistReason,omitempty" json:"whitelist_reason,omitempty"` + Stage string `yaml:"Stage,omitempty" json:"Stage,omitempty"` + Line Line `yaml:"Line,omitempty" json:"Line,omitempty"` + Parsed map[string]string `yaml:"Parsed,omitempty" json:"Parsed,omitempty"` + Enriched map[string]string `yaml:"Enriched,omitempty" json:"Enriched,omitempty"` + Unmarshaled map[string]interface{} `yaml:"Unmarshaled,omitempty" json:"Unmarshaled,omitempty"` + Overflow RuntimeAlert `yaml:"Overflow,omitempty" json:"Alert,omitempty"` + Time time.Time `yaml:"Time,omitempty" json:"Time,omitempty"` + StrTime string `yaml:"StrTime,omitempty" json:"StrTime,omitempty"` + StrTimeFormat string `yaml:"StrTimeFormat,omitempty" json:"StrTimeFormat,omitempty"` + MarshaledTime string `yaml:"MarshaledTime,omitempty" json:"MarshaledTime,omitempty"` + Process bool `yaml:"Process,omitempty" json:"Process,omitempty"` + Meta map[string]string `yaml:"Meta,omitempty" json:"Meta,omitempty"` +} + +func (e *Event) GetType() string { + return "" +} + +func (e *Event) GetMeta(key string) string { + return "" +} + +type Alert struct { + Capacity *int32 `json:"capacity"` + CreatedAt string `json:"created_at,omitempty"` + Decisions []*Decision `json:"decisions"` + Events []*Event `json:"events"` + EventsCount *int32 `json:"events_count"` + ID int64 `json:"id,omitempty"` + Labels []string `json:"labels"` + Leakspeed *string `json:"leakspeed"` + MachineID string `json:"machine_id,omitempty"` + Message *string `json:"message"` + Meta Meta `json:"meta,omitempty"` + Remediation bool `json:"remediation,omitempty"` + Scenario *string `json:"scenario"` + ScenarioHash *string `json:"scenario_hash"` + ScenarioVersion *string `json:"scenario_version"` + Simulated *bool `json:"simulated"` + Source *Source `json:"source"` + StartAt *string `json:"start_at"` + StopAt *string `json:"stop_at"` + UUID string `json:"uuid,omitempty"` + Edges AlertEdges `json:"edges"` +} + +func (a *Alert) HasRemediation() bool { + return true +} + +func (a *Alert) GetScope() string { + return "" +} + +func (a *Alert) GetValue() string { + return "" +} + +func (a *Alert) GetScenario() string { + return "" +} + +func (a *Alert) GetEventsCount() int32 { + return 0 +} + +func (a *Alert) GetMeta(_ string) string { + return "" +} + +func (s Source) GetValue() string { + return *s.Value +} + +func (s Source) GetScope() string { + return *s.Scope +} + +func (s Source) GetAsNumberName() string { + return "" +} + +type AlertEdges struct { + Owner *Machine `json:"owner,omitempty"` + Decisions []*Decision `json:"decisions,omitempty"` + Events []*Event `json:"events,omitempty"` + Metas []*Meta `json:"metas,omitempty"` +} + +func (e AlertEdges) OwnerOrErr() (*Machine, error) { + return nil, nil +} + +func (e AlertEdges) DecisionsOrErr() ([]*Decision, error) { + return nil, nil +} + +func (e AlertEdges) EventsOrErr() ([]*Event, error) { + return nil, nil +} + +func (e AlertEdges) MetasOrErr() ([]*Meta, error) { + return nil, nil +} + +type Machine struct { + ID int `json:"id,omitempty"` + CreatedAt *time.Time `json:"created_at,omitempty"` + UpdatedAt *time.Time `json:"updated_at,omitempty"` + LastPush *time.Time `json:"last_push,omitempty"` + LastHeartbeat *time.Time `json:"last_heartbeat,omitempty"` + MachineId string `json:"machineId,omitempty"` + Password string `json:"-"` + IpAddress string `json:"ipAddress,omitempty"` + Scenarios string `json:"scenarios,omitempty"` + Version string `json:"version,omitempty"` + IsValidated bool `json:"isValidated,omitempty"` + Status string `json:"status,omitempty"` + AuthType string `json:"auth_type"` + Edges MachineEdges `json:"edges"` +} + +type MachineEdges struct { + Alerts []*Alert `json:"alerts,omitempty"` +} + +type Decision struct { + Duration *string `json:"duration"` + ID int64 `json:"id,omitempty"` + Origin *string `json:"origin"` + Scenario *string `json:"scenario"` + Scope *string `json:"scope"` + Simulated *bool `json:"simulated,omitempty"` + Type *string `json:"type"` + Until string `json:"until,omitempty"` + UUID string `json:"uuid,omitempty"` + Value *string `json:"value"` +} + +type Line struct { + Raw string `yaml:"Raw,omitempty"` + Src string `yaml:"Src,omitempty"` + Time time.Time + Labels map[string]string `yaml:"Labels,omitempty"` + Process bool + Module string `yaml:"Module,omitempty"` +} + +type ScopeType struct { + Scope string `yaml:"type"` + Filter string `yaml:"expression"` +} + +type RuntimeAlert struct { + Mapkey string `yaml:"MapKey,omitempty" json:"MapKey,omitempty"` + BucketId string `yaml:"BucketId,omitempty" json:"BucketId,omitempty"` + Whitelisted bool `yaml:"Whitelisted,omitempty" json:"Whitelisted,omitempty"` + Reprocess bool `yaml:"Reprocess,omitempty" json:"Reprocess,omitempty"` + Sources map[string]Source `yaml:"Sources,omitempty" json:"Sources,omitempty"` + Alert *Alert `yaml:"Alert,omitempty" json:"Alert,omitempty"` + APIAlerts []Alert `yaml:"APIAlerts,omitempty" json:"APIAlerts,omitempty"` +} + +func (r RuntimeAlert) GetSources() []string { + return nil +} + +type Source struct { + AsName string `json:"as_name,omitempty"` + AsNumber string `json:"as_number,omitempty"` + Cn string `json:"cn,omitempty"` + IP string `json:"ip,omitempty"` + Latitude float32 `json:"latitude,omitempty"` + Longitude float32 `json:"longitude,omitempty"` + Range string `json:"range,omitempty"` + Scope *string `json:"scope"` + Value *string `json:"value"` +} + +type Meta []*MetaItems0 + +type MetaItems0 struct { + Key string `json:"key,omitempty"` + Value string `json:"value,omitempty"` +} diff --git a/test/crowdsec/crowdsec_test.go b/test/crowdsec/crowdsec_test.go new file mode 100644 index 000000000..0ff2f6211 --- /dev/null +++ b/test/crowdsec/crowdsec_test.go @@ -0,0 +1,47 @@ +package crowdsec_test + +import ( + "encoding/json" + "os" + "testing" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/test/crowdsec" + "github.com/stretchr/testify/require" +) + +func TestCrowdsec(t *testing.T) { + b, err := os.ReadFile("../../testdata/crowdsec.json") + require.NoError(t, err) + + var examples []string + err = json.Unmarshal(b, &examples) + require.NoError(t, err) + + env := map[string]interface{}{ + "evt": &crowdsec.Event{}, + } + + var opt = []expr.Option{ + expr.Env(env), + } + for _, fn := range crowdsec.CustomFunctions { + opt = append( + opt, + expr.Function( + fn.Name, + func(params ...interface{}) (interface{}, error) { + return nil, nil + }, + fn.Func..., + ), + ) + } + + for _, line := range examples { + t.Run(line, func(t *testing.T) { + _, err = expr.Compile(line, opt...) + require.NoError(t, err) + }) + } +} diff --git a/test/crowdsec/funcs.go b/test/crowdsec/funcs.go new file mode 100644 index 000000000..acc14c545 --- /dev/null +++ b/test/crowdsec/funcs.go @@ -0,0 +1,353 @@ +package crowdsec + +import ( + "time" +) + +var CustomFunctions = []struct { + Name string + Func []interface{} +}{ + { + Name: "Distance", + Func: []interface{}{ + new(func(string, string, string, string) (float64, error)), + }, + }, + { + Name: "GetFromStash", + Func: []interface{}{ + new(func(string, string) (string, error)), + }, + }, + { + Name: "Atof", + Func: []interface{}{ + new(func(string) float64), + }, + }, + { + Name: "JsonExtract", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "JsonExtractUnescape", + Func: []interface{}{ + new(func(string, ...string) string), + }, + }, + { + Name: "JsonExtractLib", + Func: []interface{}{ + new(func(string, ...string) string), + }, + }, + { + Name: "JsonExtractSlice", + Func: []interface{}{ + new(func(string, string) []interface{}), + }, + }, + { + Name: "JsonExtractObject", + Func: []interface{}{ + new(func(string, string) map[string]interface{}), + }, + }, + { + Name: "ToJsonString", + Func: []interface{}{ + new(func(interface{}) string), + }, + }, + { + Name: "File", + Func: []interface{}{ + new(func(string) []string), + }, + }, + { + Name: "RegexpInFile", + Func: []interface{}{ + new(func(string, string) bool), + }, + }, + { + Name: "Upper", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "Lower", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "IpInRange", + Func: []interface{}{ + new(func(string, string) bool), + }, + }, + { + Name: "TimeNow", + Func: []interface{}{ + new(func() string), + }, + }, + { + Name: "ParseUri", + Func: []interface{}{ + new(func(string) map[string][]string), + }, + }, + { + Name: "PathUnescape", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "QueryUnescape", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "PathEscape", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "QueryEscape", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "XMLGetAttributeValue", + Func: []interface{}{ + new(func(string, string, string) string), + }, + }, + { + Name: "XMLGetNodeValue", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "IpToRange", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "IsIPV6", + Func: []interface{}{ + new(func(string) bool), + }, + }, + { + Name: "IsIPV4", + Func: []interface{}{ + new(func(string) bool), + }, + }, + { + Name: "IsIP", + Func: []interface{}{ + new(func(string) bool), + }, + }, + { + Name: "LookupHost", + Func: []interface{}{ + new(func(string) []string), + }, + }, + { + Name: "GetDecisionsCount", + Func: []interface{}{ + new(func(string) int), + }, + }, + { + Name: "GetDecisionsSinceCount", + Func: []interface{}{ + new(func(string, string) int), + }, + }, + { + Name: "Sprintf", + Func: []interface{}{ + new(func(string, ...interface{}) string), + }, + }, + { + Name: "ParseUnix", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "SetInStash", + Func: []interface{}{ + new(func(string, string, string, *time.Duration) error), + }, + }, + { + Name: "Fields", + Func: []interface{}{ + new(func(string) []string), + }, + }, + { + Name: "Index", + Func: []interface{}{ + new(func(string, string) int), + }, + }, + { + Name: "IndexAny", + Func: []interface{}{ + new(func(string, string) int), + }, + }, + { + Name: "Join", + Func: []interface{}{ + new(func([]string, string) string), + }, + }, + { + Name: "Split", + Func: []interface{}{ + new(func(string, string) []string), + }, + }, + { + Name: "SplitAfter", + Func: []interface{}{ + new(func(string, string) []string), + }, + }, + { + Name: "SplitAfterN", + Func: []interface{}{ + new(func(string, string, int) []string), + }, + }, + { + Name: "SplitN", + Func: []interface{}{ + new(func(string, string, int) []string), + }, + }, + { + Name: "Replace", + Func: []interface{}{ + new(func(string, string, string, int) string), + }, + }, + { + Name: "ReplaceAll", + Func: []interface{}{ + new(func(string, string, string) string), + }, + }, + { + Name: "Trim", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "TrimLeft", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "TrimRight", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "TrimSpace", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "TrimPrefix", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "TrimSuffix", + Func: []interface{}{ + new(func(string, string) string), + }, + }, + { + Name: "Get", + Func: []interface{}{ + new(func([]string, int) string), + }, + }, + { + Name: "ToString", + Func: []interface{}{ + new(func(interface{}) string), + }, + }, + { + Name: "Match", + Func: []interface{}{ + new(func(string, string) bool), + }, + }, + { + Name: "KeyExists", + Func: []interface{}{ + new(func(string, map[string]interface{}) bool), + }, + }, + { + Name: "LogInfo", + Func: []interface{}{ + new(func(string, ...interface{}) bool), + }, + }, + { + Name: "B64Decode", + Func: []interface{}{ + new(func(string) string), + }, + }, + { + Name: "UnmarshalJSON", + Func: []interface{}{ + new(func(string, map[string]interface{}, string) error), + }, + }, + { + Name: "ParseKV", + Func: []interface{}{ + new(func(string, map[string]interface{}, string) error), + }, + }, + { + Name: "Hostname", + Func: []interface{}{ + new(func() (string, error)), + }, + }, +} diff --git a/testdata/crowdsec.json b/testdata/crowdsec.json new file mode 100644 index 000000000..599448c04 --- /dev/null +++ b/testdata/crowdsec.json @@ -0,0 +1,675 @@ +[ + " {Jan:'01',Feb:'02',Mar:'03',Apr:'04',May:'05',Jun:'06',Jul:'07',Aug:'08',Sep:'09',Oct:'10',Nov:'11',Dec:'12'}[evt.Parsed.ts_m] + '/' + evt.Parsed.ts_d + '/' + evt.Parsed.ts_y + ' ' + evt.Parsed.ts_t", + "\"20\" + evt.Parsed.year + \"/\" + evt.Parsed.month + \"/\" + evt.Parsed.day + \" \" + evt.Parsed.time", + "'source_ip' in evt.Meta", + "(\nUpper(evt.Meta.http_path) contains Upper('/service/extension/backup/mboximport?account-name=admin&ow=2&no-switch=1&append=1') ||\nUpper(evt.Meta.http_path) contains Upper('/service/extension/backup/mboximport?account-name=admin&account-status=1&ow=cmd') \n)\nand evt.Meta.http_status startsWith ('40') and\nUpper(evt.Meta.http_verb) == 'POST'\n", + "GetFromStash(\"auditd_pid_progname\", evt.Unmarshaled.auditd.ppid)", + "IpToRange(evt.Overflow.Alert.Source.IP, \"/64\")", + "IsIP(evt.Unmarshaled.cloudtrail.sourceIPAddress) ? evt.Unmarshaled.cloudtrail.sourceIPAddress : \"\"\n", + "JsonExtract(evt.Line.Raw, \"common_log\")", + "JsonExtract(evt.Line.Raw, \"metric_name\")", + "JsonExtract(evt.Line.Raw, \"path_info\")", + "JsonExtract(evt.Line.Raw, \"request.headers.User-Agent\")", + "JsonExtract(evt.Line.Raw, \"request.host\")", + "JsonExtract(evt.Line.Raw, \"request.method\")", + "JsonExtract(evt.Line.Raw, \"request.remote_addr\")", + "JsonExtract(evt.Line.Raw, \"request.remote_ip\")", + "JsonExtract(evt.Line.Raw, \"request.uri\")", + "JsonExtract(evt.Line.Raw, \"request_ip\")", + "JsonExtract(evt.Line.Raw, \"resp_headers.Date[0]\")", + "JsonExtract(evt.Line.Raw, \"status\")", + "JsonExtract(evt.Line.Raw, \"time\")", + "JsonExtract(evt.Line.Raw, \"timestamp\")", + "JsonExtract(evt.Line.Raw, \"user_agent\")", + "JsonExtract(evt.Line.Raw, 'status') == '401' && JsonExtract(evt.Line.Raw, 'request.headers.Authorization[0]') startsWith 'Basic ' ? 'auth_fail' : ''", + "JsonExtract(evt.Parsed.line, \"bouncer_agent\")", + "JsonExtract(evt.Parsed.line, \"customer_id\")", + "JsonExtract(evt.Parsed.line, \"ip\")", + "JsonExtract(evt.Parsed.line, \"order_id\")", + "JsonExtract(evt.Parsed.line, \"payment_method\")", + "JsonExtract(evt.Parsed.line, \"product_id\")", + "JsonExtract(evt.Parsed.line, \"quote_id\")", + "JsonExtract(evt.Parsed.line, \"type\")", + "JsonExtract(evt.Parsed.line, \"x-forwarded-for-ip\")", + "JsonExtract(evt.Parsed.message, \"alert.rev\")", + "JsonExtract(evt.Parsed.message, \"alert.severity\")", + "JsonExtract(evt.Parsed.message, \"alert.signature\")", + "JsonExtract(evt.Parsed.message, \"alert.signature_id\")", + "JsonExtract(evt.Parsed.message, \"attr.authenticationDatabase\")", + "JsonExtract(evt.Parsed.message, \"attr.principalName\")", + "JsonExtract(evt.Parsed.message, \"attr.remote\")", + "JsonExtract(evt.Parsed.message, \"client_ip\")", + "JsonExtract(evt.Parsed.message, \"dest_ip\")", + "JsonExtract(evt.Parsed.message, \"dest_port\")", + "JsonExtract(evt.Parsed.message, \"eventAudience\")", + "JsonExtract(evt.Parsed.message, \"eventData.eventConfidence\")", + "JsonExtract(evt.Parsed.message, \"eventData.httpSourceId\")", + "JsonExtract(evt.Parsed.message, \"eventData.matchedLocation\")", + "JsonExtract(evt.Parsed.message, \"eventData.matchedParameter\")", + "JsonExtract(evt.Parsed.message, \"eventData.matchedSample\")", + "JsonExtract(evt.Parsed.message, \"eventData.securityAction\")", + "JsonExtract(evt.Parsed.message, \"eventData.sourceIP\")", + "JsonExtract(evt.Parsed.message, \"eventData.waapIncidentType\")", + "JsonExtract(evt.Parsed.message, \"eventName\")", + "JsonExtract(evt.Parsed.message, \"eventPriority\")", + "JsonExtract(evt.Parsed.message, \"eventSeverity\")", + "JsonExtract(evt.Parsed.message, \"eventTime\")", + "JsonExtract(evt.Parsed.message, \"flow_id\")", + "JsonExtract(evt.Parsed.message, \"message\")", + "JsonExtract(evt.Parsed.message, \"msg\")", + "JsonExtract(evt.Parsed.message, \"proto\")", + "JsonExtract(evt.Parsed.message, \"remote_ip\")", + "JsonExtract(evt.Parsed.message, \"request_method\")", + "JsonExtract(evt.Parsed.message, \"request_referer\")", + "JsonExtract(evt.Parsed.message, \"request_user_agent\")", + "JsonExtract(evt.Parsed.message, \"response_body_size\")", + "JsonExtract(evt.Parsed.message, \"response_status\")", + "JsonExtract(evt.Parsed.message, \"src_ip\")", + "JsonExtract(evt.Parsed.message, \"t.$date\")", + "JsonExtract(evt.Parsed.message, \"time\")", + "JsonExtract(evt.Parsed.message, \"timestamp\")", + "JsonExtract(evt.Parsed.message, \"url\")", + "JsonExtractUnescape(evt.Line.Raw, \"log\")", + "Lower(evt.Meta.http_path) contains '/index.php' &&\nUpper(evt.Parsed.verb) == 'POST' &&\nevt.Meta.http_status == '302' &&\nLower(evt.Parsed.http_args) matches 'login=.*[$|%24][\\\\(|%28].*[\\\\)|%29]'\n", + "Lower(evt.Unmarshaled.iptables.PROTO)", + "ParseKV(evt.Parsed.message, evt.Unmarshaled, \"iptables\")", + "RegexpInFile(evt.Enriched.reverse_dns, 'rdns_seo_bots.regex')", + "Split(evt.Unmarshaled.traefik.ClientAddr, ':')[0]", + "Split(evt.Unmarshaled.traefik.RequestProtocol, '/')[1]", + "UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, \"k8s_audit\")", + "UnmarshalJSON(evt.Line.Raw, evt.Unmarshaled, 'cloudtrail')", + "Upper(PathUnescape(evt.Meta.http_path)) contains Upper('${script:javascript:java.lang.Runtime.getRuntime().exec(')\nor\nUpper(PathUnescape(evt.Meta.http_path)) contains Upper('${script:js:java.lang.Runtime.getRuntime().exec(')\nor\nUpper(PathUnescape(evt.Meta.http_path)) contains Upper('${url:UTF-8:') \nor\nUpper(PathUnescape(evt.Meta.http_path)) contains Upper('${dns:address|') \n", + "Upper(PathUnescape(evt.Meta.http_path)) contains Upper('@java.lang.Runtime@getRuntime().exec(')", + "Upper(evt.Meta.http_path) contains Upper('/autodiscover/autodiscover.json') &&\nUpper(evt.Parsed.http_args) contains Upper('powershell')\n", + "Upper(evt.Meta.http_path) contains Upper('/ghost/api/admin/session') &&\nUpper(evt.Parsed.verb) == 'POST' &&\nevt.Meta.http_status == '404'\n", + "Upper(evt.Meta.http_path) contains Upper('/remote_agent.php') &&\nUpper(evt.Parsed.verb) == 'GET' &&\nLower(evt.Parsed.http_args) contains 'action=polldata' &&\nLower(evt.Parsed.http_args) matches 'poller_id=.*(;|%3b)'\n", + "Upper(evt.Meta.http_path) contains Upper('/remote_agent.php') &&\nUpper(evt.Parsed.verb) == 'GET' &&\nLower(evt.Parsed.http_args) contains 'host_id' &&\nLower(evt.Parsed.http_args) contains 'local_data_ids'\n", + "Upper(evt.Meta.http_path) contains Upper('/vendor/htmlawed/htmlawed/htmLawedTest.php')", + "Upper(evt.Parsed.file_ext) in ['.JPG', '.CSS', '.JS', '.JPEG', '.PNG', '.SVG', '.MAP', '.ICO', '.OTF', '.GIF', '.MP3', '.MP4', '.WOFF', '.WOFF2', '.TTF', '.OTF', '.EOT', '.WEBP', '.WAV', '.GZ', '.BROTLI', '.BVR', '.TS', '.BMP'] ? 'true' : 'false'", + "Upper(evt.Parsed.program) == 'BAIKAL'", + "Upper(evt.Parsed.program) == 'GITLAB'", + "Upper(evt.Parsed.program) == 'MONGODB'", + "Upper(evt.Parsed.program) == 'NAMED'", + "Upper(evt.Parsed.program) == 'NEXTCLOUD'", + "Upper(evt.Parsed.program) == 'PAPERLESS-NGX'", + "Upper(evt.Parsed.program) == 'UPTIME-KUMA'", + "Upper(evt.Parsed.program) == 'VAULTWARDEN'", + "Upper(evt.Parsed.program) == 'WEBMIN'", + "XMLGetAttributeValue(evt.Line.Raw, \"/Event/System[1]/Provider\", \"Name\")", + "XMLGetAttributeValue(evt.Line.Raw, \"/Event/System[1]/Security\", \"UserID\")", + "XMLGetAttributeValue(evt.Line.Raw, \"/Event/System[1]/TimeCreated\", \"SystemTime\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[1]\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[2]\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[3]\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Archived']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='CallTrace']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ClientInfo']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='CommandLine']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Company']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Configuration']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ConfigurationFileHash']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Consumer']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='CreationUtcTime']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='CurrentDirectory']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Description']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Destination']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='DestinationHostname']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='DestinationIp']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='DestinationIsIpv6']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='DestinationPort']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='DestinationPortName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Details']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Device']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='EventNamespace']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='EventType']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='FileVersion']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Filter']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='GrantedAccess']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Hashes']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Image']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ImageLoaded']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Initiated']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='IntegrityLevel']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='IpAddress']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='IsExecutable']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='LogonGuid']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='LogonId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Name']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='NewName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='NewThreadId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Operation']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='OriginalFileName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ParentCommandLine']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ParentImage']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ParentProcessGuid']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ParentProcessId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ParentUser']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='PipeName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ProcessGuid']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='ProcessId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Protocol']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Query']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='QueryName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='QueryResults']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='QueryStatus']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='RuleName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SchemaVersion']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Session']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Signature']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SignatureStatus']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Signed']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceHostname']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceImage']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceIp']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceIsIpv6']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourcePort']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourcePortName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceProcessGUID']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceProcessGuid']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceProcessId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='SourceThreadId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='StartAddress']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='StartFunction']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='StartModule']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='State']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetFilename']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetImage']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetObject']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetProcessGUID']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetProcessGuid']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetProcessId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TargetUserName']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='TerminalSessionId']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Type']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='User']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='Version']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='c-ip']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='cs-method']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='cs-uri-query']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='cs-uri-stem']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='csUser-Agent']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='date']\") + \" \" + XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='time']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='s-sitename']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/EventData[1]/Data[@Name='sc-status']\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/System[1]/Channel\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/System[1]/Computer\")", + "XMLGetNodeValue(evt.Line.Raw, \"/Event/System[1]/EventID\")", + "all(evt.Overflow.Alert.Events, {.GetMeta('parent_progname') in ['/usr/bin/dpkg', '/usr/bin/dnf']})", + "any(File('cloudflare_ip6s.txt'), { IpInRange(evt.Overflow.Alert.Source.IP ,#)})", + "any(File('cloudflare_ips.txt'), { IpInRange(evt.Overflow.Alert.Source.IP ,#)})", + "any(File('ip_seo_bots.txt'), { len(#) > 0 && IpInRange(evt.Overflow.Alert.Source.IP ,#)})", + "any(File('rdns_seo_bots.txt'), { len(#) > 0 && evt.Enriched.reverse_dns endsWith #})", + "any(['Authentication failure', 'Password mismatch', 'password mismatch', 'auth failed', 'unknown user'], {evt.Parsed.dovecot_login_message contains #}) ? 'auth_failed' : ''", + "evt.Enriched.ASNNumber", + "evt.Enriched.ASNOrg", + "evt.Enriched.GeoCoords", + "evt.Enriched.IsInEU", + "evt.Enriched.IsoCode", + "evt.Enriched.MarshaledTime", + "evt.Enriched.SourceRange", + "evt.Enriched.reverse_dns", + "evt.Enriched.reverse_dns endsWith '.ptr.discord.com.'", + "evt.GetType() == 'overflow' && evt.Overflow.Alert.Remediation == true", + "evt.Line.Labels.external_format == 'fastly'", + "evt.Line.Labels.program", + "evt.Line.Labels.type", + "evt.Line.Labels.type != 'syslog'", + "evt.Line.Labels.type == 'aws-alb'", + "evt.Line.Labels.type == 'containerd'", + "evt.Line.Labels.type == 'docker'", + "evt.Line.Labels.type == 'syslog'", + "evt.Line.Labels.type == 'unifi'", + "evt.Line.Module", + "evt.Line.Module != 'wineventlog'", + "evt.Line.Module == 'wineventlog'", + "evt.Line.Raw", + "evt.Line.Src", + "evt.Meta.error in ['user_not_found', 'invalid_user_credentials']", + "evt.Meta.http_path + '?' + evt.Parsed.http_args", + "evt.Meta.http_status == '200' && evt.Parsed.static_ressource == 'false' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/photos/api/v1/preview' && evt.Parsed.http_args contains '&x=' && evt.Parsed.http_args contains '&y=' && evt.Parsed.http_args contains 'etag='", + "evt.Meta.http_status == '403' && evt.Meta.http_verb == 'POST' && evt.Meta.http_path contains \"/Sessions/Playing/Progress\"", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/files_trashbin/preview' && evt.Parsed.http_args contains 'fileId=' && evt.Parsed.http_args contains '&file='", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/files_versions/preview' && evt.Parsed.http_args contains 'version'", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path contains '/apps/photos/api/v1/preview' && evt.Parsed.http_args contains 'x' && evt.Parsed.http_args contains 'y'", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path matches '\\\\/apps\\\\/files\\\\/api\\\\/v1\\\\/thumbnail\\\\/(\\\\d+)/(\\\\d+)'", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Meta.http_path startsWith '/apps/mail/api/avatars/url/'", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Parsed.file_ext == '.vcf' && evt.Parsed.http_args contains \"photo\"", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Parsed.request == '/ocs/v2.php/apps/text/workspace' && evt.Parsed.http_args contains 'path=%2F'", + "evt.Meta.http_status == '404' && evt.Meta.http_verb == 'GET' && evt.Parsed.request contains '/core/preview' && evt.Parsed.http_args contains 'x=' && evt.Parsed.http_args contains 'y=' && evt.Parsed.http_args contains 'fileId='", + "evt.Meta.http_status == '404' && evt.Meta.http_verb in ['PROPFIND', 'GET'] && evt.Meta.http_path matches '^/remote.php/(web)?dav/'", + "evt.Meta.http_status in ['404', '403', '502'] ? 'false' : 'true'", + "evt.Meta.log_subtype == 'zm_bad_password'", + "evt.Meta.log_subtype == 'zm_bad_user'", + "evt.Meta.log_type == 'gotify_failed_auth'", + "evt.Meta.log_type == \"palo_alto\" && evt.Meta.severity in [\"medium\", \"high\", \"critical\"]", + "evt.Meta.log_type == 'ADMIN_LOGIN_FAILED'", + "evt.Meta.log_type == 'CVE-2021-4034-xpl'", + "evt.Meta.log_type == 'PAYMENT_FAILED'", + "evt.Meta.log_type == 'PAYMENT_FAILED' and evt.Meta.ASNNumber != '' ", + "evt.Meta.log_type == 'PAYMENT_FAILED' and evt.Meta.IsoCode != '' ", + "evt.Meta.log_type == 'adguardhome_failed_auth'", + "evt.Meta.log_type == 'apache-guacamole_failed_auth'", + "evt.Meta.log_type == 'asterisk_failed_auth'", + "evt.Meta.log_type == 'auth_bf_attempt'", + "evt.Meta.log_type == 'auth_bf_log'", + "evt.Meta.log_type == 'aws-cloudtrail'", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\n (evt.Unmarshaled.cloudtrail.errorCode != nil && evt.Unmarshaled.cloudtrail.errorCode matches \".*UnauthorizedOperation$\") ||\n (evt.Unmarshaled.cloudtrail.errorCode != nil && evt.Unmarshaled.cloudtrail.errorCode matches \"^AccessDenied.*\")\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\n evt.Meta.event_name == \"DeleteGroupPolicy\" ||\n evt.Meta.event_name == \"DeleteRolePolicy\" ||\n evt.Meta.event_name == \"DeleteUserPolicy\" ||\n evt.Meta.event_name == \"PutGroupPolicy\" ||\n evt.Meta.event_name == \"PutRolePolicy\" ||\n evt.Meta.event_name == \"PutUserPolicy\" ||\n evt.Meta.event_name == \"CreatePolicy\" ||\n evt.Meta.event_name == \"DeletePolicy\" ||\n evt.Meta.event_name == \"CreatePolicyVersion\" ||\n evt.Meta.event_name == \"DeletePolicyVersion\" ||\n evt.Meta.event_name == \"AttachRolePolicy\" ||\n evt.Meta.event_name == \"DetachRolePolicy\" ||\n evt.Meta.event_name == \"AttachUserPolicy\" ||\n evt.Meta.event_name == \"DetachUserPolicy\" ||\n evt.Meta.event_name == \"AttachGroupPolicy\" ||\n evt.Meta.event_name == \"DetachGroupPolicy\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\nevt.Meta.event_name == \"AuthorizeSecurityGroupIngress\" ||\nevt.Meta.event_name == \"AuthorizeSecurityGroupEgress\" ||\nevt.Meta.event_name == \"RevokeSecurityGroupIngress\" ||\nevt.Meta.event_name == \"RevokeSecurityGroupEgress\" ||\nevt.Meta.event_name == \"CreateSecurityGroup\" ||\nevt.Meta.event_name == \"DeleteSecurityGroup\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\nevt.Meta.event_name == \"CreateCustomerGateway\" ||\nevt.Meta.event_name == \"DeleteCustomerGateway\" ||\nevt.Meta.event_name == \"AttachInternetGateway\" ||\nevt.Meta.event_name == \"CreateInternetGateway\" ||\nevt.Meta.event_name == \"DeleteInternetGateway\" ||\nevt.Meta.event_name == \"DetachInternetGateway\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\nevt.Meta.event_name == \"CreateNetworkAcl\" ||\nevt.Meta.event_name == \"CreateNetworkAclEntry\" ||\nevt.Meta.event_name == \"DeleteNetworkAcl\" ||\nevt.Meta.event_name == \"DeleteNetworkAclEntry\" ||\nevt.Meta.event_name == \"ReplaceNetworkAclEntry\" ||\nevt.Meta.event_name == \"ReplaceNetworkAclAssociation\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\nevt.Meta.event_name == \"CreateRoute\" ||\nevt.Meta.event_name == \"CreateRouteTable\" ||\nevt.Meta.event_name == \"ReplaceRoute\" ||\nevt.Meta.event_name == \"ReplaceRouteTableAssociation\" ||\nevt.Meta.event_name == \"DeleteRouteTable\" ||\nevt.Meta.event_name == \"DeleteRoute\" ||\nevt.Meta.event_name == \"DisassociateRouteTable\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\nevt.Meta.event_name == \"CreateTrail\" ||\nevt.Meta.event_name == \"UpdateTrail\" ||\nevt.Meta.event_name == \"DeleteTrail\" ||\nevt.Meta.event_name == \"StartLogging\" ||\nevt.Meta.event_name == \"StopLogging\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(\nevt.Meta.event_name == \"CreateVpc\" ||\nevt.Meta.event_name == \"DeleteVpc\" ||\nevt.Meta.event_name == \"ModifyVpcAttribute\" ||\nevt.Meta.event_name == \"AcceptVpcPeeringConnection\" ||\nevt.Meta.event_name == \"CreateVpcPeeringConnection\" ||\nevt.Meta.event_name == \"DeleteVpcPeeringConnection\" ||\nevt.Meta.event_name == \"RejectVpcPeeringConnection\" ||\nevt.Meta.event_name == \"AttachClassicLinkVpc\" ||\nevt.Meta.event_name == \"DetachClassicLinkVpc\" ||\nevt.Meta.event_name == \"DisableVpcClassicLink\" ||\nevt.Meta.event_name == \"EnableVpcClassicLink\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\n(evt.Meta.event_name == 'ConsoleLogin' || evt.Meta.event_name == 'GetSessionToken' || evt.Meta.event_name == 'GetFederationToken') &&\nevt.Unmarshaled.cloudtrail.responseElements?.ConsoleLogin == 'Success' &&\n(\n (evt.Time.Hour() >= 18 || evt.Time.Hour() < 6) || \n (evt.Time.Weekday().String() == 'Saturday' || evt.Time.Weekday().String() == 'Sunday')\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\nevt.Meta.event_name == \"ConsoleLogin\" &&\nevt.Unmarshaled.cloudtrail.additionalEventData.MFAUsed != \"Yes\" &&\nevt.Unmarshaled.cloudtrail.userIdentity.type == \"IAMUser\" &&\nevt.Unmarshaled.cloudtrail.responseElements.ConsoleLogin == \"Success\"\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\nevt.Unmarshaled.cloudtrail.eventSource == \"kms.amazonaws.com\" &&\n(evt.Meta.event_name == \"DisableKey\" || evt.Meta.event_name == \"ScheduleKeyDeletion\")\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\nevt.Unmarshaled.cloudtrail.eventSource == \"s3.amazonaws.com\" &&\n(\n evt.Meta.event_name == \"PutBucketAcl\" ||\n evt.Meta.event_name == \"PutBucketPolicy\" ||\n evt.Meta.event_name == \"PutBucketCors\" ||\n evt.Meta.event_name == \"PutBucketLifecycle\" ||\n evt.Meta.event_name == \"PutBucketReplication\" ||\n evt.Meta.event_name == \"DeleteBucketPolicy\" ||\n evt.Meta.event_name == \"DeleteBucketCors\" ||\n evt.Meta.event_name == \"DeleteBucketLifecycle\" ||\n evt.Meta.event_name == \"DeleteBucketReplication\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' &&\nevt.Unmarshaled.cloudtrail.userIdentity.type == \"Root\" &&\nevt.Unmarshaled.cloudtrail.userIdentity.invokedBy == nil &&\nevt.Unmarshaled.cloudtrail.eventType != \"AwsServiceEvent\"\n", + "evt.Meta.log_type == 'aws-cloudtrail' && \nevt.Meta.event_name == \"ConsoleLogin\" && \nevt.Unmarshaled.cloudtrail.errorMessage == \"Failed authentication\"\n", + "evt.Meta.log_type == 'aws-cloudtrail' && \nevt.Unmarshaled.cloudtrail.eventSource == \"config.amazonaws.com\" &&\n(\n evt.Meta.event_name == \"StopConfigurationRecorder\" ||\n evt.Meta.event_name == \"DeleteDeliveryChannel\" ||\n evt.Meta.event_name == \"PutDeliveryChannel\" ||\n evt.Meta.event_name == \"PutConfigurationRecorder\"\n)\n", + "evt.Meta.log_type == 'aws-cloudtrail' && (\n (evt.Meta.event_name == 'ConsoleLogin' && evt.Unmarshaled.cloudtrail.responseElements.ConsoleLogin == 'Failure') || \n (evt.Meta.event_name == 'GetSessionToken' && evt.Meta.error_code=='AccessDenied') || \n (evt.Meta.event_name == 'GetFederationToken' && evt.Meta.error_code=='AccessDenied')\n)\n", + "evt.Meta.log_type == 'baikal_failed_auth'", + "evt.Meta.log_type == 'bind9_denied'", + "evt.Meta.log_type == 'cas_failed-auth'", + "evt.Meta.log_type == 'dovecot_logs' && evt.Meta.dovecot_login_result == 'auth_failed'", + "evt.Meta.log_type == 'emby_failed_auth'", + "evt.Meta.log_type == 'endlessh_accept'", + "evt.Meta.log_type == 'execve'", + "evt.Meta.log_type == 'execve' && evt.Meta.exe == '/usr/bin/pgrep'", + "evt.Meta.log_type == 'execve' && evt.Meta.exe in ['/usr/bin/rm', '/bin/rm']", + "evt.Meta.log_type == 'execve' and ( evt.Meta.exe startsWith \"/tmp/\" or evt.Meta.exe contains \"/.\" )", + "evt.Meta.log_type == 'exim_failed_auth'", + "evt.Meta.log_type == 'ftp_failed_auth'", + "evt.Meta.log_type == 'gitea_failed_auth'", + "evt.Meta.log_type == 'gitlab_failed_password'", + "evt.Meta.log_type == 'grafana_failed_auth'", + "evt.Meta.log_type == 'harbor_failed_auth'", + "evt.Meta.log_type == 'home-assistant_failed_auth'", + "evt.Meta.log_type == 'http_access-log' && Upper(evt.Parsed.http_args) contains 'AUTHOR='", + "evt.Meta.log_type == 'http_access-log' && evt.Meta.http_path startsWith '/apps/login' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '200'", + "evt.Meta.log_type == 'http_access-log' && evt.Meta.http_status in ['400','405'] && (evt.Parsed.verb == 'CONNECT' || evt.Parsed.request matches '^http[s]?://')", + "evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name == 'wp-login.php' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '200'", + "evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name == 'xmlrpc.php' && evt.Parsed.verb == 'POST'", + "evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name contains 'w00tw00t.at.ISC.SANS.DFind'", + "evt.Meta.log_type == 'http_access-log' && evt.Parsed.file_name contains 'wp-config.php'", + "evt.Meta.log_type == 'http_access-log' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '401'", + "evt.Meta.log_type == 'http_access-log' && evt.Parsed.verb == 'POST' && evt.Meta.http_status == '403'", + "evt.Meta.log_type == 'http_error-log' && evt.Parsed.program == 'nginx'", + "evt.Meta.log_type == 'immich_failed_auth'", + "evt.Meta.log_type == 'iptables_drop' && evt.Meta.service == 'tcp'", + "evt.Meta.log_type == 'jellyfin_failed_auth'", + "evt.Meta.log_type == 'jellyseerr_failed_auth'", + "evt.Meta.log_type == 'k8s-audit' &&\n(\n (\n evt.Meta.datasource_type == \"k8s-audit\" &&\n evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' &&\n evt.Unmarshaled.k8s_audit.RequestObject != nil &&\n evt.Unmarshaled.k8s_audit.RequestObject.spec != nil &&\n evt.Unmarshaled.k8s_audit.RequestObject.spec.volumes != nil &&\n any(evt.Unmarshaled.k8s_audit.RequestObject.spec.volumes, { .hostPath != nil && .hostPath.path in [\"/proc\", \"/var/run/docker.sock\", \"/\", \"/etc\", \"/root\", \"/var/run/crio/crio.sock\", \"/home/admin\", \"/var/lib/kubelet\", \"/var/lib/kubelet/pki\", \"/etc/kubernetes\", \"/etc/kubernetes/manifests\"] })\n )\n ||\n (\n evt.Meta.datasource_type != \"k8s-audit\" &&\n evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' &&\n evt.Unmarshaled.k8s_audit.requestObject != nil &&\n evt.Unmarshaled.k8s_audit.requestObject.spec != nil &&\n evt.Unmarshaled.k8s_audit.requestObject.spec.volumes != nil &&\n any(evt.Unmarshaled.k8s_audit.requestObject.spec.volumes, { .hostPath != nil && .hostPath.path in [\"/proc\", \"/var/run/docker.sock\", \"/\", \"/etc\", \"/root\", \"/var/run/crio/crio.sock\", \"/home/admin\", \"/var/lib/kubelet\", \"/var/lib/kubelet/pki\", \"/etc/kubernetes\", \"/etc/kubernetes/manifests\"] })\n )\n)\n", + "evt.Meta.log_type == 'k8s-audit' &&\n(\n (\n evt.Meta.datasource_type == \"k8s-audit\" &&\n evt.Unmarshaled.k8s_audit.Verb == 'create' &&\n evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' &&\n evt.Unmarshaled.k8s_audit.RequestObject != nil &&\n evt.Unmarshaled.k8s_audit.RequestObject.spec != nil &&\n any(evt.Unmarshaled.k8s_audit.RequestObject.spec.containers, { .securityContext != nil && .securityContext.privileged == true })\n )\n ||\n (\n evt.Meta.datasource_type != \"k8s-audit\" &&\n evt.Unmarshaled.k8s_audit.verb == 'create' &&\n evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' &&\n evt.Unmarshaled.k8s_audit.requestObject != nil &&\n evt.Unmarshaled.k8s_audit.requestObject.spec != nil &&\n any(evt.Unmarshaled.k8s_audit.requestObject.spec.containers, { .securityContext != nil && .securityContext.privileged == true })\n )\n)\n", + "evt.Meta.log_type == 'k8s-audit' &&\n(\n (evt.Meta.datasource_type == \"k8s-audit\" && evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' && evt.Unmarshaled.k8s_audit.ObjectRef?.Subresource == 'exec')\n ||\n (evt.Meta.datasource_type != \"k8s-audit\" && evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' && evt.Unmarshaled.k8s_audit.objectRef?.subresource == 'exec')\n)\n", + "evt.Meta.log_type == 'k8s-audit' &&\n(\n (evt.Meta.datasource_type == \"k8s-audit\" && evt.Unmarshaled.k8s_audit.ObjectRef?.Resource not in [\"healthz\", \"livez\", \"readyz\"]) \n || \n (evt.Meta.datasource_type != \"k8s-audit\" && evt.Unmarshaled.k8s_audit.objectRef?.resource not in [\"healthz\", \"livez\", \"readyz\"])\n)\n&& evt.Meta.user in [\"system:anonymous\", \"system:unauthenticated\"]\n", + "evt.Meta.log_type == 'k8s-audit' &&\n(\n (evt.Meta.datasource_type == \"k8s-audit\" && evt.Unmarshaled.k8s_audit.Verb == 'create' && evt.Unmarshaled.k8s_audit.ObjectRef?.Resource == 'pods' && evt.Unmarshaled.k8s_audit.RequestObject?.spec?.hostNetwork == true)\n ||\n (evt.Meta.datasource_type != \"k8s-audit\" && evt.Unmarshaled.k8s_audit.verb == 'create' && evt.Unmarshaled.k8s_audit.objectRef?.resource == 'pods' && evt.Unmarshaled.k8s_audit.requestObject?.spec?.hostNetwork == true)\n)\n", + "evt.Meta.log_type == 'k8s-audit' &&\nevt.Meta.user startsWith \"system:serviceaccount:\" &&\n(\n (evt.Meta.datasource_type == \"k8s-audit\" && evt.Unmarshaled.k8s_audit.Annotations[\"authorization.k8s.io/decision\"] == \"forbid\")\n ||\n (evt.Meta.datasource_type != \"k8s-audit\" && evt.Unmarshaled.k8s_audit.annotations[\"authorization.k8s.io/decision\"] == \"forbid\")\n)\n", + "evt.Meta.log_type == 'k8s-audit' && \n(\n (evt.Meta.datasource_type == \"k8s-audit\" && evt.Unmarshaled.k8s_audit.ResponseStatus.code in [401, 403])\n ||\n (evt.Meta.datasource_type != \"k8s-audit\" && evt.Unmarshaled.k8s_audit.responseStatus.code in [401, 403])\n)\n", + "evt.Meta.log_type == 'mail_auth' && evt.Meta.sub_type == 'auth_fail'", + "evt.Meta.log_type == 'mailu_admin_auth_attempt'", + "evt.Meta.log_type == 'mariadb_failed_auth'", + "evt.Meta.log_type == 'meshcentral_failed_auth'", + "evt.Meta.log_type == 'mikrotik_drop' && evt.Meta.service == 'tcp_udp'", + "evt.Meta.log_type == 'mikrotik_failed_auth'", + "evt.Meta.log_type == 'modsecurity' && (evt.Parsed.ruleseverity == 'CRITICAL' || evt.Parsed.ruleseverity == '2')", + "evt.Meta.log_type == 'mongodb_failed_auth'", + "evt.Meta.log_type == 'mssql_failed_auth'", + "evt.Meta.log_type == 'mysql_failed_auth'", + "evt.Meta.log_type == 'nextcloud_domain_error'", + "evt.Meta.log_type == 'nextcloud_failed_auth'", + "evt.Meta.log_type == 'odoo_failed_auth'", + "evt.Meta.log_type == 'ombi_auth_failed'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'bot protection'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'cross site redirect'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'cross site request forgery'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'cross site scripting'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'error disclosure'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'error limit'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'evasion techniques'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'general'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'http limit violation'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'illegal http method violation'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'ldap injection'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'open redirect'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'path traversal'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'remote code execution'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'request rate limit'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'schema validation'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'sql injection'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'url instead of file'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'vulnerability scanning'", + "evt.Meta.log_type == 'openappsec_security_log' and Lower(evt.Meta.security_action) in ['prevent', 'detect'] and Lower(evt.Meta.incident_type) contains 'xml external entity'", + "evt.Meta.log_type == 'opnsense-gui-failed-auth'", + "evt.Meta.log_type == 'paperless_ngx_failed_auth'", + "evt.Meta.log_type == 'pf' and evt.Parsed.action == 'block'", + "evt.Meta.log_type == 'pf_drop' && evt.Meta.service == 'tcp_udp'", + "evt.Meta.log_type == 'pftpd_failed-auth'", + "evt.Meta.log_type == 'pgsql_failed_auth'", + "evt.Meta.log_type == 'pterodactly_wings_invalid_format'", + "evt.Meta.log_type == 'pterodactly_wings_invalid_username_or_password'", + "evt.Meta.log_type == 'pve_failed-auth'", + "evt.Meta.log_type == 'redmine_failed_auth'", + "evt.Meta.log_type == 'smb_failed_auth'", + "evt.Meta.log_type == 'spam-attempt' && evt.Meta.service == 'exim'", + "evt.Meta.log_type == 'ssh_bad_keyexchange'", + "evt.Meta.log_type == 'ssh_failed-auth'", + "evt.Meta.log_type == 'sshesame_cmd'", + "evt.Meta.log_type == 'sshesame_input'", + "evt.Meta.log_type == 'sshesame_login'", + "evt.Meta.log_type == 'suricata_alert' && evt.Parsed.proto == 'TCP' && evt.Meta.suricata_rule_severity == '1'", + "evt.Meta.log_type == 'suricata_alert' && evt.Parsed.proto == 'TCP' && evt.Meta.suricata_rule_severity == '2'", + "evt.Meta.log_type == 'synology-dsm_failed_auth'", + "evt.Meta.log_type == 'telnet_new_session'", + "evt.Meta.log_type == 'thehive_failed_auth'", + "evt.Meta.log_type == 'ts3_fail_auth'", + "evt.Meta.log_type == 'vaultwarden_failed_auth'", + "evt.Meta.log_type == 'waf_naxsi-log' && len(evt.Parsed.naxsi_id) > 4", + "evt.Meta.log_type == 'webmin_failed_auth_wrong_pass'", + "evt.Meta.log_type == 'windows_failed_auth'", + "evt.Meta.log_type == 'wireguard_failed_auth'", + "evt.Meta.log_type == 'zimbra_auth_fail'", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"]\nand \n (\n ( Upper(evt.Meta.http_verb) == \"POST\" and\n Upper(evt.Meta.http_path) matches Upper('^(?P/.*index.php)?.*(?Pfile=.*</td></tr(?P.*)>)')\n )\n or \n Upper(evt.Parsed.rawrequest) matches Upper('^(?PPOST) (?P/.*index.php)?.*(?Pfile=.*</td></tr(?P.*)>)')\n )\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"]\nand \n(\n( Upper(evt.Meta.http_verb) == \"POST\" and\nUpper(evt.Meta.http_path) matches Upper('^(?P/.*index.php)?.*(?Pview=request|request=log|task=create)+.*(?Pview=request|request=log|task=create)+.*(?Pview=request|request=log|task=create)+.*')\n\n)\nor\nUpper(evt.Parsed.rawrequest) matches Upper('^(?PPOST) (?P/.*index.php)?.*(?Pview=request|request=log|task=create)+.*(?Pview=request|request=log|task=create)+.*(?Pview=request|request=log|task=create)+.*')\n)\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"]\nand Upper(evt.Meta.http_verb) == \"GET\"\nand Upper(evt.Meta.http_path) matches Upper('.*action=.*')\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] && RegexpInFile(evt.Parsed.http_user_agent, \"bad_user_agents.regex.txt\")", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and\n (Upper(evt.Meta.http_path) contains 'CLASS.MODULE.CLASSLOADER.')\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n (\n Upper(evt.Meta.http_path) matches Upper('/tmui/login.jsp/..;/tmui/[^.]+.jsp\\\\?(fileName|command|directoryPath|tabId)=')\n or\n Upper(evt.Meta.http_path) matches Upper('/tmui/login.jsp/%2E%2E;/tmui/[^.]+.jsp\\\\?(fileName|command|directoryPath|tabId)=')\n )\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n (Upper(evt.Meta.http_path) contains \"/.%2E/.%2E/\"\n or\n Upper(evt.Meta.http_path) contains \"/%2E%2E/%2E%2E\")\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n (Upper(evt.Meta.http_path) matches '/PUBLIC/PLUGINS/[^/]+/../[./]+/'\n or\n Upper(evt.Meta.http_path) matches '/PUBLIC/PLUGINS/[^/]+/%2E%2E/[%2E/]+/')\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n (Upper(evt.Meta.http_path) matches Upper('/dana-na/../dana/html5acc/guacamole/../../../../../../../[^?]+\\\\?/dana/html5acc/guacamole/')\n or\n Upper(evt.Meta.http_path) matches Upper('/dana-na/%2E%2E/dana/html5acc/guacamole/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/[^?]+\\\\?/dana/html5acc/guacamole/'))\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n Upper(evt.Meta.http_path) contains \"/%%32%65%%32%65/\"\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n Upper(evt.Meta.http_path) contains Upper('/remote/fgt_lang?lang=/../../../..//////////dev/cmdb/sslvpn_websession')\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \n(\n any(File(\"log4j2_cve_2021_44228.txt\"), { Upper(evt.Meta.http_path) contains Upper(#)})\nor\n any(File(\"log4j2_cve_2021_44228.txt\"), { Upper(evt.Parsed.http_user_agent) contains Upper(#)})\nor\n any(File(\"log4j2_cve_2021_44228.txt\"), { Upper(evt.Parsed.http_referer) contains Upper(#)}) \n)\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and \nUpper(evt.Meta.http_path) startsWith Upper('/api/v2/cmdb/system/admin/') and Lower(evt.Parsed.http_user_agent) == 'report runner'\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and any(File(\"backdoors.txt\"), { evt.Parsed.file_name == #})", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and any(File(\"jira_cve_2021-26086.txt\"), {Upper(evt.Meta.http_path) contains Upper(#)})\n", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and any(File(\"sensitive_data.txt\"), { evt.Parsed.request endsWith #})", + "evt.Meta.log_type in [\"http_access-log\", \"http_error-log\"] and any(File(\"thinkphp_cve_2018-20062.txt\"), {Upper(evt.Meta.http_path) matches Upper(#)})\n", + "evt.Meta.log_type in ['authelia_failed_clf_auth', 'authelia_failed_json_auth']", + "evt.Meta.log_type in ['baikal_failed_auth', 'baikal_failed_auth_no_user']", + "evt.Meta.log_type in ['bitwarden_failed_auth','bitwarden_failed_auth_2fa']", + "evt.Meta.log_type in ['gitlab_failed_password', 'gitlab_failed_totp']", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && Lower(QueryUnescape(evt.Meta.http_path)) startsWith Lower('/setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=')\n", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && Upper(QueryUnescape(evt.Meta.http_path)) startsWith Upper('/Telerik.Web.UI.WebResource.axd?type=rau')\n", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && Upper(QueryUnescape(evt.Meta.http_path)) startsWith Upper('/catalog-portal/ui/oauth/verify?error=&deviceUdid=${\"freemarker.template.utility.Execute\"?new()(')\n", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && any(File('http_path_traversal.txt'),{evt.Meta.http_path contains #})", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && any(File('sqli_probe_patterns.txt'), {Upper(evt.Parsed.http_args) contains Upper(#)})", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && any(File('xss_probe_patterns.txt'), {Upper(evt.Parsed.http_args) contains Upper(#)})", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && evt.Meta.http_path matches '/ui/vcav-bootstrap/rest/vcav-providers/provider-logo\\\\?url=(file|http)'\n", + "evt.Meta.log_type in ['http_access-log', 'http_error-log'] && evt.Parsed.static_ressource == 'false' && evt.Parsed.verb in ['GET', 'HEAD']", + "evt.Meta.log_type in ['nextcloud_failed_auth', 'nextcloud_bruteforce_attempt']", + "evt.Meta.log_type in ['prowlarr_failed_authentication']", + "evt.Meta.log_type in ['radarr_failed_authentication']", + "evt.Meta.log_type in ['sonarr_failed_authentication']", + "evt.Meta.log_type in ['uptime_kuma_failed_password', 'uptime_kuma_failed_totp']", + "evt.Meta.log_type in ['vaultwarden_failed_auth', 'vaultwarden_failed_admin_auth', 'vaultwarden_failed_totp']", + "evt.Meta.log_type_enh == 'spam-attempt' || evt.Meta.log_type == 'postfix' && evt.Meta.action == 'reject'", + "evt.Meta.metric_name in ['account.login.failed_invalid_user', 'account.login.failed_invalid_password']", + "evt.Meta.ppid", + "evt.Meta.service == 'exchange' && evt.Meta.sub_type == 'auth_fail'", + "evt.Meta.service == 'freeswitch' && evt.Meta.sub_type == 'acl_reject'", + "evt.Meta.service == 'freeswitch' && evt.Meta.sub_type == 'auth_failure'", + "evt.Meta.service == 'freeswitch' && evt.Meta.sub_type == 'user_enumeration'", + "evt.Meta.service == 'http' && evt.Meta.http_status in ['404', '403', '400'] && evt.Parsed.static_ressource == 'false'", + "evt.Meta.service == 'http' && evt.Meta.log_type in ['http_access-log', 'http_error-log']", + "evt.Meta.service == 'http' && evt.Meta.sub_type == 'auth_fail'", + "evt.Meta.service == 'http' && evt.Meta.sub_type == 'litespeed_admin_auth_fail'", + "evt.Meta.service == 'llng' and evt.Meta.log_type == 'llng_auth_fail'", + "evt.Meta.service == 'postscreen' && evt.Meta.pregreet == 'PREGREET'", + "evt.Meta.service == 'sysmon' && evt.Parsed.EventID == '1' &&\nevt.Parsed.ParentImage endsWith \"\\\\svchost.exe\" &&\nevt.Parsed.Image endsWith \"\\\\rundll32.exe\" &&\nevt.Parsed.CommandLine contains \"C:\\\\windows\\\\system32\\\\davclnt.dll,DavSetCookie\" &&\nevt.Parsed.CommandLine matches '://\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}' &&\n(not (evt.Parsed.CommandLine contains \"://10.\" ||\n evt.Parsed.CommandLine contains \"://192.168.\" ||\n evt.Parsed.CommandLine contains \"://172.16.\" ||\n evt.Parsed.CommandLine contains \"://172.17.\" ||\n evt.Parsed.CommandLine contains \"://172.18.\" ||\n evt.Parsed.CommandLine contains \"://172.19.\" ||\n evt.Parsed.CommandLine contains \"://172.20.\" ||\n evt.Parsed.CommandLine contains \"://172.21.\" ||\n evt.Parsed.CommandLine contains \"://172.22.\" ||\n evt.Parsed.CommandLine contains \"://172.23.\" ||\n evt.Parsed.CommandLine contains \"://172.24.\" ||\n evt.Parsed.CommandLine contains \"://172.25.\" ||\n evt.Parsed.CommandLine contains \"://172.26.\" ||\n evt.Parsed.CommandLine contains \"://172.27.\" ||\n evt.Parsed.CommandLine contains \"://172.28.\" ||\n evt.Parsed.CommandLine contains \"://172.29.\" ||\n evt.Parsed.CommandLine contains \"://172.30.\" ||\n evt.Parsed.CommandLine contains \"://172.31.\" ||\n evt.Parsed.CommandLine contains \"://127.\" ||\n evt.Parsed.CommandLine contains \"://169.254.\"))\n", + "evt.Meta.service == 'sysmon' && evt.Parsed.EventID == '1' && \nUpper(evt.Parsed.Image) endsWith 'MSDT.EXE' && \nUpper(evt.Parsed.ParentImage) endsWith 'WINWORD.EXE' &&\n(Upper(evt.Parsed.CommandLine) contains 'PCWDIAGNOSTIC' && Upper(evt.Parsed.CommandLine) contains 'IT_REBROWSEFORFILE' && Upper(evt.Parsed.CommandLine) contains 'IT_BROWSEFORFILE')\n", + "evt.Meta.service in [\"tcp\", \"udp\"] && evt.Unmarshaled.iptables.OUT == \"\" ? \"iptables_drop\" : \"\"", + "evt.Meta.source_ip", + "evt.Meta.sub_type == 'req_limit_exceeded'", + "evt.Meta.target_user", + "evt.Meta.user_arn", + "evt.Overflow.Alert.GetScenario() == 'crowdsecurity/auditd-sus-exec' && all(evt.Overflow.Alert.Events, {.GetMeta('exe') matches '\\\\.nvm\\\\/versions\\\\/node\\\\/v(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\\\\/bin\\\\/node$'})", + "evt.Overflow.Alert.Remediation == true && IsIPV6(evt.Overflow.Alert.Source.IP)", + "evt.Overflow.Alert.Remediation == true && evt.Overflow.Alert.GetScope() == 'Ip'", + "evt.Overflow.Alert.Source.IP", + "evt.Parsed.Channel == 'Application' && evt.Parsed.Source == 'MSSQLSERVER' && evt.Parsed.EventID == '18456'", + "evt.Parsed.Channel == 'Microsoft-Windows-Sysmon/Operational'", + "evt.Parsed.Channel == 'Security' && evt.Parsed.EventID == '4625'", + "evt.Parsed.User", + "evt.Parsed.action", + "evt.Parsed.app", + "evt.Parsed.asterisk_service", + "evt.Parsed.asterisk_session_id", + "evt.Parsed.auth_method", + "evt.Parsed.auth_result", + "evt.Parsed.cas_client_ip", + "evt.Parsed.cas_invalid_user", + "evt.Parsed.client", + "evt.Parsed.client_ip", + "evt.Parsed.clientip", + "evt.Parsed.cri_timestamp", + "evt.Parsed.date", + "evt.Parsed.date + ' ' + evt.Parsed.time", + "evt.Parsed.datetime", + "evt.Parsed.day + \" \" + evt.Parsed.month + \" \" + evt.Parsed.monthday + \" \" + evt.Parsed.time + \".000000\" + \" \" + evt.Parsed.year", + "evt.Parsed.db_name", + "evt.Parsed.dest_ip", + "evt.Parsed.dest_port", + "evt.Parsed.dovecot_remote_ip", + "evt.Parsed.dst_country", + "evt.Parsed.dst_port", + "evt.Parsed.elb_status_code", + "evt.Parsed.email", + "evt.Parsed.error", + "evt.Parsed.event_inc_id", + "evt.Parsed.fastly_timestamp + \".00+\" + evt.Parsed.tz_part1 + \":\" + evt.Parsed.tz_part2", + "evt.Parsed.file_frag + evt.Parsed.file_ext", + "evt.Parsed.haproxy_monthday + '/' + evt.Parsed.haproxy_month + '/' + evt.Parsed.haproxy_year + ':' + evt.Parsed.haproxy_hour + ':' + evt.Parsed.haproxy_minute + ':' + evt.Parsed.haproxy_second[0:2] + ' -0000'", + "evt.Parsed.http_path", + "evt.Parsed.http_request", + "evt.Parsed.http_status_code", + "evt.Parsed.http_user_agent", + "evt.Parsed.http_verb", + "evt.Parsed.invalid_user", + "evt.Parsed.ipAddress", + "evt.Parsed.ip_source", + "evt.Parsed.log_level", + "evt.Parsed.logsource", + "evt.Parsed.message contains 'PVEFW-reject' or evt.Parsed.message contains 'DROP' or evt.Parsed.message contains 'REJECT'", + "evt.Parsed.method", + "evt.Parsed.naxsi_src_ip", + "evt.Parsed.pgsql_dbname", + "evt.Parsed.pgsql_target_user", + "evt.Parsed.pregreet", + "evt.Parsed.program == \"gotify\"", + "evt.Parsed.program == \"suricata-evelogs\" && JsonExtract(evt.Parsed.message, \"event_type\") == \"alert\"\n", + "evt.Parsed.program == \"zoneminder\"", + "evt.Parsed.program == 'Prowlarr'", + "evt.Parsed.program == 'Radarr'", + "evt.Parsed.program == 'adguardhome'", + "evt.Parsed.program == 'apache-guacamole'", + "evt.Parsed.program == 'asterisk'", + "evt.Parsed.program == 'audit'", + "evt.Parsed.program == 'auditd'", + "evt.Parsed.program == 'authelia'", + "evt.Parsed.program == 'aws-cloudtrail'", + "evt.Parsed.program == 'bitwarden'", + "evt.Parsed.program == 'cas'", + "evt.Parsed.program == 'cowrie'", + "evt.Parsed.program == 'cpanel'", + "evt.Parsed.program == 'dovecot'", + "evt.Parsed.program == 'dropbear'", + "evt.Parsed.program == 'emby'", + "evt.Parsed.program == 'endlessh'", + "evt.Parsed.program == 'exchange-imap'", + "evt.Parsed.program == 'exchange-pop'", + "evt.Parsed.program == 'exchange-smtp'", + "evt.Parsed.program == 'exim'", + "evt.Parsed.program == 'filterlog' or evt.Parsed.message matches '^filterlog:'", + "evt.Parsed.program == 'gitea'", + "evt.Parsed.program == 'grafana'", + "evt.Parsed.program == 'harbor'", + "evt.Parsed.program == 'home-assistant' or evt.Parsed.program endsWith 'homeassistant'", + "evt.Parsed.program == 'iis'", + "evt.Parsed.program == 'immich'", + "evt.Parsed.program == 'jellyfin'", + "evt.Parsed.program == 'jellyseerr'", + "evt.Parsed.program == 'k8s-audit'", + "evt.Parsed.program == 'kernel' and evt.Parsed.message contains 'IN=' and not (evt.Parsed.message contains 'ACCEPT')", + "evt.Parsed.program == 'kernel' and evt.Parsed.message contains 'wireguard:'", + "evt.Parsed.program == 'keycloak'", + "evt.Parsed.program == 'laurel'", + "evt.Parsed.program == 'litespeed'", + "evt.Parsed.program == 'magento-extension'", + "evt.Parsed.program == 'mailu-admin'", + "evt.Parsed.program == 'meshcentral'", + "evt.Parsed.program == 'mikrotik'", + "evt.Parsed.program == 'modsecurity'", + "evt.Parsed.program == 'mssql'", + "evt.Parsed.program == 'mysql'", + "evt.Parsed.program == 'odoo'", + "evt.Parsed.program == 'ombi'", + "evt.Parsed.program == 'openappsec' && JsonExtract(evt.Parsed.message, 'eventAudience') == 'Security' && Lower(JsonExtract(evt.Parsed.message, 'eventSeverity')) in ['critical', 'high'] && Lower(JsonExtract(evt.Parsed.message, 'eventData.practiceSubType')) in ['web application','web api']", + "evt.Parsed.program == 'palo-alto-threat'", + "evt.Parsed.program == 'pkexec'", + "evt.Parsed.program == 'postgres'", + "evt.Parsed.program == 'proftpd'", + "evt.Parsed.program == 'pterodactyl'", + "evt.Parsed.program == 'pure-ftpd'", + "evt.Parsed.program == 'pvedaemon'", + "evt.Parsed.program == 'redmine'", + "evt.Parsed.program == 'smb'", + "evt.Parsed.program == 'sshd'", + "evt.Parsed.program == 'sshesame'", + "evt.Parsed.program == 'sudo'", + "evt.Parsed.program == 'suricata-fastlogs'", + "evt.Parsed.program == 'tcpdump'", + "evt.Parsed.program == 'thehive'", + "evt.Parsed.program == 'ts3'", + "evt.Parsed.program == 'vsftpd'", + "evt.Parsed.program == 'windows-firewall' and evt.Parsed.message contains ' DROP TCP ' and evt.Parsed.message contains ' RECEIVE'", + "evt.Parsed.program in ['LLNG','lemonldap-ng']", + "evt.Parsed.program in ['mono', 'Sonarr']", + "evt.Parsed.program in ['postfix/postscreen', 'haproxy/postscreen']", + "evt.Parsed.program in ['postfix/smtpd','postfix/smtps/smtpd','postfix/submission/smtpd', 'postfix/smtps-haproxy/smtpd', 'postfix/submission-haproxy/smtpd']", + "evt.Parsed.program matches 'synoscgi_SYNO.API.Auth_[1-9]([0-9])?_login'", + "evt.Parsed.program startsWith 'apache2'", + "evt.Parsed.program startsWith 'caddy'", + "evt.Parsed.program startsWith 'freeswitch'", + "evt.Parsed.program startsWith 'haproxy'", + "evt.Parsed.program startsWith 'kasm'", + "evt.Parsed.program startsWith 'mariadb'", + "evt.Parsed.program startsWith 'nginx'", + "evt.Parsed.program startsWith 'nginx-proxy-manager'", + "evt.Parsed.program startsWith 'traefik'", + "evt.Parsed.program startsWith 'zimbra'", + "evt.Parsed.rbl_url", + "evt.Parsed.remote_addr", + "evt.Parsed.remote_host", + "evt.Parsed.remote_ip", + "evt.Parsed.remote_user", + "evt.Parsed.request", + "evt.Parsed.request_creation_time", + "evt.Parsed.response", + "evt.Parsed.rule", + "evt.Parsed.rule_id", + "evt.Parsed.ruledata", + "evt.Parsed.ruleid", + "evt.Parsed.rulemessage", + "evt.Parsed.severity", + "evt.Parsed.smtp_message", + "evt.Parsed.source_dns", + "evt.Parsed.source_helo", + "evt.Parsed.source_ip", + "evt.Parsed.source_rdns", + "evt.Parsed.source_user", + "evt.Parsed.sourcehost", + "evt.Parsed.src_country", + "evt.Parsed.src_ip", + "evt.Parsed.sshd_client_ip", + "evt.Parsed.sshd_invalid_user", + "evt.Parsed.sshesame_cmd", + "evt.Parsed.sshesame_input", + "evt.Parsed.sshesame_user", + "evt.Parsed.status", + "evt.Parsed.suricata_rule_severity", + "evt.Parsed.syslog_timestamp", + "evt.Parsed.target_fqdn", + "evt.Parsed.target_ip", + "evt.Parsed.target_port", + "evt.Parsed.target_uri", + "evt.Parsed.target_user", + "evt.Parsed.tcpflags contains 'S' ? 'true' : 'false'", + "evt.Parsed.telnet_session", + "evt.Parsed.threat_id", + "evt.Parsed.time", + "evt.Parsed.time + 'Z'", + "evt.Parsed.time_local", + "evt.Parsed.timestamp", + "evt.Parsed.timestamp + \"Z\"", + "evt.Parsed.timestamp8601", + "evt.Parsed.traefik_router_name", + "evt.Parsed.unix_epoch", + "evt.Parsed.user", + "evt.Parsed.user_agent", + "evt.Parsed.username", + "evt.Parsed.verb", + "evt.Parsed.year+ \"/\" + evt.Parsed.month + \"/\" + evt.Parsed.day + \" \" + evt.Parsed.time", + "evt.StrTime", + "evt.StrTime != ''", + "evt.Unmarshaled.auditd.auid", + "evt.Unmarshaled.auditd.exe", + "evt.Unmarshaled.auditd.msg", + "evt.Unmarshaled.auditd.ppid", + "evt.Unmarshaled.auditd.tty", + "evt.Unmarshaled.auditd.uid", + "evt.Unmarshaled.cloudtrail.awsRegion", + "evt.Unmarshaled.cloudtrail.errorCode", + "evt.Unmarshaled.cloudtrail.eventID", + "evt.Unmarshaled.cloudtrail.eventName", + "evt.Unmarshaled.cloudtrail.eventSource", + "evt.Unmarshaled.cloudtrail.eventTime", + "evt.Unmarshaled.cloudtrail.userAgent", + "evt.Unmarshaled.cloudtrail.userIdentity.accountId", + "evt.Unmarshaled.cloudtrail.userIdentity.type", + "evt.Unmarshaled.cloudtrail.userIdentity?.arn ?? evt.Unmarshaled.cloudtrail.userIdentity.userName\n", + "evt.Unmarshaled.iptables.CODE", + "evt.Unmarshaled.iptables.DPT", + "evt.Unmarshaled.iptables.DST", + "evt.Unmarshaled.iptables.IN", + "evt.Unmarshaled.iptables.LEN", + "evt.Unmarshaled.iptables.PROTO", + "evt.Unmarshaled.iptables.SPT", + "evt.Unmarshaled.iptables.SRC", + "evt.Unmarshaled.iptables.TYPE", + "evt.Unmarshaled.k8s_audit.ObjectRef?.Name", + "evt.Unmarshaled.k8s_audit.ObjectRef?.Namespace", + "evt.Unmarshaled.k8s_audit.RequestObject?.kind", + "evt.Unmarshaled.k8s_audit.RequestReceivedTimestamp", + "evt.Unmarshaled.k8s_audit.SourceIPs[0]", + "evt.Unmarshaled.k8s_audit.User.username", + "evt.Unmarshaled.k8s_audit.objectRef?.name", + "evt.Unmarshaled.k8s_audit.objectRef?.namespace", + "evt.Unmarshaled.k8s_audit.requestObject?.kind", + "evt.Unmarshaled.k8s_audit.requestReceivedTimestamp", + "evt.Unmarshaled.k8s_audit.sourceIPs[0]", + "evt.Unmarshaled.k8s_audit.user.username", + "evt.Unmarshaled.laurel.ID", + "evt.Unmarshaled.laurel.SYSCALL.PPID.exe", + "evt.Unmarshaled.laurel.SYSCALL.SYSCALL", + "evt.Unmarshaled.laurel.SYSCALL.exe", + "evt.Unmarshaled.laurel.SYSCALL.tty", + "evt.Unmarshaled.traefik.ClientHost", + "evt.Unmarshaled.traefik.DownstreamContentSize != nil ? int(evt.Unmarshaled.traefik.DownstreamContentSize) : nil", + "evt.Unmarshaled.traefik.RequestAddr", + "evt.Unmarshaled.traefik.RequestMethod", + "evt.Unmarshaled.traefik.RequestPath", + "evt.Unmarshaled.traefik.RouterName", + "evt.Unmarshaled.traefik.ServiceAddr != nil ? Split(evt.Unmarshaled.traefik.ServiceAddr, ':')[0] : nil", + "evt.Unmarshaled.traefik.time", + "evt.Unmarshaled.traefik[\"request_User-Agent\"]", + "filter(JsonExtractSlice(evt.Parsed.message, \"params\"), {.key == 'user' && .value.login != ''})[0]['value']['login']", + "int(evt.Unmarshaled.laurel.SYSCALL.auid)", + "int(evt.Unmarshaled.laurel.SYSCALL.ppid)", + "int(evt.Unmarshaled.laurel.SYSCALL.uid)", + "int(evt.Unmarshaled.traefik.DownstreamStatus)", + "int(evt.Unmarshaled.traefik.Duration)", + "len(evt.Parsed.http_args)" +] From ab22e901e74890895c8bc35452cfb8b2a9fc1610 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 19 Aug 2023 12:36:31 +0200 Subject: [PATCH 092/506] Add coredns tests --- test/coredns/coredns.go | 179 +++++++++++++++++++++++++++++++++++ test/coredns/coredns_test.go | 32 +++++++ 2 files changed, 211 insertions(+) create mode 100644 test/coredns/coredns.go create mode 100644 test/coredns/coredns_test.go diff --git a/test/coredns/coredns.go b/test/coredns/coredns.go new file mode 100644 index 000000000..068946487 --- /dev/null +++ b/test/coredns/coredns.go @@ -0,0 +1,179 @@ +package coredns + +import ( + "context" + "errors" + "net" +) + +func DefaultEnv(ctx context.Context, state *Request) map[string]interface{} { + return map[string]interface{}{ + "incidr": func(ipStr, cidrStr string) (bool, error) { + ip := net.ParseIP(ipStr) + if ip == nil { + return false, errors.New("first argument is not an IP address") + } + _, cidr, err := net.ParseCIDR(cidrStr) + if err != nil { + return false, err + } + return cidr.Contains(ip), nil + }, + "metadata": func(label string) string { + return "" + }, + "type": state.Type, + "name": state.Name, + "class": state.Class, + "proto": state.Proto, + "size": state.Len, + "client_ip": state.IP, + "port": state.Port, + "id": func() int { return int(state.Req.Id) }, + "opcode": func() int { return state.Req.Opcode }, + "do": state.Do, + "bufsize": state.Size, + "server_ip": state.LocalIP, + "server_port": state.LocalPort, + } +} + +type Request struct { + Req *Msg + W ResponseWriter + Zone string +} + +func (r *Request) NewWithQuestion(name string, typ uint16) Request { + return Request{} +} + +func (r *Request) IP() string { + return "" +} + +func (r *Request) LocalIP() string { + return "" +} + +func (r *Request) Port() string { + return "" +} + +func (r *Request) LocalPort() string { + return "" +} + +func (r *Request) RemoteAddr() string { return r.W.RemoteAddr().String() } + +func (r *Request) LocalAddr() string { return r.W.LocalAddr().String() } + +func (r *Request) Proto() string { + return "udp" +} + +func (r *Request) Family() int { + return 2 +} + +func (r *Request) Do() bool { + return true +} + +func (r *Request) Len() int { return 0 } + +func (r *Request) Size() int { + return 0 +} + +func (r *Request) SizeAndDo(m *Msg) bool { + return true +} + +func (r *Request) Scrub(reply *Msg) *Msg { + return reply +} + +func (r *Request) Type() string { + return "" +} + +func (r *Request) QType() uint16 { + return 0 +} + +func (r *Request) Name() string { + return "." +} + +func (r *Request) QName() string { + return "." +} + +func (r *Request) Class() string { + return "" +} + +func (r *Request) QClass() uint16 { + return 0 +} + +func (r *Request) Clear() { +} + +func (r *Request) Match(reply *Msg) bool { + return true +} + +type Msg struct { + MsgHdr + Compress bool `json:"-"` + Question []Question + Answer []RR + Ns []RR + Extra []RR +} + +type MsgHdr struct { + Id uint16 + Response bool + Opcode int + Authoritative bool + Truncated bool + RecursionDesired bool + RecursionAvailable bool + Zero bool + AuthenticatedData bool + CheckingDisabled bool + Rcode int +} + +type Question struct { + Name string `dns:"cdomain-name"` + Qtype uint16 + Qclass uint16 +} + +type RR interface { + Header() *RR_Header + String() string +} + +type RR_Header struct { + Name string `dns:"cdomain-name"` + Rrtype uint16 + Class uint16 + Ttl uint32 + Rdlength uint16 +} + +type ResponseWriter interface { + LocalAddr() net.Addr + RemoteAddr() net.Addr + WriteMsg(*Msg) error + Write([]byte) (int, error) + Close() error + TsigStatus() error + TsigTimersOnly(bool) + Hijack() +} diff --git a/test/coredns/coredns_test.go b/test/coredns/coredns_test.go new file mode 100644 index 000000000..07a7a39cb --- /dev/null +++ b/test/coredns/coredns_test.go @@ -0,0 +1,32 @@ +package coredns_test + +import ( + "context" + "testing" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/test/coredns" + "github.com/stretchr/testify/assert" +) + +func TestCoreDNS(t *testing.T) { + env := coredns.DefaultEnv(context.Background(), &coredns.Request{}) + + tests := []struct { + input string + }{ + {`metadata('geoip/city/name') == 'Exampleshire'`}, + {`(type() == 'A' && name() == 'example.com') || client_ip() == '1.2.3.4'`}, + {`name() matches '^abc\\..*\\.example\\.com\\.$'`}, + {`type() in ['A', 'AAAA']`}, + {`incidr(client_ip(), '192.168.0.0/16')`}, + {`incidr(client_ip(), '127.0.0.0/24')`}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + _, err := expr.Compile(test.input, expr.Env(env)) + assert.NoError(t, err) + }) + } +} From 5597289d61367f1715f4bc7b2f24bd4b25f45cb2 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 19 Aug 2023 22:24:42 +0200 Subject: [PATCH 093/506] Allow to disable builtins --- builtin/builtin.go | 19 ++++------- builtin/builtin_test.go | 71 +++++++++++++++++++++++++++++++++++++++++ checker/checker.go | 5 ++- compiler/compiler.go | 2 +- conf/config.go | 34 ++++++++++---------- expr.go | 33 +++++++++++++++---- parser/parser.go | 20 ++++++------ parser/parser_test.go | 5 +-- vm/program.go | 2 +- vm/vm.go | 2 +- 10 files changed, 141 insertions(+), 52 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 5a0136175..c822b59fb 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -12,19 +12,13 @@ import ( ) type Function struct { - Name string - Func func(args ...interface{}) (interface{}, error) - Types []reflect.Type - - builtin bool // true if function is builtin + Name string + Func func(args ...interface{}) (interface{}, error) + Types []reflect.Type Builtin1 func(arg interface{}) interface{} Validate func(args []reflect.Type) (reflect.Type, error) } -func (f Function) Builtin() bool { - return f.builtin -} - var ( Index map[string]int Names []string @@ -32,15 +26,14 @@ var ( func init() { Index = make(map[string]int) - Names = make([]string, len(Functions)) - for i, fn := range Functions { - fn.builtin = true + Names = make([]string, len(Builtins)) + for i, fn := range Builtins { Index[fn.Name] = i Names[i] = fn.Name } } -var Functions = []*Function{ +var Builtins = []*Function{ { Name: "len", Builtin1: Len, diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 4cde5ab48..f3fd9dffb 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/antonmedv/expr" + "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" @@ -218,3 +219,73 @@ func TestBuiltin_disallow_builtins_override(t *testing.T) { }) }) } + +func TestBuiltin_DisableBuiltin(t *testing.T) { + t.Run("via env", func(t *testing.T) { + for _, name := range builtin.Names { + t.Run(name, func(t *testing.T) { + env := map[string]interface{}{ + name: func() int { return 42 }, + } + program, err := expr.Compile(name+"()", expr.Env(env), expr.DisableBuiltin(name)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, 42, out) + }) + } + }) + t.Run("via expr.Function", func(t *testing.T) { + for _, name := range builtin.Names { + t.Run(name, func(t *testing.T) { + fn := expr.Function(name, + func(params ...interface{}) (interface{}, error) { + return 42, nil + }, + new(func() int), + ) + program, err := expr.Compile(name+"()", fn, expr.DisableBuiltin(name)) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + require.NoError(t, err) + assert.Equal(t, 42, out) + }) + } + }) +} + +func TestBuiltin_DisableAllBuiltins(t *testing.T) { + _, err := expr.Compile(`len("foo")`, expr.Env(nil), expr.DisableAllBuiltins()) + require.Error(t, err) + assert.Contains(t, err.Error(), "unknown name len") +} + +func TestBuiltin_EnableBuiltin(t *testing.T) { + t.Run("via env", func(t *testing.T) { + env := map[string]interface{}{ + "repeat": func() string { return "repeat" }, + } + program, err := expr.Compile(`len(repeat())`, expr.Env(env), expr.DisableAllBuiltins(), expr.EnableBuiltin("len")) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, 6, out) + }) + t.Run("via expr.Function", func(t *testing.T) { + fn := expr.Function("repeat", + func(params ...interface{}) (interface{}, error) { + return "repeat", nil + }, + new(func() string), + ) + program, err := expr.Compile(`len(repeat())`, fn, expr.DisableAllBuiltins(), expr.EnableBuiltin("len")) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + require.NoError(t, err) + assert.Equal(t, 6, out) + }) +} diff --git a/checker/checker.go b/checker/checker.go index c04c09f31..fe31f8c92 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -138,6 +138,9 @@ func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) if node.Value == "$env" { return mapType, info{} } + if fn, ok := v.config.Builtins[node.Value]; ok { + return functionType, info{fn: fn} + } if fn, ok := v.config.Functions[node.Value]; ok { return functionType, info{fn: fn} } @@ -664,7 +667,7 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { case "get": return v.checkBuiltinGet(node) } - return v.checkFunction(builtin.Functions[id], node, node.Arguments) + return v.checkFunction(builtin.Builtins[id], node, node.Arguments) } return v.error(node, "unknown builtin %v", node.Name) diff --git a/compiler/compiler.go b/compiler/compiler.go index d32ba55e4..89a44039e 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -700,7 +700,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { } if id, ok := builtin.Index[node.Name]; ok { - f := builtin.Functions[id] + f := builtin.Builtins[id] for _, arg := range node.Arguments { c.compile(arg) } diff --git a/conf/config.go b/conf/config.go index 2989eab81..f89e6cca0 100644 --- a/conf/config.go +++ b/conf/config.go @@ -19,22 +19,26 @@ type Config struct { ExpectAny bool Optimize bool Strict bool + Pipes bool ConstFns map[string]reflect.Value Visitors []ast.Visitor Functions map[string]*builtin.Function - Pipes bool + Builtins map[string]*builtin.Function + Disabled map[string]bool // disabled builtins } // CreateNew creates new config with default values. func CreateNew() *Config { c := &Config{ + Optimize: true, Operators: make(map[string][]string), ConstFns: make(map[string]reflect.Value), Functions: make(map[string]*builtin.Function), - Optimize: true, + Builtins: make(map[string]*builtin.Function), + Disabled: make(map[string]bool), } - for _, f := range builtin.Functions { - c.Functions[f.Name] = f + for _, f := range builtin.Builtins { + c.Builtins[f.Name] = f } return c } @@ -95,23 +99,19 @@ func (c *Config) Check() { } } } - for name, t := range c.Types { - if kind(t.Type) != reflect.Func { - continue - } - for _, b := range builtin.Names { - if b == name { - panic(fmt.Errorf(`cannot override builtin %s(); it is already defined in expr`, name)) + for fnName, t := range c.Types { + if kind(t.Type) == reflect.Func { + for _, b := range c.Builtins { + if b.Name == fnName { + panic(fmt.Errorf(`cannot override builtin %s(): use expr.DisableBuiltin("%s") to override`, b.Name, b.Name)) + } } } } for _, f := range c.Functions { - if f.Builtin() { - continue - } - for _, b := range builtin.Names { - if b == f.Name { - panic(fmt.Errorf(`cannot override builtin %s(); it is already defined in expr`, f.Name)) + for _, b := range c.Builtins { + if b.Name == f.Name { + panic(fmt.Errorf(`cannot override builtin %s(); use expr.DisableBuiltin("%s") to override`, f.Name, f.Name)) } } } diff --git a/expr.go b/expr.go index 6314314b1..973bdc108 100644 --- a/expr.go +++ b/expr.go @@ -137,13 +137,38 @@ func ExperimentalPipes() Option { } } +// DisableAllBuiltins disables all builtins. +func DisableAllBuiltins() Option { + return func(c *conf.Config) { + for name := range c.Builtins { + c.Disabled[name] = true + } + } +} + +// DisableBuiltin disables builtin function. +func DisableBuiltin(name string) Option { + return func(c *conf.Config) { + c.Disabled[name] = true + } +} + +// EnableBuiltin enables builtin function. +func EnableBuiltin(name string) Option { + return func(c *conf.Config) { + delete(c.Disabled, name) + } +} + // Compile parses and compiles given input expression to bytecode program. func Compile(input string, ops ...Option) (*vm.Program, error) { config := conf.CreateNew() - for _, op := range ops { op(config) } + for name := range config.Disabled { + delete(config.Builtins, name) + } config.Check() if len(config.Operators) > 0 { @@ -153,11 +178,7 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { }) } - parseConfig := parser.Config{ - Pipes: config.Pipes, - } - - tree, err := parser.ParseWithConfig(input, parseConfig) + tree, err := parser.ParseWithConfig(input, config) if err != nil { return nil, err } diff --git a/parser/parser.go b/parser/parser.go index b1de4c9c0..102091748 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -7,6 +7,7 @@ import ( . "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/builtin" + "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/file" . "github.com/antonmedv/expr/parser/lexer" "github.com/antonmedv/expr/parser/operator" @@ -31,7 +32,7 @@ type parser struct { pos int err *file.Error depth int // closure call depth - pipes bool + config *conf.Config } type Tree struct { @@ -39,15 +40,14 @@ type Tree struct { Source *file.Source } -type Config struct { - Pipes bool -} - func Parse(input string) (*Tree, error) { - return ParseWithConfig(input, Config{}) + return ParseWithConfig(input, &conf.Config{ + Pipes: false, + Disabled: map[string]bool{}, + }) } -func ParseWithConfig(input string, config Config) (*Tree, error) { +func ParseWithConfig(input string, config *conf.Config) (*Tree, error) { source := file.NewSource(input) tokens, err := Lex(source) @@ -58,7 +58,7 @@ func ParseWithConfig(input string, config Config) (*Tree, error) { p := &parser{ tokens: tokens, current: tokens[0], - pipes: config.Pipes, + config: config, } node := p.parseExpression(0) @@ -340,7 +340,7 @@ func (p *parser) parseCall(token Token) Node { Arguments: arguments, } node.SetLocation(token.Location) - } else if _, ok := builtin.Index[token.Value]; ok { + } else if _, ok := builtin.Index[token.Value]; ok && !p.config.Disabled[token.Value] { node = &BuiltinNode{ Name: token.Value, Arguments: p.parseArguments(), @@ -556,7 +556,7 @@ func (p *parser) parsePostfixExpression(node Node) Node { } func (p *parser) parsePipe(node Node) Node { - if !p.pipes { + if !p.config.Pipes { p.error("enable Pipes via expr.ExperimentalPipes()") return &NilNode{} } diff --git a/parser/parser_test.go b/parser/parser_test.go index 0d5d62d47..bbd38476d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -6,6 +6,7 @@ import ( "testing" . "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -453,7 +454,7 @@ func TestParse(t *testing.T) { &BoolNode{Value: true}}}}, } for _, test := range parseTests { - actual, err := parser.ParseWithConfig(test.input, parser.Config{Pipes: true}) + actual, err := parser.ParseWithConfig(test.input, &conf.Config{Pipes: true}) if err != nil { t.Errorf("%s:\n%v", test.input, err) continue @@ -657,7 +658,7 @@ func TestParse_pipe_operator(t *testing.T) { Property: &StringNode{Value: "foo"}, }}}}}}}} - actual, err := parser.ParseWithConfig(input, parser.Config{Pipes: true}) + actual, err := parser.ParseWithConfig(input, &conf.Config{Pipes: true}) require.NoError(t, err) assert.Equal(t, Dump(expect), Dump(actual.Node)) } diff --git a/vm/program.go b/vm/program.go index ea954cc7c..ccc7cfb41 100644 --- a/vm/program.go +++ b/vm/program.go @@ -73,7 +73,7 @@ func (program *Program) Opcodes(w io.Writer) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, c) } builtin := func(label string) { - _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Functions[arg].Name) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Builtins[arg].Name) } funcName := func(label string) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v()\n", pp, label, arg, program.FuncNames[arg]) diff --git a/vm/vm.go b/vm/vm.go index 51e8bf1c0..343a02064 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -380,7 +380,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(vm.call(vm.pop(), arg)) case OpCallBuiltin1: - vm.push(builtin.Functions[arg].Builtin1(vm.pop())) + vm.push(builtin.Builtins[arg].Builtin1(vm.pop())) case OpArray: size := vm.pop().(int) From 887c98ea15c7e14b1fb619abb541608e4c62fec5 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 19 Aug 2023 22:44:50 +0200 Subject: [PATCH 094/506] Remove splitN() and splitAfterN() --- builtin/builtin.go | 40 ++++++++++++++++++++----------------- builtin/builtin_test.go | 4 ++-- docs/Language-Definition.md | 28 ++++++++------------------ 3 files changed, 32 insertions(+), 40 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index c822b59fb..f6f2a608a 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -164,30 +164,34 @@ var Builtins = []*Function{ { Name: "split", Func: func(args ...interface{}) (interface{}, error) { - return strings.Split(args[0].(string), args[1].(string)), nil - }, - Types: types(strings.Split), - }, - { - Name: "splitN", - Func: func(args ...interface{}) (interface{}, error) { - return strings.SplitN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil + if len(args) == 2 { + return strings.Split(args[0].(string), args[1].(string)), nil + } else if len(args) == 3 { + return strings.SplitN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil + } else { + return nil, fmt.Errorf("invalid number of arguments for split (expected 2 or 3, got %d)", len(args)) + } }, - Types: types(strings.SplitN), + Types: types( + strings.Split, + strings.SplitN, + ), }, { Name: "splitAfter", Func: func(args ...interface{}) (interface{}, error) { - return strings.SplitAfter(args[0].(string), args[1].(string)), nil - }, - Types: types(strings.SplitAfter), - }, - { - Name: "splitAfterN", - Func: func(args ...interface{}) (interface{}, error) { - return strings.SplitAfterN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil + if len(args) == 2 { + return strings.SplitAfter(args[0].(string), args[1].(string)), nil + } else if len(args) == 3 { + return strings.SplitAfterN(args[0].(string), args[1].(string), runtime.ToInt(args[2])), nil + } else { + return nil, fmt.Errorf("invalid number of arguments for splitAfter (expected 2 or 3, got %d)", len(args)) + } }, - Types: types(strings.SplitAfterN), + Types: types( + strings.SplitAfter, + strings.SplitAfterN, + ), }, { Name: "replace", diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index f3fd9dffb..937001ede 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -42,9 +42,9 @@ func TestBuiltin(t *testing.T) { {`upper("foo")`, "FOO"}, {`lower("FOO")`, "foo"}, {`split("foo,bar,baz", ",")`, []string{"foo", "bar", "baz"}}, - {`splitN("foo,bar,baz", ",", 2)`, []string{"foo", "bar,baz"}}, + {`split("foo,bar,baz", ",", 2)`, []string{"foo", "bar,baz"}}, {`splitAfter("foo,bar,baz", ",")`, []string{"foo,", "bar,", "baz"}}, - {`splitAfterN("foo,bar,baz", ",", 2)`, []string{"foo,", "bar,baz"}}, + {`splitAfter("foo,bar,baz", ",", 2)`, []string{"foo,", "bar,baz"}}, {`replace("foo,bar,baz", ",", ";")`, "foo;bar;baz"}, {`replace("foo,bar,baz,goo", ",", ";", 2)`, "foo;bar;baz,goo"}, {`repeat("foo", 3)`, "foofoofoo"}, diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index d99f55cd3..7882a148b 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -303,36 +303,22 @@ Converts all the characters in string `v` to lowercase. lower("HELLO") == "hello" ``` -### split(v, delimiter) +### split(v, delimiter[, n]) Splits the string `v` at each instance of the delimiter and returns an array of substrings. ```expr split("apple,orange,grape", ",") == ["apple", "orange", "grape"] +split("apple,orange,grape", ",", 2) == ["apple", "orange,grape"] ``` -### splitN(v, delimiter, n) - -Splits the string `v` at each instance of the delimiter but limits the result to `n` substrings. - -```expr -splitN("apple,orange,grape", ",", 2) == ["apple", "orange,grape"] -``` - -### splitAfter(v, delimiter) +### splitAfter(v, delimiter[, n]) Splits the string `v` after each instance of the delimiter. ```expr splitAfter("apple,orange,grape", ",") == ["apple,", "orange,", "grape"] -``` - -### splitAfterN(v, delimiter, n) - -Splits the string `v` after each instance of the delimiter but limits the result to `n` substrings. - -```expr -splitAfterN("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"] +splitAfter("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"] ``` ### replace(v, old, new) @@ -351,12 +337,14 @@ Repeats the string `v` `n` times. repeat("Hi", 3) == "HiHiHi" ``` -### join(v, delimiter) +### join(v[, delimiter]) Joins an array of strings `v` into a single string with the given delimiter. +If no delimiter is given, an empty string is used. ```expr join(["apple", "orange", "grape"], ",") == "apple,orange,grape" +join(["apple", "orange", "grape"]) == "appleorangegrape" ``` ### indexOf(v, substring) @@ -457,7 +445,7 @@ Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". duration("1h").Seconds() == 3600 ``` -### date(v[, format, timezone]) +### date(v[, format[, timezone]]) Converts the given value `v` into a date representation. From b48b21c0469fba6113d9ea98e7f7fc6af93bbac7 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 19 Aug 2023 22:45:50 +0200 Subject: [PATCH 095/506] Remove invalid tests --- testdata/examples.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/testdata/examples.txt b/testdata/examples.txt index 46e90f47f..4e3782b00 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -14088,7 +14088,6 @@ obj.head(s, s) != obj.a obj.head(s[0]) obj.head(s[a:1]) obj.head(s[f]) -obj.head(splitAfter("c", "b", s, nil)) obj.head(splitAfter("c", "c")) obj.head(string("a"), obj, a) obj.head(string("c", ok, ok)) @@ -19460,7 +19459,6 @@ toJSON(s startsWith s) toJSON(s) toJSON(s) in obj toJSON(s[0:0]) -toJSON(splitAfterN(s, s, 0)) toJSON(string("a")) toJSON(string("c")) toJSON(string(0.5)) From 8dfd410f3a403cb14d93ab1b92bd2672b928720e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 19 Aug 2023 23:47:29 +0200 Subject: [PATCH 096/506] Add type() builtin --- builtin/builtin.go | 5 +++++ builtin/builtin_test.go | 40 ++++++++++++++++++++++++++++++++++ builtin/func.go | 42 ++++++++++++++++++++++++++++++++++++ builtin/utils.go | 1 + docs/Language-Definition.md | 13 +++++++++++ test/coredns/coredns_test.go | 2 +- 6 files changed, 102 insertions(+), 1 deletion(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index f6f2a608a..a58d2f953 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -48,6 +48,11 @@ var Builtins = []*Function{ return anyType, fmt.Errorf("invalid argument for len (type %s)", args[0]) }, }, + { + Name: "type", + Builtin1: Type, + Types: types(new(func(interface{}) string)), + }, { Name: "abs", Builtin1: Abs, diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 937001ede..fdc89aa1b 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -289,3 +289,43 @@ func TestBuiltin_EnableBuiltin(t *testing.T) { assert.Equal(t, 6, out) }) } + +func TestBuiltin_type(t *testing.T) { + type Foo struct{} + var b interface{} = 1 + var a interface{} = &b + tests := []struct { + obj interface{} + want string + }{ + {nil, "nil"}, + {true, "bool"}, + {1, "int"}, + {int8(1), "int"}, + {uint(1), "uint"}, + {1.0, "float"}, + {float32(1.0), "float"}, + {"string", "string"}, + {[]string{"foo", "bar"}, "array"}, + {map[string]interface{}{"foo": "bar"}, "map"}, + {func() {}, "func"}, + {time.Now(), "time.Time"}, + {time.Second, "time.Duration"}, + {Foo{}, "github.com/antonmedv/expr/builtin_test.Foo"}, + {struct{}{}, "struct"}, + {a, "int"}, + } + for _, test := range tests { + t.Run(test.want, func(t *testing.T) { + env := map[string]interface{}{ + "obj": test.obj, + } + program, err := expr.Compile(`type(obj)`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, test.want, out) + }) + } +} diff --git a/builtin/func.go b/builtin/func.go index 54fd383a0..a14f6553d 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -18,6 +18,48 @@ func Len(x interface{}) interface{} { } } +func Type(arg interface{}) interface{} { + if arg == nil { + return "nil" + } + v := reflect.ValueOf(arg) + for { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } else if v.Kind() == reflect.Interface { + v = v.Elem() + } else { + break + } + } + if v.Type().Name() != "" && v.Type().PkgPath() != "" { + return fmt.Sprintf("%s.%s", v.Type().PkgPath(), v.Type().Name()) + } + switch v.Type().Kind() { + case reflect.Invalid: + return "invalid" + case reflect.Bool: + return "bool" + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return "int" + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return "uint" + case reflect.Float32, reflect.Float64: + return "float" + case reflect.String: + return "string" + case reflect.Array, reflect.Slice: + return "array" + case reflect.Map: + return "map" + case reflect.Func: + return "func" + case reflect.Struct: + return "struct" + } + return "unknown" +} + func Abs(x interface{}) interface{} { switch x.(type) { case float32: diff --git a/builtin/utils.go b/builtin/utils.go index 1699c5ddd..afe169f76 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -8,6 +8,7 @@ var ( anyType = reflect.TypeOf(new(interface{})).Elem() integerType = reflect.TypeOf(0) floatType = reflect.TypeOf(float64(0)) + stringType = reflect.TypeOf("") arrayType = reflect.TypeOf([]interface{}{}) ) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 7882a148b..c08781a97 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -237,6 +237,19 @@ len(filter(array, predicate)) Returns the length of an array, a map or a string. +### type(v) + +Returns the type of the given value `v`. +Returns on of the following types: `nil`, `bool`, `int`, `uint`, `float`, `string`, `array`, `map`. +For named types and structs, the type name is returned. + + +```expr +type(42) == "int" +type("hello") == "string" +type(now()) == "time.Time" +``` + ### abs(v) Returns the absolute value of a number. diff --git a/test/coredns/coredns_test.go b/test/coredns/coredns_test.go index 07a7a39cb..702b66c17 100644 --- a/test/coredns/coredns_test.go +++ b/test/coredns/coredns_test.go @@ -25,7 +25,7 @@ func TestCoreDNS(t *testing.T) { for _, test := range tests { t.Run(test.input, func(t *testing.T) { - _, err := expr.Compile(test.input, expr.Env(env)) + _, err := expr.Compile(test.input, expr.Env(env), expr.DisableBuiltin("type")) assert.NoError(t, err) }) } From 956b65012a7d9a349200fea5e3389ed3aa80c71c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 19 Aug 2023 23:50:09 +0200 Subject: [PATCH 097/506] Add type to fuzz --- fuzz_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/fuzz_test.go b/fuzz_test.go index 3bbc789d8..00078e154 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -53,6 +53,7 @@ func FuzzExpr(f *testing.F) { `a[:]`, `a[1:-1]`, `len(a)`, + `type(a)`, `abs(-1)`, `int(0.5)`, `float(42)`, From 1e991e4aa8f30fe2d03916bb9318bd4078115abb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 20 Aug 2023 15:45:50 +0200 Subject: [PATCH 098/506] Remove redundant type for join() --- builtin/builtin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index a58d2f953..32c03b94b 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -247,7 +247,6 @@ var Builtins = []*Function{ Types: types( strings.Join, new(func([]interface{}, string) string), - new(func([]string) string), new(func([]interface{}) string), ), }, From 3dd930053f2446468e481d5bc155bc6b2a09338a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 20 Aug 2023 15:49:37 +0200 Subject: [PATCH 099/506] Fix join() types --- builtin/builtin.go | 2 ++ fuzz_test.go | 40 +++++++++++++++++++--------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 32c03b94b..6677a968d 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -248,6 +248,8 @@ var Builtins = []*Function{ strings.Join, new(func([]interface{}, string) string), new(func([]interface{}) string), + new(func([]string, string) string), + new(func([]string) string), ), }, { diff --git a/fuzz_test.go b/fuzz_test.go index 00078e154..af8e1ffba 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -2,7 +2,6 @@ package expr_test import ( "regexp" - "strings" "testing" "github.com/antonmedv/expr" @@ -10,15 +9,17 @@ import ( func FuzzExpr(f *testing.F) { env := map[string]interface{}{ - "i": 1, - "j": 2, - "a": []int{1, 2, 3}, - "m": map[string]interface{}{"a": 1, "b": 2, "m": map[string]int{"a": 1}}, - "s": "abc", + "i": 1, + "j": 2, + "b": true, + "a": []int{1, 2, 3}, + "m": map[string]interface{}{"a": 1, "b": 2, "m": map[string]int{"a": 1}}, + "s": "abc", + "add": func(a, b int) int { return a + b }, } - fn := expr.Function( - "fn", + head := expr.Function( + "head", func(params ...interface{}) (interface{}, error) { return params[0], nil }, @@ -85,9 +86,17 @@ func FuzzExpr(f *testing.F) { `s matches "a"`, `s matches "a+"`, `true ? 1 : 2`, - `fn(1)`, + `false ? 1 : 2`, + `b ?? true`, + `head(1)`, `{a: 1, b: 2}`, `[1, 2, 3]`, + `type(1)`, + `type("a")`, + `type([1, 2, 3])`, + `type({a: 1, b: 2})`, + `type(head)`, + `keys(m)`, } for _, s := range corpus { @@ -122,19 +131,8 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`operator "in" not defined on int`), } - skipCode := []string{ - `??`, - } - f.Fuzz(func(t *testing.T, code string) { - for _, skipCase := range skipCode { - if strings.Contains(code, skipCase) { - t.Skipf("skip code: %s", skipCase) - return - } - } - - program, err := expr.Compile(code, expr.Env(env), fn, expr.ExperimentalPipes()) + program, err := expr.Compile(code, expr.Env(env), head, expr.ExperimentalPipes()) if err != nil { t.Skipf("compile error: %s", err) } From 32bcae1881f99d63cd9a70f2eb318309d59ff418 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 20 Aug 2023 15:52:09 +0200 Subject: [PATCH 100/506] Update fuzz_test.go --- fuzz_test.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/fuzz_test.go b/fuzz_test.go index af8e1ffba..bd03c9ca2 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -16,6 +16,7 @@ func FuzzExpr(f *testing.F) { "m": map[string]interface{}{"a": 1, "b": 2, "m": map[string]int{"a": 1}}, "s": "abc", "add": func(a, b int) int { return a + b }, + "foo": Foo{A: 1, B: 2, Bar: Bar{A: 1, B: 2}}, } head := expr.Function( @@ -97,13 +98,16 @@ func FuzzExpr(f *testing.F) { `type({a: 1, b: 2})`, `type(head)`, `keys(m)`, + `values(m)`, + `foo.bar.a`, + `foo.bar.b`, } for _, s := range corpus { f.Add(s) } - okCases := []*regexp.Regexp{ + skip := []*regexp.Regexp{ regexp.MustCompile(`cannot fetch .* from .*`), regexp.MustCompile(`cannot get .* from .*`), regexp.MustCompile(`cannot slice`), @@ -139,8 +143,8 @@ func FuzzExpr(f *testing.F) { _, err = expr.Run(program, env) if err != nil { - for _, okCase := range okCases { - if okCase.MatchString(err.Error()) { + for _, r := range skip { + if r.MatchString(err.Error()) { t.Skipf("skip error: %s", err) return } @@ -149,3 +153,14 @@ func FuzzExpr(f *testing.F) { } }) } + +type Foo struct { + A int `expr:"a"` + B int `expr:"b"` + Bar Bar `expr:"bar"` +} + +type Bar struct { + A int `expr:"a"` + B int `expr:"b"` +} From 7601c630a7487c67c44bba4655ed66614f3d51a1 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 20 Aug 2023 18:11:33 +0200 Subject: [PATCH 101/506] Add fuzz dict and corpus --- fuzz_test.go | 81 +++------------------------------------- testdata/fuzz_corpus.sh | 21 +++++++++++ testdata/fuzz_corpus.txt | 73 ++++++++++++++++++++++++++++++++++++ testdata/fuzz_expr.dict | 78 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 178 insertions(+), 75 deletions(-) create mode 100644 testdata/fuzz_corpus.sh create mode 100644 testdata/fuzz_corpus.txt create mode 100644 testdata/fuzz_expr.dict diff --git a/fuzz_test.go b/fuzz_test.go index bd03c9ca2..5770d8704 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -1,7 +1,9 @@ package expr_test import ( + "os" "regexp" + "strings" "testing" "github.com/antonmedv/expr" @@ -27,82 +29,11 @@ func FuzzExpr(f *testing.F) { new(func(int) int), ) - corpus := []string{ - `.5 + .5`, - `i + j`, - `i - j`, - `i * j`, - `i / j`, - `i % j`, - `true || false`, - `true && false`, - `i == j`, - `i != j`, - `i > j`, - `i >= j`, - `i < j`, - `i <= j`, - `i in a`, - `i not in a`, - `s in m`, - `m.a`, - `m.m.a`, - `a[0]`, - `a[i]`, - `a[i:j]`, - `a[i:]`, - `a[:j]`, - `a[:]`, - `a[1:-1]`, - `len(a)`, - `type(a)`, - `abs(-1)`, - `int(0.5)`, - `float(42)`, - `string(i)`, - `trim(" a ")`, - `trim("_a_", "_")`, - `trimPrefix(" a", " ")`, - `trimSuffix("a ")`, - `upper("a")`, - `lower("A")`, - `split("a,b,c", ",")`, - `replace("a,b,c", ",", "_")`, - `repeat("a", 3)`, - `join(["a", "b", "c"], ",")`, - `indexOf("abc", "b")`, - `max(1,2,3)`, - `min(1,2,3)`, - `toJSON(a)`, - `fromJSON("[1,2,3]")`, - `now()`, - `duration("1s")`, - `first(a)`, - `last(a)`, - `get(m, "a")`, - `1..9 | filter(i > 5) | map(i * 2)`, - `s startsWith "a"`, - `s endsWith "c"`, - `s contains "a"`, - `s matches "a"`, - `s matches "a+"`, - `true ? 1 : 2`, - `false ? 1 : 2`, - `b ?? true`, - `head(1)`, - `{a: 1, b: 2}`, - `[1, 2, 3]`, - `type(1)`, - `type("a")`, - `type([1, 2, 3])`, - `type({a: 1, b: 2})`, - `type(head)`, - `keys(m)`, - `values(m)`, - `foo.bar.a`, - `foo.bar.b`, + b, err := os.ReadFile("./testdata/fuzz_corpus.txt") + if err != nil { + panic(err) } - + corpus := strings.Split(strings.TrimSpace(string(b)), "\n") for _, s := range corpus { f.Add(s) } diff --git a/testdata/fuzz_corpus.sh b/testdata/fuzz_corpus.sh new file mode 100644 index 000000000..aa114a6a6 --- /dev/null +++ b/testdata/fuzz_corpus.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +inputfile=./fuzz_corpus.txt +zipname=fuzz_expr_seed_corpus.zip + +if [ ! -f "$inputfile" ]; then + echo "Error: File $inputfile not found!" + exit 1 +fi + +lineno=1 +while IFS= read -r line; do + echo "$line" >"file_${lineno}.txt" + ((lineno++)) +done <"$inputfile" + +zip "$zipname" file_*.txt + +rm file_*.txt + +echo "Done!" diff --git a/testdata/fuzz_corpus.txt b/testdata/fuzz_corpus.txt new file mode 100644 index 000000000..43b3f7e4a --- /dev/null +++ b/testdata/fuzz_corpus.txt @@ -0,0 +1,73 @@ +.5 + .5 +i + j +i - j +i * j +i / j +i % j +true || false +true && false +i == j +i != j +i > j +i >= j +i < j +i <= j +i in a +i not in a +s in m +m.a +m.m.a +a[0] +a[i] +a[i:j] +a[i:] +a[:j] +a[:] +a[1:-1] +len(a) +type(a) +abs(-1) +int(0.5) +float(42) +string(i) +trim(" a ") +trim("_a_", "_") +trimPrefix(" a", " ") +trimSuffix("a ") +upper("a") +lower("A") +split("a,b,c", ",") +replace("a,b,c", ",", "_") +repeat("a", 3) +join(["a", "b", "c"], ",") +indexOf("abc", "b") +max(1,2,3) +min(1,2,3) +toJSON(a) +fromJSON("[1,2,3]") +now() +duration("1s") +first(a) +last(a) +get(m, "a") +1..9 | filter(i > 5) | map(i * 2) +s startsWith "a" +s endsWith "c" +s contains "a" +s matches "a" +s matches "a+" +true ? 1 : 2 +false ? 1 : 2 +b ?? true +head(1) +{a: 1, b: 2} +[1, 2, 3] +type(1) +type("a") +type([1, 2, 3]) +type({a: 1, b: 2}) +type(head) +keys(m) +values(m) +foo.bar.a +foo.bar.b diff --git a/testdata/fuzz_expr.dict b/testdata/fuzz_expr.dict new file mode 100644 index 000000000..9a22cae47 --- /dev/null +++ b/testdata/fuzz_expr.dict @@ -0,0 +1,78 @@ +"{" +"}" +"," +"[" +"]" +"(" +")" +":" +"'" +"\"" +"0.1" +"1.2" +"2.3" +"-3.4" +"-4.5" +"-5.6" +"1e2" +"2e3" +"-3e4" +"-4e5" +"0" +"1" +"2" +"-3" +"-4" +"0x" +"true" +"false" +"map" +"filter" +"all" +"any" +"none" +"one" +"and" +"or" +"in" +"not" +"in" +"contains" +"matches" +"startsWith" +"endsWith" +"nil" +"len" +"type" +"abs" +"int" +"float" +"string" +"trim" +"trimPrefix" +"trimSuffix" +"upper" +"lower" +"split" +"splitAfter" +"replace" +"repeat" +"join" +"indexOf" +"lastIndexOf" +"hasPrefix" +"hasSuffix" +"max" +"min" +"toJSON" +"fromJSON" +"toBase64" +"fromBase64" +"now" +"duration" +"date" +"first" +"last" +"get" +"keys" +"values" From 8cd12a9101da80c16bec41884016889e7730b828 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 20 Aug 2023 18:12:47 +0200 Subject: [PATCH 102/506] Add fuzz_expr_seed_corpus.zip --- testdata/fuzz_corpus.sh | 0 testdata/fuzz_expr_seed_corpus.zip | Bin 0 -> 11768 bytes 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 testdata/fuzz_corpus.sh create mode 100644 testdata/fuzz_expr_seed_corpus.zip diff --git a/testdata/fuzz_corpus.sh b/testdata/fuzz_corpus.sh old mode 100644 new mode 100755 diff --git a/testdata/fuzz_expr_seed_corpus.zip b/testdata/fuzz_expr_seed_corpus.zip new file mode 100644 index 0000000000000000000000000000000000000000..5dfe76d50f2ef2cb0343ea613647f1a8d4396c46 GIT binary patch literal 11768 zcmb7~e{5Cd8OLu+i%1cnsEkSG>m_p+X$!r*_m&lEtvazkgd(iC6l~6I?}dZ+-qYQ4 zI*PiCZ3G!Qm>EmioMMJ%TjmcKF)BD0|6wR3YAH2{nTtOdun^*+S(g29?|aWZ?|Gi{ zc6rVVd6N?0ljnKg=X2h3zim&~l&a|w@#}|=U9;}j@3huV<6nz4Ju*L%HFKH%#s+7^ z`R3XyBU5^peK;uA@JLOhqU!UCNTli-{x2JnY!PcnPVYgi%$e=2SMa|Tt46YxP%x9- z*vd8sSdP78+EmUF%V&{=nd}w?l{%C7KrJgymvxI;))ze3_UUieADK`|q&-HT86?fQ@b(sEvf^ZWoYb;8$XfZ>(LZ=Q<@ZO*BUnMy z?{D~{`gn+w@)&(;Rh5t2`m(xLq&plHEGoaf`D5={>i0*QWArt))HeoU^ZwiZHFe`j zZE~4H%vcy0hs4m*b82CvHqO?ej0$`FrNwWmFj5^OZO7^xgOyc3a&xCQ5>g&=B1~4V z$n)B%Ju9x{;)o?TzloH`EI6?x4as0#_wJjwTwIc3`7~0XY|b*ASRx+8&Dnp$BskI{ z+bNobjWIKbTd}`k?+jjEZVP7 zkB%HVIhPZ~@~Na*g4$EeWX%y?EHeaKt@!=n4?d~oT(NvM>6&1#8P1m222-(@FT8iR za``op)(sC0Ws0$=p=?1@&FC(bN1B(jwg_Ik!fSadQ7c}+#PZuF<+F!!ro-#2OVtTrrQp81_^~XE9SDx(j=x{>rO{W|Jf&n( z&l7LHb@J5C-p;kW*v`t?Z*(5I^_~?SKdlK={J`kNX64Khq^)LQFf+0$%S%p|&Md8* z*&R=vNGrpYAP+5XjKmu2;&tV1@IMQ5ojvxv$|HTvn}x}F-K_s<kmt#L0yn z^<&4^9$d5Jbk*POIW^nn*Hm|EN?gi zn=+FjzrFENUM-V!5h51_Tc7yliGx@162Aqv+hBK4kx<0&DeRXOkrOR4YL)s`Rao5g6!+X@~NbNja zI6FYS=0OAd?4THP$PqVg+Kd{1zu{UtuwkqA$& zBTs){d<7HkYB%8yq}x4Rn1^$1$m^E8^4Np};&2-R_eo%Rbix5~#0`NTNnm++!U1v4 z4S|dKPP$uI9-nZ)UX*r2-~$p^erSgS;>a5Uk4a$pu^kSGb8iT&t@K(hKf1#Kaqta+ zX$dSpz`_A>`VE24OJLc;a6p`bL*PFouqu%_nTG>&2(08ey4$jrc{n$R zz-|fDG7o3x5cqQm)G`kT=n(jc1ZtUwLv#p?^UoFT9%`9~gLDY|o(I&L8XTuX-W!sq zWgbq{A#g6g_)8r(>6wQzbqLH#pw`0%r|J;+q6BK~Ax_mHa4LWAbX(Rk4+rWHxLyLa z%)==<1imbRTIS*W90ITA!IRsvmU%cphroUb)G`kz=n(jV1ZtUwlXD21#$QQGEr&Q{ zKe)pAIpp0Vd0OV-#2f+-Nni-`{0ebg4uRD?K6X3SG7l%@5I7)#TIS(o90FgJzz~Px zf26?CI0Vk%sioVpmU%cEhrsm`sAV2b$06`{5~yV!PQ@XxiYGX3%Ub5)Y#ahtNuZW_ zI2eb(10GQ8OmI97d6y(l%RHQrL*O$0@wv2xUS1yV$a?A9?rrc@MjXJb;>vhhrkOGsAV2b!6C4fCv|SiTIS&l90GqLfm-I_ z02~58mOw4@aQ+Q}DgND%Qp;Lfh*NOL+a`Hh=HUz+0#8X`h&#`}0B{Npfl>Y=2yVwA z%=3Xb35P&S0=3M;K{y1yE`eI+;V2veXYsJuZCT4a9EU^T1_{&}8ytv3;Ik5_WgZU0 zA+Ul!Gu@W8%)==-1b#~bwamjYI0XLI18Q}QLvYCZm*i=ghl6kkyzAQX7J9LGxH}I= z;Se|~fm-I_FdPEUNuZW_I1Y!v Date: Mon, 21 Aug 2023 11:58:29 +0200 Subject: [PATCH 103/506] Fix SliceNode String() --- ast/print.go | 9 +++++++++ ast/print_test.go | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ast/print.go b/ast/print.go index e95e88796..2e8744730 100644 --- a/ast/print.go +++ b/ast/print.go @@ -94,6 +94,15 @@ func (n *MemberNode) String() string { } func (n *SliceNode) String() string { + if n.From == nil && n.To == nil { + return fmt.Sprintf("%s[:]", n.Node.String()) + } + if n.From == nil { + return fmt.Sprintf("%s[:%s]", n.Node.String(), n.To.String()) + } + if n.To == nil { + return fmt.Sprintf("%s[%s:]", n.Node.String(), n.From.String()) + } return fmt.Sprintf("%s[%s:%s]", n.Node.String(), n.From.String(), n.To.String()) } diff --git a/ast/print_test.go b/ast/print_test.go index 9517a0820..1b992511c 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -5,6 +5,7 @@ import ( "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/parser" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -63,14 +64,16 @@ func TestPrint(t *testing.T) { {`a.b()`, `a.b()`}, {`a.b(c)`, `a.b(c)`}, {`a[1:-1]`, `a[1:-1]`}, + {`a[1:]`, `a[1:]`}, + {`a[1:]`, `a[1:]`}, + {`a[:]`, `a[:]`}, } for _, tt := range tests { t.Run(tt.input, func(t *testing.T) { tree, err := parser.Parse(tt.input) require.NoError(t, err) - - require.Equal(t, tt.want, tree.Node.String()) + assert.Equal(t, tt.want, tree.Node.String()) }) } } From c2c760322514aed85fe1fd3ac2fa7d6aba8e2dbe Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 21 Aug 2023 22:42:27 +0200 Subject: [PATCH 104/506] Fix builtin type checks for any --- builtin/builtin.go | 8 ++++++++ builtin/builtin_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index 6677a968d..f03162b2f 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -289,6 +289,8 @@ var Builtins = []*Function{ } for _, arg := range args { switch kind(arg) { + case reflect.Interface: + return anyType, nil case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: default: return anyType, fmt.Errorf("invalid argument for max (type %s)", arg) @@ -306,6 +308,8 @@ var Builtins = []*Function{ } for _, arg := range args { switch kind(arg) { + case reflect.Interface: + return anyType, nil case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: default: return anyType, fmt.Errorf("invalid argument for min (type %s)", arg) @@ -493,6 +497,8 @@ var Builtins = []*Function{ return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { + case reflect.Interface: + return arrayType, nil case reflect.Map: return arrayType, nil } @@ -521,6 +527,8 @@ var Builtins = []*Function{ return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } switch kind(args[0]) { + case reflect.Interface: + return arrayType, nil case reflect.Map: return arrayType, nil } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index fdc89aa1b..ea273cce7 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -3,6 +3,7 @@ package builtin_test import ( "fmt" "reflect" + "strings" "testing" "time" @@ -104,6 +105,32 @@ func TestBuiltin(t *testing.T) { } } +func TestBuiltin_works_with_any(t *testing.T) { + config := map[string]struct { + arity int + }{ + "get": {2}, + } + + for _, b := range builtin.Builtins { + t.Run(b.Name, func(t *testing.T) { + arity := 1 + if c, ok := config[b.Name]; ok { + arity = c.arity + } + if len(b.Types) > 0 { + arity = b.Types[0].NumIn() + } + args := make([]string, arity) + for i := 1; i <= arity; i++ { + args[i-1] = fmt.Sprintf("arg%d", i) + } + _, err := expr.Compile(fmt.Sprintf(`%s(%s)`, b.Name, strings.Join(args, ", "))) // expr.Env(env) is not needed + assert.NoError(t, err) + }) + } +} + func TestBuiltin_errors(t *testing.T) { var errorTests = []struct { input string From 8b5c45d5dc5ee5bb571a13380e837cf96b976908 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 22 Aug 2023 14:02:53 +0200 Subject: [PATCH 105/506] Refactor lexer_test.go --- parser/lexer/lexer_test.go | 340 ++++++++++++++++++------------------- 1 file changed, 170 insertions(+), 170 deletions(-) diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index 03ccbd14f..d69ff7750 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -12,183 +12,196 @@ import ( . "github.com/antonmedv/expr/parser/lexer" ) -type lexTest struct { - input string - tokens []Token -} - -var lexTests = []lexTest{ - { - ".5 0.025 1 02 1e3 0xFF 1.2e-4 1_000_000 _42 -.5", - []Token{ - {Kind: Number, Value: ".5"}, - {Kind: Number, Value: "0.025"}, - {Kind: Number, Value: "1"}, - {Kind: Number, Value: "02"}, - {Kind: Number, Value: "1e3"}, - {Kind: Number, Value: "0xFF"}, - {Kind: Number, Value: "1.2e-4"}, - {Kind: Number, Value: "1_000_000"}, - {Kind: Identifier, Value: "_42"}, - {Kind: Operator, Value: "-"}, - {Kind: Number, Value: ".5"}, - {Kind: EOF}, +func TestLex(t *testing.T) { + tests := []struct { + input string + tokens []Token + }{ + { + ".5 0.025 1 02 1e3 0xFF 1.2e-4 1_000_000 _42 -.5", + []Token{ + {Kind: Number, Value: ".5"}, + {Kind: Number, Value: "0.025"}, + {Kind: Number, Value: "1"}, + {Kind: Number, Value: "02"}, + {Kind: Number, Value: "1e3"}, + {Kind: Number, Value: "0xFF"}, + {Kind: Number, Value: "1.2e-4"}, + {Kind: Number, Value: "1_000_000"}, + {Kind: Identifier, Value: "_42"}, + {Kind: Operator, Value: "-"}, + {Kind: Number, Value: ".5"}, + {Kind: EOF}, + }, }, - }, - { - `"double" 'single' "abc \n\t\"\\" '"\'' "'\"" "\xC3\xBF\u263A\U000003A8" '❤️'`, - []Token{ - {Kind: String, Value: "double"}, - {Kind: String, Value: "single"}, - {Kind: String, Value: "abc \n\t\"\\"}, - {Kind: String, Value: "\"'"}, - {Kind: String, Value: "'\""}, - {Kind: String, Value: "ÿ☺Ψ"}, - {Kind: String, Value: "❤️"}, - {Kind: EOF}, + { + `"double" 'single' "abc \n\t\"\\" '"\'' "'\"" "\xC3\xBF\u263A\U000003A8" '❤️'`, + []Token{ + {Kind: String, Value: "double"}, + {Kind: String, Value: "single"}, + {Kind: String, Value: "abc \n\t\"\\"}, + {Kind: String, Value: "\"'"}, + {Kind: String, Value: "'\""}, + {Kind: String, Value: "ÿ☺Ψ"}, + {Kind: String, Value: "❤️"}, + {Kind: EOF}, + }, }, - }, - { - "a and orb().val #.", - []Token{ - {Kind: Identifier, Value: "a"}, - {Kind: Operator, Value: "and"}, - {Kind: Identifier, Value: "orb"}, - {Kind: Bracket, Value: "("}, - {Kind: Bracket, Value: ")"}, - {Kind: Operator, Value: "."}, - {Kind: Identifier, Value: "val"}, - {Kind: Operator, Value: "#"}, - {Kind: Operator, Value: "."}, - {Kind: EOF}, + { + "a and orb().val #.", + []Token{ + {Kind: Identifier, Value: "a"}, + {Kind: Operator, Value: "and"}, + {Kind: Identifier, Value: "orb"}, + {Kind: Bracket, Value: "("}, + {Kind: Bracket, Value: ")"}, + {Kind: Operator, Value: "."}, + {Kind: Identifier, Value: "val"}, + {Kind: Operator, Value: "#"}, + {Kind: Operator, Value: "."}, + {Kind: EOF}, + }, }, - }, - { - "foo?.bar", - []Token{ + { + "foo?.bar", + []Token{ - {Kind: Identifier, Value: "foo"}, - {Kind: Operator, Value: "?."}, - {Kind: Identifier, Value: "bar"}, - {Kind: EOF}, + {Kind: Identifier, Value: "foo"}, + {Kind: Operator, Value: "?."}, + {Kind: Identifier, Value: "bar"}, + {Kind: EOF}, + }, }, - }, - { - "foo ? .bar : .baz", - []Token{ + { + "foo ? .bar : .baz", + []Token{ - {Kind: Identifier, Value: "foo"}, - {Kind: Operator, Value: "?"}, - {Kind: Operator, Value: "."}, - {Kind: Identifier, Value: "bar"}, - {Kind: Operator, Value: ":"}, - {Kind: Operator, Value: "."}, - {Kind: Identifier, Value: "baz"}, - {Kind: EOF}, + {Kind: Identifier, Value: "foo"}, + {Kind: Operator, Value: "?"}, + {Kind: Operator, Value: "."}, + {Kind: Identifier, Value: "bar"}, + {Kind: Operator, Value: ":"}, + {Kind: Operator, Value: "."}, + {Kind: Identifier, Value: "baz"}, + {Kind: EOF}, + }, }, - }, - { - "func?()", - []Token{ + { + "func?()", + []Token{ - {Kind: Identifier, Value: "func"}, - {Kind: Operator, Value: "?"}, - {Kind: Bracket, Value: "("}, - {Kind: Bracket, Value: ")"}, - {Kind: EOF}, + {Kind: Identifier, Value: "func"}, + {Kind: Operator, Value: "?"}, + {Kind: Bracket, Value: "("}, + {Kind: Bracket, Value: ")"}, + {Kind: EOF}, + }, }, - }, - { - "array?[]", - []Token{ + { + "array?[]", + []Token{ - {Kind: Identifier, Value: "array"}, - {Kind: Operator, Value: "?"}, - {Kind: Bracket, Value: "["}, - {Kind: Bracket, Value: "]"}, - {Kind: EOF}, + {Kind: Identifier, Value: "array"}, + {Kind: Operator, Value: "?"}, + {Kind: Bracket, Value: "["}, + {Kind: Bracket, Value: "]"}, + {Kind: EOF}, + }, }, - }, - { - `not in not abc not i not(false) not in not in`, - []Token{ - {Kind: Operator, Value: "not"}, - {Kind: Operator, Value: "in"}, - {Kind: Operator, Value: "not"}, - {Kind: Identifier, Value: "abc"}, - {Kind: Operator, Value: "not"}, - {Kind: Identifier, Value: "i"}, - {Kind: Operator, Value: "not"}, - {Kind: Bracket, Value: "("}, - {Kind: Identifier, Value: "false"}, - {Kind: Bracket, Value: ")"}, - {Kind: Operator, Value: "not"}, - {Kind: Operator, Value: "in"}, - {Kind: Operator, Value: "not"}, - {Kind: Operator, Value: "in"}, - {Kind: EOF}, + { + `not in not abc not i not(false) not in not in`, + []Token{ + {Kind: Operator, Value: "not"}, + {Kind: Operator, Value: "in"}, + {Kind: Operator, Value: "not"}, + {Kind: Identifier, Value: "abc"}, + {Kind: Operator, Value: "not"}, + {Kind: Identifier, Value: "i"}, + {Kind: Operator, Value: "not"}, + {Kind: Bracket, Value: "("}, + {Kind: Identifier, Value: "false"}, + {Kind: Bracket, Value: ")"}, + {Kind: Operator, Value: "not"}, + {Kind: Operator, Value: "in"}, + {Kind: Operator, Value: "not"}, + {Kind: Operator, Value: "in"}, + {Kind: EOF}, + }, }, - }, - { - "not in_var", - []Token{ - {Kind: Operator, Value: "not"}, - {Kind: Identifier, Value: "in_var"}, - {Kind: EOF}, + { + "not in_var", + []Token{ + {Kind: Operator, Value: "not"}, + {Kind: Identifier, Value: "in_var"}, + {Kind: EOF}, + }, }, - }, - { - "not in", - []Token{ - {Kind: Operator, Value: "not"}, - {Kind: Operator, Value: "in"}, - {Kind: EOF}, + { + "not in", + []Token{ + {Kind: Operator, Value: "not"}, + {Kind: Operator, Value: "in"}, + {Kind: EOF}, + }, }, - }, - { - `1..5`, - []Token{ - {Kind: Number, Value: "1"}, - {Kind: Operator, Value: ".."}, - {Kind: Number, Value: "5"}, - {Kind: EOF}, + { + `1..5`, + []Token{ + {Kind: Number, Value: "1"}, + {Kind: Operator, Value: ".."}, + {Kind: Number, Value: "5"}, + {Kind: EOF}, + }, }, - }, - { - `$i _0 früh`, - []Token{ - {Kind: Identifier, Value: "$i"}, - {Kind: Identifier, Value: "_0"}, - {Kind: Identifier, Value: "früh"}, - {Kind: EOF}, + { + `$i _0 früh`, + []Token{ + {Kind: Identifier, Value: "$i"}, + {Kind: Identifier, Value: "_0"}, + {Kind: Identifier, Value: "früh"}, + {Kind: EOF}, + }, }, - }, - { - `foo // comment + { + `foo // comment bar // comment`, - []Token{ - {Kind: Identifier, Value: "foo"}, - {Kind: Identifier, Value: "bar"}, - {Kind: EOF}, + []Token{ + {Kind: Identifier, Value: "foo"}, + {Kind: Identifier, Value: "bar"}, + {Kind: EOF}, + }, }, - }, - { - `foo /* comment */ bar`, - []Token{ - {Kind: Identifier, Value: "foo"}, - {Kind: Identifier, Value: "bar"}, - {Kind: EOF}, + { + `foo /* comment */ bar`, + []Token{ + {Kind: Identifier, Value: "foo"}, + {Kind: Identifier, Value: "bar"}, + {Kind: EOF}, + }, }, - }, - { - `foo ?? bar`, - []Token{ - {Kind: Identifier, Value: "foo"}, - {Kind: Operator, Value: "??"}, - {Kind: Identifier, Value: "bar"}, - {Kind: EOF}, + { + `foo ?? bar`, + []Token{ + {Kind: Identifier, Value: "foo"}, + {Kind: Operator, Value: "??"}, + {Kind: Identifier, Value: "bar"}, + {Kind: EOF}, + }, }, - }, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + tokens, err := Lex(file.NewSource(test.input)) + if err != nil { + t.Errorf("%s:\n%v", test.input, err) + return + } + if !compareTokens(tokens, test.tokens) { + t.Errorf("%s:\ngot\n\t%+v\nexpected\n\t%v", test.input, tokens, test.tokens) + } + }) + } } func compareTokens(i1, i2 []Token) bool { @@ -206,19 +219,6 @@ func compareTokens(i1, i2 []Token) bool { return true } -func TestLex(t *testing.T) { - for _, test := range lexTests { - tokens, err := Lex(file.NewSource(test.input)) - if err != nil { - t.Errorf("%s:\n%v", test.input, err) - return - } - if !compareTokens(tokens, test.tokens) { - t.Errorf("%s:\ngot\n\t%+v\nexpected\n\t%v", test.input, tokens, test.tokens) - } - } -} - func TestLex_location(t *testing.T) { source := file.NewSource("1..2 3..4") tokens, err := Lex(source) From 988663ce4e70968bc1420a26eefc548c35bc7ce9 Mon Sep 17 00:00:00 2001 From: Andreas Deininger Date: Tue, 22 Aug 2023 21:25:36 +0200 Subject: [PATCH 106/506] Bump GitHub workflow actions --- .github/workflows/check.yml | 4 ++-- .github/workflows/diff.yml | 6 +++--- .github/workflows/test.yml | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 0b1c6ad04..98c843195 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -10,9 +10,9 @@ jobs: coverage: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Go 1.19 - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: 1.19 - name: Test diff --git a/.github/workflows/diff.yml b/.github/workflows/diff.yml index d76a77ccf..84aad6610 100644 --- a/.github/workflows/diff.yml +++ b/.github/workflows/diff.yml @@ -9,18 +9,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Setup Go 1.19 - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: 1.19 - name: Install benchstat run: go install golang.org/x/perf/cmd/benchstat@latest - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Benchmark new code run: go test -bench=. -benchmem -run=^$ -count=10 -timeout=30m | tee /tmp/new.txt - name: Checkout master - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: master - name: Benchmark master diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0d781a35b..e41af94a4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,9 +13,9 @@ jobs: matrix: go-versions: [ '1.13', '1.14', '1.15', '1.16' , '1.17', '1.18', '1.19', '1.20', '1.21' ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Go ${{ matrix.go-version }} - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} - name: Test From 604a9e0a39ca9b31a0735e5ba4c4b7a48ef864fb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 22 Aug 2023 15:18:03 +0200 Subject: [PATCH 107/506] Add variables --- ast/node.go | 7 +++++ ast/print.go | 4 +++ ast/visitor.go | 3 ++ checker/checker.go | 29 ++++++++++++++++++++ checker/checker_test.go | 1 + compiler/compiler.go | 56 +++++++++++++++++++++++++++++++++++--- expr_test.go | 12 ++++++++ parser/lexer/lexer_test.go | 11 ++++++++ parser/lexer/state.go | 4 ++- parser/parser.go | 21 ++++++++++++++ parser/parser_test.go | 11 ++++++++ vm/opcodes.go | 2 ++ vm/program.go | 27 +++++++++++------- vm/program_test.go | 1 - vm/vm.go | 6 ++++ 15 files changed, 179 insertions(+), 16 deletions(-) diff --git a/ast/node.go b/ast/node.go index ba6545871..1adf95ac9 100644 --- a/ast/node.go +++ b/ast/node.go @@ -151,6 +151,13 @@ type ConditionalNode struct { Exp2 Node } +type VariableDeclaratorNode struct { + base + Name string + Value Node + Expr Node +} + type ArrayNode struct { base Nodes []Node diff --git a/ast/print.go b/ast/print.go index 2e8744730..dd9e0db0f 100644 --- a/ast/print.go +++ b/ast/print.go @@ -130,6 +130,10 @@ func (n *PointerNode) String() string { return "#" } +func (n *VariableDeclaratorNode) String() string { + return fmt.Sprintf("let %s = %s; %s", n.Name, n.Value.String(), n.Expr.String()) +} + func (n *ConditionalNode) String() string { var cond, exp1, exp2 string if _, ok := n.Cond.(*ConditionalNode); ok { diff --git a/ast/visitor.go b/ast/visitor.go index 351e5d72b..287a75589 100644 --- a/ast/visitor.go +++ b/ast/visitor.go @@ -45,6 +45,9 @@ func Walk(node *Node, v Visitor) { case *ClosureNode: Walk(&n.Node, v) case *PointerNode: + case *VariableDeclaratorNode: + Walk(&n.Value, v) + Walk(&n.Expr, v) case *ConditionalNode: Walk(&n.Cond, v) Walk(&n.Exp1, v) diff --git a/checker/checker.go b/checker/checker.go index fe31f8c92..30246c986 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -58,10 +58,17 @@ func Check(tree *parser.Tree, config *conf.Config) (t reflect.Type, err error) { type visitor struct { config *conf.Config collections []reflect.Type + scopes []scope parents []ast.Node err *file.Error } +type scope struct { + name string + vtype reflect.Type + info info +} + type info struct { method bool fn *builtin.Function @@ -104,6 +111,8 @@ func (v *visitor) visit(node ast.Node) (reflect.Type, info) { t, i = v.ClosureNode(n) case *ast.PointerNode: t, i = v.PointerNode(n) + case *ast.VariableDeclaratorNode: + t, i = v.VariableDeclaratorNode(n) case *ast.ConditionalNode: t, i = v.ConditionalNode(n) case *ast.ArrayNode: @@ -135,6 +144,9 @@ func (v *visitor) NilNode(*ast.NilNode) (reflect.Type, info) { } func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) { + if s, ok := v.lookupVariable(node.Value); ok { + return s.vtype, s.info + } if node.Value == "$env" { return mapType, info{} } @@ -862,6 +874,23 @@ func (v *visitor) PointerNode(node *ast.PointerNode) (reflect.Type, info) { return v.error(node, "cannot use %v as array", collection) } +func (v *visitor) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) (reflect.Type, info) { + vtype, vinfo := v.visit(node.Value) + v.scopes = append(v.scopes, scope{node.Name, vtype, vinfo}) + t, i := v.visit(node.Expr) + v.scopes = v.scopes[:len(v.scopes)-1] + return t, i +} + +func (v *visitor) lookupVariable(name string) (scope, bool) { + for i := len(v.scopes) - 1; i >= 0; i-- { + if v.scopes[i].name == name { + return v.scopes[i], true + } + } + return scope{}, false +} + func (v *visitor) ConditionalNode(node *ast.ConditionalNode) (reflect.Type, info) { c, _ := v.visit(node.Cond) if !isBool(c) && !isAny(c) { diff --git a/checker/checker_test.go b/checker/checker_test.go index 4b4f77c46..987f03520 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -125,6 +125,7 @@ var successTests = []string{ "Any.A?.B == nil", "(Any.Bool ?? Bool) > 0", "Bool ?? Bool", + "let foo = 1; foo == 1", } func TestCheck(t *testing.T) { diff --git a/compiler/compiler.go b/compiler/compiler.go index 89a44039e..b40e12756 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -28,6 +28,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro locations: make([]file.Location, 0), constantsIndex: make(map[interface{}]int), functionsIndex: make(map[string]int), + debugInfo: make(map[string]string), } if config != nil { @@ -50,11 +51,12 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro Node: tree.Node, Source: tree.Source, Locations: c.locations, + Variables: c.variables, Constants: c.constants, Bytecode: c.bytecode, Arguments: c.arguments, Functions: c.functions, - FuncNames: c.functionNames, + DebugInfo: c.debugInfo, } return } @@ -62,11 +64,13 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro type compiler struct { locations []file.Location bytecode []Opcode + variables []interface{} + scopes []scope constants []interface{} constantsIndex map[interface{}]int functions []Function - functionNames []string functionsIndex map[string]int + debugInfo map[string]string mapEnv bool cast reflect.Kind nodes []ast.Node @@ -74,6 +78,11 @@ type compiler struct { arguments []int } +type scope struct { + variableName string + index int +} + func (c *compiler) emitLocation(loc file.Location, op Opcode, arg int) int { c.bytecode = append(c.bytecode, op) current := len(c.bytecode) @@ -129,6 +138,13 @@ func (c *compiler) addConstant(constant interface{}) int { return p } +func (c *compiler) addVariable(name string) int { + c.variables = append(c.variables, nil) + p := len(c.variables) - 1 + c.debugInfo[fmt.Sprintf("var_%d", p)] = name + return p +} + // emitFunction adds builtin.Function.Func to the program.Functions and emits call opcode. func (c *compiler) emitFunction(fn *builtin.Function, argsLen int) { switch argsLen { @@ -156,8 +172,8 @@ func (c *compiler) addFunction(fn *builtin.Function) int { } p := len(c.functions) c.functions = append(c.functions, fn.Func) - c.functionNames = append(c.functionNames, fn.Name) c.functionsIndex[fn.Name] = p + c.debugInfo[fmt.Sprintf("func_%d", p)] = fn.Name return p } @@ -209,6 +225,8 @@ func (c *compiler) compile(node ast.Node) { c.ClosureNode(n) case *ast.PointerNode: c.PointerNode(n) + case *ast.VariableDeclaratorNode: + c.VariableDeclaratorNode(n) case *ast.ConditionalNode: c.ConditionalNode(n) case *ast.ArrayNode: @@ -227,6 +245,10 @@ func (c *compiler) NilNode(_ *ast.NilNode) { } func (c *compiler) IdentifierNode(node *ast.IdentifierNode) { + if index, ok := c.lookupVariable(node.Value); ok { + c.emit(OpLoadVar, index) + return + } if node.Value == "$env" { c.emit(OpLoadEnv) return @@ -742,10 +764,36 @@ func (c *compiler) ClosureNode(node *ast.ClosureNode) { c.compile(node.Node) } -func (c *compiler) PointerNode(node *ast.PointerNode) { +func (c *compiler) PointerNode(_ *ast.PointerNode) { c.emit(OpPointer) } +func (c *compiler) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) { + c.compile(node.Value) + index := c.addVariable(node.Name) + c.emit(OpStore, index) + c.beginScope(node.Name, index) + c.compile(node.Expr) + c.endScope() +} + +func (c *compiler) beginScope(name string, index int) { + c.scopes = append(c.scopes, scope{name, index}) +} + +func (c *compiler) endScope() { + c.scopes = c.scopes[:len(c.scopes)-1] +} + +func (c *compiler) lookupVariable(name string) (int, bool) { + for i := len(c.scopes) - 1; i >= 0; i-- { + if c.scopes[i].variableName == name { + return c.scopes[i].index, true + } + } + return 0, false +} + func (c *compiler) ConditionalNode(node *ast.ConditionalNode) { c.compile(node.Cond) otherwise := c.emit(OpJumpIfFalse, placeholder) diff --git a/expr_test.go b/expr_test.go index 3e959bb19..792586278 100644 --- a/expr_test.go +++ b/expr_test.go @@ -948,6 +948,18 @@ func TestExpr(t *testing.T) { `1 /* one */ + 2 // two`, 3, }, + { + `let x = 1; x + 2`, + 3, + }, + { + `map(1..3, let x = #; let y = x * x; y * y)`, + []interface{}{1, 16, 81}, + }, + { + `map(1..2, let x = #; map(2..3, let y = #; x + y))`, + []interface{}{[]interface{}{3, 4}, []interface{}{4, 5}}, + }, } for _, tt := range tests { diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index d69ff7750..1a9418068 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -188,6 +188,17 @@ func TestLex(t *testing.T) { {Kind: EOF}, }, }, + { + `let foo = bar;`, + []Token{ + {Kind: Operator, Value: "let"}, + {Kind: Identifier, Value: "foo"}, + {Kind: Operator, Value: "="}, + {Kind: Identifier, Value: "bar"}, + {Kind: Operator, Value: ";"}, + {Kind: EOF}, + }, + }, } for _, test := range tests { diff --git a/parser/lexer/state.go b/parser/lexer/state.go index c8f0d1725..8e1001b26 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -37,7 +37,7 @@ func root(l *lexer) stateFn { l.emit(Bracket) case strings.ContainsRune(")]}", r): l.emit(Bracket) - case strings.ContainsRune("#,:%+-^", r): // single rune operator + case strings.ContainsRune("#,:;%+-^", r): // single rune operator l.emit(Operator) case strings.ContainsRune("&!=*<>", r): // possible double rune operator l.accept("&=*") @@ -124,6 +124,8 @@ loop: return not case "in", "or", "and", "matches", "contains", "startsWith", "endsWith": l.emit(Operator) + case "let": + l.emit(Operator) default: l.emit(Identifier) } diff --git a/parser/parser.go b/parser/parser.go index 102091748..4268101a4 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -110,6 +110,12 @@ func (p *parser) expect(kind Kind, values ...string) { // parse functions func (p *parser) parseExpression(precedence int) Node { + if precedence == 0 { + if p.current.Is(Operator, "let") { + return p.parseVariableDeclaration() + } + } + nodeLeft := p.parsePrimary() prevOperator := "" @@ -179,6 +185,21 @@ func (p *parser) parseExpression(precedence int) Node { return nodeLeft } +func (p *parser) parseVariableDeclaration() Node { + p.expect(Operator, "let") + variableName := p.current + p.expect(Identifier) + p.expect(Operator, "=") + value := p.parseExpression(0) + p.expect(Operator, ";") + node := p.parseExpression(0) + return &VariableDeclaratorNode{ + Name: variableName.Value, + Value: value, + Expr: node, + } +} + func (p *parser) parseConditional(node Node) Node { var expr1, expr2 Node for p.current.Is(Operator, "?") && p.err == nil { diff --git a/parser/parser_test.go b/parser/parser_test.go index bbd38476d..002f1f34b 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -452,6 +452,17 @@ func TestParse(t *testing.T) { Callee: &IdentifierNode{Value: "ok"}, Arguments: []Node{ &BoolNode{Value: true}}}}, + { + `let foo = a + b; foo + c`, + &VariableDeclaratorNode{ + Name: "foo", + Value: &BinaryNode{Operator: "+", + Left: &IdentifierNode{Value: "a"}, + Right: &IdentifierNode{Value: "b"}}, + Expr: &BinaryNode{Operator: "+", + Left: &IdentifierNode{Value: "foo"}, + Right: &IdentifierNode{Value: "c"}}}, + }, } for _, test := range parseTests { actual, err := parser.ParseWithConfig(test.input, &conf.Config{Pipes: true}) diff --git a/vm/opcodes.go b/vm/opcodes.go index 1720fd4c2..079d1c76f 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -7,6 +7,8 @@ const ( OpPush OpPushInt OpPop + OpStore + OpLoadVar OpLoadConst OpLoadField OpLoadFast diff --git a/vm/program.go b/vm/program.go index ccc7cfb41..1481dbf93 100644 --- a/vm/program.go +++ b/vm/program.go @@ -19,11 +19,12 @@ type Program struct { Node ast.Node Source *file.Source Locations []file.Location + Variables []interface{} Constants []interface{} Bytecode []Opcode Arguments []int Functions []Function - FuncNames []string + DebugInfo map[string]string } func (program *Program) Disassemble() string { @@ -54,6 +55,9 @@ func (program *Program) Opcodes(w io.Writer) { argument := func(label string) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\n", pp, label, arg) } + argumentWithInfo := func(label string, prefix string) { + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, program.DebugInfo[fmt.Sprintf("%s_%d", prefix, arg)]) + } constant := func(label string) { var c interface{} if arg < len(program.Constants) { @@ -72,12 +76,9 @@ func (program *Program) Opcodes(w io.Writer) { } _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, c) } - builtin := func(label string) { + builtinArg := func(label string) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, builtin.Builtins[arg].Name) } - funcName := func(label string) { - _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v()\n", pp, label, arg, program.FuncNames[arg]) - } switch op { case OpInvalid: @@ -92,6 +93,12 @@ func (program *Program) Opcodes(w io.Writer) { case OpPop: code("OpPop") + case OpStore: + argumentWithInfo("OpStore", "var") + + case OpLoadVar: + argumentWithInfo("OpLoadVar", "var") + case OpLoadConst: constant("OpLoadConst") @@ -222,16 +229,16 @@ func (program *Program) Opcodes(w io.Writer) { argument("OpCall") case OpCall0: - funcName("OpCall0") + argumentWithInfo("OpCall0", "func") case OpCall1: - funcName("OpCall1") + argumentWithInfo("OpCall1", "func") case OpCall2: - funcName("OpCall2") + argumentWithInfo("OpCall2", "func") case OpCall3: - funcName("OpCall3") + argumentWithInfo("OpCall3", "func") case OpCallN: argument("OpCallN") @@ -244,7 +251,7 @@ func (program *Program) Opcodes(w io.Writer) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, "OpCallTyped", arg, signature) case OpCallBuiltin1: - builtin("OpCallBuiltin1") + builtinArg("OpCallBuiltin1") case OpArray: code("OpArray") diff --git a/vm/program_test.go b/vm/program_test.go index c1cdf4f4c..06e83b18c 100644 --- a/vm/program_test.go +++ b/vm/program_test.go @@ -13,7 +13,6 @@ func TestProgram_Disassemble(t *testing.T) { Constants: []interface{}{1, 2}, Bytecode: []vm.Opcode{op}, Arguments: []int{1}, - FuncNames: []string{"foo", "bar"}, } d := program.Disassemble() if strings.Contains(d, "(unknown)") { diff --git a/vm/vm.go b/vm/vm.go index 343a02064..49bee401f 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -102,6 +102,12 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpPop: vm.pop() + case OpStore: + program.Variables[arg] = vm.pop() + + case OpLoadVar: + vm.push(program.Variables[arg]) + case OpLoadConst: vm.push(runtime.Fetch(env, program.Constants[arg])) From f716dc5d7cbda78c14fedb736ddb0133c083448a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 22 Aug 2023 17:50:57 +0200 Subject: [PATCH 108/506] Add predicates to list of builtins --- builtin/builtin.go | 46 +++++++++++++++++++++++++++++++++++----- builtin/builtin_test.go | 25 +++++++++++++++------- checker/checker_test.go | 4 ++-- test/deref/deref_test.go | 16 +++++++------- 4 files changed, 68 insertions(+), 23 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index f03162b2f..82922e9dd 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -12,11 +12,12 @@ import ( ) type Function struct { - Name string - Func func(args ...interface{}) (interface{}, error) - Types []reflect.Type - Builtin1 func(arg interface{}) interface{} - Validate func(args []reflect.Type) (reflect.Type, error) + Name string + Func func(args ...interface{}) (interface{}, error) + Types []reflect.Type + Builtin1 func(arg interface{}) interface{} + Validate func(args []reflect.Type) (reflect.Type, error) + Predicate bool } var ( @@ -34,6 +35,41 @@ func init() { } var Builtins = []*Function{ + { + Name: "all", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + }, + { + Name: "none", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + }, + { + Name: "any", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + }, + { + Name: "one", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + }, + { + Name: "filter", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) []interface{})), + }, + { + Name: "map", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) interface{}) []interface{})), + }, + { + Name: "count", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) int)), + }, { Name: "len", Builtin1: Len, diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index ea273cce7..d1e4b88fc 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -113,6 +113,9 @@ func TestBuiltin_works_with_any(t *testing.T) { } for _, b := range builtin.Builtins { + if b.Predicate { + continue + } t.Run(b.Name, func(t *testing.T) { arity := 1 if c, ok := config[b.Name]; ok { @@ -249,12 +252,15 @@ func TestBuiltin_disallow_builtins_override(t *testing.T) { func TestBuiltin_DisableBuiltin(t *testing.T) { t.Run("via env", func(t *testing.T) { - for _, name := range builtin.Names { - t.Run(name, func(t *testing.T) { + for _, b := range builtin.Builtins { + if b.Predicate { + continue // TODO: allow to disable predicates + } + t.Run(b.Name, func(t *testing.T) { env := map[string]interface{}{ - name: func() int { return 42 }, + b.Name: func() int { return 42 }, } - program, err := expr.Compile(name+"()", expr.Env(env), expr.DisableBuiltin(name)) + program, err := expr.Compile(b.Name+"()", expr.Env(env), expr.DisableBuiltin(b.Name)) require.NoError(t, err) out, err := expr.Run(program, env) @@ -264,15 +270,18 @@ func TestBuiltin_DisableBuiltin(t *testing.T) { } }) t.Run("via expr.Function", func(t *testing.T) { - for _, name := range builtin.Names { - t.Run(name, func(t *testing.T) { - fn := expr.Function(name, + for _, b := range builtin.Builtins { + if b.Predicate { + continue // TODO: allow to disable predicates + } + t.Run(b.Name, func(t *testing.T) { + fn := expr.Function(b.Name, func(params ...interface{}) (interface{}, error) { return 42, nil }, new(func() int), ) - program, err := expr.Compile(name+"()", fn, expr.DisableBuiltin(name)) + program, err := expr.Compile(b.Name+"()", fn, expr.DisableBuiltin(b.Name)) require.NoError(t, err) out, err := expr.Run(program, nil) diff --git a/checker/checker_test.go b/checker/checker_test.go index 987f03520..51a234f18 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -635,7 +635,7 @@ func TestCheck_AllowUndefinedVariables(t *testing.T) { A int } - tree, err := parser.Parse(`any + fn()`) + tree, err := parser.Parse(`Any + fn()`) require.NoError(t, err) config := conf.New(Env{}) @@ -648,7 +648,7 @@ func TestCheck_AllowUndefinedVariables(t *testing.T) { func TestCheck_AllowUndefinedVariables_DefaultType(t *testing.T) { env := map[string]bool{} - tree, err := parser.Parse(`any`) + tree, err := parser.Parse(`Any`) require.NoError(t, err) config := conf.New(env) diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index 761e779f2..1e1bb83a1 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -12,12 +12,12 @@ func TestDeref_binary(t *testing.T) { i := 1 env := map[string]interface{}{ "i": &i, - "map": map[string]interface{}{ + "obj": map[string]interface{}{ "i": &i, }, } t.Run("==", func(t *testing.T) { - program, err := expr.Compile(`i == 1 && map.i == 1`, expr.Env(env)) + program, err := expr.Compile(`i == 1 && obj.i == 1`, expr.Env(env)) require.NoError(t, err) out, err := expr.Run(program, env) @@ -25,7 +25,7 @@ func TestDeref_binary(t *testing.T) { require.Equal(t, true, out) }) t.Run("><", func(t *testing.T) { - program, err := expr.Compile(`i > 0 && map.i < 99`, expr.Env(env)) + program, err := expr.Compile(`i > 0 && obj.i < 99`, expr.Env(env)) require.NoError(t, err) out, err := expr.Run(program, env) @@ -33,7 +33,7 @@ func TestDeref_binary(t *testing.T) { require.Equal(t, true, out) }) t.Run("??+", func(t *testing.T) { - program, err := expr.Compile(`(i ?? map.i) + 1`, expr.Env(env)) + program, err := expr.Compile(`(i ?? obj.i) + 1`, expr.Env(env)) require.NoError(t, err) out, err := expr.Run(program, env) @@ -47,12 +47,12 @@ func TestDeref_unary(t *testing.T) { ok := true env := map[string]interface{}{ "i": &i, - "map": map[string]interface{}{ + "obj": map[string]interface{}{ "ok": &ok, }, } - program, err := expr.Compile(`-i < 0 && !!map.ok`, expr.Env(env)) + program, err := expr.Compile(`-i < 0 && !!obj.ok`, expr.Env(env)) require.NoError(t, err) out, err := expr.Run(program, env) @@ -64,11 +64,11 @@ func TestDeref_eval(t *testing.T) { i := 1 env := map[string]interface{}{ "i": &i, - "map": map[string]interface{}{ + "obj": map[string]interface{}{ "i": &i, }, } - out, err := expr.Eval(`i == 1 && map.i == 1`, env) + out, err := expr.Eval(`i == 1 && obj.i == 1`, env) require.NoError(t, err) require.Equal(t, true, out) } From 1d1b5bb839d8481fb7866df88a2b313f5923c343 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 22 Aug 2023 21:27:07 +0200 Subject: [PATCH 109/506] Forbid to redeclare variables, builtins, functions. --- checker/checker.go | 12 ++++++++++++ checker/checker_test.go | 20 ++++++++++++++++++++ parser/parser.go | 4 +++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/checker/checker.go b/checker/checker.go index 30246c986..4a001f4d2 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -875,6 +875,18 @@ func (v *visitor) PointerNode(node *ast.PointerNode) (reflect.Type, info) { } func (v *visitor) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) (reflect.Type, info) { + if _, ok := v.config.Types[node.Name]; ok { + return v.error(node, "cannot redeclare %v", node.Name) + } + if _, ok := v.config.Functions[node.Name]; ok { + return v.error(node, "cannot redeclare function %v", node.Name) + } + if _, ok := v.config.Builtins[node.Name]; ok { + return v.error(node, "cannot redeclare builtin %v", node.Name) + } + if _, ok := v.lookupVariable(node.Name); ok { + return v.error(node, "cannot redeclare variable %v", node.Name) + } vtype, vinfo := v.visit(node.Value) v.scopes = append(v.scopes, scope{node.Name, vtype, vinfo}) t, i := v.visit(node.Expr) diff --git a/checker/checker_test.go b/checker/checker_test.go index 51a234f18..e1c7e50b2 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -507,6 +507,26 @@ repeat("0", 1/0) cannot use float64 as argument (type int) to call repeat (1:14) | repeat("0", 1/0) | .............^ + +let map = 42; map +cannot redeclare builtin map (1:5) + | let map = 42; map + | ....^ + +let len = 42; len +cannot redeclare builtin len (1:5) + | let len = 42; len + | ....^ + +let Float = 42; Float +cannot redeclare Float (1:5) + | let Float = 42; Float + | ....^ + +let foo = 1; let foo = 2; foo +cannot redeclare variable foo (1:18) + | let foo = 1; let foo = 2; foo + | .................^ ` func TestCheck_error(t *testing.T) { diff --git a/parser/parser.go b/parser/parser.go index 4268101a4..f2afc2eca 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -193,11 +193,13 @@ func (p *parser) parseVariableDeclaration() Node { value := p.parseExpression(0) p.expect(Operator, ";") node := p.parseExpression(0) - return &VariableDeclaratorNode{ + let := &VariableDeclaratorNode{ Name: variableName.Value, Value: value, Expr: node, } + let.SetLocation(variableName.Location) + return let } func (p *parser) parseConditional(node Node) Node { From 5a5fa0d5fde3877f33932ce78586eddbac2969e5 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 23 Aug 2023 11:31:30 +0200 Subject: [PATCH 110/506] Update benchmarks --- bench_test.go | 388 +++++++++++++++++++++++++++----------------------- 1 file changed, 212 insertions(+), 176 deletions(-) diff --git a/bench_test.go b/bench_test.go index 1f7f14769..b97897393 100644 --- a/bench_test.go +++ b/bench_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/antonmedv/expr" - "github.com/antonmedv/expr/test/real_world" "github.com/antonmedv/expr/vm" + "github.com/stretchr/testify/require" ) func Benchmark_expr(b *testing.B) { @@ -16,9 +16,7 @@ func Benchmark_expr(b *testing.B) { params["Value"] = 100 program, err := expr.Compile(`(Origin == "MOW" || Country == "RU") && (Value >= 100 || Adults == 1)`, expr.Env(params)) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) var out interface{} @@ -28,12 +26,8 @@ func Benchmark_expr(b *testing.B) { } b.StopTimer() - if err != nil { - b.Fatal(err) - } - if !out.(bool) { - b.Fail() - } + require.NoError(b, err) + require.True(b, out.(bool)) } func Benchmark_expr_reuseVm(b *testing.B) { @@ -44,9 +38,7 @@ func Benchmark_expr_reuseVm(b *testing.B) { params["Value"] = 100 program, err := expr.Compile(`(Origin == "MOW" || Country == "RU") && (Value >= 100 || Adults == 1)`, expr.Env(params)) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) var out interface{} v := vm.VM{} @@ -57,67 +49,179 @@ func Benchmark_expr_reuseVm(b *testing.B) { } b.StopTimer() - if err != nil { - b.Fatal(err) + require.NoError(b, err) + require.True(b, out.(bool)) +} + +func Benchmark_len(b *testing.B) { + env := map[string]interface{}{ + "arr": make([]int, 100), } - if !out.(bool) { - b.Fail() + + program, err := expr.Compile(`len(arr)`, expr.Env(env)) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = vm.Run(program, env) } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 100, out) } func Benchmark_filter(b *testing.B) { - type Item struct { - Value int + type Env struct { + Ints []int } + env := Env{ + Ints: make([]int, 1000), + } + for i := 1; i <= len(env.Ints); i++ { + env.Ints[i-1] = i + } + + program, err := expr.Compile(`filter(Ints, # % 7 == 0)`, expr.Env(Env{})) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = vm.Run(program, env) + } + b.StopTimer() + + require.NoError(b, err) + require.Len(b, out.([]interface{}), 142) +} + +func Benchmark_filterLen(b *testing.B) { type Env struct { - Items []Item + Ints []int + } + env := Env{ + Ints: make([]int, 1000), + } + for i := 1; i <= len(env.Ints); i++ { + env.Ints[i-1] = i } - program, err := expr.Compile(`filter(filter(Items, {.Value % 2 == 0}), {.Value % 3 == 0})`, expr.Env(Env{})) - if err != nil { - b.Fatal(err) + program, err := expr.Compile(`len(filter(Ints, # % 7 == 0))`, expr.Env(Env{})) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = vm.Run(program, env) } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 142, out) +} +func Benchmark_filterFirst(b *testing.B) { + type Env struct { + Ints []int + } env := Env{ - Items: make([]Item, 100), + Ints: make([]int, 1000), } - for i := 1; i <= 100; i++ { - env.Items[i-1].Value = i + for i := 1; i <= len(env.Ints); i++ { + env.Ints[i-1] = i } + program, err := expr.Compile(`filter(Ints, # % 7 == 0)[0]`, expr.Env(Env{})) + require.NoError(b, err) + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) + require.NoError(b, err) + require.Equal(b, 7, out) +} + +func Benchmark_filterLast(b *testing.B) { + type Env struct { + Ints []int } - if len(out.([]interface{})) != 16 { - b.Fail() + env := Env{ + Ints: make([]int, 1000), + } + for i := 1; i <= len(env.Ints); i++ { + env.Ints[i-1] = i } + + program, err := expr.Compile(`filter(Ints, # % 7 == 0)[-1]`, expr.Env(Env{})) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = vm.Run(program, env) + } + + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 994, out) } -func Benchmark_len(b *testing.B) { - program, err := expr.Compile(`len(1..100)`) - if err != nil { - b.Fatal(err) +func Benchmark_filterMap(b *testing.B) { + type Env struct { + Ints []int + } + env := Env{ + Ints: make([]int, 1000), } + for i := 1; i <= len(env.Ints); i++ { + env.Ints[i-1] = i + } + + program, err := expr.Compile(`map(filter(Ints, # % 7 == 0), # * 2)`, expr.Env(Env{})) + require.NoError(b, err) var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - out, err = vm.Run(program, nil) + out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) + require.NoError(b, err) + require.Len(b, out.([]interface{}), 142) + require.Equal(b, 14, out.([]interface{})[0]) +} + +func Benchmark_arrayIndex(b *testing.B) { + env := map[string]interface{}{ + "arr": make([]int, 100), } - if out.(int) != 100 { - b.Fail() + for i := 0; i < 100; i++ { + env["arr"].([]int)[i] = i } + + program, err := expr.Compile(`arr[50]`, expr.Env(env)) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = vm.Run(program, env) + } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 50, out) } -func Benchmark_access(b *testing.B) { +func Benchmark_envStruct(b *testing.B) { type Price struct { Value int } @@ -126,22 +230,22 @@ func Benchmark_access(b *testing.B) { } program, err := expr.Compile(`Price.Value > 0`, expr.Env(Env{})) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) env := Env{Price: Price{Value: 1}} + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, env) + out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.True(b, out.(bool)) } -func Benchmark_accessMap(b *testing.B) { +func Benchmark_envMap(b *testing.B) { type Price struct { Value int } @@ -150,17 +254,17 @@ func Benchmark_accessMap(b *testing.B) { } program, err := expr.Compile(`price.Value > 0`, expr.Env(env)) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, env) + out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.True(b, out.(bool)) } type CallEnv struct { @@ -188,43 +292,41 @@ func (CallFoo) Method() string { func Benchmark_callFunc(b *testing.B) { program, err := expr.Compile(`Func()`, expr.Env(CallEnv{})) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) env := CallEnv{} + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, env) + out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.Equal(b, "func", out) } func Benchmark_callMethod(b *testing.B) { program, err := expr.Compile(`Foo.Method()`, expr.Env(CallEnv{})) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) env := CallEnv{} + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, env) + out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.Equal(b, "method", out) } func Benchmark_callField(b *testing.B) { program, err := expr.Compile(`Fn()`, expr.Env(CallEnv{})) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) env := CallEnv{ Fn: func() bool { @@ -232,13 +334,15 @@ func Benchmark_callField(b *testing.B) { }, } + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, env) + out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.True(b, out.(bool)) } func Benchmark_callFast(b *testing.B) { @@ -254,37 +358,31 @@ func Benchmark_callFast(b *testing.B) { } var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } - if out.(string) != "fn_fast" { - b.Fail() - } + require.NoError(b, err) + require.Equal(b, "fn_fast", out) } func Benchmark_callConstExpr(b *testing.B) { program, err := expr.Compile(`Func()`, expr.Env(CallEnv{}), expr.ConstExpr("Func")) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) env := CallEnv{} var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } - if out.(string) != "func" { - b.Fail() - } + require.NoError(b, err) + require.Equal(b, "func", out) } func Benchmark_largeStructAccess(b *testing.B) { @@ -293,20 +391,20 @@ func Benchmark_largeStructAccess(b *testing.B) { Field int } - program, err := expr.Compile(`Field > 0 && Field > 1 && Field < 20`, expr.Env(Env{})) - if err != nil { - b.Fatal(err) - } + program, err := expr.Compile(`Field > 0 && Field > 1 && Field < 99`, expr.Env(Env{})) + require.NoError(b, err) env := Env{Field: 21} + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, &env) + out, err = vm.Run(program, &env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.True(b, out.(bool)) } func Benchmark_largeNestedStructAccess(b *testing.B) { @@ -317,21 +415,21 @@ func Benchmark_largeNestedStructAccess(b *testing.B) { } } - program, err := expr.Compile(`Inner.Field > 0 && Inner.Field > 1 && Inner.Field < 20`, expr.Env(Env{})) - if err != nil { - b.Fatal(err) - } + program, err := expr.Compile(`Inner.Field > 0 && Inner.Field > 1 && Inner.Field < 99`, expr.Env(Env{})) + require.NoError(b, err) env := Env{} env.Inner.Field = 21 + var out interface{} + b.ResetTimer() for n := 0; n < b.N; n++ { - _, err = vm.Run(program, &env) + out, err = vm.Run(program, &env) } + b.StopTimer() - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) + require.True(b, out.(bool)) } func Benchmark_largeNestedArrayAccess(b *testing.B) { @@ -340,80 +438,18 @@ func Benchmark_largeNestedArrayAccess(b *testing.B) { } program, err := expr.Compile(`Data[0][0] > 0`, expr.Env(Env{})) - if err != nil { - b.Fatal(err) - } + require.NoError(b, err) env := Env{} - - for n := 0; n < b.N; n++ { - _, err = vm.Run(program, &env) - } - - if err != nil { - b.Fatal(err) - } -} - -func Benchmark_realWorld(b *testing.B) { - env := real_world.NewEnv() - expression := `(UserAgentDevice == 'DESKTOP') and ((OriginCountry == 'RU' or DestinationCountry == 'RU') and Market in ['ru', 'kz','by','uz','ua','az','am'])` - program, err := expr.Compile(expression, expr.Env(env)) - if err != nil { - b.Fatal(err) - } - - var out interface{} - for n := 0; n < b.N; n++ { - out, err = vm.Run(program, env) - } - if err != nil { - b.Fatal(err) - } - if !out.(bool) { - b.Fail() - } -} - -func Benchmark_realWorld_reuseVm(b *testing.B) { - env := real_world.NewEnv() - expression := `(UserAgentDevice == 'DESKTOP') and ((OriginCountry == 'RU' or DestinationCountry == 'RU') and Market in ['ru', 'kz','by','uz','ua','az','am'])` - program, err := expr.Compile(expression, expr.Env(env)) - if err != nil { - b.Fatal(err) - } + env.Data[0][0] = 1 var out interface{} - v := vm.VM{} - + b.ResetTimer() for n := 0; n < b.N; n++ { - out, err = v.Run(program, env) - } - - if err != nil { - b.Fatal(err) - } - if !out.(bool) { - b.Fail() - } -} - -func Benchmark_realWorldInsane(b *testing.B) { - env := real_world.NewEnv() - expression := `(UserAgentDevice == 'DESKTOP') and (Segments[0].Origin in ['HKT','GOJ'] and Segments[0].Destination in ['HKT','GOJ'] or Segments[0].Origin in ['SKG','GOJ'] and Segments[0].Destination in ['SKG','GOJ'] or Segments[0].Origin in ['SSH','SVX'] and Segments[0].Destination in ['SSH','SVX'] or Segments[0].Origin in ['AYT','LED'] and Segments[0].Destination in ['AYT','LED'] or Segments[0].Origin in ['PUJ','KRR'] and Segments[0].Destination in ['PUJ','KRR'] or Segments[0].Origin in ['USM','CEK'] and Segments[0].Destination in ['USM','CEK'] or Segments[0].Origin in ['SHJ','LED'] and Segments[0].Destination in ['SHJ','LED'] or Segments[0].Origin in ['MOW','PRG'] and Segments[0].Destination in ['MOW','PRG'] or Segments[0].Origin in ['BKK','NOZ'] and Segments[0].Destination in ['BKK','NOZ'] or Segments[0].Origin in ['NHA','GOJ'] and Segments[0].Destination in ['NHA','GOJ'] or Segments[0].Origin in ['HRG','VOG'] and Segments[0].Destination in ['HRG','VOG'] or Segments[0].Origin in ['CFU','MSQ'] and Segments[0].Destination in ['CFU','MSQ'] or Segments[0].Origin in ['UFA','PUJ'] and Segments[0].Destination in ['UFA','PUJ'] or Segments[0].Origin in ['OMS','PUJ'] and Segments[0].Destination in ['OMS','PUJ'] or Segments[0].Origin in ['SKG','MSQ'] and Segments[0].Destination in ['SKG','MSQ'] or Segments[0].Origin in ['SSH','VOZ'] and Segments[0].Destination in ['SSH','VOZ'] or Segments[0].Origin in ['SSH','EGO'] and Segments[0].Destination in ['SSH','EGO'] or Segments[0].Origin in ['UUS','NHA'] and Segments[0].Destination in ['UUS','NHA'] or Segments[0].Origin in ['PUJ','MCX'] and Segments[0].Destination in ['PUJ','MCX'] or Segments[0].Origin in ['NHA','VVO'] and Segments[0].Destination in ['NHA','VVO'] or Segments[0].Origin in ['SKD','MOW'] and Segments[0].Destination in ['SKD','MOW'] or Segments[0].Origin in ['REN','NHA'] and Segments[0].Destination in ['REN','NHA'] or Segments[0].Origin in ['ASF','VRA'] and Segments[0].Destination in ['ASF','VRA'] or Segments[0].Origin in ['YKS','VRA'] and Segments[0].Destination in ['YKS','VRA'] or Segments[0].Origin in ['MOW','RIX'] and Segments[0].Destination in ['MOW','RIX'] or Segments[0].Origin in ['HER','IEV'] and Segments[0].Destination in ['HER','IEV'] or Segments[0].Origin in ['HRG','EGO'] and Segments[0].Destination in ['HRG','EGO'] or Segments[0].Origin in ['MOW','ATH'] and Segments[0].Destination in ['MOW','ATH'] or Segments[0].Origin in ['EGO','SSH'] and Segments[0].Destination in ['EGO','SSH'] or Segments[0].Origin in ['CEK','CUN'] and Segments[0].Destination in ['CEK','CUN'] or Segments[0].Origin in ['VAR','MOW'] and Segments[0].Destination in ['VAR','MOW'] or Segments[0].Origin in ['ASF','NHA'] and Segments[0].Destination in ['ASF','NHA'] or Segments[0].Origin in ['SKG','OVB'] and Segments[0].Destination in ['SKG','OVB'] or Segments[0].Origin in ['CUN','VOZ'] and Segments[0].Destination in ['CUN','VOZ'] or Segments[0].Origin in ['HRG','OVB'] and Segments[0].Destination in ['HRG','OVB'] or Segments[0].Origin in ['LED','VAR'] and Segments[0].Destination in ['LED','VAR'] or Segments[0].Origin in ['OMS','CUN'] and Segments[0].Destination in ['OMS','CUN'] or Segments[0].Origin in ['PUJ','NOZ'] and Segments[0].Destination in ['PUJ','NOZ'] or Segments[0].Origin in ['CUN','OMS'] and Segments[0].Destination in ['CUN','OMS'] or Segments[0].Origin in ['BAX','NHA'] and Segments[0].Destination in ['BAX','NHA'] or Segments[0].Origin in ['TDX','TJM'] and Segments[0].Destination in ['TDX','TJM'] or Segments[0].Origin in ['BKK','YKS'] and Segments[0].Destination in ['BKK','YKS'] or Segments[0].Origin in ['PUJ','MRV'] and Segments[0].Destination in ['PUJ','MRV'] or Segments[0].Origin in ['KUF','MOW'] and Segments[0].Destination in ['KUF','MOW'] or Segments[0].Origin in ['NHA','YKS'] and Segments[0].Destination in ['NHA','YKS'] or Segments[0].Origin in ['UFA','CUN'] and Segments[0].Destination in ['UFA','CUN'] or Segments[0].Origin in ['MIR','MOW'] and Segments[0].Destination in ['MIR','MOW'] or Segments[0].Origin in ['OVB','PUJ'] and Segments[0].Destination in ['OVB','PUJ'] or Segments[0].Origin in ['SGN','KJA'] and Segments[0].Destination in ['SGN','KJA'] or Segments[0].Origin in ['UTP','CEK'] and Segments[0].Destination in ['UTP','CEK'] or Segments[0].Origin in ['SKG','IEV'] and Segments[0].Destination in ['SKG','IEV'] or Segments[0].Origin in ['PKC','MOW'] and Segments[0].Destination in ['PKC','MOW'] or Segments[0].Origin in ['NHA','OGZ'] and Segments[0].Destination in ['NHA','OGZ'] or Segments[0].Origin in ['USM','UFA'] and Segments[0].Destination in ['USM','UFA'] or Segments[0].Origin in ['KGD','VRA'] and Segments[0].Destination in ['KGD','VRA'] or Segments[0].Origin in ['TDX','KZN'] and Segments[0].Destination in ['TDX','KZN'] or Segments[0].Origin in ['KRR','CUN'] and Segments[0].Destination in ['KRR','CUN'] or Segments[0].Origin in ['DXB','PEE'] and Segments[0].Destination in ['DXB','PEE'] or Segments[0].Origin in ['AER','KUF'] and Segments[0].Destination in ['AER','KUF'] or Segments[0].Origin in ['REN','SSH'] and Segments[0].Destination in ['REN','SSH'] or Segments[0].Origin in ['HKT','NJC'] and Segments[0].Destination in ['HKT','NJC'] or Segments[0].Origin in ['AER','CUN'] and Segments[0].Destination in ['AER','CUN'] or Segments[0].Origin in ['ETH','SVX'] and Segments[0].Destination in ['ETH','SVX'] or Segments[0].Origin in ['SSH','CEK'] and Segments[0].Destination in ['SSH','CEK'] or Segments[0].Origin in ['BKK','UFA'] and Segments[0].Destination in ['BKK','UFA'] or Segments[0].Origin in ['SVX','SKG'] and Segments[0].Destination in ['SVX','SKG'] or Segments[0].Origin in ['BKK','VOG'] and Segments[0].Destination in ['BKK','VOG'] or Segments[0].Origin in ['SKG','MOW'] and Segments[0].Destination in ['SKG','MOW'] or Segments[0].Origin in ['NHA','NOZ'] and Segments[0].Destination in ['NHA','NOZ'] or Segments[0].Origin in ['YKS','OVB'] and Segments[0].Destination in ['YKS','OVB'] or Segments[0].Origin in ['UFA','VRA'] and Segments[0].Destination in ['UFA','VRA'] or Segments[0].Origin in ['MOW','TCI'] and Segments[0].Destination in ['MOW','TCI'] or Segments[0].Origin in ['ASF','PUJ'] and Segments[0].Destination in ['ASF','PUJ'] or Segments[0].Origin in ['GOJ','CUN'] and Segments[0].Destination in ['GOJ','CUN'] or Segments[0].Origin in ['ASF','CUN'] and Segments[0].Destination in ['ASF','CUN'] or Segments[0].Origin in ['SGN','CEK'] and Segments[0].Destination in ['SGN','CEK'] or Segments[0].Origin in ['TJM','SSH'] and Segments[0].Destination in ['TJM','SSH'] or Segments[0].Origin in ['UTP','KZN'] and Segments[0].Destination in ['UTP','KZN'] or Segments[0].Origin in ['HRG','REN'] and Segments[0].Destination in ['HRG','REN'] or Segments[0].Origin in ['HKT','KJA'] and Segments[0].Destination in ['HKT','KJA'] or Segments[0].Origin in ['BEG','MOW'] and Segments[0].Destination in ['BEG','MOW'] or Segments[0].Origin in ['OMS','SSH'] and Segments[0].Destination in ['OMS','SSH'] or Segments[0].Origin in ['MSQ','SKG'] and Segments[0].Destination in ['MSQ','SKG'] or Segments[0].Origin in ['BKK','HTA'] and Segments[0].Destination in ['BKK','HTA'] or Segments[0].Origin in ['TDX','PEE'] and Segments[0].Destination in ['TDX','PEE'] or Segments[0].Origin in ['SKG','MRV'] and Segments[0].Destination in ['SKG','MRV'] or Segments[0].Origin in ['SGN','OVB'] and Segments[0].Destination in ['SGN','OVB'] or Segments[0].Origin in ['SVX','HRG'] and Segments[0].Destination in ['SVX','HRG'] or Segments[0].Origin in ['HKT','AER'] and Segments[0].Destination in ['HKT','AER'] or Segments[0].Origin in ['CEE','CUN'] and Segments[0].Destination in ['CEE','CUN'] or Segments[0].Origin in ['NHA','SVX'] and Segments[0].Destination in ['NHA','SVX'] or Segments[0].Origin in ['CUN','GOJ'] and Segments[0].Destination in ['CUN','GOJ'] or Segments[0].Origin in ['MOW','OGZ'] and Segments[0].Destination in ['MOW','OGZ'] or Segments[0].Origin in ['SCW','SSH'] and Segments[0].Destination in ['SCW','SSH'] or Segments[0].Origin in ['PUJ','PEE'] and Segments[0].Destination in ['PUJ','PEE'] or Segments[0].Origin in ['CUN','ASF'] and Segments[0].Destination in ['CUN','ASF'] or Segments[0].Origin in ['AQJ','SVX'] and Segments[0].Destination in ['AQJ','SVX'] or Segments[0].Origin in ['VRA','IKT'] and Segments[0].Destination in ['VRA','IKT'] or Segments[0].Origin in ['SHJ','SVX'] and Segments[0].Destination in ['SHJ','SVX'] or Segments[0].Origin in ['NBC','VRA'] and Segments[0].Destination in ['NBC','VRA'] or Segments[0].Origin in ['HTA','CUN'] and Segments[0].Destination in ['HTA','CUN'] or Segments[0].Origin in ['MOW','TOF'] and Segments[0].Destination in ['MOW','TOF'] or Segments[0].Origin in ['NJC','CUN'] and Segments[0].Destination in ['NJC','CUN'] or Segments[0].Origin in ['CUN','NOZ'] and Segments[0].Destination in ['CUN','NOZ'] or Segments[0].Origin in ['BTK','NHA'] and Segments[0].Destination in ['BTK','NHA'] or Segments[0].Origin in ['PUJ','OMS'] and Segments[0].Destination in ['PUJ','OMS'] or Segments[0].Origin in ['HTA','OVB'] and Segments[0].Destination in ['HTA','OVB'] or Segments[0].Origin in ['AQJ','KZN'] and Segments[0].Destination in ['AQJ','KZN'] or Segments[0].Origin in ['DXB','VOZ'] and Segments[0].Destination in ['DXB','VOZ'] or Segments[0].Origin in ['NHA','PEE'] and Segments[0].Destination in ['NHA','PEE'] or Segments[0].Origin in ['HKT','OGZ'] and Segments[0].Destination in ['HKT','OGZ'] or Segments[0].Origin in ['KLV','MOW'] and Segments[0].Destination in ['KLV','MOW'] or Segments[0].Origin in ['MRV','SKG'] and Segments[0].Destination in ['MRV','SKG'] or Segments[0].Origin in ['SKG','LED'] and Segments[0].Destination in ['SKG','LED'] or Segments[0].Origin in ['AQJ','MOW'] and Segments[0].Destination in ['AQJ','MOW'] or Segments[0].Origin in ['MOW','NHA'] and Segments[0].Destination in ['MOW','NHA'] or Segments[0].Origin in ['ARH','HRG'] and Segments[0].Destination in ['ARH','HRG'] or Segments[0].Origin in ['SGN','AER'] and Segments[0].Destination in ['SGN','AER'] or Segments[0].Origin in ['VRA','MCX'] and Segments[0].Destination in ['VRA','MCX'] or Segments[0].Origin in ['BKK','OVB'] and Segments[0].Destination in ['BKK','OVB'] or Segments[0].Origin in ['AYT','UFA'] and Segments[0].Destination in ['AYT','UFA'] or Segments[0].Origin in ['SGN','NOZ'] and Segments[0].Destination in ['SGN','NOZ'] or Segments[0].Origin in ['SGN','NBC'] and Segments[0].Destination in ['SGN','NBC'] or Segments[0].Origin in ['MOW','BEG'] and Segments[0].Destination in ['MOW','BEG'] or Segments[0].Origin in ['TDX','BQS'] and Segments[0].Destination in ['TDX','BQS'] or Segments[0].Origin in ['KRR','NHA'] and Segments[0].Destination in ['KRR','NHA'] or Segments[0].Origin in ['NHA','SGC'] and Segments[0].Destination in ['NHA','SGC'] or Segments[0].Origin in ['NHA','UFA'] and Segments[0].Destination in ['NHA','UFA'] or Segments[0].Origin in ['NHA','ARH'] and Segments[0].Destination in ['NHA','ARH'] or Segments[0].Origin in ['EGO','VRA'] and Segments[0].Destination in ['EGO','VRA'] or Segments[0].Origin in ['BCN','MOW'] and Segments[0].Destination in ['BCN','MOW'] or Segments[0].Origin in ['TDX','ROV'] and Segments[0].Destination in ['TDX','ROV'] or Segments[0].Origin in ['TSN','MOW'] and Segments[0].Destination in ['TSN','MOW'] or Segments[0].Origin in ['GOJ','HRG'] and Segments[0].Destination in ['GOJ','HRG'] or Segments[0].Origin in ['BKK','KZN'] and Segments[0].Destination in ['BKK','KZN'] or Segments[0].Origin in ['NHA','ROV'] and Segments[0].Destination in ['NHA','ROV'] or Segments[0].Origin in ['DXB','KJA'] and Segments[0].Destination in ['DXB','KJA'] or Segments[0].Origin in ['PEE','AER'] and Segments[0].Destination in ['PEE','AER'] or Segments[0].Origin in ['DXB','CEK'] and Segments[0].Destination in ['DXB','CEK'] or Segments[0].Origin in ['PUJ','ASF'] and Segments[0].Destination in ['PUJ','ASF'] or Segments[0].Origin in ['KBV','OVB'] and Segments[0].Destination in ['KBV','OVB'] or Segments[0].Origin in ['MOW','EVN'] and Segments[0].Destination in ['MOW','EVN'] or Segments[0].Origin in ['IKT','CUN'] and Segments[0].Destination in ['IKT','CUN'] or Segments[0].Origin in ['KGD','HRG'] and Segments[0].Destination in ['KGD','HRG'] or Segments[0].Origin in ['KBV','PEE'] and Segments[0].Destination in ['KBV','PEE'] or Segments[0].Origin in ['VOG','VRA'] and Segments[0].Destination in ['VOG','VRA'] or Segments[0].Origin in ['MOW','HKT'] and Segments[0].Destination in ['MOW','HKT'] or Segments[0].Origin in ['NHA','ASF'] and Segments[0].Destination in ['NHA','ASF'] or Segments[0].Origin in ['LED','SVX'] and Segments[0].Destination in ['LED','SVX'] or Segments[0].Origin in ['AAQ','CUN'] and Segments[0].Destination in ['AAQ','CUN'] or Segments[0].Origin in ['BKK','KEJ'] and Segments[0].Destination in ['BKK','KEJ'] or Segments[0].Origin in ['BKK','BQS'] and Segments[0].Destination in ['BKK','BQS'] or Segments[0].Origin in ['DXB','IKT'] and Segments[0].Destination in ['DXB','IKT'] or Segments[0].Origin in ['SSH','TJM'] and Segments[0].Destination in ['SSH','TJM'] or Segments[0].Origin in ['PUJ','ROV'] and Segments[0].Destination in ['PUJ','ROV'] or Segments[0].Origin in ['AER','SVX'] and Segments[0].Destination in ['AER','SVX'] or Segments[0].Origin in ['UFA','ETH'] and Segments[0].Destination in ['UFA','ETH'] or Segments[0].Origin in ['BKK','KUF'] and Segments[0].Destination in ['BKK','KUF'] or Segments[0].Origin in ['BKK','VVO'] and Segments[0].Destination in ['BKK','VVO'] or Segments[0].Origin in ['HKT','OVB'] and Segments[0].Destination in ['HKT','OVB'] or Segments[0].Origin in ['ZTH','LED'] and Segments[0].Destination in ['ZTH','LED'] or Segments[0].Origin in ['KZN','NHA'] and Segments[0].Destination in ['KZN','NHA'] or Segments[0].Origin in ['VRA','BAX'] and Segments[0].Destination in ['VRA','BAX'] or Segments[0].Origin in ['RTW','NHA'] and Segments[0].Destination in ['RTW','NHA'] or Segments[0].Origin in ['SKG','DNK'] and Segments[0].Destination in ['SKG','DNK'] or Segments[0].Origin in ['SGN','VOG'] and Segments[0].Destination in ['SGN','VOG'] or Segments[0].Origin in ['KBV','VVO'] and Segments[0].Destination in ['KBV','VVO'] or Segments[0].Origin in ['IEV','CFU'] and Segments[0].Destination in ['IEV','CFU'] or Segments[0].Origin in ['PUJ','TOF'] and Segments[0].Destination in ['PUJ','TOF'] or Segments[0].Origin in ['HKT','KEJ'] and Segments[0].Destination in ['HKT','KEJ'] or Segments[0].Origin in ['PUJ','NJC'] and Segments[0].Destination in ['PUJ','NJC'] or Segments[0].Origin in ['PEE','CUN'] and Segments[0].Destination in ['PEE','CUN'] or Segments[0].Origin in ['HKT','TJM'] and Segments[0].Destination in ['HKT','TJM'] or Segments[0].Origin in ['ETH','KZN'] and Segments[0].Destination in ['ETH','KZN'] or Segments[0].Origin in ['MCX','CUN'] and Segments[0].Destination in ['MCX','CUN'] or Segments[0].Origin in ['HRG','KUF'] and Segments[0].Destination in ['HRG','KUF'] or Segments[0].Origin in ['VRA','VOG'] and Segments[0].Destination in ['VRA','VOG'] or Segments[0].Origin in ['SVX','CUN'] and Segments[0].Destination in ['SVX','CUN'] or Segments[0].Origin in ['VRA','EGO'] and Segments[0].Destination in ['VRA','EGO'] or Segments[0].Origin in ['ROV','CUN'] and Segments[0].Destination in ['ROV','CUN'] or Segments[0].Origin in ['KJA','VRA'] and Segments[0].Destination in ['KJA','VRA'] or Segments[0].Origin in ['VRA','PEE'] and Segments[0].Destination in ['VRA','PEE'] or Segments[0].Origin in ['MOW','SKD'] and Segments[0].Destination in ['MOW','SKD'] or Segments[0].Origin in ['POP','ROV'] and Segments[0].Destination in ['POP','ROV'] or Segments[0].Origin in ['AYT','KZN'] and Segments[0].Destination in ['AYT','KZN'] or Segments[0].Origin in ['ETH','REN'] and Segments[0].Destination in ['ETH','REN'] or Segments[0].Origin in ['ETH','LED'] and Segments[0].Destination in ['ETH','LED'] or Segments[0].Origin in ['CEK','ETH'] and Segments[0].Destination in ['CEK','ETH'] or Segments[0].Origin in ['NHA','VOZ'] and Segments[0].Destination in ['NHA','VOZ'] or Segments[0].Origin in ['SVX','AER'] and Segments[0].Destination in ['SVX','AER'] or Segments[0].Origin in ['FEG','MOW'] and Segments[0].Destination in ['FEG','MOW'] or Segments[0].Origin in ['VRA','KZN'] and Segments[0].Destination in ['VRA','KZN'] or Segments[0].Origin in ['USM','PEE'] and Segments[0].Destination in ['USM','PEE'] or Segments[0].Origin in ['VVO','MOW'] and Segments[0].Destination in ['VVO','MOW'] or Segments[0].Origin in ['SGN','KEJ'] and Segments[0].Destination in ['SGN','KEJ'] or Segments[0].Origin in ['DXB','AER'] and Segments[0].Destination in ['DXB','AER'] or Segments[0].Origin in ['MOW','VOG'] and Segments[0].Destination in ['MOW','VOG'] or Segments[0].Origin in ['SGN','YKS'] and Segments[0].Destination in ['SGN','YKS'] or Segments[0].Origin in ['VRA','NJC'] and Segments[0].Destination in ['VRA','NJC'] or Segments[0].Origin in ['VOG','PUJ'] and Segments[0].Destination in ['VOG','PUJ'] or Segments[0].Origin in ['HKT','MOW'] and Segments[0].Destination in ['HKT','MOW'] or Segments[0].Origin in ['VOG','SKG'] and Segments[0].Destination in ['VOG','SKG'] or Segments[0].Origin in ['OVB','YKS'] and Segments[0].Destination in ['OVB','YKS'] or Segments[0].Origin in ['SGC','SSH'] and Segments[0].Destination in ['SGC','SSH'] or Segments[0].Origin in ['VOZ','NHA'] and Segments[0].Destination in ['VOZ','NHA'] or Segments[0].Origin in ['CUN','NBC'] and Segments[0].Destination in ['CUN','NBC'] or Segments[0].Origin in ['KZN','SSH'] and Segments[0].Destination in ['KZN','SSH'] or Segments[0].Origin in ['HER','MOW'] and Segments[0].Destination in ['HER','MOW'] or Segments[0].Origin in ['TDX','UFA'] and Segments[0].Destination in ['TDX','UFA'] or Segments[0].Origin in ['KZN','ETH'] and Segments[0].Destination in ['KZN','ETH'] or Segments[0].Origin in ['ABA','CUN'] and Segments[0].Destination in ['ABA','CUN'] or Segments[0].Origin in ['PEE','NHA'] and Segments[0].Destination in ['PEE','NHA'] or Segments[0].Origin in ['CUN','TOF'] and Segments[0].Destination in ['CUN','TOF'] or Segments[0].Origin in ['TJM','HRG'] and Segments[0].Destination in ['TJM','HRG'] or Segments[0].Origin in ['EGO','HRG'] and Segments[0].Destination in ['EGO','HRG'] or Segments[0].Origin in ['GOJ','SSH'] and Segments[0].Destination in ['GOJ','SSH'] or Segments[0].Origin in ['HKT','HTA'] and Segments[0].Destination in ['HKT','HTA'] or Segments[0].Origin in ['MOW','ETH'] and Segments[0].Destination in ['MOW','ETH'] or Segments[0].Origin in ['OGZ','VRA'] and Segments[0].Destination in ['OGZ','VRA'] or Segments[0].Origin in ['HKT','NBC'] and Segments[0].Destination in ['HKT','NBC'] or Segments[0].Origin in ['GPA','MSQ'] and Segments[0].Destination in ['GPA','MSQ'] or Segments[0].Origin in ['SGN','TOF'] and Segments[0].Destination in ['SGN','TOF'] or Segments[0].Origin in ['HKT','MCX'] and Segments[0].Destination in ['HKT','MCX'] or Segments[0].Origin in ['KRR','VRA'] and Segments[0].Destination in ['KRR','VRA'] or Segments[0].Origin in ['ROV','PUJ'] and Segments[0].Destination in ['ROV','PUJ'] or Segments[0].Origin in ['CEE','VRA'] and Segments[0].Destination in ['CEE','VRA'] or Segments[0].Origin in ['TJM','NHA'] and Segments[0].Destination in ['TJM','NHA'] or Segments[0].Origin in ['RTW','CUN'] and Segments[0].Destination in ['RTW','CUN'] or Segments[0].Origin in ['AER','KZN'] and Segments[0].Destination in ['AER','KZN'] or Segments[0].Origin in ['MRV','ETH'] and Segments[0].Destination in ['MRV','ETH'] or Segments[0].Origin in ['SGN','VOZ'] and Segments[0].Destination in ['SGN','VOZ'] or Segments[0].Origin in ['USM','BQS'] and Segments[0].Destination in ['USM','BQS'] or Segments[0].Origin in ['USM','SGC'] and Segments[0].Destination in ['USM','SGC'] or Segments[0].Origin in ['HER','SVX'] and Segments[0].Destination in ['HER','SVX'] or Segments[0].Origin in ['DXB','KZN'] and Segments[0].Destination in ['DXB','KZN'] or Segments[0].Origin in ['TDX','KEJ'] and Segments[0].Destination in ['TDX','KEJ'] or Segments[0].Origin in ['HRG','SGC'] and Segments[0].Destination in ['HRG','SGC'] or Segments[0].Origin in ['SOF','LED'] and Segments[0].Destination in ['SOF','LED'] or Segments[0].Origin in ['DXB','UFA'] and Segments[0].Destination in ['DXB','UFA'] or Segments[0].Origin in ['EVN','MOW'] and Segments[0].Destination in ['EVN','MOW'] or Segments[0].Origin in ['HKT','LED'] and Segments[0].Destination in ['HKT','LED'] or Segments[0].Origin in ['SGN','NJC'] and Segments[0].Destination in ['SGN','NJC'] or Segments[0].Origin in ['SHJ','KUF'] and Segments[0].Destination in ['SHJ','KUF'] or Segments[0].Origin in ['AQJ','LED'] and Segments[0].Destination in ['AQJ','LED'] or Segments[0].Origin in ['HRG','GOJ'] and Segments[0].Destination in ['HRG','GOJ'] or Segments[0].Origin in ['PRG','LED'] and Segments[0].Destination in ['PRG','LED'] or Segments[0].Origin in ['NOZ','NHA'] and Segments[0].Destination in ['NOZ','NHA'] or Segments[0].Origin in ['ARH','SSH'] and Segments[0].Destination in ['ARH','SSH'] or Segments[0].Origin in ['SSH','REN'] and Segments[0].Destination in ['SSH','REN'] or Segments[0].Origin in ['AYT','GOJ'] and Segments[0].Destination in ['AYT','GOJ'] or Segments[0].Origin in ['ATH','MSQ'] and Segments[0].Destination in ['ATH','MSQ'] or Segments[0].Origin in ['MOW','VAR'] and Segments[0].Destination in ['MOW','VAR'] or Segments[0].Origin in ['HER','LED'] and Segments[0].Destination in ['HER','LED'] or Segments[0].Origin in ['SIP','KJA'] and Segments[0].Destination in ['SIP','KJA'] or Segments[0].Origin in ['TJM','CUN'] and Segments[0].Destination in ['TJM','CUN'] or Segments[0].Origin in ['PUJ','LED'] and Segments[0].Destination in ['PUJ','LED'] or Segments[0].Origin in ['BKK','SGC'] and Segments[0].Destination in ['BKK','SGC'] or Segments[0].Origin in ['PUJ','KEJ'] and Segments[0].Destination in ['PUJ','KEJ'] or Segments[0].Origin in ['BKK','KJA'] and Segments[0].Destination in ['BKK','KJA'] or Segments[0].Origin in ['DXB','VOG'] and Segments[0].Destination in ['DXB','VOG'] or Segments[0].Origin in ['PUJ','KJA'] and Segments[0].Destination in ['PUJ','KJA'] or Segments[0].Origin in ['RMI','MOW'] and Segments[0].Destination in ['RMI','MOW'] or Segments[0].Origin in ['USM','KEJ'] and Segments[0].Destination in ['USM','KEJ'] or Segments[0].Origin in ['MOW','RVN'] and Segments[0].Destination in ['MOW','RVN'] or Segments[0].Origin in ['VRA','AER'] and Segments[0].Destination in ['VRA','AER'] or Segments[0].Origin in ['SGN','VVO'] and Segments[0].Destination in ['SGN','VVO'] or Segments[0].Origin in ['SIP','MOW'] and Segments[0].Destination in ['SIP','MOW'] or Segments[0].Origin in ['ETH','MRV'] and Segments[0].Destination in ['ETH','MRV'] or Segments[0].Origin in ['VRA','MRV'] and Segments[0].Destination in ['VRA','MRV'] or Segments[0].Origin in ['ROV','MOW'] and Segments[0].Destination in ['ROV','MOW'] or Segments[0].Origin in ['KBV','TJM'] and Segments[0].Destination in ['KBV','TJM'] or Segments[0].Origin in ['PUJ','VOZ'] and Segments[0].Destination in ['PUJ','VOZ'] or Segments[0].Origin in ['LED','AER'] and Segments[0].Destination in ['LED','AER'] or Segments[0].Origin in ['AER','VRA'] and Segments[0].Destination in ['AER','VRA'] or Segments[0].Origin in ['CUN','SVX'] and Segments[0].Destination in ['CUN','SVX'] or Segments[0].Origin in ['HKT','ROV'] and Segments[0].Destination in ['HKT','ROV'] or Segments[0].Origin in ['KUF','NHA'] and Segments[0].Destination in ['KUF','NHA'] or Segments[0].Origin in ['KGD','SKG'] and Segments[0].Destination in ['KGD','SKG'] or Segments[0].Origin in ['DXB','YKS'] and Segments[0].Destination in ['DXB','YKS'] or Segments[0].Origin in ['AER','PEE'] and Segments[0].Destination in ['AER','PEE'] or Segments[0].Origin in ['ROV','CFU'] and Segments[0].Destination in ['ROV','CFU'] or Segments[0].Origin in ['VOG','CUN'] and Segments[0].Destination in ['VOG','CUN'] or Segments[0].Origin in ['PUJ','KZN'] and Segments[0].Destination in ['PUJ','KZN'] or Segments[0].Origin in ['MOW','SZG'] and Segments[0].Destination in ['MOW','SZG'] or Segments[0].Origin in ['GDX','MOW'] and Segments[0].Destination in ['GDX','MOW'] or Segments[0].Origin in ['HKT','VOG'] and Segments[0].Destination in ['HKT','VOG'] or Segments[0].Origin in ['BOJ','MOW'] and Segments[0].Destination in ['BOJ','MOW'] or Segments[0].Origin in ['OVB','HTA'] and Segments[0].Destination in ['OVB','HTA'] or Segments[0].Origin in ['BKK','EGO'] and Segments[0].Destination in ['BKK','EGO'] or Segments[0].Origin in ['ETH','KUF'] and Segments[0].Destination in ['ETH','KUF'] or Segments[0].Origin in ['HRG','ARH'] and Segments[0].Destination in ['HRG','ARH'] or Segments[0].Origin in ['MOW','KGD'] and Segments[0].Destination in ['MOW','KGD'] or Segments[0].Origin in ['HRG','CEK'] and Segments[0].Destination in ['HRG','CEK'] or Segments[0].Origin in ['LED','HER'] and Segments[0].Destination in ['LED','HER'] or Segments[0].Origin in ['USM','IKT'] and Segments[0].Destination in ['USM','IKT'] or Segments[0].Origin in ['CUN','TJM'] and Segments[0].Destination in ['CUN','TJM'] or Segments[0].Origin in ['NHA','UUS'] and Segments[0].Destination in ['NHA','UUS'] or Segments[0].Origin in ['NHA','KZN'] and Segments[0].Destination in ['NHA','KZN'] or Segments[0].Origin in ['NBC','HRG'] and Segments[0].Destination in ['NBC','HRG'] or Segments[0].Origin in ['SKG','SVX'] and Segments[0].Destination in ['SKG','SVX'] or Segments[0].Origin in ['HRG','UFA'] and Segments[0].Destination in ['HRG','UFA'] or Segments[0].Origin in ['TDX','MOW'] and Segments[0].Destination in ['TDX','MOW'] or Segments[0].Origin in ['LED','SKG'] and Segments[0].Destination in ['LED','SKG'] or Segments[0].Origin in ['SGN','SVX'] and Segments[0].Destination in ['SGN','SVX'] or Segments[0].Origin in ['CUN','AER'] and Segments[0].Destination in ['CUN','AER'] or Segments[0].Origin in ['MOW','KUT'] and Segments[0].Destination in ['MOW','KUT'] or Segments[0].Origin in ['VRN','KRR'] and Segments[0].Destination in ['VRN','KRR'] or Segments[0].Origin in ['MSQ','ATH'] and Segments[0].Destination in ['MSQ','ATH'] or Segments[0].Origin in ['PUJ','BAX'] and Segments[0].Destination in ['PUJ','BAX'] or Segments[0].Origin in ['KEJ','CUN'] and Segments[0].Destination in ['KEJ','CUN'] or Segments[0].Origin in ['KUF','PUJ'] and Segments[0].Destination in ['KUF','PUJ'] or Segments[0].Origin in ['VRA','KUF'] and Segments[0].Destination in ['VRA','KUF'] or Segments[0].Origin in ['LED','HRG'] and Segments[0].Destination in ['LED','HRG'] or Segments[0].Origin in ['BKK','ASF'] and Segments[0].Destination in ['BKK','ASF'] or Segments[0].Origin in ['IEV','HER'] and Segments[0].Destination in ['IEV','HER'] or Segments[0].Origin in ['SHJ','ROV'] and Segments[0].Destination in ['SHJ','ROV'] or Segments[0].Origin in ['KUT','MOW'] and Segments[0].Destination in ['KUT','MOW'] or Segments[0].Origin in ['HKT','KRR'] and Segments[0].Destination in ['HKT','KRR'] or Segments[0].Origin in ['AYT','MOW'] and Segments[0].Destination in ['AYT','MOW'] or Segments[0].Origin in ['VRA','MOW'] and Segments[0].Destination in ['VRA','MOW'] or Segments[0].Origin in ['SCW','PUJ'] and Segments[0].Destination in ['SCW','PUJ'] or Segments[0].Origin in ['MOW','TAS'] and Segments[0].Destination in ['MOW','TAS'] or Segments[0].Origin in ['IEV','SKG'] and Segments[0].Destination in ['IEV','SKG'] or Segments[0].Origin in ['LED','BOJ'] and Segments[0].Destination in ['LED','BOJ'] or Segments[0].Origin in ['HKT','SVX'] and Segments[0].Destination in ['HKT','SVX'] or Segments[0].Origin in ['BKK','SVX'] and Segments[0].Destination in ['BKK','SVX'] or Segments[0].Origin in ['SGN','MOW'] and Segments[0].Destination in ['SGN','MOW'] or Segments[0].Origin in ['SVX','ETH'] and Segments[0].Destination in ['SVX','ETH'] or Segments[0].Origin in ['SSH','PEE'] and Segments[0].Destination in ['SSH','PEE'] or Segments[0].Origin in ['NHA','KUF'] and Segments[0].Destination in ['NHA','KUF'] or Segments[0].Origin in ['SSH','KUF'] and Segments[0].Destination in ['SSH','KUF'] or Segments[0].Origin in ['DXB','MOW'] and Segments[0].Destination in ['DXB','MOW'] or Segments[0].Origin in ['PUJ','YKS'] and Segments[0].Destination in ['PUJ','YKS'] or Segments[0].Origin in ['SSH','ARH'] and Segments[0].Destination in ['SSH','ARH'] or Segments[0].Origin in ['AUH','MOW'] and Segments[0].Destination in ['AUH','MOW'] or Segments[0].Origin in ['UTP','IKT'] and Segments[0].Destination in ['UTP','IKT'] or Segments[0].Origin in ['KRR','SSH'] and Segments[0].Destination in ['KRR','SSH'] or Segments[0].Origin in ['HRG','KZN'] and Segments[0].Destination in ['HRG','KZN'] or Segments[0].Origin in ['BKK','ROV'] and Segments[0].Destination in ['BKK','ROV'] or Segments[0].Origin in ['CEK','PUJ'] and Segments[0].Destination in ['CEK','PUJ'] or Segments[0].Origin in ['SGN','KGD'] and Segments[0].Destination in ['SGN','KGD'] or Segments[0].Origin in ['KEJ','PUJ'] and Segments[0].Destination in ['KEJ','PUJ'] or Segments[0].Origin in ['HKT','SCW'] and Segments[0].Destination in ['HKT','SCW'] or Segments[0].Origin in ['BKK','KGD'] and Segments[0].Destination in ['BKK','KGD'] or Segments[0].Origin in ['HKT','SGC'] and Segments[0].Destination in ['HKT','SGC'] or Segments[0].Origin in ['REN','HRG'] and Segments[0].Destination in ['REN','HRG'] or Segments[0].Origin in ['SKG','TSE'] and Segments[0].Destination in ['SKG','TSE'] or Segments[0].Origin in ['BKK','PKC'] and Segments[0].Destination in ['BKK','PKC'] or Segments[0].Origin in ['VRA','KJA'] and Segments[0].Destination in ['VRA','KJA'] or Segments[0].Origin in ['SCW','CUN'] and Segments[0].Destination in ['SCW','CUN'] or Segments[0].Origin in ['SKG','KZN'] and Segments[0].Destination in ['SKG','KZN'] or Segments[0].Origin in ['MOW','GRV'] and Segments[0].Destination in ['MOW','GRV'] or Segments[0].Origin in ['HRG','NBC'] and Segments[0].Destination in ['HRG','NBC'] or Segments[0].Origin in ['SCW','VRA'] and Segments[0].Destination in ['SCW','VRA'] or Segments[0].Origin in ['UFA','HRG'] and Segments[0].Destination in ['UFA','HRG'] or Segments[0].Origin in ['EGO','CUN'] and Segments[0].Destination in ['EGO','CUN'] or Segments[0].Origin in ['KUF','HRG'] and Segments[0].Destination in ['KUF','HRG'] or Segments[0].Origin in ['CUN','ROV'] and Segments[0].Destination in ['CUN','ROV'] or Segments[0].Origin in ['KBV','KEJ'] and Segments[0].Destination in ['KBV','KEJ'] or Segments[0].Origin in ['NHA','IKT'] and Segments[0].Destination in ['NHA','IKT'] or Segments[0].Origin in ['SSH','KRR'] and Segments[0].Destination in ['SSH','KRR'] or Segments[0].Origin in ['CFU','MOW'] and Segments[0].Destination in ['CFU','MOW'] or Segments[0].Origin in ['MSQ','GPA'] and Segments[0].Destination in ['MSQ','GPA'] or Segments[0].Origin in ['ZTH','MOW'] and Segments[0].Destination in ['ZTH','MOW'] or Segments[0].Origin in ['AER','KJA'] and Segments[0].Destination in ['AER','KJA'] or Segments[0].Origin in ['MOW','CFU'] and Segments[0].Destination in ['MOW','CFU'] or Segments[0].Origin in ['BKK','SCW'] and Segments[0].Destination in ['BKK','SCW'] or Segments[0].Origin in ['PUJ','OGZ'] and Segments[0].Destination in ['PUJ','OGZ'] or Segments[0].Origin in ['AMM','MOW'] and Segments[0].Destination in ['AMM','MOW'] or Segments[0].Origin in ['OVB','TOF'] and Segments[0].Destination in ['OVB','TOF'] or Segments[0].Origin in ['SGN','KZN'] and Segments[0].Destination in ['SGN','KZN'] or Segments[0].Origin in ['VOG','AER'] and Segments[0].Destination in ['VOG','AER'] or Segments[0].Origin in ['VRA','SVX'] and Segments[0].Destination in ['VRA','SVX'] or Segments[0].Origin in ['DXB','SVX'] and Segments[0].Destination in ['DXB','SVX'] or Segments[0].Origin in ['HKT','BQS'] and Segments[0].Destination in ['HKT','BQS'] or Segments[0].Origin in ['PUJ','EGO'] and Segments[0].Destination in ['PUJ','EGO'] or Segments[0].Origin in ['DXB','LED'] and Segments[0].Destination in ['DXB','LED'] or Segments[0].Origin in ['ETH','MOW'] and Segments[0].Destination in ['ETH','MOW'] or Segments[0].Origin in ['MOW','KJA'] and Segments[0].Destination in ['MOW','KJA'] or Segments[0].Origin in ['IKT','MOW'] and Segments[0].Destination in ['IKT','MOW'] or Segments[0].Origin in ['KBV','ROV'] and Segments[0].Destination in ['KBV','ROV'] or Segments[0].Origin in ['BKK','REN'] and Segments[0].Destination in ['BKK','REN'] or Segments[0].Origin in ['HKT','PEE'] and Segments[0].Destination in ['HKT','PEE'] or Segments[0].Origin in ['SVX','VRA'] and Segments[0].Destination in ['SVX','VRA'] or Segments[0].Origin in ['BKK','AER'] and Segments[0].Destination in ['BKK','AER'] or Segments[0].Origin in ['ETH','ROV'] and Segments[0].Destination in ['ETH','ROV'] or Segments[0].Origin in ['SGN','SCW'] and Segments[0].Destination in ['SGN','SCW'] or Segments[0].Origin in ['SIP','KUF'] and Segments[0].Destination in ['SIP','KUF'] or Segments[0].Origin in ['CEK','NHA'] and Segments[0].Destination in ['CEK','NHA'] or Segments[0].Origin in ['AQJ','KRR'] and Segments[0].Destination in ['AQJ','KRR'] or Segments[0].Origin in ['KBV','MOW'] and Segments[0].Destination in ['KBV','MOW'] or Segments[0].Origin in ['BHK','MOW'] and Segments[0].Destination in ['BHK','MOW'] or Segments[0].Origin in ['BKK','PEE'] and Segments[0].Destination in ['BKK','PEE'] or Segments[0].Origin in ['MOW','BAX'] and Segments[0].Destination in ['MOW','BAX'] or Segments[0].Origin in ['GPA','MOW'] and Segments[0].Destination in ['GPA','MOW'] or Segments[0].Origin in ['RIX','MOW'] and Segments[0].Destination in ['RIX','MOW'] or Segments[0].Origin in ['DXB','NBC'] and Segments[0].Destination in ['DXB','NBC'] or Segments[0].Origin in ['PUJ','OVB'] and Segments[0].Destination in ['PUJ','OVB'] or Segments[0].Origin in ['ETH','CEK'] and Segments[0].Destination in ['ETH','CEK'] or Segments[0].Origin in ['KRR','ETH'] and Segments[0].Destination in ['KRR','ETH'] or Segments[0].Origin in ['HKT','UUD'] and Segments[0].Destination in ['HKT','UUD'] or Segments[0].Origin in ['TOF','VRA'] and Segments[0].Destination in ['TOF','VRA'] or Segments[0].Origin in ['MOW','SKG'] and Segments[0].Destination in ['MOW','SKG'] or Segments[0].Origin in ['BTK','OVB'] and Segments[0].Destination in ['BTK','OVB'] or Segments[0].Origin in ['KRR','LCA'] and Segments[0].Destination in ['KRR','LCA'] or Segments[0].Origin in ['OGZ','CUN'] and Segments[0].Destination in ['OGZ','CUN'] or Segments[0].Origin in ['PUJ','KGD'] and Segments[0].Destination in ['PUJ','KGD'] or Segments[0].Origin in ['USM','OVB'] and Segments[0].Destination in ['USM','OVB'] or Segments[0].Origin in ['MOW','SHE'] and Segments[0].Destination in ['MOW','SHE'] or Segments[0].Origin in ['RTW','VRA'] and Segments[0].Destination in ['RTW','VRA'] or Segments[0].Origin in ['SHJ','VOZ'] and Segments[0].Destination in ['SHJ','VOZ'] or Segments[0].Origin in ['SSH','VOG'] and Segments[0].Destination in ['SSH','VOG'] or Segments[0].Origin in ['DXB','NOZ'] and Segments[0].Destination in ['DXB','NOZ'] or Segments[0].Origin in ['SGN','SGC'] and Segments[0].Destination in ['SGN','SGC'] or Segments[0].Origin in ['VVO','NHA'] and Segments[0].Destination in ['VVO','NHA'] or Segments[0].Origin in ['CUN','KZN'] and Segments[0].Destination in ['CUN','KZN'] or Segments[0].Origin in ['AYT','SVX'] and Segments[0].Destination in ['AYT','SVX'] or Segments[0].Origin in ['CUN','KGD'] and Segments[0].Destination in ['CUN','KGD'] or Segments[0].Origin in ['KBV','KZN'] and Segments[0].Destination in ['KBV','KZN'] or Segments[0].Origin in ['VRN','MOW'] and Segments[0].Destination in ['VRN','MOW'] or Segments[0].Origin in ['OVB','UUD'] and Segments[0].Destination in ['OVB','UUD'] or Segments[0].Origin in ['USM','TJM'] and Segments[0].Destination in ['USM','TJM'] or Segments[0].Origin in ['HRG','MMK'] and Segments[0].Destination in ['HRG','MMK'] or Segments[0].Origin in ['KUF','SSH'] and Segments[0].Destination in ['KUF','SSH'] or Segments[0].Origin in ['AER','LED'] and Segments[0].Destination in ['AER','LED'] or Segments[0].Origin in ['SGN','ROV'] and Segments[0].Destination in ['SGN','ROV'] or Segments[0].Origin in ['KZN','CUN'] and Segments[0].Destination in ['KZN','CUN'] or Segments[0].Origin in ['VRA','NBC'] and Segments[0].Destination in ['VRA','NBC'] or Segments[0].Origin in ['KUF','CUN'] and Segments[0].Destination in ['KUF','CUN'] or Segments[0].Origin in ['SSH','SGC'] and Segments[0].Destination in ['SSH','SGC'] or Segments[0].Origin in ['VRA','OVB'] and Segments[0].Destination in ['VRA','OVB'] or Segments[0].Origin in ['ODS','SKG'] and Segments[0].Destination in ['ODS','SKG'] or Segments[0].Origin in ['AMM','LED'] and Segments[0].Destination in ['AMM','LED'] or Segments[0].Origin in ['RTW','PUJ'] and Segments[0].Destination in ['RTW','PUJ'] or Segments[0].Origin in ['BKK','NJC'] and Segments[0].Destination in ['BKK','NJC'] or Segments[0].Origin in ['CUN','KRR'] and Segments[0].Destination in ['CUN','KRR'] or Segments[0].Origin in ['MRV','SSH'] and Segments[0].Destination in ['MRV','SSH'] or Segments[0].Origin in ['SGC','HRG'] and Segments[0].Destination in ['SGC','HRG'] or Segments[0].Origin in ['KZN','SKG'] and Segments[0].Destination in ['KZN','SKG'] or Segments[0].Origin in ['UFA','MOW'] and Segments[0].Destination in ['UFA','MOW'] or Segments[0].Origin in ['ROM','MOW'] and Segments[0].Destination in ['ROM','MOW'] or Segments[0].Origin in ['NBC','PUJ'] and Segments[0].Destination in ['NBC','PUJ'] or Segments[0].Origin in ['KHV','MOW'] and Segments[0].Destination in ['KHV','MOW'] or Segments[0].Origin in ['VRA','CEK'] and Segments[0].Destination in ['VRA','CEK'] or Segments[0].Origin in ['VRA','KEJ'] and Segments[0].Destination in ['VRA','KEJ'] or Segments[0].Origin in ['MOW','VVO'] and Segments[0].Destination in ['MOW','VVO'] or Segments[0].Origin in ['TOF','CUN'] and Segments[0].Destination in ['TOF','CUN'] or Segments[0].Origin in ['OVB','SKG'] and Segments[0].Destination in ['OVB','SKG'] or Segments[0].Origin in ['CUN','VOG'] and Segments[0].Destination in ['CUN','VOG'] or Segments[0].Origin in ['BKK','VOZ'] and Segments[0].Destination in ['BKK','VOZ'] or Segments[0].Origin in ['ROV','ETH'] and Segments[0].Destination in ['ROV','ETH'] or Segments[0].Origin in ['HTA','NHA'] and Segments[0].Destination in ['HTA','NHA'] or Segments[0].Origin in ['GOJ','VRA'] and Segments[0].Destination in ['GOJ','VRA'] or Segments[0].Origin in ['MOW','VRN'] and Segments[0].Destination in ['MOW','VRN'] or Segments[0].Origin in ['KZN','HRG'] and Segments[0].Destination in ['KZN','HRG'] or Segments[0].Origin in ['NHA','BAX'] and Segments[0].Destination in ['NHA','BAX'] or Segments[0].Origin in ['VRA','ASF'] and Segments[0].Destination in ['VRA','ASF'] or Segments[0].Origin in ['GOJ','SKG'] and Segments[0].Destination in ['GOJ','SKG'] or Segments[0].Origin in ['SKG','LWO'] and Segments[0].Destination in ['SKG','LWO'] or Segments[0].Origin in ['MRV','CUN'] and Segments[0].Destination in ['MRV','CUN'] or Segments[0].Origin in ['SOF','MOW'] and Segments[0].Destination in ['SOF','MOW'] or Segments[0].Origin in ['BAX','VRA'] and Segments[0].Destination in ['BAX','VRA'] or Segments[0].Origin in ['SSH','MRV'] and Segments[0].Destination in ['SSH','MRV'] or Segments[0].Origin in ['KRR','LED'] and Segments[0].Destination in ['KRR','LED'] or Segments[0].Origin in ['NHA','REN'] and Segments[0].Destination in ['NHA','REN'] or Segments[0].Origin in ['ATH','MOW'] and Segments[0].Destination in ['ATH','MOW'] or Segments[0].Origin in ['KZN','VRA'] and Segments[0].Destination in ['KZN','VRA'] or Segments[0].Origin in ['HRG','VOZ'] and Segments[0].Destination in ['HRG','VOZ'] or Segments[0].Origin in ['SGN','KUF'] and Segments[0].Destination in ['SGN','KUF'] or Segments[0].Origin in ['LED','CFU'] and Segments[0].Destination in ['LED','CFU'] or Segments[0].Origin in ['SGN','MRV'] and Segments[0].Destination in ['SGN','MRV'] or Segments[0].Origin in ['CUN','EGO'] and Segments[0].Destination in ['CUN','EGO'] or Segments[0].Origin in ['KJA','AER'] and Segments[0].Destination in ['KJA','AER'] or Segments[0].Origin in ['VRA','SCW'] and Segments[0].Destination in ['VRA','SCW'] or Segments[0].Origin in ['BQS','NHA'] and Segments[0].Destination in ['BQS','NHA'] or Segments[0].Origin in ['KGD','SSH'] and Segments[0].Destination in ['KGD','SSH'] or Segments[0].Origin in ['BKK','KRR'] and Segments[0].Destination in ['BKK','KRR'] or Segments[0].Origin in ['DXB','OVB'] and Segments[0].Destination in ['DXB','OVB'] or Segments[0].Origin in ['KRR','HRG'] and Segments[0].Destination in ['KRR','HRG'] or Segments[0].Origin in ['VRA','OMS'] and Segments[0].Destination in ['VRA','OMS'] or Segments[0].Origin in ['BKK','MRV'] and Segments[0].Destination in ['BKK','MRV'] or Segments[0].Origin in ['IKT','PUJ'] and Segments[0].Destination in ['IKT','PUJ'] or Segments[0].Origin in ['KZN','PUJ'] and Segments[0].Destination in ['KZN','PUJ'] or Segments[0].Origin in ['BKK','LED'] and Segments[0].Destination in ['BKK','LED'] or Segments[0].Origin in ['SGN','LED'] and Segments[0].Destination in ['SGN','LED'] or Segments[0].Origin in ['NHA','CEK'] and Segments[0].Destination in ['NHA','CEK'] or Segments[0].Origin in ['KJA','SSH'] and Segments[0].Destination in ['KJA','SSH'] or Segments[0].Origin in ['CUN','MOW'] and Segments[0].Destination in ['CUN','MOW'] or Segments[0].Origin in ['UUD','NHA'] and Segments[0].Destination in ['UUD','NHA'] or Segments[0].Origin in ['KUF','ETH'] and Segments[0].Destination in ['KUF','ETH'] or Segments[0].Origin in ['HKT','REN'] and Segments[0].Destination in ['HKT','REN'] or Segments[0].Origin in ['BKK','MOW'] and Segments[0].Destination in ['BKK','MOW'] or Segments[0].Origin in ['BKK','UUD'] and Segments[0].Destination in ['BKK','UUD'] or Segments[0].Origin in ['CUN','OVB'] and Segments[0].Destination in ['CUN','OVB'] or Segments[0].Origin in ['SVX','SSH'] and Segments[0].Destination in ['SVX','SSH'] or Segments[0].Origin in ['LED','ETH'] and Segments[0].Destination in ['LED','ETH'] or Segments[0].Origin in ['MSQ','CFU'] and Segments[0].Destination in ['MSQ','CFU'] or Segments[0].Origin in ['KGD','PUJ'] and Segments[0].Destination in ['KGD','PUJ'] or Segments[0].Origin in ['OVB','AER'] and Segments[0].Destination in ['OVB','AER'] or Segments[0].Origin in ['OMS','NHA'] and Segments[0].Destination in ['OMS','NHA'] or Segments[0].Origin in ['PUJ','GOJ'] and Segments[0].Destination in ['PUJ','GOJ'] or Segments[0].Origin in ['NHA','TOF'] and Segments[0].Destination in ['NHA','TOF'] or Segments[0].Origin in ['TDX','BAX'] and Segments[0].Destination in ['TDX','BAX'] or Segments[0].Origin in ['UTP','KJA'] and Segments[0].Destination in ['UTP','KJA'] or Segments[0].Origin in ['BKK','KHV'] and Segments[0].Destination in ['BKK','KHV'] or Segments[0].Origin in ['NHA','BQS'] and Segments[0].Destination in ['NHA','BQS'] or Segments[0].Origin in ['CMF','MOW'] and Segments[0].Destination in ['CMF','MOW'] or Segments[0].Origin in ['BER','MOW'] and Segments[0].Destination in ['BER','MOW'] or Segments[0].Origin in ['SGN','KHV'] and Segments[0].Destination in ['SGN','KHV'] or Segments[0].Origin in ['DXB','NJC'] and Segments[0].Destination in ['DXB','NJC'] or Segments[0].Origin in ['IKT','VRA'] and Segments[0].Destination in ['IKT','VRA'] or Segments[0].Origin in ['TAS','MOW'] and Segments[0].Destination in ['TAS','MOW'] or Segments[0].Origin in ['GOJ','AYT'] and Segments[0].Destination in ['GOJ','AYT'] or Segments[0].Origin in ['VRA','GOJ'] and Segments[0].Destination in ['VRA','GOJ'] or Segments[0].Origin in ['MOW','BQS'] and Segments[0].Destination in ['MOW','BQS'] or Segments[0].Origin in ['NOZ','VRA'] and Segments[0].Destination in ['NOZ','VRA'] or Segments[0].Origin in ['PUJ','CEK'] and Segments[0].Destination in ['PUJ','CEK'] or Segments[0].Origin in ['USM','BAX'] and Segments[0].Destination in ['USM','BAX'] or Segments[0].Origin in ['ROV','VRN'] and Segments[0].Destination in ['ROV','VRN'] or Segments[0].Origin in ['OVB','CUN'] and Segments[0].Destination in ['OVB','CUN'] or Segments[0].Origin in ['OVB','MOW'] and Segments[0].Destination in ['OVB','MOW'] or Segments[0].Origin in ['SKG','ROV'] and Segments[0].Destination in ['SKG','ROV'] or Segments[0].Origin in ['MOW','BKK'] and Segments[0].Destination in ['MOW','BKK'] or Segments[0].Origin in ['BKK','IKT'] and Segments[0].Destination in ['BKK','IKT'] or Segments[0].Origin in ['TDX','SGC'] and Segments[0].Destination in ['TDX','SGC'] or Segments[0].Origin in ['ROV','VRA'] and Segments[0].Destination in ['ROV','VRA'] or Segments[0].Origin in ['BKK','TOF'] and Segments[0].Destination in ['BKK','TOF'] or Segments[0].Origin in ['CUN','MRV'] and Segments[0].Destination in ['CUN','MRV'] or Segments[0].Origin in ['ZTH','MSQ'] and Segments[0].Destination in ['ZTH','MSQ'] or Segments[0].Origin in ['MOW','CMF'] and Segments[0].Destination in ['MOW','CMF'] or Segments[0].Origin in ['CUN','PEE'] and Segments[0].Destination in ['CUN','PEE'] or Segments[0].Origin in ['CEK','HRG'] and Segments[0].Destination in ['CEK','HRG'] or Segments[0].Origin in ['HRG','KRR'] and Segments[0].Destination in ['HRG','KRR'] or Segments[0].Origin in ['VAR','LED'] and Segments[0].Destination in ['VAR','LED'] or Segments[0].Origin in ['NBC','SSH'] and Segments[0].Destination in ['NBC','SSH'] or Segments[0].Origin in ['PUJ','AER'] and Segments[0].Destination in ['PUJ','AER'] or Segments[0].Origin in ['SIP','SVX'] and Segments[0].Destination in ['SIP','SVX'] or Segments[0].Origin in ['ROV','NHA'] and Segments[0].Destination in ['ROV','NHA'] or Segments[0].Origin in ['CUN','IKT'] and Segments[0].Destination in ['CUN','IKT'] or Segments[0].Origin in ['OVB','VRA'] and Segments[0].Destination in ['OVB','VRA'] or Segments[0].Origin in ['MOW','OVB'] and Segments[0].Destination in ['MOW','OVB'] or Segments[0].Origin in ['UUD','OVB'] and Segments[0].Destination in ['UUD','OVB'] or Segments[0].Origin in ['KRR','OVB'] and Segments[0].Destination in ['KRR','OVB'] or Segments[0].Origin in ['TJM','PUJ'] and Segments[0].Destination in ['TJM','PUJ'] or Segments[0].Origin in ['PEE','HRG'] and Segments[0].Destination in ['PEE','HRG'] or Segments[0].Origin in ['KZN','AYT'] and Segments[0].Destination in ['KZN','AYT'] or Segments[0].Origin in ['GVA','MOW'] and Segments[0].Destination in ['GVA','MOW'] or Segments[0].Origin in ['CUN','OGZ'] and Segments[0].Destination in ['CUN','OGZ'] or Segments[0].Origin in ['MUC','MOW'] and Segments[0].Destination in ['MUC','MOW'] or Segments[0].Origin in ['VOZ','SSH'] and Segments[0].Destination in ['VOZ','SSH'] or Segments[0].Origin in ['AER','OVB'] and Segments[0].Destination in ['AER','OVB'] or Segments[0].Origin in ['HRG','KEJ'] and Segments[0].Destination in ['HRG','KEJ'] or Segments[0].Origin in ['TJM','VRA'] and Segments[0].Destination in ['TJM','VRA'] or Segments[0].Origin in ['HKT','BAX'] and Segments[0].Destination in ['HKT','BAX'] or Segments[0].Origin in ['KUF','AER'] and Segments[0].Destination in ['KUF','AER'] or Segments[0].Origin in ['SGN','HTA'] and Segments[0].Destination in ['SGN','HTA'] or Segments[0].Origin in ['SSH','UFA'] and Segments[0].Destination in ['SSH','UFA'] or Segments[0].Origin in ['SHJ','MOW'] and Segments[0].Destination in ['SHJ','MOW'] or Segments[0].Origin in ['SSH','KZN'] and Segments[0].Destination in ['SSH','KZN'] or Segments[0].Origin in ['SVX','PUJ'] and Segments[0].Destination in ['SVX','PUJ'] or Segments[0].Origin in ['PRG','MOW'] and Segments[0].Destination in ['PRG','MOW'] or Segments[0].Origin in ['VOZ','VRA'] and Segments[0].Destination in ['VOZ','VRA'] or Segments[0].Origin in ['AER','MOW'] and Segments[0].Destination in ['AER','MOW'] or Segments[0].Origin in ['SSH','OMS'] and Segments[0].Destination in ['SSH','OMS'] or Segments[0].Origin in ['SSH','SCW'] and Segments[0].Destination in ['SSH','SCW'] or Segments[0].Origin in ['CUN','MCX'] and Segments[0].Destination in ['CUN','MCX'] or Segments[0].Origin in ['MMK','HRG'] and Segments[0].Destination in ['MMK','HRG'] or Segments[0].Origin in ['LED','SOF'] and Segments[0].Destination in ['LED','SOF'] or Segments[0].Origin in ['KBV','UFA'] and Segments[0].Destination in ['KBV','UFA'] or Segments[0].Origin in ['DJE','MOW'] and Segments[0].Destination in ['DJE','MOW'] or Segments[0].Origin in ['NJC','VRA'] and Segments[0].Destination in ['NJC','VRA'] or Segments[0].Origin in ['YKS','NHA'] and Segments[0].Destination in ['YKS','NHA'] or Segments[0].Origin in ['SSH','MMK'] and Segments[0].Destination in ['SSH','MMK'] or Segments[0].Origin in ['PUJ','TJM'] and Segments[0].Destination in ['PUJ','TJM'] or Segments[0].Origin in ['TOF','NHA'] and Segments[0].Destination in ['TOF','NHA'] or Segments[0].Origin in ['SGN','PEE'] and Segments[0].Destination in ['SGN','PEE'] or Segments[0].Origin in ['NOZ','CUN'] and Segments[0].Destination in ['NOZ','CUN'] or Segments[0].Origin in ['PEE','PUJ'] and Segments[0].Destination in ['PEE','PUJ'] or Segments[0].Origin in ['SVX','NHA'] and Segments[0].Destination in ['SVX','NHA'] or Segments[0].Origin in ['ARH','NHA'] and Segments[0].Destination in ['ARH','NHA'] or Segments[0].Origin in ['SCW','NHA'] and Segments[0].Destination in ['SCW','NHA'] or Segments[0].Origin in ['KEJ','SSH'] and Segments[0].Destination in ['KEJ','SSH'] or Segments[0].Origin in ['AER','UFA'] and Segments[0].Destination in ['AER','UFA'] or Segments[0].Origin in ['NHA','MCX'] and Segments[0].Destination in ['NHA','MCX'] or Segments[0].Origin in ['CUN','LED'] and Segments[0].Destination in ['CUN','LED'] or Segments[0].Origin in ['MOW','FEG'] and Segments[0].Destination in ['MOW','FEG'] or Segments[0].Origin in ['MOW','SVX'] and Segments[0].Destination in ['MOW','SVX'] or Segments[0].Origin in ['KBV','SGC'] and Segments[0].Destination in ['KBV','SGC'] or Segments[0].Origin in ['VRA','KRR'] and Segments[0].Destination in ['VRA','KRR'] or Segments[0].Origin in ['SKG','KRR'] and Segments[0].Destination in ['SKG','KRR'] or Segments[0].Origin in ['NJC','PUJ'] and Segments[0].Destination in ['NJC','PUJ'] or Segments[0].Origin in ['MSQ','ZTH'] and Segments[0].Destination in ['MSQ','ZTH'] or Segments[0].Origin in ['SKG','VOG'] and Segments[0].Destination in ['SKG','VOG'] or Segments[0].Origin in ['KJA','CUN'] and Segments[0].Destination in ['KJA','CUN'] or Segments[0].Origin in ['DXB','GOJ'] and Segments[0].Destination in ['DXB','GOJ'] or Segments[0].Origin in ['SGN','BAX'] and Segments[0].Destination in ['SGN','BAX'] or Segments[0].Origin in ['KUF','AYT'] and Segments[0].Destination in ['KUF','AYT'] or Segments[0].Origin in ['ETH','KRR'] and Segments[0].Destination in ['ETH','KRR'] or Segments[0].Origin in ['IKT','NHA'] and Segments[0].Destination in ['IKT','NHA'] or Segments[0].Origin in ['ROV','HRG'] and Segments[0].Destination in ['ROV','HRG'] or Segments[0].Origin in ['PUJ','IKT'] and Segments[0].Destination in ['PUJ','IKT'] or Segments[0].Origin in ['TIV','MOW'] and Segments[0].Destination in ['TIV','MOW'] or Segments[0].Origin in ['PUJ','MOW'] and Segments[0].Destination in ['PUJ','MOW'] or Segments[0].Origin in ['CEK','VRA'] and Segments[0].Destination in ['CEK','VRA'] or Segments[0].Origin in ['EGO','PUJ'] and Segments[0].Destination in ['EGO','PUJ'] or Segments[0].Origin in ['TDX','IKT'] and Segments[0].Destination in ['TDX','IKT'] or Segments[0].Origin in ['SKG','KGD'] and Segments[0].Destination in ['SKG','KGD'] or Segments[0].Origin in ['SGN','UFA'] and Segments[0].Destination in ['SGN','UFA'] or Segments[0].Origin in ['MOW','BOJ'] and Segments[0].Destination in ['MOW','BOJ'] or Segments[0].Origin in ['NHA','KRR'] and Segments[0].Destination in ['NHA','KRR'] or Segments[0].Origin in ['HKT','KHV'] and Segments[0].Destination in ['HKT','KHV'] or Segments[0].Origin in ['RIX','SKG'] and Segments[0].Destination in ['RIX','SKG'] or Segments[0].Origin in ['SIP','KRR'] and Segments[0].Destination in ['SIP','KRR'] or Segments[0].Origin in ['AAQ','VRA'] and Segments[0].Destination in ['AAQ','VRA'] or Segments[0].Origin in ['VOZ','HRG'] and Segments[0].Destination in ['VOZ','HRG'] or Segments[0].Origin in ['CFU','LED'] and Segments[0].Destination in ['CFU','LED'] or Segments[0].Origin in ['KBV','BQS'] and Segments[0].Destination in ['KBV','BQS'] or Segments[0].Origin in ['BKK','NBC'] and Segments[0].Destination in ['BKK','NBC'] or Segments[0].Origin in ['SSH','GOJ'] and Segments[0].Destination in ['SSH','GOJ'] or Segments[0].Origin in ['LED','OVB'] and Segments[0].Destination in ['LED','OVB'] or Segments[0].Origin in ['NHA','UUD'] and Segments[0].Destination in ['NHA','UUD'] or Segments[0].Origin in ['CUN','UFA'] and Segments[0].Destination in ['CUN','UFA'] or Segments[0].Origin in ['MMK','SSH'] and Segments[0].Destination in ['MMK','SSH'] or Segments[0].Origin in ['MOW','PKC'] and Segments[0].Destination in ['MOW','PKC'] or Segments[0].Origin in ['SKG','ODS'] and Segments[0].Destination in ['SKG','ODS'] or Segments[0].Origin in ['UFA','SKG'] and Segments[0].Destination in ['UFA','SKG'] or Segments[0].Origin in ['UFA','AER'] and Segments[0].Destination in ['UFA','AER'] or Segments[0].Origin in ['VRA','NOZ'] and Segments[0].Destination in ['VRA','NOZ'] or Segments[0].Origin in ['NHA','MOW'] and Segments[0].Destination in ['NHA','MOW'] or Segments[0].Origin in ['HKT','NOZ'] and Segments[0].Destination in ['HKT','NOZ'] or Segments[0].Origin in ['MCX','VRA'] and Segments[0].Destination in ['MCX','VRA'] or Segments[0].Origin in ['SIP','LED'] and Segments[0].Destination in ['SIP','LED'] or Segments[0].Origin in ['MOW','BGY'] and Segments[0].Destination in ['MOW','BGY'] or Segments[0].Origin in ['HKT','EGO'] and Segments[0].Destination in ['HKT','EGO'] or Segments[0].Origin in ['KZN','AER'] and Segments[0].Destination in ['KZN','AER'] or Segments[0].Origin in ['NHA','OVB'] and Segments[0].Destination in ['NHA','OVB'] or Segments[0].Origin in ['VRA','VOZ'] and Segments[0].Destination in ['VRA','VOZ'] or Segments[0].Origin in ['OVB','LED'] and Segments[0].Destination in ['OVB','LED'] or Segments[0].Origin in ['NBC','CUN'] and Segments[0].Destination in ['NBC','CUN'] or Segments[0].Origin in ['VRA','KGD'] and Segments[0].Destination in ['VRA','KGD'] or Segments[0].Origin in ['CUN','CEK'] and Segments[0].Destination in ['CUN','CEK'] or Segments[0].Origin in ['VOZ','CUN'] and Segments[0].Destination in ['VOZ','CUN'] or Segments[0].Origin in ['DYR','MOW'] and Segments[0].Destination in ['DYR','MOW'] or Segments[0].Origin in ['MOW','SOF'] and Segments[0].Destination in ['MOW','SOF'] or Segments[0].Origin in ['LED','PRG'] and Segments[0].Destination in ['LED','PRG'] or Segments[0].Origin in ['PKC','NHA'] and Segments[0].Destination in ['PKC','NHA'] or Segments[0].Origin in ['BKK','TJM'] and Segments[0].Destination in ['BKK','TJM'] or Segments[0].Origin in ['NHA','OMS'] and Segments[0].Destination in ['NHA','OMS'] or Segments[0].Origin in ['DXB','BAX'] and Segments[0].Destination in ['DXB','BAX'] or Segments[0].Origin in ['OVB','HRG'] and Segments[0].Destination in ['OVB','HRG'] or Segments[0].Origin in ['AYT','KUF'] and Segments[0].Destination in ['AYT','KUF'] or Segments[0].Origin in ['HKT','CEK'] and Segments[0].Destination in ['HKT','CEK'] or Segments[0].Origin in ['GRV','MOW'] and Segments[0].Destination in ['GRV','MOW'] or Segments[0].Origin in ['IEV','ATH'] and Segments[0].Destination in ['IEV','ATH'] or Segments[0].Origin in ['OGZ','NHA'] and Segments[0].Destination in ['OGZ','NHA'] or Segments[0].Origin in ['ROV','SSH'] and Segments[0].Destination in ['ROV','SSH'] or Segments[0].Origin in ['SKG','UFA'] and Segments[0].Destination in ['SKG','UFA'] or Segments[0].Origin in ['CUN','BAX'] and Segments[0].Destination in ['CUN','BAX'] or Segments[0].Origin in ['SZG','MOW'] and Segments[0].Destination in ['SZG','MOW'] or Segments[0].Origin in ['HKT','KGD'] and Segments[0].Destination in ['HKT','KGD'] or Segments[0].Origin in ['ROV','SKG'] and Segments[0].Destination in ['ROV','SKG'] or Segments[0].Origin in ['USM','SVX'] and Segments[0].Destination in ['USM','SVX'] or Segments[0].Origin in ['KBV','BAX'] and Segments[0].Destination in ['KBV','BAX'] or Segments[0].Origin in ['BQS','MOW'] and Segments[0].Destination in ['BQS','MOW'] or Segments[0].Origin in ['SSH','KEJ'] and Segments[0].Destination in ['SSH','KEJ'] or Segments[0].Origin in ['SIP','UFA'] and Segments[0].Destination in ['SIP','UFA'] or Segments[0].Origin in ['CUN','YKS'] and Segments[0].Destination in ['CUN','YKS'] or Segments[0].Origin in ['GOJ','NHA'] and Segments[0].Destination in ['GOJ','NHA'] or Segments[0].Origin in ['MOW','PUJ'] and Segments[0].Destination in ['MOW','PUJ'] or Segments[0].Origin in ['NHA','LED'] and Segments[0].Destination in ['NHA','LED'] or Segments[0].Origin in ['HKT','VOZ'] and Segments[0].Destination in ['HKT','VOZ'] or Segments[0].Origin in ['OMS','VRA'] and Segments[0].Destination in ['OMS','VRA'] or Segments[0].Origin in ['OVB','BQS'] and Segments[0].Destination in ['OVB','BQS'] or Segments[0].Origin in ['BKK','GOJ'] and Segments[0].Destination in ['BKK','GOJ'] or Segments[0].Origin in ['HKT','ASF'] and Segments[0].Destination in ['HKT','ASF'] or Segments[0].Origin in ['LED','PUJ'] and Segments[0].Destination in ['LED','PUJ'] or Segments[0].Origin in ['CUN','KUF'] and Segments[0].Destination in ['CUN','KUF'] or Segments[0].Origin in ['MOW','LCA'] and Segments[0].Destination in ['MOW','LCA'] or Segments[0].Origin in ['CUN','KEJ'] and Segments[0].Destination in ['CUN','KEJ'] or Segments[0].Origin in ['LWO','SKG'] and Segments[0].Destination in ['LWO','SKG'] or Segments[0].Origin in ['HRG','SVX'] and Segments[0].Destination in ['HRG','SVX'] or Segments[0].Origin in ['TCI','MOW'] and Segments[0].Destination in ['TCI','MOW'] or Segments[0].Origin in ['SIP','AER'] and Segments[0].Destination in ['SIP','AER'] or Segments[0].Origin in ['SGN','TJM'] and Segments[0].Destination in ['SGN','TJM'] or Segments[0].Origin in ['PUJ','VOG'] and Segments[0].Destination in ['PUJ','VOG'] or Segments[0].Origin in ['UFA','SSH'] and Segments[0].Destination in ['UFA','SSH'] or Segments[0].Origin in ['MIL','MOW'] and Segments[0].Destination in ['MIL','MOW'] or Segments[0].Origin in ['AER','PUJ'] and Segments[0].Destination in ['AER','PUJ'] or Segments[0].Origin in ['NHA','HTA'] and Segments[0].Destination in ['NHA','HTA'] or Segments[0].Origin in ['BQS','OVB'] and Segments[0].Destination in ['BQS','OVB'] or Segments[0].Origin in ['USM','MOW'] and Segments[0].Destination in ['USM','MOW'] or Segments[0].Origin in ['KBV','IKT'] and Segments[0].Destination in ['KBV','IKT'] or Segments[0].Origin in ['HKT','UFA'] and Segments[0].Destination in ['HKT','UFA'] or Segments[0].Origin in ['MOW','KHV'] and Segments[0].Destination in ['MOW','KHV'] or Segments[0].Origin in ['UTP','EGO'] and Segments[0].Destination in ['UTP','EGO'] or Segments[0].Origin in ['DXB','HTA'] and Segments[0].Destination in ['DXB','HTA'] or Segments[0].Origin in ['SGN','OMS'] and Segments[0].Destination in ['SGN','OMS'] or Segments[0].Origin in ['MOW','AER'] and Segments[0].Destination in ['MOW','AER'] or Segments[0].Origin in ['HTA','PUJ'] and Segments[0].Destination in ['HTA','PUJ'] or Segments[0].Origin in ['KJA','NHA'] and Segments[0].Destination in ['KJA','NHA'] or Segments[0].Origin in ['HKT','OMS'] and Segments[0].Destination in ['HKT','OMS'] or Segments[0].Origin in ['OGZ','PUJ'] and Segments[0].Destination in ['OGZ','PUJ'] or Segments[0].Origin in ['PUJ','UFA'] and Segments[0].Destination in ['PUJ','UFA'] or Segments[0].Origin in ['DXB','KUF'] and Segments[0].Destination in ['DXB','KUF'] or Segments[0].Origin in ['BKK','MCX'] and Segments[0].Destination in ['BKK','MCX'] or Segments[0].Origin in ['NHA','PKC'] and Segments[0].Destination in ['NHA','PKC'] or Segments[0].Origin in ['CUN','KJA'] and Segments[0].Destination in ['CUN','KJA'] or Segments[0].Origin in ['KRR','PUJ'] and Segments[0].Destination in ['KRR','PUJ'] or Segments[0].Origin in ['HKT','IKT'] and Segments[0].Destination in ['HKT','IKT'] or Segments[0].Origin in ['DXB','ROV'] and Segments[0].Destination in ['DXB','ROV'] or Segments[0].Origin in ['DXB','TJM'] and Segments[0].Destination in ['DXB','TJM'] or Segments[0].Origin in ['NHA','KJA'] and Segments[0].Destination in ['NHA','KJA'] or Segments[0].Origin in ['USM','OMS'] and Segments[0].Destination in ['USM','OMS'] or Segments[0].Origin in ['KHV','NHA'] and Segments[0].Destination in ['KHV','NHA'] or Segments[0].Origin in ['HRG','KGD'] and Segments[0].Destination in ['HRG','KGD'] or Segments[0].Origin in ['VOG','SSH'] and Segments[0].Destination in ['VOG','SSH'] or Segments[0].Origin in ['MCX','PUJ'] and Segments[0].Destination in ['MCX','PUJ'] or Segments[0].Origin in ['MOW','TIV'] and Segments[0].Destination in ['MOW','TIV'] or Segments[0].Origin in ['DXB','KRR'] and Segments[0].Destination in ['DXB','KRR'] or Segments[0].Origin in ['DNK','SKG'] and Segments[0].Destination in ['DNK','SKG'] or Segments[0].Origin in ['HKT','KZN'] and Segments[0].Destination in ['HKT','KZN'] or Segments[0].Origin in ['USM','LED'] and Segments[0].Destination in ['USM','LED'] or Segments[0].Origin in ['HKT','MRV'] and Segments[0].Destination in ['HKT','MRV'] or Segments[0].Origin in ['HKT','TOF'] and Segments[0].Destination in ['HKT','TOF'] or Segments[0].Origin in ['MOW','UFA'] and Segments[0].Destination in ['MOW','UFA'] or Segments[0].Origin in ['DXB','KEJ'] and Segments[0].Destination in ['DXB','KEJ'] or Segments[0].Origin in ['YKS','CUN'] and Segments[0].Destination in ['YKS','CUN'] or Segments[0].Origin in ['KEJ','HRG'] and Segments[0].Destination in ['KEJ','HRG'] or Segments[0].Origin in ['MCX','NHA'] and Segments[0].Destination in ['MCX','NHA'] or Segments[0].Origin in ['NHA','SCW'] and Segments[0].Destination in ['NHA','SCW'] or Segments[0].Origin in ['DXB','MRV'] and Segments[0].Destination in ['DXB','MRV'] or Segments[0].Origin in ['BKK','OGZ'] and Segments[0].Destination in ['BKK','OGZ'] or Segments[0].Origin in ['UTP','PEE'] and Segments[0].Destination in ['UTP','PEE'] or Segments[0].Origin in ['USM','ROV'] and Segments[0].Destination in ['USM','ROV'] or Segments[0].Origin in ['VRA','YKS'] and Segments[0].Destination in ['VRA','YKS'] or Segments[0].Origin in ['SHE','MOW'] and Segments[0].Destination in ['SHE','MOW'] or Segments[0].Origin in ['MOW','TSN'] and Segments[0].Destination in ['MOW','TSN'] or Segments[0].Origin in ['TOF','OVB'] and Segments[0].Destination in ['TOF','OVB'] or Segments[0].Origin in ['NHA','KEJ'] and Segments[0].Destination in ['NHA','KEJ'] or Segments[0].Origin in ['KGD','CUN'] and Segments[0].Destination in ['KGD','CUN'] or Segments[0].Origin in ['UTP','KUF'] and Segments[0].Destination in ['UTP','KUF'] or Segments[0].Origin in ['SIP','KZN'] and Segments[0].Destination in ['SIP','KZN'] or Segments[0].Origin in ['CUN','SCW'] and Segments[0].Destination in ['CUN','SCW'] or Segments[0].Origin in ['SHJ','REN'] and Segments[0].Destination in ['SHJ','REN'] or Segments[0].Origin in ['SGN','KRR'] and Segments[0].Destination in ['SGN','KRR'] or Segments[0].Origin in ['KEJ','NHA'] and Segments[0].Destination in ['KEJ','NHA'] or Segments[0].Origin in ['CFU','IEV'] and Segments[0].Destination in ['CFU','IEV'] or Segments[0].Origin in ['MOW','CUN'] and Segments[0].Destination in ['MOW','CUN'] or Segments[0].Origin in ['LCA','MOW'] and Segments[0].Destination in ['LCA','MOW'] or Segments[0].Origin in ['SSH','ROV'] and Segments[0].Destination in ['SSH','ROV'] or Segments[0].Origin in ['BUH','MOW'] and Segments[0].Destination in ['BUH','MOW'] or Segments[0].Origin in ['SGN','BQS'] and Segments[0].Destination in ['SGN','BQS'] or Segments[0].Origin in ['KUF','VRA'] and Segments[0].Destination in ['KUF','VRA'] or Segments[0].Origin in ['NHA','KHV'] and Segments[0].Destination in ['NHA','KHV'] or Segments[0].Origin in ['DXB','TOF'] and Segments[0].Destination in ['DXB','TOF'] or Segments[0].Origin in ['HKT','KUF'] and Segments[0].Destination in ['HKT','KUF'] or Segments[0].Origin in ['EGO','NHA'] and Segments[0].Destination in ['EGO','NHA'] or Segments[0].Origin in ['MOW','BCN'] and Segments[0].Destination in ['MOW','BCN'] or Segments[0].Origin in ['SCW','HRG'] and Segments[0].Destination in ['SCW','HRG'] or Segments[0].Origin in ['BAX','CUN'] and Segments[0].Destination in ['BAX','CUN'] or Segments[0].Origin in ['AYT','PEE'] and Segments[0].Destination in ['AYT','PEE'] or Segments[0].Origin in ['BKK','OMS'] and Segments[0].Destination in ['BKK','OMS'] or Segments[0].Origin in ['LCA','KRR'] and Segments[0].Destination in ['LCA','KRR'] or Segments[0].Origin in ['BKK','CEK'] and Segments[0].Destination in ['BKK','CEK'] or Segments[0].Origin in ['MOW','VRA'] and Segments[0].Destination in ['MOW','VRA'] or Segments[0].Origin in ['LED','ZTH'] and Segments[0].Destination in ['LED','ZTH'] or Segments[0].Origin in ['KEJ','VRA'] and Segments[0].Destination in ['KEJ','VRA'] or Segments[0].Origin in ['MOW','DYR'] and Segments[0].Destination in ['MOW','DYR'] or Segments[0].Origin in ['HKT','YKS'] and Segments[0].Destination in ['HKT','YKS'] or Segments[0].Origin in ['MOW','MIR'] and Segments[0].Destination in ['MOW','MIR'] or Segments[0].Origin in ['TRN','MOW'] and Segments[0].Destination in ['TRN','MOW'] or Segments[0].Origin in ['RVN','MOW'] and Segments[0].Destination in ['RVN','MOW'] or Segments[0].Origin in ['CEK','SSH'] and Segments[0].Destination in ['CEK','SSH'] or Segments[0].Origin in ['ETH','UFA'] and Segments[0].Destination in ['ETH','UFA'] or Segments[0].Origin in ['VRA','UFA'] and Segments[0].Destination in ['VRA','UFA'] or Segments[0].Origin in ['MOW','HER'] and Segments[0].Destination in ['MOW','HER'] or Segments[0].Origin in ['DXB','OMS'] and Segments[0].Destination in ['DXB','OMS'] or Segments[0].Origin in ['VRA','ROV'] and Segments[0].Destination in ['VRA','ROV'] or Segments[0].Origin in ['MRV','PUJ'] and Segments[0].Destination in ['MRV','PUJ'] or Segments[0].Origin in ['NHA','EGO'] and Segments[0].Destination in ['NHA','EGO'] or Segments[0].Origin in ['VRA','TOF'] and Segments[0].Destination in ['VRA','TOF'] or Segments[0].Origin in ['BOJ','LED'] and Segments[0].Destination in ['BOJ','LED'] or Segments[0].Origin in ['MOW','BHK'] and Segments[0].Destination in ['MOW','BHK'] or Segments[0].Origin in ['HKT','VVO'] and Segments[0].Destination in ['HKT','VVO'] or Segments[0].Origin in ['TOF','MOW'] and Segments[0].Destination in ['TOF','MOW'] or Segments[0].Origin in ['USM','KZN'] and Segments[0].Destination in ['USM','KZN'] or Segments[0].Origin in ['PUJ','KUF'] and Segments[0].Destination in ['PUJ','KUF'] or Segments[0].Origin in ['VOZ','PUJ'] and Segments[0].Destination in ['VOZ','PUJ'] or Segments[0].Origin in ['OVB','KRR'] and Segments[0].Destination in ['OVB','KRR'] or Segments[0].Origin in ['MOW','IKT'] and Segments[0].Destination in ['MOW','IKT'] or Segments[0].Origin in ['PEE','VRA'] and Segments[0].Destination in ['PEE','VRA'] or Segments[0].Origin in ['CFU','ROV'] and Segments[0].Destination in ['CFU','ROV'] or Segments[0].Origin in ['POP','MOW'] and Segments[0].Destination in ['POP','MOW'] or Segments[0].Origin in ['PUJ','SCW'] and Segments[0].Destination in ['PUJ','SCW'] or Segments[0].Origin in ['BAX','MOW'] and Segments[0].Destination in ['BAX','MOW'] or Segments[0].Origin in ['PUJ','SVX'] and Segments[0].Destination in ['PUJ','SVX'] or Segments[0].Origin in ['CUN','NJC'] and Segments[0].Destination in ['CUN','NJC'] or Segments[0].Origin in ['UTP','LED'] and Segments[0].Destination in ['UTP','LED'] or Segments[0].Origin in ['NHA','TJM'] and Segments[0].Destination in ['NHA','TJM'] or Segments[0].Origin in ['SGN','GOJ'] and Segments[0].Destination in ['SGN','GOJ'] or Segments[0].Origin in ['SSH','NBC'] and Segments[0].Destination in ['SSH','NBC'] or Segments[0].Origin in ['KJA','MOW'] and Segments[0].Destination in ['KJA','MOW'] or Segments[0].Origin in ['MOW','GPA'] and Segments[0].Destination in ['MOW','GPA'] or Segments[0].Origin in ['ATH','IEV'] and Segments[0].Destination in ['ATH','IEV'] or Segments[0].Origin in ['USM','VVO'] and Segments[0].Destination in ['USM','VVO'] or Segments[0].Origin in ['MOW','RMI'] and Segments[0].Destination in ['MOW','RMI'] or Segments[0].Origin in ['CEE','PUJ'] and Segments[0].Destination in ['CEE','PUJ'] or Segments[0].Origin in ['KRR','SKG'] and Segments[0].Destination in ['KRR','SKG'] or Segments[0].Origin in ['CUN','HTA'] and Segments[0].Destination in ['CUN','HTA'] or Segments[0].Origin in ['MRV','VRA'] and Segments[0].Destination in ['MRV','VRA'] or Segments[0].Origin in ['VRA','TJM'] and Segments[0].Destination in ['VRA','TJM'] or Segments[0].Origin in ['SKG','RIX'] and Segments[0].Destination in ['SKG','RIX'] or Segments[0].Origin in ['PRG','SVX'] and Segments[0].Destination in ['PRG','SVX'] or Segments[0].Origin in ['ABA','VRA'] and Segments[0].Destination in ['ABA','VRA'] or Segments[0].Origin in ['SGN','IKT'] and Segments[0].Destination in ['SGN','IKT'] or Segments[0].Origin in ['VOG','HRG'] and Segments[0].Destination in ['VOG','HRG'] or Segments[0].Origin in ['SVX','HER'] and Segments[0].Destination in ['SVX','HER'] or Segments[0].Origin in ['SHJ','VOG'] and Segments[0].Destination in ['SHJ','VOG'] or Segments[0].Origin in ['VRA','OGZ'] and Segments[0].Destination in ['VRA','OGZ'] or Segments[0].Origin in ['MOW','ZTH'] and Segments[0].Destination in ['MOW','ZTH'] or Segments[0].Origin in ['KJA','PUJ'] and Segments[0].Destination in ['KJA','PUJ'] or Segments[0].Origin in ['SSH','KJA'] and Segments[0].Destination in ['SSH','KJA'] or Segments[0].Origin in ['PUJ','NBC'] and Segments[0].Destination in ['PUJ','NBC'] or Segments[0].Origin in ['BKK','BAX'] and Segments[0].Destination in ['BKK','BAX'] or Segments[0].Origin in ['GOJ','HKT'] and Segments[0].Destination in ['GOJ','HKT'] or Segments[0].Origin in ['LED','AYT'] and Segments[0].Destination in ['LED','AYT'] or Segments[0].Origin in ['CEK','USM'] and Segments[0].Destination in ['CEK','USM'] or Segments[0].Origin in ['LED','SHJ'] and Segments[0].Destination in ['LED','SHJ'] or Segments[0].Origin in ['NOZ','BKK'] and Segments[0].Destination in ['NOZ','BKK'] or Segments[0].Origin in ['NOZ','PUJ'] and Segments[0].Destination in ['NOZ','PUJ'] or Segments[0].Origin in ['TJM','TDX'] and Segments[0].Destination in ['TJM','TDX'] or Segments[0].Origin in ['YKS','BKK'] and Segments[0].Destination in ['YKS','BKK'] or Segments[0].Origin in ['MOW','KUF'] and Segments[0].Destination in ['MOW','KUF'] or Segments[0].Origin in ['KJA','SGN'] and Segments[0].Destination in ['KJA','SGN'] or Segments[0].Origin in ['CEK','UTP'] and Segments[0].Destination in ['CEK','UTP'] or Segments[0].Origin in ['UFA','USM'] and Segments[0].Destination in ['UFA','USM'] or Segments[0].Origin in ['KZN','TDX'] and Segments[0].Destination in ['KZN','TDX'] or Segments[0].Origin in ['PEE','DXB'] and Segments[0].Destination in ['PEE','DXB'] or Segments[0].Origin in ['NJC','HKT'] and Segments[0].Destination in ['NJC','HKT'] or Segments[0].Origin in ['UFA','BKK'] and Segments[0].Destination in ['UFA','BKK'] or Segments[0].Origin in ['VOG','BKK'] and Segments[0].Destination in ['VOG','BKK'] or Segments[0].Origin in ['CEK','SGN'] and Segments[0].Destination in ['CEK','SGN'] or Segments[0].Origin in ['KZN','UTP'] and Segments[0].Destination in ['KZN','UTP'] or Segments[0].Origin in ['KJA','HKT'] and Segments[0].Destination in ['KJA','HKT'] or Segments[0].Origin in ['HTA','BKK'] and Segments[0].Destination in ['HTA','BKK'] or Segments[0].Origin in ['PEE','TDX'] and Segments[0].Destination in ['PEE','TDX'] or Segments[0].Origin in ['OVB','SGN'] and Segments[0].Destination in ['OVB','SGN'] or Segments[0].Origin in ['AER','HKT'] and Segments[0].Destination in ['AER','HKT'] or Segments[0].Origin in ['CUN','CEE'] and Segments[0].Destination in ['CUN','CEE'] or Segments[0].Origin in ['OGZ','MOW'] and Segments[0].Destination in ['OGZ','MOW'] or Segments[0].Origin in ['SVX','AQJ'] and Segments[0].Destination in ['SVX','AQJ'] or Segments[0].Origin in ['SVX','SHJ'] and Segments[0].Destination in ['SVX','SHJ'] or Segments[0].Origin in ['NHA','BTK'] and Segments[0].Destination in ['NHA','BTK'] or Segments[0].Origin in ['KZN','AQJ'] and Segments[0].Destination in ['KZN','AQJ'] or Segments[0].Origin in ['VOZ','DXB'] and Segments[0].Destination in ['VOZ','DXB'] or Segments[0].Origin in ['OGZ','HKT'] and Segments[0].Destination in ['OGZ','HKT'] or Segments[0].Origin in ['MOW','KLV'] and Segments[0].Destination in ['MOW','KLV'] or Segments[0].Origin in ['MOW','AQJ'] and Segments[0].Destination in ['MOW','AQJ'] or Segments[0].Origin in ['AER','SGN'] and Segments[0].Destination in ['AER','SGN'] or Segments[0].Origin in ['OVB','BKK'] and Segments[0].Destination in ['OVB','BKK'] or Segments[0].Origin in ['UFA','AYT'] and Segments[0].Destination in ['UFA','AYT'] or Segments[0].Origin in ['NOZ','SGN'] and Segments[0].Destination in ['NOZ','SGN'] or Segments[0].Origin in ['NBC','SGN'] and Segments[0].Destination in ['NBC','SGN'] or Segments[0].Origin in ['BQS','TDX'] and Segments[0].Destination in ['BQS','TDX'] or Segments[0].Origin in ['SGC','NHA'] and Segments[0].Destination in ['SGC','NHA'] or Segments[0].Origin in ['UFA','NHA'] and Segments[0].Destination in ['UFA','NHA'] or Segments[0].Origin in ['ROV','TDX'] and Segments[0].Destination in ['ROV','TDX'] or Segments[0].Origin in ['KZN','BKK'] and Segments[0].Destination in ['KZN','BKK'] or Segments[0].Origin in ['KJA','DXB'] and Segments[0].Destination in ['KJA','DXB'] or Segments[0].Origin in ['CEK','DXB'] and Segments[0].Destination in ['CEK','DXB'] or Segments[0].Origin in ['OVB','KBV'] and Segments[0].Destination in ['OVB','KBV'] or Segments[0].Origin in ['PEE','KBV'] and Segments[0].Destination in ['PEE','KBV'] or Segments[0].Origin in ['SVX','LED'] and Segments[0].Destination in ['SVX','LED'] or Segments[0].Origin in ['CUN','AAQ'] and Segments[0].Destination in ['CUN','AAQ'] or Segments[0].Origin in ['KEJ','BKK'] and Segments[0].Destination in ['KEJ','BKK'] or Segments[0].Origin in ['BQS','BKK'] and Segments[0].Destination in ['BQS','BKK'] or Segments[0].Origin in ['IKT','DXB'] and Segments[0].Destination in ['IKT','DXB'] or Segments[0].Origin in ['KUF','BKK'] and Segments[0].Destination in ['KUF','BKK'] or Segments[0].Origin in ['VVO','BKK'] and Segments[0].Destination in ['VVO','BKK'] or Segments[0].Origin in ['OVB','HKT'] and Segments[0].Destination in ['OVB','HKT'] or Segments[0].Origin in ['NHA','RTW'] and Segments[0].Destination in ['NHA','RTW'] or Segments[0].Origin in ['VOG','SGN'] and Segments[0].Destination in ['VOG','SGN'] or Segments[0].Origin in ['VVO','KBV'] and Segments[0].Destination in ['VVO','KBV'] or Segments[0].Origin in ['TOF','PUJ'] and Segments[0].Destination in ['TOF','PUJ'] or Segments[0].Origin in ['KEJ','HKT'] and Segments[0].Destination in ['KEJ','HKT'] or Segments[0].Origin in ['TJM','HKT'] and Segments[0].Destination in ['TJM','HKT'] or Segments[0].Origin in ['ROV','POP'] and Segments[0].Destination in ['ROV','POP'] or Segments[0].Origin in ['REN','ETH'] and Segments[0].Destination in ['REN','ETH'] or Segments[0].Origin in ['PEE','USM'] and Segments[0].Destination in ['PEE','USM'] or Segments[0].Origin in ['KEJ','SGN'] and Segments[0].Destination in ['KEJ','SGN'] or Segments[0].Origin in ['AER','DXB'] and Segments[0].Destination in ['AER','DXB'] or Segments[0].Origin in ['VOG','MOW'] and Segments[0].Destination in ['VOG','MOW'] or Segments[0].Origin in ['YKS','SGN'] and Segments[0].Destination in ['YKS','SGN'] or Segments[0].Origin in ['UFA','TDX'] and Segments[0].Destination in ['UFA','TDX'] or Segments[0].Origin in ['CUN','ABA'] and Segments[0].Destination in ['CUN','ABA'] or Segments[0].Origin in ['HRG','TJM'] and Segments[0].Destination in ['HRG','TJM'] or Segments[0].Origin in ['HTA','HKT'] and Segments[0].Destination in ['HTA','HKT'] or Segments[0].Origin in ['NBC','HKT'] and Segments[0].Destination in ['NBC','HKT'] or Segments[0].Origin in ['TOF','SGN'] and Segments[0].Destination in ['TOF','SGN'] or Segments[0].Origin in ['MCX','HKT'] and Segments[0].Destination in ['MCX','HKT'] or Segments[0].Origin in ['VRA','CEE'] and Segments[0].Destination in ['VRA','CEE'] or Segments[0].Origin in ['CUN','RTW'] and Segments[0].Destination in ['CUN','RTW'] or Segments[0].Origin in ['VOZ','SGN'] and Segments[0].Destination in ['VOZ','SGN'] or Segments[0].Origin in ['BQS','USM'] and Segments[0].Destination in ['BQS','USM'] or Segments[0].Origin in ['SGC','USM'] and Segments[0].Destination in ['SGC','USM'] or Segments[0].Origin in ['KZN','DXB'] and Segments[0].Destination in ['KZN','DXB'] or Segments[0].Origin in ['KEJ','TDX'] and Segments[0].Destination in ['KEJ','TDX'] or Segments[0].Origin in ['UFA','DXB'] and Segments[0].Destination in ['UFA','DXB'] or Segments[0].Origin in ['LED','HKT'] and Segments[0].Destination in ['LED','HKT'] or Segments[0].Origin in ['NJC','SGN'] and Segments[0].Destination in ['NJC','SGN'] or Segments[0].Origin in ['KUF','SHJ'] and Segments[0].Destination in ['KUF','SHJ'] or Segments[0].Origin in ['LED','AQJ'] and Segments[0].Destination in ['LED','AQJ'] or Segments[0].Origin in ['KJA','SIP'] and Segments[0].Destination in ['KJA','SIP'] or Segments[0].Origin in ['SGC','BKK'] and Segments[0].Destination in ['SGC','BKK'] or Segments[0].Origin in ['KJA','BKK'] and Segments[0].Destination in ['KJA','BKK'] or Segments[0].Origin in ['VOG','DXB'] and Segments[0].Destination in ['VOG','DXB'] or Segments[0].Origin in ['KEJ','USM'] and Segments[0].Destination in ['KEJ','USM'] or Segments[0].Origin in ['VVO','SGN'] and Segments[0].Destination in ['VVO','SGN'] or Segments[0].Origin in ['MOW','SIP'] and Segments[0].Destination in ['MOW','SIP'] or Segments[0].Origin in ['MOW','ROV'] and Segments[0].Destination in ['MOW','ROV'] or Segments[0].Origin in ['TJM','KBV'] and Segments[0].Destination in ['TJM','KBV'] or Segments[0].Origin in ['ROV','HKT'] and Segments[0].Destination in ['ROV','HKT'] or Segments[0].Origin in ['YKS','DXB'] and Segments[0].Destination in ['YKS','DXB'] or Segments[0].Origin in ['MOW','GDX'] and Segments[0].Destination in ['MOW','GDX'] or Segments[0].Origin in ['VOG','HKT'] and Segments[0].Destination in ['VOG','HKT'] or Segments[0].Origin in ['EGO','BKK'] and Segments[0].Destination in ['EGO','BKK'] or Segments[0].Origin in ['KGD','MOW'] and Segments[0].Destination in ['KGD','MOW'] or Segments[0].Origin in ['IKT','USM'] and Segments[0].Destination in ['IKT','USM'] or Segments[0].Origin in ['MOW','TDX'] and Segments[0].Destination in ['MOW','TDX'] or Segments[0].Origin in ['SVX','SGN'] and Segments[0].Destination in ['SVX','SGN'] or Segments[0].Origin in ['KRR','VRN'] and Segments[0].Destination in ['KRR','VRN'] or Segments[0].Origin in ['BAX','PUJ'] and Segments[0].Destination in ['BAX','PUJ'] or Segments[0].Origin in ['HRG','LED'] and Segments[0].Destination in ['HRG','LED'] or Segments[0].Origin in ['ASF','BKK'] and Segments[0].Destination in ['ASF','BKK'] or Segments[0].Origin in ['ROV','SHJ'] and Segments[0].Destination in ['ROV','SHJ'] or Segments[0].Origin in ['KRR','HKT'] and Segments[0].Destination in ['KRR','HKT'] or Segments[0].Origin in ['MOW','AYT'] and Segments[0].Destination in ['MOW','AYT'] or Segments[0].Origin in ['SVX','HKT'] and Segments[0].Destination in ['SVX','HKT'] or Segments[0].Origin in ['SVX','BKK'] and Segments[0].Destination in ['SVX','BKK'] or Segments[0].Origin in ['MOW','SGN'] and Segments[0].Destination in ['MOW','SGN'] or Segments[0].Origin in ['PEE','SSH'] and Segments[0].Destination in ['PEE','SSH'] or Segments[0].Origin in ['MOW','DXB'] and Segments[0].Destination in ['MOW','DXB'] or Segments[0].Origin in ['YKS','PUJ'] and Segments[0].Destination in ['YKS','PUJ'] or Segments[0].Origin in ['MOW','AUH'] and Segments[0].Destination in ['MOW','AUH'] or Segments[0].Origin in ['IKT','UTP'] and Segments[0].Destination in ['IKT','UTP'] or Segments[0].Origin in ['ROV','BKK'] and Segments[0].Destination in ['ROV','BKK'] or Segments[0].Origin in ['KGD','SGN'] and Segments[0].Destination in ['KGD','SGN'] or Segments[0].Origin in ['SCW','HKT'] and Segments[0].Destination in ['SCW','HKT'] or Segments[0].Origin in ['KGD','BKK'] and Segments[0].Destination in ['KGD','BKK'] or Segments[0].Origin in ['SGC','HKT'] and Segments[0].Destination in ['SGC','HKT'] or Segments[0].Origin in ['TSE','SKG'] and Segments[0].Destination in ['TSE','SKG'] or Segments[0].Origin in ['PKC','BKK'] and Segments[0].Destination in ['PKC','BKK'] or Segments[0].Origin in ['KEJ','KBV'] and Segments[0].Destination in ['KEJ','KBV'] or Segments[0].Origin in ['SCW','BKK'] and Segments[0].Destination in ['SCW','BKK'] or Segments[0].Origin in ['MOW','AMM'] and Segments[0].Destination in ['MOW','AMM'] or Segments[0].Origin in ['KZN','SGN'] and Segments[0].Destination in ['KZN','SGN'] or Segments[0].Origin in ['AER','VOG'] and Segments[0].Destination in ['AER','VOG'] or Segments[0].Origin in ['SVX','DXB'] and Segments[0].Destination in ['SVX','DXB'] or Segments[0].Origin in ['BQS','HKT'] and Segments[0].Destination in ['BQS','HKT'] or Segments[0].Origin in ['LED','DXB'] and Segments[0].Destination in ['LED','DXB'] or Segments[0].Origin in ['ROV','KBV'] and Segments[0].Destination in ['ROV','KBV'] or Segments[0].Origin in ['REN','BKK'] and Segments[0].Destination in ['REN','BKK'] or Segments[0].Origin in ['PEE','HKT'] and Segments[0].Destination in ['PEE','HKT'] or Segments[0].Origin in ['AER','BKK'] and Segments[0].Destination in ['AER','BKK'] or Segments[0].Origin in ['SCW','SGN'] and Segments[0].Destination in ['SCW','SGN'] or Segments[0].Origin in ['KUF','SIP'] and Segments[0].Destination in ['KUF','SIP'] or Segments[0].Origin in ['KRR','AQJ'] and Segments[0].Destination in ['KRR','AQJ'] or Segments[0].Origin in ['MOW','KBV'] and Segments[0].Destination in ['MOW','KBV'] or Segments[0].Origin in ['PEE','BKK'] and Segments[0].Destination in ['PEE','BKK'] or Segments[0].Origin in ['NBC','DXB'] and Segments[0].Destination in ['NBC','DXB'] or Segments[0].Origin in ['UUD','HKT'] and Segments[0].Destination in ['UUD','HKT'] or Segments[0].Origin in ['OVB','BTK'] and Segments[0].Destination in ['OVB','BTK'] or Segments[0].Origin in ['OVB','USM'] and Segments[0].Destination in ['OVB','USM'] or Segments[0].Origin in ['VRA','RTW'] and Segments[0].Destination in ['VRA','RTW'] or Segments[0].Origin in ['VOZ','SHJ'] and Segments[0].Destination in ['VOZ','SHJ'] or Segments[0].Origin in ['NOZ','DXB'] and Segments[0].Destination in ['NOZ','DXB'] or Segments[0].Origin in ['SGC','SGN'] and Segments[0].Destination in ['SGC','SGN'] or Segments[0].Origin in ['SVX','AYT'] and Segments[0].Destination in ['SVX','AYT'] or Segments[0].Origin in ['KZN','KBV'] and Segments[0].Destination in ['KZN','KBV'] or Segments[0].Origin in ['TJM','USM'] and Segments[0].Destination in ['TJM','USM'] or Segments[0].Origin in ['ROV','SGN'] and Segments[0].Destination in ['ROV','SGN'] or Segments[0].Origin in ['LED','AMM'] and Segments[0].Destination in ['LED','AMM'] or Segments[0].Origin in ['PUJ','RTW'] and Segments[0].Destination in ['PUJ','RTW'] or Segments[0].Origin in ['NJC','BKK'] and Segments[0].Destination in ['NJC','BKK'] or Segments[0].Origin in ['MOW','ROM'] and Segments[0].Destination in ['MOW','ROM'] or Segments[0].Origin in ['VOZ','BKK'] and Segments[0].Destination in ['VOZ','BKK'] or Segments[0].Origin in ['LED','KRR'] and Segments[0].Destination in ['LED','KRR'] or Segments[0].Origin in ['KUF','SGN'] and Segments[0].Destination in ['KUF','SGN'] or Segments[0].Origin in ['MRV','SGN'] and Segments[0].Destination in ['MRV','SGN'] or Segments[0].Origin in ['SSH','KGD'] and Segments[0].Destination in ['SSH','KGD'] or Segments[0].Origin in ['KRR','BKK'] and Segments[0].Destination in ['KRR','BKK'] or Segments[0].Origin in ['OVB','DXB'] and Segments[0].Destination in ['OVB','DXB'] or Segments[0].Origin in ['MRV','BKK'] and Segments[0].Destination in ['MRV','BKK'] or Segments[0].Origin in ['LED','BKK'] and Segments[0].Destination in ['LED','BKK'] or Segments[0].Origin in ['LED','SGN'] and Segments[0].Destination in ['LED','SGN'] or Segments[0].Origin in ['REN','HKT'] and Segments[0].Destination in ['REN','HKT'] or Segments[0].Origin in ['UUD','BKK'] and Segments[0].Destination in ['UUD','BKK'] or Segments[0].Origin in ['GOJ','PUJ'] and Segments[0].Destination in ['GOJ','PUJ'] or Segments[0].Origin in ['BAX','TDX'] and Segments[0].Destination in ['BAX','TDX'] or Segments[0].Origin in ['KJA','UTP'] and Segments[0].Destination in ['KJA','UTP'] or Segments[0].Origin in ['KHV','BKK'] and Segments[0].Destination in ['KHV','BKK'] or Segments[0].Origin in ['MOW','BER'] and Segments[0].Destination in ['MOW','BER'] or Segments[0].Origin in ['KHV','SGN'] and Segments[0].Destination in ['KHV','SGN'] or Segments[0].Origin in ['NJC','DXB'] and Segments[0].Destination in ['NJC','DXB'] or Segments[0].Origin in ['BAX','USM'] and Segments[0].Destination in ['BAX','USM'] or Segments[0].Origin in ['VRN','ROV'] and Segments[0].Destination in ['VRN','ROV'] or Segments[0].Origin in ['IKT','BKK'] and Segments[0].Destination in ['IKT','BKK'] or Segments[0].Origin in ['SGC','TDX'] and Segments[0].Destination in ['SGC','TDX'] or Segments[0].Origin in ['TOF','BKK'] and Segments[0].Destination in ['TOF','BKK'] or Segments[0].Origin in ['SVX','SIP'] and Segments[0].Destination in ['SVX','SIP'] or Segments[0].Origin in ['HRG','PEE'] and Segments[0].Destination in ['HRG','PEE'] or Segments[0].Origin in ['MOW','GVA'] and Segments[0].Destination in ['MOW','GVA'] or Segments[0].Origin in ['MOW','MUC'] and Segments[0].Destination in ['MOW','MUC'] or Segments[0].Origin in ['BAX','HKT'] and Segments[0].Destination in ['BAX','HKT'] or Segments[0].Origin in ['HTA','SGN'] and Segments[0].Destination in ['HTA','SGN'] or Segments[0].Origin in ['MOW','SHJ'] and Segments[0].Destination in ['MOW','SHJ'] or Segments[0].Origin in ['UFA','KBV'] and Segments[0].Destination in ['UFA','KBV'] or Segments[0].Origin in ['MOW','DJE'] and Segments[0].Destination in ['MOW','DJE'] or Segments[0].Origin in ['PEE','SGN'] and Segments[0].Destination in ['PEE','SGN'] or Segments[0].Origin in ['LED','CUN'] and Segments[0].Destination in ['LED','CUN'] or Segments[0].Origin in ['SVX','MOW'] and Segments[0].Destination in ['SVX','MOW'] or Segments[0].Origin in ['SGC','KBV'] and Segments[0].Destination in ['SGC','KBV'] or Segments[0].Origin in ['GOJ','DXB'] and Segments[0].Destination in ['GOJ','DXB'] or Segments[0].Origin in ['BAX','SGN'] and Segments[0].Destination in ['BAX','SGN'] or Segments[0].Origin in ['HRG','ROV'] and Segments[0].Destination in ['HRG','ROV'] or Segments[0].Origin in ['IKT','TDX'] and Segments[0].Destination in ['IKT','TDX'] or Segments[0].Origin in ['UFA','SGN'] and Segments[0].Destination in ['UFA','SGN'] or Segments[0].Origin in ['KHV','HKT'] and Segments[0].Destination in ['KHV','HKT'] or Segments[0].Origin in ['KRR','SIP'] and Segments[0].Destination in ['KRR','SIP'] or Segments[0].Origin in ['VRA','AAQ'] and Segments[0].Destination in ['VRA','AAQ'] or Segments[0].Origin in ['BQS','KBV'] and Segments[0].Destination in ['BQS','KBV'] or Segments[0].Origin in ['NBC','BKK'] and Segments[0].Destination in ['NBC','BKK'] or Segments[0].Origin in ['NOZ','HKT'] and Segments[0].Destination in ['NOZ','HKT'] or Segments[0].Origin in ['LED','SIP'] and Segments[0].Destination in ['LED','SIP'] or Segments[0].Origin in ['BGY','MOW'] and Segments[0].Destination in ['BGY','MOW'] or Segments[0].Origin in ['EGO','HKT'] and Segments[0].Destination in ['EGO','HKT'] or Segments[0].Origin in ['OVB','NHA'] and Segments[0].Destination in ['OVB','NHA'] or Segments[0].Origin in ['TJM','BKK'] and Segments[0].Destination in ['TJM','BKK'] or Segments[0].Origin in ['BAX','DXB'] and Segments[0].Destination in ['BAX','DXB'] or Segments[0].Origin in ['CEK','HKT'] and Segments[0].Destination in ['CEK','HKT'] or Segments[0].Origin in ['KGD','HKT'] and Segments[0].Destination in ['KGD','HKT'] or Segments[0].Origin in ['SVX','USM'] and Segments[0].Destination in ['SVX','USM'] or Segments[0].Origin in ['BAX','KBV'] and Segments[0].Destination in ['BAX','KBV'] or Segments[0].Origin in ['UFA','SIP'] and Segments[0].Destination in ['UFA','SIP'] or Segments[0].Origin in ['LED','NHA'] and Segments[0].Destination in ['LED','NHA'] or Segments[0].Origin in ['VOZ','HKT'] and Segments[0].Destination in ['VOZ','HKT'] or Segments[0].Origin in ['GOJ','BKK'] and Segments[0].Destination in ['GOJ','BKK'] or Segments[0].Origin in ['ASF','HKT'] and Segments[0].Destination in ['ASF','HKT'] or Segments[0].Origin in ['AER','SIP'] and Segments[0].Destination in ['AER','SIP'] or Segments[0].Origin in ['TJM','SGN'] and Segments[0].Destination in ['TJM','SGN'] or Segments[0].Origin in ['MOW','MIL'] and Segments[0].Destination in ['MOW','MIL'] or Segments[0].Origin in ['MOW','USM'] and Segments[0].Destination in ['MOW','USM'] or Segments[0].Origin in ['IKT','KBV'] and Segments[0].Destination in ['IKT','KBV'] or Segments[0].Origin in ['UFA','HKT'] and Segments[0].Destination in ['UFA','HKT'] or Segments[0].Origin in ['EGO','UTP'] and Segments[0].Destination in ['EGO','UTP'] or Segments[0].Origin in ['HTA','DXB'] and Segments[0].Destination in ['HTA','DXB'] or Segments[0].Origin in ['OMS','SGN'] and Segments[0].Destination in ['OMS','SGN'] or Segments[0].Origin in ['PUJ','HTA'] and Segments[0].Destination in ['PUJ','HTA'] or Segments[0].Origin in ['OMS','HKT'] and Segments[0].Destination in ['OMS','HKT'] or Segments[0].Origin in ['KUF','DXB'] and Segments[0].Destination in ['KUF','DXB'] or Segments[0].Origin in ['MCX','BKK'] and Segments[0].Destination in ['MCX','BKK'] or Segments[0].Origin in ['IKT','HKT'] and Segments[0].Destination in ['IKT','HKT'] or Segments[0].Origin in ['ROV','DXB'] and Segments[0].Destination in ['ROV','DXB'] or Segments[0].Origin in ['TJM','DXB'] and Segments[0].Destination in ['TJM','DXB'] or Segments[0].Origin in ['OMS','USM'] and Segments[0].Destination in ['OMS','USM'] or Segments[0].Origin in ['KRR','DXB'] and Segments[0].Destination in ['KRR','DXB'] or Segments[0].Origin in ['KZN','HKT'] and Segments[0].Destination in ['KZN','HKT'] or Segments[0].Origin in ['LED','USM'] and Segments[0].Destination in ['LED','USM'] or Segments[0].Origin in ['MRV','HKT'] and Segments[0].Destination in ['MRV','HKT'] or Segments[0].Origin in ['TOF','HKT'] and Segments[0].Destination in ['TOF','HKT'] or Segments[0].Origin in ['KEJ','DXB'] and Segments[0].Destination in ['KEJ','DXB'] or Segments[0].Origin in ['MRV','DXB'] and Segments[0].Destination in ['MRV','DXB'] or Segments[0].Origin in ['OGZ','BKK'] and Segments[0].Destination in ['OGZ','BKK'] or Segments[0].Origin in ['PEE','UTP'] and Segments[0].Destination in ['PEE','UTP'] or Segments[0].Origin in ['ROV','USM'] and Segments[0].Destination in ['ROV','USM'] or Segments[0].Origin in ['KUF','UTP'] and Segments[0].Destination in ['KUF','UTP'] or Segments[0].Origin in ['KZN','SIP'] and Segments[0].Destination in ['KZN','SIP'] or Segments[0].Origin in ['REN','SHJ'] and Segments[0].Destination in ['REN','SHJ'] or Segments[0].Origin in ['KRR','SGN'] and Segments[0].Destination in ['KRR','SGN'] or Segments[0].Origin in ['MOW','BUH'] and Segments[0].Destination in ['MOW','BUH'] or Segments[0].Origin in ['BQS','SGN'] and Segments[0].Destination in ['BQS','SGN'] or Segments[0].Origin in ['TOF','DXB'] and Segments[0].Destination in ['TOF','DXB'] or Segments[0].Origin in ['KUF','HKT'] and Segments[0].Destination in ['KUF','HKT'] or Segments[0].Origin in ['HRG','SCW'] and Segments[0].Destination in ['HRG','SCW'] or Segments[0].Origin in ['PEE','AYT'] and Segments[0].Destination in ['PEE','AYT'] or Segments[0].Origin in ['OMS','BKK'] and Segments[0].Destination in ['OMS','BKK'] or Segments[0].Origin in ['CEK','BKK'] and Segments[0].Destination in ['CEK','BKK'] or Segments[0].Origin in ['YKS','HKT'] and Segments[0].Destination in ['YKS','HKT'] or Segments[0].Origin in ['MOW','TRN'] and Segments[0].Destination in ['MOW','TRN'] or Segments[0].Origin in ['OMS','DXB'] and Segments[0].Destination in ['OMS','DXB'] or Segments[0].Origin in ['VVO','HKT'] and Segments[0].Destination in ['VVO','HKT'] or Segments[0].Origin in ['KZN','USM'] and Segments[0].Destination in ['KZN','USM'] or Segments[0].Origin in ['MOW','POP'] and Segments[0].Destination in ['MOW','POP'] or Segments[0].Origin in ['LED','UTP'] and Segments[0].Destination in ['LED','UTP'] or Segments[0].Origin in ['GOJ','SGN'] and Segments[0].Destination in ['GOJ','SGN'] or Segments[0].Origin in ['VVO','USM'] and Segments[0].Destination in ['VVO','USM'] or Segments[0].Origin in ['PUJ','CEE'] and Segments[0].Destination in ['PUJ','CEE'] or Segments[0].Origin in ['SVX','PRG'] and Segments[0].Destination in ['SVX','PRG'] or Segments[0].Origin in ['VRA','ABA'] and Segments[0].Destination in ['VRA','ABA'] or Segments[0].Origin in ['IKT','SGN'] and Segments[0].Destination in ['IKT','SGN'] or Segments[0].Origin in ['VOG','SHJ'] and Segments[0].Destination in ['VOG','SHJ'])` - program, err := expr.Compile(expression, expr.Env(env)) - if err != nil { - b.Fatal(err) + out, err = vm.Run(program, &env) } + b.StopTimer() - var out interface{} - for n := 0; n < b.N; n++ { - out, err = vm.Run(program, env) - } - if err != nil { - b.Fatal(err) - } - if !out.(bool) { - b.Fail() - } + require.NoError(b, err) + require.True(b, out.(bool)) } From cb5654705be4f72efc18fbbcaa9f23c922ebf1df Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 23 Aug 2023 14:40:33 +0200 Subject: [PATCH 111/506] Move fuzz --- {testdata => test/fuzz}/fuzz_corpus.sh | 0 {testdata => test/fuzz}/fuzz_corpus.txt | 0 {testdata => test/fuzz}/fuzz_expr.dict | 0 .../fuzz}/fuzz_expr_seed_corpus.zip | Bin fuzz_test.go => test/fuzz/fuzz_test.go | 21 +++++++++--------- 5 files changed, 10 insertions(+), 11 deletions(-) rename {testdata => test/fuzz}/fuzz_corpus.sh (100%) rename {testdata => test/fuzz}/fuzz_corpus.txt (100%) rename {testdata => test/fuzz}/fuzz_expr.dict (100%) rename {testdata => test/fuzz}/fuzz_expr_seed_corpus.zip (100%) rename fuzz_test.go => test/fuzz/fuzz_test.go (97%) diff --git a/testdata/fuzz_corpus.sh b/test/fuzz/fuzz_corpus.sh similarity index 100% rename from testdata/fuzz_corpus.sh rename to test/fuzz/fuzz_corpus.sh diff --git a/testdata/fuzz_corpus.txt b/test/fuzz/fuzz_corpus.txt similarity index 100% rename from testdata/fuzz_corpus.txt rename to test/fuzz/fuzz_corpus.txt diff --git a/testdata/fuzz_expr.dict b/test/fuzz/fuzz_expr.dict similarity index 100% rename from testdata/fuzz_expr.dict rename to test/fuzz/fuzz_expr.dict diff --git a/testdata/fuzz_expr_seed_corpus.zip b/test/fuzz/fuzz_expr_seed_corpus.zip similarity index 100% rename from testdata/fuzz_expr_seed_corpus.zip rename to test/fuzz/fuzz_expr_seed_corpus.zip diff --git a/fuzz_test.go b/test/fuzz/fuzz_test.go similarity index 97% rename from fuzz_test.go rename to test/fuzz/fuzz_test.go index 5770d8704..2496e4e1a 100644 --- a/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -1,4 +1,4 @@ -package expr_test +package fuzz import ( "os" @@ -10,6 +10,15 @@ import ( ) func FuzzExpr(f *testing.F) { + b, err := os.ReadFile("./fuzz_corpus.txt") + if err != nil { + panic(err) + } + corpus := strings.Split(strings.TrimSpace(string(b)), "\n") + for _, s := range corpus { + f.Add(s) + } + env := map[string]interface{}{ "i": 1, "j": 2, @@ -20,7 +29,6 @@ func FuzzExpr(f *testing.F) { "add": func(a, b int) int { return a + b }, "foo": Foo{A: 1, B: 2, Bar: Bar{A: 1, B: 2}}, } - head := expr.Function( "head", func(params ...interface{}) (interface{}, error) { @@ -29,15 +37,6 @@ func FuzzExpr(f *testing.F) { new(func(int) int), ) - b, err := os.ReadFile("./testdata/fuzz_corpus.txt") - if err != nil { - panic(err) - } - corpus := strings.Split(strings.TrimSpace(string(b)), "\n") - for _, s := range corpus { - f.Add(s) - } - skip := []*regexp.Regexp{ regexp.MustCompile(`cannot fetch .* from .*`), regexp.MustCompile(`cannot get .* from .*`), From b7458fcfc215edb74a593457bf6add53a0adf1b9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 23 Aug 2023 15:09:21 +0200 Subject: [PATCH 112/506] Add len(filter()) optimization --- optimizer/filter_len.go | 22 ++++++++++++++++++++++ optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 27 +++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 optimizer/filter_len.go diff --git a/optimizer/filter_len.go b/optimizer/filter_len.go new file mode 100644 index 000000000..2293de81d --- /dev/null +++ b/optimizer/filter_len.go @@ -0,0 +1,22 @@ +package optimizer + +import ( + . "github.com/antonmedv/expr/ast" +) + +type filterLen struct{} + +func (*filterLen) Visit(node *Node) { + if ln, ok := (*node).(*BuiltinNode); ok && + ln.Name == "len" && + len(ln.Arguments) == 1 { + if filter, ok := ln.Arguments[0].(*BuiltinNode); ok && + filter.Name == "filter" && + len(filter.Arguments) == 2 { + Patch(node, &BuiltinNode{ + Name: "count", + Arguments: filter.Arguments, + }) + } + } +} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index 9c97496c8..cd7802711 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -33,5 +33,6 @@ func Optimize(node *Node, config *conf.Config) error { } Walk(node, &inRange{}) Walk(node, &constRange{}) + Walk(node, &filterLen{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 0fc9f55bd..162a355f1 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -138,3 +138,30 @@ func TestOptimize_const_expr(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_filter_len(t *testing.T) { + tree, err := parser.Parse(`len(filter(users, .Name == "Bob"))`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "count", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} From 8b8934fc7140d346f8e249b56ed384c17122250a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 23 Aug 2023 18:37:12 +0200 Subject: [PATCH 113/506] Add find() and findIndex() --- builtin/builtin.go | 10 +++++++++ checker/checker.go | 46 +++++++++++++++++++++++++++++++++++++++++ checker/checker_test.go | 5 +++++ compiler/compiler.go | 38 +++++++++++++++++++++++++++++++++- debug/debugger.go | 2 +- expr_test.go | 21 +++++++++++++------ parser/parser.go | 16 +++++++------- repl/repl.go | 5 +++++ vm/opcodes.go | 3 ++- vm/program.go | 7 +++++-- vm/vm.go | 16 +++++++++----- 11 files changed, 146 insertions(+), 23 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 82922e9dd..fe1f36ab8 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -60,6 +60,16 @@ var Builtins = []*Function{ Predicate: true, Types: types(new(func([]interface{}, func(interface{}) bool) []interface{})), }, + { + Name: "find", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) interface{})), + }, + { + Name: "findIndex", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) int)), + }, { Name: "map", Predicate: true, diff --git a/checker/checker.go b/checker/checker.go index 4a001f4d2..5cf25380f 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -672,6 +672,52 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return integerType, info{} } return v.error(node.Arguments[1], "closure should has one input and one output param") + + case "find": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + v.collections = append(v.collections, collection) + closure, _ := v.visit(node.Arguments[1]) + v.collections = v.collections[:len(v.collections)-1] + + if isFunc(closure) && + closure.NumOut() == 1 && + closure.NumIn() == 1 && isAny(closure.In(0)) { + + if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { + return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + } + if isAny(collection) { + return anyType, info{} + } + return collection.Elem(), info{} + } + return v.error(node.Arguments[1], "closure should has one input and one output param") + + case "findIndex": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + v.collections = append(v.collections, collection) + closure, _ := v.visit(node.Arguments[1]) + v.collections = v.collections[:len(v.collections)-1] + + if isFunc(closure) && + closure.NumOut() == 1 && + closure.NumIn() == 1 && isAny(closure.In(0)) { + + if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { + return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + } + return integerType, info{} + } + return v.error(node.Arguments[1], "closure should has one input and one output param") + } if id, ok := builtin.Index[node.Name]; ok { diff --git a/checker/checker_test.go b/checker/checker_test.go index e1c7e50b2..c4b322498 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -428,6 +428,11 @@ closure should return boolean (got string) (1:20) | filter(ArrayOfFoo, {.Bar.Baz}) | ...................^ +find(ArrayOfFoo, {.Bar.Baz}) +closure should return boolean (got string) (1:18) + | find(ArrayOfFoo, {.Bar.Baz}) + | .................^ + map(1, {2}) builtin map takes only array (got int) (1:5) | map(1, {2}) diff --git a/compiler/compiler.go b/compiler/compiler.go index b40e12756..c99207183 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -719,6 +719,42 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpGetCount) c.emit(OpEnd) return + + case "find": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + var loopBreak int + c.emitLoop(func() { + c.compile(node.Arguments[1]) + noop := c.emit(OpJumpIfFalse, placeholder) + c.emit(OpPop) + c.emit(OpPointer) + loopBreak = c.emit(OpJump, placeholder) + c.patchJump(noop) + c.emit(OpPop) + }) + c.emit(OpNil) + c.patchJump(loopBreak) + c.emit(OpEnd) + return + + case "findIndex": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + var loopBreak int + c.emitLoop(func() { + c.compile(node.Arguments[1]) + noop := c.emit(OpJumpIfFalse, placeholder) + c.emit(OpPop) + c.emit(OpGetIndex) + loopBreak = c.emit(OpJump, placeholder) + c.patchJump(noop) + c.emit(OpPop) + }) + c.emit(OpPushInt, -1) + c.patchJump(loopBreak) + c.emit(OpEnd) + return } if id, ok := builtin.Index[node.Name]; ok { @@ -755,7 +791,7 @@ func (c *compiler) emitLoop(body func()) { body() - c.emit(OpIncrementIt) + c.emit(OpIncrementIndex) c.emit(OpJumpBackward, c.calcBackwardJump(begin)) c.patchJump(end) } diff --git a/debug/debugger.go b/debug/debugger.go index 7de851769..a002e0558 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -126,7 +126,7 @@ func StartDebugger(program *Program, env interface{}) { value int } var keys []pair - keys = append(keys, pair{"It", s.It}) + keys = append(keys, pair{"Index", s.Index}) keys = append(keys, pair{"Len", s.Len}) keys = append(keys, pair{"Count", s.Count}) row := 0 diff --git a/expr_test.go b/expr_test.go index 792586278..757a6d9d8 100644 --- a/expr_test.go +++ b/expr_test.go @@ -537,7 +537,7 @@ func TestExpr(t *testing.T) { Abstract: nil, ArrayOfAny: nil, ArrayOfInt: []int{1, 2, 3, 4, 5}, - ArrayOfFoo: nil, + ArrayOfFoo: []*mock.Foo{{Value: "foo"}, {Value: "bar"}, {Value: "baz"}}, MapOfFoo: nil, MapOfAny: nil, FuncParam: nil, @@ -960,11 +960,22 @@ func TestExpr(t *testing.T) { `map(1..2, let x = #; map(2..3, let y = #; x + y))`, []interface{}{[]interface{}{3, 4}, []interface{}{4, 5}}, }, + { + `len(filter(1..99, # % 7 == 0))`, + 14, + }, + { + `find(ArrayOfFoo, .Value == "baz")`, + env.ArrayOfFoo[2], + }, + { + `findIndex(ArrayOfFoo, .Value == "baz")`, + 2, + }, } for _, tt := range tests { t.Run(tt.code, func(t *testing.T) { - tt := tt program, err := expr.Compile(tt.code, expr.Env(mock.Env{})) require.NoError(t, err, "compile error") @@ -974,8 +985,7 @@ func TestExpr(t *testing.T) { }) } for _, tt := range tests { - t.Run(tt.code, func(t *testing.T) { - tt := tt + t.Run("Unoptimized "+tt.code, func(t *testing.T) { program, err := expr.Compile(tt.code, expr.Optimize(false)) require.NoError(t, err, "unoptimized") @@ -985,8 +995,7 @@ func TestExpr(t *testing.T) { }) } for _, tt := range tests { - t.Run(tt.code, func(t *testing.T) { - tt := tt + t.Run("Eval "+tt.code, func(t *testing.T) { got, err := expr.Eval(tt.code, env) require.NoError(t, err, "eval") assert.Equal(t, tt.want, got, "eval") diff --git a/parser/parser.go b/parser/parser.go index f2afc2eca..cef232d7a 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -17,13 +17,15 @@ import ( var predicates = map[string]struct { arity int }{ - "all": {2}, - "none": {2}, - "any": {2}, - "one": {2}, - "filter": {2}, - "map": {2}, - "count": {2}, + "all": {2}, + "none": {2}, + "any": {2}, + "one": {2}, + "filter": {2}, + "map": {2}, + "count": {2}, + "find": {2}, + "findIndex": {2}, } type parser struct { diff --git a/repl/repl.go b/repl/repl.go index c249af0d9..d50b3b157 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -25,9 +25,14 @@ var keywords = []string{ } func main() { + home, err := os.UserHomeDir() + if err != nil { + panic(err) + } rl, err := readline.NewEx(&readline.Config{ Prompt: "❯ ", AutoComplete: completer{append(builtin.Names, keywords...)}, + HistoryFile: home + "/.expr_history", }) if err != nil { panic(err) diff --git a/vm/opcodes.go b/vm/opcodes.go index 079d1c76f..75e7081df 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -65,8 +65,9 @@ const ( OpLen OpCast OpDeref - OpIncrementIt + OpIncrementIndex OpIncrementCount + OpGetIndex OpGetCount OpGetLen OpPointer diff --git a/vm/program.go b/vm/program.go index 1481dbf93..b99aa1b81 100644 --- a/vm/program.go +++ b/vm/program.go @@ -268,12 +268,15 @@ func (program *Program) Opcodes(w io.Writer) { case OpDeref: code("OpDeref") - case OpIncrementIt: - code("OpIncrementIt") + case OpIncrementIndex: + code("OpIncrementIndex") case OpIncrementCount: code("OpIncrementCount") + case OpGetIndex: + code("OpGetIndex") + case OpGetCount: code("OpGetCount") diff --git a/vm/vm.go b/vm/vm.go index 49bee401f..5eb4bbaf3 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -40,7 +40,7 @@ type VM struct { type Scope struct { Array reflect.Value - It int + Index int Len int Count int } @@ -99,6 +99,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpPush: vm.push(program.Constants[arg]) + case OpPushInt: + vm.push(arg) + case OpPop: vm.pop() @@ -196,7 +199,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpJumpIfEnd: scope := vm.Scope() - if scope.It >= scope.Len { + if scope.Index >= scope.Len { vm.ip += arg } @@ -431,14 +434,17 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) a := vm.pop() vm.push(runtime.Deref(a)) - case OpIncrementIt: + case OpIncrementIndex: scope := vm.Scope() - scope.It++ + scope.Index++ case OpIncrementCount: scope := vm.Scope() scope.Count++ + case OpGetIndex: + vm.push(vm.Scope().Index) + case OpGetCount: scope := vm.Scope() vm.push(scope.Count) @@ -449,7 +455,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpPointer: scope := vm.Scope() - vm.push(scope.Array.Index(scope.It).Interface()) + vm.push(scope.Array.Index(scope.Index).Interface()) case OpBegin: a := vm.pop() From a875bbab447c95c857ed448d12a777be4a41a156 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 23 Aug 2023 21:11:13 +0200 Subject: [PATCH 114/506] Add filter()[0] optimization --- ast/node.go | 1 + compiler/compiler.go | 9 ++++-- expr_test.go | 39 ++++++++++++++++++++++++++ optimizer/filter_first.go | 36 ++++++++++++++++++++++++ optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 56 +++++++++++++++++++++++++++++++++++++ vm/opcodes.go | 1 + vm/program.go | 3 ++ vm/vm.go | 3 ++ 9 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 optimizer/filter_first.go diff --git a/ast/node.go b/ast/node.go index 1adf95ac9..da2173d0b 100644 --- a/ast/node.go +++ b/ast/node.go @@ -133,6 +133,7 @@ type BuiltinNode struct { base Name string Arguments []Node + Throws bool } type ClosureNode struct { diff --git a/compiler/compiler.go b/compiler/compiler.go index c99207183..62d128234 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -733,7 +733,12 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.patchJump(noop) c.emit(OpPop) }) - c.emit(OpNil) + if node.Throws { + c.emit(OpPush, c.addConstant(fmt.Errorf("reflect: slice index out of range"))) + c.emit(OpThrow) + } else { + c.emit(OpNil) + } c.patchJump(loopBreak) c.emit(OpEnd) return @@ -751,7 +756,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.patchJump(noop) c.emit(OpPop) }) - c.emit(OpPushInt, -1) + c.emit(OpNil) c.patchJump(loopBreak) c.emit(OpEnd) return diff --git a/expr_test.go b/expr_test.go index 757a6d9d8..97d032889 100644 --- a/expr_test.go +++ b/expr_test.go @@ -972,6 +972,18 @@ func TestExpr(t *testing.T) { `findIndex(ArrayOfFoo, .Value == "baz")`, 2, }, + { + `filter(ArrayOfFoo, .Value == "baz")[0]`, + env.ArrayOfFoo[2], + }, + { + `first(filter(ArrayOfFoo, .Value == "baz"))`, + env.ArrayOfFoo[2], + }, + { + `first(filter(ArrayOfFoo, false))`, + nil, + }, } for _, tt := range tests { @@ -1003,6 +1015,33 @@ func TestExpr(t *testing.T) { } } +func TestExpr_error(t *testing.T) { + env := mock.Env{} + + tests := []struct { + code string + want string + }{ + { + `filter(1..9, # > 9)[0]`, + `reflect: slice index out of range (1:20) + | filter(1..9, # > 9)[0] + | ...................^`, + }, + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + program, err := expr.Compile(tt.code, expr.Env(mock.Env{})) + require.NoError(t, err) + + _, err = expr.Run(program, env) + require.Error(t, err) + assert.Equal(t, tt.want, err.Error()) + }) + } +} + func TestExpr_optional_chaining(t *testing.T) { env := map[string]interface{}{} program, err := expr.Compile("foo?.bar.baz", expr.Env(env), expr.AllowUndefinedVariables()) diff --git a/optimizer/filter_first.go b/optimizer/filter_first.go new file mode 100644 index 000000000..71b907701 --- /dev/null +++ b/optimizer/filter_first.go @@ -0,0 +1,36 @@ +package optimizer + +import ( + . "github.com/antonmedv/expr/ast" +) + +type filterFirst struct{} + +func (*filterFirst) Visit(node *Node) { + if member, ok := (*node).(*MemberNode); ok && member.Property != nil && !member.Optional { + if prop, ok := member.Property.(*IntegerNode); ok && prop.Value == 0 { + if filter, ok := member.Node.(*BuiltinNode); ok && + filter.Name == "filter" && + len(filter.Arguments) == 2 { + Patch(node, &BuiltinNode{ + Name: "find", + Arguments: filter.Arguments, + Throws: true, // to match the behavior of filter()[0] + }) + } + } + } + if first, ok := (*node).(*BuiltinNode); ok && + first.Name == "first" && + len(first.Arguments) == 1 { + if filter, ok := first.Arguments[0].(*BuiltinNode); ok && + filter.Name == "filter" && + len(filter.Arguments) == 2 { + Patch(node, &BuiltinNode{ + Name: "find", + Arguments: filter.Arguments, + Throws: false, // as first() will return nil if not found + }) + } + } +} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index cd7802711..62684d7f8 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -34,5 +34,6 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &inRange{}) Walk(node, &constRange{}) Walk(node, &filterLen{}) + Walk(node, &filterFirst{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 162a355f1..d71f672da 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -165,3 +165,59 @@ func TestOptimize_filter_len(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_filter_0(t *testing.T) { + tree, err := parser.Parse(`filter(users, .Name == "Bob")[0]`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "find", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + Throws: true, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} + +func TestOptimize_filter_first(t *testing.T) { + tree, err := parser.Parse(`first(filter(users, .Name == "Bob"))`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "find", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + Throws: false, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} diff --git a/vm/opcodes.go b/vm/opcodes.go index 75e7081df..031d3ad87 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -71,6 +71,7 @@ const ( OpGetCount OpGetLen OpPointer + OpThrow OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index b99aa1b81..f3739e3f1 100644 --- a/vm/program.go +++ b/vm/program.go @@ -286,6 +286,9 @@ func (program *Program) Opcodes(w io.Writer) { case OpPointer: code("OpPointer") + case OpThrow: + code("OpThrow") + case OpBegin: code("OpBegin") diff --git a/vm/vm.go b/vm/vm.go index 5eb4bbaf3..33c65bbd2 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -457,6 +457,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) scope := vm.Scope() vm.push(scope.Array.Index(scope.Index).Interface()) + case OpThrow: + panic(vm.pop().(error)) + case OpBegin: a := vm.pop() array := reflect.ValueOf(a) From 88a191324279251a7a6784050b12abbba879f29d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 24 Aug 2023 09:11:14 +0200 Subject: [PATCH 115/506] Add filter()[-1] optimization --- builtin/builtin.go | 16 ++++++++-- checker/checker.go | 27 ++++++++--------- checker/checker_test.go | 8 ++--- compiler/compiler.go | 60 +++++++++++++++++++++++++++++++++++++ expr_test.go | 56 +++++++++++++++++++++------------- optimizer/filter_last.go | 36 ++++++++++++++++++++++ optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 56 ++++++++++++++++++++++++++++++++++ parser/parser.go | 20 +++++++------ repl/repl.go | 5 +--- vm/opcodes.go | 4 ++- vm/program.go | 10 +++++-- vm/vm.go | 10 ++++++- 13 files changed, 250 insertions(+), 59 deletions(-) create mode 100644 optimizer/filter_last.go diff --git a/builtin/builtin.go b/builtin/builtin.go index fe1f36ab8..64d705fd8 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -60,6 +60,16 @@ var Builtins = []*Function{ Predicate: true, Types: types(new(func([]interface{}, func(interface{}) bool) []interface{})), }, + { + Name: "map", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) interface{}) []interface{})), + }, + { + Name: "count", + Predicate: true, + Types: types(new(func([]interface{}, func(interface{}) bool) int)), + }, { Name: "find", Predicate: true, @@ -71,12 +81,12 @@ var Builtins = []*Function{ Types: types(new(func([]interface{}, func(interface{}) bool) int)), }, { - Name: "map", + Name: "findLast", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) interface{}) []interface{})), + Types: types(new(func([]interface{}, func(interface{}) bool) interface{})), }, { - Name: "count", + Name: "findLastIndex", Predicate: true, Types: types(new(func([]interface{}, func(interface{}) bool) int)), }, diff --git a/checker/checker.go b/checker/checker.go index 5cf25380f..20e270f2c 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -604,11 +604,11 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { closure.NumIn() == 1 && isAny(closure.In(0)) { if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { - return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + return v.error(node.Arguments[1], "predicate should return boolean (got %v)", closure.Out(0).String()) } return boolType, info{} } - return v.error(node.Arguments[1], "closure should has one input and one output param") + return v.error(node.Arguments[1], "predicate should has one input and one output param") case "filter": collection, _ := v.visit(node.Arguments[0]) @@ -625,14 +625,14 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { closure.NumIn() == 1 && isAny(closure.In(0)) { if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { - return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + return v.error(node.Arguments[1], "predicate should return boolean (got %v)", closure.Out(0).String()) } if isAny(collection) { return arrayType, info{} } return reflect.SliceOf(collection.Elem()), info{} } - return v.error(node.Arguments[1], "closure should has one input and one output param") + return v.error(node.Arguments[1], "predicate should has one input and one output param") case "map": collection, _ := v.visit(node.Arguments[0]) @@ -650,7 +650,7 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return reflect.SliceOf(closure.Out(0)), info{} } - return v.error(node.Arguments[1], "closure should has one input and one output param") + return v.error(node.Arguments[1], "predicate should has one input and one output param") case "count": collection, _ := v.visit(node.Arguments[0]) @@ -666,14 +666,14 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { closure.NumOut() == 1 && closure.NumIn() == 1 && isAny(closure.In(0)) { if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { - return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + return v.error(node.Arguments[1], "predicate should return boolean (got %v)", closure.Out(0).String()) } return integerType, info{} } - return v.error(node.Arguments[1], "closure should has one input and one output param") + return v.error(node.Arguments[1], "predicate should has one input and one output param") - case "find": + case "find", "findLast": collection, _ := v.visit(node.Arguments[0]) if !isArray(collection) && !isAny(collection) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) @@ -688,16 +688,16 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { closure.NumIn() == 1 && isAny(closure.In(0)) { if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { - return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + return v.error(node.Arguments[1], "predicate should return boolean (got %v)", closure.Out(0).String()) } if isAny(collection) { return anyType, info{} } return collection.Elem(), info{} } - return v.error(node.Arguments[1], "closure should has one input and one output param") + return v.error(node.Arguments[1], "predicate should has one input and one output param") - case "findIndex": + case "findIndex", "findLastIndex": collection, _ := v.visit(node.Arguments[0]) if !isArray(collection) && !isAny(collection) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) @@ -712,12 +712,11 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { closure.NumIn() == 1 && isAny(closure.In(0)) { if !isBool(closure.Out(0)) && !isAny(closure.Out(0)) { - return v.error(node.Arguments[1], "closure should return boolean (got %v)", closure.Out(0).String()) + return v.error(node.Arguments[1], "predicate should return boolean (got %v)", closure.Out(0).String()) } return integerType, info{} } - return v.error(node.Arguments[1], "closure should has one input and one output param") - + return v.error(node.Arguments[1], "predicate should has one input and one output param") } if id, ok := builtin.Index[node.Name]; ok { diff --git a/checker/checker_test.go b/checker/checker_test.go index c4b322498..c451736ef 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -414,22 +414,22 @@ builtin count takes only array (got int) (1:7) | ......^ count(ArrayOfInt, {#}) -closure should return boolean (got int) (1:19) +predicate should return boolean (got int) (1:19) | count(ArrayOfInt, {#}) | ..................^ all(ArrayOfInt, {# + 1}) -closure should return boolean (got int) (1:17) +predicate should return boolean (got int) (1:17) | all(ArrayOfInt, {# + 1}) | ................^ filter(ArrayOfFoo, {.Bar.Baz}) -closure should return boolean (got string) (1:20) +predicate should return boolean (got string) (1:20) | filter(ArrayOfFoo, {.Bar.Baz}) | ...................^ find(ArrayOfFoo, {.Bar.Baz}) -closure should return boolean (got string) (1:18) +predicate should return boolean (got string) (1:18) | find(ArrayOfFoo, {.Bar.Baz}) | .................^ diff --git a/compiler/compiler.go b/compiler/compiler.go index 62d128234..805f7577d 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -760,6 +760,48 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.patchJump(loopBreak) c.emit(OpEnd) return + + case "findLast": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + var loopBreak int + c.emitLoopBackwards(func() { + c.compile(node.Arguments[1]) + noop := c.emit(OpJumpIfFalse, placeholder) + c.emit(OpPop) + c.emit(OpPointer) + loopBreak = c.emit(OpJump, placeholder) + c.patchJump(noop) + c.emit(OpPop) + }) + if node.Throws { + c.emit(OpPush, c.addConstant(fmt.Errorf("reflect: slice index out of range"))) + c.emit(OpThrow) + } else { + c.emit(OpNil) + } + c.patchJump(loopBreak) + c.emit(OpEnd) + return + + case "findLastIndex": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + var loopBreak int + c.emitLoopBackwards(func() { + c.compile(node.Arguments[1]) + noop := c.emit(OpJumpIfFalse, placeholder) + c.emit(OpPop) + c.emit(OpGetIndex) + loopBreak = c.emit(OpJump, placeholder) + c.patchJump(noop) + c.emit(OpPop) + }) + c.emit(OpNil) + c.patchJump(loopBreak) + c.emit(OpEnd) + return + } if id, ok := builtin.Index[node.Name]; ok { @@ -801,6 +843,24 @@ func (c *compiler) emitLoop(body func()) { c.patchJump(end) } +func (c *compiler) emitLoopBackwards(body func()) { + c.emit(OpGetLen) + c.emit(OpInt, 1) + c.emit(OpSubtract) + c.emit(OpSetIndex) + begin := len(c.bytecode) + c.emit(OpGetIndex) + c.emit(OpInt, 0) + c.emit(OpMoreOrEqual) + end := c.emit(OpJumpIfFalse, placeholder) + + body() + + c.emit(OpDecrementIndex) + c.emit(OpJumpBackward, c.calcBackwardJump(begin)) + c.patchJump(end) +} + func (c *compiler) ClosureNode(node *ast.ClosureNode) { c.compile(node.Node) } diff --git a/expr_test.go b/expr_test.go index 97d032889..6cc97203f 100644 --- a/expr_test.go +++ b/expr_test.go @@ -984,33 +984,47 @@ func TestExpr(t *testing.T) { `first(filter(ArrayOfFoo, false))`, nil, }, + { + `findLast(1..9, # % 2 == 0)`, + 8, + }, + { + `findLastIndex(1..9, # % 2 == 0)`, + 7, + }, + { + `filter(1..9, # % 2 == 0)[-1]`, + 8, + }, + { + `last(filter(1..9, # % 2 == 0))`, + 8, + }, } for _, tt := range tests { t.Run(tt.code, func(t *testing.T) { - program, err := expr.Compile(tt.code, expr.Env(mock.Env{})) - require.NoError(t, err, "compile error") + { + program, err := expr.Compile(tt.code, expr.Env(mock.Env{})) + require.NoError(t, err, "compile error") - got, err := expr.Run(program, env) - require.NoError(t, err, "run error") - assert.Equal(t, tt.want, got) - }) - } - for _, tt := range tests { - t.Run("Unoptimized "+tt.code, func(t *testing.T) { - program, err := expr.Compile(tt.code, expr.Optimize(false)) - require.NoError(t, err, "unoptimized") + got, err := expr.Run(program, env) + require.NoError(t, err, "run error") + assert.Equal(t, tt.want, got) + } + { + program, err := expr.Compile(tt.code, expr.Optimize(false)) + require.NoError(t, err, "unoptimized") - got, err := expr.Run(program, env) - require.NoError(t, err, "unoptimized") - assert.Equal(t, tt.want, got, "unoptimized") - }) - } - for _, tt := range tests { - t.Run("Eval "+tt.code, func(t *testing.T) { - got, err := expr.Eval(tt.code, env) - require.NoError(t, err, "eval") - assert.Equal(t, tt.want, got, "eval") + got, err := expr.Run(program, env) + require.NoError(t, err, "unoptimized") + assert.Equal(t, tt.want, got, "unoptimized") + } + { + got, err := expr.Eval(tt.code, env) + require.NoError(t, err, "eval") + assert.Equal(t, tt.want, got, "eval") + } }) } } diff --git a/optimizer/filter_last.go b/optimizer/filter_last.go new file mode 100644 index 000000000..0195dfa6e --- /dev/null +++ b/optimizer/filter_last.go @@ -0,0 +1,36 @@ +package optimizer + +import ( + . "github.com/antonmedv/expr/ast" +) + +type filterLast struct{} + +func (*filterLast) Visit(node *Node) { + if member, ok := (*node).(*MemberNode); ok && member.Property != nil && !member.Optional { + if prop, ok := member.Property.(*IntegerNode); ok && prop.Value == -1 { + if filter, ok := member.Node.(*BuiltinNode); ok && + filter.Name == "filter" && + len(filter.Arguments) == 2 { + Patch(node, &BuiltinNode{ + Name: "findLast", + Arguments: filter.Arguments, + Throws: true, // to match the behavior of filter()[-1] + }) + } + } + } + if first, ok := (*node).(*BuiltinNode); ok && + first.Name == "last" && + len(first.Arguments) == 1 { + if filter, ok := first.Arguments[0].(*BuiltinNode); ok && + filter.Name == "filter" && + len(filter.Arguments) == 2 { + Patch(node, &BuiltinNode{ + Name: "findLast", + Arguments: filter.Arguments, + Throws: false, // as last() will return nil if not found + }) + } + } +} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index 62684d7f8..ce239724d 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -35,5 +35,6 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &constRange{}) Walk(node, &filterLen{}) Walk(node, &filterFirst{}) + Walk(node, &filterLast{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index d71f672da..457d8826a 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -221,3 +221,59 @@ func TestOptimize_filter_first(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_filter_minus_1(t *testing.T) { + tree, err := parser.Parse(`filter(users, .Name == "Bob")[-1]`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "findLast", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + Throws: true, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} + +func TestOptimize_filter_last(t *testing.T) { + tree, err := parser.Parse(`last(filter(users, .Name == "Bob"))`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "findLast", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + Throws: false, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} diff --git a/parser/parser.go b/parser/parser.go index cef232d7a..108b201a7 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -17,15 +17,17 @@ import ( var predicates = map[string]struct { arity int }{ - "all": {2}, - "none": {2}, - "any": {2}, - "one": {2}, - "filter": {2}, - "map": {2}, - "count": {2}, - "find": {2}, - "findIndex": {2}, + "all": {2}, + "none": {2}, + "any": {2}, + "one": {2}, + "filter": {2}, + "map": {2}, + "count": {2}, + "find": {2}, + "findIndex": {2}, + "findLast": {2}, + "findLastIndex": {2}, } type parser struct { diff --git a/repl/repl.go b/repl/repl.go index d50b3b157..cd326fa7b 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -13,12 +13,9 @@ import ( ) var keywords = []string{ + // Commands: "exit", "opcodes", "debug", - // Predicate functions: - "map", "filter", "all", - "any", "none", "one", - // Operators: "and", "or", "in", "not", "not in", "contains", "matches", "startsWith", "endsWith", diff --git a/vm/opcodes.go b/vm/opcodes.go index 031d3ad87..2efe09ded 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -5,7 +5,7 @@ type Opcode byte const ( OpInvalid Opcode = iota OpPush - OpPushInt + OpInt OpPop OpStore OpLoadVar @@ -66,8 +66,10 @@ const ( OpCast OpDeref OpIncrementIndex + OpDecrementIndex OpIncrementCount OpGetIndex + OpSetIndex OpGetCount OpGetLen OpPointer diff --git a/vm/program.go b/vm/program.go index f3739e3f1..c4cd8103b 100644 --- a/vm/program.go +++ b/vm/program.go @@ -87,8 +87,8 @@ func (program *Program) Opcodes(w io.Writer) { case OpPush: constant("OpPush") - case OpPushInt: - argument("OpPushInt") + case OpInt: + argument("OpInt") case OpPop: code("OpPop") @@ -271,12 +271,18 @@ func (program *Program) Opcodes(w io.Writer) { case OpIncrementIndex: code("OpIncrementIndex") + case OpDecrementIndex: + code("OpDecrementIndex") + case OpIncrementCount: code("OpIncrementCount") case OpGetIndex: code("OpGetIndex") + case OpSetIndex: + code("OpSetIndex") + case OpGetCount: code("OpGetCount") diff --git a/vm/vm.go b/vm/vm.go index 33c65bbd2..f083e74c2 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -99,7 +99,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpPush: vm.push(program.Constants[arg]) - case OpPushInt: + case OpInt: vm.push(arg) case OpPop: @@ -438,6 +438,10 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) scope := vm.Scope() scope.Index++ + case OpDecrementIndex: + scope := vm.Scope() + scope.Index-- + case OpIncrementCount: scope := vm.Scope() scope.Count++ @@ -445,6 +449,10 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpGetIndex: vm.push(vm.Scope().Index) + case OpSetIndex: + scope := vm.Scope() + scope.Index = vm.pop().(int) + case OpGetCount: scope := vm.Scope() vm.push(scope.Count) From 80f169a2eebc6fada92024b16e6c2b13919d9527 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 24 Aug 2023 10:27:52 +0200 Subject: [PATCH 116/506] Add map(filter()) optimization --- ast/node.go | 1 + compiler/compiler.go | 18 +++++++++-- expr_test.go | 28 +++++++++++++++++ optimizer/filter_first.go | 2 ++ optimizer/filter_last.go | 2 ++ optimizer/filter_map.go | 25 +++++++++++++++ optimizer/optimizer.go | 3 +- optimizer/optimizer_test.go | 63 +++++++++++++++++++++++++++++++++++++ 8 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 optimizer/filter_map.go diff --git a/ast/node.go b/ast/node.go index da2173d0b..e5b87078b 100644 --- a/ast/node.go +++ b/ast/node.go @@ -134,6 +134,7 @@ type BuiltinNode struct { Name string Arguments []Node Throws bool + Map Node } type ClosureNode struct { diff --git a/compiler/compiler.go b/compiler/compiler.go index 805f7577d..b817a60ce 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -688,7 +688,11 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.compile(node.Arguments[1]) c.emitCond(func() { c.emit(OpIncrementCount) - c.emit(OpPointer) + if node.Map != nil { + c.compile(node.Map) + } else { + c.emit(OpPointer) + } }) }) c.emit(OpGetCount) @@ -728,7 +732,11 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.compile(node.Arguments[1]) noop := c.emit(OpJumpIfFalse, placeholder) c.emit(OpPop) - c.emit(OpPointer) + if node.Map != nil { + c.compile(node.Map) + } else { + c.emit(OpPointer) + } loopBreak = c.emit(OpJump, placeholder) c.patchJump(noop) c.emit(OpPop) @@ -769,7 +777,11 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.compile(node.Arguments[1]) noop := c.emit(OpJumpIfFalse, placeholder) c.emit(OpPop) - c.emit(OpPointer) + if node.Map != nil { + c.compile(node.Map) + } else { + c.emit(OpPointer) + } loopBreak = c.emit(OpJump, placeholder) c.patchJump(noop) c.emit(OpPop) diff --git a/expr_test.go b/expr_test.go index 6cc97203f..78ef15cf1 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1000,6 +1000,34 @@ func TestExpr(t *testing.T) { `last(filter(1..9, # % 2 == 0))`, 8, }, + { + `map(filter(1..9, # % 2 == 0), # * 2)`, + []interface{}{4, 8, 12, 16}, + }, + { + `map(map(filter(1..9, # % 2 == 0), # * 2), # * 2)`, + []interface{}{8, 16, 24, 32}, + }, + { + `first(map(filter(1..9, # % 2 == 0), # * 2))`, + 4, + }, + { + `map(filter(1..9, # % 2 == 0), # * 2)[-1]`, + 16, + }, + { + `len(map(filter(1..9, # % 2 == 0), # * 2))`, + 4, + }, + { + `len(filter(map(1..9, # * 2), # % 2 == 0))`, + 9, + }, + { + `first(filter(map(1..9, # * 2), # % 2 == 0))`, + 2, + }, } for _, tt := range tests { diff --git a/optimizer/filter_first.go b/optimizer/filter_first.go index 71b907701..852e2c268 100644 --- a/optimizer/filter_first.go +++ b/optimizer/filter_first.go @@ -16,6 +16,7 @@ func (*filterFirst) Visit(node *Node) { Name: "find", Arguments: filter.Arguments, Throws: true, // to match the behavior of filter()[0] + Map: filter.Map, }) } } @@ -30,6 +31,7 @@ func (*filterFirst) Visit(node *Node) { Name: "find", Arguments: filter.Arguments, Throws: false, // as first() will return nil if not found + Map: filter.Map, }) } } diff --git a/optimizer/filter_last.go b/optimizer/filter_last.go index 0195dfa6e..0a072004b 100644 --- a/optimizer/filter_last.go +++ b/optimizer/filter_last.go @@ -16,6 +16,7 @@ func (*filterLast) Visit(node *Node) { Name: "findLast", Arguments: filter.Arguments, Throws: true, // to match the behavior of filter()[-1] + Map: filter.Map, }) } } @@ -30,6 +31,7 @@ func (*filterLast) Visit(node *Node) { Name: "findLast", Arguments: filter.Arguments, Throws: false, // as last() will return nil if not found + Map: filter.Map, }) } } diff --git a/optimizer/filter_map.go b/optimizer/filter_map.go new file mode 100644 index 000000000..9044ac34d --- /dev/null +++ b/optimizer/filter_map.go @@ -0,0 +1,25 @@ +package optimizer + +import ( + . "github.com/antonmedv/expr/ast" +) + +type filterMap struct{} + +func (*filterMap) Visit(node *Node) { + if mapBuiltin, ok := (*node).(*BuiltinNode); ok && + mapBuiltin.Name == "map" && + len(mapBuiltin.Arguments) == 2 { + if closure, ok := mapBuiltin.Arguments[1].(*ClosureNode); ok { + if filter, ok := mapBuiltin.Arguments[0].(*BuiltinNode); ok && + filter.Name == "filter" && + filter.Map == nil /* not already optimized */ { + Patch(node, &BuiltinNode{ + Name: "filter", + Arguments: filter.Arguments, + Map: closure.Node, + }) + } + } + } +} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index ce239724d..15f50fd73 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -33,8 +33,9 @@ func Optimize(node *Node, config *conf.Config) error { } Walk(node, &inRange{}) Walk(node, &constRange{}) + Walk(node, &filterMap{}) Walk(node, &filterLen{}) - Walk(node, &filterFirst{}) Walk(node, &filterLast{}) + Walk(node, &filterFirst{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 457d8826a..948fc6e14 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -277,3 +277,66 @@ func TestOptimize_filter_last(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_filter_map(t *testing.T) { + tree, err := parser.Parse(`map(filter(users, .Name == "Bob"), .Age)`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "filter", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + Map: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} + +func TestOptimize_filter_map_first(t *testing.T) { + tree, err := parser.Parse(`first(map(filter(users, .Name == "Bob"), .Age))`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "find", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + Map: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Throws: false, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} From 0baed263e9a5c2b216ce503f52930a77432d0068 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 24 Aug 2023 11:18:45 +0200 Subject: [PATCH 117/506] Fix flaky test --- bench_test.go | 4 ++-- builtin/builtin_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bench_test.go b/bench_test.go index b97897393..024d2c4fb 100644 --- a/bench_test.go +++ b/bench_test.go @@ -178,7 +178,7 @@ func Benchmark_filterMap(b *testing.B) { Ints []int } env := Env{ - Ints: make([]int, 1000), + Ints: make([]int, 100), } for i := 1; i <= len(env.Ints); i++ { env.Ints[i-1] = i @@ -195,7 +195,7 @@ func Benchmark_filterMap(b *testing.B) { b.StopTimer() require.NoError(b, err) - require.Len(b, out.([]interface{}), 142) + require.Len(b, out.([]interface{}), 14) require.Equal(b, 14, out.([]interface{})[0]) } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index d1e4b88fc..873fff5ff 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -65,7 +65,7 @@ func TestBuiltin(t *testing.T) { {`fromJSON("[1, 2, 3]")`, []interface{}{1.0, 2.0, 3.0}}, {`toBase64("hello")`, "aGVsbG8="}, {`fromBase64("aGVsbG8=")`, "hello"}, - {`now().Format("2006-01-02T15:04:05Z")`, time.Now().Format("2006-01-02T15:04:05Z")}, + {`now().Format("2006-01-02T15:04Z")`, time.Now().Format("2006-01-02T15:04Z")}, {`duration("1h")`, time.Hour}, {`date("2006-01-02T15:04:05Z")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)}, {`date("2006.01.02", "2006.01.02")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)}, From 532017a5c7516faeed5fd7268d33e4b628fcc0e5 Mon Sep 17 00:00:00 2001 From: Wytse Vellema Date: Thu, 24 Aug 2023 10:48:20 +0200 Subject: [PATCH 118/506] Add docgen types for most builtin types --- docgen/docgen.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docgen/docgen.go b/docgen/docgen.go index 3c2134555..672cd0183 100644 --- a/docgen/docgen.go +++ b/docgen/docgen.go @@ -46,6 +46,33 @@ var ( "filter": {Kind: "func", Arguments: []*Type{{Kind: "array", Type: &Type{Kind: "any"}}, {Kind: "func"}}, Return: &Type{Kind: "array", Type: &Type{Kind: "any"}}}, "map": {Kind: "func", Arguments: []*Type{{Kind: "array", Type: &Type{Kind: "any"}}, {Kind: "func"}}, Return: &Type{Kind: "array", Type: &Type{Kind: "any"}}}, "count": {Kind: "func", Arguments: []*Type{{Kind: "array", Type: &Type{Kind: "any"}}, {Kind: "func"}}, Return: &Type{Kind: "int"}}, + + "trim": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "cutstr", Kind: "string"}}, Return: &Type{Name: "string", Kind: "string"}}, + "trimPrefix": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "cutstr", Kind: "string"}}, Return: &Type{Name: "string", Kind: "string"}}, + "trimSuffix": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "cutstr", Kind: "string"}}, Return: &Type{Name: "string", Kind: "string"}}, + + "upper": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}}, Return: &Type{Name: "string", Kind: "string"}}, + "lower": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}}, Return: &Type{Name: "string", Kind: "string"}}, + "repeat": {Kind: "func", Arguments: []*Type{{Name: "n", Kind: "int"}}, Return: &Type{Name: "string", Kind: "string"}}, + + "join": {Kind: "func", Arguments: []*Type{{Kind: "array", Type: &Type{Kind: "any"}}, {Name: "glue", Kind: "string"}}, Return: &Type{Name: "string", Kind: "string"}}, + "indexOf": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "substr", Kind: "string"}}, Return: &Type{Name: "index", Kind: "int"}}, + "lastIndexOf": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "substr", Kind: "string"}}, Return: &Type{Name: "index", Kind: "int"}}, + + "hasPrefix": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "prefix", Kind: "string"}}, Return: &Type{Kind: "bool"}}, + "hasSuffix": {Kind: "func", Arguments: []*Type{{Name: "string", Kind: "string"}, {Name: "prefix", Kind: "string"}}, Return: &Type{Kind: "bool"}}, + + "toJSON": {Kind: "func", Arguments: []*Type{{Kind: "any"}}, Return: &Type{Kind: "string"}}, + "fromJSON": {Kind: "func", Arguments: []*Type{{Kind: "string"}}, Return: &Type{Kind: "any"}}, + + "toBase64": {Kind: "func", Arguments: []*Type{{Kind: "string"}}, Return: &Type{Kind: "string"}}, + "fromBase64": {Kind: "func", Arguments: []*Type{{Kind: "string"}}, Return: &Type{Kind: "string"}}, + + "first": {Kind: "func", Arguments: []*Type{{Kind: "array", Type: &Type{Kind: "any"}}}, Return: &Type{Kind: "any"}}, + "last": {Kind: "func", Arguments: []*Type{{Kind: "array", Type: &Type{Kind: "any"}}}, Return: &Type{Kind: "any"}}, + + "now": {Kind: "func", Return: &Type{Name: "time.Time", Kind: "struct"}}, + "duration": {Kind: "func", Arguments: []*Type{{Kind: "string"}}, Return: &Type{Kind: "time.Duration"}}, } ) From 5af4fe26f5609460674d5fae6ffe0eaac6ed9e60 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 24 Aug 2023 11:25:08 +0200 Subject: [PATCH 119/506] Upgrade to go1.18 --- .github/workflows/check.yml | 4 ++-- .github/workflows/diff.yml | 4 ++-- .github/workflows/test.yml | 2 +- debug/go.sum | 2 ++ go.mod | 10 ++++++++-- go.sum | 9 ++------- repl/go.sum | 2 ++ 7 files changed, 19 insertions(+), 14 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 98c843195..63037cd61 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,9 +11,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Setup Go 1.19 + - name: Setup Go 1.18 uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.18 - name: Test run: npx zx --experimental .github/scripts/coverage.mjs diff --git a/.github/workflows/diff.yml b/.github/workflows/diff.yml index 84aad6610..d9fd20c59 100644 --- a/.github/workflows/diff.yml +++ b/.github/workflows/diff.yml @@ -8,10 +8,10 @@ jobs: bench: runs-on: ubuntu-latest steps: - - name: Setup Go 1.19 + - name: Setup Go 1.18 uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.18 - name: Install benchstat run: go install golang.org/x/perf/cmd/benchstat@latest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e41af94a4..8a8b87873 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-versions: [ '1.13', '1.14', '1.15', '1.16' , '1.17', '1.18', '1.19', '1.20', '1.21' ] + go-versions: [ '1.18', '1.19', '1.20', '1.21' ] steps: - uses: actions/checkout@v3 - name: Setup Go ${{ matrix.go-version }} diff --git a/debug/go.sum b/debug/go.sum index 879eeb41d..e08364c2c 100644 --- a/debug/go.sum +++ b/debug/go.sum @@ -20,9 +20,11 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= diff --git a/go.mod b/go.mod index d064da5b9..03d6b62df 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,11 @@ module github.com/antonmedv/expr -go 1.13 +go 1.18 -require github.com/stretchr/testify v1.8.0 +require github.com/stretchr/testify v1.8.4 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum index 51648299d..fa4b6e682 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,10 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/repl/go.sum b/repl/go.sum index ba8ef9af6..c6908b013 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -26,9 +26,11 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= From e5e5d19ed330b6be9cfb4fcebfa3860946164317 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 24 Aug 2023 15:26:36 +0200 Subject: [PATCH 120/506] Remove ExperimentalPipe() --- ast/node.go | 1 + conf/config.go | 1 - expr.go | 7 ------- repl/repl.go | 2 +- test/fuzz/fuzz_test.go | 2 +- test/pipes/pipes_test.go | 4 ++-- 6 files changed, 5 insertions(+), 12 deletions(-) diff --git a/ast/node.go b/ast/node.go index e5b87078b..d228e52ee 100644 --- a/ast/node.go +++ b/ast/node.go @@ -144,6 +144,7 @@ type ClosureNode struct { type PointerNode struct { base + Name string } type ConditionalNode struct { diff --git a/conf/config.go b/conf/config.go index f89e6cca0..7e98e7ead 100644 --- a/conf/config.go +++ b/conf/config.go @@ -19,7 +19,6 @@ type Config struct { ExpectAny bool Optimize bool Strict bool - Pipes bool ConstFns map[string]reflect.Value Visitors []ast.Visitor Functions map[string]*builtin.Function diff --git a/expr.go b/expr.go index 973bdc108..4c07ab43e 100644 --- a/expr.go +++ b/expr.go @@ -130,13 +130,6 @@ func Function(name string, fn func(params ...interface{}) (interface{}, error), } } -// ExperimentalPipes enables pipes syntax. -func ExperimentalPipes() Option { - return func(c *conf.Config) { - c.Pipes = true - } -} - // DisableAllBuiltins disables all builtins. func DisableAllBuiltins() Option { return func(c *conf.Config) { diff --git a/repl/repl.go b/repl/repl.go index cd326fa7b..b3bb9a00b 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -70,7 +70,7 @@ func main() { continue } - program, err = expr.Compile(line, expr.Env(env), expr.ExperimentalPipes()) + program, err = expr.Compile(line, expr.Env(env)) if err != nil { fmt.Printf("compile error: %s\n", err) continue diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 2496e4e1a..595987c6c 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -66,7 +66,7 @@ func FuzzExpr(f *testing.F) { } f.Fuzz(func(t *testing.T, code string) { - program, err := expr.Compile(code, expr.Env(env), head, expr.ExperimentalPipes()) + program, err := expr.Compile(code, expr.Env(env), head) if err != nil { t.Skipf("compile error: %s", err) } diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index 1658dd6aa..6a0e2950b 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -37,7 +37,7 @@ func TestPipes(t *testing.T) { for _, test := range tests { t.Run(test.input, func(t *testing.T) { - program, err := expr.Compile(test.input, expr.Env(env), expr.ExperimentalPipes()) + program, err := expr.Compile(test.input, expr.Env(env)) require.NoError(t, err) out, err := expr.Run(program, env) @@ -48,7 +48,7 @@ func TestPipes(t *testing.T) { } func TestPipes_map_filter(t *testing.T) { - program, err := expr.Compile(`1..9 | map(# + 1) | filter(# % 2 == 0)`, expr.ExperimentalPipes()) + program, err := expr.Compile(`1..9 | map(# + 1) | filter(# % 2 == 0)`) require.NoError(t, err) out, err := expr.Run(program, nil) From 881dad50f8f9d69ec68d0373ed69e5ed259128de Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 24 Aug 2023 15:27:00 +0200 Subject: [PATCH 121/506] Add parsing support for pointer names --- parser/parser.go | 13 ++++++------- parser/parser_test.go | 34 ++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 108b201a7..f60ff8936 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -46,7 +46,6 @@ type Tree struct { func Parse(input string) (*Tree, error) { return ParseWithConfig(input, &conf.Config{ - Pipes: false, Disabled: map[string]bool{}, }) } @@ -255,10 +254,15 @@ func (p *parser) parsePrimary() Node { if p.depth > 0 { if token.Is(Operator, "#") || token.Is(Operator, ".") { + name := "" if token.Is(Operator, "#") { p.next() + if p.current.Is(Identifier) { + name = p.current.Value + p.next() + } } - node := &PointerNode{} + node := &PointerNode{Name: name} node.SetLocation(token.Location) return p.parsePostfixExpression(node) } @@ -583,11 +587,6 @@ func (p *parser) parsePostfixExpression(node Node) Node { } func (p *parser) parsePipe(node Node) Node { - if !p.config.Pipes { - p.error("enable Pipes via expr.ExperimentalPipes()") - return &NilNode{} - } - identifier := p.current p.expect(Identifier) diff --git a/parser/parser_test.go b/parser/parser_test.go index 002f1f34b..07cbef22a 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -6,16 +6,15 @@ import ( "testing" . "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParse(t *testing.T) { - parseTests := []struct { - input string - expected Node + tests := []struct { + input string + want Node }{ { "a", @@ -463,14 +462,25 @@ func TestParse(t *testing.T) { Left: &IdentifierNode{Value: "foo"}, Right: &IdentifierNode{Value: "c"}}}, }, + { + `map([], #index)`, + &BuiltinNode{ + Name: "map", + Arguments: []Node{ + &ArrayNode{}, + &ClosureNode{ + Node: &PointerNode{Name: "index"}, + }, + }, + }, + }, } - for _, test := range parseTests { - actual, err := parser.ParseWithConfig(test.input, &conf.Config{Pipes: true}) - if err != nil { - t.Errorf("%s:\n%v", test.input, err) - continue - } - assert.Equal(t, Dump(test.expected), Dump(actual.Node), test.input) + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + actual, err := parser.Parse(test.input) + require.NoError(t, err) + assert.Equal(t, Dump(test.want), Dump(actual.Node)) + }) } } @@ -669,7 +679,7 @@ func TestParse_pipe_operator(t *testing.T) { Property: &StringNode{Value: "foo"}, }}}}}}}} - actual, err := parser.ParseWithConfig(input, &conf.Config{Pipes: true}) + actual, err := parser.Parse(input) require.NoError(t, err) assert.Equal(t, Dump(expect), Dump(actual.Node)) } From d8701c560377481815cc8cbbc019bab968e838d5 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 25 Aug 2023 11:23:44 +0200 Subject: [PATCH 122/506] Add named pointers #index --- checker/checker.go | 159 +++++++++++++++----------- checker/checker_test.go | 246 +++++++++++++++++++++------------------- compiler/compiler.go | 11 +- 3 files changed, 228 insertions(+), 188 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 20e270f2c..ea63ded5a 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -18,11 +18,7 @@ func Check(tree *parser.Tree, config *conf.Config) (t reflect.Type, err error) { config = conf.New(nil) } - v := &visitor{ - config: config, - collections: make([]reflect.Type, 0), - parents: make([]ast.Node, 0), - } + v := &checker{config: config} t, _ = v.visit(tree.Node) @@ -55,15 +51,20 @@ func Check(tree *parser.Tree, config *conf.Config) (t reflect.Type, err error) { return t, nil } -type visitor struct { - config *conf.Config - collections []reflect.Type - scopes []scope - parents []ast.Node - err *file.Error +type checker struct { + config *conf.Config + predicateScopes []predicateScope + varScopes []varScope + parents []ast.Node + err *file.Error +} + +type predicateScope struct { + vtype reflect.Type + vars map[string]reflect.Type } -type scope struct { +type varScope struct { name string vtype reflect.Type info info @@ -74,7 +75,7 @@ type info struct { fn *builtin.Function } -func (v *visitor) visit(node ast.Node) (reflect.Type, info) { +func (v *checker) visit(node ast.Node) (reflect.Type, info) { var t reflect.Type var i info v.parents = append(v.parents, node) @@ -129,7 +130,7 @@ func (v *visitor) visit(node ast.Node) (reflect.Type, info) { return t, i } -func (v *visitor) error(node ast.Node, format string, args ...interface{}) (reflect.Type, info) { +func (v *checker) error(node ast.Node, format string, args ...interface{}) (reflect.Type, info) { if v.err == nil { // show first error v.err = &file.Error{ Location: node.Location(), @@ -139,11 +140,11 @@ func (v *visitor) error(node ast.Node, format string, args ...interface{}) (refl return anyType, info{} // interface represent undefined type } -func (v *visitor) NilNode(*ast.NilNode) (reflect.Type, info) { +func (v *checker) NilNode(*ast.NilNode) (reflect.Type, info) { return nilType, info{} } -func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) { +func (v *checker) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) { if s, ok := v.lookupVariable(node.Value); ok { return s.vtype, s.info } @@ -174,27 +175,27 @@ func (v *visitor) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) return anyType, info{} } -func (v *visitor) IntegerNode(*ast.IntegerNode) (reflect.Type, info) { +func (v *checker) IntegerNode(*ast.IntegerNode) (reflect.Type, info) { return integerType, info{} } -func (v *visitor) FloatNode(*ast.FloatNode) (reflect.Type, info) { +func (v *checker) FloatNode(*ast.FloatNode) (reflect.Type, info) { return floatType, info{} } -func (v *visitor) BoolNode(*ast.BoolNode) (reflect.Type, info) { +func (v *checker) BoolNode(*ast.BoolNode) (reflect.Type, info) { return boolType, info{} } -func (v *visitor) StringNode(*ast.StringNode) (reflect.Type, info) { +func (v *checker) StringNode(*ast.StringNode) (reflect.Type, info) { return stringType, info{} } -func (v *visitor) ConstantNode(node *ast.ConstantNode) (reflect.Type, info) { +func (v *checker) ConstantNode(node *ast.ConstantNode) (reflect.Type, info) { return reflect.TypeOf(node.Value), info{} } -func (v *visitor) UnaryNode(node *ast.UnaryNode) (reflect.Type, info) { +func (v *checker) UnaryNode(node *ast.UnaryNode) (reflect.Type, info) { t, _ := v.visit(node.Node) t = deref(t) @@ -224,7 +225,7 @@ func (v *visitor) UnaryNode(node *ast.UnaryNode) (reflect.Type, info) { return v.error(node, `invalid operation: %v (mismatched type %v)`, node.Operator, t) } -func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { +func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { l, _ := v.visit(node.Left) r, _ := v.visit(node.Right) @@ -423,11 +424,11 @@ func (v *visitor) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { return v.error(node, `invalid operation: %v (mismatched types %v and %v)`, node.Operator, l, r) } -func (v *visitor) ChainNode(node *ast.ChainNode) (reflect.Type, info) { +func (v *checker) ChainNode(node *ast.ChainNode) (reflect.Type, info) { return v.visit(node.Node) } -func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { +func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { base, _ := v.visit(node.Node) prop, _ := v.visit(node.Property) @@ -507,7 +508,7 @@ func (v *visitor) MemberNode(node *ast.MemberNode) (reflect.Type, info) { return v.error(node, "type %v[%v] is undefined", base, prop) } -func (v *visitor) SliceNode(node *ast.SliceNode) (reflect.Type, info) { +func (v *checker) SliceNode(node *ast.SliceNode) (reflect.Type, info) { t, _ := v.visit(node.Node) switch kind(t) { @@ -534,7 +535,7 @@ func (v *visitor) SliceNode(node *ast.SliceNode) (reflect.Type, info) { return t, info{} } -func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { +func (v *checker) CallNode(node *ast.CallNode) (reflect.Type, info) { fn, fnInfo := v.visit(node.Callee) if fnInfo.fn != nil { @@ -587,7 +588,7 @@ func (v *visitor) CallNode(node *ast.CallNode) (reflect.Type, info) { return v.error(node, "%v is not callable", fn) } -func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { +func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { switch node.Name { case "all", "none", "any", "one": collection, _ := v.visit(node.Arguments[0]) @@ -595,9 +596,9 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } - v.collections = append(v.collections, collection) + v.begin(collection) closure, _ := v.visit(node.Arguments[1]) - v.collections = v.collections[:len(v.collections)-1] + v.end() if isFunc(closure) && closure.NumOut() == 1 && @@ -616,9 +617,9 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } - v.collections = append(v.collections, collection) + v.begin(collection) closure, _ := v.visit(node.Arguments[1]) - v.collections = v.collections[:len(v.collections)-1] + v.end() if isFunc(closure) && closure.NumOut() == 1 && @@ -640,9 +641,9 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } - v.collections = append(v.collections, collection) + v.begin(collection, scopeVar{"index", integerType}) closure, _ := v.visit(node.Arguments[1]) - v.collections = v.collections[:len(v.collections)-1] + v.end() if isFunc(closure) && closure.NumOut() == 1 && @@ -658,9 +659,9 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } - v.collections = append(v.collections, collection) + v.begin(collection) closure, _ := v.visit(node.Arguments[1]) - v.collections = v.collections[:len(v.collections)-1] + v.end() if isFunc(closure) && closure.NumOut() == 1 && @@ -679,9 +680,9 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } - v.collections = append(v.collections, collection) + v.begin(collection) closure, _ := v.visit(node.Arguments[1]) - v.collections = v.collections[:len(v.collections)-1] + v.end() if isFunc(closure) && closure.NumOut() == 1 && @@ -703,9 +704,9 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } - v.collections = append(v.collections, collection) + v.begin(collection) closure, _ := v.visit(node.Arguments[1]) - v.collections = v.collections[:len(v.collections)-1] + v.end() if isFunc(closure) && closure.NumOut() == 1 && @@ -730,7 +731,24 @@ func (v *visitor) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node, "unknown builtin %v", node.Name) } -func (v *visitor) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { +type scopeVar struct { + name string + vtype reflect.Type +} + +func (v *checker) begin(vtype reflect.Type, vars ...scopeVar) { + scope := predicateScope{vtype: vtype, vars: make(map[string]reflect.Type)} + for _, v := range vars { + scope.vars[v.name] = v.vtype + } + v.predicateScopes = append(v.predicateScopes, scope) +} + +func (v *checker) end() { + v.predicateScopes = v.predicateScopes[:len(v.predicateScopes)-1] +} + +func (v *checker) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { if len(node.Arguments) != 2 { return v.error(node, "invalid number of arguments (expected 2, got %d)", len(node.Arguments)) } @@ -771,7 +789,7 @@ func (v *visitor) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(val, "type %v does not support indexing", t) } -func (v *visitor) checkFunction(f *builtin.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { +func (v *checker) checkFunction(f *builtin.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { if f.Validate != nil { args := make([]reflect.Type, len(arguments)) for i, arg := range arguments { @@ -812,7 +830,7 @@ func (v *visitor) checkFunction(f *builtin.Function, node ast.Node, arguments [] return v.error(node, "no matching overload for %v", f.Name) } -func (v *visitor) checkArguments(name string, fn reflect.Type, method bool, arguments []ast.Node, node ast.Node) (reflect.Type, *file.Error) { +func (v *checker) checkArguments(name string, fn reflect.Type, method bool, arguments []ast.Node, node ast.Node) (reflect.Type, *file.Error) { if isAny(fn) { return anyType, nil } @@ -896,7 +914,7 @@ func (v *visitor) checkArguments(name string, fn reflect.Type, method bool, argu return fn.Out(0), nil } -func (v *visitor) ClosureNode(node *ast.ClosureNode) (reflect.Type, info) { +func (v *checker) ClosureNode(node *ast.ClosureNode) (reflect.Type, info) { t, _ := v.visit(node.Node) if t == nil { return v.error(node.Node, "closure cannot be nil") @@ -904,22 +922,29 @@ func (v *visitor) ClosureNode(node *ast.ClosureNode) (reflect.Type, info) { return reflect.FuncOf([]reflect.Type{anyType}, []reflect.Type{t}, false), info{} } -func (v *visitor) PointerNode(node *ast.PointerNode) (reflect.Type, info) { - if len(v.collections) == 0 { +func (v *checker) PointerNode(node *ast.PointerNode) (reflect.Type, info) { + if len(v.predicateScopes) == 0 { return v.error(node, "cannot use pointer accessor outside closure") } - - collection := v.collections[len(v.collections)-1] - switch collection.Kind() { - case reflect.Interface: - return anyType, info{} - case reflect.Array, reflect.Slice: - return collection.Elem(), info{} + scope := v.predicateScopes[len(v.predicateScopes)-1] + if node.Name == "" { + switch scope.vtype.Kind() { + case reflect.Interface: + return anyType, info{} + case reflect.Array, reflect.Slice: + return scope.vtype.Elem(), info{} + } + return v.error(node, "cannot use %v as array", scope) + } + if scope.vars != nil { + if t, ok := scope.vars[node.Name]; ok { + return t, info{} + } } - return v.error(node, "cannot use %v as array", collection) + return v.error(node, "unknown pointer #%v", node.Name) } -func (v *visitor) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) (reflect.Type, info) { +func (v *checker) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) (reflect.Type, info) { if _, ok := v.config.Types[node.Name]; ok { return v.error(node, "cannot redeclare %v", node.Name) } @@ -933,22 +958,22 @@ func (v *visitor) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) (refl return v.error(node, "cannot redeclare variable %v", node.Name) } vtype, vinfo := v.visit(node.Value) - v.scopes = append(v.scopes, scope{node.Name, vtype, vinfo}) + v.varScopes = append(v.varScopes, varScope{node.Name, vtype, vinfo}) t, i := v.visit(node.Expr) - v.scopes = v.scopes[:len(v.scopes)-1] + v.varScopes = v.varScopes[:len(v.varScopes)-1] return t, i } -func (v *visitor) lookupVariable(name string) (scope, bool) { - for i := len(v.scopes) - 1; i >= 0; i-- { - if v.scopes[i].name == name { - return v.scopes[i], true +func (v *checker) lookupVariable(name string) (varScope, bool) { + for i := len(v.varScopes) - 1; i >= 0; i-- { + if v.varScopes[i].name == name { + return v.varScopes[i], true } } - return scope{}, false + return varScope{}, false } -func (v *visitor) ConditionalNode(node *ast.ConditionalNode) (reflect.Type, info) { +func (v *checker) ConditionalNode(node *ast.ConditionalNode) (reflect.Type, info) { c, _ := v.visit(node.Cond) if !isBool(c) && !isAny(c) { return v.error(node.Cond, "non-bool expression (type %v) used as condition", c) @@ -972,27 +997,27 @@ func (v *visitor) ConditionalNode(node *ast.ConditionalNode) (reflect.Type, info return anyType, info{} } -func (v *visitor) ArrayNode(node *ast.ArrayNode) (reflect.Type, info) { +func (v *checker) ArrayNode(node *ast.ArrayNode) (reflect.Type, info) { for _, node := range node.Nodes { v.visit(node) } return arrayType, info{} } -func (v *visitor) MapNode(node *ast.MapNode) (reflect.Type, info) { +func (v *checker) MapNode(node *ast.MapNode) (reflect.Type, info) { for _, pair := range node.Pairs { v.visit(pair) } return mapType, info{} } -func (v *visitor) PairNode(node *ast.PairNode) (reflect.Type, info) { +func (v *checker) PairNode(node *ast.PairNode) (reflect.Type, info) { v.visit(node.Key) v.visit(node.Value) return nilType, info{} } -func (v *visitor) findTypedFunc(node *ast.CallNode, fn reflect.Type, method bool) { +func (v *checker) findTypedFunc(node *ast.CallNode, fn reflect.Type, method bool) { // OnCallTyped doesn't work for functions with variadic arguments, // and doesn't work named function, like `type MyFunc func() int`. // In PkgPath() is an empty string, it's unnamed function. diff --git a/checker/checker_test.go b/checker/checker_test.go index c451736ef..0dede3edf 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -17,128 +17,131 @@ import ( "github.com/stretchr/testify/require" ) -var successTests = []string{ - "nil == nil", - "nil == IntPtr", - "nil == nil", - "nil in ArrayOfFoo", - "!Bool", - "!BoolPtr == Bool", - "'a' == 'b' + 'c'", - "'foo' contains 'bar'", - "'foo' endsWith 'bar'", - "'foo' startsWith 'bar'", - "(1 == 1) || (String matches Any)", - "Int % Int > 1", - "Int + Int + Int > 0", - "Int == Any", - "Int in Int..Int", - "IntPtrPtr + 1 > 0", - "1 + 2 + Int64 > 0", - "Int64 % 1 > 0", - "IntPtr == Int", - "FloatPtr == 1 + 2.", - "1 + 2 + Float + 3 + 4 < 0", - "1 + Int + Float == 0.5", - "-1 + +1 == 0", - "1 / 2 == 0", - "2**3 + 1 != 0", - "2^3 + 1 != 0", - "Float == 1", - "Float < 1.0", - "Float <= 1.0", - "Float > 1.0", - "Float >= 1.0", - `"a" < "b"`, - "String + (true ? String : String) == ''", - "(Any ? nil : '') == ''", - "(Any ? 0 : nil) == 0", - "(Any ? nil : nil) == nil", - "!(Any ? Foo : Foo.Bar).Anything", - "Int in ArrayOfInt", - "Int not in ArrayOfAny", - "String in ArrayOfAny", - "String in ArrayOfString", - "String in Foo", - "String in MapOfFoo", - "String matches 'ok'", - "String matches Any", - "String not matches Any", - "StringPtr == nil", - "[1, 2, 3] == []", - "len([]) > 0", - "Any matches Any", - "!Any.Things.Contains.Any", - "!ArrayOfAny[0].next.goes['any thing']", - "ArrayOfFoo[0].Bar.Baz == ''", - "ArrayOfFoo[0:10][0].Bar.Baz == ''", - "!ArrayOfAny[Any]", - "Bool && Any", - "FuncParam(true, 1, 'str')", - "FuncParamAny(nil)", - "!Fast(Any, String)", - "Foo.Method().Baz == ''", - "Foo.Bar == MapOfAny.id.Bar", - "Foo.Bar.Baz == ''", - "MapOfFoo['any'].Bar.Baz == ''", - "Func() == 0", - "FuncFoo(Foo) > 1", - "Any() > 0", - "Embed.EmbedString == ''", - "EmbedString == ''", - "EmbedMethod(0) == ''", - "Embed.EmbedMethod(0) == ''", - "Embed.EmbedString == ''", - "EmbedString == ''", - "{id: Foo.Bar.Baz, 'str': String} == {}", - "Variadic(0, 1, 2) || Variadic(0)", - "count(1..30, {# % 3 == 0}) > 0", - "map(1..3, {#}) == [1,2,3]", - "map(filter(ArrayOfFoo, {.Bar.Baz != ''}), {.Bar}) == []", - "filter(Any, {.AnyMethod()})[0] == ''", - "Time == Time", - "Any == Time", - "Any != Time", - "Any > Time", - "Any >= Time", - "Any < Time", - "Any <= Time", - "Any - Time > Duration", - "Any == Any", - "Any != Any", - "Any > Any", - "Any >= Any", - "Any < Any", - "Any <= Any", - "Any - Any < Duration", - "Time == Any", - "Time != Any", - "Time > Any", - "Time >= Any", - "Time < Any", - "Time <= Any", - "Time - Any == Duration", - "Time + Duration == Time", - "Duration + Time == Time", - "Duration + Any == Time", - "Any + Duration == Time", - "Any.A?.B == nil", - "(Any.Bool ?? Bool) > 0", - "Bool ?? Bool", - "let foo = 1; foo == 1", -} - func TestCheck(t *testing.T) { - for _, input := range successTests { - var err error - tree, err := parser.Parse(input) - require.NoError(t, err, input) + var tests = []struct{ input string }{ + {"nil == nil"}, + {"nil == IntPtr"}, + {"nil == nil"}, + {"nil in ArrayOfFoo"}, + {"!Bool"}, + {"!BoolPtr == Bool"}, + {"'a' == 'b' + 'c'"}, + {"'foo' contains 'bar'"}, + {"'foo' endsWith 'bar'"}, + {"'foo' startsWith 'bar'"}, + {"(1 == 1) || (String matches Any)"}, + {"Int % Int > 1"}, + {"Int + Int + Int > 0"}, + {"Int == Any"}, + {"Int in Int..Int"}, + {"IntPtrPtr + 1 > 0"}, + {"1 + 2 + Int64 > 0"}, + {"Int64 % 1 > 0"}, + {"IntPtr == Int"}, + {"FloatPtr == 1 + 2."}, + {"1 + 2 + Float + 3 + 4 < 0"}, + {"1 + Int + Float == 0.5"}, + {"-1 + +1 == 0"}, + {"1 / 2 == 0"}, + {"2**3 + 1 != 0"}, + {"2^3 + 1 != 0"}, + {"Float == 1"}, + {"Float < 1.0"}, + {"Float <= 1.0"}, + {"Float > 1.0"}, + {"Float >= 1.0"}, + {`"a" < "b"`}, + {"String + (true ? String : String) == ''"}, + {"(Any ? nil : '') == ''"}, + {"(Any ? 0 : nil) == 0"}, + {"(Any ? nil : nil) == nil"}, + {"!(Any ? Foo : Foo.Bar).Anything"}, + {"Int in ArrayOfInt"}, + {"Int not in ArrayOfAny"}, + {"String in ArrayOfAny"}, + {"String in ArrayOfString"}, + {"String in Foo"}, + {"String in MapOfFoo"}, + {"String matches 'ok'"}, + {"String matches Any"}, + {"String not matches Any"}, + {"StringPtr == nil"}, + {"[1, 2, 3] == []"}, + {"len([]) > 0"}, + {"Any matches Any"}, + {"!Any.Things.Contains.Any"}, + {"!ArrayOfAny[0].next.goes['any thing']"}, + {"ArrayOfFoo[0].Bar.Baz == ''"}, + {"ArrayOfFoo[0:10][0].Bar.Baz == ''"}, + {"!ArrayOfAny[Any]"}, + {"Bool && Any"}, + {"FuncParam(true, 1, 'str')"}, + {"FuncParamAny(nil)"}, + {"!Fast(Any, String)"}, + {"Foo.Method().Baz == ''"}, + {"Foo.Bar == MapOfAny.id.Bar"}, + {"Foo.Bar.Baz == ''"}, + {"MapOfFoo['any'].Bar.Baz == ''"}, + {"Func() == 0"}, + {"FuncFoo(Foo) > 1"}, + {"Any() > 0"}, + {"Embed.EmbedString == ''"}, + {"EmbedString == ''"}, + {"EmbedMethod(0) == ''"}, + {"Embed.EmbedMethod(0) == ''"}, + {"Embed.EmbedString == ''"}, + {"EmbedString == ''"}, + {"{id: Foo.Bar.Baz, 'str': String} == {}"}, + {"Variadic(0, 1, 2) || Variadic(0)"}, + {"count(1..30, {# % 3 == 0}) > 0"}, + {"map(1..3, {#}) == [1,2,3]"}, + {"map(1..3, #index) == [0,1,2]"}, + {"map(filter(ArrayOfFoo, {.Bar.Baz != ''}), {.Bar}) == []"}, + {"filter(Any, {.AnyMethod()})[0] == ''"}, + {"Time == Time"}, + {"Any == Time"}, + {"Any != Time"}, + {"Any > Time"}, + {"Any >= Time"}, + {"Any < Time"}, + {"Any <= Time"}, + {"Any - Time > Duration"}, + {"Any == Any"}, + {"Any != Any"}, + {"Any > Any"}, + {"Any >= Any"}, + {"Any < Any"}, + {"Any <= Any"}, + {"Any - Any < Duration"}, + {"Time == Any"}, + {"Time != Any"}, + {"Time > Any"}, + {"Time >= Any"}, + {"Time < Any"}, + {"Time <= Any"}, + {"Time - Any == Duration"}, + {"Time + Duration == Time"}, + {"Duration + Time == Time"}, + {"Duration + Any == Time"}, + {"Any + Duration == Time"}, + {"Any.A?.B == nil"}, + {"(Any.Bool ?? Bool) > 0"}, + {"Bool ?? Bool"}, + {"let foo = 1; foo == 1"}, + } - config := conf.New(mock.Env{}) - expr.AsBool()(config) + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + var err error + tree, err := parser.Parse(tt.input) + require.NoError(t, err) - _, err = checker.Check(tree, config) - assert.NoError(t, err, input) + config := conf.New(mock.Env{}) + expr.AsBool()(config) + + _, err = checker.Check(tree, config) + assert.NoError(t, err) + }) } } @@ -532,6 +535,11 @@ let foo = 1; let foo = 2; foo cannot redeclare variable foo (1:18) | let foo = 1; let foo = 2; foo | .................^ + +map(1..9, #unknown) +unknown pointer #unknown (1:11) + | map(1..9, #unknown) + | ..........^ ` func TestCheck_error(t *testing.T) { diff --git a/compiler/compiler.go b/compiler/compiler.go index b817a60ce..1455aac9e 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -877,8 +877,15 @@ func (c *compiler) ClosureNode(node *ast.ClosureNode) { c.compile(node.Node) } -func (c *compiler) PointerNode(_ *ast.PointerNode) { - c.emit(OpPointer) +func (c *compiler) PointerNode(node *ast.PointerNode) { + switch node.Name { + case "index": + c.emit(OpGetIndex) + case "": + c.emit(OpPointer) + default: + panic(fmt.Sprintf("unknown pointer %v", node.Name)) + } } func (c *compiler) VariableDeclaratorNode(node *ast.VariableDeclaratorNode) { From 3ffdbf3397ae8c592f634e10cbcc74eb21a3e5fc Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 25 Aug 2023 15:50:57 +0200 Subject: [PATCH 123/506] Add better pointer lexer --- checker/checker_test.go | 4 +++- parser/lexer/lexer_test.go | 11 +++++++++++ parser/lexer/state.go | 20 +++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/checker/checker_test.go b/checker/checker_test.go index 0dede3edf..eeade988a 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -18,7 +18,9 @@ import ( ) func TestCheck(t *testing.T) { - var tests = []struct{ input string }{ + var tests = []struct { + input string + }{ {"nil == nil"}, {"nil == IntPtr"}, {"nil == nil"}, diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index 1a9418068..031966108 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -199,6 +199,17 @@ func TestLex(t *testing.T) { {Kind: EOF}, }, }, + { + `#index #1 #`, + []Token{ + {Kind: Operator, Value: "#"}, + {Kind: Identifier, Value: "index"}, + {Kind: Operator, Value: "#"}, + {Kind: Identifier, Value: "1"}, + {Kind: Operator, Value: "#"}, + {Kind: EOF}, + }, + }, } for _, test := range tests { diff --git a/parser/lexer/state.go b/parser/lexer/state.go index 8e1001b26..bb150878a 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -30,6 +30,8 @@ func root(l *lexer) stateFn { return questionMark case r == '/': return slash + case r == '#': + return pointer case r == '|': l.accept("|") l.emit(Operator) @@ -37,7 +39,7 @@ func root(l *lexer) stateFn { l.emit(Bracket) case strings.ContainsRune(")]}", r): l.emit(Bracket) - case strings.ContainsRune("#,:;%+-^", r): // single rune operator + case strings.ContainsRune(",:;%+-^", r): // single rune operator l.emit(Operator) case strings.ContainsRune("&!=*<>", r): // possible double rune operator l.accept("&=*") @@ -203,3 +205,19 @@ func multiLineComment(l *lexer) stateFn { l.ignore() return root } + +func pointer(l *lexer) stateFn { + l.accept("#") + l.emit(Operator) + for { + switch r := l.next(); { + case utils.IsAlphaNumeric(r): // absorb + default: + l.backup() + if l.word() != "" { + l.emit(Identifier) + } + return root + } + } +} From 3a29e6bdce6d3fabfd533d5d8e7c741aaac008d9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 28 Aug 2023 11:23:57 +0200 Subject: [PATCH 124/506] Add sort builtin --- ast/func.go | 12 ++++ ast/node.go | 3 +- builtin/builtin.go | 151 +++++++++++++++++++++++++++++++++------- builtin/builtin_test.go | 33 ++++++++- builtin/sort.go | 91 ++++++++++++++++++++++++ builtin/utils.go | 30 ++++++++ checker/checker.go | 4 +- compiler/compiler.go | 6 +- conf/config.go | 8 +-- debug/debugger.go | 3 +- debug/go.mod | 12 +++- debug/go.sum | 19 +---- expr.go | 3 +- vm/vm.go | 2 +- 14 files changed, 314 insertions(+), 63 deletions(-) create mode 100644 ast/func.go create mode 100644 builtin/sort.go diff --git a/ast/func.go b/ast/func.go new file mode 100644 index 000000000..92be2a197 --- /dev/null +++ b/ast/func.go @@ -0,0 +1,12 @@ +package ast + +import "reflect" + +type Function struct { + Name string + Func func(args ...interface{}) (interface{}, error) + Fast func(arg interface{}) interface{} + Types []reflect.Type + Validate func(args []reflect.Type) (reflect.Type, error) + Predicate bool +} diff --git a/ast/node.go b/ast/node.go index d228e52ee..3f083dfc6 100644 --- a/ast/node.go +++ b/ast/node.go @@ -4,7 +4,6 @@ import ( "reflect" "regexp" - "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" ) @@ -126,7 +125,7 @@ type CallNode struct { Arguments []Node Typed int Fast bool - Func *builtin.Function + Func *Function } type BuiltinNode struct { diff --git a/builtin/builtin.go b/builtin/builtin.go index 64d705fd8..cc7a081ee 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -5,21 +5,14 @@ import ( "encoding/json" "fmt" "reflect" + "sort" "strings" "time" + "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/vm/runtime" ) -type Function struct { - Name string - Func func(args ...interface{}) (interface{}, error) - Types []reflect.Type - Builtin1 func(arg interface{}) interface{} - Validate func(args []reflect.Type) (reflect.Type, error) - Predicate bool -} - var ( Index map[string]int Names []string @@ -34,7 +27,7 @@ func init() { } } -var Builtins = []*Function{ +var Builtins = []*ast.Function{ { Name: "all", Predicate: true, @@ -91,8 +84,8 @@ var Builtins = []*Function{ Types: types(new(func([]interface{}, func(interface{}) bool) int)), }, { - Name: "len", - Builtin1: Len, + Name: "len", + Fast: Len, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) @@ -105,13 +98,13 @@ var Builtins = []*Function{ }, }, { - Name: "type", - Builtin1: Type, - Types: types(new(func(interface{}) string)), + Name: "type", + Fast: Type, + Types: types(new(func(interface{}) string)), }, { - Name: "abs", - Builtin1: Abs, + Name: "abs", + Fast: Abs, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) @@ -124,8 +117,8 @@ var Builtins = []*Function{ }, }, { - Name: "int", - Builtin1: Int, + Name: "int", + Fast: Int, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) @@ -142,8 +135,8 @@ var Builtins = []*Function{ }, }, { - Name: "float", - Builtin1: Float, + Name: "float", + Fast: Float, Validate: func(args []reflect.Type) (reflect.Type, error) { if len(args) != 1 { return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) @@ -160,9 +153,9 @@ var Builtins = []*Function{ }, }, { - Name: "string", - Builtin1: String, - Types: types(new(func(any interface{}) string)), + Name: "string", + Fast: String, + Types: types(new(func(any interface{}) string)), }, { Name: "trim", @@ -210,14 +203,14 @@ var Builtins = []*Function{ }, { Name: "upper", - Builtin1: func(arg interface{}) interface{} { + Fast: func(arg interface{}) interface{} { return strings.ToUpper(arg.(string)) }, Types: types(strings.ToUpper), }, { Name: "lower", - Builtin1: func(arg interface{}) interface{} { + Fast: func(arg interface{}) interface{} { return strings.ToLower(arg.(string)) }, Types: types(strings.ToLower), @@ -591,4 +584,110 @@ var Builtins = []*Function{ return anyType, fmt.Errorf("cannot get values from %s", args[0]) }, }, + { + Name: "sort", + Func: func(args ...interface{}) (interface{}, error) { + if len(args) != 1 && len(args) != 2 { + return nil, fmt.Errorf("invalid number of arguments (expected 1 or 2, got %d)", len(args)) + } + + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot sort %s", v.Kind()) + } + + orderBy := OrderBy{} + if len(args) == 2 { + dir, err := ascOrDesc(args[1]) + if err != nil { + return nil, err + } + orderBy.Desc = dir + } + + sortable, err := copyArray(v, orderBy) + if err != nil { + return nil, err + } + sort.Sort(sortable) + return sortable.Array, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 && len(args) != 2 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1 or 2, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot sort %s", args[0]) + } + if len(args) == 2 { + switch kind(args[1]) { + case reflect.String, reflect.Interface: + default: + return anyType, fmt.Errorf("invalid argument for sort (expected string, got %s)", args[1]) + } + } + return arrayType, nil + }, + }, + { + Name: "sortBy", + Func: func(args ...interface{}) (interface{}, error) { + if len(args) != 2 && len(args) != 3 { + return nil, fmt.Errorf("invalid number of arguments (expected 2 or 3, got %d)", len(args)) + } + + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot sort %s", v.Kind()) + } + + orderBy := OrderBy{} + + field, ok := args[1].(string) + if !ok { + return nil, fmt.Errorf("invalid argument for sort (expected string, got %s)", reflect.TypeOf(args[1])) + } + orderBy.Field = field + + if len(args) == 3 { + dir, err := ascOrDesc(args[2]) + if err != nil { + return nil, err + } + orderBy.Desc = dir + } + + sortable, err := copyArray(v, orderBy) + if err != nil { + return nil, err + } + sort.Sort(sortable) + return sortable.Array, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 2 && len(args) != 3 { + return anyType, fmt.Errorf("invalid number of arguments (expected 2 or 3, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot sort %s", args[0]) + } + switch kind(args[1]) { + case reflect.String, reflect.Interface: + default: + return anyType, fmt.Errorf("invalid argument for sort (expected string, got %s)", args[1]) + } + if len(args) == 3 { + switch kind(args[2]) { + case reflect.String, reflect.Interface: + default: + return anyType, fmt.Errorf("invalid argument for sort (expected string, got %s)", args[1]) + } + } + return arrayType, nil + }, + }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 873fff5ff..34704bdad 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -12,6 +12,7 @@ import ( "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" + "github.com/antonmedv/expr/test/mock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -109,7 +110,8 @@ func TestBuiltin_works_with_any(t *testing.T) { config := map[string]struct { arity int }{ - "get": {2}, + "get": {2}, + "sortBy": {2}, } for _, b := range builtin.Builtins { @@ -365,3 +367,32 @@ func TestBuiltin_type(t *testing.T) { }) } } + +func TestBuiltin_sort(t *testing.T) { + env := map[string]interface{}{ + "ArrayOfString": []string{"foo", "bar", "baz"}, + "ArrayOfInt": []int{3, 2, 1}, + "ArrayOfFoo": []mock.Foo{{Value: "c"}, {Value: "a"}, {Value: "b"}}, + } + tests := []struct { + input string + want any + }{ + {`sort([])`, []any{}}, + {`sort(ArrayOfInt)`, []any{1, 2, 3}}, + {`sort(ArrayOfInt, 'desc')`, []any{3, 2, 1}}, + {`sortBy(ArrayOfFoo, 'Value')`, []any{mock.Foo{Value: "a"}, mock.Foo{Value: "b"}, mock.Foo{Value: "c"}}}, + {`sortBy([{id: "a"}, {id: "b"}], "id", "desc")`, []any{map[string]any{"id": "b"}, map[string]any{"id": "a"}}}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + program, err := expr.Compile(test.input, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, test.want, out) + }) + } +} diff --git a/builtin/sort.go b/builtin/sort.go new file mode 100644 index 000000000..31e302c72 --- /dev/null +++ b/builtin/sort.go @@ -0,0 +1,91 @@ +package builtin + +import ( + "fmt" + "reflect" +) + +type Sortable struct { + Array []any + Values []reflect.Value + OrderBy +} + +type OrderBy struct { + Field string + Desc bool +} + +func (s *Sortable) Len() int { + return len(s.Array) +} + +func (s *Sortable) Swap(i, j int) { + s.Array[i], s.Array[j] = s.Array[j], s.Array[i] + s.Values[i], s.Values[j] = s.Values[j], s.Values[i] +} + +func (s *Sortable) Less(i, j int) bool { + a, b := s.Values[i], s.Values[j] + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if s.Desc { + return a.Int() > b.Int() + } + return a.Int() < b.Int() + case reflect.String: + if s.Desc { + return a.String() > b.String() + } + return a.String() < b.String() + default: + panic(fmt.Sprintf("sort: unsupported type %s", a.Kind())) + } +} + +func copyArray(v reflect.Value, orderBy OrderBy) (*Sortable, error) { + s := &Sortable{ + Array: make([]any, v.Len()), + Values: make([]reflect.Value, v.Len()), + OrderBy: orderBy, + } + var prev reflect.Value + for i := 0; i < s.Len(); i++ { + elem := deref(v.Index(i)) + var value reflect.Value + switch elem.Kind() { + case reflect.Struct: + value = elem.FieldByName(s.Field) + case reflect.Map: + value = elem.MapIndex(reflect.ValueOf(s.Field)) + default: + value = elem + } + value = deref(value) + + s.Array[i] = elem.Interface() + s.Values[i] = value + + if i == 0 { + prev = value + } else if value.Type() != prev.Type() { + return nil, fmt.Errorf("cannot sort array of different types (%s and %s)", value.Type(), prev.Type()) + } + } + return s, nil +} + +func ascOrDesc(arg any) (bool, error) { + dir, ok := arg.(string) + if !ok { + return false, fmt.Errorf("invalid argument for sort (expected string, got %s)", reflect.TypeOf(arg)) + } + switch dir { + case "desc": + return true, nil + case "asc": + return false, nil + default: + return false, fmt.Errorf(`invalid argument for sort (expected "asc" or "desc", got %q)`, dir) + } +} diff --git a/builtin/utils.go b/builtin/utils.go index afe169f76..9850b09a9 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -1,6 +1,7 @@ package builtin import ( + "fmt" "reflect" ) @@ -33,3 +34,32 @@ func types(types ...interface{}) []reflect.Type { } return ts } + +func deref(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface { + if v.IsNil() { + return v + } + v = v.Elem() + } + +loop: + for v.Kind() == reflect.Ptr { + if v.IsNil() { + return v + } + indirect := reflect.Indirect(v) + switch indirect.Kind() { + case reflect.Struct, reflect.Map, reflect.Array, reflect.Slice: + break loop + default: + v = v.Elem() + } + } + + if v.IsValid() { + return v + } + + panic(fmt.Sprintf("cannot deref %s", v)) +} diff --git a/checker/checker.go b/checker/checker.go index ea63ded5a..8bb9a2839 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -72,7 +72,7 @@ type varScope struct { type info struct { method bool - fn *builtin.Function + fn *ast.Function } func (v *checker) visit(node ast.Node) (reflect.Type, info) { @@ -789,7 +789,7 @@ func (v *checker) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(val, "type %v does not support indexing", t) } -func (v *checker) checkFunction(f *builtin.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { +func (v *checker) checkFunction(f *ast.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { if f.Validate != nil { args := make([]reflect.Type, len(arguments)) for i, arg := range arguments { diff --git a/compiler/compiler.go b/compiler/compiler.go index 1455aac9e..ecf2c5ba1 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -146,7 +146,7 @@ func (c *compiler) addVariable(name string) int { } // emitFunction adds builtin.Function.Func to the program.Functions and emits call opcode. -func (c *compiler) emitFunction(fn *builtin.Function, argsLen int) { +func (c *compiler) emitFunction(fn *ast.Function, argsLen int) { switch argsLen { case 0: c.emit(OpCall0, c.addFunction(fn)) @@ -163,7 +163,7 @@ func (c *compiler) emitFunction(fn *builtin.Function, argsLen int) { } // addFunction adds builtin.Function.Func to the program.Functions and returns its index. -func (c *compiler) addFunction(fn *builtin.Function) int { +func (c *compiler) addFunction(fn *ast.Function) int { if fn == nil { panic("function is nil") } @@ -821,7 +821,7 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { for _, arg := range node.Arguments { c.compile(arg) } - if f.Builtin1 != nil { + if f.Fast != nil { c.emit(OpCallBuiltin1, id) } else if f.Func != nil { c.emitFunction(f, len(node.Arguments)) diff --git a/conf/config.go b/conf/config.go index 7e98e7ead..f44cfe7b1 100644 --- a/conf/config.go +++ b/conf/config.go @@ -21,8 +21,8 @@ type Config struct { Strict bool ConstFns map[string]reflect.Value Visitors []ast.Visitor - Functions map[string]*builtin.Function - Builtins map[string]*builtin.Function + Functions map[string]*ast.Function + Builtins map[string]*ast.Function Disabled map[string]bool // disabled builtins } @@ -32,8 +32,8 @@ func CreateNew() *Config { Optimize: true, Operators: make(map[string][]string), ConstFns: make(map[string]reflect.Value), - Functions: make(map[string]*builtin.Function), - Builtins: make(map[string]*builtin.Function), + Functions: make(map[string]*ast.Function), + Builtins: make(map[string]*ast.Function), Disabled: make(map[string]bool), } for _, f := range builtin.Builtins { diff --git a/debug/debugger.go b/debug/debugger.go index a002e0558..6bd66f977 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -123,9 +123,10 @@ func StartDebugger(program *Program, env interface{}) { if s != nil { type pair struct { key string - value int + value any } var keys []pair + keys = append(keys, pair{"Array", s.Array}) keys = append(keys, pair{"Index", s.Index}) keys = append(keys, pair{"Len", s.Len}) keys = append(keys, pair{"Count", s.Count}) diff --git a/debug/go.mod b/debug/go.mod index 831ec776e..f8d73c9fb 100644 --- a/debug/go.mod +++ b/debug/go.mod @@ -1,13 +1,19 @@ module github.com/antonmedv/expr/debug -go 1.13 +go 1.18 require ( - github.com/antonmedv/expr v1.13.0 + github.com/antonmedv/expr v0.0.0 github.com/gdamore/tcell/v2 v2.6.0 - github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 +) + +require ( + github.com/gdamore/encoding v1.0.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/uniseg v0.4.4 // indirect + golang.org/x/sys v0.11.0 // indirect golang.org/x/term v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect ) diff --git a/debug/go.sum b/debug/go.sum index e08364c2c..1078cbe99 100644 --- a/debug/go.sum +++ b/debug/go.sum @@ -1,6 +1,4 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= @@ -11,32 +9,22 @@ github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -59,10 +47,5 @@ golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/expr.go b/expr.go index 4c07ab43e..fa6e7101d 100644 --- a/expr.go +++ b/expr.go @@ -5,7 +5,6 @@ import ( "reflect" "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/compiler" "github.com/antonmedv/expr/conf" @@ -122,7 +121,7 @@ func Function(name string, fn func(params ...interface{}) (interface{}, error), } ts[i] = t } - c.Functions[name] = &builtin.Function{ + c.Functions[name] = &ast.Function{ Name: name, Func: fn, Types: ts, diff --git a/vm/vm.go b/vm/vm.go index f083e74c2..41390fe71 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -389,7 +389,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(vm.call(vm.pop(), arg)) case OpCallBuiltin1: - vm.push(builtin.Builtins[arg].Builtin1(vm.pop())) + vm.push(builtin.Builtins[arg].Fast(vm.pop())) case OpArray: size := vm.pop().(int) From 2dc1c7de303b02a9b38e3d7e4123916d671d5687 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 28 Aug 2023 17:26:52 +0200 Subject: [PATCH 125/506] Add sort benchmarks --- bench_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/bench_test.go b/bench_test.go index 024d2c4fb..a294bb06a 100644 --- a/bench_test.go +++ b/bench_test.go @@ -453,3 +453,48 @@ func Benchmark_largeNestedArrayAccess(b *testing.B) { require.NoError(b, err) require.True(b, out.(bool)) } + +func Benchmark_sort(b *testing.B) { + env := map[string]interface{}{ + "arr": []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}, + } + + program, err := expr.Compile(`sort(arr)`, expr.Env(env)) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, _ = vm.Run(program, env) + } + b.StopTimer() + + require.Equal(b, 1, out.([]any)[0]) + require.Equal(b, 100, out.([]any)[99]) +} + +func Benchmark_sortBy(b *testing.B) { + type Foo struct { + Value int + } + arr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30} + env := map[string]interface{}{ + "arr": make([]Foo, len(arr)), + } + for i, v := range arr { + env["arr"].([]Foo)[i] = Foo{Value: v.(int)} + } + + program, err := expr.Compile(`sortBy(arr, "Value")`, expr.Env(env)) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, _ = vm.Run(program, env) + } + b.StopTimer() + + require.Equal(b, 1, out.([]any)[0].(Foo).Value) + require.Equal(b, 100, out.([]any)[99].(Foo).Value) +} From e81f517f81a6fc91fc01134b7f76f731f1f3eb52 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 28 Aug 2023 17:36:33 +0200 Subject: [PATCH 126/506] Apply in range optimization only for int type on lhs --- optimizer/in_range.go | 15 ++++++++++++--- optimizer/optimizer_test.go | 10 ++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/optimizer/in_range.go b/optimizer/in_range.go index 7895249e0..b361c6c39 100644 --- a/optimizer/in_range.go +++ b/optimizer/in_range.go @@ -1,6 +1,8 @@ package optimizer import ( + "reflect" + . "github.com/antonmedv/expr/ast" ) @@ -10,9 +12,16 @@ func (*inRange) Visit(node *Node) { switch n := (*node).(type) { case *BinaryNode: if n.Operator == "in" { - if rng, ok := n.Right.(*BinaryNode); ok && rng.Operator == ".." { - if from, ok := rng.Left.(*IntegerNode); ok { - if to, ok := rng.Right.(*IntegerNode); ok { + t := n.Left.Type() + if t == nil { + return + } + if t.Kind() != reflect.Int { + return + } + if rangeOp, ok := n.Right.(*BinaryNode); ok && rangeOp.Operator == ".." { + if from, ok := rangeOp.Left.(*IntegerNode); ok { + if to, ok := rangeOp.Right.(*IntegerNode); ok { Patch(node, &BinaryNode{ Operator: "and", Left: &BinaryNode{ diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 948fc6e14..1616ebbb8 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -4,6 +4,7 @@ import ( "strings" "testing" + "github.com/antonmedv/expr" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/conf" @@ -77,6 +78,9 @@ func TestOptimize_in_range(t *testing.T) { tree, err := parser.Parse(`age in 18..31`) require.NoError(t, err) + config := conf.New(map[string]int{"age": 30}) + _, err = checker.Check(tree, config) + err = optimizer.Optimize(&tree.Node, nil) require.NoError(t, err) @@ -104,6 +108,12 @@ func TestOptimize_in_range(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } +func TestOptimize_in_range_with_floats(t *testing.T) { + out, err := expr.Eval(`f in 1..3`, map[string]any{"f": 1.5}) + require.NoError(t, err) + assert.Equal(t, false, out) +} + func TestOptimize_const_range(t *testing.T) { tree, err := parser.Parse(`-1..1`) require.NoError(t, err) From 4629871ec39fffeb8533b932927c8e9f362b8b55 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 28 Aug 2023 22:24:46 +0200 Subject: [PATCH 127/506] Fix float folding optimization --- checker/checker.go | 23 ++++++++++-- checker/types.go | 37 -------------------- expr_test.go | 35 +++++++++++++------ optimizer/fold.go | 70 ++++++++++++++++++++++--------------- optimizer/optimizer_test.go | 2 ++ 5 files changed, 89 insertions(+), 78 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 8bb9a2839..41b1b2c8c 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -894,9 +894,9 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu in = fn.In(i + fnInOffset) } - if isIntegerOrArithmeticOperation(arg) && (isInteger(in) || isFloat(in)) { - t = in - setTypeForIntegers(arg, t) + if isFloat(in) { + t = floatType + traverseAndReplaceIntegerNodesWithFloatNodes(&arg) } if t == nil { @@ -914,6 +914,23 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu return fn.Out(0), nil } +func traverseAndReplaceIntegerNodesWithFloatNodes(node *ast.Node) { + switch (*node).(type) { + case *ast.IntegerNode: + *node = &ast.FloatNode{Value: float64((*node).(*ast.IntegerNode).Value)} + case *ast.UnaryNode: + unaryNode := (*node).(*ast.UnaryNode) + traverseAndReplaceIntegerNodesWithFloatNodes(&unaryNode.Node) + case *ast.BinaryNode: + binaryNode := (*node).(*ast.BinaryNode) + switch binaryNode.Operator { + case "+", "-", "*": + traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Left) + traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Right) + } + } +} + func (v *checker) ClosureNode(node *ast.ClosureNode) (reflect.Type, info) { t, _ := v.visit(node.Node) if t == nil { diff --git a/checker/types.go b/checker/types.go index d1a5e85e6..5248b760c 100644 --- a/checker/types.go +++ b/checker/types.go @@ -4,7 +4,6 @@ import ( "reflect" "time" - "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/conf" ) @@ -228,39 +227,3 @@ func kind(t reflect.Type) reflect.Kind { } return t.Kind() } - -func isIntegerOrArithmeticOperation(node ast.Node) bool { - switch n := node.(type) { - case *ast.IntegerNode: - return true - case *ast.UnaryNode: - switch n.Operator { - case "+", "-": - return true - } - case *ast.BinaryNode: - switch n.Operator { - case "+", "-", "*": - return true - } - } - return false -} - -func setTypeForIntegers(node ast.Node, t reflect.Type) { - switch n := node.(type) { - case *ast.IntegerNode: - n.SetType(t) - case *ast.UnaryNode: - switch n.Operator { - case "+", "-": - setTypeForIntegers(n.Node, t) - } - case *ast.BinaryNode: - switch n.Operator { - case "+", "/", "-", "*": - setTypeForIntegers(n.Left, t) - setTypeForIntegers(n.Right, t) - } - } -} diff --git a/expr_test.go b/expr_test.go index 78ef15cf1..f98e926e4 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1028,6 +1028,18 @@ func TestExpr(t *testing.T) { `first(filter(map(1..9, # * 2), # % 2 == 0))`, 2, }, + { + `first(map(filter(1..9, # % 2 == 0), # * 2))`, + 4, + }, + { + `2^3 == 8`, + true, + }, + { + `4/2 == 2`, + true, + }, } for _, tt := range tests { @@ -1198,13 +1210,13 @@ func TestExpr_calls_with_nil(t *testing.T) { require.Equal(t, true, out) } -func TestExpr_call_floatarg_func_with_int(t *testing.T) { +func TestExpr_call_float_arg_func_with_int(t *testing.T) { env := map[string]interface{}{ "cnv": func(f float64) interface{} { return f }, } - for _, each := range []struct { + tests := []struct { input string expected float64 }{ @@ -1214,15 +1226,18 @@ func TestExpr_call_floatarg_func_with_int(t *testing.T) { {"1-1", 0.0}, {"1/1", 1.0}, {"1*1", 1.0}, - } { - p, err := expr.Compile( - fmt.Sprintf("cnv(%s)", each.input), - expr.Env(env)) - require.NoError(t, err) + {"1^1", 1.0}, + } + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + p, err := expr.Compile(fmt.Sprintf("cnv(%s)", tt.input), expr.Env(env)) + require.NoError(t, err) - out, err := expr.Run(p, env) - require.NoError(t, err) - require.Equal(t, each.expected, out) + p.Disassemble() + out, err := expr.Run(p, env) + require.NoError(t, err) + require.Equal(t, tt.expected, out) + }) } } diff --git a/optimizer/fold.go b/optimizer/fold.go index b62b2d7ed..8d31a5cc5 100644 --- a/optimizer/fold.go +++ b/optimizer/fold.go @@ -1,6 +1,7 @@ package optimizer import ( + "fmt" "math" "reflect" @@ -8,6 +9,12 @@ import ( "github.com/antonmedv/expr/file" ) +var ( + integerType = reflect.TypeOf(0) + floatType = reflect.TypeOf(float64(0)) + stringType = reflect.TypeOf("") +) + type fold struct { applied bool err *file.Error @@ -18,11 +25,18 @@ func (fold *fold) Visit(node *Node) { fold.applied = true Patch(node, newNode) } - // for IntegerNode the type may have been changed from int->float - // preserve this information by setting the type after the Patch - patchWithType := func(newNode Node, leafType reflect.Type) { + patchWithType := func(newNode Node) { patch(newNode) - newNode.SetType(leafType) + switch newNode.(type) { + case *IntegerNode: + newNode.SetType(integerType) + case *FloatNode: + newNode.SetType(floatType) + case *StringNode: + newNode.SetType(stringType) + default: + panic(fmt.Sprintf("unknown type %T", newNode)) + } } switch n := (*node).(type) { @@ -30,17 +44,17 @@ func (fold *fold) Visit(node *Node) { switch n.Operator { case "-": if i, ok := n.Node.(*IntegerNode); ok { - patchWithType(&IntegerNode{Value: -i.Value}, n.Node.Type()) + patchWithType(&IntegerNode{Value: -i.Value}) } if i, ok := n.Node.(*FloatNode); ok { - patchWithType(&FloatNode{Value: -i.Value}, n.Node.Type()) + patchWithType(&FloatNode{Value: -i.Value}) } case "+": if i, ok := n.Node.(*IntegerNode); ok { - patchWithType(&IntegerNode{Value: i.Value}, n.Node.Type()) + patchWithType(&IntegerNode{Value: i.Value}) } if i, ok := n.Node.(*FloatNode); ok { - patchWithType(&FloatNode{Value: i.Value}, n.Node.Type()) + patchWithType(&FloatNode{Value: i.Value}) } case "!", "not": if a := toBool(n.Node); a != nil { @@ -55,28 +69,28 @@ func (fold *fold) Visit(node *Node) { a := toInteger(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&IntegerNode{Value: a.Value + b.Value}, a.Type()) + patchWithType(&IntegerNode{Value: a.Value + b.Value}) } } { a := toInteger(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: float64(a.Value) + b.Value}, a.Type()) + patchWithType(&FloatNode{Value: float64(a.Value) + b.Value}) } } { a := toFloat(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value + float64(b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: a.Value + float64(b.Value)}) } } { a := toFloat(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value + b.Value}, a.Type()) + patchWithType(&FloatNode{Value: a.Value + b.Value}) } } { @@ -91,28 +105,28 @@ func (fold *fold) Visit(node *Node) { a := toInteger(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&IntegerNode{Value: a.Value - b.Value}, a.Type()) + patchWithType(&IntegerNode{Value: a.Value - b.Value}) } } { a := toInteger(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: float64(a.Value) - b.Value}, a.Type()) + patchWithType(&FloatNode{Value: float64(a.Value) - b.Value}) } } { a := toFloat(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value - float64(b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: a.Value - float64(b.Value)}) } } { a := toFloat(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value - b.Value}, a.Type()) + patchWithType(&FloatNode{Value: a.Value - b.Value}) } } case "*": @@ -120,28 +134,28 @@ func (fold *fold) Visit(node *Node) { a := toInteger(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&IntegerNode{Value: a.Value * b.Value}, a.Type()) + patchWithType(&IntegerNode{Value: a.Value * b.Value}) } } { a := toInteger(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: float64(a.Value) * b.Value}, a.Type()) + patchWithType(&FloatNode{Value: float64(a.Value) * b.Value}) } } { a := toFloat(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value * float64(b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: a.Value * float64(b.Value)}) } } { a := toFloat(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value * b.Value}, a.Type()) + patchWithType(&FloatNode{Value: a.Value * b.Value}) } } case "/": @@ -149,28 +163,28 @@ func (fold *fold) Visit(node *Node) { a := toInteger(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: float64(a.Value) / float64(b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: float64(a.Value) / float64(b.Value)}) } } { a := toInteger(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: float64(a.Value) / b.Value}, a.Type()) + patchWithType(&FloatNode{Value: float64(a.Value) / b.Value}) } } { a := toFloat(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value / float64(b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: a.Value / float64(b.Value)}) } } { a := toFloat(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: a.Value / b.Value}, a.Type()) + patchWithType(&FloatNode{Value: a.Value / b.Value}) } } case "%": @@ -191,28 +205,28 @@ func (fold *fold) Visit(node *Node) { a := toInteger(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: math.Pow(float64(a.Value), float64(b.Value))}, a.Type()) + patchWithType(&FloatNode{Value: math.Pow(float64(a.Value), float64(b.Value))}) } } { a := toInteger(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: math.Pow(float64(a.Value), b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: math.Pow(float64(a.Value), b.Value)}) } } { a := toFloat(n.Left) b := toInteger(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: math.Pow(a.Value, float64(b.Value))}, a.Type()) + patchWithType(&FloatNode{Value: math.Pow(a.Value, float64(b.Value))}) } } { a := toFloat(n.Left) b := toFloat(n.Right) if a != nil && b != nil { - patchWithType(&FloatNode{Value: math.Pow(a.Value, b.Value)}, a.Type()) + patchWithType(&FloatNode{Value: math.Pow(a.Value, b.Value)}) } } case "and", "&&": diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 1616ebbb8..4f2130618 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -1,6 +1,7 @@ package optimizer_test import ( + "reflect" "strings" "testing" @@ -39,6 +40,7 @@ func TestOptimize_constant_folding_with_floats(t *testing.T) { expected := &ast.FloatNode{Value: 3.0} assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) + assert.Equal(t, reflect.Float64, tree.Node.Type().Kind()) } func TestOptimize_constant_folding_with_bools(t *testing.T) { From 578b265082c46d1433013a61b5e33684f16b99da Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 28 Aug 2023 22:27:43 +0200 Subject: [PATCH 128/506] Remove extra disassemble --- expr_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/expr_test.go b/expr_test.go index f98e926e4..0bf03be5d 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1233,7 +1233,6 @@ func TestExpr_call_float_arg_func_with_int(t *testing.T) { p, err := expr.Compile(fmt.Sprintf("cnv(%s)", tt.input), expr.Env(env)) require.NoError(t, err) - p.Disassemble() out, err := expr.Run(p, env) require.NoError(t, err) require.Equal(t, tt.expected, out) From 3d909203fce0a920089d0f312f0bfd1cb39b6330 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 29 Aug 2023 10:44:53 +0200 Subject: [PATCH 129/506] Update test gen --- test/gen/gen.go | 236 +- testdata/examples.txt | 35965 ++++++++++++++++++---------------------- 2 files changed, 16123 insertions(+), 20078 deletions(-) diff --git a/test/gen/gen.go b/test/gen/gen.go index 7e1f433ed..a96a5f334 100644 --- a/test/gen/gen.go +++ b/test/gen/gen.go @@ -3,6 +3,7 @@ package main import ( "fmt" "math/rand" + "reflect" "runtime/debug" "github.com/antonmedv/expr" @@ -10,36 +11,101 @@ import ( "github.com/antonmedv/expr/builtin" ) -var env = map[string]interface{}{ - "a": 1, - "b": 2, - "f": 0.5, - "ok": true, - "s": "abc", - "arr": []int{1, 2, 3}, - "obj": map[string]interface{}{ - "a": 1, - "b": 2, - "obj": map[string]interface{}{ - "a": 1, - "b": 2, - "obj": map[string]int{ - "a": 1, - "b": 2, - }, - }, - "fn": func(a int) int { return a + 1 }, - "head": func(xs ...interface{}) interface{} { return xs[0] }, +var env = map[string]any{ + "ok": true, + "f64": .5, + "f32": float32(.5), + "i": 1, + "i64": int64(1), + "i32": int32(1), + "array": []int{1, 2, 3, 4, 5}, + "list": []Foo{{"bar"}, {"baz"}}, + "foo": Foo{"bar"}, + "add": func(a, b int) int { return a + b }, + "div": func(a, b int) int { return a / b }, + "half": func(a float64) float64 { return a / 2 }, + "score": func(a int, x ...int) int { + s := a + for _, n := range x { + s += n + } + return s }, - "add": func(a, b int) int { return a + b }, - "div": func(a, b int) int { return a / b }, + "greet": func(name string) string { return "Hello, " + name }, +} + +type Foo struct { + Bar string +} + +func (f Foo) String() string { + return "foo" +} + +func (f Foo) Qux(s string) string { + return f.Bar + s } -var names []string +var ( + dict []string + predicates []string + builtins []string + operators = []string{ + "or", + "||", + "and", + "&&", + "==", + "!=", + "<", + ">", + ">=", + "<=", + "..", + "+", + "-", + "*", + "/", + "%", + "**", + "^", + "in", + "matches", + "contains", + "startsWith", + "endsWith", + "not in", + "not matches", + "not contains", + "not startsWith", + "not endsWith", + } +) func init() { - for name := range env { - names = append(names, name) + for name, x := range env { + dict = append(dict, name) + v := reflect.ValueOf(x) + if v.Kind() == reflect.Struct { + for i := 0; i < v.NumField(); i++ { + dict = append(dict, v.Type().Field(i).Name) + } + for i := 0; i < v.NumMethod(); i++ { + dict = append(dict, v.Type().Method(i).Name) + } + } + if v.Kind() == reflect.Map { + for _, key := range v.MapKeys() { + dict = append(dict, fmt.Sprintf("%v", key.Interface())) + } + } + } + for _, b := range builtin.Builtins { + if b.Predicate { + predicates = append(predicates, b.Name) + } else { + builtins = append(builtins, b.Name) + } } } @@ -47,12 +113,13 @@ func main() { var code string defer func() { if r := recover(); r != nil { - fmt.Printf("==========================\n%s\n==========================\n", code) + fmt.Printf("==========================\n%s\n==========================\n%s\n==========================\n", code, r) debug.PrintStack() } }() - corpus := map[string]struct{}{} + var corpus = map[string]struct{}{} + for { code = node(weightedRandomInt([]intWeight{ {3, 100}, @@ -91,6 +158,7 @@ func node(depth int) ast.Node { {stringNode, 1}, {booleanNode, 1}, {identifierNode, 10}, + {pointerNode, 10}, })(depth - 1) } return weightedRandom([]fnWeight{ @@ -109,58 +177,49 @@ func node(depth int) ast.Node { })(depth - 1) } -func nilNode(depth int) ast.Node { +func nilNode(_ int) ast.Node { return &ast.NilNode{} } -func floatNode(depth int) ast.Node { - cases := []float64{ - 0.0, - 0.5, - } +func floatNode(_ int) ast.Node { return &ast.FloatNode{ - Value: cases[rand.Intn(len(cases))], + Value: .5, } } -func integerNode(depth int) ast.Node { +func integerNode(_ int) ast.Node { return &ast.IntegerNode{ - Value: rand.Intn(3), + Value: 1, } } -func stringNode(depth int) ast.Node { - corpus := []string{ - "a", "b", "c", +func stringNode(_ int) ast.Node { + words := []string{ + "foo", + "bar", } return &ast.StringNode{ - Value: corpus[rand.Intn(len(corpus))], + Value: words[rand.Intn(len(words))], } } -func booleanNode(depth int) ast.Node { +func booleanNode(_ int) ast.Node { return &ast.BoolNode{ Value: maybe(), } } -func identifierNode(depth int) ast.Node { +func identifierNode(_ int) ast.Node { return &ast.IdentifierNode{ - Value: names[rand.Intn(len(names))], + Value: dict[rand.Intn(len(dict))], } } func memberNode(depth int) ast.Node { - cases := []string{ - "a", - "b", - "obj", - } - return &ast.MemberNode{ Node: node(depth - 1), Property: weightedRandom([]fnWeight{ - {func(_ int) ast.Node { return &ast.StringNode{Value: cases[rand.Intn(len(cases))]} }, 5}, + {func(_ int) ast.Node { return &ast.StringNode{Value: dict[rand.Intn(len(dict))]} }, 5}, {node, 1}, })(depth - 1), Optional: maybe(), @@ -168,11 +227,7 @@ func memberNode(depth int) ast.Node { } func unaryNode(depth int) ast.Node { - cases := []string{ - "-", - "!", - "not", - } + cases := []string{"-", "!", "not"} return &ast.UnaryNode{ Operator: cases[rand.Intn(len(cases))], Node: node(depth - 1), @@ -180,65 +235,31 @@ func unaryNode(depth int) ast.Node { } func binaryNode(depth int) ast.Node { - cases := []string{ - "or", - "||", - "and", - "&&", - "==", - "!=", - "<", - ">", - ">=", - "<=", - "in", - "matches", - "contains", - "startsWith", - "endsWith", - "..", - "+", - "-", - "*", - "/", - "%", - "**", - "^", - } return &ast.BinaryNode{ - Operator: cases[rand.Intn(len(cases))], + Operator: operators[rand.Intn(len(operators))], Left: node(depth - 1), Right: node(depth - 1), } } func methodNode(depth int) ast.Node { - cases := []string{ - "fn", - "head", - } - return &ast.MemberNode{ Node: node(depth - 1), - Property: &ast.StringNode{Value: cases[rand.Intn(len(cases))]}, + Property: &ast.StringNode{Value: dict[rand.Intn(len(dict))]}, Optional: maybe(), } } -func funcNode(depth int) ast.Node { - cases := []string{ - "add", - "div", - } - +func funcNode(_ int) ast.Node { return &ast.IdentifierNode{ - Value: cases[rand.Intn(len(cases))], + Value: dict[rand.Intn(len(dict))], } } func callNode(depth int) ast.Node { var args []ast.Node max := weightedRandomInt([]intWeight{ + {0, 100}, {1, 100}, {2, 50}, {3, 25}, @@ -262,36 +283,29 @@ func builtinNode(depth int) ast.Node { max := weightedRandomInt([]intWeight{ {1, 100}, {2, 50}, - {3, 25}, + {3, 50}, {4, 10}, - {5, 5}, }) for i := 0; i < max; i++ { args = append(args, node(depth-1)) } return &ast.BuiltinNode{ - Name: builtin.Names[rand.Intn(len(builtin.Names))], + Name: builtins[rand.Intn(len(builtins))], Arguments: args, } } func predicateNode(depth int) ast.Node { - cases := []string{ - "all", - "none", - "any", - "one", - "filter", - "map", - "count", - } return &ast.BuiltinNode{ - Name: cases[rand.Intn(len(cases))], - Arguments: []ast.Node{node(depth - 1), node(depth - 1)}, + Name: predicates[rand.Intn(len(predicates))], + Arguments: []ast.Node{ + node(depth - 1), + node(depth - 1), + }, } } -func pointerNode(depth int) ast.Node { +func pointerNode(_ int) ast.Node { return &ast.PointerNode{} } @@ -301,8 +315,6 @@ func arrayNode(depth int) ast.Node { {1, 100}, {2, 50}, {3, 25}, - {4, 10}, - {5, 5}, }) for i := 0; i < max; i++ { items = append(items, node(depth-1)) @@ -318,8 +330,6 @@ func mapNode(depth int) ast.Node { {1, 100}, {2, 50}, {3, 25}, - {4, 10}, - {5, 5}, }) for i := 0; i < max; i++ { items = append(items, &ast.PairNode{ diff --git a/testdata/examples.txt b/testdata/examples.txt index 4e3782b00..f427f787d 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -1,367 +1,491 @@ -!!(obj?.head(obj, div) == obj.obj) +!!!true +!!(f32 > f64) +!!(half != greet) +!!(nil == add) +!!(ok or true) !!false +!!not false !!ok !!true -!("a" != nil) -!("a" != s) -!("a" < "b") -!("a" < s) -!("a" <= "a") -!("a" == nil) -!("a" == s) -!("a" > s) -!("a" endsWith "a") -!("a" endsWith s) -!("a" in obj) -!("a" matches s) -!("a" startsWith "a") -!("a" startsWith "c") -!("a" startsWith s) -!("b" != "b") -!("b" != s) -!("b" < "c") -!("b" < s) -!("b" <= "c") -!("b" <= s) -!("b" > "b") -!("b" > "c") -!("b" > s) -!("b" >= "c") -!("b" >= s) -!("b" contains "a") -!("b" contains "c") -!("b" contains s) -!("b" endsWith "a") -!("b" endsWith "b") -!("b" in obj) -!("b" startsWith "c") -!("c" != "c") -!("c" != nil) -!("c" < "b") -!("c" < s) -!("c" <= s) -!("c" == "c") -!("c" == nil) -!("c" == s) -!("c" > s) -!("c" >= "b") -!("c" >= s) -!("c" endsWith "b") -!("c" endsWith "c") -!("c" endsWith s) -!("c" in obj) -!("c" matches "c") -!("c" matches s) -!("c" startsWith "a") -!("c" startsWith s) -!(0 != 0) -!(0 != 1) -!(0 != a) -!(0 != f) -!(0 != nil) -!(0 < 0) -!(0 < 0.5) -!(0 < 2) -!(0 < a) -!(0 < b) -!(0 < f) -!(0 <= 0) -!(0 <= 0.5) -!(0 <= 1) -!(0 <= a) -!(0 <= b) -!(0 <= f) -!(0 == 0) -!(0 == 0.5) -!(0 == 1) -!(0 == 2) -!(0 == a) -!(0 == b) -!(0 == f) -!(0 == nil) -!(0 > 0) -!(0 > 2) -!(0 > b) -!(0 > f) -!(0 >= 0) -!(0 >= 0.5) -!(0 >= 1) -!(0 >= 2) -!(0 >= a) -!(0 >= b) -!(0 >= f) -!(0 in arr) -!(0.5 != 0) +!("bar" != "bar") +!("bar" != "foo") +!("bar" != nil) +!("bar" < "bar") +!("bar" < "foo") +!("bar" <= "bar") +!("bar" <= "foo") +!("bar" == "bar") +!("bar" == "foo") +!("bar" == nil) +!("bar" > "bar") +!("bar" > "foo") +!("bar" >= "bar") +!("bar" >= "foo") +!("bar" contains "foo") +!("bar" in foo) +!("bar" matches "foo") +!("bar" not contains "bar") +!("bar" not contains "foo") +!("bar" not endsWith "foo") +!("bar" not in foo) +!("bar" not matches "foo") +!("bar" not startsWith "bar") +!("bar" not startsWith "foo") +!("bar" startsWith "bar") +!("foo" != "bar") +!("foo" != "foo") +!("foo" != nil) +!("foo" < "bar") +!("foo" <= "bar") +!("foo" <= "foo") +!("foo" == "foo") +!("foo" == nil) +!("foo" > "bar") +!("foo" > "foo") +!("foo" >= "bar") +!("foo" >= "foo") +!("foo" contains "bar") +!("foo" contains "foo") +!("foo" endsWith "bar") +!("foo" endsWith "foo") +!("foo" in foo) +!("foo" matches "bar") +!("foo" matches "foo") +!("foo" not contains "bar") +!("foo" not contains "foo") +!("foo" not endsWith "bar") +!("foo" not endsWith "foo") +!("foo" not in foo) +!("foo" not matches "bar") +!("foo" not matches "foo") +!("foo" not startsWith "bar") +!("foo" not startsWith "foo") +!("foo" startsWith "bar") +!("foo" startsWith "foo") !(0.5 != 0.5) -!(0.5 != 2) -!(0.5 != a) -!(0.5 != b) -!(0.5 != f) +!(0.5 != 1) +!(0.5 != f32) +!(0.5 != f64) +!(0.5 != i) +!(0.5 != i32) +!(0.5 != i64) !(0.5 != nil) -!(0.5 < 0) -!(0.5 < 2) -!(0.5 < a) -!(0.5 < b) -!(0.5 < f) -!(0.5 <= 0) -!(0.5 <= a) -!(0.5 <= b) -!(0.5 <= f) -!(0.5 == 2) -!(0.5 == a) -!(0.5 == b) -!(0.5 == f) +!(0.5 / i32 > i) +!(0.5 < 0.5) +!(0.5 < 1) +!(0.5 < f32) +!(0.5 < f64) +!(0.5 < i) +!(0.5 < i32) +!(0.5 < i64) +!(0.5 <= 0.5) +!(0.5 <= 1) +!(0.5 <= f32) +!(0.5 <= i) +!(0.5 <= i32) +!(0.5 <= i64) +!(0.5 == 0.5) +!(0.5 == 1) +!(0.5 == f32) +!(0.5 == f64) +!(0.5 == i) +!(0.5 == i32) +!(0.5 == i64) !(0.5 == nil) -!(0.5 > 0) +!(0.5 > 0.5) !(0.5 > 1) -!(0.5 > 2) -!(0.5 > a) -!(0.5 > b) -!(0.5 > f) -!(0.5 >= 0) +!(0.5 > f32) +!(0.5 > f64) +!(0.5 > i) +!(0.5 > i32) +!(0.5 > i64) !(0.5 >= 0.5) !(0.5 >= 1) -!(0.5 >= a) -!(0.5 >= b) -!(0.5 >= f) -!(1 < 0) +!(0.5 >= f32) +!(0.5 >= f64) +!(0.5 >= i) +!(0.5 >= i32) +!(0.5 >= i64) +!(0.5 ^ i64 < i64) +!(1 != 0.5) +!(1 != 1) +!(1 != f32) +!(1 != f64) +!(1 != i) +!(1 != i32) +!(1 != i64) +!(1 != nil) +!(1 < 0.5) !(1 < 1) -!(1 < a) -!(1 < b) -!(1 <= 0) -!(1 <= a) -!(1 <= b) -!(1 <= f) -!(1 == 0) -!(1 == a) -!(1 == f) +!(1 < f32) +!(1 < f64) +!(1 < i) +!(1 < i32) +!(1 < i64) +!(1 <= 0.5) +!(1 <= 1) +!(1 <= f32) +!(1 <= f64) +!(1 <= i) +!(1 <= i32) +!(1 <= i64) +!(1 == 0.5) +!(1 == 1) +!(1 == f32) +!(1 == f64) +!(1 == i) +!(1 == i32) +!(1 == i64) !(1 == nil) -!(1 > a) -!(1 > b) -!(1 > f) -!(1 >= 0) +!(1 > 0.5) +!(1 > 1) +!(1 > f64) +!(1 > i) +!(1 > i32) +!(1 > i64) !(1 >= 0.5) -!(1 >= b) -!(1 in arr) -!(2 != 0.5) -!(2 != 2) -!(2 != a) -!(2 != b) -!(2 != f) -!(2 / a < f) -!(2 < 0) -!(2 < 1) -!(2 < 2) -!(2 < a) -!(2 < f) -!(2 <= 2) -!(2 <= b) -!(2 <= f) -!(2 == 0) -!(2 == 0.5) -!(2 == 1) -!(2 == 2) -!(2 == a) -!(2 == b) -!(2 == f) -!(2 > 0) -!(2 > a) -!(2 > f) -!(2 >= a) -!(2 >= b) -!(2 >= f) -!(2 in arr) -!(a != 0.5) -!(a != 1) -!(a != 2) -!(a != a) -!(a != b) -!(a != f) -!(a != nil) -!(a + 0.5 >= a) -!(a < 0) -!(a < 0.5) -!(a < 2) -!(a < a) -!(a < b) -!(a < div(0, a)) -!(a < f) -!(a <= 0) -!(a <= 0.5) -!(a <= 2) -!(a <= a) -!(a <= b) -!(a <= f) -!(a == 0) -!(a == 0.5) -!(a == 1) -!(a == 2) -!(a == a) -!(a == b) -!(a == f) -!(a == nil) -!(a > 0) -!(a > 0.5) -!(a > 1) -!(a > 2 && div == add) -!(a > 2) -!(a > a) -!(a > b) -!(a > f) -!(a >= 0) -!(a >= 0.5) -!(a >= 1) -!(a >= 2) -!(a >= a) -!(a >= b) -!(a >= f) -!(a in arr) +!(1 >= 1) +!(1 >= f32) +!(1 >= f64) +!(1 >= i) +!(1 >= i32) +!(1 >= i64) +!(1 in array) +!(1 not in array) !(add != add) !(add != div) +!(add != greet) +!(add != half) !(add != nil) +!(add != score) !(add == add) !(add == div) +!(add == half) !(add == nil) -!(arr != nil) -!(arr == arr) -!(arr == nil) -!(b != 0) -!(b != 0.5) -!(b != a) -!(b != b) -!(b != f) -!(b != nil) -!(b < 0) -!(b < 0.5 * 0.5) -!(b < 0.5) -!(b < 1) -!(b < a) -!(b < b) -!(b < f) -!(b <= 0) -!(b <= 1) -!(b <= a) -!(b <= b) -!(b <= f) -!(b == 0) -!(b == 0.5) -!(b == a) -!(b == b) -!(b == f) -!(b == nil) -!(b == obj.a) -!(b > 0) -!(b > 0.5) -!(b > 1) -!(b > 2) -!(b > a) -!(b > b) -!(b > f) -!(b >= 0) -!(b >= 0.5) -!(b >= 1) -!(b >= 2) -!(b >= a) -!(b >= b) -!(b >= f) -!(b in arr) +!(add == score) +!(array != array) +!(array != nil) +!(array == array) +!(array == list) +!(array == nil) !(div != add) !(div != div) +!(div != greet) +!(div != half) !(div != nil) +!(div != score) !(div == add) !(div == div) -!(f != 0) -!(f != 0.5) -!(f != 1) -!(f != 2) -!(f != a) -!(f != b) -!(f != f) -!(f != nil) -!(f < 0) -!(f < 0.5) -!(f < 1) -!(f < a) -!(f < b) -!(f < f) -!(f < obj.b) -!(f <= 0) -!(f <= 0.5) -!(f <= 2) -!(f <= a) -!(f <= b) -!(f <= f) -!(f <= obj.b) -!(f == 0) -!(f == 0.5) -!(f == 1) -!(f == 2) -!(f == a) -!(f == b) -!(f == f) -!(f == nil) -!(f > 0) -!(f > 0.5) -!(f > 1) -!(f > a) -!(f > b) -!(f > div(b, a)) -!(f > f) -!(f >= 0) -!(f >= 0.5) -!(f >= 1) -!(f >= 2) -!(f >= a) -!(f >= b) -!(f >= f) +!(div == greet) +!(div == half) +!(div == nil) +!(div == score) +!(f32 != 0.5) +!(f32 != 1) +!(f32 != f32) +!(f32 != i32) +!(f32 != i64) +!(f32 != nil) +!(f32 + i == 0.5 * i) +!(f32 < 0.5) +!(f32 < 1) +!(f32 < f32) +!(f32 < f64) +!(f32 < i) +!(f32 < i32) +!(f32 < i64) +!(f32 <= 0.5) +!(f32 <= 1) +!(f32 <= f32) +!(f32 <= f64) +!(f32 <= i) +!(f32 <= i32) +!(f32 <= i64) +!(f32 == 0.5) +!(f32 == 1) +!(f32 == f32) +!(f32 == f64) +!(f32 == i) +!(f32 == i32) +!(f32 == i64) +!(f32 == nil) +!(f32 > 0.5) +!(f32 > 1) +!(f32 > f32) +!(f32 > f64) +!(f32 > i) +!(f32 > i32) +!(f32 > i64) +!(f32 >= 0.5) +!(f32 >= 1) +!(f32 >= f32) +!(f32 >= f64) +!(f32 >= i) +!(f32 >= i64) +!(f64 != 0.5) +!(f64 != 1) +!(f64 != f32) +!(f64 != f64) +!(f64 != i32) +!(f64 != i64) +!(f64 != nil) +!(f64 < 0.5) +!(f64 < 1) +!(f64 < f32) +!(f64 < f64) +!(f64 < i) +!(f64 < i32) +!(f64 < i64) +!(f64 <= 0.5) +!(f64 <= 1) +!(f64 <= f32) +!(f64 <= f64) +!(f64 <= i) +!(f64 <= i32) +!(f64 <= i64) +!(f64 == 0.5) +!(f64 == 1) +!(f64 == f32) +!(f64 == i32) +!(f64 == i64) +!(f64 == nil) +!(f64 > 0.5) +!(f64 > 1) +!(f64 > f64) +!(f64 > i32) +!(f64 > i64) +!(f64 >= 0.5) +!(f64 >= 1) +!(f64 >= f32) +!(f64 >= f64) +!(f64 >= i) +!(f64 >= i32) +!(f64 >= i64) +!(false != false) !(false != nil) !(false != ok) !(false != true) !(false && false) !(false && ok) -!(false && true) +!(false == false) !(false == nil) +!(false == ok) !(false and ok) !(false or ok) +!(false or true) +!(false || false) !(false || ok) -!(nil != "a") -!(nil != "c") -!(nil != 0) +!(false || true) +!(foo != foo) +!(foo != nil) +!(foo == foo) +!(foo == nil) +!(foo in list) +!(foo not in list) +!(greet != div) +!(greet != greet) +!(greet != half) +!(greet != nil) +!(greet != score) +!(greet == add) +!(greet == div) +!(greet == greet) +!(greet == half) +!(greet == nil) +!(greet == score) +!(half != add) +!(half != div) +!(half != greet) +!(half != half) +!(half != nil) +!(half != score) +!(half == add) +!(half == div) +!(half == greet) +!(half == half) +!(half == nil) +!(half == score) +!(i != 0.5) +!(i != 1) +!(i != f32) +!(i != f64) +!(i != i) +!(i != i32) +!(i != i64) +!(i != nil) +!(i < 0.5) +!(i < 1) +!(i < f32) +!(i < f64) +!(i < i) +!(i < i32) +!(i < i64) +!(i <= 0.5) +!(i <= 1) +!(i <= f32) +!(i <= f64) +!(i <= i) +!(i <= i32) +!(i <= i64) +!(i == 0.5) +!(i == 1) +!(i == f32) +!(i == f64) +!(i == i) +!(i == i32) +!(i == i64) +!(i == nil) +!(i > 0.5) +!(i > 1) +!(i > f32) +!(i > f64) +!(i > i) +!(i > i32) +!(i > i64) +!(i >= 0.5) +!(i >= 1) +!(i >= f32) +!(i >= f64) +!(i >= i32) +!(i >= i64) +!(i in array) +!(i32 != 0.5) +!(i32 != 1) +!(i32 != f64) +!(i32 != i) +!(i32 != i32) +!(i32 != i64) +!(i32 != nil) +!(i32 * 0.5 != i32) +!(i32 < 0.5) +!(i32 < 1) +!(i32 < f32) +!(i32 < f64) +!(i32 < i) +!(i32 < i32) +!(i32 < i64) +!(i32 <= 0.5) +!(i32 <= 1) +!(i32 <= f32) +!(i32 <= f64) +!(i32 <= i) +!(i32 <= i32) +!(i32 <= i64) +!(i32 == 0.5) +!(i32 == 1) +!(i32 == f64) +!(i32 == i) +!(i32 == i32) +!(i32 == i64) +!(i32 == nil) +!(i32 > 0.5) +!(i32 > 1) +!(i32 > f64) +!(i32 > i) +!(i32 > i32) +!(i32 > i64) +!(i32 >= 0.5) +!(i32 >= 1) +!(i32 >= f32) +!(i32 >= f64) +!(i32 >= i) +!(i32 >= i32) +!(i32 >= i64) +!(i32 in array) +!(i32 not in array) +!(i64 != 0.5) +!(i64 != 1) +!(i64 != f32) +!(i64 != f64) +!(i64 != i) +!(i64 != i32) +!(i64 != nil) +!(i64 < 0.5) +!(i64 < 1) +!(i64 < f32) +!(i64 < f64) +!(i64 < i) +!(i64 < i32) +!(i64 < i64) +!(i64 <= 0.5) +!(i64 <= 1) +!(i64 <= f32) +!(i64 <= f64) +!(i64 <= i) +!(i64 <= i32) +!(i64 <= i64) +!(i64 == 0.5) +!(i64 == 1) +!(i64 == f32) +!(i64 == f64) +!(i64 == i) +!(i64 == i32) +!(i64 == nil) +!(i64 > 0.5) +!(i64 > 1) +!(i64 > f32) +!(i64 > f64) +!(i64 > i) +!(i64 > i32) +!(i64 > i64) +!(i64 >= 0.5) +!(i64 >= 1) +!(i64 >= f32) +!(i64 >= f64) +!(i64 >= i) +!(i64 >= i32) +!(i64 in array) +!(i64 not in array) +!(list != array) +!(list != list) +!(list != nil) +!(list == array) +!(list == list) +!(list == nil) +!(nil != "bar") +!(nil != "foo") !(nil != 0.5) -!(nil != 2) -!(nil != a) +!(nil != 1) !(nil != add) -!(nil != arr) -!(nil != b) +!(nil != array) !(nil != div) -!(nil != f) +!(nil != f32) +!(nil != f64) !(nil != false) +!(nil != foo) +!(nil != greet) +!(nil != half) +!(nil != i) +!(nil != i32) +!(nil != i64) +!(nil != list) !(nil != nil) -!(nil != obj) !(nil != ok) -!(nil != s) +!(nil != score) !(nil != true) -!(nil == "b") -!(nil == 0) +!(nil == "bar") +!(nil == "foo") !(nil == 0.5) !(nil == 1) -!(nil == a) -!(nil == add) -!(nil == arr) -!(nil == b) +!(nil == array) !(nil == div) -!(nil == false) +!(nil == f32) +!(nil == f64) +!(nil == foo) +!(nil == greet) +!(nil == half) +!(nil == i) +!(nil == i32) +!(nil == i64) +!(nil == list) !(nil == nil) -!(nil == obj) !(nil == ok) -!(nil == s) -!(nil in arr) -!(nil in obj) -!(obj != nil) -!(obj != obj) -!(obj == nil) -!(obj == obj) -!(obj.b == a ** a) +!(nil == score) +!(nil == true) +!(nil in array) +!(nil in list) +!(nil not in array) +!(nil not in list) !(ok != false) !(ok != nil) !(ok != ok) @@ -372,10830 +496,11294 @@ !(ok == false) !(ok == nil) !(ok == ok) -!(ok == true) -!(ok and false) !(ok and ok) !(ok and true) !(ok or ok) -!(ok or true) !(ok || false) !(ok || ok) -!(ok || true) -!(s != "b") -!(s != "c") -!(s != nil) -!(s != s) -!(s < "a") -!(s < "b") -!(s < "c") -!(s < s) -!(s <= "c") -!(s <= s) -!(s == "a") -!(s == "b") -!(s == "c") -!(s == nil) -!(s == s) -!(s > "b") -!(s > s) -!(s >= "a") -!(s >= s) -!(s contains "c") -!(s contains s) -!(s endsWith "a") -!(s endsWith "c") -!(s endsWith s) -!(s in obj) -!(s matches "a") -!(s matches "b") -!(s matches s || ok) -!(s matches s) -!(s startsWith "a") -!(s startsWith "b") -!(s startsWith s) -!(string(s) startsWith "b" != false) +!(score != add) +!(score != div) +!(score != greet) +!(score != half) +!(score != nil) +!(score != score) +!(score == add) +!(score == div) +!(score == greet) +!(score == half) +!(score == nil) +!(true != false) +!(true != nil) !(true != ok) !(true != true) !(true && false) !(true && ok) +!(true && true) +!(true == false) +!(true == nil) !(true == ok) !(true == true) +!(true and false) +!(true and ok) !(true and true) -!(true or ok) -!(true || false) +!(true or true) !(true || ok) !(true || true) -!all(arr, 2 != a) -!all(arr, false) -!all(arr, ok) -!all(arr, true) -!any(arr, false) -!any(arr, ok) -!any(arr, true) -!false && obj != obj.obj -!false && obj.b -!false == obj.head(ok) -!false ? "a" : s -!false ? "b" : add -!false ? "b" : f -!false ? "c" : f -!false ? 0 : "b" -!false ? 0 : false -!false ? 0 : s -!false ? 2 : false -!false ? a : add -!false ? a : false -!false ? a : s -!false ? add : ok -!false ? add : s -!false ? b : s -!false ? div : s -!false ? f : f -!false ? f : obj.head(obj) -!false ? false : b -!false ? nil : "a" -!false ? nil : f -!false ? nil : true -!false ? obj : nil -!false ? obj : obj -!false ? ok : obj +!all(array, false) +!all(array, ok) +!all(array, true) +!all(list, false) +!all(list, ok) +!all(list, true) +!any(array, false) +!any(array, ok) +!any(array, true) +!any(list, # != #) +!any(list, ok) +!false && ok +!false ? "bar" : i +!false ? "foo" : false +!false ? 0.5 : "bar" +!false ? 0.5 : 1 +!false ? 0.5 : div +!false ? 0.5 : i64 +!false ? 1 : add +!false ? 1 : true +!false ? add : array +!false ? add : nil +!false ? array : array +!false ? div : 0.5 +!false ? div : foo +!false ? div : map(list, #) +!false ? div : nil +!false ? f32 : 0.5 +!false ? f32 : greet +!false ? f64 : 1 +!false ? f64 : half +!false ? false : f32 +!false ? false : false +!false ? foo : 1 +!false ? foo : i64 +!false ? greet : array +!false ? greet : i32 +!false ? half : nil +!false ? half : ok +!false ? i : foo +!false ? i32 : "foo" +!false ? i64 : f32 +!false ? i64 : nil +!false ? list : list +!false ? nil : 1 +!false ? nil : add +!false ? nil : f64 +!false ? nil : foo !false ? ok : ok -!false ? s : add -!false ? s : nil -!false ? s : obj?.head(a.head("a")) -!false ? true : arr -!false ? true : div -!false or obj.a -!false or obj?.fn(obj, div) -!false or ok -!fromJSON(string(false)) -!hasSuffix("a", s) -!none(arr, false) -!none(arr, ok) -!none(arr, true) -!not (a < 0) -!not (f != 1) -!not (f == 0) -!not (s != s) -!not (s contains s) +!false ? true : array +!false and (true or false) +!false and ok +!false or 0.5 != 1 +!false || not false +!hasSuffix("bar", "bar") +!none(array, false) +!none(array, true) +!none(list, false) +!none(list, ok) +!none(list, true) +!not (1 != i) +!not (i64 != 0.5) +!not any(list, ok) !not false !not ok !not true -!obj.head(2 == s) -!obj.head(add != nil) -!obj.head(arr != s) -!obj.head(false == add) -!obj.head(false) -!obj.head(ok) -!obj.head(ok, 1, obj) -!obj.head(ok, add) -!obj.head(ok, map("a", 2)) -!obj.head(ok, nil) -!obj.head(ok, s) -!obj.head(ok, s, obj, div, s) -!obj.head(true, 0, arr) -!obj.head(true, a) -!obj.head(true, b, nil, f) -!obj.head(true, s) -!obj?.head(any(s, true)) -!obj?.head(false) -!obj?.head(false, "b") -!obj?.head(false, div, 2, obj) -!obj?.head(false, true) -!obj?.head(ok) -!obj?.head(ok, arr) -!obj?.head(ok, div, ok) -!obj?.head(ok, false) -!obj?.head(ok, nil, "c") -!obj?.head(ok, ok) -!obj?.head(ok, s) -!obj?.head(ok, true, b) -!obj?.head(true) -!obj?.head(true, 0) +!not true ? i64 : true !ok -!ok != (ok or false) !ok != ok -!ok && a == 1 -!ok && obj.b -!ok && ok +!ok && (ok || ok) +!ok == !ok !ok == ok -!ok ? "a" : 0.5 -!ok ? "a" : div -!ok ? "b" : 0 -!ok ? "b" : obj.b -!ok ? "b" : ok -!ok ? "c" : 0.5 -!ok ? 0 : add -!ok ? 0.5 : 0 -!ok ? 0.5 : 0.5 -!ok ? 0.5 : div -!ok ? 1 : nil -!ok ? 2 : "b" -!ok ? a : arr -!ok ? a : b -!ok ? a : div -!ok ? a : s -!ok ? a : true -!ok ? add : 1 -!ok ? add : a -!ok ? add : add -!ok ? add : f +!ok ? "bar" : 0.5 +!ok ? "foo" : nil +!ok ? 0.5 : "foo" +!ok ? 1 : 0.5 +!ok ? 1 : 1 +!ok ? 1 : div +!ok ? 1 : foo +!ok ? 1 : greet +!ok ? 1 : ok +!ok ? add : f32 !ok ? add : false -!ok ? add : obj -!ok ? add : ok -!ok ? add : s -!ok ? arr : b -!ok ? arr == arr : div -!ok ? b : "a" -!ok ? b : "b" -!ok ? b : 1 -!ok ? b : a -!ok ? b : f -!ok ? div : a -!ok ? div : b -!ok ? div : obj -!ok ? div : s -!ok ? f : a -!ok ? f : div -!ok ? f : s -!ok ? false : 0 -!ok ? false : f -!ok ? nil : div -!ok ? obj : 1 -!ok ? obj : ok -!ok ? ok : a -!ok ? ok : arr -!ok ? ok : false -!ok ? ok : nil -!ok ? ok : ok -!ok ? s : 0.5 -!ok ? s : obj -!ok ? true : s -!ok and a <= b -!ok and arr == nil -!ok and obj.a -!ok and obj.a?.obj -!ok and obj?.a -!ok and obj[nil] +!ok ? add : i +!ok ? add : score +!ok ? f32 : "foo" +!ok ? f32 : 1 +!ok ? f64 : i +!ok ? false : "foo" +!ok ? false : half +!ok ? greet : "bar" +!ok ? greet : add +!ok ? greet : false +!ok ? half : array +!ok ? i : foo +!ok ? i : greet +!ok ? i : true +!ok ? i64 : list +!ok ? list : "foo" +!ok ? list : true +!ok ? nil : i +!ok ? nil : true +!ok ? ok : 1 +!ok ? ok : i64 +!ok ? ok : score +!ok ? score : array +!ok ? score : i +!ok ? true : greet +!ok and i != f32 !ok and ok -!ok or nil != a -!ok or obj?.a -!ok or obj?.b -!ok or ok -!ok or ok || false -!ok || nil == s -!ok || obj.a -!ok || obj.fn(2) -!ok || ok -!one(arr, false) -!one(arr, ok) -!true != obj.a -!true && obj?.obj -!true && ok == nil -!true == obj.obj -!true == obj?.obj +!ok or none(array, ok) +!one(array, ok) +!one(array, true) +!one(list, false) +!one(list, ok) +!one(list, true) +!true != false ? ok : 0.5 +!true != nil == nil +!true != ok +!true && ok !true == ok -!true ? "a" : a -!true ? "a" : ok -!true ? 0 : true -!true ? 0.5 : b -!true ? 1 : add -!true ? a : add -!true ? a : arr -!true ? add : ok -!true ? arr : 0.5 +!true ? "bar" : false +!true ? "bar" : i +!true ? "foo" : ok +!true ? 0.5 : 1 +!true ? 0.5 : div +!true ? 0.5 : i +!true ? add : div +!true ? add : greet +!true ? array : foo +!true ? array : i +!true ? array : i64 +!true ? array : score +!true ? div : f32 !true ? div : ok -!true ? div : true -!true ? f : 0 -!true ? f : f -!true ? false : b -!true ? nil : "b" -!true ? nil : "c" -!true ? nil : div -!true ? nil : ok -!true ? obj : add -!true ? ok : add -!true ? ok : obj -!true ? s : "a" -!true ? s : false -!true ? true : a -!true ? true : f -!true and f != b -!true and nil != "a" -!true and obj.a +!true ? f32 : 0.5 +!true ? f32 : add +!true ? f32 : foo +!true ? f32 : i32 +!true ? f64 : "bar" +!true ? f64 : f64 +!true ? f64 : i32 +!true ? foo : 1 +!true ? greet : array +!true ? greet : list +!true ? half : add +!true ? half : greet +!true ? i32 : i64 +!true ? i64 : score +!true ? list : div +!true ? list : score +!true ? nil : 0.5 +!true ? nil : f32 +!true ? nil : f64 +!true ? nil : foo +!true ? nil : half +!true ? nil : i +!true ? ok : list +!true ? score : array +!true ? score : nil !true and ok -!true or obj?.head(1, nil, ok, div, arr) -!true || !true -"a" != nil or a <= 0 -"a" != obj.a -"a" != obj.b -"a" != obj.obj -"a" != obj.obj.b -"a" != obj?.a -"a" != obj?.b -"a" != obj?.fn(b) -"a" != obj?.head(add) -"a" != obj?.head(f == ok) -"a" != obj?.head(ok and nil) -"a" != obj?.obj -"a" < "a" ? obj.fn(true, 2, div, arr) : ok -"a" < "c" && obj.head(ok) -"a" < s || ok && false -"a" <= s && ok -"a" == "a" || ok -"a" == nil != ok -"a" == nil == obj?.head(obj, "c", b, 0, true) -"a" == obj.a -"a" == obj.b -"a" == obj.obj -"a" == obj?.a -"a" == obj?.b -"a" == obj?.head(-0.5) -"a" == obj?.head(filter("a", false)) -"a" == obj?.obj -"a" == s && ok -"a" == s == ok -"a" == s ? s : f -"a" > s or obj.fn(b) -"a" >= "a" && 0 == a -"a" >= "b" || obj?.head(div, 2, div) -"a" >= "b" || obj?.obj -"a" >= obj.head(string(s contains "b")) -"a" >= obj?.head(s) -"a" >= s ? s : string(s) -"a" contains "c" && any(arr, true) -"a" contains "c" == obj?.a -"a" contains s and obj?.obj -"a" contains s and ok -"a" endsWith s != ok -"a" endsWith s || obj?.head(div) -"a" in obj && obj.head(1) -"a" in obj.obj -"a" in obj?.obj -"a" matches "b" || obj?.b -"a" matches s and obj?.b -"b" != "b" == true ? b : nil -"b" != obj.a -"b" != obj.b -"b" != obj.head(f) -"b" != obj.obj -"b" != obj.obj.a -"b" != obj.obj?.a -"b" != obj?.a -"b" != obj?.b -"b" != obj?.fn(a) -"b" != obj?.obj -"b" != obj?.obj.obj -"b" != s or ok -"b" + "a" contains s + s -"b" + s == obj.a -"b" + s in obj ? div : f -"b" < "c" != ok -"b" < "c" && obj.head(div, b, b) -"b" < s and obj?.head(div, ok) -"b" <= "a" and ok -"b" <= "a" or obj?.a -"b" <= "b" and nil == ok -"b" <= obj.head(s) -"b" == obj.a -"b" == obj.b -"b" == obj.obj -"b" == obj.obj?.obj -"b" == obj?.a -"b" == obj?.b -"b" == obj?.head(div) -"b" == obj?.obj -"b" == obj[string(add)] -"b" == s != obj.b -"b" == s == obj.obj -"b" > "b" ? f : obj -"b" > "b" and !true -"b" > s && arr != arr -"b" contains "b" || obj.a -"b" endsWith "b" || add != obj.a -"b" in obj.obj -"b" in obj?.head(obj?.obj) -"b" in obj?.obj -"b" matches obj?.head(s) -"b" startsWith s ? a : s -"b" startsWith s or ok -"b" startsWith s || true && false -"c" != "a" || ok -"c" != "a" || ok ? add : add -"c" != "b" && a > a -"c" != "c" == ok -"c" != nil || false or ok -"c" != obj.a -"c" != obj.b -"c" != obj.fn(b) -"c" != obj.obj -"c" != obj.obj?.b -"c" != obj?.a -"c" != obj?.b -"c" != obj?.head(obj?.obj) -"c" != obj?.obj -"c" != obj?.obj.a -"c" != obj?.obj?.b -"c" != s != ok -"c" + s matches s -"c" < "b" != ok -"c" < s == obj.obj -"c" < s ? add : min(0.5) -"c" < s || obj?.fn(b) -"c" == obj.a -"c" == obj.b -"c" == obj.head(0 ^ b) -"c" == obj.obj -"c" == obj.obj?.b -"c" == obj?.a -"c" == obj?.b -"c" == obj?.obj -"c" == s and "c" < "b" -"c" == s || false != nil -"c" > "a" && obj.b -"c" > "c" and obj?.b -"c" > s ? obj : s -"c" >= "b" or obj.fn("c") -"c" >= s ? arr : obj.b -"c" contains "c" || 1 >= a -"c" contains s && obj?.obj.a -"c" endsWith s == obj?.obj -"c" endsWith s or s < s -"c" endsWith s || ok -"c" in obj or obj?.obj -"c" in obj || true ? b : div -"c" in obj.head(arr) -"c" in obj.obj -"c" in obj?.obj -"c" matches s && obj?.obj -"c" matches s ? div : add -"c" startsWith "c" && ok -"c" startsWith "c" ? s : ok -"c" startsWith s and nil != 1 -(0 % a) ^ (a * f) -(0 * 0) ^ f -(0 * 2) ^ obj?.head(1, "b", s, a, s) -(0 * f) ^ f -(0 + 0) ^ obj?.a -(0 + 0.5) ^ (a - b) -(0 + 1) ^ a ^ f -(0 + 2) ^ (a - f) -(0 + a) % a -(0 + a) ^ a -(0 + b) ** b -(0 + f) * f -(0 + f) / b -(0 + f) / obj.b -(0 + f) ^ f -(0 - 0) * f -(0 - 0) ^ (f * b) -(0 - a) * a -(0 - a) ^ a -(0 - b) / 0.5 ** f -(0 - b) / a -(0 - b) ^ f -(0 - f) * max(0) -(0 / 0) ^ f -(0 / 2) ^ obj?.b -(0.5 * 0) ** (0 * 2) -(0.5 * a) ** a -(0.5 * b) ^ obj.a -(0.5 * f) ** f -(0.5 + a) / f -(0.5 + b) ** b -(0.5 + b) ^ obj.b -(0.5 - f) / b -(0.5 / a) ^ a -(0.5 / f) ** max(0.5) -(0.5 / f) ^ obj?.a -(1 % a) ^ obj.head(2) -(1 * a) ^ a -(1 - 0) / f -(1 - 2) ** (a * a) -(1 - b) ^ min(0) -(1 - f) / a -(1 - f) ^ b -(1 / 0) ** obj?.a -(1 / 0) ^ f -(1 / 0.5 + f) * f -(1 / b) ^ f -(1 / f) ** a -(1 / f) ** b -(2 % a) ** f -(2 % a) ^ -b -(2 % b) ** b -(2 % b) ** f -(2 % b) ** obj?.head(f, add, ok, false) -(2 * a) ^ b -(2 + 0) ** a -(2 + 0.5) / min(f) -(2 + 2) ^ len(s) * f -(2 + f) * a ** 0 -(2 + f) ** b -(2 - 2) ** -0 -(2 - 2) ** b -(2 - 2) / f -(2 - a) ^ a -(2 - a) ^ add(0, a) -(2 - f) / obj.a -(2 / f) ** (a - f) -(2 / f) ^ f == b -(2 / f) ^ obj.a -(a % 2) ^ b -(a % a) ** obj.head(b, b) -(a * a) ** f -(a * a) ** obj.b -(a * f) ^ a -(a * f) ^ f ** a -(a + 0) % a -(a + 0) / obj.b -(a + a) % obj?.a -(a + a) / b -(a + b) % a -(a + b) % add(a, b) -(a - 0) / a -(a - 0) / b -(a - 0) ^ int(b) -(a - 0.5) / (0.5 + 0) -(a - 0.5) / obj.head(a) -(a - 0.5) / obj?.b -(a - 0.5) ^ b -(a - 1) ^ f -(a - 2) % a -(a - a) % b -(a - b) * b -(a - b) ** a ** 0 -(a - b) ^ f -(a - f) * b -(a - f) * f -(a - f) * obj.head(f) -(a - f) ^ a -(a / 1) ** f -(a / b) ^ f -(a / f) ** a -(a / f) ^ b -(a / f) ^ min(0) -(b % 2) ** b -(b % 2) ^ add(b, b) -(b % a) ^ b -(b * 0) ** a -(b * 0) ** f -(b * a) ** a -(b * b) ^ a ** 0 -(b * f) ^ float(a) -(b + 0) * div(b, b) -(b + 0) / b -(b + 0.5) ** f -(b + 2) % b -(b + 2) ** f -(b + a) ** f -(b + b) * a -(b + b) ^ b -(b + b) ^ obj?.b -(b + f) / b -(b + f) ^ a -(b - 0) * b -(b - 0) / b != f -(b - 1) * obj?.b -(b - 1) / a -(b - a) ** obj.a -(b - a) / a -(b - b) * b -(b - f) * f -(b - f) ** b -(b - f) ^ (a - 1) -(b / 0) ^ f -(b / 1) ** b -(b / a) ^ (b / 1) -(b / a) ^ obj?.obj.obj?.b -(b / b) ** f -(f * 0.5) ** obj?.a -(f * a) ** obj.fn(1) -(f * b) ** f -(f * b) ^ f -(f * f) ** a ** a -(f * f) ** b -(f * f) ** f -(f * f) ^ b -(f + 0) * b ^ b -(f + 0) ** f -(f + 0.5) ^ f -(f + a) * a -(f + a) ** f -(f + a) ** obj?.a -(f + b) * f -(f + b) ** add(2, b) -(f + b) ** obj.b -(f + f) * b -(f + f) ** arr[2] -(f + f) / b -(f + f) ^ (1 / 2) -(f + f) ^ arr[a] -(f + f) ^ b -(f + f) ^ f -(f - 0) ** obj?.fn(b) -(f - 0) / a -(f - 0) ^ (f / 0.5) -(f - 0) ^ a -(f - 0.5) * f -(f - 0.5) / f -(f - 0.5) ^ a -(f - 2) * a -(f - a) * -a -(f - a) ** b ^ f -(f - a) / add(a, b) -(f - b) ** b -(f / a) ^ f -(f / a) ^ obj.b -(f / b) ** b -(false or false) != obj?.b -(false or false) and s >= "b" -(false or true) != obj.head(add) -(false || true) == obj?.b -(min(f, f) / b) ** (b % obj?.b) -(ok ? true : 0) ? div : arr -(ok ? true : 0) ? obj?.b : (true ? false : true) -(ok and ok) != ok -(ok or false) and false ? 2 : div -(ok or ok) == obj?.a -(ok or ok) == ok -(ok or ok) and obj.obj?.a -(ok or true) and ok -(ok || ok) == ok -(ok || ok) and obj.obj -(ok || ok) and ok -(true and true) != obj.a -(true or ok) != ok -(true || false) and a == 0.5 -(true || ok) == obj.a -(true || true) != a + obj?.b --((f - 1) ** len(s)) --(0 % 1) --(0 % 2) --(0 % a) --(0 % b) --(0 * 0) --(0 * b) --(0 * f * obj?.b) --(0 * f) --(0 ** 0) --(0 ** a) --(0 ** b) --(0 ** f) --(0 + 0) --(0 + 0.5) --(0 + 1) --(0 + 2) --(0 + a) --(0 + f) --(0 - 0) --(0 - 0.5) --(0 - 1) --(0 - 2) --(0 - a) --(0 - b) --(0 - f) --(0 / 0) --(0 / 0.5) --(0 / 2) --(0 / a) --(0 / b) --(0 / f) --(0 ^ 0) --(0 ^ 0.5) --(0 ^ 2) --(0 ^ a) --(0 ^ b) --(0 ^ f) +!true or !false +!true or nil != ok +!true || ok +"bar" != foo.Bar +"bar" != foo?.Bar +"bar" != foo?.String() +"bar" != nil and true ? i64 : 0.5 +"bar" + "foo" not endsWith greet("bar") +"bar" + foo.Bar +"bar" + foo?.Bar +"bar" + foo?.String() +"bar" < foo.Bar +"bar" < foo?.Bar +"bar" <= foo.Bar +"bar" <= foo.String() +"bar" <= foo?.Bar +"bar" == foo.Bar +"bar" == foo?.Bar +"bar" > foo.Bar +"bar" > foo.String() +"bar" > foo?.Bar +"bar" contains "bar" == ok +"bar" contains "foo" ? array : f64 +"bar" contains foo.Bar +"bar" contains foo?.Bar +"bar" contains foo?.String() +"bar" endsWith foo.Bar +"bar" endsWith foo?.Bar +"bar" endsWith foo?.String() +"bar" in foo || ok +"bar" matches "bar" != ok +"bar" matches foo.Bar +"bar" matches foo?.Bar +"bar" not contains foo.Bar +"bar" not contains foo.String() +"bar" not contains foo?.Bar +"bar" not endsWith foo.Bar +"bar" not endsWith foo?.Bar +"bar" not endsWith foo?.String() +"bar" not in list[i] +"bar" not matches "foo" ? i32 < 0.5 : ok +"bar" not matches foo.Bar +"bar" not matches foo.String() +"bar" not matches foo?.Bar +"bar" not startsWith "foo" ? add : ok +"bar" not startsWith foo.Bar +"bar" not startsWith foo?.Bar +"bar" startsWith foo.Bar +"bar" startsWith foo?.Bar +"foo" != "bar" != ok +"foo" != foo.Bar +"foo" != foo?.Bar +"foo" != foo?.String() +"foo" + "foo" not in foo +"foo" + foo.Bar +"foo" + foo.String() +"foo" + foo?.Bar +"foo" + foo?.String() +"foo" < "bar" and i32 != 0.5 +"foo" < "foo" ? list : f32 +"foo" < foo.Bar +"foo" < foo?.Bar +"foo" <= foo.Bar +"foo" <= foo?.Bar +"foo" == "foo" && i32 > 1 +"foo" == foo.Bar +"foo" == foo.String() +"foo" == foo?.String() +"foo" == nil ? foo : f64 +"foo" > "bar" && ok +"foo" > "foo" == not false +"foo" > foo?.Bar +"foo" > foo?.String() +"foo" >= foo.Bar +"foo" >= foo?.Bar +"foo" contains foo.Bar +"foo" contains foo?.Bar +"foo" endsWith foo.Bar +"foo" endsWith foo.String() +"foo" endsWith foo?.Bar +"foo" endsWith foo?.String() +"foo" in foo && nil == 1 +"foo" matches "bar" ? f64 > f64 : half +"foo" matches foo.Bar +"foo" matches foo.String() +"foo" matches foo?.Bar +"foo" not contains foo.Bar +"foo" not contains foo?.Bar +"foo" not endsWith foo.Bar +"foo" not endsWith foo?.Bar +"foo" not endsWith foo?.String() +"foo" not matches foo.Bar +"foo" not matches foo.String() +"foo" not matches foo?.Bar +"foo" not startsWith foo.Bar +"foo" not startsWith foo?.String() +"foo" startsWith foo.Bar +"foo" startsWith foo?.Bar +"foo" startsWith foo?.String() +("bar" not endsWith "bar") and i64 < i32 +("bar" not endsWith "foo") == ok +("bar" not in foo) == ok +("foo" not matches "bar") and false ? f64 : array +(0.5 * 0.5) ** f32 +(0.5 * 0.5) ** i +(0.5 * 0.5) ** i64 +(0.5 * 0.5) ^ f32 +(0.5 * 0.5) ^ i32 +(0.5 * f32) ** i +(0.5 * f64) ^ f32 +(0.5 * i32) ** f32 +(0.5 + 1) * i +(0.5 + 1) ** i64 +(0.5 + 1) / i +(0.5 + i64) / f32 +(0.5 - 0.5) ^ half(f64) +(0.5 - 1) * i64 +(0.5 - 1) ** i64 +(0.5 - f32) ** (0.5 * f64) +(0.5 - f64) * f64 +(0.5 - f64) / f32 +(0.5 - i) ^ f32 +(0.5 - i32) ** i64 +(0.5 - i32) ^ f64 +(0.5 / 0.5) ^ f64 +(0.5 / f32) ** f32 +(0.5 / f32) ^ i32 +(0.5 / f64) ** i +(0.5 / f64) ** i32 +(0.5 / i32) ** i +(0.5 / i64) ** f32 +(1 % i) ** f32 +(1 % i) ^ i +(1 % i64) ** f32 +(1 * 1) ** f64 +(1 * 1) ^ i +(1 * f32) ** f32 +(1 * i32) ** i +(1 * i64) ** i32 +(1 + 0.5) * f64 +(1 + 0.5) ^ i32 +(1 + 1) / i32 +(1 + 1) ^ i +(1 + f32) / f32 / i64 +(1 + f64) ** i64 +(1 + f64) / i32 +(1 + f64) ^ f64 +(1 + i32) / f32 +(1 + i64) / f64 +(1 - 0.5) / f64 +(1 - 0.5) ^ i32 +(1 - 1) * i +(1 - 1) * i32 +(1 - 1) ** f32 +(1 - 1) / i +(1 - f64) * 1 * i +(1 - f64) ^ i32 +(1 - i) ** i +(1 - i) / i64 +(1 - i32) ** i ^ 0.5 +(1 - i64) % i64 +(1 / 0.5) ^ f32 +(1 / 0.5) ^ f64 +(1 / 1) ** i32 +(1 / 1) ^ i32 +(1 / f64) ** f64 +(1 / i) ** i64 +(1 not in array) and none(list, true) +(f32 * 1) ** f32 +(f32 * 1) ** i64 +(f32 * i) ^ i64 +(f32 * i32) ** i +(f32 * i64) ** i64 +(f32 * i64) ^ i +(f32 + 0.5) / 0.5 ** 0.5 +(f32 + 1) ** i +(f32 + 1) / i +(f32 + 1) / i64 +(f32 + i32) ** i64 +(f32 + i64) ** i32 +(f32 - 0.5) * f64 +(f32 - 0.5) * i +(f32 - f32) ** f32 +(f32 - i) / f64 +(f32 - i) ^ i64 +(f32 - i64) * i64 +(f32 - i64) ** i64 +(f32 - i64) / i64 +(f32 / f64) ^ f32 +(f32 / f64) ^ i +(f32 / i32) ^ i32 +(f64 * 0.5) ^ i +(f64 * f64) ** i32 +(f64 * i64) ** i32 +(f64 + f32) ** i64 +(f64 + i32) * f32 +(f64 + i64) / i32 +(f64 - 0.5) * -i +(f64 - 0.5) * i +(f64 - 0.5) / f32 +(f64 - 0.5) / i64 +(f64 - 0.5) ^ i +(f64 - 0.5) ^ i64 +(f64 - 1) * f32 +(f64 - f32) * i64 +(f64 - f64) / i32 +(f64 - i) * i32 ** 1 +(f64 - i64) / i64 +(f64 / 0.5) ** f64 +(f64 / i) ^ i64 +(false || ok) and ok +(i % 1) ** -f32 +(i % 1) ** f64 +(i % i) ** f32 +(i * 1) ** i +(i * f32) ** i32 +(i * f32) ^ f64 +(i * i) ^ count(array, true) +(i + 0.5) ** i32 +(i + 0.5) ^ f32 +(i + 1) % i32 +(i + 1) / i64 +(i + f64) ^ (f32 * f64) +(i + i) * -f64 +(i + i32) ^ i64 +(i - 0.5) / f32 +(i - 0.5) ^ f64 +(i - 1) ** i64 +(i - 1) / f32 +(i - 1) ^ f64 +(i - i64) ** f64 +(i - i64) ^ i +(i / 0.5) ^ i32 +(i / 1) ** f64 +(i / 1) ** i64 +(i / i32) ^ f32 +(i < i32 ? nil : f64) ** f64 +(i32 * 1) ** f32 +(i32 * f32) ^ i64 +(i32 * i) ^ i +(i32 * i32) ** f64 +(i32 + 0.5) / f64 +(i32 + 0.5) ^ i64 +(i32 + 1) * f64 +(i32 + 1) ** float(1) +(i32 + 1) / i +(i32 + 1) / i64 +(i32 + f32) ** f32 +(i32 + f64) ** i +(i32 + i32) * i32 +(i32 + i32) / i64 +(i32 + i64) ^ i +(i32 - 0.5) * i64 +(i32 - f32) * i32 +(i32 - i32) ** i +(i32 - i32) ** i64 +(i32 / 0.5) ^ i32 +(i32 / i32) ^ f32 +(i32 / i32) ^ i +(i64 * 0.5) ^ f32 +(i64 * 1) ** i64 +(i64 * 1) ^ f32 +(i64 * 1) ^ f64 +(i64 * f32) ** findIndex(list, ok) +(i64 + 1) * i32 +(i64 + f32) ^ f64 +(i64 + f64) / 1 * 1 +(i64 + f64) ^ f64 +(i64 + i) ^ i64 +(i64 + i32) * f32 +(i64 - 0.5) * i64 +(i64 - 0.5) / i32 +(i64 - i) % i32 +(i64 - i32) / len(array) +(i64 - i64) / i64 +(i64 / f64) ** f32 +(i64 / i32) ** f32 +(i64 / i32) ** i +(i64 / i32) ^ -1 +(i64 not in array) && ok +(ok && ok) == ok +(ok or false) and ok +(ok or ok) == not false +(ok || true) && i32 >= f64 -(0.5 * 0.5) --(0.5 * 2) --(0.5 * a) --(0.5 * b) --(0.5 * f) --(0.5 ** 0) +-(0.5 * 1) +-(0.5 * f32) +-(0.5 * f64) +-(0.5 * i) +-(0.5 * i32) +-(0.5 * i64) -(0.5 ** 0.5) --(0.5 ** a) --(0.5 ** b) --(0.5 ** f) --(0.5 + 0) +-(0.5 ** 1) +-(0.5 ** f32) +-(0.5 ** f64) +-(0.5 ** i) +-(0.5 ** i32) +-(0.5 ** i64) +-(0.5 + 0.5) -(0.5 + 1) --(0.5 + 2) --(0.5 + a) --(0.5 + b) --(0.5 + f) --(0.5 - 0) +-(0.5 + f32) +-(0.5 + f64) +-(0.5 + i) +-(0.5 + i32) +-(0.5 + i64) -(0.5 - 0.5) -(0.5 - 1) --(0.5 - 2) --(0.5 - a) --(0.5 - b) --(0.5 - f) --(0.5 / 0) --(0.5 / 2) --(0.5 / a) --(0.5 / b) --(0.5 / f) +-(0.5 - f32) +-(0.5 - f64) +-(0.5 - i) +-(0.5 - i32) +-(0.5 - i64) +-(0.5 / 0.5) +-(0.5 / 0.5) < i32 +-(0.5 / 1) +-(0.5 / f32) +-(0.5 / f64) +-(0.5 / i) +-(0.5 / i32) +-(0.5 / i64) -(0.5 ^ 0.5) --(0.5 ^ 2) --(0.5 ^ a) --(0.5 ^ b) --(1 % 2) --(1 % a) --(1 % b) --(1 * 0) +-(0.5 ^ 1) +-(0.5 ^ f32) +-(0.5 ^ f64) +-(0.5 ^ i) +-(0.5 ^ i32) +-(0.5 ^ i64) +-(1 % 1) +-(1 % i) +-(1 % i32) +-(1 % i64) +-(1 * 0.5) -(1 * 1) --(1 * a) --(1 ** a) --(1 ** f) +-(1 * f32) +-(1 * i) +-(1 * i32) +-(1 * i64) +-(1 ** 0.5) +-(1 ** 1) +-(1 ** f32) +-(1 ** f64) +-(1 ** i) +-(1 ** i32) +-(1 ** i64) +-(1 + 0.5) -(1 + 1) --(1 + a) --(1 + b) --(1 - 0) --(1 - 0.5) / a --(1 - a) --(1 - b) --(1 - f) --(1 / 0) +-(1 + f32) +-(1 + f64) +-(1 + i) +-(1 + i32) +-(1 + i64) +-(1 - 0.5) +-(1 - 1) +-(1 - f32) +-(1 - f64) +-(1 - i) +-(1 - i32) +-(1 - i64) -(1 / 0.5) --(1 / 2) --(1 / f) +-(1 / 1) +-(1 / f32) +-(1 / f64) +-(1 / i) +-(1 / i32) +-(1 / i64) -(1 ^ 0.5) --(1 ^ b) --(1 ^ f) --(2 % a) --(2 % b) --(2 * 0) --(2 * 2) --(2 * b) --(2 * f) --(2 ** b) --(2 + 0.5) --(2 + a) --(2 + b) --(2 + f) --(2 - 0.5) --(2 - 2) --(2 - b) --(2 / 0) --(2 / 0.5) --(2 / a) --(2 ^ 1) --(2 ^ 2) --(2 ^ a) --(a % 1) --(a % 2) --(a % a) --(a % b) --(a * 0) --(a * 1) --(a * 2) --(a * a) --(a * b) --(a * f) --(a ** 0) --(a ** 0.5) --(a ** a) --(a ** b) --(a ** f) --(a + 0) --(a + 1) --(a + 2) --(a + a) --(a + b) --(a + f) --(a - 0) --(a - 1) --(a - 2) --(a - a) --(a - b) --(a - f) --(a / 0) --(a / 0.5) --(a / 1) --(a / 2) --(a / a) --(a / b) --(a ^ 0) --(a ^ 0.5) --(a ^ 2) --(a ^ a) --(a ^ b) --(a ^ f) --(b % 1) --(b % a) --(b % b) --(b % obj.a) --(b * 0) --(b * 0.5) --(b * 1) --(b * 2) --(b * a) --(b * b) --(b * f) --(b ** 0) --(b ** 0.5) --(b ** 1) --(b ** a) --(b ** b) --(b ** f) --(b + 0) --(b + 1) --(b + 2) --(b + a) --(b + b) --(b + f) --(b - 0.5) --(b - 1) --(b - 2) --(b - 2) - b --(b - a) --(b - b) --(b - f) --(b / 0) --(b / 0.5) --(b / 1) --(b / 2) --(b / a) --(b / b) --(b / f) --(b ^ 0) --(b ^ 0.5) --(b ^ 1) --(b ^ 2) --(b ^ a) --(b ^ b) --(b ^ f) --(f * 0) --(f * 0.5) --(f * 1) --(f * 2) --(f * a) --(f * b) --(f * f) --(f * int(a)) --(f ** 0) --(f ** 0.5) --(f ** 1) --(f ** a) --(f ** b) --(f ** f) --(f + 2) --(f + a) --(f + b) --(f + f) --(f + f) - b --(f - 0) --(f - 1) --(f - 2) --(f - a) --(f - b) --(f - f) --(f - obj.a) --(f / 0) --(f / 0.5) --(f / a) --(f / b) --(f / f) --(f ^ 0) --(f ^ 0.5) --(f ^ 1) --(f ^ 2) --(f ^ a) --(f ^ b) --(f ^ f) --(obj.fn(b) + b) --(obj.head(1) - a) --(obj.head(b, 2, f, nil) / obj.a) ---(a % b) ---(f ** a) ---0 +-(1 ^ 1) +-(1 ^ f32) +-(1 ^ f64) +-(1 ^ i) +-(1 ^ i32) +-(1 ^ i64) +-(f32 * 0.5) +-(f32 * 1) +-(f32 * f32) +-(f32 * f64) +-(f32 * i) +-(f32 * i32) +-(f32 * i64) +-(f32 ** 0.5) +-(f32 ** 1) +-(f32 ** f32) +-(f32 ** f64) +-(f32 ** i) +-(f32 ** i32) +-(f32 ** i64) +-(f32 + 0.5) +-(f32 + 1) +-(f32 + f32) +-(f32 + f64) +-(f32 + i) +-(f32 + i32) +-(f32 + i64) +-(f32 - 0.5) +-(f32 - 1) +-(f32 - f64) +-(f32 - i - f32) +-(f32 - i) +-(f32 - i32) +-(f32 - i64) +-(f32 / 0.5) +-(f32 / 1) +-(f32 / f32) +-(f32 / f64) +-(f32 / i) +-(f32 / i32) +-(f32 / i64) +-(f32 ^ 0.5) +-(f32 ^ 1) +-(f32 ^ f32) +-(f32 ^ i) +-(f32 ^ i32) +-(f32 ^ i64) +-(f64 * 0.5) +-(f64 * 1) +-(f64 * f32) +-(f64 * f64) +-(f64 * i) +-(f64 * i32) +-(f64 * i64) +-(f64 ** 0.5) +-(f64 ** 1) +-(f64 ** f32) +-(f64 ** f64) +-(f64 ** i) +-(f64 ** i32) +-(f64 ** i32) > i32 +-(f64 ** i64) +-(f64 + 0.5) +-(f64 + 1) +-(f64 + f32) +-(f64 + i) +-(f64 + i32) +-(f64 + i64) +-(f64 - 0.5) +-(f64 - 1) +-(f64 - f32) +-(f64 - f64) +-(f64 - i) +-(f64 - i32) +-(f64 - i64) +-(f64 / 0.5) +-(f64 / 1) +-(f64 / f32) +-(f64 / f64) +-(f64 / i) +-(f64 / i32) +-(f64 / i64) +-(f64 ^ 0.5) +-(f64 ^ 1) +-(f64 ^ f32) +-(f64 ^ f64) +-(f64 ^ i) +-(f64 ^ i32) +-(f64 ^ i64) +-(i % 1) +-(i % i) +-(i % i32) +-(i % i64) +-(i % score(1)) +-(i * 0.5) +-(i * 1) +-(i * f32) +-(i * f64) +-(i * i) +-(i * i32) +-(i * i64) +-(i ** 1) +-(i ** f32) +-(i ** f64) +-(i ** i) +-(i ** i32) +-(i ** i64) +-(i ** int(i)) +-(i + 0.5) +-(i + 1) +-(i + f32) +-(i + f64) +-(i + i) +-(i + i64) +-(i - 0.5) +-(i - 1) +-(i - f32) +-(i - f64) +-(i - i) +-(i - i32) +-(i / 0.5) +-(i / 1) +-(i / f32) +-(i / f64) +-(i / i) +-(i / i32) +-(i ^ 0.5) +-(i ^ 1) +-(i ^ f32) +-(i ^ f64) +-(i ^ i) +-(i32 % 1 % i) +-(i32 % 1) +-(i32 % i) +-(i32 % i32) +-(i32 % i64) +-(i32 * 0.5) +-(i32 * 1) +-(i32 * f32) +-(i32 * f64) +-(i32 * i) +-(i32 * i32) +-(i32 * i64) +-(i32 ** 0.5) +-(i32 ** 1) +-(i32 ** f32) +-(i32 ** i) +-(i32 ** i32) +-(i32 ** i64) +-(i32 + 0.5) +-(i32 + 1 ^ i64) +-(i32 + 1) +-(i32 + f32) +-(i32 + f64) +-(i32 + i) +-(i32 + i32) +-(i32 + i64) +-(i32 - 0.5) +-(i32 - 1) +-(i32 - f32) +-(i32 - f64) +-(i32 - i) +-(i32 - i32) +-(i32 - i64) +-(i32 / 0.5) +-(i32 / 1) +-(i32 / f32) +-(i32 / f64) +-(i32 / i) +-(i32 / i32) +-(i32 / i64) +-(i32 ^ 0.5) +-(i32 ^ 1) +-(i32 ^ f32) +-(i32 ^ f64) +-(i32 ^ i) +-(i64 % 1) +-(i64 % i) +-(i64 % i32) +-(i64 % i64) +-(i64 * 0.5) +-(i64 * 1) +-(i64 * f32) +-(i64 * f64) +-(i64 * i) +-(i64 * i32) +-(i64 * i64) +-(i64 ** 0.5) +-(i64 ** 1) +-(i64 ** f32) +-(i64 ** f64) +-(i64 ** i) +-(i64 ** i32) +-(i64 ** i64) +-(i64 + 0.5) +-(i64 + 1) +-(i64 + f32) +-(i64 + f64) +-(i64 + i) +-(i64 + i32) +-(i64 + i64) +-(i64 - 0.5) +-(i64 - 1) +-(i64 - f64) +-(i64 - i) +-(i64 - i32) +-(i64 - i64) +-(i64 / 0.5) +-(i64 / 1 / 1) +-(i64 / 1) +-(i64 / f32) +-(i64 / f64) +-(i64 / i) +-(i64 / i32) +-(i64 / i64) +-(i64 ^ 0.5) +-(i64 ^ 1) +-(i64 ^ f32) +-(i64 ^ f64) +-(i64 ^ i) +-(i64 ^ i32) +-(i64 ^ i64) +-(max(0.5) + i64) +--(1 * i64) +--(i64 * 1) +---1 +---i --0.5 --1 ---2 ---a ---abs(b) ---b ---f ---int(0.5) ---obj.a ---obj.b ---obj.b % b --0 != a ? ok : 0 --0 != b --0 != f --0 != obj.b --0 % a --0 * obj.fn(2) --0 ** a --0 ** b --0 - a --0 - abs(2) --0 - div(a, a) --0 - obj.a --0 - obj.b --0 .. 1 * a --0 .. obj.b --0 / b --0 / obj.a --0 / obj.head(1, a) --0 / obj?.a --0 < a --0 < b --0 < f --0 <= a --0 <= f --0 == a --0 == b / 0 --0 == nil ? b : obj --0 > b * f --0 > f --0 >= -0 --0 >= a --0 >= obj?.b --0 ^ -0 --0 ^ a --0 ^ b --0 ^ f --0 in arr --0.5 != 0.5 ? s : b --0.5 != a --0.5 != nil ? false : nil --0.5 * obj?.b --0.5 + b --0.5 - add(0, a) --0.5 - f --0.5 / a --0.5 / obj?.fn(a) --0.5 < f --0.5 <= f ? f : add --0.5 == 0 % b --0.5 >= 0 == ok --0.5 >= obj.b --0.5 ^ (a / b) --1 % a --1 * -b --1 ** b --1 ** obj.b --1 + b --1 - b --1 - f --1 .. obj?.a --1 / b --1 > 2 != nil --1 > a --1 > b --1 > obj?.b --1 >= f ? arr : div --1 ^ (f / a) --1 ^ b --1 ^ obj.head(a) --2 != b --2 != f --2 * f --2 ** f --2 ** min(0, f) --2 - 0.5 ^ 0 --2 .. -b --2 .. a --2 < abs(1) --2 < f ** a --2 < obj.b --2 == obj?.b --2 ^ a --2 ^ b --2 ^ f --a --a != f --a != obj.fn(a) --a != obj.obj?.a --a % int(a) --a * b --a * obj.a --a ** a --a ** f --a ** float(2) --a ** max(a) --a + b --a + obj.b --a - f --a .. a --a .. obj.a --a / f --a / max(0.5) --a < f --a < obj?.a --a <= a ** b --a == 0 + b --a == a --a > add(a, a) --a > b --a > get(arr, 1) --a > obj.b --a >= a - 0 --a >= obj?.b --a ^ a --a ^ f --abs(0) +--abs(f64) +--f32 +--f64 +--i +--i32 +--i64 +--max(0.5) +-0.5 != 1 ? array : f64 +-0.5 != f32 +-0.5 != f64 ** 0.5 +-0.5 != i32 +-0.5 != max(i64) +-0.5 * f64 +-0.5 * i +-0.5 * i32 +-0.5 * i64 +-0.5 * len(array) +-0.5 ** f32 +-0.5 ** i +-0.5 ** i32 +-0.5 ** i64 +-0.5 + f32 +-0.5 + f64 +-0.5 + f64 / f64 +-0.5 + i +-0.5 + i32 +-0.5 - -i32 +-0.5 - 1 + 1 +-0.5 - f32 +-0.5 - f64 +-0.5 - i +-0.5 - i32 +-0.5 - i32 * i +-0.5 / (f32 + 0.5) +-0.5 / -i32 +-0.5 / f32 +-0.5 / f64 +-0.5 / float(f64) +-0.5 / i +-0.5 / i64 +-0.5 / i64 ** 1 +-0.5 < f32 +-0.5 < f64 +-0.5 < i32 +-0.5 < i32 ? false : "bar" +-0.5 < i32 ^ f64 +-0.5 <= 1 == false +-0.5 <= f32 +-0.5 <= f64 +-0.5 <= f64 + f32 +-0.5 <= i64 +-0.5 == f32 +-0.5 == f64 / 0.5 +-0.5 == i +-0.5 == i32 +-0.5 == i64 +-0.5 > f32 +-0.5 > f64 +-0.5 > i32 +-0.5 > i64 +-0.5 >= f64 +-0.5 >= i +-0.5 >= i32 +-0.5 >= i64 +-0.5 ^ f32 +-0.5 ^ f64 +-0.5 ^ i +-0.5 ^ i32 +-0.5 ^ i64 +-1 != f64 +-1 != i +-1 != i64 +-1 != i64 * f32 +-1 % i32 +-1 % i64 +-1 * 1 ** i64 +-1 * f32 +-1 * i32 +-1 * i64 +-1 ** f32 +-1 ** i +-1 ** i64 +-1 + 1 + 0.5 +-1 + f32 +-1 + half(f64) +-1 + i +-1 + i64 +-1 - f32 +-1 - i +-1 - i32 +-1 - i64 +-1 .. i +-1 .. i32 +-1 .. i64 +-1 / 1 * 1 +-1 / f32 +-1 / i32 +-1 < 0.5 ^ i64 +-1 < f32 +-1 < f64 * 1 +-1 < i32 +-1 < i64 +-1 <= f32 +-1 <= f32 == true +-1 <= f64 +-1 <= i32 +-1 == f32 +-1 == f64 +-1 == nil != nil +-1 > -i32 +-1 > f32 +-1 > half(0.5) +-1 > i +-1 > i32 +-1 > i64 +-1 > i64 ? array : nil +-1 >= 0.5 * 0.5 +-1 >= f32 +-1 >= f64 +-1 >= i32 +-1 >= i32 - 1 +-1 >= i64 +-1 ^ f32 +-1 ^ f64 +-1 ^ i64 +-1 in array +-1 not in array +-abs(0.5 * f64) -abs(0.5) -abs(1) --abs(2 / f) --abs(2) --abs(a) --abs(b) --abs(f) --add(0, 0) --add(0, 2) --add(0, a) --add(0, b) --add(1, 0) +-abs(1) .. i +-abs(f32) +-abs(f64) +-abs(i) +-abs(i32) +-abs(i64) -add(1, 1) --add(1, 2) --add(1, a) --add(1, b) --add(2, 0) --add(a, 0) --add(a, 2) --add(a, a) --add(a, b) --add(b, 0) --add(b, 1) --add(b, 2) --add(b, a) --add(b, b) --add(b, ok ? a : "b") --arr[0] --arr[1] --arr[2] --arr[a] --arr[b] --b --b != a --b != b --b != f --b != obj.a --b % b --b % b % obj.b --b % obj.b --b % obj.fn(a) --b * a --b * b --b ** a --b + a --b + obj?.b --b - a --b - b --b - f --b - obj.a --b .. b --b / a ^ 0.5 --b / b --b / obj?.a --b < 2 / 0 --b < b --b < f --b <= f --b <= obj?.a --b <= obj?.b --b == int(0) --b == len("b") --b == max(0) --b > a --b > a * 0.5 --b > b --b > b ? b : 1 --b > div(2, b) --b > obj.b --b >= a --b >= b --b >= f --b >= f ? b : true --b >= obj.head(a) --b ^ (b - 0.5) --b ^ a --count(arr, false) --count(arr, ok) --count(arr, true) --div(0, 2) --div(0, a) --div(0, b) +-add(i, 1) +-array[1] +-array[i32] +-array[i64] +-array[i] +-count(array, false) +-count(array, ok) +-count(array, true) +-count(list, ok) +-count(list, true) -div(1, 1) --div(1, 2) --div(1, b) --div(2, 1) --div(2, 1) / a --div(2, a) --div(2, b) --div(a, 1) --div(a, 2) --div(a, a) --div(a, b) --div(a, obj.a) --div(b, 1) --div(b, a) --div(b, b) --f --f != a --f != f --f != f != true --f != len(s) --f != obj.b --f != obj.fn(b) --f * a --f * b ^ a --f ** -a --f ** b --f + a --f + b --f + f --f + int(b) --f + obj.a --f - a * 1 --f - arr[b] --f - b --f - f --f / add(a, b) --f / b --f / f --f / f ^ b --f < a --f < f ? ok : b --f < f ^ b --f < obj.a --f <= a --f <= f --f == add(0, b) --f == f --f == obj.obj --f == obj?.obj --f > a --f > f / a --f > len(s) --f > obj.a --f >= 0 / b --f >= a --f >= a * a --f >= b --f >= obj.a --f ^ a --f ^ a ** f --f ^ f --first(arr) --first(arr) < f --first(arr) ^ a --float(0) +-div(1, i) +-div(i, i) +-f32 +-f32 != 1 / i +-f32 != f32 +-f32 != f64 +-f32 != i64 +-f32 * 1 ** i32 +-f32 * f32 +-f32 ** f32 +-f32 ** f32 ** 1 +-f32 ** i64 +-f32 + f32 +-f32 + i32 +-f32 + i64 +-f32 - f32 +-f32 - f64 +-f32 - i +-f32 - i32 +-f32 - i64 +-f32 / f32 +-f32 / i32 +-f32 / i64 +-f32 < f64 +-f32 < i32 +-f32 < i64 +-f32 <= i +-f32 <= i32 +-f32 == f32 +-f32 == f64 +-f32 == i +-f32 == i32 +-f32 == i64 +-f32 > f32 +-f32 > f64 +-f32 > i +-f32 > i64 +-f32 >= 1 / f32 +-f32 >= f32 +-f32 >= f64 +-f32 >= i64 +-f32 ^ f32 +-f32 ^ f64 +-f32 ^ i64 +-f32 ^ min(f64) +-f64 +-f64 != f64 +-f64 != i +-f64 != i64 +-f64 * f64 +-f64 ** f32 +-f64 ** i32 +-f64 ** i64 +-f64 + f32 +-f64 + i32 +-f64 + i64 +-f64 - 0.5 / i32 +-f64 - f64 +-f64 - i32 +-f64 / f64 +-f64 / i +-f64 / i64 +-f64 < f32 +-f64 < i +-f64 <= f32 +-f64 <= f64 +-f64 <= i32 +-f64 == f32 +-f64 == i +-f64 == i32 +-f64 > f64 +-f64 > i32 +-f64 > i64 +-f64 >= f64 +-f64 >= f64 ^ 0.5 +-f64 >= i +-f64 ^ 0.5 ** i64 +-f64 ^ f32 +-f64 ^ f64 +-f64 ^ i +-f64 ^ i32 +-f64 ^ i64 +-find(array, ok) +-find(array, true) +-findIndex(array, ok) +-findIndex(array, true) +-findIndex(list, ok) +-findLast(array, ok) +-findLast(array, true) +-findLastIndex(array, ok) +-findLastIndex(array, true) +-findLastIndex(list, ok) +-findLastIndex(list, true) +-first(array) +-float(-1) -float(0.5) --float(2) --float(a) --float(b) --float(f) --get(arr, 0) --get(arr, 1) --get(arr, 2) --get(arr, a) --get(arr, b) --indexOf(s, "c") --indexOf(s, s) --int(0) +-float(1) +-float(f32 ** 0.5) +-float(f32) +-float(f64) +-float(i) +-float(i32) +-float(i64) +-get(array, 1) +-get(array, i) +-get(array, i32) +-get(array, i64) +-half(-1) +-half(0.5) +-half(f64) +-i +-i != f64 +-i != i32 +-i != i32 * 1 +-i != i64 +-i % i +-i % i32 +-i % i64 +-i * f32 +-i * f64 +-i * i32 +-i * i64 +-i ** f32 +-i ** f64 +-i ** i32 +-i ** i64 +-i + f32 +-i + i +-i + i32 +-i + i64 +-i - f32 +-i - f64 +-i - i +-i - i64 +-i .. i32 +-i / f64 +-i / i +-i / i32 +-i / i64 +-i < f32 +-i < i64 +-i <= f32 +-i <= i32 +-i == -0.5 +-i == 1 ** f64 +-i == 1 + 0.5 +-i > f32 +-i > i +-i > i32 +-i >= f32 +-i >= i32 +-i ^ -i +-i ^ f64 +-i ^ i32 +-i not in array +-i32 +-i32 != f32 +-i32 != f64 +-i32 != i +-i32 != i64 +-i32 % i32 +-i32 % i64 +-i32 * f32 +-i32 * f64 +-i32 * i +-i32 * i32 +-i32 ** f64 +-i32 ** i32 +-i32 ** i64 +-i32 + 1 + i +-i32 + f32 +-i32 + f64 +-i32 + i +-i32 + i32 +-i32 - i32 +-i32 - i64 +-i32 .. i +-i32 .. i64 +-i32 / (i32 - f64) +-i32 / f64 +-i32 / i +-i32 < 0.5 * 1 +-i32 < f32 +-i32 < f64 - f64 +-i32 < i32 +-i32 < i64 +-i32 <= 0.5 ? f64 : 1 +-i32 <= f32 +-i32 <= f64 +-i32 <= f64 + i +-i32 == f32 +-i32 == i32 +-i32 > i +-i32 > i32 +-i32 > i64 +-i32 >= f32 +-i32 >= f64 +-i32 >= i64 +-i32 ^ (i - 0.5) +-i32 ^ i +-i32 ^ i32 +-i32 ^ i64 +-i32 ^ i64 ** i32 +-i32 in array +-i32 not in array +-i64 +-i64 != i +-i64 != i ? i : foo +-i64 != i64 +-i64 % i +-i64 % i32 +-i64 * f32 +-i64 * f64 +-i64 * i +-i64 * i32 +-i64 * i64 +-i64 ** f64 +-i64 ** i64 +-i64 + 0.5 * i32 +-i64 + f64 +-i64 + i +-i64 - f32 +-i64 - f64 +-i64 - i32 +-i64 - i64 +-i64 .. i +-i64 .. i32 +-i64 / f32 +-i64 / i +-i64 / i64 +-i64 / i64 * f32 +-i64 < -0.5 +-i64 < f32 +-i64 < f64 +-i64 < i +-i64 < i32 +-i64 < i64 +-i64 <= i32 +-i64 <= i64 +-i64 == f32 +-i64 == i +-i64 == i32 +-i64 == i64 +-i64 > f32 +-i64 > f64 +-i64 > i32 +-i64 >= i +-i64 >= i32 +-i64 >= i64 +-i64 ^ f64 +-i64 ^ i32 +-i64 ^ i64 +-i64 not in array +-i64 not in sort(array) -int(0.5) -int(1) --int(2) --int(a) --int(b) --int(f) --int(obj?.a) --last(arr) --len("b") --len(arr) --len(map(arr, obj)) --len(obj) --len(s) --max(0) +-int(f32) +-int(f64) +-int(i) +-int(i32) +-int(i64 - i) +-int(i64) +-int(int(1)) +-last(array) +-len("bar") +-len("foo") +-len([foo]) +-len(array) +-len(false ? greet : "foo") +-len(list) +-max(0.5 * i) -max(0.5) --max(0.5, f) +-max(0.5, 1) -max(1) --max(1, 2) --max(1, a) --max(2) --max(a) --max(a, f) --max(b) --max(b, 0, f) --max(f) --max(f, b) --min(0) --min(0, b) --min(0.5, b) +-max(f32) +-max(f32, 0.5, f32) +-max(f32, i64) +-max(f64) +-max(i) +-max(i, 1) +-max(i, i64) +-max(i32) +-max(i32, 0.5) +-max(i64) +-max(score(1)) +-min(0.5) +-min(0.5, 1) +-min(0.5, i32) -min(1) --min(2) --min(a) --min(a, b) --min(b) --min(b, 1) --min(f) --min(f, 0) --obj.a --obj.a > f --obj.a ^ b --obj.b --obj.fn(0) --obj.fn(1) --obj.fn(2) --obj.fn(a - b) --obj.fn(a) --obj.fn(b) --obj.fn(count("c", true)) --obj.head(0) --obj.head(0, arr) --obj.head(0, obj) --obj.head(0, s) --obj.head(0.5) --obj.head(0.5, add) --obj.head(0.5, b, add) --obj.head(0.5, div, ok) --obj.head(0.5, f) --obj.head(0.5, true) --obj.head(1) --obj.head(1, "a", nil) --obj.head(1, f) --obj.head(1, ok, arr) --obj.head(2) --obj.head(2, 1, b) --obj.head(2, arr) --obj.head(2, ok, 2) --obj.head(a) --obj.head(a, div, "a", b) --obj.head(a, f, add, "a") --obj.head(a, nil) --obj.head(a, true, obj) --obj.head(b) --obj.head(b, "b", s, ok) --obj.head(b, add) --obj.head(b, b, ok, obj) --obj.head(b, f) --obj.head(b, nil, add, ok) --obj.head(b, nil, f) --obj.head(b, nil, true) --obj.head(f) --obj.head(f, 0, add) --obj.head(f, b) --obj.head(f, ok) --obj.head(first("a")) --obj.head(obj, 0.5)?.b --obj.obj.a --obj.obj.b --obj.obj.obj?.a --obj.obj.obj?.b --obj.obj?.a --obj.obj?.b --obj.obj?.obj?.obj --obj?.a --obj?.a != a --obj?.a > b --obj?.b --obj?.fn(0) --obj?.fn(1) --obj?.fn(2) --obj?.fn(a) --obj?.fn(b) --obj?.head(0) --obj?.head(0, 0.5, s) --obj?.head(0, 2) --obj?.head(0, add) --obj?.head(0, b) --obj?.head(0, nil) --obj?.head(0, nil, obj, obj, 2) --obj?.head(0, obj, ok, nil) --obj?.head(0, s) --obj?.head(0.5) --obj?.head(0.5, a) --obj?.head(0.5, add) --obj?.head(0.5, f, arr) --obj?.head(0.5, obj) --obj?.head(1) --obj?.head(2) --obj?.head(a) --obj?.head(a, "c", "a") --obj?.head(a, 0, f, b, a) --obj?.head(a, 1, a) --obj?.head(a, a) --obj?.head(a, obj, obj) --obj?.head(a, ok, b) --obj?.head(a, s) --obj?.head(b) --obj?.head(b, 0) --obj?.head(b, 0, obj) --obj?.head(b, 0.5, arr) --obj?.head(b, 1) --obj?.head(b, false, add) --obj?.head(b, nil) --obj?.head(b, ok) --obj?.head(f) --obj?.head(f, add, ok) --obj?.head(f, obj) --obj?.head(f, obj, 0) --obj?.head(f, ok) --obj?.head(f, true, nil) --obj?.head(min(nil, 2, a), a) --obj?.obj.a --obj?.obj.b --obj?.obj?.a --obj?.obj?.b --obj?.obj?.obj.b --obj?.obj?.obj?.obj -0 != 0.5 == obj?.head(a) -0 != 0.5 ? s <= s : obj?.head(false) -0 != 2 && s != "c" -0 != a || a != f -0 != arr[b] -0 != arr[obj.a] -0 != b and f != 0 -0 != b and obj.head(b, "b", div) -0 != b || obj.b -0 != b || obj.obj -0 != f or 0.5 == 1 -0 != nil and obj?.b -0 != obj.a -0 != obj.a % a -0 != obj.b -0 != obj.head(arr) -0 != obj.head(obj) -0 != obj.obj -0 != obj.obj?.a -0 != obj.obj?.obj -0 != obj.obj?.obj?.b -0 != obj?.a -0 != obj?.b -0 != obj?.b ^ b -0 != obj?.head(b) -0 != obj?.head(ok, a) -0 != obj?.obj -0 != obj?.obj.a -0 % 1 - obj.b -0 % 1 < b ^ 0 -0 % 1 == f -0 % 1 >= obj.a -0 % a - b -0 % a < a -0 % a <= a * f -0 % arr[b] -0 % b != f -0 % b % div(b, b) -0 % b * a -0 % b * f -0 % b + add(a, a) -0 % b + b -0 % b + obj?.a -0 % b / b / 0.5 -0 % b == obj.head(s, 0) -0 % b >= a -0 % obj.a -0 % obj.b -0 % obj?.a -0 % obj?.b -0 % obj?.fn(b) -0 % obj?.head(b) -0 % obj?.obj.b -0 * 0 / b -0 * 0 < f -0 * 0 <= a -0 * 0 <= obj.a -0 * 0 == a -0 * 0 >= a -0 * 0.5 + a -0 * 0.5 / b -0 * 0.5 < b -0 * 0.5 <= int(a) -0 * 0.5 >= max(0) -0 * 1 < 0 - a -0 * 1 == a -0 * 1 > f -0 * a + obj?.b -0 * a / f -0 * a == f ** 0 -0 * a == obj[s] -0 * a > f -0 * a in arr -0 * arr[0 - 0] -0 * arr[b] -0 * b != f -0 * b * f -0 * b + f -0 * b + obj?.a -0 * b < obj.b -0 * b == b -0 * f != a -0 * f != a % 1 -0 * f != f -0 * f * b -0 * f + b -0 * f - b -0 * f < obj?.b -0 * f < obj?.head(f, obj) -0 * f <= b + 0 -0 * f <= obj.a -0 * f >= b ^ 2 -0 * obj.a -0 * obj.b -0 * obj.head(b + f) -0 * obj?.a -0 * obj?.b -0 * obj?.fn(abs(obj.b)) -0 ** 0 - f -0 ** 0 <= f != ok -0 ** 0 ^ a -0 ** 0.5 + a -0 ** 0.5 - b -0 ** 0.5 <= a -0 ** 0.5 <= f -0 ** 0.5 <= obj.fn(a) -0 ** 0.5 ^ (b - 0) -0 ** 1 * add(0, a) -0 ** 1 > b -0 ** 2 * f -0 ** 2 * obj?.b -0 ** 2 <= a ? true : div -0 ** 2 > b -0 ** a * -2 -0 ** a == b -0 ** a ^ (0 % 2) -0 ** b != f -0 ** b - b ^ 2 -0 ** b > f ? s : add -0 ** f * obj?.b -0 ** f + b -0 ** f > f -0 ** f >= f -0 ** obj.a -0 ** obj.b -0 ** obj?.a -0 ** obj?.b -0 ** obj?.head(b) -0 + 0 == obj?.a -0 + 0.5 == obj?.head(nil, true, b, arr) -0 + 2 < f -0 + a != f -0 + a + b -0 + a .. a -0 + a .. get(arr, 0) -0 + a > b -0 + b + a -0 + b < a -0 + b == f * f -0 + f - b -0 + f < obj.a -0 + f < obj.b -0 + f > b -0 + f >= a -0 + obj.a -0 + obj.a != div -0 + obj.b -0 + obj.b == s -0 + obj.obj?.b -0 + obj?.a -0 + obj?.b -0 - 0 .. obj?.a -0 - 0 in arr -0 - 0.5 != obj.b -0 - 0.5 >= obj.a -0 - 1 + a -0 - 1 + b -0 - 1 > obj.head(f, a) -0 - a - a -0 - a .. a -0 - a < a -0 - a <= a -0 - a > a -0 - a >= a -0 - b .. obj?.b -0 - b < 0 / 2 -0 - b < a -0 - b < obj.a -0 - b <= a -0 - b >= b -0 - b in arr -0 - f != 0.5 == false -0 - f + div(b, a) -0 - f < a -0 - f <= b -0 - obj.a -0 - obj.b -0 - obj.obj.b -0 - obj?.a -0 - obj?.b -0 .. b != arr -0 .. obj.a -0 .. obj.b -0 .. obj.fn(a) -0 .. obj.obj.a -0 .. obj?.a -0 .. obj?.b -0 .. obj?.obj.a -0 / 0 - f -0 / 0 > f ? arr : b -0 / 0.5 - a -0 / 1 / abs(0) -0 / 1 > b -0 / 2 <= b -0 / a != f / f -0 / arr[a] -0 / arr[b] -0 / b != f + 2 -0 / b * obj.b -0 / b / a -0 / b == obj?.a -0 / b >= f -0 / f / f -0 / f == b -0 / obj.a -0 / obj.b -0 / obj.head(min(a), arr in arr) -0 / obj?.a -0 / obj?.b -0 / obj?.fn(true and 2) -0 / obj?.obj?.a -0 < 0 && obj?.obj -0 < 0 and obj?.fn(s, arr).b -0 < 0.5 == ok -0 < 1 || !ok -0 < a && "c" in obj -0 < arr[a] -0 < b != obj?.b -0 < b && 2 <= b -0 < f && ok -0 < f && true ? nil : 1 -0 < f or a in arr -0 < obj.a -0 < obj.b -0 < obj.obj?.a -0 < obj?.a -0 < obj?.b -0 <= 0 and obj.a -0 <= 0 or obj?.b -0 <= 0.5 != obj?.obj -0 <= 0.5 and one(arr, true) -0 <= 1 and 0 >= f -0 <= a == none(arr, false) -0 <= a || ok ? f : obj -0 <= b ? a <= a : f -0 <= obj.a -0 <= obj.b -0 <= obj?.a -0 <= obj?.b -0 <= obj?.obj.b -0 <= obj?.obj?.b -0 == 0 and div == nil -0 == 2 or ok -0 == a != ok -0 == b or ok -0 == b || ok -0 == f == !true -0 == f and obj?.a -0 == nil or one(arr, true) -0 == nil || obj.b -0 == obj.a -0 == obj.b -0 == obj.obj -0 == obj.obj.a -0 == obj?.a -0 == obj?.b -0 == obj?.head(!(obj != div)) -0 == obj?.head(arr) -0 == obj?.head(obj) -0 == obj?.obj -0 == obj?.obj.b -0 == obj[toJSON(nil)] -0 > 0 != nil == ok -0 > 0.5 ? add : ok -0 > 1 ? s : s -0 > 2 && ok -0 > a || 0 != 2 -0 > b != obj.a -0 > b && "b" == s -0 > b == ok -0 > b or 0 == nil -0 > f && 0 != b -0 > f && obj.head(s) -0 > obj.a -0 > obj.b -0 > obj.fn(obj?.b) -0 > obj?.a -0 > obj?.b -0 > obj?.fn(a) -0 > obj?.head(b) -0 > obj?.obj.a -0 >= 0.5 and ok ? arr : s -0 >= 2 && obj?.a -0 >= b != ok ? b : nil -0 >= b && obj?.fn(true) -0 >= b == obj?.head(b, s) -0 >= b and b in obj?.obj -0 >= f && obj.head(obj) -0 >= f or ok -0 >= obj.a -0 >= obj.b -0 >= obj.head(obj?.fn(b)) -0 >= obj?.a -0 >= obj?.b -0 >= obj?.obj.b -0 >= obj?.obj?.a -0 ^ 0 / f -0 ^ 0 == f -0 ^ 0.5 ** obj?.a -0 ^ 0.5 - b -0 ^ 0.5 <= f -0 ^ 1 * a -0 ^ 2 < a / b -0 ^ 2 < f -0 ^ 2 ^ f -0 ^ a != a / a -0 ^ a + b -0 ^ a - obj.a -0 ^ a - obj?.b -0 ^ a < a -0 ^ a <= b -0 ^ b != b -0 ^ b - -b -0 ^ b / b -0 ^ b >= b -0 ^ b ^ f -0 ^ f < obj.b -0 ^ f <= obj?.a -0 ^ f > f -0 ^ obj.a -0 ^ obj.b -0 ^ obj.obj.b -0 ^ obj.obj?.a -0 ^ obj?.a -0 ^ obj?.b -0 in arr or s != nil -0 in arr || ok -0.5 != 0 == ok -0.5 != 0 and ok -0.5 != 0 || obj?.a -0.5 != 0.5 == true ? a : arr -0.5 != 0.5 || nil != s -0.5 != 1 && s <= "b" -0.5 != a || obj?.obj -0.5 != b and false ? nil : add -0.5 != b or ok -0.5 != f and ok -0.5 != nil && s >= s -0.5 != obj.a -0.5 != obj.b -0.5 != obj.obj -0.5 != obj.obj.obj -0.5 != obj?.a -0.5 != obj?.b -0.5 != obj?.head(arr, obj) -0.5 != obj?.obj -0.5 != obj?.obj.b -0.5 * 0 >= obj.head(a) -0.5 * 0.5 * f -0.5 * 0.5 / add(b, 0) -0.5 * 0.5 < f ? obj : obj -0.5 * 1 < f -0.5 * a < f -0.5 * a == f -0.5 * a >= 0.5 ? "b" : b -0.5 * arr[a] -0.5 * b <= f -0.5 * f < div(b, b) -0.5 * f > div(a, b) -0.5 * f > f -0.5 * obj.a -0.5 * obj.b -0.5 * obj.fn(b) -0.5 * obj.obj?.a -0.5 * obj?.a -0.5 * obj?.b -0.5 * obj?.head(obj.a) -0.5 * obj?.obj?.b -0.5 ** 0 / a -0.5 ** 0 <= b -0.5 ** 0 ^ a -0.5 ** 0.5 > f -0.5 ** 0.5 >= f -0.5 ** 1 != b -0.5 ** 1 > b -0.5 ** a + b -0.5 ** a > b -0.5 ** a > b ** 0 -0.5 ** a >= b -0.5 ** a ^ obj?.b -0.5 ** arr[b] -0.5 ** arr[obj.a] -0.5 ** b < a + b -0.5 ** b > a -0.5 ** b ^ obj?.a -0.5 ** f * f -0.5 ** f ** (a - 0) -0.5 ** f <= -a -0.5 ** f <= a -0.5 ** f >= b -0.5 ** obj.a -0.5 ** obj.b -0.5 ** obj.obj?.a -0.5 ** obj?.a -0.5 ** obj?.b -0.5 ** obj?.obj?.b -0.5 + 0 >= b ? f : s -0.5 + 2 + a -0.5 + 2 + b ^ a -0.5 + a - -0 -0.5 + a - f -0.5 + f != obj?.b -0.5 + f == b / f -0.5 + obj.a -0.5 + obj.b -0.5 + obj?.a -0.5 + obj?.b -0.5 - 0.5 > 0.5 - b -0.5 - 1 + b -0.5 - a != f + b -0.5 - f != obj.head(s) -0.5 - f - div(b, a) -0.5 - f < f * a -0.5 - f == obj.a -0.5 - obj.a -0.5 - obj.b -0.5 - obj.head(f) -0.5 - obj.head(min(0, b)) -0.5 - obj.obj.a -0.5 - obj?.a -0.5 - obj?.a * b > obj?.a -0.5 - obj?.b -0.5 - obj?.obj.a -0.5 - obj?.obj.b -0.5 - obj?.obj?.b -0.5 / 0 * b -0.5 / 0.5 * div(0, b) -0.5 / 0.5 - b -0.5 / 1 < b -0.5 / 1 == obj.a -0.5 / a * a -0.5 / a <= b ? f : div -0.5 / a > obj.head(b, s) -0.5 / arr[a % 1] -0.5 / b != f -0.5 / b / f -0.5 / b == get(arr, b) -0.5 / b > a -0.5 / b >= a -0.5 / obj.a -0.5 / obj.b -0.5 / obj.obj.a -0.5 / obj?.a -0.5 / obj?.b -0.5 / obj?.obj.a -0.5 / obj?.obj.b -0.5 < 0 && true ? ok : obj -0.5 < 0 or obj?.b -0.5 < 0 or obj?.obj -0.5 < 0 || obj?.obj -0.5 < 0 || ok -0.5 < 0.5 && !false -0.5 < 0.5 ? b - a : s -0.5 < 0.5 in obj.head(arr, ok) -0.5 < f != ok -0.5 < obj.a -0.5 < obj.b -0.5 < obj.fn(a) -0.5 < obj?.a -0.5 < obj?.b -0.5 <= 0 || arr != arr -0.5 <= a != ok -0.5 <= arr[b] -0.5 <= b || obj.fn(true).a.obj -0.5 <= f && ok -0.5 <= f == obj.b -0.5 <= obj.a -0.5 <= obj.b -0.5 <= obj?.a -0.5 <= obj?.b -0.5 <= obj?.b * b -0.5 == 1 and obj.head(obj, f, true) -0.5 == 2 || 0.5 < 0 -0.5 == a && obj?.b -0.5 == b && ok -0.5 == f != obj.a -0.5 == f ? 0.5 ** 0 : div -0.5 == f ? ok : obj -0.5 == f or ok -0.5 == nil != obj.obj -0.5 == nil == obj.fn(b) -0.5 == nil == obj.obj -0.5 == obj.a -0.5 == obj.a + b -0.5 == obj.b -0.5 == obj.fn(a) -0.5 == obj.fn(b) -0.5 == obj.head(s == add, arr) -0.5 == obj.obj -0.5 == obj?.a -0.5 == obj?.b -0.5 == obj?.fn(a) -0.5 == obj?.obj -0.5 > 0 == obj?.b -0.5 > 0 ? b : b -0.5 > 0.5 ? a ** 1 : add -0.5 > 0.5 and obj?.a -0.5 > 1 == true ? add : nil -0.5 > a != not false -0.5 > a == ok -0.5 > b ? a : obj -0.5 > f ? (false ? arr : ok) : obj.head(0.5, s, arr) -0.5 > f and div == add -0.5 > obj.a -0.5 > obj.b -0.5 > obj.head(a ** a) -0.5 > obj.head(f) -0.5 > obj?.a -0.5 > obj?.b -0.5 > obj?.head(obj.head(obj?.b)) -0.5 > obj?.obj?.b -0.5 >= 0.5 && obj.head(add, 0, arr, 0.5, s) -0.5 >= a and ok -0.5 >= b == true ? nil : div -0.5 >= b ? div : string(0.5) -0.5 >= obj.a -0.5 >= obj.b -0.5 >= obj.obj?.a -0.5 >= obj.obj?.b -0.5 >= obj?.a -0.5 >= obj?.b -0.5 ^ 0 - 0 * 1 -0.5 ^ 0 - a -0.5 ^ 0 <= a * a -0.5 ^ 0 > f -0.5 ^ 0.5 + a -0.5 ^ 0.5 ^ f -0.5 ^ 1 >= a -0.5 ^ 2 == f -0.5 ^ a + obj?.b -0.5 ^ a ^ (b * 0) -0.5 ^ arr[a] -0.5 ^ b > a -0.5 ^ b > f -0.5 ^ b >= obj.a -0.5 ^ f * b -0.5 ^ f > add(2, b) -0.5 ^ f > f -0.5 ^ f >= f -0.5 ^ obj.a -0.5 ^ obj.b -0.5 ^ obj?.a -0.5 ^ obj?.b -0.5 ^ obj?.obj?.b -1 != 0 != obj.a -1 != 0 or obj?.head(false, div, div) -1 != 0.5 || b < a -1 != b != ok -1 != f == ok -1 != obj.a -1 != obj.b -1 != obj.fn(b) -1 != obj.obj -1 != obj?.a -1 != obj?.b -1 != obj?.obj -1 != obj?.obj?.b -1 % 1 .. 2 - a -1 % 1 > f -1 % a * add(1, b) -1 % a - b -1 % a / f -1 % a > b + f -1 % b / b -1 % b == b -1 % b >= b -1 % obj.a -1 % obj.b -1 % obj?.a -1 % obj?.b -1 % obj?.obj.b -1 * 0 .. obj?.head(b) -1 * 2 == f -1 * b != 0 ^ a -1 * b < a -1 * f < a / b -1 * f > b -1 * obj.a -1 * obj.b -1 * obj.obj.b -1 * obj?.a -1 * obj?.b -1 ** 0 != obj.obj -1 ** 0 ** float(2) -1 ** 0 ^ a -1 ** 0 ^ b -1 ** 0.5 / obj?.a -1 ** 2 ** count(arr, false) -1 ** 2 < b -1 ** a >= b -1 ** b != b -1 ** b + f -1 ** b <= -b -1 ** b >= 1 ** f -1 ** obj.a -1 ** obj.b -1 ** obj.fn(b) -1 ** obj?.a -1 ** obj?.b -1 + 0 == len(arr) -1 + 0 == obj?.fn(b) -1 + a > 0 != false -1 + a > f -1 + b - a -1 + f != a -1 + f >= 0 == false -1 + f >= add(b, 0) -1 + obj.a -1 + obj.b -1 + obj?.a -1 + obj?.b -1 - 0 .. abs(1) -1 - 1 != a -1 - 1 < a -1 - 2 <= f -1 - a != b ? arr : f -1 - a > f -1 - b != f -1 - b > f -1 - b >= add(b, 2) -1 - b in arr ? s : b -1 - obj.a -1 - obj.b -1 - obj.fn(2 - b) -1 - obj?.a -1 - obj?.b -1 - obj?.obj.a -1 .. 0 == obj.a -1 .. obj.a -1 .. obj.b -1 .. obj.obj.b -1 .. obj?.a -1 .. obj?.b -1 / 0 < f -1 / 0 in obj?.head(arr) -1 / 2 * f -1 / a < f -1 / a <= abs(a) -1 / f * b -1 / f == b -1 / obj.a -1 / obj.b -1 / obj.obj.a -1 / obj?.a -1 / obj?.b -1 < a && obj?.head(ok).b -1 < a ? a : a -1 < a ? ok : b -1 < a || nil != obj -1 < b == obj.obj -1 < obj.a -1 < obj.b -1 < obj.head(obj?.b) -1 < obj?.a -1 < obj?.b -1 < obj?.fn(b) -1 <= 0 ? ok : add -1 <= 1 or obj.head(a) -1 <= 2 != true == ok -1 <= a == obj?.b -1 <= a or obj.a -1 <= f != obj?.a -1 <= f == all(arr, ok) -1 <= f == obj?.head(nil) -1 <= obj.a -1 <= obj.b -1 <= obj?.a -1 <= obj?.b -1 <= obj?.head(a) -1 <= obj?.head(b) -1 <= obj?.obj.obj.a -1 == a or obj.head(any(ok and ok, #), div.fn(b, arr, 0, a).a) -1 == b || obj?.a -1 == nil != true ? ok : f -1 == obj.a -1 == obj.b -1 == obj.head(first(true, "b", add)) -1 == obj.obj -1 == obj?.a -1 == obj?.b -1 == obj?.obj -1 > 0.5 and obj?.obj -1 > 0.5 || 0 == f -1 > f and ok -1 > obj.a -1 > obj.b -1 > obj?.a -1 > obj?.b -1 > obj?.obj?.b -1 >= 0 || one(arr, ok) -1 >= 2 ? arr : a -1 >= f == not false -1 >= f || obj?.obj -1 >= obj.a -1 >= obj.b -1 >= obj.fn(b) -1 >= obj?.a -1 >= obj?.b -1 >= obj?.fn(b) -1 ^ 0 != a -1 ^ 1 != f -1 ^ 1 != obj?.obj -1 ^ b ^ f -1 ^ f - a -1 ^ obj.a -1 ^ obj.b -1 ^ obj.head(b) -1 ^ obj.obj.b -1 ^ obj?.a -1 ^ obj?.b -2 != 0 != obj?.b -2 != 0 != ok -2 != b != ok -2 != b && b != f -2 != b or obj?.b -2 != nil != ok -2 != nil == ok ? nil : div -2 != obj.a -2 != obj.b -2 != obj.head(add) -2 != obj.obj -2 != obj.obj?.a -2 != obj?.a -2 != obj?.b -2 != obj?.fn(b) -2 != obj?.obj -2 % 2 == a -2 % a % a -2 % a .. a -2 % a .. obj.b -2 % a > 0.5 ? b : obj -2 % b + arr[a] -2 % b > b -2 % obj.a -2 % obj.b -2 % obj?.a -2 % obj?.b -2 * 0 * b -2 * 0 <= f -2 * 0.5 - a - b -2 * 0.5 < b -2 * 0.5 >= f -2 * a >= b -2 * arr[b] -2 * f != b -2 * obj.a -2 * obj.b -2 * obj?.a -2 * obj?.b -2 ** 0 != 0 - f -2 ** 0 / a -2 ** 0 > a -2 ** 0 > f -2 ** 0.5 ** f -2 ** 0.5 > a -2 ** 2 * obj.b -2 ** a * f -2 ** a >= f -2 ** b / a -2 ** b ^ a -2 ** obj.a -2 ** obj.b -2 ** obj?.a -2 ** obj?.b -2 ** obj?.obj.a -2 + 0 > b -2 + 0.5 <= f - f -2 + 2 + obj.b -2 + arr[b] -2 + b >= 0 ? arr : true -2 + f != obj?.b -2 + f + add(a, b) -2 + obj.a -2 + obj.a > f -2 + obj.b -2 + obj?.a -2 + obj?.b -2 + obj?.obj?.a -2 - 0 > a ? div : 0 -2 - a == f - f -2 - a in arr -2 - b + len("c") -2 - f < obj?.a -2 - f == a -2 - obj.a -2 - obj.b -2 - obj?.a -2 - obj?.b -2 - obj?.obj?.a -2 .. obj.a -2 .. obj.b -2 .. obj.obj?.a -2 .. obj?.a -2 .. obj?.b -2 .. obj?.obj.a -2 / 0.5 - a -2 / 0.5 >= obj.a -2 / 1 > a -2 / 2 * a -2 / a >= obj.head(0.5) -2 / b * obj.b -2 / b > a ? arr : f -2 / f - obj?.b -2 / obj.a -2 / obj.b -2 / obj?.a -2 / obj?.b -2 / obj?.fn(a) -2 < a and obj.obj -2 < arr[b] -2 < b ? fromBase64(s) : ok -2 < f and obj?.head(f, true, false) -2 < f || none(arr, ok) -2 < obj.a -2 < obj.b -2 < obj?.a -2 < obj?.b -2 < obj?.obj.a -2 <= a == obj.b -2 <= a ? ok : s -2 <= a and one(arr, ok) -2 <= obj.a -2 <= obj.b -2 <= obj?.a -2 <= obj?.b -2 <= obj?.fn(a) -2 <= obj?.fn(b) -2 == 0 || b > f -2 == arr[b - a] -2 == f && a in arr -2 == f and nil != f -2 == nil == obj?.a -2 == obj.a -2 == obj.b -2 == obj.obj -2 == obj.obj.a -2 == obj?.a -2 == obj?.b -2 == obj?.fn(a) -2 == obj?.obj -2 == obj?.obj?.a -2 == obj?.obj?.b -2 > 1 and obj.b -2 > a || obj.b -2 > obj.a -2 > obj.b -2 > obj?.a -2 > obj?.b -2 > obj?.obj.a -2 >= 1 or f <= a -2 >= a == nil ? ok : a -2 >= b and ok -2 >= f or obj.fn("b", false) -2 >= obj.a -2 >= obj.b -2 >= obj.fn(count(s, true)) -2 >= obj?.a -2 >= obj?.b -2 >= obj?.fn(obj?.head(0, 0.5)) -2 ^ 0 / -a -2 ^ 0 < b -2 ^ 0 < b ? 0.5 : a -2 ^ 0 <= float(0) -2 ^ 0 >= -0 -2 ^ 0.5 >= add(b, b) -2 ^ 1 != 0 ? add : false -2 ^ 1 * b -2 ^ 1 > b -2 ^ 2 > b -2 ^ a <= a -2 ^ b - a -2 ^ b - b -2 ^ b <= max(b) -2 ^ b == b -2 ^ f == f -2 ^ f >= a -2 ^ obj.a -2 ^ obj.b -2 ^ obj.obj.a -2 ^ obj?.a -2 ^ obj?.b -2 ^ obj?.fn(obj.head(0)) +-min(1, f32) +-min(f32) +-min(f32, 0.5) +-min(f64) +-min(f64, 0.5) +-min(f64, f32) +-min(f64, i64) +-min(i) +-min(i, i) +-min(i32) +-min(i32, 1) +-min(i32, f64) +-min(i64) +-min(i64, f32) +-min(i64, f64) +-score(1) +-score(1, 1) +-score(1, i) +-score(i) +-score(i, 1) +-score(i32 * i) +0.5 != 0.5 ? f64 : half +0.5 != 0.5 ? i64 : f64 +0.5 != 0.5 ? list : array +0.5 != 0.5 or ok +0.5 != f32 || 0.5 > 0.5 +0.5 != i && i64 > 1 +0.5 != i64 != ok +0.5 != i64 ? -f32 : add +0.5 != nil or ok +0.5 * 0.5 != i / 1 +0.5 * 0.5 * i +0.5 * 0.5 * i32 +0.5 * 0.5 + i32 +0.5 * 0.5 - i +0.5 * 0.5 / f64 +0.5 * 0.5 / i32 +0.5 * 0.5 < f32 +0.5 * 0.5 < i +0.5 * 0.5 > i32 +0.5 * 1 + f32 +0.5 * 1 + half(f64) +0.5 * 1 < f64 +0.5 * 1 > f64 +0.5 * 1 > i32 +0.5 * f32 / i64 +0.5 * f32 == i32 +0.5 * f64 * f64 +0.5 * f64 + i64 +0.5 * f64 > i +0.5 * f64 >= i +0.5 * f64 >= i64 +0.5 * i - i +0.5 * i / i64 +0.5 * i / i64 ^ 0.5 +0.5 * i == f32 +0.5 * i32 < i32 +0.5 * i32 in [f64] +0.5 * i64 != f32 +0.5 * i64 != i +0.5 * i64 + f32 +0.5 * i64 <= i64 +0.5 ** 0.5 != i +0.5 ** 0.5 ** f32 +0.5 ** 0.5 / f32 +0.5 ** 0.5 / i +0.5 ** 0.5 < i / i32 +0.5 ** 0.5 == f32 +0.5 ** 0.5 == i32 +0.5 ** 1 + i64 +0.5 ** 1 / f32 +0.5 ** f32 < 1 / f64 +0.5 ** f32 < i +0.5 ** f32 < i32 +0.5 ** f32 < min(i64) +0.5 ** f32 == f64 +0.5 ** f32 ^ f32 +0.5 ** f32 ^ i64 +0.5 ** f64 * f32 +0.5 ** f64 + -i +0.5 ** i * 0.5 ** i +0.5 ** i < f32 +0.5 ** i <= i32 +0.5 ** i > f32 +0.5 ** i ^ f64 +0.5 ** i32 != f64 +0.5 ** i32 <= i32 +0.5 ** i32 ^ f32 +0.5 ** i64 != f32 +0.5 ** i64 - f32 +0.5 ** i64 - i64 +0.5 ** i64 ^ min(i) +0.5 + 0.5 != i32 +0.5 + 0.5 - f32 +0.5 + 0.5 - i64 +0.5 + 0.5 < 1 ? f32 : score +0.5 + 0.5 <= f32 +0.5 + 0.5 == f64 +0.5 + 0.5 > i64 +0.5 + 0.5 >= i64 +0.5 + 1 != i +0.5 + 1 < f32 +0.5 + 1 >= i +0.5 + f32 != i +0.5 + f32 != i + i64 +0.5 + f32 >= i +0.5 + f64 == i32 +0.5 + f64 > f64 +0.5 + i > f32 +0.5 + i32 + i64 +0.5 + i32 < f32 +0.5 + i64 + f64 +0.5 + i64 < f64 +0.5 + i64 <= 0.5 + 1 +0.5 + i64 == i32 +0.5 + i64 >= i64 +0.5 - 0.5 != i64 +0.5 - 0.5 + i32 +0.5 - 0.5 - f64 +0.5 - 0.5 < 0.5 * f32 +0.5 - 0.5 == f32 +0.5 - 1 != i ? "foo" : div +0.5 - 1 + f32 +0.5 - 1 - f64 +0.5 - 1 <= i32 +0.5 - 1 <= i64 +0.5 - f32 + i +0.5 - f64 <= i32 +0.5 - i - i32 +0.5 - i > f64 +0.5 - i > i +0.5 - i32 + 0.5 ^ i +0.5 - i32 + f32 +0.5 - i32 < i +0.5 - i32 <= i64 +0.5 - i64 == f64 +0.5 - i64 > f32 +0.5 - i64 >= f64 +0.5 - i64 >= i +0.5 / 0.5 != i32 +0.5 / 0.5 / i +0.5 / 0.5 / i32 +0.5 / 0.5 < i +0.5 / 0.5 == i +0.5 / 0.5 >= i32 +0.5 / 0.5 >= min(i32) +0.5 / 1 != i32 == nil +0.5 / 1 - i +0.5 / 1 < f32 +0.5 / 1 < i32 +0.5 / 1 == i64 +0.5 / 1 > 1 ** 0.5 +0.5 / f32 != i32 +0.5 / f32 * f64 +0.5 / f64 / i +0.5 / f64 <= f64 +0.5 / f64 == i +0.5 / f64 == i64 +0.5 / f64 >= f64 ^ 1 +0.5 / i < f64 ? i64 : i64 +0.5 / i <= i +0.5 / i == i64 - f32 +0.5 / i32 + i32 +0.5 / i32 < f32 +0.5 / i64 * i32 +0.5 < 0.5 == nil ? true : foo +0.5 < 0.5 || ok +0.5 < 1 and ok +0.5 < 1 or fromJSON("foo")?.Bar +0.5 < f32 ? map(list, i32) : i +0.5 < f64 != false ? f32 : score +0.5 < f64 ? list : greet +0.5 < f64 || ok +0.5 < i ? f64 : foo +0.5 < i32 or i32 == 1 +0.5 < i64 or ok +0.5 <= 0.5 and ok +0.5 <= 1 ? half : greet +0.5 <= array[i32] +0.5 <= f32 or ok +0.5 <= f64 and !true +0.5 <= f64 or ok +0.5 <= i == ok +0.5 <= i and nil == list +0.5 <= i32 and i < i64 +0.5 <= i64 && f64 >= f64 +0.5 == 0.5 ? score : i +0.5 == 1 == ok +0.5 == 1 == ok ? "foo" : div +0.5 == 1 or ok +0.5 == 1 || nil != score +0.5 == f32 ? score : i32 +0.5 == f64 && ok +0.5 == nil || div != score +0.5 == nil || ok +0.5 > 1 == ok +0.5 > 1 or ok +0.5 > f32 or !true +0.5 > f64 != ok +0.5 >= 0.5 == ok +0.5 >= 0.5 || ok +0.5 >= 1 != ok +0.5 >= 1 and ok +0.5 >= i32 && i > f32 +0.5 >= i64 and ok +0.5 ^ 0.5 != i32 +0.5 ^ 0.5 + i32 +0.5 ^ 0.5 / i +0.5 ^ 0.5 < f64 +0.5 ^ 0.5 > i +0.5 ^ 0.5 > i64 +0.5 ^ 0.5 >= i32 +0.5 ^ 1 * f64 +0.5 ^ 1 * i +0.5 ^ 1 + i64 +0.5 ^ 1 - -i +0.5 ^ 1 / i +0.5 ^ 1 == f32 +0.5 ^ 1 == i32 +0.5 ^ f32 + i32 +0.5 ^ f32 <= i32 +0.5 ^ f32 > f64 ? array : nil +0.5 ^ f32 >= f64 +0.5 ^ f32 ^ i32 +0.5 ^ f64 - i32 +0.5 ^ f64 > f32 +0.5 ^ f64 >= f32 +0.5 ^ f64 >= f64 +0.5 ^ f64 >= i +0.5 ^ f64 ^ i64 +0.5 ^ i == i64 +0.5 ^ i >= i32 +0.5 ^ i32 * i +0.5 ^ i32 * score(i) +0.5 ^ i32 / i +0.5 ^ i32 == i +0.5 ^ i64 < i +0.5 ^ i64 <= f32 +0.5 ^ i64 == f64 +0.5 ^ i64 > f64 +0.5 ^ i64 > i +0.5 ^ i64 > i32 +0.5 ^ i64 >= f32 +1 != 1 != hasPrefix("bar", "bar") +1 != array[i - 1] +1 != f32 && i32 <= 0.5 +1 != f32 == ok +1 != f32 ? i64 : foo +1 != f32 and i in array +1 != f64 != ok +1 != i32 ? score : greet +1 != i64 && ok +1 != i64 ? f32 : greet +1 != nil && ok +1 != nil ? half : foo +1 % 1 != f64 +1 % 1 * f32 +1 % 1 < f32 +1 % 1 > f32 +1 % 1 > i +1 % 1 >= i64 +1 % i / i32 +1 % i < f64 +1 % i < i32 +1 % i == f32 +1 % i32 * i64 +1 % i32 < max(i64) +1 % i64 != f32 +1 % i64 * f64 +1 % i64 + f32 +1 % i64 .. i64 +1 % i64 <= i64 +1 % i64 > f32 +1 % i64 > i32 +1 * 0.5 + i +1 * 0.5 - -i +1 * 0.5 <= f32 +1 * 0.5 > f32 +1 * 1 % i +1 * 1 + i32 +1 * 1 <= f64 +1 * array[i64] +1 * f32 < i +1 * f32 < i32 +1 * f32 <= i32 +1 * f64 * -i +1 * f64 * f32 +1 * f64 + i +1 * i % i +1 * i + f32 +1 * i < int(1) +1 * i <= 1 % 1 +1 * i > f32 +1 * i not in array +1 * i32 % i64 +1 * i32 * i32 +1 * i32 / i32 +1 * i32 > f32 +1 * i64 + f64 +1 * i64 == i32 +1 * i64 > i64 +1 ** 0.5 * f64 +1 ** 0.5 - i +1 ** 0.5 > i32 +1 ** 0.5 ^ f64 +1 ** 1 != i +1 ** 1 != i64 +1 ** 1 - i +1 ** 1 / i64 +1 ** 1 < i64 +1 ** 1 == i32 +1 ** 1 >= i +1 ** f32 != i64 +1 ** f32 / i +1 ** f64 != i64 +1 ** f64 ** i64 +1 ** f64 + i +1 ** f64 / f32 +1 ** f64 < i +1 ** i != i +1 ** i ** i64 +1 ** i < f64 +1 ** i < i32 +1 ** i > f64 +1 ** i32 ** (1 / 1) +1 ** i32 == i +1 ** i32 > i +1 ** i64 ** f64 +1 ** i64 - f64 +1 + 0.5 != i +1 + 0.5 <= f64 / f32 +1 + 0.5 <= i32 +1 + 1 - i32 +1 + 1 < i +1 + 1 == f64 +1 + 1 == i64 +1 + 1 >= i64 +1 + f32 != i +1 + f32 > i +1 + f64 != f64 +1 + f64 - i +1 + f64 >= i32 +1 + i <= f64 +1 + i in map(list, i32) +1 + i32 - i64 +1 + i32 < i +1 + i64 >= f32 +1 - 0.5 != half(0.5) +1 - 0.5 + i +1 - 0.5 + i32 +1 - 0.5 - i64 +1 - 0.5 <= f64 +1 - 0.5 == i64 +1 - 1 .. i64 +1 - 1 < i64 +1 - 1 == f64 +1 - 1 > -f32 +1 - f32 != i +1 - f32 <= f64 +1 - f32 <= i32 +1 - f64 - f32 +1 - f64 - f64 +1 - f64 < i64 +1 - f64 <= i +1 - i .. i64 +1 - i < min(f64) +1 - i32 < f64 +1 - i32 <= f64 +1 - i32 <= i32 +1 - i32 >= f64 +1 - i64 + i +1 - i64 - f32 +1 .. 1 == list +1 .. array[i] +1 .. i == list +1 .. i64 == list +1 / 0.5 + f64 +1 / 0.5 - array[i64] +1 / 0.5 < f64 +1 / 1 + -0.5 +1 / 1 + i32 +1 / 1 - -0.5 +1 / 1 / f64 +1 / 1 < f32 +1 / 1 <= f32 +1 / 1 <= i +1 / 1 == f64 +1 / 1 == i +1 / 1 == i32 +1 / 1 > f32 +1 / 1 > i64 +1 / f32 + -1 +1 / f64 * i +1 / f64 * i32 +1 / f64 + i32 +1 / f64 / f32 +1 / f64 == f32 +1 / f64 == i +1 / f64 > i +1 / i * i +1 / i < f64 ? ok : add +1 / i32 <= f32 +1 / i32 == i +1 / i32 == i64 +1 / i32 > i +1 / i64 + i64 +1 / i64 == i64 +1 / i64 > i +1 / i64 >= i32 +1 < array[i64] +1 < f64 != ok +1 < i32 and 1 == nil +1 < i64 ? "foo" not endsWith "foo" : i +1 <= 0.5 and i32 == 1 +1 <= 0.5 || ok +1 <= 1 && greet != greet +1 <= 1 and ok +1 <= f32 != ok +1 <= f32 == !ok +1 <= f64 ? add : f64 +1 <= i64 or nil == f32 +1 == array[i] +1 > 0.5 != ok +1 > 1 and ok +1 > 1 || ok +1 > f32 and ok +1 > f64 == ok +1 > f64 and ok +1 > i32 == ok +1 > i64 || i32 < i +1 >= 1 || ok +1 >= i || ok +1 >= i64 or nil in list +1 ^ 0.5 - f32 +1 ^ 0.5 <= f32 +1 ^ 0.5 <= i64 +1 ^ 0.5 ^ i32 +1 ^ 1 - f64 +1 ^ 1 - i32 +1 ^ 1 - i64 +1 ^ 1 / f32 +1 ^ 1 < f32 +1 ^ 1 < i64 / f32 +1 ^ 1 <= 1 ** f64 +1 ^ 1 == f64 +1 ^ 1 >= f32 +1 ^ 1 >= i64 +1 ^ f32 == i64 +1 ^ f32 > max(f32) +1 ^ f64 != i32 +1 ^ f64 * f32 +1 ^ f64 ** f64 +1 ^ i != findLast(array, false) +1 ^ i != i +1 ^ i * f64 +1 ^ i < i32 +1 ^ i <= f32 +1 ^ i == abs(1) +1 ^ i32 + i +1 ^ i32 < i +1 ^ i32 < i64 +1 ^ i32 >= i32 +1 ^ i64 ** f64 +1 ^ i64 ** i32 +1 ^ i64 + i +1 ^ i64 <= i +1 ^ i64 <= i32 +1 ^ i64 > i +1 ^ i64 >= i64 +[!false] [!ok] -["a"] != arr +["foo" != nil] +["foo" endsWith "bar"] [-0.5] -[-0] -[-a] -[0 ** 2] -[0.5 + 1] -[0.5 > 0] -[0.5 > 2] -[2 == a, a] -[2] == obj.head(f, 2, "a", f) -[a % a, a, add] -[a % a] -[a ** 0.5] -[a ^ b] -[a, "b" != s] -[a] -[abs(f)] -[add(div(a, b), last(arr))] -[add, add] +[-f32] +[-f64] +[-i32] +[-i64, add] +[-i64] +[0.5 * 1] +[0.5 + 0.5] +[0.5 / i] +[0.5 <= f64] +[0.5 <= i, -1] +[0.5 >= i] +[0.5 ^ 1] +[1 != 1] +[1 % 1, !true] +[1 < 0.5] +[1 == i] +[abs(0.5)] +[add != div] +[add == nil] +[add, array] +[add, f32] +[add, f64] +[add, greet] +[add, half] +[add, i64] +[add, score] +[add, toJSON(array)] [add] -[arr, 2 == 0] -[arr, add] -[arr, div] -[arr[b]] -[arr] -[b - f] -[b / a] -[b <= 0] -[b <= 2] -[b, arr] -[b, obj] -[b] -[div, b] -[div, f] +[array == list] +[array, f32] +[array, f64] +[array, greet] +[array, half] +[array, list] +[array, ok] +[array, score] +[array[1]] +[array[i64]] +[array] +[div == half] +[div, f32] +[div, greet] +[div, map(list, half)] +[div, ok] +[div, score] [div] -[f * f] -[f + 0] -[f / a] -[f >= 0] -[f, a] -[f, f ** 0] -[f] -[false ? add : f] -[len(obj)] -[lower("a")] -[map(arr, div), ok, a] +[f32 + 1] +[f32 - 0.5] +[f32 < i] +[f32 ^ 0.5] +[f32 ^ f64] +[f32, f64] +[f32, half] +[f32, max(f64)] +[f32] +[f64 != 1] +[f64 != i32] +[f64 * f64] +[f64 < f32] +[f64 >= 1] +[f64, f64] +[f64, foo] +[f64, i32] +[f64, i64] +[f64, list] +[f64, score] +[f64] +[false ? f64 : f32] +[findIndex(array, true)] +[first(array)] +[float(i64)] +[foo, add] +[foo, f32] +[foo, foo] +[foo, i] +[foo, list] +[foo.Qux] +[foo.String(), greet] +[foo.String()] +[foo?.Bar] +[foo?.Qux] +[foo] +[greet, div] +[greet, f32 ^ 0.5] +[greet, f32] +[greet, f64] +[greet, half] +[greet, i32] +[greet, i64] +[greet, list] +[greet] +[half, div] +[half, foo] +[half, greet] +[half] +[i != i64] +[i != i] +[i - 1] +[i .. 1] +[i / 0.5] +[i < f32] +[i > f64] +[i, add] +[i, half] +[i32 * 1] +[i32 <= 0.5] +[i32 == 0.5] +[i32 > 1] +[i32 > f32] +[i32, i] +[i32, score] +[i32] +[i64 / f64] +[i64 == i32] +[i64 >= 1] +[i64 ^ i, i32] +[i64, add] +[i64, div] +[i64, foo] +[i64, i32] +[i64, ok] +[i64] +[i64] == array +[i] +[int(1)] +[len(array)] +[list == list] +[list, div] +[list, f64] +[list, i] +[list] +[map(array, #)] +[map(array, 1 >= i32)] +[map(array, foo)] +[map(list, #)] +[map(list, half)] +[map(list, ok)] +[max(1)] +[max(i32)] [min(0.5)] -[min(f)] -[obj, div] -[obj, obj] -[obj.b] -[obj.fn(a)] -[obj.head(b, arr)] -[obj.head(b, div)] -[obj.head(f)] -[obj.head(obj)] -[obj.obj.obj] -[obj.obj] -[obj?.a] -[obj?.b] -[obj?.fn(a)] -[obj?.fn(b)] -[obj?.head("b")] -[obj?.head("c")] -[obj?.head(a, ok, nil, add, nil)] -[obj?.head(div), f] -[obj?.head(div, 0)] -[obj?.head(s)] -[obj?.obj] -[obj] -[ok, 0.5 / f] -[ok, add] -[ok, arr] -[ok, obj?.obj.b] -[ok, obj] -[ok, s] +[min(f64)] +[min(i32)] +[nil != ok, foo] +[nil == 0.5] +[nil not in list] +[not false] +[not ok] +[not true] +[ok && ok] +[ok, f32] +[ok, half] +[ok, score] [ok] -[s != "a"] -[s != nil] -[s != s] -[s + "a"] -[s endsWith "c"] -[s matches "a"] -[s, b] -[s] -[string(f)] -[true] != arr -a -a != -a -a != 0 % 1 -a != 0 * b -a != 0 + b -a != 0 ? b : nil -a != 0 ? div : obj -a != 0 ? f : ok -a != 0 ? s : arr -a != 0 ^ 1 -a != 0 ^ b -a != 0.5 * f -a != 0.5 / b -a != 0.5 ? false : ok -a != 0.5 ? s : nil -a != 1 != false -a != 1 * b -a != 1 ? 0 : obj -a != 2 ** 0 -a != a -a != a + 0.5 -a != a - 0 -a != a - a -a != a / 0 -a != a == nil -a != a == ok -a != a ? "c" : 0.5 -a != a ? 0 : div -a != a and ok != nil -a != add(0, a) -a != add(0, b) -a != add(b, a) -a != arr[1] -a != arr[b] -a != arr[obj?.a] -a != b -a != b != true -a != b && b > f -a != b && ok -a != b ** 0.5 -a != b ** a -a != b ** f -a != b / a -a != b == nil -a != b == obj?.b -a != b ? 0 : add -a != b and obj.head(arr) -a != b and obj.obj -a != b and obj?.a -a != div(b, a) -a != f -a != f ** f -a != f == ok -a != f ? 1 : obj -a != f ^ a -a != f || ok -a != first(arr) -a != float(a) -a != min(0.5) -a != min(a, 1, b) -a != min(b) -a != nil != obj.a -a != nil != ok ? ok : a -a != nil ? 0 : a -a != nil or obj.head(obj) -a != obj.a -a != obj.b -a != obj.head(add, ok) -a != obj.head(arr, 2, add) -a != obj.head(div) -a != obj.head(ok) -a != obj.head(true) -a != obj.obj -a != obj.obj?.b -a != obj?.a -a != obj?.b -a != obj?.fn(a) -a != obj?.head(0.5) -a != obj?.head(a * a) -a != obj?.head(obj, a) -a != obj?.obj -a != obj?.obj.a -a != obj?.obj.obj -a != obj?.obj?.b -a != obj?.obj?.obj -a % (b - a) -a % -a -a % -b -a % 1 != -b -a % 1 != b -a % 1 / 0 -a % 1 / f -a % 1 < a -a % 1 >= f -a % 2 != a + a -a % 2 != b -a % 2 * f -a % a -a % a % a -a % a * add(2, 0) -a % a * b -a % a - obj?.b -a % a / b -a % a < b -a % a <= f -a % a > 0 ? add : obj?.obj.a -a % a > a -a % add(a, b) -a % add(b, a) -a % arr[b] -a % arr[obj.head(f)] -a % b -a % b != b -a % b % a -a % b * f -a % b * obj.b -a % b - a -a % b .. obj?.head(f) -a % b / a -a % b == -f -a % b == f -a % b > b -a % b > f -a % b >= a -a % count(arr, ok) -a % div(1, a) -a % div(b, 1) -a % int(max(a)) -a % len("b") -a % len(obj) -a % min(a) -a % obj.a -a % obj.b -a % obj.b < a -a % obj.head(a) -a % obj.head(a, add(b, a)) -a % obj.head(b) -a % obj.obj.a -a % obj.obj?.a -a % obj.obj?.b -a % obj?.a -a % obj?.b -a % obj?.head(a) -a % obj?.obj?.a -a % obj?.obj?.b -a * (0.5 + b) -a * (1 - 1) -a * (1 - f) -a * (2 - 0) -a * (2 - b) -a * (a + 1) -a * (b - f) -a * -a -a * -f -a * 0 % a -a * 0 * f -a * 0 ** b -a * 0 / a -a * 0 > obj.head(b) -a * 0 > obj?.head(b, add) -a * 0.5 / b -a * 0.5 < f -a * 2 % b -a * 2 % div(a, a) -a * 2 == a != false -a * a -a * a != obj.b -a * a % b -a * a ** 0 -a * a - obj.a -a * a .. a -a * a .. b -a * a / 2 -a * a / f -a * a < f -a * a >= f -a * a >= f ? nil : a -a * abs(a) -a * abs(f) -a * add(1, a) -a * add(a, 0) -a * add(b, 0) -a * add(b, a) -a * b -a * b % a -a * b * obj.b -a * b ** f -a * b + a -a * b - a -a * b - b -a * b - f - 0 -a * b - obj.a -a * b <= b -a * b >= f -a * div(0, 1) -a * div(0, b) -a * div(a, 1) -a * div(a, a) -a * f -a * f != b * b -a * f * f -a * f ** 0.5 -a * f - a -a * f / a -a * f / b -a * f < a -a * f <= f -a * f <= f ^ 0.5 -a * f == max(a) -a * f >= f -a * f ^ 0.5 -a * f ^ 1 -a * float(1) -a * len("a") -a * min(a) -a * min(b) -a * obj.a -a * obj.b -a * obj.head(0.5, a) -a * obj.head(a) -a * obj.head(obj).b -a * obj?.a -a * obj?.b -a * obj?.fn(0) -a * obj?.fn(b) -a * obj?.fn(get(arr, b)) -a * obj?.head(b) -a * obj?.head(obj).a -a * obj?.obj.a -a * obj?.obj?.a -a ** (0 * f) -a ** (0.5 - 2) -a ** (0.5 - b) -a ** (0.5 / a) -a ** (2 * 0.5) -a ** (2 * b) -a ** (2 - f) -a ** (a / b) -a ** (b * a) -a ** (b - 0.5) -a ** (b / b) -a ** (f * a) -a ** (f * b) -a ** (f - 0) -a ** (f / 2) -a ** -0 -a ** -0.5 -a ** -a -a ** -b -a ** 0 != a -a ** 0 ** 0 -a ** 0 - b -a ** 0 ^ add(b, a) -a ** 0.5 ** 0.5 -a ** 0.5 / a -a ** 0.5 <= b -a ** 0.5 > b -a ** 0.5 ^ a -a ** 1 / a -a ** 1 > f -a ** 1 ^ f -a ** 2 != 2 - f -a ** 2 ** (f + 2) -a ** 2 <= b -a ** a -a ** a ** (f / b) -a ** a ** f -a ** a - f -a ** a / b -a ** a / obj.head(f) -a ** a <= a -a ** a <= obj.head(0) -a ** a == a -a ** a == b * 0.5 -a ** a > a -a ** a ^ 2 ** f -a ** abs(-f) -a ** abs(2) -a ** add(1, 2) -a ** add(b, a) -a ** arr[-0] -a ** arr[a] -a ** arr[b] -a ** b -a ** b != b -a ** b != f -a ** b != min(1) -a ** b ** a -a ** b - a -a ** b > f -a ** b ^ f -a ** div(2, b) -a ** div(a, 2) -a ** f -a ** f != obj?.head(obj).b -a ** f ** 0 -a ** f ** f -a ** f ** obj?.a -a ** f <= a -a ** f ^ a -a ** f ^ f -a ** float(f) -a ** int(f) -a ** len(obj) -a ** max(0) -a ** max(a, f) -a ** min(b) -a ** obj.a -a ** obj.b -a ** obj.fn(a) -a ** obj.fn(b) -a ** obj.head(f) -a ** obj.obj.a -a ** obj?.a -a ** obj?.b -a ** obj?.b ^ b -a ** obj?.head(1, ok) -a ** obj?.head(a) -a ** obj?.head(a, 0.5, add, "c") -a ** obj?.head(f, ok) -a ** obj?.obj?.a -a + -0 -a + -2 * f -a + -f -a + 0 + a -a + 0 + f -a + 0 - f -a + 0 <= b -a + 0 <= f -a + 0 == obj?.a -a + 0 ^ b -a + 0.5 != b -a + 0.5 * 2 -a + 0.5 > f -a + 0.5 ^ f -a + a -a + a % a -a + a % b -a + a * 1 -a + a * f -a + a + a -a + a + f -a + a - a -a + a - b -a + a / 0 -a + a / b -a + a < a + a -a + a >= f -a + a ^ b -a + add(0, 2) -a + add(b, b) -a + b -a + b % a -a + b - 0 -a + b - f -a + b .. a -a + count(arr, a != a) -a + div(0, 2) -a + div(a, b) -a + div(b, b) -a + f -a + f * 0.5 -a + f + b * 0 -a + f + f -a + f - a - 2 -a + f - b -a + f <= b -a + f == f -a + f == obj?.obj -a + f > float(b) -a + f >= obj.b -a + f ^ b -a + f ^ f -a + get(arr, 1) -a + int(f) -a + last(arr) -a + len(s) -a + min(f, 2) -a + obj.a -a + obj.b -a + obj.fn(2) -a + obj.fn(a) -a + obj.fn(b) -a + obj.fn(obj.head(b)) -a + obj.head(1, ok) -a + obj.head(a) -a + obj.head(a, ok, arr, nil) -a + obj.obj.a -a + obj.obj.b -a + obj?.a -a + obj?.b -a + obj?.head(f) -a + obj?.head(f, "c" != f) -a + obj?.head(obj?.a) -a + obj?.obj.a -a - -2 -a - -a -a - -b -a - 0 != a -a - 0 != f -a - 0 != obj?.obj?.a -a - 0 ** f -a - 0 - b -a - 0 / 0 -a - 0 < obj.b -a - 0 <= min(1) -a - 0 == obj.b -a - 0 > a -a - 0 ^ f -a - 0 in arr -a - 0.5 != f -a - 0.5 * 0.5 -a - 0.5 > b -a - 0.5 >= a -a - 1 .. obj.b -a - 1 == obj?.head(div, div) -a - 1 > b -a - 2 * f -a - 2 - 0.5 -a - 2 .. b -a - a -a - a != nil != false -a - a * 0 -a - a * f -a - a ** b -a - a - f -a - a .. -2 -a - a .. a -a - a < b / 0 -a - a <= a -a - a <= f ** 0.5 -a - a == a -a - a == obj?.a -a - a > 0 ? f : obj -a - a in arr -a - add(a, 0) -a - add(b, 0) -a - b -a - b * f -a - b + b - b -a - b + float(0) -a - b - a -a - b / 0 -a - b / 0.5 -a - div(a, 1) -a - f -a - f != b -a - f ** 1 -a - f + b -a - float(f) -a - get(arr, a) -a - len("c") -a - max(f) -a - obj.a -a - obj.b -a - obj.fn(a) -a - obj.head(0.5, b, b) -a - obj.head(2, obj) -a - obj.head(f) -a - obj.head(f, "b") -a - obj.obj?.b -a - obj?.a -a - obj?.b -a - obj?.head(a) -a - obj?.head(b, arr) -a - obj?.obj.b -a .. -2 -a .. 0 - 1 -a .. a -a .. a + 2 -a .. a + b -a .. a + obj.obj.a -a .. a - 1 -a .. add(b, b) -a .. arr[a] -a .. arr[b] -a .. b -a .. b + obj?.b -a .. b - a -a .. b - b -a .. b == arr -a .. div(1, 2) -a .. div(a, b) -a .. len(arr) -a .. len(s) -a .. min(0, 2) -a .. obj.a -a .. obj.b -a .. obj.head(a) -a .. obj.head(b, "a") -a .. obj.obj?.a -a .. obj?.a -a .. obj?.b -a .. obj?.head(1, obj, ok, false) -a .. obj?.head(2, s, nil) -a .. obj?.head(a, true, nil) -a .. obj?.obj.a -a .. obj?.obj.b -a .. obj?.obj.obj?.b -a / (0 - 0) -a / (1 + 0.5) -a / (a - a) -a / (f + 0) -a / (f + f) -a / -0 -a / -a -a / -b -a / -obj.obj.b -a / 0 != obj?.obj -a / 0 * 1 -a / 0 ** a -a / 0 + obj.a -a / 0 / obj.b -a / 0 < obj.a -a / 0 <= a -a / 0 == f -a / 0 >= a -a / 0 >= b -a / 0.5 < f -a / 0.5 == obj?.a -a / 1 - b -a / 1 / a -a / 1 < obj?.b -a / a -a / a != f -a / a - a ^ 2 -a / a < b -a / a <= add(1, 0) -a / a == f -a / a > float(f) -a / add(0, b) -a / add(a, b) -a / add(b, 0) -a / add(b, b) -a / arr[a] -a / b -a / b * obj?.head(f, arr, 0.5) -a / b ** b -a / b / (b + 0) -a / b / 2 -a / b < a -a / b == a -a / b > f -a / b >= 1 * obj?.a -a / b ^ b -a / count(arr, false) -a / div(0, a) -a / div(a, a) -a / div(b, b) -a / f -a / f * f -a / f ** 0.5 -a / f + a -a / f - f -a / f / b -a / f / f -a / f < obj?.b -a / f <= 0 % b -a / int(0) -a / max(0, 1, a) -a / max(2, b) -a / min(f) -a / obj.a -a / obj.b -a / obj.fn(a) -a / obj.fn(b) -a / obj.head(0, a) -a / obj.head(a, arr, 0.5) -a / obj.head(f) -a / obj.head(f, a) -a / obj?.a -a / obj?.b -a / obj?.fn(obj?.a) -a / obj?.head(0, obj, b, f, "b") -a / obj?.head(2, add) -a / obj?.head(a) -a / obj?.head(b, div) -a / obj?.head(f) -a / obj?.obj?.a -a < -0 -a < -a -a < -obj.a -a < 0 && obj.head(obj) -a < 0 * 0.5 -a < 0 ** b -a < 0 ** f -a < 0 / a -a < 0.5 != ok -a < 0.5 + f -a < 0.5 ? 0 : arr -a < 0.5 ? a != nil : f -a < 1 && obj.fn(ok, "a", obj) -a < 1 * 2 -a < 1 ? obj : true -a < 1 ^ b -a < 2 && obj?.a -a < 2 ** 2 -a < a -a < a % b -a < a * f -a < a - f -a < a / a -a < a == false -a < a ? 0 : ok -a < a ? 0.5 : arr -a < a ? a : add -a < a ? div : add -a < a ? f : add -a < a ? nil : 2 -a < a ? s : a -a < abs(a) -a < abs(b) -a < add(2, b) -a < add(a, a) -a < arr[a] -a < b -a < b != ok -a < b + 0.5 -a < b + b -a < b + f -a < b - f -a < b == obj?.head(ok) -a < b ? "c" : ok -a < b or obj.obj -a < div(b, 1) -a < f -a < f && obj.b?.b -a < f * b -a < f * f -a < f - 0 -a < f ? "b" : false -a < f ? a : ok -a < f ? add : b -a < f ? s : arr -a < f || ok -a < get(arr, b) -a < last(arr) -a < min(a) -a < min(f) -a < obj.a -a < obj.b -a < obj.fn(a) -a < obj.head(0) -a < obj.head(0, a, a) -a < obj.head(a, obj) -a < obj.head(b) -a < obj.obj.b -a < obj.obj?.a -a < obj?.a -a < obj?.b -a < obj?.obj.b -a <= -0 -a <= -0.5 -a <= -1 -a <= -b -a <= -f -a <= 0 != nil -a <= 0 && obj?.a -a <= 0 && obj?.fn(add) -a <= 0 * b -a <= 0 + 0.5 -a <= 0 - 1 -a <= 0 ? obj : s startsWith "c" -a <= 0 ^ 0.5 -a <= 0 || !ok -a <= 0 || ok -a <= 0.5 && obj?.head(true) -a <= 0.5 == obj.b -a <= 0.5 ? f != b : b -a <= 0.5 ? false : ok -a <= 0.5 ? obj : a -a <= 1 + 0 -a <= 2 != ok -a <= 2 ** a -a <= a -a <= a != true -a <= a ** 0 -a <= a / 2 -a <= a ? arr : "c" -a <= a || ok -a <= add(b, 1) -a <= arr[b] -a <= b -a <= b != nil ? 1 : s -a <= b % a -a <= b ** a -a <= b + 2 -a <= b - a -a <= b ? f : a -a <= b ? f : nil -a <= b ? f : obj.a -a <= b ? false : b -a <= b and obj.a -a <= f -a <= f ** a -a <= f ? 2 : f -a <= f ? obj?.head(b) : obj?.b -a <= f ? true : ok -a <= f and ok -a <= float(a) -a <= get(arr, b) -a <= len(obj) -a <= max(a) -a <= obj.a -a <= obj.b -a <= obj.head(a, "a", b, b, a) -a <= obj.head(b * 0.5) -a <= obj.head(b) -a <= obj.head(f) -a <= obj.obj.b -a <= obj?.a -a <= obj?.b -a <= obj?.fn(b) -a <= obj?.obj.a -a == -obj?.b -a == 0 != nil -a == 0 % a -a == 0 && obj?.b -a == 0 + 1 -a == 0 ? obj?.b : arr -a == 0 ? s : b -a == 0.5 != obj?.a -a == 0.5 + b -a == 0.5 ? b : b -a == 0.5 and obj.fn("b", nil) -a == 1 + b -a == 1 - f -a == 1 ? div : obj -a == 1 ? s : f -a == 1 ^ b -a == 2 * f -a == 2 or obj.a -a == a -a == a && obj.obj -a == a * b -a == a + a -a == a ? 1 : a -a == a ? 2 : f -a == a ? f : obj -a == a ? s : 0 -a == add(2, a) -a == arr[b] -a == b -a == b != nil -a == b % b -a == b * 1 -a == b ? b : obj.b -a == b ? s : add -a == b ^ 0.5 -a == b and "a" endsWith s -a == b or obj.b -a == b or ok -a == f -a == f != nil -a == f != nil ? s : obj -a == f != ok -a == f && obj == obj -a == f * a -a == f == obj?.a -a == f ? f : "b" -a == f ? ok : div -a == f and obj?.obj -a == f or obj.b -a == f || obj.head(b) -a == first(obj?.a) -a == int(b) -a == last(arr) -a == len("b") -a == len(obj) -a == nil != true -a == nil == ok -a == nil ? 0 : b -a == nil ? a : "b" -a == nil ? s : div -a == nil and obj.head(false) -a == obj.a -a == obj.b -a == obj.head("c") -a == obj.head(a, s) -a == obj.head(add) -a == obj.head(arr) -a == obj.head(f) -a == obj.head(obj, s, 0).obj -a == obj.head(ok, nil, add, "c") -a == obj.head(s, "a", ok, b) -a == obj.obj -a == obj.obj.b -a == obj?.a -a == obj?.b -a == obj?.b / a -a == obj?.b or ok -a == obj?.c -a == obj?.head(0.5) -a == obj?.head(add) -a == obj?.head(arr) -a == obj?.head(b or true) -a == obj?.head(b) -a == obj?.head(b, obj, "c") -a == obj?.head(s) -a == obj?.head(s, map(s, obj), a) -a == obj?.obj -a == obj?.obj?.b -a == obj?.obj?.obj -a > -a -a > -b -a > -f -a > 0 != obj?.b -a > 0 != ok -a > 0 && ok -a > 0 * 0.5 -a > 0 + 1 -a > 0 ^ 0.5 -a > 0 or nil == add -a > 1 != ok -a > 1 * 0 -a > 1 - 0 -a > 1 || obj?.obj -a > 2 * 0 -a > 2 ? add : div -a > 2 and obj.obj -a > a -a > a != ok -a > a != true -a > a * a -a > a ** f -a > a - b -a > a / f -a > a ? add : 1 -a > a ? add : ok -a > add(a, b) -a > add(b, a) -a > arr[a] -a > b -a > b != ok -a > b && !true -a > b * b -a > b + b -a > b ? "b" : 0 >= f -a > b ^ 0 -a > div(1, b) -a > f -a > f != ok -a > f ** b -a > f ** f -a > f / 0 -a > f ? f : add -a > f ? s : div -a > f ^ a -a > f || obj.head(0, add) -a > get(arr, b) -a > int(f) -a > len(obj) -a > len(s) -a > max(a) -a > min(b, f) -a > obj.a -a > obj.a % a -a > obj.a ? obj.head(f, obj) : add -a > obj.b -a > obj.fn(b) -a > obj.head(0.5) -a > obj.head(a) -a > obj.head(b) -a > obj.obj.a -a > obj?.a -a > obj?.b -a > obj?.fn(0) -a > obj?.fn(b) -a > obj?.head(f) -a > obj?.obj.a -a > obj?.obj.b -a > obj?.obj?.a -a > obj?.obj?.b -a >= -0 -a >= -a -a >= -f -a >= 0 != !ok -a >= 0 != obj.head(a, nil) -a >= 0 && ok -a >= 0 ** 0 -a >= 0 ** 1 -a >= 0 ** a -a >= 0 + b -a >= 0 ? s : b -a >= 0 ^ 0 -a >= 0 ^ a -a >= 0 or ok -a >= 0.5 && obj?.a -a >= 0.5 ? div : f ** 1 -a >= 0.5 || !ok -a >= 1 && f >= b -a >= 1 + 1 -a >= 1 ? add : obj.obj -a >= 1 ^ a -a >= 1 ^ f -a >= 1 || any(arr, true) -a >= 2 ? s : -f -a >= a -a >= a != nil -a >= a != ok -a >= a != true -a >= a * a -a >= a ** 2 -a >= a ** a -a >= a ** b -a >= a - b -a >= a ? arr : a -a >= a ^ 0 -a >= a ^ 1 * b -a >= a and obj?.b -a >= a || obj.head("a", f).head(f.head(div ^ ok), add contains b.b) -a >= add(a, 0) -a >= add(a, a) -a >= add(b, b) -a >= arr[b] -a >= b -a >= b % 1 -a >= b && f < f -a >= b - 0.5 -a >= b ? 1 : false -a >= b ^ a -a >= b and obj.obj -a >= b or ok -a >= b || b >= 0.5 -a >= f -a >= f * 2 -a >= f ** 2 -a >= f ? arr : add -a >= f ? b : ok -a >= f and ok -a >= f || obj.b.fn(add(f, any(obj, arr))?.b) -a >= float(b) -a >= get(arr, 0) -a >= int(0) -a >= int(f) -a >= len("c") -a >= min(f) -a >= obj.a -a >= obj.b -a >= obj.b || 0.5 <= obj.a -a >= obj.fn(1) -a >= obj.fn(a * a) -a >= obj.fn(div(a, b)) -a >= obj.head(1, nil, "a") -a >= obj.head(a, nil) -a >= obj.head(f) -a >= obj.obj?.b -a >= obj?.a -a >= obj?.a / b -a >= obj?.b -a >= obj?.fn(0) -a >= obj?.head(a) -a >= obj?.obj.a -a >= obj?.obj?.a -a >= obj?.obj?.b -a ^ (0 / b) -a ^ (2 + 0.5) -a ^ (a % 2) -a ^ (a % b) -a ^ (a * a) -a ^ (a - a) -a ^ (a - f) -a ^ (b - 2) -a ^ (b / 0) -a ^ (f - f) -a ^ (f / 2) -a ^ -0 -a ^ -0.5 -a ^ -a -a ^ -b -a ^ -f -a ^ 0 * b -a ^ 0 + f -a ^ 0 - a -a ^ 0 >= a -a ^ 0.5 ** b -a ^ 0.5 + -1 -a ^ 0.5 < f -a ^ 0.5 >= a -a ^ 1 ** f -a ^ 1 > obj?.b -a ^ 1 ^ obj.a -a ^ 2 * f -a ^ 2 + b -a ^ 2 == obj?.obj?.a -a ^ 2 ^ a -a ^ a -a ^ a ** a -a ^ a ** f -a ^ a + a * f -a ^ a / (b + f) -a ^ a / a -a ^ a / b -a ^ a < obj.a -a ^ a == 2 == nil -a ^ a > f -a ^ a ^ arr[a] -a ^ a ^ obj?.head(0) -a ^ abs(a) -a ^ add(1, 1) -a ^ add(a, b) -a ^ add(b, 2) -a ^ arr[0] -a ^ arr[a] -a ^ arr[b] -a ^ b -a ^ b != obj.obj?.a -a ^ b ** f -a ^ b ** obj?.b -a ^ b + 2 ^ f -a ^ b + a -a ^ b - b - a -a ^ b < 0 == ok -a ^ b > a -a ^ b ^ a -a ^ div(a, 2) -a ^ f -a ^ f != a -a ^ f ** 0.5 -a ^ f ** f -a ^ f + a -a ^ f + b -a ^ f - a -a ^ f / b -a ^ f > 0 ? div : arr -a ^ f ^ obj?.a -a ^ first(arr) -a ^ get(arr, 0) -a ^ min(f) -a ^ obj.a -a ^ obj.b -a ^ obj.fn(b) -a ^ obj.fn(obj.a) -a ^ obj.head(a) -a ^ obj.head(f) -a ^ obj.obj.b -a ^ obj.obj?.b -a ^ obj?.a -a ^ obj?.b -a ^ obj?.head(b) -a ^ obj?.obj?.b -a in a .. 0 -a in a .. 2 -a in arr -a in arr && obj.a -a in arr == true -a in arr ? 0.5 : 0.5 -a in arr ? 1 : obj -a in arr ? f : nil -a in arr ? f : ok -a in arr || 0.5 == f -a in b .. 0 -a in filter(arr, false) -a in filter(arr, ok) -a in map(arr, #) -a in obj?.head(nil)?.obj -a in obj[nil] +[score != add] +[score(1)] +[score(i)] +[score, array, foo] +[score, f32] +[score, f64] +[score, greet] +[score] +[string(0.5), foo] +[string(f64)] +[string(i32)] +[toJSON(1)] +[toJSON(nil)] +[type(0.5)] +[type(1)] +[type(add)] +[type(false)] +[type(i32)] +[{"foo": foo}] abs(-0.5) abs(-1) -abs(-2) -abs(-a) -abs(-b) -abs(-f) -abs(0 % 2) -abs(0 % a) -abs(0 % b) -abs(0 * 0.5) -abs(0 * b) -abs(0 + 0) -abs(0 + a) -abs(0 + b) -abs(0 + f) -abs(0 - a) -abs(0 / a) -abs(0 / b) -abs(0 / f) -abs(0 ^ 0.5) -abs(0 ^ b) -abs(0) ** lastIndexOf("b", "b") -abs(0) ** obj?.b -abs(0) / b -abs(0) < b * 0 -abs(0) <= f -abs(0) == obj.a -abs(0) ^ obj?.a -abs(0.5 * f) +abs(-f32) +abs(-f64) +abs(-i) +abs(-i32) +abs(-i64) +abs(0.5 * 0.5) +abs(0.5 * 1) +abs(0.5 * f64) +abs(0.5 * i32) +abs(0.5 * i64) abs(0.5 ** 0.5) -abs(0.5 ** b) +abs(0.5 ** 1) +abs(0.5 ** f32) +abs(0.5 ** f64) +abs(0.5 ** i64) abs(0.5 + 0.5) -abs(0.5 + f) -abs(0.5 - 1) -abs(0.5 - b) -abs(0.5 - f) -abs(0.5 ^ b) -abs(0.5) != obj.a -abs(0.5) == a -abs(0.5) == f != ok +abs(0.5 + f32) +abs(0.5 + i) +abs(0.5 + i64) +abs(0.5 - 0.5) +abs(0.5 - f32) +abs(0.5 - i) +abs(0.5 - i64) +abs(0.5 / 0.5) +abs(0.5 / 1) +abs(0.5 / f32) +abs(0.5 / f64) +abs(0.5 / i) +abs(0.5 / i64) +abs(0.5 ^ 0.5) +abs(0.5 ^ 1) +abs(0.5 ^ f64) +abs(0.5 ^ i32) +abs(0.5) * i +abs(0.5) - i +abs(0.5) - i64 +abs(0.5) / i32 +abs(0.5) < f32 +abs(0.5) == i32 +abs(0.5) > f32 +abs(0.5) >= f32 +abs(0.5) >= i +abs(0.5) >= i32 +abs(0.5) ^ f64 abs(1 % 1) -abs(1 ** b) -abs(1 - a) -abs(1 / 0) -abs(1 / a) -abs(1 / f) -abs(1 ^ a) -abs(1) * 0 * a -abs(1) - min(a, 0) -abs(1) / f -abs(1) == f -abs(1) > obj?.b -abs(2 - 0) -abs(2 - 1) -abs(2 - a) -abs(2 ^ f) -abs(a * 0) -abs(a * a) -abs(a ** 0.5) -abs(a ** a) -abs(a ** f) -abs(a + 0) -abs(a + b) -abs(a - a) -abs(a / 1) -abs(a / b) -abs(a / f) -abs(a ^ 0.5) -abs(a ^ 1) -abs(a ^ f) -abs(a) -abs(a) * obj?.a -abs(a) + b -abs(a) + f -abs(a) - a == a -abs(a) <= b -abs(a) <= b % 1 -abs(a) > f -abs(a) >= add(0, b) +abs(1 % i) +abs(1 * 0.5) +abs(1 * 1) +abs(1 * f32) +abs(1 ** 1) +abs(1 ** i) +abs(1 + 1) +abs(1 + f64) +abs(1 - 0.5) +abs(1 - i) +abs(1 - i32) +abs(1 / 0.5) +abs(1 / 1) +abs(1 / f32) +abs(1 / f64) +abs(1 / i32) +abs(1 / i64) +abs(1 ^ 0.5) +abs(1 ^ 1) +abs(1 ^ f64) +abs(1) * f64 +abs(1) * i +abs(1) ** f64 +abs(1) + f64 +abs(1) + i +abs(1) - f64 +abs(1) .. i +abs(1) / f32 +abs(1) < f32 +abs(1) < i +abs(1) == f64 ? 1 : foo +abs(1) > i +abs(1) ^ f32 +abs(1) ^ i32 abs(abs(0.5)) -abs(abs(a)) -abs(abs(f)) -abs(abs(obj.head(b))) -abs(add(0, 0)) -abs(add(0, a)) -abs(add(0, b)) -abs(add(1, b)) -abs(add(2, b)) -abs(add(a, 0)) -abs(add(a, a)) -abs(add(a, b)) -abs(add(b, 1)) -abs(add(b, a)) -abs(add(b, b)) -abs(arr[a]) -abs(arr[a]) ** b -abs(b % a) -abs(b % b) -abs(b * 1) -abs(b * b) -abs(b ** 0) -abs(b ** 0.5) -abs(b ** 2) -abs(b ** b) -abs(b ** f) -abs(b + b) -abs(b + f) -abs(b - a) -abs(b - f) -abs(b / 0.5) -abs(b / a) -abs(b / f) -abs(b ^ 0) -abs(b ^ 2) -abs(b ^ a) -abs(b ^ f) -abs(b ^ obj.b) -abs(b) -abs(b) % a -abs(b) * a -abs(b) * b -abs(b) - f -abs(b) .. a -abs(b) < a -abs(b) < b -abs(b) <= f -abs(b) <= obj?.b -abs(b) >= b ? "c" : 0 -abs(div(0, 1)) -abs(div(0, a)) -abs(div(a, a)) -abs(div(a, b)) -abs(div(b, a)) -abs(div(b, b)) -abs(f * 1) -abs(f ** 0) -abs(f ** 2) -abs(f ** a) -abs(f ** b) -abs(f ** f) -abs(f + 0) -abs(f + 2) -abs(f + a) -abs(f + b) -abs(f - a) -abs(f - f) -abs(f / b) -abs(f / f) -abs(f ^ 0) -abs(f ^ 1) -abs(f ^ f) -abs(f ^ obj.a) -abs(f ^ obj?.b) -abs(f) -abs(f) != f -abs(f) * obj.b -abs(f) ** f -abs(f) + b -abs(f) < obj?.a -abs(f) == a -abs(false ? "b" : 2) -abs(false ? s : 0) -abs(float(0)) +abs(abs(1)) +abs(abs(abs(i))) +abs(abs(f32)) +abs(abs(f64)) +abs(abs(i)) +abs(abs(i32)) +abs(abs(i64)) +abs(array[1]) +abs(array[i]) +abs(count(list, true)) +abs(f32 * 0.5) +abs(f32 * 1) +abs(f32 * f64) +abs(f32 ** 0.5) +abs(f32 ** 1) +abs(f32 ** i32) +abs(f32 + 0.5) +abs(f32 + 1) +abs(f32 + f32) +abs(f32 + f64) +abs(f32 + i) +abs(f32 + i32) +abs(f32 - 0.5) +abs(f32 - 1) +abs(f32 - f32) +abs(f32 / 1) +abs(f32 / f32) +abs(f32 / f64) +abs(f32 / i32) +abs(f32 ^ 1) +abs(f32 ^ f64) +abs(f32 ^ i32) +abs(f32 ^ i64) +abs(f32) +abs(f32) != i64 / i64 +abs(f32) * i32 +abs(f32) + i32 +abs(f32) <= i64 +abs(f32) == i +abs(f32) ^ f64 +abs(f64 * 1) +abs(f64 * f32) +abs(f64 * i32) +abs(f64 ** 1) +abs(f64 ** f32) +abs(f64 ** i32) +abs(f64 + 0.5) +abs(f64 + 1) +abs(f64 + i32) +abs(f64 + i64) +abs(f64 - 0.5) +abs(f64 - 1) +abs(f64 - f32) +abs(f64 - i32) +abs(f64 / 0.5) +abs(f64 / f64) +abs(f64 / i) +abs(f64 / i64) +abs(f64 ^ i32) +abs(f64) +abs(f64) * i64 +abs(f64) - f32 +abs(f64) - i64 - i32 +abs(f64) / i +abs(f64) / i64 +abs(f64) < f64 +abs(f64) <= abs(i32) +abs(f64) <= i +abs(f64) <= i32 +abs(f64) == i +abs(false ? 1 : f32) +abs(false ? f64 : 0.5) +abs(false ? false : i64) +abs(findIndex(array, # > i32)) +abs(findIndex(array, ok)) +abs(findIndex(array, true)) +abs(findIndex(list, true)) +abs(findLastIndex(array, ok)) +abs(findLastIndex(array, true)) +abs(findLastIndex(list, ok)) +abs(first(array)) abs(float(0.5)) -abs(float(add(b, b))) -abs(float(b)) -abs(float(f ^ a)) -abs(get(arr, 2)) -abs(get(arr, b)) -abs(int(0)) +abs(float(1)) +abs(float(f32)) +abs(float(f64)) +abs(float(i)) +abs(float(i32)) +abs(float(i64)) +abs(get(array, i32)) +abs(get(array, i64)) +abs(half(0.5)) +abs(half(f64)) +abs(i % i64) +abs(i * 1) +abs(i * i) +abs(i * i32) +abs(i ** 0.5) +abs(i ** 1) +abs(i ** i32) +abs(i + 1) +abs(i + i32) +abs(i - 0.5) +abs(i - 1) +abs(i / 1) +abs(i / i32) +abs(i ^ 0.5) +abs(i ^ f32) +abs(i ^ i32) +abs(i) +abs(i) != float(0.5) +abs(i) % i64 +abs(i) * f32 +abs(i) ** i +abs(i) ** max(1) +abs(i) / i64 +abs(i) <= i32 +abs(i) <= i64 +abs(i) > f64 +abs(i32 % i64) +abs(i32 * 0.5) +abs(i32 * 1) +abs(i32 * i32) +abs(i32 * i64) +abs(i32 ** 0.5) +abs(i32 ** 1) +abs(i32 ** f64) +abs(i32 ** i) +abs(i32 ** i64) +abs(i32 + 0.5) +abs(i32 + f64) +abs(i32 + i32) +abs(i32 - 1) +abs(i32 - f32) +abs(i32 - f64) +abs(i32 - i64) +abs(i32 / 1) +abs(i32 / i) +abs(i32 / i32) +abs(i32 ^ 0.5) +abs(i32 ^ 1) +abs(i32 ^ i) +abs(i32 ^ i64) +abs(i32) +abs(i32) % i32 +abs(i32) ** i64 +abs(i32) / -f32 +abs(i32) < f32 +abs(i32) > min(i64, f64, i32) +abs(i32) ^ f64 +abs(i32) not in array +abs(i64 % 1) +abs(i64 % i32) +abs(i64 * 1) +abs(i64 * f32) +abs(i64 * i) +abs(i64 * i32) +abs(i64 * i64) +abs(i64 ** 0.5) +abs(i64 ** 1) +abs(i64 ** i64) +abs(i64 + 0.5) +abs(i64 + 1) +abs(i64 + i) +abs(i64 + i32) +abs(i64 + i64) +abs(i64 - 1) +abs(i64 - f64) +abs(i64 - i32) +abs(i64 / i32) +abs(i64 ^ i64) +abs(i64) +abs(i64) != f64 +abs(i64) - f64 +abs(i64) - i64 +abs(i64) .. i64 +abs(i64) == f32 +abs(i64) == i +abs(i64) == i32 +abs(i64) == nil ? i : f64 +abs(i64) > i64 +abs(i64) >= f64 +abs(i64) in array +abs(int(0.5)) abs(int(1)) -abs(int(b)) -abs(int(f)) -abs(len("b")) -abs(len(arr)) -abs(max(a)) -abs(max(f)) -abs(max(f, f)) -abs(min(0, f)) -abs(min(a)) -abs(min(b)) -abs(min(b, f)) -abs(min(f)) -abs(obj.a) -abs(obj.a) != b -abs(obj.b) -abs(obj.fn(0)) -abs(obj.fn(a)) -abs(obj.fn(b)) -abs(obj.head(0.5, b)) -abs(obj.head(1)) -abs(obj.head(2)) -abs(obj.head(2, nil, obj)) -abs(obj.head(a)) -abs(obj.head(a, a)) -abs(obj.head(b)) -abs(obj.head(b, 0.5)) -abs(obj.head(f)) -abs(obj.obj.b) -abs(obj?.a) -abs(obj?.b ** (a / b)) -abs(obj?.b) -abs(obj?.fn(0)) -abs(obj?.fn(1)) -abs(obj?.fn(a)) -abs(obj?.fn(b)) -abs(obj?.head(0)) -abs(obj?.head(2)) -abs(obj?.head(a)) -abs(obj?.head(a, 2)) -abs(obj?.head(a, b, add)) -abs(obj?.head(a, ok, b)) -abs(obj?.head(b)) -abs(obj?.head(b, a)) -abs(obj?.head(b, arr, div, f)) -abs(obj?.head(f, add, 0.5)) -abs(obj?.obj.a) -abs(obj?.obj.b) -abs(obj?.obj?.a) -abs(ok ? 0.5 : 0.5) -abs(ok ? 0.5 : nil) -abs(ok ? a : b) -abs(ok ? b : arr) -abs(true ? b : b) -abs(true ? f : ok) -abs(true ? f : s) +abs(int(f32)) +abs(int(f64)) +abs(int(i)) +abs(int(i32)) +abs(int(i64)) +abs(last(array)) +abs(len("bar")) +abs(len("foo")) +abs(len(array)) +abs(len(list)) +abs(max(0.5)) +abs(max(1)) +abs(max(1, 1)) +abs(max(1, i64, f64)) +abs(max(f32)) +abs(max(f64)) +abs(max(i)) +abs(max(i32)) +abs(max(i64)) +abs(min(0.5)) +abs(min(0.5, 1)) +abs(min(1)) +abs(min(1, f32)) +abs(min(f32)) +abs(min(f64)) +abs(min(i)) +abs(min(i32)) +abs(min(i64)) +abs(ok ? 1 : "foo") +abs(ok ? f32 : 1) +abs(ok ? i : "bar") +abs(score(1)) +abs(score(i)) +abs(true ? f32 : "bar") +abs(true ? f64 : i32) add add != add -add != add != ok -add != add && obj?.b -add != add ? add : !ok -add != add ? add(a, a) : add -add != add ? arr : "b" -add != add ? b : a -add != add ? obj : obj -add != add ? s : nil add != div -add != div && obj.b -add != div == ok -add != div ? 0 : a -add != div ? f : obj -add != div ? nil : false -add != div ? ok : ok -add != div || obj?.head(0) -add != nil ? 1 : 2 -add != nil ? div : s -add != nil and obj?.obj -add != nil || obj.a -add != obj.a -add != obj.a + a -add != obj.b -add != obj.head("a") -add != obj.head(-a) -add != obj.head(0 == obj) -add != obj.head(0, s, ok) -add != obj.head(add, "c") -add != obj.head(arr) -add != obj.head(arr, "a", f) -add != obj.head(b) -add != obj.head(f) -add != obj.head(f, 0, a, 2, f) -add != obj.head(ok, a, 0) -add != obj.head(s) -add != obj.obj -add != obj.obj.a -add != obj.obj.obj -add != obj.obj?.a -add != obj.obj?.b -add != obj.obj?.obj -add != obj?.a -add != obj?.b -add != obj?.head(0.5) -add != obj?.head(a, div, add) -add != obj?.head(add, 0.5) -add != obj?.head(div, ok) -add != obj?.head(f, nil, obj, true, nil) -add != obj?.head(s, add, div) -add != obj?.obj -add != obj?.obj.obj?.a -add != obj?.obj?.a -add != obj[nil] +add != div ? foo : i64 +add != div and ok +add != foo.Qux +add != foo.String +add != foo?.Qux +add != foo?.String +add != greet +add != greet ? score : f32 +add != half +add != half == nil +add != half ? 0.5 : ok +add != nil == nil +add != nil ? "bar" : f32 +add != nil ? half : f32 +add != score add == add -add == add != ok -add == add == true -add == add ? 1 : f -add == add ? ok : a -add == add ? ok : f -add == add or obj.obj -add == add or ok +add == add == ok add == div -add == div != nil -add == div && obj.fn(nil, 0) -add == div ? f : a -add == div || s >= "b" -add == get(obj, s) -add == nil == nil -add == nil or obj.obj -add == nil or ok -add == obj.a -add == obj.b -add == obj.head("c", s) -add == obj.head(2, a) -add == obj.head(add, add, obj) -add == obj.head(f, "b", false, f) -add == obj.head(f, arr) -add == obj.head(obj) -add == obj.obj -add == obj.obj.b -add == obj.obj?.a -add == obj.obj?.b -add == obj?.a -add == obj?.b -add == obj?.c?.b -add == obj?.fn(b) -add == obj?.head("c") -add == obj?.head(add) -add == obj?.head(add, f, nil) -add == obj?.head(b, nil) -add == obj?.head(div) -add == obj?.head(obj) -add == obj?.head(s) -add == obj?.obj -add == obj?.obj.a -add == obj?.obj.obj -add == obj?.obj?.a -add in [b] -add in obj.head(nil) -add in obj?.head(arr) -add in obj?.head(arr, ok) -add in obj[toJSON(nil)] -add(-0, a) -add(-0, b) -add(-0, obj?.b) -add(-0, ok ? b : div) -add(-1, a) -add(-2, a) -add(-2, b) -add(-a, a) -add(-a, obj.a) -add(-b, b) -add(0 * b, obj?.a) -add(0 - a, a - a) -add(0, 0) <= f -add(0, 0) == obj.head(f) -add(0, 0) > last(arr) -add(0, 1) + f -add(0, 1) .. obj.b -add(0, 2) % (0 - b) -add(0, 2) > b -add(0, 2) > f -add(0, 2) ^ obj.b -add(0, a) != f -add(0, a) % (0 + a) -add(0, a) + a -add(0, a) + f -add(0, a) + obj.head(f) -add(0, a) <= f -add(0, a) > 0.5 ? obj : div -add(0, b) ** (f * f) -add(0, b) ** 0.5 ^ f -add(0, b) ** b -add(0, b) - max(f) -add(0, b) - obj.b -add(0, b) .. a -add(0, b) .. b -add(0, b) <= a + 0 -add(1 % b, b) -add(1 + 0, b) -add(1, 0) == f -add(1, 0) ^ a -add(1, 1) > f -add(1, 2) ^ f -add(1, a) * obj.b -add(1, a) in arr -add(1, b) % a -add(1, b) + obj.head(a) -add(1, b) == f -add(2 - a, obj.fn(a)) -add(2 - b, min(0)) -add(2, 0) < a -add(2, 0) <= div(b, 2) -add(2, 2) + f -add(2, 2) / obj.fn(b) -add(2, 2) > b -add(2, a) - a -add(2, a) .. a -add(2, a) ^ a -add(2, b) != a -add(2, b) / b -add(2, b) > b -add(2, b) >= a -add(2, b) ^ obj.b -add(a % 2, a) -add(a % a, obj.b) -add(a % b, b) -add(a * 0, a) -add(a * 0, b * b) -add(a * a, a) -add(a * a, get(arr, b)) -add(a * b, obj?.head(b)) -add(a - 0, obj.b) -add(a - 1, a) -add(a - 2, a) -add(a - b, b) -add(a, -0) -add(a, -1) -add(a, -a) -add(a, -b) -add(a, 0) ** f -add(a, 0) - f ** 0.5 -add(a, 0) .. -b -add(a, 0) .. obj?.a -add(a, 0) < 2 ? f : 1 -add(a, 0) < b -add(a, 0) > a -add(a, 0) >= float(2) -add(a, 0) ^ f -add(a, 1) != 0.5 ? ok : add -add(a, 1) ** a -add(a, 1) - f -add(a, 1) < b -add(a, 1) > obj.a -add(a, 1) >= a -add(a, 1) in 1 .. a -add(a, 2) ** f -add(a, 2) / f -add(a, a * 2) -add(a, a - a) -add(a, a) -add(a, a) != 0.5 ? s : b -add(a, a) != f -add(a, a) != obj?.obj -add(a, a) % obj?.a -add(a, a) % obj?.fn(b) -add(a, a) - f -add(a, a) .. obj.a -add(a, a) / a -add(a, a) / b -add(a, a) / f -add(a, a) < b -add(a, a) < f -add(a, a) == a -add(a, a) > 1 - a -add(a, a) >= -b -add(a, a) >= 0.5 * 0 -add(a, a) >= a -add(a, a) ^ f -add(a, abs(b)) -add(a, add(a, 2)) -add(a, add(a, b)) -add(a, add(b, a)) -add(a, add(b, b)) -add(a, arr[a]) -add(a, arr[b]) -add(a, b * a) -add(a, b) -add(a, b) ** obj.b -add(a, b) ** obj.head(1, div) -add(a, b) + f / a -add(a, b) - b -add(a, b) - obj.a -add(a, b) / int(b) -add(a, b) == a -add(a, b) == b -add(a, b) == obj.obj -add(a, b) ^ b -add(a, b) ^ obj.b -add(a, count(arr, ok)) -add(a, div(1, 1)) -add(a, get(arr, a)) -add(a, int(a)) -add(a, int(f)) -add(a, len(obj)) -add(a, max(1)) -add(a, obj.a) -add(a, obj.b) -add(a, obj?.a) -add(a, obj?.b) -add(a, obj?.fn(a)) -add(a, obj?.head(0)) -add(a, obj?.head(0, div, nil)) -add(a, obj?.obj.b) -add(abs(0), b) -add(abs(a), obj?.a) -add(add(0, a), b) -add(add(2, a), b) -add(add(a, 0), -2) -add(add(a, 2), b) -add(add(a, b), b) -add(add(b, 0), a) -add(add(b, 0), b) -add(add(b, 2), a) -add(add(b, 2), b) -add(add(b, b), a) -add(arr[b], b) -add(b % 1, b + b) -add(b % a, a) -add(b * b, -a) -add(b + 0, a) -add(b + 0, len("b")) -add(b + 1, obj?.b) -add(b + 2, get(arr, 1)) -add(b - 0, b) -add(b - 0, get(arr, 1)) -add(b - 1, a) -add(b - a, obj.a) -add(b, -1) -add(b, -2) -add(b, -a) -add(b, -b) -add(b, 0 * a) -add(b, 0 + b) -add(b, 0) != b ? arr : obj -add(b, 0) != f -add(b, 0) * obj.b -add(b, 0) ** a -add(b, 0) ** obj.a -add(b, 0) + a -add(b, 0) + f -add(b, 0) == b + 0 -add(b, 0) > a - f -add(b, 0) >= b -add(b, 0) >= obj?.b -add(b, 0) ^ (0 + 0.5) -add(b, 1) ** -2 -add(b, 1) + a -add(b, 1) <= a -add(b, 1) == obj?.head(add, f) -add(b, 1) ^ f -add(b, 2 % a) -add(b, 2) == obj.obj.a -add(b, a * b) -add(b, a) -add(b, a) != a ? s : obj -add(b, a) != f -add(b, a) * obj.a -add(b, a) + a -add(b, a) - b -add(b, a) .. obj?.head(0, nil, f) -add(b, a) > a % b -add(b, a) > b == true -add(b, a) >= b -add(b, a) ^ b -add(b, a) ^ obj?.a -add(b, add(0, b)) -add(b, add(1, b)) -add(b, add(2, b)) -add(b, add(b, 2)) -add(b, arr[0]) -add(b, b % a) -add(b, b * a) -add(b, b + a) -add(b, b) -add(b, b) % div(a, 1) -add(b, b) + b -add(b, b) - -b -add(b, b) - a -add(b, b) - f -add(b, b) < a + 0 -add(b, b) >= a + 0.5 -add(b, b) ^ obj?.b -add(b, div(0, a)) -add(b, div(1, b)) -add(b, div(a, a)) -add(b, div(b, a)) -add(b, div(b, b)) -add(b, first(arr)) -add(b, get(arr, b)) -add(b, int(a)) -add(b, len(arr)) -add(b, max(b)) -add(b, min(a)) -add(b, obj.a) -add(b, obj.a) % a -add(b, obj.b) -add(b, obj.head(a)) -add(b, obj.obj.a) -add(b, obj.obj?.b) -add(b, obj?.a) -add(b, obj?.b) -add(b, obj?.head(a)) -add(b, obj?.obj.b) -add(b, ok ? 1 : a) -add(div(0, a), b) -add(div(a, a), add(0, 0)) -add(div(a, b), b) -add(div(b, 2), a) -add(div(b, a), -a) -add(div(b, a), obj?.head(a, div)) -add(div(b, b), b) -add(div(b, b), obj?.a) -add(false ? add : 0, 0 + a) -add(get(arr, 0), last(arr)) -add(get(arr, a), a) -add(get(arr, a), b) -add(get(arr, b), b) -add(indexOf("a", "b"), b) -add(indexOf(s, s), a) -add(int(0), 0 - a) -add(int(0), b) -add(int(2), div(b, b)) -add(int(a), b) -add(int(b), a) -add(int(f), 1 * b) -add(last(arr), a) -add(len(obj), b) -add(len(s), a) -add(max(0), a) -add(max(2), int(a)) -add(min(0), len(arr)) -add(min(2), a) -add(min(a), b) -add(min(a), len(arr)) -add(min(a), obj.a) -add(obj.a, a) -add(obj.a, b) -add(obj.a, obj.a) -add(obj.a, obj.b) -add(obj.b, a * a) -add(obj.b, a) -add(obj.b, arr[0]) -add(obj.b, b) -add(obj.b, obj.a) -add(obj.b, obj.b) -add(obj.b, obj.fn(b)) -add(obj.b, obj?.a) -add(obj.b, obj?.b) -add(obj.b, obj?.head(0)) -add(obj.b, obj?.head(b)) -add(obj.fn(0), b) -add(obj.fn(a), obj.a) -add(obj.fn(b), a) -add(obj.head(0), 2 * a) -add(obj.head(0), obj?.head(b)) -add(obj.head(1, add), obj.a) -add(obj.head(2, 0, "a"), b) -add(obj.head(a), b) -add(obj.head(b), a) -add(obj.head(b), b) -add(obj.head(b, obj), b) -add(obj.obj?.b, a) -add(obj?.a, -a) -add(obj?.a, a + 0) -add(obj?.a, a - b) -add(obj?.a, a) -add(obj?.a, b % 1) -add(obj?.a, b) -add(obj?.a, div(a, b)) -add(obj?.a, div(b, a)) -add(obj?.a, obj.a) -add(obj?.a, obj.b) -add(obj?.a, obj?.head(a, f, obj)) -add(obj?.b, -0) -add(obj?.b, -1) -add(obj?.b, 0 * a) -add(obj?.b, 0 * b) -add(obj?.b, 2 + a) -add(obj?.b, a) -add(obj?.b, add(0, a)) -add(obj?.b, b) -add(obj?.b, min(0)) -add(obj?.b, obj.a) -add(obj?.b, obj.b) -add(obj?.b, obj?.a) -add(obj?.b, obj?.b) -add(obj?.b, obj?.head(0)) -add(obj?.fn(0), int(a)) -add(obj?.fn(0), obj.a) -add(obj?.fn(b), obj.a) -add(obj?.head(0, 0, false), arr[a]) -add(obj?.head(a), b) -add(obj?.head(b), b) -add(obj?.head(b, s), a) -add(obj?.obj.a, b) -add(ok ? 2 : f, obj.b) -add(ok ? a : f, obj.b) -add(ok ? a : s, b) -all(0 .. 0, nil != 0) -all(0 .. 2, "c" startsWith s) -all(0 .. 2, ok) -all(0 .. a, ok) -all(0 .. b, ok) -all(a .. 0, "a" matches s) -all(a .. 0, a > b) -all(a .. b, !ok) -all(arr, "a" <= s) -all(arr, "a" contains "b") -all(arr, "a" in obj) -all(arr, "b" matches "a") -all(arr, "c" in obj) -all(arr, "c" matches s) -all(arr, # != f) -all(arr, 0 == nil) -all(arr, 0 > b) -all(arr, 0.5 != b) -all(arr, 0.5 <= a) -all(arr, 0.5 >= a) -all(arr, 2 != 1) -all(arr, 2 < 0) -all(arr, 2 < a) -all(arr, 2 <= a) -all(arr, 2 > f) -all(arr, a != a) -all(arr, a < 0) -all(arr, a < 1) -all(arr, a < b) -all(arr, a < obj.b) -all(arr, a <= f) -all(arr, a == a) -all(arr, a == f) -all(arr, a > f) -all(arr, a >= b) -all(arr, add != add) -all(arr, add == nil) -all(arr, all(arr, ok)) -all(arr, all(arr, true)) -all(arr, any(arr, ok)) -all(arr, b < 0) -all(arr, b <= b) -all(arr, b == a) -all(arr, f != a) -all(arr, f < #) -all(arr, f == b) -all(arr, f == f) -all(arr, f >= b) -all(arr, f >= f) -all(arr, false == ok) -all(arr, false ? div : false) -all(arr, false and ok) -all(arr, false) and f <= b -all(arr, nil != 2) -all(arr, nil != nil) -all(arr, nil == "b") -all(arr, nil == add) -all(arr, nil == arr) -all(arr, none(arr, ok)) -all(arr, not true) -all(arr, obj.head(false)) -all(arr, obj?.head(true)) -all(arr, ok != nil) -all(arr, ok && ok) -all(arr, ok == obj.b) -all(arr, ok || false) -all(arr, ok) -all(arr, ok) != obj?.b -all(arr, ok) != obj?.obj -all(arr, ok) or obj.b -all(arr, ok) or obj?.head(a) -all(arr, one(arr, ok)) -all(arr, s != s) -all(arr, s <= "b") -all(arr, s > "a") -all(arr, s contains s) -all(arr, s matches s) -all(arr, true or false) -all(arr, true or true) -all(arr, true) && a == nil -all(b .. a, a > f) -all(filter(arr, false), ok || ok) -all(filter(arr, true), "a" >= "a") -all(map(arr, "b"), ok) -all(map(arr, 0), ok) -all(map(arr, 0.5), 1 < 2) -all(map(arr, 0.5), ok) -all(map(arr, 2), b != b) -all(map(arr, add), 2 < f) -all(map(arr, arr), 2 == b) -all(map(arr, b), b >= b) -all(map(arr, b), not true) -all(map(arr, b), ok) -all(map(arr, f), a > f) -all(map(arr, false), #) -all(map(arr, obj), 0 <= f) -all(map(arr, ok), #) -all(map(arr, s), ok) -all(obj.head("c"), ok) -all(obj.head(arr, 0.5, div), true or false) -all(obj.head(obj, a), ok) -all(obj.head(obj, f, b), ok) -all(obj.head(obj, s), 0 >= f) -all(obj.head(s), b < 0) -all(obj.obj, "a" == s) -all(obj.obj, a >= a) -all(obj.obj, add == add) -all(obj.obj, all(arr, ok)) -all(obj.obj, div == nil) -all(obj.obj, f <= a) -all(obj.obj, obj.head(ok, div)) -all(obj.obj, ok || ok) -all(obj.obj, ok) -all(obj?.head("b", ok, add, 0), ok) -all(obj?.head("c", b), 0 < a) -all(obj?.head(arr), 0.5 > f) -all(obj?.head(arr), b < f) -all(obj?.head(arr), obj.head(ok)) -all(obj?.head(arr, 0.5, add, nil), f != 0.5) -all(obj?.head(obj), a <= 0) -all(obj?.head(obj, nil), ok) -all(obj?.head(s), 1 == f) -all(obj?.obj, 0 > 0) -all(obj?.obj, b == 0.5) -all(obj?.obj, b >= 1) -all(obj?.obj, b >= a) -all(obj?.obj, div != nil) -all(obj?.obj, nil in arr) -all(obj?.obj, obj.head(ok)) -all(obj?.obj, obj?.head(ok, ok)) -all(obj?.obj, ok && false) -all(obj?.obj, ok) -all(obj?.obj, s endsWith "c") -all(obj?.obj, s matches s) -all(ok ? arr : s, ok or true) -all(ok ? obj : f, b > f) -any(0 .. a, ok) -any([false, "c"], ok) -any([ok, false], #) -any(a .. b, ok ? ok : obj) -any(a .. b, ok) -any(arr, !false) -any(arr, !true) -any(arr, "a" == obj.b) -any(arr, "b" < s) -any(arr, "c" != obj?.obj) -any(arr, "c" startsWith "c") -any(arr, # != a) -any(arr, # != b) -any(arr, 0 != 0.5) -any(arr, 0.5 != b) -any(arr, 0.5 >= f) -any(arr, 1 != 0) -any(arr, 2 < 0.5) -any(arr, a != b) -any(arr, a < b) -any(arr, a == 0.5) -any(arr, a == f) -any(arr, a > 0.5) -any(arr, a > b) -any(arr, a in arr) -any(arr, add != div) -any(arr, any(arr, true)) -any(arr, b != f) -any(arr, b < f) -any(arr, b <= f) -any(arr, b == 0) -any(arr, b > 0) -any(arr, b > f) -any(arr, div == div) -any(arr, f < a) -any(arr, f < b) -any(arr, f <= 0.5) -any(arr, f > 0.5) -any(arr, f >= a) -any(arr, false and false) -any(arr, false and ok) -any(arr, false || false) -any(arr, false) != ok -any(arr, false) && ok -any(arr, false) ? div(nil, a) : obj -any(arr, false) || false ? div : 0 -any(arr, nil != add) -any(arr, nil != f) -any(arr, nil != s) -any(arr, nil == "b") -any(arr, nil == "c") -any(arr, nil == 1) -any(arr, nil == a) -any(arr, nil == add) -any(arr, nil == b) -any(arr, nil == s) -any(arr, not ok) -any(arr, obj.head(false)) -any(arr, obj.head(false, div, 0, add)) -any(arr, obj.head(false, true)) -any(arr, obj.head(ok, add)) -any(arr, ok != nil) -any(arr, ok ? ok : b) -any(arr, ok) -any(arr, ok) && obj.a -any(arr, ok) && obj.obj -any(arr, ok) && ok -any(arr, ok) == ok -any(arr, ok) ? s : keys(obj) -any(arr, ok) and obj.a -any(arr, ok) or obj.b -any(arr, ok) or ok -any(arr, one(arr, false)) -any(arr, s <= s) -any(arr, s contains "c") -any(arr, s endsWith "b") -any(arr, string(2) != s) -any(arr, true) != ok -any(arr, true) && obj?.head(false) -any(arr, true) and b != f -any(arr, true) or obj?.a -any(arr, true) || obj.obj -any(arr[0:b], div != div) -any(b .. 2, a == b) -any(b .. a, obj?.a) -any(false ? add : obj, nil == f) -any(false ? div : "a", ok) -any(false ? false : s, !true) -any(filter(arr, ok), a != a) -any(filter(arr, ok), ok ? ok : 0) -any(filter(arr, ok), ok) -any(filter(arr, true), "b" in obj) -any(keys(obj), ok) -any(map(arr, 0), a < a) -any(map(arr, 0), b <= 0) -any(map(arr, 0), nil != "b") -any(map(arr, 0.5), a <= a) -any(map(arr, a), false && ok) -any(map(arr, add), ok) -any(map(arr, arr), 2 == nil) -any(map(arr, div), 0 > f) -any(map(arr, div), ok) -any(map(arr, f), b == 0) -any(map(arr, f), nil != a) -any(map(arr, f), ok) -any(map(arr, ok), #) -any(map(obj.head(s), a), ok) -any(obj.head("b"), ok) -any(obj.head("c", obj), 1 != nil) -any(obj.head(arr), 0 < b) -any(obj.head(obj), a < b) -any(obj.head(s), 0 >= 0) -any(obj.obj, 0.5 > b) -any(obj.obj, 2 == 0.5) -any(obj.obj, a < f) -any(obj.obj, obj != obj) -any(obj.obj, ok && false) -any(obj.obj, ok and ok) -any(obj.obj, ok) -any(obj.obj, s <= s) -any(obj.obj, s > "a") -any(obj?.head(arr), ok) -any(obj?.head(upper(a, 0, "c")), ok) -any(obj?.obj, 0 >= 0.5) -any(obj?.obj, a <= 0.5) -any(obj?.obj, arr == arr) -any(obj?.obj, b == b) -any(obj?.obj, f == 1) -any(obj?.obj, f == nil) -any(obj?.obj, f > a) -any(obj?.obj, not false) -any(obj?.obj, not ok) -any(obj?.obj, ok != nil) -any(obj?.obj, ok) -any(obj?.obj, s >= "c") -any(obj?.obj?.obj, ok) -any(ok ? "b" : ok, 2 != b) -any(ok ? arr : ok, ok) -any(ok ? obj : 0, b < b) -any(ok ? obj : ok, 0 < 0.5) -arr -arr != arr -arr != arr && ok ? arr : f -arr != arr == obj.head(a) -arr != b .. 0 -arr != filter(arr, true) -arr != map(arr, 0) -arr != map(arr, arr) -arr != map(arr, obj) -arr != nil ? ok : f -arr != nil ? ok : ok -arr != nil and f != b -arr != nil or a == 0 -arr != nil || true && false -arr != obj.a -arr != obj.b -arr != obj.head(0.5) -arr != obj.head(add, add) -arr != obj.head(all("c", ok)) -arr != obj.head(arr, add) -arr != obj.head(arr, s) -arr != obj.head(b) -arr != obj.head(b, 0) -arr != obj.head(b, b, b, true) -arr != obj.head(nil) -arr != obj.head(s) -arr != obj.head(true, b, "a") -arr != obj.obj -arr != obj.obj.a -arr != obj?.a -arr != obj?.b -arr != obj?.head("a" >= s) -arr != obj?.head(0) -arr != obj?.head(0.5) -arr != obj?.head(div) -arr != obj?.head(false) -arr != obj?.head(nil) -arr != obj?.head(obj, add) -arr != obj?.head(obj, s, arr, add).a -arr != obj?.head(s) -arr != obj?.obj -arr != obj?.obj.b -arr != obj?.obj?.a -arr == a .. a -arr == arr -arr == arr != ok -arr == arr == ok -arr == arr ? "b" : add -arr == arr ? a : 0 -arr == arr ? add : obj -arr == arr ? nil : "a" -arr == arr ? obj : nil -arr == arr ? obj?.head(div, "b") : s -arr == arr ? ok : a -arr == arr ? s : a -arr == arr and obj?.fn(a) -arr == arr and obj?.head(a, 0.5, arr, arr) -arr == arr or obj.b != b -arr == map(arr, true) -arr == nil ? a : ok -arr == nil ? ok : div -arr == nil or add == div -arr == nil or obj.fn(b) -arr == nil || obj.b -arr == obj.a -arr == obj.b -arr == obj.head(0, div) -arr == obj.head(arr, f, ok) -arr == obj.head(f, obj) -arr == obj.head(s, 0) -arr == obj.obj -arr == obj.obj ? arr : obj -arr == obj.obj.b -arr == obj.obj.obj -arr == obj?.a -arr == obj?.b -arr == obj?.head(a) -arr == obj?.head(a, nil) -arr == obj?.head(arr) -arr == obj?.head(arr, "c") -arr == obj?.head(b, ok) -arr == obj?.head(div) -arr == obj?.head(false) -arr == obj?.head(nil, f, "b") -arr == obj?.head(obj, arr) -arr == obj?.head(s, 0.5) -arr == obj?.head(s, a) -arr == obj?.obj -arr == obj?.obj.b -arr == obj?.obj.obj -arr == obj?.obj.obj?.a -arr in keys(obj) -arr in obj.head(arr) -arr in obj?.head(get(0, b)) -arr[-a] -arr[0 * 2] -arr[0 * a] -arr[0 + 0] -arr[0 + 2:a] -arr[0] % b -arr[0] - a -arr[0] / obj?.head(f, 0) -arr[0] <= min(1) -arr[0] >= f -arr[1 % b] -arr[1 * a] -arr[1] < a -arr[1] == b -arr[2 % b] -arr[2 * 0:b] -arr[2] * obj.a -arr[a + a] -arr[a - b] -arr[a] -arr[a] != f -arr[a] != f + 1 -arr[a] * a -arr[a] ** a -arr[a] + f -arr[a] - 1 / 1 -arr[a] .. b -arr[a] <= a -arr[a] > -a -arr[a] >= f -arr[a] ^ f -arr[add(a, 0)] -arr[add(b, 0):b] -arr[add(b, 0)] -arr[b % b] -arr[b - 0] -arr[b - a] -arr[b:a * b] -arr[b:obj.b] -arr[b] -arr[b] % a -arr[b] * (b + a) -arr[b] ** a -arr[b] - add(b, 1) -arr[b] - arr[a] -arr[b] - b -arr[b] - f -arr[b] - obj?.b -arr[b] == obj.b -arr[b] > -0 -arr[b] > a -arr[b] > b -arr[b] > get(arr, 0) -arr[b] > last(arr) -arr[div(a, 1)] -arr[div(a, 2)] -arr[div(a, b)] -arr[len("a")] -arr[max(0)] -arr[max(b)] -arr[obj.a] -arr[obj.b:obj?.fn(2)] -arr[obj.b] -arr[obj.fn(a)] -arr[obj.head(a)] -arr[obj.head(a, obj)] -arr[obj.head(f)] -arr[obj?.a] -arr[obj?.b] -arr[obj?.fn(0)] -arr[obj?.head(b)] -arr[obj?.head(f)] -arr[true ? b : obj] -b -b != -a -b != -f -b != 0 % b -b != 0 && obj?.head("c", 0.5) -b != 0 * a -b != 0 ? false : 1 -b != 0 ? obj : arr -b != 0 ? ok : nil -b != 0 ? true : arr -b != 0 or s <= "b" -b != 0.5 * a -b != 0.5 == ok != ok -b != 0.5 ? ok : ok -b != 0.5 ^ obj?.b -b != 1 - b -b != 1 - f -b != 1 / a -b != 1 == ok -b != 2 || f > a -b != a -b != a % a -b != a * a -b != a - a -b != a / 0.5 -b != a ? "b" : arr -b != a ? "c" : obj -b != a ? a : "a" -b != a ? f : div -b != a ? obj : add -b != add(2, 0) -b != add(2, a) -b != add(a, a) -b != b -b != b != false -b != b - a -b != b - b -b != b == nil -b != b == ok -b != b ? ok : div -b != b ? s : obj.a -b != div(2, b) -b != f -b != f != ok -b != f / a -b != f == true -b != f ? 0.5 : arr -b != f ? arr : ok -b != f ? obj : add -b != f or obj.b -b != float(a) -b != get(arr, 2) -b != get(obj, s) -b != nil ? nil : s -b != nil ? obj : f -b != nil || ok -b != obj.a -b != obj.b -b != obj.c -b != obj.head("b", obj) -b != obj.head(add) -b != obj.head(arr) -b != obj.head(arr, f < b) -b != obj.head(b, obj, false) -b != obj.head(div, f) -b != obj.head(nil, s) -b != obj.head(obj)?.a -b != obj.head(ok or not b) -b != obj.head(ok) -b != obj.obj -b != obj.obj.obj -b != obj?.a -b != obj?.a ** b -b != obj?.b -b != obj?.head(div) -b != obj?.head(false, ok) -b != obj?.head(map(obj, add)) -b != obj?.head(not (0 == 0)) -b != obj?.head(obj) -b != obj?.obj -b != obj?.obj.obj -b != obj?.obj?.a -b % (0 + b) -b % (0 - a) -b % (b - a) -b % -1 -b % -a -b % -obj.b -b % -obj?.b -b % 1 - f - b -b % 1 / 0.5 -b % 2 >= obj?.head(f) -b % 2 in arr -b % a -b % a % a -b % a % b -b % a * a -b % a * f -b % a + 0.5 + b -b % a - a -b % a - f -b % a .. b -b % a / a -b % a <= a -b % a == b -b % a > b -b % a in arr -b % add(0, b) -b % add(1, 2) -b % add(a, a) -b % arr[a] -b % arr[obj?.b] -b % b -b % b != a -b % b % obj.a -b % b * b -b % b + -0.5 -b % b - b -b % b - f -b % b < a -b % b < f -b % b <= f ? s : s -b % b == b -b % get(arr, b) -b % max(0, a) -b % obj.a -b % obj.b -b % obj.fn(1) -b % obj.head(a, div) -b % obj.obj.a -b % obj?.a -b % obj?.b -b % obj?.fn(b) -b % obj?.head(a) -b % obj?.head(a, obj) -b % obj?.head(b) -b % obj?.head(b, ok, div) -b % obj?.head(obj, false).b -b % obj?.obj?.a -b % obj?.obj?.b -b * (0 + f) -b * (2 + 0.5) -b * (a + f) -b * (a - 1) -b * -0 -b * -0.5 -b * -a -b * -b -b * -f -b * 0 != a -b * 0 * 0 -b * 0 ** 1 -b * 0 - get(arr, a) -b * 0 .. a -b * 0 / a -b * 0 / f -b * 0 < b -b * 0 >= b -b * 0 >= f -b * 0.5 / (b - b) -b * 0.5 / b -b * 0.5 <= f -b * 0.5 == b -b * 1 * a -b * 1 * min(b) -b * 2 == f -b * 2 > obj.b -b * a -b * a * a -b * a ** f -b * a + a -b * a - a -b * a .. b -b * a / 0.5 -b * a <= f -b * a == 0.5 - f -b * a == obj?.a -b * a > 2 ** f -b * a > f -b * a ^ 0 -b * abs(0) -b * abs(a) -b * abs(b) -b * add(2, b) -b * b -b * b != 0 % a -b * b != f -b * b % a -b * b * obj.a -b * b + b -b * b - obj.a -b * b / a -b * b / f -b * b / obj?.a -b * b == f -b * b == len(s) -b * b > f -b * b ^ a -b * b in arr -b * f -b * f * 0 -b * f * 2 -b * f * b -b * f + b -b * f + obj.a -b * f / b -b * f <= a == true -b * f <= b -b * f == b -b * f ^ 0.5 -b * first(arr) -b * float(0.5) -b * float(f) -b * get(arr, 0) -b * get(arr, 1) -b * int(a) -b * max(2) -b * obj.a -b * obj.b -b * obj.fn(b) -b * obj.head(a) -b * obj.head(b) -b * obj.obj.a -b * obj.obj.b -b * obj.obj?.a -b * obj.obj?.b -b * obj?.a -b * obj?.b -b * obj?.fn(obj.b) -b * obj?.fn(obj?.b) -b * obj?.head(b, a) * obj.a -b * obj?.head(f) -b * obj?.head(f, f < 0) -b * obj?.obj.b -b ** (0 * 0.5) -b ** (0 * f) -b ** (0 - a) -b ** (0 / b) -b ** (1 % 1) -b ** (2 * a) -b ** (a % b) -b ** (a - a) -b ** (b + b) -b ** (b / f) -b ** (f * b) -b ** (f + 0) -b ** (f - 0) -b ** (f - 2) -b ** (f / f) -b ** -a -b ** -b -b ** 0 * b * a -b ** 0 - b -b ** 0 < f -b ** 0 < obj?.fn(2) -b ** 0 == a -b ** 0 ^ a ** f -b ** 0 ^ obj.b -b ** 0.5 ** a -b ** 0.5 ** f -b ** 0.5 + obj?.a -b ** 0.5 >= b -b ** 0.5 ^ (a * b) -b ** 0.5 ^ b -b ** 1 / a -b ** 1 / f -b ** 2 ** a -b ** 2 ** b -b ** 2 + 0.5 ^ f -b ** 2 - a -b ** a -b ** a != obj?.a -b ** a != obj?.b -b ** a * b -b ** a * obj.b -b ** a ** b -b ** a + obj?.head(0) -b ** a - obj?.fn(b) -b ** a / b -b ** a / obj.fn(a) -b ** a < a -b ** a == obj?.fn(b) -b ** a > b -b ** a ^ 2 -b ** a ^ a -b ** arr[0] -b ** arr[a] -b ** b -b ** b * obj?.b -b ** b ** 0 -b ** b ** 0.5 -b ** b + a -b ** b < a % 2 -b ** b ^ f -b ** div(a, a) -b ** div(b, 2) -b ** f -b ** f != f -b ** f != obj.a -b ** f * a -b ** f * f -b ** f * obj.b -b ** f ** f -b ** f < 0 * 0.5 -b ** f < b -b ** f ^ a -b ** f ^ b -b ** int(0.5) -b ** int(a) -b ** int(b) -b ** max(1) -b ** max(a, a, f) -b ** min(1) -b ** obj.a -b ** obj.b -b ** obj.fn(2) -b ** obj.fn(b) -b ** obj.head(a) -b ** obj.head(b) -b ** obj.obj?.a -b ** obj.obj?.b -b ** obj?.a -b ** obj?.b -b ** obj?.fn(b) -b ** obj?.head(0.5) -b ** obj?.head(0.5, arr, "c") -b ** obj?.head(b, arr) -b ** obj?.obj.b -b ** obj?.obj?.a -b + -2 -b + -b -b + -f -b + 0 % b -b + 0 + a -b + 0 + b -b + 0 - b -b + 0 - obj.head(0.5, obj, div, obj, a) -b + 0 >= a -b + 0 ^ 1 -b + 0.5 != b - 0 -b + 0.5 + -0 -b + 0.5 + a % a -b + 0.5 / 2 -b + 0.5 / b -b + 0.5 >= b ? "c" : arr -b + 1 == obj.obj -b + 2 < -b -b + 2 < b -b + 2 <= b -b + 2 == obj.b -b + 2 ^ 0 -b + a -b + a != 1 * b -b + a != obj.obj -b + a % a -b + a ** 0 -b + a .. a -b + a .. b -b + a < a == false -b + a <= b -b + a > a -b + add(b, a) -b + b -b + b % b -b + b - a -b + b - obj?.head(0.5) -b + b / 1 -b + b / b -b + b <= a -b + b == a -b + b >= get(arr, 0) -b + b ^ 1 -b + count(arr, true) -b + div(0, 1) -b + f -b + f != b ? nil : f -b + f ** a -b + f + a -b + f - b -b + f - b - b -b + f - obj.fn(a) -b + f == f -b + f == obj?.a -b + f > b -b + f > div(2, a) -b + float(0.5) -b + int(f) -b + len("c") -b + max(f) -b + min(0.5) -b + obj.a -b + obj.a > f -b + obj.b -b + obj.head(b) -b + obj.head(f, "c", 0) -b + obj.head(f, 1, 0.5) -b + obj.obj.a -b + obj.obj.b -b + obj.obj?.b -b + obj?.a -b + obj?.b -b + obj?.head(0, 0.5, nil, b, obj) -b + obj?.head(0, add) -b + obj?.head(1, a, obj, obj) -b + obj?.head(b) -b + obj?.obj.b -b + obj?.obj?.a -b + obj?.obj?.b -b - -2 -b - -b -b - -f -b - 0 - 0 -b - 0 == a ? obj : false -b - 0 > b -b - 0 > f -b - 0 ^ 0 -b - 0.5 != f -b - 0.5 / b -b - 1 - b -b - 1 .. b -b - 1 / 0 -b - 1 / 2 -b - 1 / a -b - 1 / f -b - 1 < b -b - 1 <= add(b, 0) -b - 2 ** 2 -b - 2 - 2 -b - 2 / a -b - 2 < b -b - a -b - a % b -b - a * f -b - a ** 1 -b - a + f -b - a - 0.5 -b - a .. a -b - a == a -b - a == f -b - a ^ 0 -b - a ^ b -b - a in arr -b - abs(0) -b - add(2, b) -b - add(a, 0) -b - arr[0] -b - arr[obj.b] -b - b -b - b + a -b - b - b -b - b - f -b - b .. a -b - b < a -b - b < a ^ 0.5 -b - b ^ 0 -b - b ^ f -b - div(2, 2) -b - div(a, a) -b - f -b - f ** a -b - f + 0 -b - f + 1 -b - f + obj?.b -b - f - 0 ** a -b - f - 0.5 -b - f - f -b - f < f -b - f == a -b - f >= len(arr) -b - get(arr, a) -b - int(0.5) -b - max(0, a) -b - max(a) -b - min(2) -b - obj.a -b - obj.a + a -b - obj.a == b -b - obj.b -b - obj.fn(b) -b - obj.fn(true && a) -b - obj.head(0, obj) -b - obj.head(f, 2, f) -b - obj.obj.a -b - obj.obj?.a -b - obj?.a -b - obj?.b -b - obj?.fn(b) -b - obj?.head(1) -b - obj?.head(f) -b - obj?.obj.b -b - obj?.obj?.a -b - obj?.obj?.b -b .. -2 -b .. -a -b .. -b -b .. 0 * a -b .. 0 + b -b .. 0 == obj.b -b .. 1 * 2 -b .. a -b .. a % a -b .. a + b -b .. add(a, count(arr, false)) -b .. add(b, 0) -b .. add(b, a) -b .. add(b, b) -b .. arr[b % 2] -b .. b -b .. b * a -b .. b + b -b .. count(arr, ok) -b .. first(obj.head("b", obj)) -b .. get(arr, 0) -b .. get(arr, b) -b .. len(s) -b .. min(b) -b .. obj.a -b .. obj.b -b .. obj.head(b) -b .. obj?.a -b .. obj?.b -b .. obj?.fn(a) -b .. obj?.head(2) -b .. obj?.head(a) -b .. obj?.head(obj, s, div)?.b -b .. obj?.obj.b -b .. obj?.obj?.a -b / (0 + 0) -b / (1 + b) -b / (a + f) -b / (a - 0.5) -b / (a - 2) -b / (b - b) -b / (f + b) -b / (f - f) -b / -0 -b / -0.5 -b / 0 * f -b / 0 - b -b / 0 / a -b / 0 < a -b / 0 > b -b / 0 > b ? f : s -b / 0 >= f -b / 0.5 * a -b / 0.5 * f -b / 0.5 ** 2 -b / 0.5 + b -b / 0.5 - b -b / 0.5 <= a -b / 0.5 <= obj?.a -b / 0.5 >= 0.5 ? obj : arr -b / 1 / b -b / 2 != a -b / 2 <= abs(1) -b / 2 ^ 2 -b / a -b / a != a -b / a != obj.obj -b / a ** f -b / a + a -b / a + b -b / a / 0 -b / a / a -b / a / b -b / a == obj?.b -b / a > 2 ? div : arr -b / a > b -b / add(1, a) -b / add(a, a) -b / add(b, 1) -b / add(b, b) -b / arr[a] -b / b -b / b * 0 ** b -b / b ** f -b / b < b -b / b < obj.b -b / b <= b -b / b ^ 0 -b / f -b / f != a -b / f != abs(0.5) -b / f * f -b / f ** 0.5 -b / f + b -b / f / f -b / f < f -b / f <= b -b / f <= f -b / f <= obj?.a -b / f == a -b / f >= a -b / get(arr, 0) -b / get(arr, b) -b / int(a) -b / min(1) -b / min(b) -b / obj.a -b / obj.b -b / obj.fn(2) -b / obj.fn(a) -b / obj.fn(b) -b / obj.head(a, arr, add, a) -b / obj.obj.a -b / obj.obj.b -b / obj.obj?.obj.a -b / obj?.a -b / obj?.b -b / obj?.head(b, arr, f) -b / obj?.obj.a -b / obj?.obj.b -b < -2 -b < 0 != obj.b -b < 0 % b -b < 0 + 1 -b < 0 - a -b < 0 or ok -b < 0 || ok -b < 0.5 ? a : b -b < 0.5 ? nil : div -b < 1 == ok -b < 1 ? b : 0 -b < 2 && obj.fn(b) -b < 2 ** 1 -b < 2 / 1 -b < 2 / a -b < 2 ^ a -b < a -b < a ** 0.5 -b < a + a -b < a - 1 -b < a - f -b < a / b -b < a ? "a" : obj -b < a ? 0 : nil -b < a ? div : s -b < a ? obj : f -b < a ^ a and obj.head("c", 2)?.a -b < a ^ f -b < a and ok -b < add(b, 1) -b < add(b, a) -b < b -b < b && ok -b < b - 1 -b < b == ok -b < b ? b : true -b < b ? f : arr -b < b ? nil : ok -b < b ? s : s -b < b ^ b -b < b and "b" in obj -b < b and nil != 0 -b < b and obj.a -b < b and ok -b < b or obj?.a -b < f -b < f != ok -b < f ** b -b < f == ok -b < f ? 1 : div -b < f ? obj : b -b < f ? obj.fn(arr, nil, nil, div) : obj -b < f ? ok : s -b < float(0) -b < float(b) -b < int(0) -b < int(f) -b < obj.a -b < obj.a != obj?.obj -b < obj.b -b < obj.head(f) -b < obj.obj.a -b < obj?.a -b < obj?.b -b < obj?.b == true != obj.a -b < obj?.fn(0) -b < obj?.head(0) -b < obj?.head(0, s, a) -b < obj?.head(b) -b < obj?.head(b, nil) -b < obj?.obj?.a -b < obj?.obj?.b -b <= -0 -b <= -1 -b <= -a -b <= 0 != ok -b <= 0 % b -b <= 0 && obj[s] -b <= 0 * 0.5 -b <= 0 - 0.5 -b <= 0.5 + 0.5 -b <= 0.5 ? ok : b -b <= 1 - f -b <= 1 ? b : a -b <= 1 || ok -b <= 2 ? s : obj -b <= 2 and ok -b <= a -b <= a * 1 -b <= a ** 0 -b <= a == nil -b <= a ? 0 : div -b <= a ? obj : arr -b <= a ^ a -b <= a || obj?.a -b <= a || ok -b <= abs(a) -b <= abs(f) -b <= add(b, 1) -b <= arr[b] -b <= b -b <= b != nil -b <= b % b -b <= b * a -b <= b + b -b <= b / f -b <= b ? add : ok -b <= b ^ b -b <= b or b < b -b <= b or obj.b -b <= b || ok -b <= count(arr, ok) -b <= div(b, b) -b <= f -b <= f != false -b <= f != ok -b <= f != ok ? arr : add -b <= f * f -b <= f ** f -b <= f + b -b <= f - obj?.b -b <= float(b) -b <= get(arr, 0) -b <= int(a) -b <= int(arr[0]) -b <= len(keys(obj)) -b <= max(0) -b <= max(a) -b <= max(f, f, a, f, f) -b <= min(b, 0) -b <= obj.a -b <= obj.b -b <= obj.head(1) -b <= obj.head(a, 0) -b <= obj.head(b) -b <= obj.obj.b -b <= obj?.a -b <= obj?.b -b <= obj?.fn(a) -b <= obj?.fn(arr[0.5]) -b <= obj?.head(0, ok, false) -b <= obj?.obj.a -b == -0.5 -b == -b -b == -f -b == 0 != true ? b : arr -b == 0 * 0 -b == 0 + 0 -b == 0 / a -b == 0 == obj.b -b == 0 ? arr : a -b == 0 ? s : 0.5 -b == 0 and obj?.obj -b == 0 or obj?.head(s) -b == 0 || obj.obj -b == 0.5 != obj.head(a, s, ok) -b == 1 + obj.a -b == 1 ? add : false -b == 1 ^ b -b == 2 ^ a -b == a -b == a != nil -b == a / 1 -b == a == nil -b == a ? a : b -b == a ? div : ok -b == a ? f : false -b == a ? f : ok -b == a or ok -b == abs(f) -b == add(0, b) -b == add(a, 2) -b == add(a, a) -b == add(a, b) -b == arr[a] -b == arr[b] -b == b -b == b != obj?.obj -b == b != ok -b == b && 0 != 0 -b == b * 2 -b == b - a -b == b - b -b == b / 0.5 -b == b / b -b == b == not false -b == b or f < 0 -b == div(b, a) -b == f -b == f && ok -b == f * 0 -b == f - b -b == f == ok -b == f ? add : div -b == f or ok -b == f || obj.b -b == float(b) -b == get(arr, 0) -b == get(arr, 1) -b == get(obj.head(nil, 0.5, div), a) -b == int(0) -b == len("a") -b == max(f) -b == min(0) -b == nil != obj.a -b == obj.a -b == obj.b -b == obj.b != obj.obj -b == obj.fn(0) -b == obj.fn(a) -b == obj.fn(add(a, 1)) -b == obj.fn(b) -b == obj.head(arr) -b == obj.head(div) -b == obj.head(f) -b == obj.head(obj?.head(ok, 0, div)) -b == obj.head(ok, b, 2) -b == obj.head(one(arr, ok)) -b == obj.head(true, add, div) -b == obj.obj -b == obj?.a -b == obj?.b -b == obj?.head("b") -b == obj?.head(0) -b == obj?.head(a) -b == obj?.head(div) -b == obj?.head(nil, add, ok) -b == obj?.head(obj).a -b == obj?.head(obj?.b) -b == obj?.head(s) -b == obj?.obj -b == obj?.obj.b -b == obj?.obj?.obj -b == obj[s] -b > 0 != true -b > 0 - 2 -b > 0 / a -b > 0 || ok -b > 0 || ok ? 0 : a -b > 0.5 ? arr : div -b > 0.5 ^ 2 -b > 0.5 || nil == "a" -b > 0.5 || obj.head(1 .. s.obj) -b > 1 * f -b > 1 ? 0 : 0 -b > 1 ? false : f -b > 1 and 2 <= b -b > 2 != ok -b > 2 ? "a" : false -b > a -b > a != false -b > a != nil -b > a * a -b > a * f -b > a ** 0 -b > a ** b -b > a ** f -b > a / 2 -b > a / obj?.b -b > a ^ b -b > a or 0.5 > 2 -b > a or a != 0 -b > a || f != 0 -b > a || obj?.fn(div, arr).obj -b > a || ok -b > abs(0.5) -b > arr[0] -b > arr[a] -b > b -b > b % a -b > b * 0.5 -b > b * f -b > b ** a -b > b + f -b > b - 0.5 -b > b - f -b > b ? ok : ok -b > b ? ok : s -b > b ^ a -b > b or obj?.head(a, 1) -b > b || ok -b > div(a, -b) -b > div(b, a) -b > f -b > f != obj?.b -b > f * a -b > f / b -b > f == obj.b -b > f ? arr : div -b > f ? b : s -b > f ? f : "c" -b > f ^ b -b > f and not ok -b > f or obj.obj -b > float(b) -b > float(f) -b > int(0) -b > len(obj) -b > obj.a -b > obj.b -b > obj.fn(a) -b > obj.head(f) -b > obj.obj.b -b > obj?.a -b > obj?.b -b > obj?.head(0) -b > obj?.head(0.5, 0) -b > obj?.obj.a -b > obj?.obj?.b -b >= -a -b >= -b -b >= -f -b >= 0 != ok -b >= 0 - b -b >= 0 ? 0.5 : true -b >= 0 ? add : arr -b >= 0 ? s : "c" -b >= 0 ^ 0.5 -b >= 0 and obj.head(s, f, arr, 0) -b >= 0.5 == ok -b >= 0.5 ? f : 0 -b >= 0.5 and obj.a -b >= a -b >= a - 0.5 -b >= a == nil -b >= a ? obj.obj : add -b >= a ^ f -b >= a and 0.5 >= b -b >= abs(1) -b >= b -b >= b % a -b >= b % b -b >= b && nil != arr -b >= b ** 0 -b >= b ** obj.b -b >= b + 0.5 -b >= b and obj.b -b >= b in obj?.head(nil, 0.5)?.obj -b >= b or obj.fn(b)?.a -b >= b || f - obj?.obj -b >= div(a, b) -b >= div(b, a) -b >= div(b, b) -b >= f -b >= f != false -b >= f ** b -b >= f ? 0.5 : s -b >= f ? nil : false -b >= f ^ 0.5 -b >= f ^ b -b >= f || a == f -b >= f || obj?.head(nil, s) -b >= int(0) != obj?.obj -b >= int(a) -b >= last(arr) -b >= min(b) -b >= obj.a -b >= obj.b -b >= obj.head(a) -b >= obj.head(f, arr, add) -b >= obj.obj?.a -b >= obj?.a -b >= obj?.a + a -b >= obj?.b -b >= obj?.b and ok -b >= obj?.fn(0) -b >= obj?.fn(a) -b >= obj?.fn(b) -b >= obj?.head(f) -b >= obj?.obj.a -b ^ (0 * 1) -b ^ (0.5 + 0) -b ^ (0.5 + b) -b ^ (0.5 - a) -b ^ (1 - 0.5) -b ^ (1 / 0) -b ^ (a * b) -b ^ (a - a) -b ^ (a / a) -b ^ (b * a) -b ^ (b + 0) -b ^ (b + 0.5) -b ^ (b / 0) -b ^ (b / b) -b ^ (f * 0) -b ^ (f * 0.5) -b ^ (f + b) -b ^ (f - b) -b ^ (f / 0.5) -b ^ -a -b ^ -b -b ^ 0 != count(arr, ok) -b ^ 0 != f ? arr : obj -b ^ 0 + f -b ^ 0 / f / f -b ^ 0 ^ b -b ^ 0.5 * f -b ^ 0.5 < f -b ^ 0.5 <= f -b ^ 0.5 > obj?.a -b ^ 0.5 >= b -b ^ 1 - f -b ^ 1 == obj?.obj -b ^ 1 > f - f -b ^ 1 ^ b -b ^ 2 < obj.b -b ^ 2 <= a -b ^ 2 > a -b ^ 2 ^ f -b ^ 2 ^ obj?.fn(0) -b ^ a -b ^ a ** (f / a) -b ^ a ** a -b ^ a + f -b ^ a - b + a -b ^ a - max(a) -b ^ a - min(b) -b ^ a <= arr[a] -b ^ a <= f ? add : true -b ^ a == b -b ^ a == obj.obj -b ^ a ^ f -b ^ add(0, a) -b ^ add(2, a) -b ^ add(a, b) -b ^ add(b, 2) -b ^ b -b ^ b < -0.5 -b ^ b < f -b ^ b == 0 / 1 -b ^ b == a -b ^ b == a + 0 -b ^ b > f -b ^ count(arr, true) -b ^ div(0, b) -b ^ div(1, a) -b ^ div(b, a) -b ^ f -b ^ f >= 0 ? b : b -b ^ f ^ 0.5 -b ^ f ^ a -b ^ f ^ b -b ^ get(arr, b) -b ^ int(f) -b ^ len(arr) -b ^ min(f) -b ^ obj.a -b ^ obj.b -b ^ obj.head(1) -b ^ obj.head(b) -b ^ obj.obj?.a -b ^ obj?.a -b ^ obj?.b -b ^ obj?.fn(2) -b ^ obj?.head(0.5, div, a) -b ^ obj?.head(a, a) -b ^ obj?.head(b) -b ^ obj?.obj.a -b ^ obj?.obj?.a -b ^ obj?.obj?.b -b in arr -b in arr && true ? obj : div -b in arr == not ok -b in arr == true -b in arr || nil == obj -b in arr[2:1] -b in filter(arr, ok) -b in map(arr, 0) -b in obj.head(arr) -b in obj.head(nil, b, arr, 0, 0.5)?.a -b in obj[s] -count([f], ok) -count([nil, arr, ok], ok) -count(a .. 0, obj.a) -count(a .. 0, ok || ok) -count(arr, "b" < s) -count(arr, "b" <= "a") -count(arr, "c" > s) -count(arr, # != #) -count(arr, # == f) -count(arr, # >= a) -count(arr, # >= add(b, 0)) -count(arr, 0 != a) -count(arr, 0 != f) -count(arr, 0 <= 0) -count(arr, 0 <= 0.5) -count(arr, 0 == a) -count(arr, 0 > 0.5) -count(arr, 0 > a) -count(arr, 0 > f) -count(arr, 0.5 == 0.5) -count(arr, 0.5 > 0.5) -count(arr, 0.5 >= 0.5) -count(arr, 1 < f) -count(arr, 1 == b) -count(arr, 2 < a) -count(arr, 2 >= f) -count(arr, a <= b) -count(arr, a == nil) -count(arr, a >= 0.5) -count(arr, a >= a) -count(arr, add != div) -count(arr, add == add) -count(arr, all(arr, false)) -count(arr, any(arr, ok)) -count(arr, any(arr, true)) -count(arr, arr == nil) -count(arr, b != b) -count(arr, b <= 1) -count(arr, b == 0) -count(arr, b == b) -count(arr, b > 1) -count(arr, b >= 1) -count(arr, b >= a) -count(arr, b in arr) -count(arr, f != nil) -count(arr, f < b) -count(arr, f > a) -count(arr, false or false) -count(arr, false) % b -count(arr, false) + abs(0.5) -count(arr, false) == a -count(arr, false) == f -count(arr, false) > f -count(arr, false) >= f + 0 -count(arr, false) >= obj?.a -count(arr, false) ^ f -count(arr, false) in arr -count(arr, nil != 0) -count(arr, nil != arr) -count(arr, nil != div) -count(arr, nil == 0.5) -count(arr, nil == a) -count(arr, nil == s) -count(arr, not false) -count(arr, obj != obj) -count(arr, obj.head(ok)) -count(arr, obj?.a == arr) -count(arr, ok != ok) -count(arr, ok or 0 > 0.5) -count(arr, ok) -count(arr, ok) != b ? "b" : a -count(arr, ok) % add(0, b) -count(arr, ok) ** a -count(arr, ok) + b -count(arr, ok) - int(a) -count(arr, ok) / a -count(arr, ok) < a -count(arr, ok) == b -count(arr, ok) > a -count(arr, ok) > b -count(arr, ok) > obj.a -count(arr, ok) in arr -count(arr, one(arr, false)) -count(arr, s != s) -count(arr, s contains "c") -count(arr, s endsWith "a") -count(arr, true) * obj?.a -count(arr, true) - b -count(arr, true) <= a -count(arr, true) == b -count(arr, true) > a -count(arr, true) >= arr[b] -count(b .. a, a == 0) -count(b .. a, obj?.head(ok, obj, f, ok, arr)) -count(b .. a, ok) -count(b .. b, not false) -count(b .. b, ok == false) -count(false ? f : obj, not true) -count(false ? true : obj, 2 <= 1) -count(filter(arr, false), obj?.obj) -count(keys(obj), b >= f) -count(keys(obj), ok) -count(map(arr, "b"), ok) -count(map(arr, 0.5), ok) -count(map(arr, a), ok) -count(map(arr, add), ok) -count(map(arr, arr), f == b) -count(map(arr, arr), ok) -count(map(arr, f), ok) -count(map(arr, obj), 0 != b) -count(map(arr, obj), f == f) -count(map(arr, true), #) -count(map(obj.obj, arr), ok) -count(obj.head("b", arr, add), 0.5 == 0.5) -count(obj.head(obj), nil == nil) -count(obj.head(obj, obj, s), ok) -count(obj.head(s), any(arr, false)) -count(obj.head(s, s, arr, add, obj), ok) -count(obj.obj, 0 < 0) -count(obj.obj, all(arr, false)) -count(obj.obj, b > 0) -count(obj.obj, f != 0) -count(obj.obj, nil == s) -count(obj.obj, obj != nil) -count(obj.obj, obj != obj) -count(obj.obj, obj?.head(ok)) -count(obj.obj, ok) -count(obj?.head("a", a), ok) != f -count(obj?.head("c", a, obj), f == 0) -count(obj?.head(s), ok) -count(obj?.head(s, s), f <= a) -count(obj?.obj, "c" >= "c") -count(obj?.obj, 0 == nil) -count(obj?.obj, a != nil) -count(obj?.obj, a == 1) -count(obj?.obj, f >= f) -count(obj?.obj, none(arr, false)) -count(obj?.obj, obj.head(true)) -count(obj?.obj, obj?.head(false)) -count(obj?.obj, ok != true) -count(obj?.obj, ok) -count(values(obj), ok) -count(values(obj), true and ok) -date(s, s) +add == div ? i32 : f64 +add == div or ok +add == foo.Qux +add == foo.String +add == foo?.Qux +add == foo?.String +add == greet +add == greet ? 1 : 1 +add == half +add == nil && ok +add == nil ? "foo" : list +add == nil ? add : half +add == nil ? add : score +add == nil ? i32 : div +add == nil ? score : i64 +add == nil || ok +add == score +add == score != true +add == score and i32 >= 1 +add == score or 0.5 < 1 +add in [div] +add not in [f64] +add not in sort(array) +add(1, 1) ** i +add(1, 1) ^ i +add(1, i) .. i64 +add(i, 1 - i32) +add(i, abs(i)) +add(i, i) +add(i, i64 % 1) +add(i, min(i)) +add(min(1, 1), i32 * 1) +add(score(i, i), i) +all(1 .. i32, ok) +all(array, !(# <= #)) +all(array, !false) +all(array, !ok) +all(array, !true or 0.5 < #) +all(array, "bar" in foo) +all(array, "bar" matches "bar") +all(array, # != #) +all(array, # != 1) +all(array, # != f32) +all(array, # != f64) +all(array, # != i64) +all(array, # != nil) +all(array, # + # >= 0.5 + i) +all(array, # < #) +all(array, # < 0.5) +all(array, # < 1) +all(array, # <= #) +all(array, # <= 0.5) +all(array, # <= f64) +all(array, # <= i) +all(array, # == #) +all(array, # == 0.5) +all(array, # == i32) +all(array, # == i64) +all(array, # == nil) +all(array, # > #) +all(array, # > 0.5) +all(array, # > 1) +all(array, # > f32) +all(array, # > f64) +all(array, # > i) +all(array, # > i64) +all(array, # >= #) +all(array, # >= 0.5) +all(array, # >= f64) +all(array, # >= i) +all(array, # ^ # == i64) +all(array, # in array) +all(array, # not in array) +all(array, 0.5 != #) +all(array, 0.5 != f32) +all(array, 0.5 + 0.5 >= #) +all(array, 0.5 < #) +all(array, 0.5 < 1) +all(array, 0.5 < i64) +all(array, 0.5 <= #) +all(array, 0.5 == #) +all(array, 0.5 == f32) +all(array, 0.5 > #) +all(array, 0.5 > 1) +all(array, 0.5 >= #) +all(array, 1 != #) +all(array, 1 != i) +all(array, 1 != i64) +all(array, 1 != nil) +all(array, 1 < #) +all(array, 1 <= #) +all(array, 1 == #) +all(array, 1 > #) +all(array, 1 in array) +all(array, all(array, add != score)) +all(array, all(array, false)) +all(array, all(list, false)) +all(array, f32 >= #) +all(array, f64 != #) +all(array, f64 != i32) +all(array, f64 < #) +all(array, f64 <= #) +all(array, f64 == #) +all(array, f64 > #) +all(array, false or ok) +all(array, i != f32) +all(array, i == #) +all(array, i > #) +all(array, i >= #) +all(array, i32 != i64) +all(array, i32 < #) +all(array, i32 <= #) +all(array, i32 <= i32) +all(array, i32 > #) +all(array, i32 >= 1 % #) +all(array, i64 < #) +all(array, i64 < 1) +all(array, i64 < i64) +all(array, i64 == #) +all(array, i64 == 0.5) +all(array, i64 > #) +all(array, list != list) +all(array, nil != #) +all(array, nil != i) +all(array, nil == "foo") +all(array, nil == div) +all(array, nil in list) +all(array, not (nil in array)) +all(array, not false) +all(array, not true) +all(array, ok) +all(array, one(array, ok)) +all(array, score == add) +all(array, score(#) > f32) +all(array, true || false) +all(array, true) or ok +all(false ? greet : "foo", # == i32) +all(filter(array, ok), # < #) +all(filter(array, true), ok) +all(i32 .. 1, 0.5 < i32) +all(i64 .. i64, # != #) +all(list, !any(array, false)) +all(list, !false) +all(list, !ok) +all(list, "bar" not in #) +all(list, "foo" >= "foo") +all(list, # != #) +all(list, # != foo) +all(list, # == #) +all(list, # == foo) +all(list, 0.5 != f64) +all(list, 0.5 != nil) +all(list, 0.5 <= f64) +all(list, 0.5 > 1) +all(list, 1 != 0.5) +all(list, 1 != i) +all(list, 1 < f32) +all(list, 1 < i) +all(list, 1 <= 0.5) +all(list, 1 == 1) +all(list, 1 > f32) +all(list, 1 >= i64) +all(list, all(array, true)) +all(list, array != nil) +all(list, div != div) +all(list, f32 != 0.5) +all(list, f32 == f64) +all(list, f64 < 1) +all(list, f64 <= 1) +all(list, f64 <= i) +all(list, f64 <= i32) +all(list, f64 >= 1) +all(list, false) or 0.5 <= 1 +all(list, foo != #) +all(list, greet != half) +all(list, greet == score) +all(list, i <= i64) +all(list, i32 != i64) +all(list, i32 < i64) +all(list, i32 <= 0.5) +all(list, i32 <= f64) +all(list, int(i32) != i32) +all(list, list != nil) +all(list, nil != 1) +all(list, nil != foo) +all(list, nil == #) +all(list, nil == greet) +all(list, nil in list) +all(list, none(array, ok)) +all(list, not false) +all(list, not ok) +all(list, not true) +all(list, ok and false) +all(list, ok) +all(list, ok) or ok +all(list, true != false) +all(list, true != true) +all(list, true ? true : 1) +all(list[i64:i32], !false) +all(map(array, #), # != #) +all(map(array, #), # != 0.5) +all(map(array, #), # >= #) +all(map(array, #), i64 == #) +all(map(array, #), true or false) +all(map(array, 1), ok) +all(map(array, i), f64 > #) +all(map(array, ok), #) +all(map(list, "bar"), ok) +all(map(list, #), "bar" not in #) +all(map(list, #), f32 > 1) +all(map(list, 1), ok) +all(map(list, false), #) +all(map(list, i64), # <= #) +all(map(list, ok), #) +all(map(list, true), # == #) +all(map(list, true), #) +all(map(list, true), ok) +any([0.5, add, 0.5], # == #) +any([1], i64 >= #) +any(array, !false) +any(array, "foo" <= "foo") +any(array, # != #) +any(array, # != 0.5) +any(array, # != 1) +any(array, # != i) +any(array, # != i32) +any(array, # != i64) +any(array, # != nil) +any(array, # < #) +any(array, # < 0.5) +any(array, # < 1) +any(array, # < f32) +any(array, # < f64) +any(array, # < i) +any(array, # < i32) +any(array, # <= #) +any(array, # <= 0.5) +any(array, # <= 1 ^ #) +any(array, # <= 1) +any(array, # <= i) +any(array, # <= i32) +any(array, # == #) +any(array, # == 1) +any(array, # == f64) +any(array, # == i) +any(array, # == i32) +any(array, # == i64) +any(array, # == nil) +any(array, # > #) +any(array, # > 1) +any(array, # > i32) +any(array, # > i64) +any(array, # >= #) +any(array, # >= 0.5) +any(array, # >= 1) +any(array, # >= f64) +any(array, # >= i) +any(array, # >= i32) +any(array, # in array) +any(array, # not in array) +any(array, 0.5 != #) +any(array, 0.5 != f64) +any(array, 0.5 != i) +any(array, 0.5 < 0.5) +any(array, 0.5 <= #) +any(array, 0.5 == #) +any(array, 0.5 == 0.5) +any(array, 0.5 > #) +any(array, 0.5 > f32) +any(array, 1 < #) +any(array, 1 <= i64) +any(array, 1 == #) +any(array, 1 > f64) +any(array, 1 >= i) +any(array, 1 >= i32) +any(array, all(list, true)) +any(array, array == array) +any(array, div != nil) +any(array, f32 < #) +any(array, f32 > #) +any(array, f64 != #) +any(array, f64 != 1) +any(array, f64 < #) +any(array, f64 <= 0.5) +any(array, f64 <= f32) +any(array, f64 == #) +any(array, f64 > #) +any(array, f64 > 0.5) +any(array, f64 >= i64) +any(array, false != nil) +any(array, false) and f32 != f32 +any(array, greet != half) +any(array, half != div) +any(array, half != nil) +any(array, i != 1) +any(array, i < # ** #) +any(array, i <= #) +any(array, i == #) +any(array, i == i) +any(array, i > #) +any(array, i >= #) +any(array, i32 != #) +any(array, i32 != i64) +any(array, i32 <= #) +any(array, i32 == #) +any(array, i32 > #) +any(array, i32 >= i64) +any(array, i64 != #) +any(array, i64 != i64) +any(array, i64 <= 0.5) +any(array, i64 == #) +any(array, i64 > #) +any(array, i64 > 1) +any(array, i64 > f32) +any(array, i64 >= i) +any(array, nil != #) +any(array, nil != f64) +any(array, nil != greet) +any(array, nil == #) +any(array, nil == 1) +any(array, not ok) +any(array, not true) +any(array, ok) +any(array, one(list, false)) +any(array, true ? ok : f32) +any(array, true) and ok +any(filter(array, ok), ok) +any(filter(list, false), ok) +any(filter(list, true), # == #) +any(list, !true) +any(list, "bar" contains "foo") +any(list, "bar" matches "foo") +any(list, "bar" not in #) +any(list, "bar" not startsWith "foo") +any(list, # != #) +any(list, # != foo) +any(list, # != nil) +any(list, # == #) +any(list, # == nil) +any(list, # in list) +any(list, # not in list) +any(list, 0.5 < 1) +any(list, 0.5 <= f32) +any(list, 0.5 == 0.5) +any(list, 0.5 >= 0.5) +any(list, 0.5 >= f32) +any(list, 0.5 >= i64) +any(list, 1 <= 0.5) +any(list, 1 == f32) +any(list, f32 != i) +any(list, f32 == nil) +any(list, f32 >= i) +any(list, f64 <= 1) +any(list, f64 > 0.5) +any(list, false ? nil : false) +any(list, foo == foo) +any(list, greet == div) +any(list, half != nil) +any(list, i != 1) +any(list, i < f32) +any(list, i < f64) +any(list, i > i64) +any(list, i32 != i32) +any(list, i32 < 0.5) +any(list, i32 == f64) +any(list, i64 < 1) +any(list, i64 < f64) +any(list, i64 < i64) +any(list, i64 <= i32) +any(list, i64 >= 1) +any(list, i64 >= f32) +any(list, list != nil) +any(list, nil != #) +any(list, nil != #?.String()) +any(list, nil != nil) +any(list, nil == #) +any(list, nil == 1) +any(list, nil == i64) +any(list, nil == nil) +any(list, not false) +any(list, not ok) +any(list, ok and foo != #) +any(list, ok) +any(list, ok) && i <= 1 +any(list, ok) ? array : foo +any(list, true or ok) +any(list, true) ? f64 : foo.Bar +any(map(array, #), # == #) +any(map(array, #), ok) +any(map(array, 0.5), # <= #) +any(map(array, f64), # < #) +any(map(array, false), #) +any(map(array, ok), #) +any(map(list, #), i == f64) +any(map(list, #), ok) +any(map(list, 1), # != #) +any(map(list, array), ok) +any(map(list, foo), # != #) +any(map(list, greet), # == #) +any(ok ? "bar" : half, ok) +any(splitAfter("bar", "foo"), # not startsWith #) +array +array != [array] +array != array +array != filter(list, true) +array != list +array != map(array, i) +array != nil != ok +array != nil ? 0.5 : i32 +array != nil ? true : nil +array != nil or nil == f32 +array != nil || ok +array != sort(array) +array != {"bar": f32, "foo": 1}.ok +array == array +array == array ? "foo" : 0.5 +array == list +array == list ? i : half +array == map(array, #) +array == map(array, add) +array == nil != nil +array == nil != true ? 0.5 : 0.5 +array == nil && (false || ok) +array in [i] +array[-1] +array[-i32] +array[-i64] +array[-i] +array[1 % 1] +array[1 % i:i64] +array[1] != f32 +array[1] != score(i) +array[1] <= f64 +array[1] == f32 +array[1] == i64 +array[1] ^ 0.5 ^ f64 +array[1] ^ i32 +array[false ? half : 0.5] +array[false ? i : i32] +array[i - i64] +array[i32:i32] +array[i32] +array[i32] - f64 +array[i32] .. i32 +array[i64 % 1] +array[i64:i32] +array[i64:i] +array[i64] +array[i64] ** f32 +array[i64] / i +array[i64] < i +array[i64] == f64 +array[i64] > f32 +array[i64] >= -i64 +array[i:i64] +array[i:i] +array[i] +array[i] ** i64 +array[i] + f32 +array[i] < i +array[i] == min(i32, i) +array[i] > i32 +array[int(1)] +array[int(i32)] +array[max(i64)] +array[min(1)] +array[min(i32)] +array[min(i64)] +array[score(1)] +array[score(i)] +count([list], false or ok) +count(array, !ok) +count(array, "bar" != "bar") +count(array, "bar" not endsWith "bar") +count(array, # != #) +count(array, # != f32) +count(array, # != i32) +count(array, # < #) +count(array, # < 0.5) +count(array, # < 1) +count(array, # < f32) +count(array, # < f64) +count(array, # < i) +count(array, # < i64) +count(array, # <= #) +count(array, # <= 0.5) +count(array, # <= f32) +count(array, # <= f64) +count(array, # <= i) +count(array, # <= i32) +count(array, # == #) +count(array, # == 1) +count(array, # == f32) +count(array, # == i) +count(array, # == i64) +count(array, # == nil) +count(array, # > #) +count(array, # > 0.5) +count(array, # > i) +count(array, # > i64) +count(array, # >= # / #) +count(array, # >= #) +count(array, # >= 0.5) +count(array, # >= 1) +count(array, # >= f64) +count(array, # >= i) +count(array, # >= i64) +count(array, 0.5 != #) +count(array, 0.5 <= #) +count(array, 0.5 == #) +count(array, 0.5 > #) +count(array, 0.5 > 1) +count(array, 0.5 >= #) +count(array, 0.5 >= 0.5) +count(array, 0.5 >= i) +count(array, 1 != #) +count(array, 1 < #) +count(array, 1 < 0.5) +count(array, 1 < 1) +count(array, 1 <= #) +count(array, 1 > #) +count(array, 1 >= #) +count(array, add == half) +count(array, f32 != i) +count(array, f32 < # ? true : half) +count(array, f32 < #) +count(array, f32 < 0.5) +count(array, f32 <= #) +count(array, f32 <= 1) +count(array, f32 <= i) +count(array, f32 == #) +count(array, f32 == 1) +count(array, f64 != #) +count(array, f64 < #) +count(array, f64 <= #) +count(array, f64 == #) +count(array, f64 > #) +count(array, false == true) +count(array, false) != f64 +count(array, false) / i +count(array, false) >= f32 +count(array, foo not in list) +count(array, greet != greet) +count(array, greet == score) +count(array, i != f32) +count(array, i == nil) +count(array, i > #) +count(array, i >= #) +count(array, i32 != 1) +count(array, i32 < #) +count(array, i32 < 0.5) +count(array, i32 == #) +count(array, i32 > i) +count(array, i32 >= #) +count(array, i32 >= 1) +count(array, i64 != #) +count(array, i64 < #) +count(array, i64 <= 1) +count(array, i64 <= f64) +count(array, i64 == #) +count(array, i64 == i64) +count(array, i64 > 1) +count(array, i64 > f32) +count(array, nil != #) +count(array, nil == #) +count(array, nil == foo) +count(array, not ok) +count(array, ok) +count(array, ok) + i64 +count(array, ok) - i64 +count(array, ok) .. i64 +count(array, one(array, false)) +count(array, true ? false : 0.5) +count(array, true) != 1 ^ f32 +count(array, true) ** f32 +count(array, true) / int(0.5) +count(array, true) >= f64 / 0.5 +count(filter(list, false), ok) +count(i .. 1, # > #) +count(i .. i32, # > #) +count(i32 .. 1, # == #) +count(i64 .. i, div == nil) +count(i64 .. i, ok) +count(list, !false) +count(list, !ok) +count(list, "bar" == "bar") +count(list, "bar" in #) +count(list, "bar" matches "foo") +count(list, "bar" not in #) +count(list, "foo" in #) +count(list, "foo" not in #) +count(list, # != #) +count(list, # != nil) +count(list, # == #) +count(list, # == nil) +count(list, 0.5 == f32) +count(list, 0.5 > 0.5) +count(list, 0.5 >= i32) +count(list, 1 != 1) +count(list, 1 != f32) +count(list, 1 < 0.5) +count(list, 1 <= i) +count(list, 1 >= f32) +count(list, 1 >= i32) +count(list, all(list, true)) +count(list, f32 <= i32) +count(list, f64 != i) +count(list, false ? # : ok) +count(list, false or ok) +count(list, false || false) +count(list, false) .. i32 +count(list, false) > i64 +count(list, foo != #) +count(list, half == div) +count(list, i == i64) +count(list, i32 == i) +count(list, i32 == i32) +count(list, list == array) +count(list, nil != #) +count(list, nil != score) +count(list, nil == #) +count(list, nil == add) +count(list, nil == true) +count(list, none(list, ok)) +count(list, not false) +count(list, not ok) +count(list, not true) +count(list, ok == nil) +count(list, ok) +count(list, ok) - i32 +count(list, ok) < f64 +count(list, ok) > -0.5 +count(list, ok) >= i +count(list, true and ok) +count(list, true) ** i64 +count(list, true) == f64 +count(list, true) ^ i64 +count(map(array, #), # != #) +count(map(array, #), # > #) +count(map(array, #), i == #) +count(map(array, #), ok) +count(map(array, add), ok) +count(map(array, div), ok) +count(map(array, foo), ok) +count(map(array, i32), 0.5 == f32) +count(map(array, i32), 1 != #) +count(map(array, i64), # == 0.5) +count(map(array, true), #) +count(map(list, #), "bar" in #) +count(map(list, #), # == #) +count(map(list, #), # == nil) +count(map(list, 0.5), # != nil) +count(map(list, f32), # <= #) +count(map(list, true), #) +count(sort(array), foo == #) +count(sort(array), ok) +date("bar", "bar")?.String div div != add -div != add != true -div != add ? 0.5 : ok -div != add and 1 == f -div != add or ok +div != add != ok div != div -div != div ? arr : b -div != div ? false : false -div != div and 0 >= 2 -div != div or obj?.a -div != nil && obj.b -div != nil == ok ? s : 0 -div != nil == true -div != nil ? s : obj -div != nil ? s : ok -div != nil || obj?.obj -div != obj.a -div != obj.b -div != obj.fn(a) -div != obj.fn(b) -div != obj.head(a) -div != obj.head(div) -div != obj.head(div, "b") -div != obj.head(f, arr) -div != obj.head(obj) -div != obj.head(ok) -div != obj.obj -div != obj.obj.obj -div != obj.obj?.a -div != obj.obj?.obj -div != obj?.a -div != obj?.b -div != obj?.head(add) -div != obj?.head(arr) -div != obj?.head(b, "a") -div != obj?.head(div) -div != obj?.head(f) -div != obj?.head(s) -div != obj?.head(s, arr, 1, true) -div != obj?.obj -div != obj?.obj.obj -div != obj?.obj?.obj +div != div ? score : 0.5 +div != div or half != greet +div != foo.Qux +div != foo.String +div != foo?.Qux +div != greet +div != half +div != half ? f32 : ok +div != half and !ok +div != nil != ok +div != nil ? array : add +div != nil ? i : i64 +div != score div == add -div == add != obj?.obj -div == add != ok -div == add ? 0 : ok -div == add or ok div == div -div == div != obj.b -div == div != obj?.b -div == div != ok -div == div == ok -div == div ? 1 / f : obj -div == div ? obj : div -div == get(obj, s) -div == nil ? "a" : "c" -div == nil ? 0 : b -div == nil ? a : true -div == nil ? ok : arr -div == nil or obj.obj -div == nil or obj?.a -div == nil || ok ? obj : true -div == obj.a -div == obj.b -div == obj.head(a, b) -div == obj.head(arr, nil, false, obj) -div == obj.head(f) -div == obj.head(f, a, nil) -div == obj.head(obj) -div == obj.head(ok) -div == obj.head(true, obj) -div == obj.obj -div == obj.obj?.b -div == obj?.a -div == obj?.b -div == obj?.head(arr) -div == obj?.head(b) -div == obj?.head(obj) -div == obj?.head(ok) -div == obj?.head(s) -div == obj?.obj -div == obj?.obj.a -div == obj?.obj?.b -div in map(arr, add) -div in obj?.head(nil) -div in obj[s]?.b -div(-1, b) -div(-a, a) -div(-a, get(arr, 2)) -div(-a, obj.b) -div(-b, a + 2) -div(-b, a) -div(-b, b) -div(-obj.head(a, s), b) -div(0 * a, a) -div(0 * obj.b, a) -div(0 - a, a) -div(0, 1) != count(arr, false) -div(0, 1) % b -div(0, 1) + b ^ f -div(0, 1) - b -div(0, 2) ** b -div(0, 2) < b -div(0, 2) > obj.a -div(0, 2) >= abs(0.5) -div(0, a) != f -div(0, a) * b -div(0, a) .. obj.fn(b) -div(0, a) < b -div(0, a) <= b -div(0, a) ^ a -div(0, a) ^ f -div(0, a) in arr -div(0, b) != b -div(0, b) + b -div(0, b) + obj.a -div(0, b) + obj?.a -div(0, b) < a -div(0, b) > b -div(0, b) >= b -div(1 - b, a) -div(1, 2) % a -div(1, 2) * f ** b -div(1, 2) / -2 -div(1, 2) >= f -div(1, a) ** b -div(1, a) - b -div(1, a) / obj?.a -div(1, a) < a ? s : ok -div(1, b) - obj.a -div(1, b) - obj?.a -div(1, b) > b -div(2 % 1, min(1)) -div(2 * 0, a) -div(2 * 2, obj?.b) -div(2 + b, b) -div(2, 2) * a -div(2, a) + 1 ** 1 -div(2, a) == b ? obj : 0 -div(2, a) > obj?.a -div(2, b) != obj?.obj -div(2, b) % a -div(2, b) ** a -div(2, b) - b -div(2, b) / a -div(a % a, a) -div(a % a, obj.b) -div(a * 0, b) -div(a * 2, b) -div(a * b, obj.b) -div(a * b, obj?.b) -div(a - 1, b) -div(a - 2, b) -div(a - b, get(arr, 0)) -div(a, -2) -div(a, -a) -div(a, 0 + a) -div(a, 1) % a -div(a, 1) ** obj.a -div(a, 1) - a -div(a, 1) < b -div(a, 1) < obj?.a -div(a, 1) <= obj.b -div(a, 1) == a -div(a, 1) >= a * b -div(a, 2) ** a -div(a, 2) + obj.b -div(a, 2) < a -div(a, 2) <= f ? s : s -div(a, 2) <= obj.b -div(a, 2) == b -div(a, 2) > obj.b -div(a, 2) ^ obj?.a -div(a, a * a) -div(a, a - 0) -div(a, a) -div(a, a) != 0 ? a : add -div(a, a) != obj?.b -div(a, a) % b -div(a, a) * obj?.b -div(a, a) ** b -div(a, a) - f -div(a, a) .. b -div(a, a) / get(arr, 0) -div(a, a) <= 2 ? b : "b" -div(a, a) == b -div(a, a) > 0 ? div : s -div(a, a) > a -div(a, a) > f -div(a, a) >= a -div(a, a) >= b -div(a, a) ^ -f -div(a, a) ^ f -div(a, abs(b)) -div(a, add(0, b)) -div(a, add(2, 0)) -div(a, add(a, 0)) -div(a, add(a, b)) -div(a, add(b, 0)) -div(a, b + 0) -div(a, b) -div(a, b) % a -div(a, b) % b -div(a, b) ** (a % 1) -div(a, b) ** a -div(a, b) ** f -div(a, b) + div(a, b) -div(a, b) + f ^ a -div(a, b) .. a -div(a, b) / a -div(a, b) < obj?.a -div(a, b) <= b -div(a, b) ^ get(arr, a) -div(a, div(a, 1)) -div(a, div(a, a)) -div(a, div(b, 1)) -div(a, div(b, b)) -div(a, false ? b : a) -div(a, get(arr, a)) -div(a, get(arr, b)) -div(a, int(1)) -div(a, int(a)) -div(a, last(arr)) -div(a, len(s)) -div(a, max(2)) -div(a, min(a)) -div(a, obj.a) -div(a, obj.b) -div(a, obj.fn(0)) -div(a, obj.fn(b)) -div(a, obj.head(1, obj)) -div(a, obj.obj?.a) -div(a, obj.obj?.b) -div(a, obj?.a) -div(a, obj?.b) -div(a, obj?.head(b)) -div(a, true ? 2 : div) -div(abs(a), b) -div(abs(b), a) -div(add(0, a), b) -div(add(2, a), a) -div(add(2, a), b) -div(add(a, 0), max(a)) == a -div(add(a, a), obj.b) -div(add(a, b), -2) -div(add(b, 0), a) -div(add(b, b), obj?.b) -div(arr[1], a * b) -div(arr[b], div(b, b)) -div(b % a, a) -div(b % a, obj.a) -div(b % b, a) -div(b % b, b) -div(b * 0, obj.a) -div(b * a, a) -div(b * a, obj?.b) -div(b, -a) -div(b, 1) % obj.b -div(b, 1) * max(a) -div(b, 1) / a -div(b, 1) >= 0 ^ f -div(b, 2 * b) -div(b, 2) ** add(b, a) -div(b, 2) ** f -div(b, 2) ** f ** 1 -div(b, 2) + float(0) -div(b, 2) > b -div(b, 2) in arr -div(b, a + 0) -div(b, a) -div(b, a) != a + 0.5 -div(b, a) != obj?.a -div(b, a) % b -div(b, a) * 0 / b -div(b, a) + a -div(b, a) - f -div(b, a) < a ^ f -div(b, a) < obj.obj.obj.b -div(b, a) <= a -div(b, a) == obj?.obj -div(b, a) > a -div(b, a) >= 0 ? add : "a" -div(b, a) >= obj.b -div(b, a) ^ a -div(b, a) in arr -div(b, add(0, a)) -div(b, add(b, 2)) -div(b, b * a) -div(b, b * b) -div(b, b) -div(b, b) != b -div(b, b) != obj?.obj -div(b, b) * -b -div(b, b) ** a -div(b, b) ** obj?.a -div(b, b) + obj.b -div(b, b) / a -div(b, b) / obj?.a -div(b, b) < f -div(b, b) <= b -div(b, b) <= b != nil -div(b, b) == a -div(b, b) == f -div(b, b) > obj.a -div(b, b) ^ -f -div(b, b) ^ a -div(b, div(b, a)) -div(b, get(arr, 0)) -div(b, int(a)) -div(b, last(arr)) -div(b, obj.a) -div(b, obj.b) -div(b, obj.fn(a)) -div(b, obj.head(a)) -div(b, obj.head(a, nil)) -div(b, obj.head(b)) -div(b, obj?.a) -div(b, obj?.b) -div(b, obj?.head(a)) -div(b, obj?.head(get(arr, 0))) -div(b, ok ? b : s) -div(count(arr, false), b) -div(count(arr, ok), a) -div(count(arr, ok), b) -div(div(2, a), a) -div(div(a, 2), a) -div(div(a, a), b) -div(div(b, b), add(b, 2)) -div(false ? arr : a, a) -div(first(arr), b) -div(first(arr), obj.b) -div(get(arr, 0), b) -div(get(arr, 2), obj.a) -div(get(arr, a), a) -div(get(arr, b), b) -div(int(1 - f), b) -div(int(b), a) -div(int(b), obj.b) -div(int(obj.a), b) -div(last(arr), a) -div(last(arr), b) -div(len(obj), a) -div(len(obj), obj.a) -div(len(obj), obj.fn(a)) -div(len(s), max(2, a)) -div(max(1), b) -div(max(b), b) -div(max(b), obj.b) -div(min(1), b) -div(min(2), a) -div(min(a), b) -div(obj.a, -2) -div(obj.a, a) -div(obj.a, add(b, 1)) -div(obj.a, b) -div(obj.a, obj.b) -div(obj.a, obj?.a) -div(obj.a, obj?.b) -div(obj.b, a + 0) -div(obj.b, a) -div(obj.b, add(b, b)) -div(obj.b, b) -div(obj.b, len("c")) -div(obj.b, obj.b) -div(obj.b, obj.head(2)) -div(obj.b, obj?.a) -div(obj.b, obj?.b) -div(obj.fn(2), a) -div(obj.fn(a), b) -div(obj.fn(b), 0 - a) -div(obj.fn(b), b) -div(obj.head(0, nil), b) -div(obj.head(1), b) -div(obj.head(a, arr), b + b) -div(obj?.a, 1 * a) -div(obj?.a, a) -div(obj?.a, add(a, b)) -div(obj?.a, b) -div(obj?.a, div(b, a)) -div(obj?.a, int(2)) -div(obj?.a, obj.a) -div(obj?.a, obj.fn(2)) -div(obj?.a, obj?.a) -div(obj?.a, obj?.b) -div(obj?.b, -b) -div(obj?.b, a) -div(obj?.b, add(b, 0)) -div(obj?.b, b * 2) -div(obj?.b, b * a) -div(obj?.b, b) -div(obj?.b, div(b, 1)) -div(obj?.b, obj.a) -div(obj?.b, obj.b) -div(obj?.b, obj.head(a, div, nil, nil, nil)) -div(obj?.b, obj?.a) -div(obj?.b, obj?.b) -div(obj?.fn(0), obj.a) -div(obj?.fn(a), int(1)) -div(obj?.head(0), obj?.a) -div(obj?.head(0, 0), a) -div(obj?.head(0, add), b * a) -div(obj?.head(0, b, a, f), obj.head(a)) -div(obj?.head(2), b) -div(obj?.head(a), a) -div(obj?.head(a, a, f, b), b) -div(obj?.head(b, 2), get(arr, b)) -div(obj?.head(b, add, "c", 0.5), len(arr)) -div(obj?.head(b, b), obj?.a) -div(ok ? 1 : a, a) -div(true ? a : f, 0 + b) -div(true ? b : 0.5, b) -duration(string(0)) -duration(toJSON(0)) -f -f != -0.5 -f != 0 % b -f != 0 ? 1 : b -f != 0 || obj?.b -f != 0.5 ? arr : a -f != 0.5 ? obj.b : arr -f != 0.5 ^ a -f != 0.5 and obj.head(div(add)).fn(add(obj && b, div(f), none(0.5, f), div(true, obj, true))?.head(s, arr)) -f != 0.5 and obj?.obj -f != 1 * b -f != 1 / 1 -f != 1 == ok -f != 1 ? 0.5 : a -f != 1 ? arr : "b" -f != 2 != true -f != 2 % b -f != 2 / 0 -f != 2 / a -f != 2 ^ 0 -f != a -f != a != not ok -f != a && ok -f != a ** 0 -f != a - 0.5 -f != a - 2 -f != a / f -f != a == nil -f != a ? add : 0 -f != a ? obj : arr -f != a ? obj.head(0.5, b, 0, obj, 0) : arr -f != a and obj?.a -f != abs(b) -f != add(2, b) -f != arr[0] -f != arr[b] -f != b -f != b != obj.head(div) -f != b % 2 -f != b % a -f != b && obj.b -f != b && s != "b" -f != b ** b -f != b + 0 -f != b ? b : false -f != b ^ 0 -f != b ^ f -f != b and ok ? 0 : nil -f != b or b >= f -f != b or obj.b.head(get(nil, add).b)?.obj -f != f -f != f && obj.obj -f != f - 0 -f != f / b -f != f ? a : s -f != f ? s : "c" -f != f ^ 0.5 -f != f and f >= f -f != f || b <= a -f != f || obj?.head("b") -f != f || ok ? arr : 0 -f != get(arr, 0) -f != get(arr, b) -f != indexOf("a", s) -f != int(a) -f != max(0, f) -f != nil != obj.b -f != nil != ok -f != nil == ok -f != nil ? div : s -f != nil and obj.obj -f != obj.a -f != obj.b -f != obj.fn(b) -f != obj.head("a", false) -f != obj.head(0.5) -f != obj.head(0.5, div) -f != obj.head(1) -f != obj.head(b, ok, false) -f != obj.head(div, false, f, b) -f != obj.head(ok) -f != obj.obj -f != obj.obj || ok -f != obj.obj.a -f != obj?.a -f != obj?.b -f != obj?.fn(a) -f != obj?.head(0) -f != obj?.head(a, "b", 0) -f != obj?.head(arr, div, 0, div, 0) -f != obj?.head(b) -f != obj?.head(div) -f != obj?.head(f, nil, f) -f != obj?.head(false) -f != obj?.head(get(obj, ok)) -f != obj?.head(nil) -f != obj?.head(nil, add, f) -f != obj?.head(nil, s)?.b -f != obj?.head(obj?.obj) -f != obj?.head(s) -f != obj?.obj -f != obj?.obj.obj -f != obj?.obj?.a -f * (0.5 - a) -f * (a + 0) -f * (b + b) -f * (b - f) -f * -(a + b) -f * -0.5 -f * -f -f * -obj?.b -f * 0 ** 0 -f * 0 ** 1 -f * 0 == b ? div : f -f * 0 >= obj.head(0, add, div) -f * 0.5 != a -f * 0.5 != f -f * 0.5 * 2 -f * 0.5 / 1 -f * 0.5 / b -f * 0.5 >= f ^ 0 -f * 0.5 ^ 0.5 -f * 1 * a -f * 1 == b -f * 2 - f * 0.5 -f * 2 >= a + a -f * a -f * a != obj?.b -f * a + f -f * a / (0 + f) -f * a / (f + b) -f * a / b -f * a / f -f * a / obj.fn(b) -f * a < a -f * a <= -0 -f * a == obj?.b -f * a > a -f * a ^ b -f * abs(b) -f * add(a, 0) -f * arr[0] -f * arr[a] -f * b -f * b != 0 + a -f * b * f -f * b / -a -f * b / 0.5 -f * b / b ** b -f * b == f -f * b ^ 0 -f * f -f * f != a -f * f != b -f * f != obj.a -f * f + 0 ^ 0 -f * f == b -f * f ^ a -f * get(arr, a) -f * int(0) -f * int(f) -f * min(0) -f * obj.a -f * obj.a < b -f * obj.b -f * obj.fn(a) -f * obj.head(f) -f * obj.obj.b -f * obj.obj?.b -f * obj?.a -f * obj?.a ^ f -f * obj?.b -f * obj?.fn(0) -f * obj?.head(0, a) -f * obj?.obj.b -f * obj?.obj?.a -f ** (0 % a) -f ** (0 % b) -f ** (0.5 + f) -f ** (0.5 / b) -f ** (2 + a) -f ** (2 + f) -f ** (2 - f) -f ** (2 / 0) -f ** (2 / f) -f ** (a * 0) -f ** (a * 2) -f ** (a * b) -f ** (a + a) -f ** (a - a) -f ** (a - f) -f ** (a / b) -f ** (b * a) -f ** (b + 1) -f ** (b + b) -f ** (b - a) -f ** (b / 0) -f ** (f * 0) -f ** (f * f) -f ** -0.5 -f ** 0 != f -f ** 0 * obj?.a -f ** 0 + obj?.head(b, add) -f ** 0 / obj?.b -f ** 0 < 0 * 0 -f ** 0 < f -f ** 0 >= b -f ** 0.5 != f -f ** 0.5 - b -f ** 0.5 / obj.fn(b) -f ** 0.5 >= b -f ** 0.5 ^ a -f ** 1 != a -f ** 1 / min(f) -f ** 1 <= b -f ** 2 * a -f ** 2 ** 0 -f ** 2 - b -f ** 2 ^ obj?.a -f ** a -f ** a ** 0 ** f -f ** a < a / f -f ** a <= b -f ** a <= max(f) -f ** a > obj.b -f ** a >= b -f ** a ^ b -f ** add(1, a) -f ** arr[0] -f ** arr[add(1, a)] -f ** arr[obj.a] -f ** arr[obj?.head(b)] -f ** b -f ** b != 1 ** 2 -f ** b ** a -f ** b ** f -f ** b ** obj?.fn(b) -f ** b + a / f -f ** b / f -f ** b < float(f) -f ** b <= b -f ** b <= f -f ** b > b -f ** f -f ** f != b / 0 -f ** f - f -f ** f > b -f ** f >= a -f ** f ^ 1 -f ** get(arr, a) -f ** int(f) -f ** len(arr) <= a -f ** max(b, 1) -f ** min(a) -f ** obj.a -f ** obj.b -f ** obj.head(0) -f ** obj.head(add(0, b)) -f ** obj.obj.b -f ** obj?.a -f ** obj?.b -f ** obj?.fn(a) -f ** obj?.head(2, s) -f ** obj?.head(a) -f ** obj?.head(b, add, obj) -f ** obj?.obj.a -f + -0.5 -f + -f -f + 0 + a -f + 0 - b -f + 0 < a -f + 0 == a -f + 0 == add(b, b) -f + 0.5 * b -f + 0.5 - b -f + 0.5 <= a -f + 0.5 ^ 1 -f + 1 ** b -f + 1 - f -f + 1 >= obj?.b -f + 2 < obj.b -f + 2 == b -f + 2 >= max(b) -f + a -f + a != last(arr) -f + a * 2 -f + a + 2 -f + a / 0 -f + a >= obj?.a -f + a ^ a -f + a ^ f -f + add(b, 2) -f + add(b, a) -f + b -f + b != a -f + b ** 2 -f + b ** b -f + b + 2 -f + b + b -f + b - a -f + b - f -f + b ^ 2 -f + count(arr, false) -f + div(2, 1) -f + div(b, a) -f + div(b, b) -f + f -f + f != f -f + f + 1 -f + f + a -f + f + a ** 0 -f + f - b -f + f / 2 -f + f / a -f + f < f -f + f > b -f + float(0) -f + get(arr, a) -f + int(b) -f + len("a") -f + min(0.5) -f + obj.a -f + obj.b -f + obj.head(0.5) -f + obj.head(f) -f + obj.obj.obj.b -f + obj.obj?.a -f + obj?.a -f + obj?.b -f + obj?.b .. a -f + obj?.fn(0) -f + obj?.fn(b) -f + obj?.obj.a -f + obj?.obj?.a -f - -f -f - 0 != a -f - 0 * a -f - 0 ** a -f - 0 + a -f - 0 - 2 -f - 0 >= a % a -f - 0.5 != b -f - 0.5 ** b -f - 1 - a -f - 1 == 0 ? arr : f -f - 1 > obj?.b -f - 2 + 1 -f - 2 >= f -f - a -f - a % a -f - a + 0 -f - a + b -f - a - a -f - a < b -f - a < obj.fn(b) -f - a < obj?.b -f - a > b ** a -f - a >= b -f - add(b, b) -f - arr[1] -f - arr[b] -f - arr[obj?.a] -f - b -f - b != b -f - b * f -f - b + f -f - b + obj.head(b) -f - b - b -f - b / a -f - b / b -f - b < 0 ? 1 : 0 -f - b <= abs(a) -f - b <= b - 0.5 -f - b == obj.obj -f - b > f -f - b >= a ? div : ok -f - b >= f -f - div(a, b) -f - f -f - f + a -f - f - div(a, b) -f - f / 2 -f - f / b -f - f < a -f - f <= obj.a -f - f == b -f - f == div(0, a) -f - float(1) -f - float(f) -f - get(arr, b) -f - int(0) -f - int(2) -f - obj.a -f - obj.b -f - obj.head(b) -f - obj.obj.a -f - obj.obj.obj.a -f - obj.obj?.b -f - obj?.a -f - obj?.b -f - obj?.head(f) -f - obj?.head(f, a, add) -f - obj?.obj.b -f / (0 - f) -f / (0.5 + b) -f / (1 + 2) -f / (2 + 0) -f / (a + b) -f / (a + f) -f / (b + f) -f / (b - f) -f / (f - a) -f / -a -f / -b -f / -f -f / 0 * 0 -f / 0 * f -f / 0 + obj?.b -f / 0 / a -f / 0.5 != b -f / 0.5 * obj?.a -f / 0.5 - a -f / 0.5 - b -f / 0.5 == obj?.b -f / 1 != obj?.obj?.a -f / 1 / b -f / 2 != nil ? 0.5 : 0 -f / 2 / obj?.b -f / 2 == obj?.b -f / 2 >= f -f / a -f / a != a -f / a != b - 1 -f / a != obj.b -f / a != obj?.b -f / a ** 0 -f / a - f -f / a < 2 ** f -f / a <= b -f / a == a -f / a == b -f / a >= b ^ a -f / a >= obj?.b -f / add(a, 0) -f / add(a, 2) -f / add(a, b) -f / add(b, a) -f / b -f / b != add(0, 1) -f / b * 0 -f / b * b -f / b ** 0.5 -f / b / a -f / b <= b / a -f / b <= f -f / b == b -f / b > a -f / f -f / f != obj.obj?.b -f / f * 0 -f / f ** a -f / f + add(2, b) -f / f - -a -f / f - a ^ a -f / f - f -f / f < a -f / float(0) -f / int(b) -f / len(s) -f / min(0) -f / obj.a -f / obj.b -f / obj.fn(a) -f / obj.head(b) -f / obj.obj.a -f / obj.obj?.a -f / obj?.a -f / obj?.b -f / obj?.fn(0) -f / obj?.fn(1) -f / obj?.fn(2) -f / obj?.fn(a) -f / obj?.head(a, nil) -f / obj?.head(f) -f / obj?.head(f, nil) -f / obj?.obj?.b -f < -0 -f < -0.5 -f < 0 * b -f < 0 - 0 -f < 0 == false -f < 0 ? obj : add -f < 0 ^ b -f < 0 and obj.a -f < 0 or 0.5 != b -f < 0.5 == obj?.b -f < 0.5 == obj?.head("a", div) -f < 0.5 ? b : "b" -f < 0.5 ? nil : add -f < 0.5 ? obj : ok -f < 1 != nil -f < 1 * obj.a -f < 2 - b -f < 2 / 0.5 -f < a -f < a && obj.b -f < a && ok -f < a ** b -f < a + 1 -f < a / f -f < a ? add : div -f < a ? s : "c" -f < a or obj?.a -f < a or ok -f < arr[0] -f < b -f < b != ok -f < b - 0 -f < b ? a : a -f < b ? a : f -f < b ^ 0 -f < b ^ a -f < b and f < 0.5 -f < b or nil == div -f < div(a, a) -f < div(a, b) -f < f -f < f != false -f < f && obj.a -f < f * 0 -f < f * 0.5 -f < f - 0 -f < f - b -f < f == nil -f < f == true -f < f ? 0 : nil -f < f ? 0.5 : a -f < f ^ f -f < f and obj.obj -f < f or obj.b -f < f or obj?.b -f < float(0) -f < float(b) -f < float(f) -f < get(arr, 0) -f < get(arr, b) -f < len(obj) -f < min(0 % b) -f < min(a) -f < obj.a -f < obj.b -f < obj.fn(a) -f < obj.head(0, arr, add, b) -f < obj.head(b, b) -f < obj.head(obj.b) and ok -f < obj.obj?.a -f < obj.obj?.b ^ f -f < obj?.a -f < obj?.b -f < obj?.fn(b) -f < obj?.head(0.5, true, add) -f < obj?.head(a) -f <= -a -f <= -b -f <= -f -f <= 0 % b -f <= 0 * 0 -f <= 0 ? "a" : "c" -f <= 0 ? b : a -f <= 0 ^ b -f <= 0 and obj.obj -f <= 0.5 ** b -f <= 0.5 - b -f <= 0.5 / a -f <= 0.5 ? false : div -f <= 0.5 ? obj : 0 -f <= 0.5 ^ 1 -f <= 0.5 and obj?.head(false) -f <= 1 ** 0 -f <= 1 ** f -f <= 1 - 2 -f <= 2 != false -f <= 2 ? div : nil -f <= 2 ? f : nil -f <= a -f <= a != ok -f <= a % a -f <= a && "c" <= s -f <= a + 0 -f <= a / a -f <= a / b -f <= a ? 1 : 2 -f <= a and b == a -f <= a or ok ? s : s -f <= a || obj.fn(add) -f <= add(2, b) -f <= add(a, b) -f <= arr[a] -f <= arr[b] -f <= arr[div(a, a)] -f <= b -f <= b != ok -f <= b != true -f <= b && ok -f <= b * a -f <= b == nil -f <= b ? arr : add -f <= b ? b : 2 != a -f <= b ^ b -f <= div(a, 1) -f <= f -f <= f - a -f <= f - obj?.b -f <= f / f -f <= f ? a : div -f <= f ? nil : true -f <= f ^ a -f <= f ^ b -f <= f and obj.obj -f <= f or false ? nil : s -f <= f or ok -f <= f || obj?.fn(s, 2)?.obj.fn(b) -f <= float(f) -f <= get(arr, b) -f <= int(a) -f <= last(arr) -f <= obj.a -f <= obj.a ** b -f <= obj.b -f <= obj.fn(0) -f <= obj.head(0, nil) -f <= obj?.a -f <= obj?.b -f <= obj?.head(a) -f <= obj?.obj.a -f <= obj?.obj?.b -f == -0 -f == -b -f == 0 ? b >= 1 : div -f == 0 ? false : s -f == 0.5 == ok -f == 0.5 ? add : add -f == 1 * 0 -f == 1 ** 0.5 -f == 1 ** b -f == 1 / a -f == 1 / f -f == 1 ? true : "c" -f == 2 ? ok : a -f == a -f == a != ok -f == a * 0 -f == a * b -f == a + a -f == a and b < 2 -f == a and obj.head(obj, add) -f == a || obj?.obj -f == abs(b) -f == add(b, 0) -f == arr[b] -f == b -f == b != false -f == b ** 0 -f == b + 0.5 -f == b + b -f == b - 0 -f == b - 2 -f == b == nil -f == b and obj?.b -f == b or not ok -f == div(a, b) -f == div(b, b) -f == f -f == f != nil -f == f ? arr : b -f == f ^ 0 -f == f ^ a -f == int(a) -f == int(b) -f == max(0) -f == max(a) -f == max(b) -f == nil && obj?.fn(count(s == 0, "b" matches div)) -f == nil && ok ? f : obj -f == nil == true ? obj : add -f == nil ? arr : add -f == nil ? nil == div : a -f == nil and obj.fn(s) -f == nil and ok -f == nil || obj?.obj -f == obj.a -f == obj.b -f == obj.b == ok -f == obj.head(1) -f == obj.head(2 != ok) -f == obj.head(b) -f == obj.head(f) -f == obj.head(obj == div) -f == obj.head(obj) -f == obj.head(ok) -f == obj.head(s) -f == obj.obj -f == obj.obj.obj -f == obj.obj?.obj -f == obj.obj?.obj?.b -f == obj.obj?.obj?.obj -f == obj?.a -f == obj?.a % b -f == obj?.b -f == obj?.fn(0) -f == obj?.head(b < 0) -f == obj?.head(b, add) -f == obj?.head(div) -f == obj?.head(div, b, 2, b) -f == obj?.obj -f == obj?.obj.b -f == {"a": b, "b": add, "a": arr}.obj -f > -1 -f > -a -f > -b -f > -f -f > 0 / f -f > 0.5 ** 1 -f > 0.5 == ok -f > 0.5 or not ok -f > 0.5 or obj?.a -f > 1 != ok -f > 1 && s <= s -f > 2 != false -f > 2 - a -f > 2 == obj.b -f > a -f > a != obj.b -f > a * a -f > a + 0 -f > a + f -f > a / 0.5 -f > a ? arr : "c" -f > a ? div : obj -f > a ? f : obj?.obj -f > a || div == nil -f > a || true ? 1 : arr -f > abs(a) -f > add(b, 0) -f > add(b, b) -f > arr[a] -f > arr[obj?.head(0.5)] -f > b -f > b && "a" <= "b" -f > b ** 0 -f > b ** b -f > b ** obj?.a -f > b + 0 -f > b + 1 -f > b == ok -f > b ? obj : f -f > b || obj.head(0) -f > count(arr, true) -f > div(2, a) -f > f -f > f * b -f > f ** 2 -f > f - a -f > f / a -f > f ? obj : nil -f > f ^ b -f > f in obj?.head(nil, "c") -f > f or obj.head(nil) -f > f or obj?.head(obj) -f > int(0) -f > len(obj) -f > obj.a -f > obj.b -f > obj.fn(b) -f > obj.obj.b -f > obj.obj?.a -f > obj.obj?.b -f > obj?.a -f > obj?.b -f > obj?.fn(a) -f > obj?.fn(b) -f > obj?.head(a) -f > obj?.obj.a -f > obj?.obj?.obj?.b -f >= -0 -f >= -1 -f >= -a -f >= 0 != obj?.head(s, f) -f >= 0 ** b -f >= 0 + f -f >= 0 - 0 -f >= 0 / b -f >= 0 == ok -f >= 0 ? nil : div -f >= 0.5 != false -f >= 0.5 ^ a -f >= 1 * b -f >= 1 ? a : add -f >= 1 ? add : true -f >= 1 ? obj : 1 -f >= 1 ^ a -f >= 2 ^ a -f >= a -f >= a % b -f >= a * a -f >= a ? 0 : arr -f >= a and obj?.head(a) -f >= a in obj?.c -f >= a or ok -f >= add(a, a) -f >= arr[b] -f >= b -f >= b != ok -f >= b % 2 -f >= b && ok -f >= b ** a -f >= b + 2 -f >= b + a -f >= b / a -f >= b == false -f >= b == obj.a -f >= b ? s : div -f >= b ^ a -f >= b and obj?.b -f >= count(arr, ok) -f >= div(2, a) -f >= div(b, b) -f >= f -f >= f && false ? f : a -f >= f && ok -f >= f * 0 -f >= f * 0.5 -f >= f ** 0 -f >= f ** a -f >= f == ok -f >= f == true -f >= f ? "b" : 0 -f >= f ? b : f -f >= first(arr) -f >= float(b) -f >= get(arr, a) -f >= obj.a -f >= obj.b -f >= obj.fn(2) -f >= obj.head(0.5, nil) -f >= obj.head(a) -f >= obj.head(b, add) -f >= obj.obj.b -f >= obj.obj?.b -f >= obj?.a -f >= obj?.b -f >= obj?.b && ok -f >= obj?.head(obj, b, 1)?.a -f >= obj?.obj.b -f >= obj?.obj?.a -f ^ (0 + 1) -f ^ (0 + a) -f ^ (0 - b) -f ^ (0.5 * a) -f ^ (1 / a) -f ^ (2 - b) -f ^ (a * 0.5) -f ^ (a * b) -f ^ (a + a) -f ^ (a + b) -f ^ (a - f) -f ^ (a / a) -f ^ (b + 0) -f ^ (f * f) -f ^ (f / 0.5) -f ^ -0 -f ^ -2 -f ^ -a -f ^ 0 ** obj?.b -f ^ 0 <= f -f ^ 0 == a -f ^ 0 >= obj.a -f ^ 0 ^ 1 -f ^ 0.5 ** a -f ^ 0.5 ** b -f ^ 0.5 ** f -f ^ 0.5 ** obj?.head(0, arr) -f ^ 0.5 < a -f ^ 0.5 ^ 0 -f ^ 0.5 ^ 0.5 -f ^ 0.5 ^ f -f ^ 1 * a -f ^ 1 ** 2 -f ^ 1 > a -f ^ 1 > b ? nil : a -f ^ 2 + div(a, 1) -f ^ a -f ^ a != obj.a -f ^ a - a -f ^ a <= b -f ^ a == obj?.b -f ^ a > a -f ^ a > f -f ^ a > obj.b -f ^ a ^ obj?.b -f ^ abs(b) -f ^ abs(f) -f ^ b -f ^ b ** b ** obj?.b -f ^ b + f -f ^ b >= a + a -f ^ div(b, 2) -f ^ f -f ^ f != b -f ^ f * a -f ^ f ** b -f ^ f ** f -f ^ f - b -f ^ f / 0 ^ 2 -f ^ f / b -f ^ f < b * b -f ^ f <= 0.5 * b -f ^ f >= f -f ^ f ^ (b % a) -f ^ f ^ abs(a) -f ^ max(b) -f ^ min(b, 2 * 2) -f ^ obj.a -f ^ obj.b -f ^ obj.fn(0) -f ^ obj.head(0.5, true) -f ^ obj.head(f) -f ^ obj.obj?.a -f ^ obj?.a -f ^ obj?.b -f ^ obj?.obj.a -f in get(obj.b, b) -f in get(obj?.head(ok), s >= "c") -f in map(arr, f) -f in obj?.c -f in obj?.head(get(f, obj))?.obj -f in obj[nil] -false != nil ? add : f -false != nil ? f : ok -false != obj.a -false != obj.b -false != obj.head(b) -false != obj.head(ok) -false != obj.obj -false != obj.obj.b -false != obj.obj?.a -false != obj.obj?.obj -false != obj?.a -false != obj?.b -false != obj?.head(add) -false != obj?.obj -false != obj?.obj.obj -false != obj?.obj?.b -false != ok or ok -false != true or obj?.fn(0, nil) -false && false && obj.b -false && obj.a -false && obj.b -false && obj.fn(0 / div) -false && obj.fn(add(f)) -false && obj.fn(filter(div .. obj, add.b), arr) -false && obj.fn(obj)?.b -false && obj.fn(ok?.b.a) -false && obj.head(add?.b, add(b, f, s, add) contains add(arr, "a")) -false && obj.head(any(ok, "c")) -false && obj.head(div(0), duration(s, a, add)) -false && obj.head(div(filter(nil, arr), get(ok, nil))) -false && obj.head(f?.obj, toBase64(nil, add, false)) -false && obj.head(none(arr, true), "a" / obj) -false && obj.head(ok.fn(obj?.b, 0.5 endsWith obj)) -false && obj.obj -false && obj?.a -false && obj?.b -false && obj?.b?.obj -false && obj?.fn(add?.fn(map(b, 1))) -false && obj?.fn(b - f <= div(0.5, "c")) -false && obj?.fn(count(0, a)?.obj, arr?.head(nil) in div(true, 0, f), lastIndexOf(filter(nil, 0)), b?.head(none(0, obj), nil <= div, a .. s, "b" ** arr)) -false && obj?.fn(f * s ? nil : nil) -false && obj?.head(a) -false && obj?.head(a.obj) -false && obj?.head(add(0, s)?.obj, arr startsWith div?.b) -false && obj?.head(add(nil - b)) -false && obj?.head(add) -false && obj?.head(all(0.5, ok), count(f, ok), f ? a : 0) -false && obj?.head(all(f, add) && count("c", b), add.head(arr?.obj)) -false && obj?.obj -false && obj[obj.fn(obj)] -false && ok && obj.obj -false && ok && obj[nil] -false == nil == obj.a -false == nil and obj.obj -false == nil or ok -false == obj.a -false == obj.b -false == obj.head(arr) -false == obj.head(ok) -false == obj.obj -false == obj.obj?.a -false == obj?.a -false == obj?.b -false == obj?.head(ok) -false == obj?.obj -false ? "b" : 0 >= obj.b -false ? "c" : 0 / b -false ? 0 : obj.a -false ? 0 : obj.b -false ? 0 : obj.obj -false ? 0 : obj?.head(arr) -false ? 0 : obj?.obj -false ? 0.5 : a <= 0 + b -false ? 0.5 : b / f -false ? 0.5 : f * a -false ? 0.5 : obj.obj -false ? 0.5 : obj?.obj -false ? 1 : obj.a -false ? 1 : obj.b -false ? 1 : obj?.obj -false ? 2 : obj.obj -false ? 2 : obj?.a -false ? 2 : obj?.obj -false ? a : 1 > min(f, f) -false ? a : a != f -false ? a : f + b -false ? a : obj?.a -false ? a : obj?.obj -false ? a : true or obj?.b -false ? add : a / a -false ? add : f != a -false ? add : obj.a -false ? add : obj.b -false ? add : obj?.a -false ? add : obj?.b -false ? add : obj?.obj -false ? arr : 0 == a ^ 0.5 -false ? arr : obj.obj -false ? arr : obj?.a -false ? arr : obj?.b -false ? b : 0 >= 0.5 - f -false ? b : obj.b -false ? b : obj.obj -false ? b : obj.obj?.obj -false ? b : obj?.a -false ? b : obj?.obj -false ? div : 1 - a -false ? div : f * (2 - 2) -false ? div : obj.a -false ? div : obj.b -false ? div : obj.obj -false ? div : obj?.b -false ? f : a ** f -false ? f : obj.a -false ? f : obj.obj -false ? f : obj?.a -false ? f : obj?.obj -false ? false : obj.a -false ? false : obj.obj -false ? false : obj?.obj -false ? nil : 0.5 ^ b -false ? nil : 2 == a ? 0.5 : "b" -false ? nil : obj.obj -false ? nil : obj?.b -false ? obj : 0.5 + b -false ? obj : 2 != f ^ f -false ? obj : a - b -false ? obj : b <= add(0, b) -false ? obj : obj?.a -false ? obj : obj?.obj -false ? ok : 0.5 > f ^ a -false ? ok : b <= a -false ? ok : b <= f -false ? ok : b == a ? true : b -false ? ok : obj?.a -false ? s : 1 != obj.b -false ? s : obj.b -false ? s : obj?.a -false ? true : obj.b -false ? true : obj?.b -false and false and obj.obj -false and obj.a -false and obj.a.obj -false and obj.a?.b -false and obj.b -false and obj.b.a -false and obj.fn((obj or b) + ok.fn(b, a)) -false and obj.fn(add?.a >= add(arr)) -false and obj.fn(any(obj, f startsWith obj)) -false and obj.fn(arr endsWith obj.obj) -false and obj.fn(div(add?.obj), div.b != add) -false and obj.fn(div, div(obj).a, a == div >= div(0.5, f)) -false and obj.fn(one(s, obj).b) -false and obj.head("c" <= b, b, ok / obj) -false and obj.head(any(arr, b)) -false and obj.head(div(nil, s)?.b) -false and obj.head(div?.a) -false and obj.head(get(false, obj)) -false and obj.head(s.head(arr), all(f, ok))?.b -false and obj.obj -false and obj?.a -false and obj?.a?.a -false and obj?.b -false and obj?.b?.fn(all(map(a, get(add, 1)), !s[b]), lower(f) % f) -false and obj?.b?.head(map(b, 0.5 - 1)) -false and obj?.b?.head(obj[ok].obj.b) -false and obj?.b?.obj -false and obj?.fn(a + a == div(0.5, obj, ok, div)) -false and obj?.fn(div or obj) -false and obj?.head((ok or 0) in b.a, 0.5 / a.obj) -false and obj?.head(1 != a) -false and obj?.head(a && b) -false and obj?.head(a) -false and obj?.head(add && a, map(true, ok)) -false and obj?.head(add(1, false, 1, b)) -false and obj?.head(any(b, 0)) -false and obj?.head(arr <= f, ok.head(ok, "a", ok), arr, arr && ok) -false and obj?.head(b <= add) -false and obj?.head(f) -false and obj?.head(ok.b or div endsWith div, div) -false and obj?.head(s.head(b, false, s)?.a) -false and obj?.head(toBase64(add)) -false and obj?.obj -false and obj?.obj || obj?.b -false and ok ? obj?.head(obj) : obj -false and ok and obj.obj -false or false or obj?.a -false or obj.a -false or obj.b -false or obj.head(b) -false or obj.obj -false or obj.obj.a -false or obj.obj.obj -false or obj.obj?.obj -false or obj?.a -false or obj?.b -false or obj?.fn(obj?.head(0, "b", b, 0)) -false or obj?.head(arr) -false or obj?.head(s, arr) -false or obj?.obj -false or obj?.obj?.b -false or ok ? f : div -false or ok or obj?.obj -false or true or obj.a -false || false || true ? obj : 0 -false || obj.a -false || obj.a == a -false || obj.b -false || obj.head(b) -false || obj.obj -false || obj?.a -false || obj?.b -false || obj?.fn(a) -false || obj?.fn(b) -false || obj?.obj -false || true or obj?.obj -filter(0 .. b, ok) -filter(a .. a, 2 < f) -filter(a .. b, ok) -filter(arr, !false) -filter(arr, !ok) -filter(arr, "a" <= "c") -filter(arr, "a" > "b") -filter(arr, "a" endsWith s) -filter(arr, "b" > "a") -filter(arr, "c" > s) -filter(arr, 0 == f) -filter(arr, 0.5 != b) -filter(arr, 0.5 < 0.5) -filter(arr, 0.5 == 1) -filter(arr, 1 == nil) -filter(arr, 1 in arr) -filter(arr, 2 < obj?.b) -filter(arr, 2 > 2) -filter(arr, 2 > a) -filter(arr, a != nil) -filter(arr, a < a) -filter(arr, a <= 0) -filter(arr, a > obj.b) -filter(arr, a >= f) -filter(arr, add == add) -filter(arr, add == div) -filter(arr, any(arr, ok)) -filter(arr, any(arr, true)) -filter(arr, arr == arr) -filter(arr, b < 0) -filter(arr, b < 0.5) -filter(arr, b < b) -filter(arr, b <= b) -filter(arr, b > f) -filter(arr, b >= a) -filter(arr, f != nil) -filter(arr, f != obj.obj) -filter(arr, f < 0) -filter(arr, f < f) -filter(arr, f == b) -filter(arr, f == nil) -filter(arr, false) == arr -filter(arr, false) == nil ? 2 : ok -filter(arr, nil != add) -filter(arr, nil != div) -filter(arr, nil == "a") -filter(arr, nil == a) -filter(arr, nil == div) -filter(arr, nil == false) -filter(arr, nil == s) -filter(arr, none(map(arr, 0), ok)) -filter(arr, not ok) -filter(arr, obj.head(ok, "b")) -filter(arr, obj?.head(false)) -filter(arr, obj?.head(ok)) -filter(arr, ok && ok) -filter(arr, ok && true) -filter(arr, ok == true) -filter(arr, ok or ok) -filter(arr, ok || ok) -filter(arr, ok) -filter(arr, ok) != b .. 1 -filter(arr, s == nil) -filter(arr, s matches s) -filter(arr, s startsWith "c") -filter(arr[2:0], ok) -filter(b .. 1, obj.obj) -filter(b .. a, nil != a) -filter(false ? a : arr, s != nil) -filter(filter(arr, ok), 0.5 != nil) -filter(filter(arr, ok), ok) -filter(filter(arr, true), a <= 0) -filter(keys(obj), ok) -filter(map(arr, 0), s != s) -filter(map(arr, 0.5), f != nil) -filter(map(arr, 1), a != 2) -filter(map(arr, add), ok) -filter(map(arr, arr), ok) -filter(map(arr, b), !ok) -filter(map(arr, b), ok) -filter(map(arr, div), add != add) -filter(map(arr, div), ok) -filter(map(arr, ok), #) -filter(map(arr, ok), ok) -filter(map(arr, s), ok) -filter(map(obj?.obj, a == a), #) -filter(obj.head(s), ok) -filter(obj.obj, "b" endsWith s) -filter(obj.obj, f < f) -filter(obj.obj, s in obj) -filter(obj?.head("b"), ok) -filter(obj?.head("c"), ok) -filter(obj?.head(s), ok) -filter(obj?.head(s, s), ok) -filter(ok ? "c" : true, ok) -filter(ok ? arr : obj, a in arr) -filter(ok ? s : arr, b in arr) -filter(ok ? s : true, nil != f) -filter(true ? arr : add, not true) -filter(true ? arr : f, b == nil) -first(0 .. 0) -first(2 .. b) -first([ok]) -first(a * obj?.b) -first(a .. 0) -first(a .. 1) -first(a .. 2) -first(a .. a) -first(arr) -first(arr) != a -first(arr) != max(2, a) -first(arr) != obj.b -first(arr) % a -first(arr) * f -first(arr) ** -0.5 -first(arr) - 0 / a -first(arr) - f ** a -first(arr) .. obj.fn(b) -first(arr) > f -first(arr) ^ a -first(arr[b:0]) -first(b * obj?.a) -first(b .. 1) -first(b .. b) -first(false ? "a" : 0.5) -first(false ? add : 1) -first(false ? add : true) -first(false ? b : arr) -first(false ? false : "a") -first(filter(arr, false)) -first(filter(arr, ok)) -first(filter(arr, true)) -first(get(obj, s)) -first(keys(obj)) -first(map(arr, "c")) -first(map(arr, 0.5)) -first(map(arr, a)) -first(map(arr, add)) -first(map(arr, arr)) -first(map(arr, b)) -first(map(arr, div)) -first(map(arr, f)) -first(map(arr, false)) -first(map(arr, obj)) -first(map(arr, ok)) -first(map(arr, s)) -first(obj.a) -first(obj.a)?.a -first(obj.b) -first(obj.b)?.a -first(obj.fn(0)) -first(obj.fn(a)) -first(obj.fn(a))?.b -first(obj.fn(b)) -first(obj.head("a")) -first(obj.head("b")) -first(obj.head(0.5)) -first(obj.head(0.5, add)) -first(obj.head(1)) -first(obj.head(1, 0, true)) -first(obj.head(1, add, add)) -first(obj.head(2, div)) -first(obj.head(a)) -first(obj.head(a, arr)) -first(obj.head(add, obj, div)) -first(obj.head(arr, "b")) == add -first(obj.head(arr, 0, nil)) -first(obj.head(b)) -first(obj.head(b, "c")) -first(obj.head(b, a)) -first(obj.head(b, a, 0)) -first(obj.head(b, s)) -first(obj.head(div)) -first(obj.head(f)) -first(obj.head(f, false, 0, a)) -first(obj.head(nil)) -first(obj.head(nil, 0)) -first(obj.head(obj, a)?.a) -first(obj.head(ok)) -first(obj.head(ok, add, b)) -first(obj.head(s)) -first(obj.head(s, 0)) -first(obj.head(s, add)) -first(obj.head(s, div, f, add)) -first(obj.head(s, ok, add)) -first(obj.head(true)) -first(obj.obj) -first(obj?.a) -first(obj?.a)?.obj -first(obj?.b) -first(obj?.fn(0 + a)) -first(obj?.fn(0)) -first(obj?.fn(a)) -first(obj?.fn(b)) -first(obj?.head("a", false)) -first(obj?.head("b")) -first(obj?.head("c", f)) -first(obj?.head(0)) -first(obj?.head(1)) -first(obj?.head(2)) -first(obj?.head(a)) -first(obj?.head(a, div)) -first(obj?.head(a, f)) -first(obj?.head(a, f, div, "b", a)) -first(obj?.head(a, f, nil)) -first(obj?.head(add)) -first(obj?.head(add, nil, f))?.obj -first(obj?.head(arr)) -first(obj?.head(b)) -first(obj?.head(b, "b", false, add)) -first(obj?.head(b, s, div)) -first(obj?.head(div)) -first(obj?.head(f)) -first(obj?.head(false, nil, a, obj, f)) -first(obj?.head(get(s, obj))) -first(obj?.head(nil)) -first(obj?.head(nil, f)) -first(obj?.head(obj)) -first(obj?.head(obj, f, 2).a) -first(obj?.head(obj, nil, s)) -first(obj?.head(ok)) -first(obj?.head(ok, b)) -first(obj?.head(true)) -first(obj?.obj) -first(obj?.obj.a) -first(obj?.obj?.obj) -first(obj[nil]) -first(obj[s]) -first(ok ? a : ok) -first(ok ? obj : "b") -first(ok ? obj : false) -first(ok ? obj : ok) -first(ok ? ok : s) -first(ok ? s : ok) -first(split(s, s)) -first(true ? arr : false) -first(values(obj)) -float(-(f * 0)) -float(-0) +div == div ? 0.5 : half +div == div ? nil : i +div == div || true ? f32 : add +div == foo.Qux +div == foo.String +div == foo?.Qux +div == foo?.String +div == greet +div == greet != ok +div == greet || !false +div == half +div == nil ? greet : foo +div == nil ? half : half +div == nil ? score : i64 +div == nil || ok +div == score +div == score == ok +div == score ? true : "bar" +div in map(list, add) +div not in [add] +div not in [half, f32, false] +div not in map(array, div) +div(-1, i) +div(1, 1) > i64 +div(1, i) >= i64 +div(i, 1) / f32 +div(i, 1) == i +div(i, i) +f32 +f32 != --f64 +f32 != -1 +f32 != 0.5 * f32 +f32 != 0.5 + i64 +f32 != 0.5 / i64 +f32 != 0.5 == ok +f32 != 0.5 ? array : ok +f32 != 0.5 ? list : 1 +f32 != 0.5 ^ i32 +f32 != 1 % i32 +f32 != 1 * 1 +f32 != 1 * i64 +f32 != 1 ** 0.5 +f32 != 1 - i +f32 != 1 ? "foo" : foo +f32 != 1 ^ f32 +f32 != abs(i64) +f32 != f32 +f32 != f32 + f64 +f32 != f32 - f64 +f32 != f64 +f32 != f64 ** i32 +f32 != f64 + i32 +f32 != f64 - f32 +f32 != f64 ^ i32 +f32 != findIndex(list, ok) +f32 != float(i) +f32 != i +f32 != i * i64 +f32 != i - f64 +f32 != i32 +f32 != i64 +f32 != i64 * 1 +f32 != i64 ? f64 : f32 +f32 != len(array) +f32 != max(i) +f32 != min(1) +f32 != min(f64) +f32 != nil ? half : greet +f32 != score(1) +f32 * (1 - f32) +f32 * (i + 1) +f32 * (i32 + f32) +f32 * (i64 + f32) +f32 * (i64 - i64) +f32 * -0.5 +f32 * -f32 +f32 * -f64 +f32 * -i32 +f32 * 0.5 != f32 +f32 * 0.5 ** f32 +f32 * 0.5 - f32 +f32 * 0.5 < f64 +f32 * 0.5 < i32 +f32 * 0.5 <= f32 +f32 * 0.5 <= f32 ? "bar" : array +f32 * 0.5 <= i64 +f32 * 1 != f32 +f32 * 1 * 1 +f32 * 1 ** f64 +f32 * 1 + i +f32 * 1 - i +f32 * 1 / i64 +f32 * 1 < f64 +f32 * 1 <= f32 +f32 * 1 >= i32 +f32 * array[i64] +f32 * count(array, ok) +f32 * f32 +f32 * f32 * i +f32 * f32 ^ i64 +f32 * f64 +f32 * f64 * i64 +f32 * f64 + f32 +f32 * f64 - i +f32 * f64 ^ f32 +f32 * findIndex(list, true) +f32 * float(0.5) +f32 * i +f32 * i < f64 +f32 * i <= -i64 +f32 * i <= min(0.5, f64) +f32 * i32 +f32 * i32 ** 1 +f32 * i32 - i64 +f32 * i64 +f32 * i64 ** 0.5 +f32 * i64 ** i64 +f32 * i64 < f64 +f32 * i64 < half(f64) +f32 * i64 ^ i +f32 * i64 ^ i64 +f32 * int(f64) +f32 * max(f32) +f32 * min(0.5) +f32 * min(f64) +f32 * score(1) +f32 ** (0.5 + i) +f32 ** (0.5 - 0.5) +f32 ** (1 - i64) +f32 ** (1 / 0.5) +f32 ** (f32 * i) +f32 ** (f32 + 0.5) +f32 ** (f32 + i64) +f32 ** (f32 - 1) +f32 ** (f64 - i32) +f32 ** (i32 * 1) +f32 ** (i32 * i) +f32 ** -0.5 +f32 ** -1 +f32 ** -f64 +f32 ** -i +f32 ** -i32 +f32 ** -i64 +f32 ** 0.5 >= i64 +f32 ** 0.5 ^ i64 +f32 ** 1 * f32 +f32 ** 1 ** 0.5 +f32 ** 1 / i32 +f32 ** 1 <= i +f32 ** array[i64] +f32 ** f32 +f32 ** f32 * i ^ f64 +f32 ** f32 + f32 +f32 ** f32 - 0.5 + 1 +f32 ** f32 ^ 1 +f32 ** f32 ^ i +f32 ** f64 +f32 ** f64 + i64 +f32 ** f64 <= f64 +f32 ** f64 >= f32 +f32 ** float(i64) +f32 ** half(f64) +f32 ** i +f32 ** i * f64 +f32 ** i / f64 +f32 ** i == score(i) +f32 ** i32 +f32 ** i32 ** i32 +f32 ** i32 >= i32 +f32 ** i64 +f32 ** i64 * i32 +f32 ** i64 + i64 +f32 ** i64 / i64 +f32 ** int(0.5) +f32 ** int(1) +f32 ** len("foo") +f32 ** len(list) +f32 ** max(f32) +f32 ** max(f64) +f32 ** max(i64) +f32 + -0.5 +f32 + -1 +f32 + -f32 +f32 + -i +f32 + -i64 +f32 + 0.5 + 1 +f32 + 0.5 + f32 +f32 + 1 * 0.5 +f32 + 1 * i32 +f32 + 1 ** f64 +f32 + 1 - f32 +f32 + 1 - i64 +f32 + 1 < i32 +f32 + abs(0.5) +f32 + abs(f32) +f32 + count(array, true) +f32 + f32 +f32 + f32 + i32 +f32 + f32 == 0.5 ^ i +f32 + f64 +f32 + f64 - 0.5 +f32 + f64 - f32 +f32 + f64 / f64 +f32 + f64 < f32 +f32 + f64 ^ f32 +f32 + find(array, ok) +f32 + float(f64) +f32 + half(0.5) +f32 + i +f32 + i != i +f32 + i - i +f32 + i ^ f64 +f32 + i32 +f32 + i32 * 0.5 +f32 + i32 + 0.5 +f32 + i32 >= f32 +f32 + i64 +f32 + i64 % 1 +f32 + i64 - 1 +f32 + i64 - f32 +f32 + int(1) +f32 + int(f64) +f32 + int(i32) +f32 + len(array) +f32 + max(0.5) +f32 + max(f64) +f32 + max(i64) +f32 + min(1) +f32 + min(f32) +f32 + min(i32) +f32 + min(i64, 1, 1) +f32 + score(1) +f32 + score(i) +f32 - -0.5 +f32 - -1 +f32 - -f64 +f32 - -i +f32 - -i32 +f32 - 0.5 + f64 +f32 - 0.5 - i32 +f32 - 0.5 - i64 +f32 - 0.5 <= f64 +f32 - 0.5 <= i64 +f32 - 0.5 >= i64 +f32 - 0.5 ^ f64 +f32 - 0.5 ^ i32 +f32 - 1 != i64 +f32 - 1 % 1 +f32 - 1 % i64 +f32 - 1 + 1 +f32 - 1 + i32 % i +f32 - 1 - f32 +f32 - abs(i32) +f32 - array[i] +f32 - f32 +f32 - f32 - f64 +f32 - f32 - i32 +f32 - f32 == i +f32 - f32 == min(1) +f32 - f32 >= i +f32 - f64 +f32 - f64 * 1 +f32 - f64 ** i32 +f32 - f64 + f32 +f32 - f64 + i64 +f32 - f64 - f32 +f32 - f64 - i +f32 - f64 <= f32 +f32 - f64 ^ 1 +f32 - float(0.5) +f32 - float(1) +f32 - float(i32) +f32 - half(0.5) +f32 - i +f32 - i % 1 +f32 - i * f32 +f32 - i + i32 % 1 +f32 - i + i32 ** 0.5 +f32 - i - 0.5 +f32 - i32 +f32 - i32 * 1 +f32 - i32 ** f32 +f32 - i32 ** i32 +f32 - i32 + 1 +f32 - i32 >= i +f32 - i32 ^ i +f32 - i64 +f32 - i64 - 1 +f32 - i64 <= i32 +f32 - i64 ^ 1 +f32 - int(0.5) +f32 - int(i64) +f32 - len("bar") +f32 - len(list) +f32 - max(i32) +f32 - min(1) +f32 - min(i64) +f32 - score(i) +f32 / (0.5 + i64) +f32 / (1 - i) +f32 / (i64 - f64) +f32 / -0.5 +f32 / -f32 +f32 / -f64 +f32 / -i +f32 / -i32 +f32 / 0.5 * 0.5 +f32 / 0.5 * i +f32 / 0.5 - f64 +f32 / 0.5 - i +f32 / 0.5 - i64 +f32 / 0.5 > f64 +f32 / 1 != f64 +f32 / 1 * i64 +f32 / 1 ** f32 +f32 / 1 - f64 - i64 +f32 / 1 >= f32 +f32 / 1 ^ 0.5 +f32 / 1 ^ i +f32 / abs(1) +f32 / abs(f32) +f32 / f32 +f32 / f32 / f32 +f32 / f32 < f32 +f32 / f64 +f32 / f64 ^ 0.5 +f32 / float(i64) +f32 / get(array, 1) +f32 / half(0.5) +f32 / i +f32 / i <= i64 +f32 / i32 +f32 / i32 != i +f32 / i32 ** i +f32 / i32 / f64 +f32 / i32 >= i +f32 / i64 +f32 / i64 * i64 +f32 / i64 > i32 +f32 / i64 ^ 1 +f32 / i64 ^ i +f32 / int(f32) +f32 / int(f64) +f32 / int(i) +f32 / int(i32) +f32 / last(array) +f32 / max(0.5) +f32 / max(1) +f32 / min(f32) +f32 < -0.5 +f32 < -f32 +f32 < -f64 +f32 < -i32 +f32 < -i64 +f32 < 0.5 != true +f32 < 0.5 ? array : array +f32 < 0.5 ? false : score +f32 < 0.5 ? i64 : i32 +f32 < 0.5 ? ok : f32 +f32 < 0.5 ^ f32 +f32 < 1 != ok +f32 < 1 * f32 +f32 < 1 ** 1 +f32 < 1 ** i +f32 < 1 - i +f32 < 1 / 0.5 +f32 < 1 ? f32 : i64 +f32 < 1 ? foo : i +f32 < 1 ? i64 : foo +f32 < 1 || not ok +f32 < abs(1) +f32 < abs(i) +f32 < array[i64] +f32 < array[i] +f32 < div(1, 1) +f32 < f32 +f32 < f32 ** 1 +f32 < f32 ^ 0.5 +f32 < f64 +f32 < f64 != ok +f32 < f64 / f64 +f32 < f64 == nil +f32 < f64 == true +f32 < f64 ? "foo" : half +f32 < float(f32) +f32 < float(i64) +f32 < half(f64) +f32 < i +f32 < i * 1 +f32 < i - i32 +f32 < i ? greet : "foo" +f32 < i32 +f32 < i32 ** 0.5 +f32 < i32 or ok +f32 < i32 || ok +f32 < i64 +f32 < i64 != nil +f32 < i64 && ok +f32 < i64 * i32 +f32 < i64 - f32 +f32 < int(f64) +f32 < max(1) +f32 < score(1) +f32 < score(i) +f32 <= -0.5 +f32 <= -1 +f32 <= -f32 +f32 <= -f64 +f32 <= -i +f32 <= -i64 +f32 <= -min(i64) +f32 <= 0.5 * 0.5 +f32 <= 0.5 ** i32 +f32 <= 0.5 - 1 +f32 <= 0.5 / 0.5 +f32 <= 0.5 == ok +f32 <= 0.5 == true +f32 <= 1 != nil +f32 <= 1 % i +f32 <= 1 * 0.5 +f32 <= 1 * i32 +f32 <= 1 == ok +f32 <= abs(1) +f32 <= f32 +f32 <= f32 ** i64 +f32 <= f32 ? 0.5 : foo +f32 <= f64 +f32 <= f64 ? ok : f64 +f32 <= f64 ^ f32 +f32 <= f64 and ok +f32 <= findIndex(list, ok) +f32 <= first(array) +f32 <= half(0.5) +f32 <= i +f32 <= i != nil +f32 <= i % i64 +f32 <= i ** i32 +f32 <= i - 0.5 +f32 <= i / f32 +f32 <= i == ok +f32 <= i32 +f32 <= i32 * i64 +f32 <= i32 ** i32 +f32 <= i32 + i32 +f32 <= i32 - 1 +f32 <= i32 / 1 +f32 <= i32 ? 0.5 : i32 +f32 <= i32 and ok +f32 <= i64 +f32 <= i64 * i +f32 <= i64 ? true : array +f32 <= i64 or ok +f32 <= int(0.5) +f32 <= int(i) +f32 <= len("foo") +f32 <= max(f32) +f32 <= max(i64) +f32 <= min(i64, i32) +f32 <= score(1) +f32 <= score(i) +f32 == --f64 +f32 == -0.5 +f32 == -1 +f32 == -f32 +f32 == -i32 +f32 == -i64 +f32 == 0.5 && i32 == i32 +f32 == 0.5 * i32 +f32 == 0.5 ** 1 +f32 == 0.5 and ok +f32 == 1 && ok ? add : f32 +f32 == 1 ^ i +f32 == abs(1) +f32 == array[1] +f32 == count(array, ok) +f32 == f32 +f32 == f32 ** f32 +f32 == f32 - i32 +f32 == f32 ? 1 : greet +f32 == f32 ? list : "bar" +f32 == f64 +f32 == f64 - 1 +f32 == f64 - f64 +f32 == f64 ? ok : i64 +f32 == find(array, ok) +f32 == findLast(array, ok) +f32 == findLastIndex(list, true) +f32 == get(array, 1) +f32 == i +f32 == i * i64 +f32 == i + f64 + 0.5 +f32 == i - f64 +f32 == i - i32 +f32 == i / 0.5 +f32 == i ? "foo" : i64 +f32 == i ? i : 0.5 +f32 == i32 +f32 == i32 % 1 +f32 == i32 - 0.5 +f32 == i64 +f32 == i64 % i +f32 == i64 * 0.5 +f32 == int(1) +f32 == max(0.5, 1) +f32 == max(i) +f32 == min(0.5) +f32 == min(i64) +f32 == nil ? "foo" : div +f32 == nil ? i32 : greet +f32 == score(1) +f32 > -0.5 +f32 > -f64 +f32 > -i +f32 > -i32 +f32 > -i64 +f32 > 0.5 != false +f32 > 0.5 != ok +f32 > 0.5 - 0.5 +f32 > 0.5 / 0.5 +f32 > 0.5 ? foo : f64 +f32 > 0.5 ? greet : half +f32 > 1 % 1 +f32 > 1 ** 0.5 +f32 > 1 + f32 +f32 > 1 / i64 +f32 > 1 == true +f32 > 1 ? nil : half +f32 > 1 ^ i32 +f32 > array[i32] +f32 > f32 +f32 > f32 ** f32 +f32 > f32 - i +f32 > f32 == true +f32 > f64 +f32 > f64 - i32 +f32 > f64 / i64 +f32 > f64 ? array : false +f32 > f64 ? true : array +f32 > f64 or ok +f32 > i +f32 > i * 0.5 +f32 > i + f32 +f32 > i32 +f32 > i32 != ok +f32 > i32 * i +f32 > i64 +f32 > i64 ? 1 : f64 +f32 > i64 ? ok : greet +f32 > int(0.5) +f32 > int(f64) +f32 > max(i32) +f32 > max(i32, 1) +f32 > min(f64) +f32 > score(1) +f32 > score(i) +f32 >= -f64 +f32 >= -i +f32 >= -i32 +f32 >= -i64 +f32 >= 0.5 ** f64 +f32 >= 0.5 - 0.5 +f32 >= 0.5 == ok +f32 >= 1 != ok +f32 >= 1 != true +f32 >= 1 % 1 +f32 >= 1 % i +f32 >= 1 - 1 +f32 >= 1 - i +f32 >= 1 - i64 +f32 >= 1 ? "foo" endsWith "foo" : f64 +f32 >= abs(1) +f32 >= f32 +f32 >= f32 ** 1 +f32 >= f32 ** f32 +f32 >= f32 + i32 +f32 >= f64 +f32 >= f64 + i32 +f32 >= first(array) +f32 >= float(i32) +f32 >= float(i64) +f32 >= half(f64) +f32 >= i +f32 >= i != true +f32 >= i * 0.5 +f32 >= i ** 0.5 +f32 >= i ** i32 +f32 >= i + f64 +f32 >= i ? "bar" : nil +f32 >= i ? ok : i +f32 >= i32 +f32 >= i32 * 0.5 +f32 >= i32 ? array : foo +f32 >= i32 ^ i32 +f32 >= i64 +f32 >= i64 % i64 +f32 >= i64 ** 0.5 +f32 >= i64 ? 1 : i32 +f32 >= i64 ? i64 : add +f32 >= i64 || ok +f32 >= len("foo") +f32 >= max(i) +f32 >= min(i) +f32 >= score(1) +f32 ^ (1 * f32) +f32 ^ (1 + 1) +f32 ^ (1 - 0.5) +f32 ^ (f32 * 0.5) +f32 ^ (f32 / 1) +f32 ^ (i + i) +f32 ^ (i32 % 1) +f32 ^ (i32 % i64) +f32 ^ (i32 / 1) +f32 ^ (i32 / f64) +f32 ^ (i64 - f32) +f32 ^ -0.5 +f32 ^ -1 +f32 ^ -f32 +f32 ^ -i +f32 ^ -i32 +f32 ^ -i64 +f32 ^ 0.5 != i64 +f32 ^ 0.5 + f32 +f32 ^ 0.5 + i64 +f32 ^ 0.5 - f64 +f32 ^ 0.5 <= 0.5 ^ 0.5 +f32 ^ 0.5 ^ f32 +f32 ^ 1 - i +f32 ^ 1 - i32 +f32 ^ 1 <= 1 * 1 +f32 ^ 1 <= i32 +f32 ^ 1 ^ 0.5 +f32 ^ f32 +f32 ^ f32 ** i +f32 ^ f32 + f32 +f32 ^ f32 / f32 +f32 ^ f64 +f32 ^ f64 < f64 +f32 ^ f64 < i64 +f32 ^ f64 <= f64 +f32 ^ f64 == f64 +f32 ^ f64 > i +f32 ^ half(f64) +f32 ^ i +f32 ^ i ** i32 +f32 ^ i32 +f32 ^ i32 + f32 +f32 ^ i64 +f32 ^ last(array) +f32 ^ max(0.5) +f32 ^ max(f32) +f32 ^ max(i64) +f32 ^ min(1) +f32 ^ min(1, 1) +f32 ^ score(i) +f32 in [false, list] +f32 in [nil] +f32 not in sort(array) +f64 +f64 != -(0.5 ** 0.5) +f64 != -1 +f64 != -f64 +f64 != -i +f64 != -i32 +f64 != 0.5 && ok +f64 != 0.5 + 1 +f64 != 0.5 + f64 +f64 != 0.5 == nil +f64 != 0.5 == true +f64 != 0.5 ? false : array +f64 != 0.5 and ok +f64 != 1 ? list : false +f64 != 1 ^ i64 +f64 != abs(f32) +f64 != array[i64] +f64 != f32 +f64 != f32 * i32 +f64 != f64 +f64 != f64 * f32 +f64 != f64 ^ 1 +f64 != findLastIndex(list, ok) +f64 != first(array) +f64 != get(array, i32) +f64 != half(0.5) +f64 != half(f64) +f64 != i +f64 != i && ok +f64 != i + 1 +f64 != i32 +f64 != i32 + f64 +f64 != i32 ? "bar" : nil +f64 != i32 ? add : 1 +f64 != i32 ^ 0.5 +f64 != i64 +f64 != i64 ** 0.5 +f64 != int(i64) +f64 != max(i64) +f64 != min(1) +f64 != min(i32) +f64 != nil == ok +f64 != score(1) +f64 != score(i) +f64 * (0.5 - f32) +f64 * (0.5 - i64) +f64 * (f32 + i32) +f64 * (i32 - 0.5) +f64 * (i64 - f64) +f64 * -1 +f64 * -f32 +f64 * -f64 +f64 * -i32 +f64 * -i64 +f64 * 0.5 * 0.5 ^ i64 +f64 * 0.5 / i32 +f64 * 0.5 ^ 1 +f64 * 1 ** 0.5 +f64 * 1 + i64 +f64 * 1 / i32 +f64 * 1 < 0.5 * 0.5 +f64 * abs(i) +f64 * f32 +f64 * f32 * f32 +f64 * f32 - f32 +f64 * f32 - f64 +f64 * f32 / f64 +f64 * f32 >= f64 +f64 * f64 +f64 * f64 / i +f64 * f64 < f64 +f64 * f64 >= score(1) +f64 * float(i) +f64 * i +f64 * i != i +f64 * i * 0.5 +f64 * i * i +f64 * i * i64 +f64 * i - f64 +f64 * i32 +f64 * i32 * 1 +f64 * i32 > f64 +f64 * i64 +f64 * i64 + f32 +f64 * i64 + i +f64 * i64 - f32 +f64 * i64 ^ i32 +f64 * int(0.5) +f64 * int(f32) +f64 * int(f64) +f64 * last(array) +f64 * len(list) +f64 * max(i64) +f64 * min(i32) +f64 * score(1) +f64 * score(i) +f64 ** (0.5 * i32) +f64 ** (0.5 + 1) +f64 ** (0.5 + i) +f64 ** (1 + 1) +f64 ** (1 + f64) +f64 ** (1 - 1) +f64 ** (1 / i64) +f64 ** (f32 * i) +f64 ** (f64 + 0.5) +f64 ** (f64 + f64) +f64 ** (f64 + i) +f64 ** (i % 1) +f64 ** (i % i32) +f64 ** (i32 * 1) +f64 ** (i32 + 0.5) +f64 ** (i32 - f32) +f64 ** (i64 * 1) +f64 ** (i64 + 0.5) +f64 ** (i64 / i) +f64 ** -0.5 +f64 ** -1 +f64 ** -f32 +f64 ** -f64 +f64 ** -i +f64 ** -i32 +f64 ** -i64 +f64 ** 0.5 ** i64 +f64 ** 0.5 <= 1 - 1 +f64 ** 1 ** 0.5 ** 0.5 +f64 ** 1 < 1 - i64 +f64 ** 1 == f64 + f32 +f64 ** 1 ^ i +f64 ** 1 ^ i64 +f64 ** abs(1) +f64 ** abs(f64) +f64 ** f32 +f64 ** f32 ** 0.5 +f64 ** f32 == i64 +f64 ** f64 +f64 ** f64 != f32 +f64 ** f64 ** 0.5 +f64 ** f64 / f32 +f64 ** f64 < f64 +f64 ** f64 <= f64 +f64 ** f64 ^ f64 +f64 ** f64 ^ i32 +f64 ** float(i32) +f64 ** get(array, i64) +f64 ** half(0.5) +f64 ** i +f64 ** i != i +f64 ** i - i32 +f64 ** i / f32 +f64 ** i >= i32 +f64 ** i ^ i32 +f64 ** i32 +f64 ** i32 != max(f64, 0.5) +f64 ** i32 ** 1 +f64 ** i32 ^ 1 +f64 ** i64 +f64 ** i64 ** i64 +f64 ** i64 / f64 +f64 ** i64 ^ i +f64 ** int(0.5) +f64 ** int(1) +f64 ** max(i32) +f64 ** min(1) +f64 ** min(f32) +f64 ** score(1, 1) +f64 + -0.5 +f64 + -f64 +f64 + -i +f64 + -i32 +f64 + -i64 +f64 + 0.5 * 1 +f64 + 0.5 * i32 +f64 + 0.5 / f32 +f64 + 0.5 == i64 +f64 + 1 != f64 +f64 + 1 + f64 +f64 + 1 - 0.5 +f64 + 1 < i64 +f64 + 1 > 0.5 ? 1 : 0.5 +f64 + 1 > i64 +f64 + 1 >= f32 +f64 + abs(i) +f64 + abs(i64) +f64 + array[1] +f64 + array[i64] +f64 + count(array, ok) +f64 + f32 +f64 + f32 * i32 +f64 + f32 - i64 +f64 + f64 +f64 + f64 + i64 +f64 + f64 == i32 +f64 + f64 > i32 +f64 + f64 ^ 0.5 +f64 + float(i64) +f64 + half(0.5) +f64 + half(f64) +f64 + i +f64 + i ** 0.5 +f64 + i + 1 +f64 + i / 0.5 +f64 + i32 +f64 + i32 ** i64 +f64 + i32 + i32 +f64 + i32 / 1 +f64 + i32 <= i +f64 + i32 >= i64 +f64 + i64 +f64 + i64 - f64 +f64 + i64 ^ f32 +f64 + int(0.5) +f64 + int(i32) +f64 + len(array) +f64 + min(0.5, 0.5) +f64 + min(f32) +f64 + score(i) +f64 - -0.5 +f64 - -1 +f64 - -f64 +f64 - -i +f64 - -i32 +f64 - -i64 +f64 - 0.5 != f64 +f64 - 0.5 * 0.5 +f64 - 0.5 ** i +f64 - 0.5 + f32 +f64 - 0.5 + i +f64 - 0.5 + i32 +f64 - 0.5 >= -0.5 +f64 - 1 * f32 +f64 - 1 ** f32 +f64 - 1 ** i32 +f64 - 1 + 1 +f64 - 1 - f64 +f64 - 1 / 0.5 +f64 - 1 < f32 +f64 - 1 ^ 0.5 +f64 - 1 ^ 1 +f64 - abs(0.5) +f64 - abs(i) +f64 - array[i64] +f64 - f32 +f64 - f32 * f64 +f64 - f32 + 1 + 0.5 +f64 - f32 - f64 +f64 - f32 < f64 +f64 - f32 >= i32 +f64 - f64 +f64 - f64 - 0.5 +f64 - f64 - i32 +f64 - f64 <= i +f64 - f64 == f64 +f64 - f64 > f32 +f64 - f64 >= get(array, i64) +f64 - get(array, i) +f64 - half(0.5) +f64 - i +f64 - i % i32 +f64 - i + 1 +f64 - i / 1 +f64 - i < i32 +f64 - i < i64 +f64 - i == i +f64 - i == i64 +f64 - i > f64 +f64 - i32 +f64 - i32 + i +f64 - i32 - i64 +f64 - i32 >= i32 +f64 - i64 +f64 - i64 * 0.5 +f64 - i64 * 1 +f64 - i64 - f32 +f64 - int(0.5) +f64 - int(i32) +f64 - max(1) +f64 - min(1) +f64 - min(i32, i64) +f64 - score(i) +f64 / (0.5 + f32) +f64 / (0.5 - 0.5) +f64 / (0.5 - f64) +f64 / (0.5 - i32) +f64 / (1 + i32) +f64 / (1 - 1) +f64 / (i32 + f64) +f64 / (i32 - 1) +f64 / (i64 - i64) +f64 / -0.5 +f64 / -1 +f64 / -f32 +f64 / -i +f64 / -i32 +f64 / 0.5 * i +f64 / 0.5 ** 0.5 +f64 / 0.5 ** f64 +f64 / 0.5 / f64 +f64 / 0.5 / i64 +f64 / 0.5 > f64 +f64 / 0.5 ^ i +f64 / 1 != i +f64 / 1 * abs(i64) +f64 / 1 * i +f64 / 1 ** 0.5 +f64 / 1 ^ i64 +f64 / array[i32] +f64 / array[i] +f64 / f32 +f64 / f32 != f64 +f64 / f32 * i +f64 / f32 > f64 +f64 / f32 ^ i32 +f64 / f32 in [f32] +f64 / f64 +f64 / f64 != f32 +f64 / f64 * f32 +f64 / f64 - f32 +f64 / f64 - f64 +f64 / get(array, i64) +f64 / half(0.5) +f64 / i +f64 / i * i32 +f64 / i ** 0.5 +f64 / i ** i32 +f64 / i + i64 +f64 / i < f64 +f64 / i > 1 ** 1 +f64 / i > f64 +f64 / i >= f64 +f64 / i32 +f64 / i32 / i32 +f64 / i32 < f64 +f64 / i64 +f64 / i64 * i64 ^ i +f64 / i64 - f32 +f64 / i64 / 0.5 +f64 / i64 / i64 +f64 / i64 <= f64 +f64 / i64 > i +f64 / int(f32) +f64 / int(i64) +f64 / max(i) +f64 / min(0.5) +f64 / score(i) +f64 < -0.5 +f64 < -1 +f64 < -i32 +f64 < -i64 +f64 < 0.5 ** f32 +f64 < 0.5 == true +f64 < 0.5 ? 0.5 : foo +f64 < 0.5 ? 1 : array +f64 < 0.5 ? greet : false +f64 < 0.5 ^ 1 +f64 < 0.5 or ok +f64 < 1 == not ok +f64 < 1 ? 1 : half +f64 < 1 ? 1 : i +f64 < 1 ? ok : i +f64 < 1 and nil == i32 +f64 < abs(1) +f64 < abs(i32) +f64 < array[i32] +f64 < count(list, true) +f64 < f32 +f64 < f32 * 0.5 +f64 < f32 * f64 +f64 < f32 ** i32 +f64 < f32 - 1 +f64 < f32 ? array : 0.5 +f64 < f64 +f64 < f64 * f32 +f64 < get(array, i) +f64 < half(0.5) +f64 < i +f64 < i - f64 +f64 < i == ok +f64 < i ? false : nil +f64 < i32 +f64 < i32 % i32 +f64 < i32 % i64 +f64 < i32 == ok +f64 < i32 and ok +f64 < i64 +f64 < i64 * i +f64 < int(0.5) +f64 < max(1, i64) +f64 < min(1) +f64 < min(f64) +f64 < min(i64) +f64 <= -0.5 +f64 <= -1 +f64 <= -f32 +f64 <= -i +f64 <= -i32 +f64 <= 0.5 != ok +f64 <= 0.5 - 1 +f64 <= 0.5 / 0.5 +f64 <= 0.5 == true +f64 <= 0.5 ? foo : list +f64 <= 0.5 ? nil : add +f64 <= 1 != true +f64 <= 1 ** 0.5 +f64 <= 1 + 0.5 +f64 <= 1 == false +f64 <= 1 ? array : foo +f64 <= 1 ^ i64 +f64 <= abs(f32) +f64 <= abs(i) +f64 <= array[i] +f64 <= f32 +f64 <= f32 + f64 +f64 <= f32 - 0.5 +f64 <= f32 ? false : "foo" +f64 <= f32 ? false : i +f64 <= f32 ? i64 : false +f64 <= f64 +f64 <= f64 + f64 +f64 <= f64 - 0.5 +f64 <= f64 - f64 +f64 <= f64 ^ 0.5 +f64 <= find(array, true) +f64 <= float(f64) +f64 <= half(0.5) +f64 <= i +f64 <= i * i32 +f64 <= i ? false : false +f64 <= i ? foo : false +f64 <= i32 +f64 <= i32 == true +f64 <= i32 ? "bar" : nil +f64 <= i32 ? add : ok +f64 <= i32 ? i32 : false +f64 <= i64 +f64 <= i64 % 1 +f64 <= i64 - f32 +f64 <= i64 - i64 +f64 <= i64 ^ 1 +f64 <= i64 and ok +f64 <= int(1) +f64 <= int(f64) +f64 <= int(i) +f64 <= max(f32) +f64 <= min(0.5) +f64 <= score(1) +f64 == -0.5 +f64 == -1 +f64 == -f32 +f64 == -f64 +f64 == -i +f64 == -i32 +f64 == 0.5 != ok +f64 == 0.5 ** 0.5 +f64 == 0.5 ** i32 +f64 == 0.5 / i +f64 == 0.5 / i32 +f64 == 0.5 ? i64 : div +f64 == 1 * f64 +f64 == 1 == nil +f64 == 1 ? false : "foo" +f64 == abs(1) +f64 == abs(i32) +f64 == array[i32] +f64 == array[i64] +f64 == f32 +f64 == f32 + i64 +f64 == f32 - 1 +f64 == f32 / 0.5 +f64 == f64 +f64 == f64 ** i32 +f64 == f64 - 1 +f64 == f64 / 1 +f64 == float(0.5) +f64 == float(i) +f64 == get(array, i64) +f64 == half(f64) +f64 == i +f64 == i ** f32 +f64 == i + 0.5 +f64 == i / i32 +f64 == i ? false : f32 +f64 == i ^ f32 +f64 == i32 +f64 == i32 * 1 +f64 == i32 + f64 +f64 == i32 / 1 +f64 == i32 ? greet : array +f64 == i64 +f64 == i64 - f32 +f64 == i64 == true +f64 == int(0.5) +f64 == int(f32) +f64 == min(0.5) +f64 == min(i64) +f64 == nil == ok +f64 == nil ? i32 : div +f64 == nil ? nil : 0.5 +f64 == score(1) +f64 > -0.5 +f64 > -1 +f64 > -f32 +f64 > -f64 +f64 > -i +f64 > -i32 +f64 > 0.5 - f64 +f64 > 0.5 / 0.5 +f64 > 0.5 ? 0.5 : nil +f64 > 0.5 ? score(1, 1) : nil == nil +f64 > 0.5 ^ 1 +f64 > 0.5 || ok +f64 > 1 != ok +f64 > 1 != true +f64 > 1 % i +f64 > 1 * 0.5 +f64 > 1 - 0.5 +f64 > 1 - i32 +f64 > 1 / 0.5 +f64 > 1 / f64 +f64 > 1 ? 0.5 : ok +f64 > 1 ? false : true +f64 > 1 ^ 1 +f64 > abs(0.5) +f64 > abs(1) +f64 > abs(i) +f64 > abs(i32) +f64 > count(array, true) +f64 > f32 +f64 > f32 - 0.5 +f64 > f64 +f64 > f64 ** 0.5 +f64 > f64 ? f64 : list +f64 > f64 ^ 0.5 +f64 > findIndex(array, ok) +f64 > float(1) +f64 > float(f32) +f64 > half(0.5) +f64 > i +f64 > i != ok +f64 > i ** i32 +f64 > i - i32 +f64 > i32 +f64 > i32 ** f32 +f64 > i32 - f32 +f64 > i32 == ok +f64 > i32 ? i : 0.5 +f64 > i64 +f64 > i64 ** i64 +f64 > int(0.5) +f64 > int(i64) +f64 > max(0.5) +f64 > max(i64) +f64 > min(1) +f64 > min(f64) +f64 > min(i) +f64 > min(i32) +f64 > score(i) +f64 >= -0.5 +f64 >= -1 +f64 >= -f64 +f64 >= -i32 +f64 >= -i64 +f64 >= 0.5 * 1 +f64 >= 0.5 ** 0.5 +f64 >= 0.5 ** i32 +f64 >= 0.5 + 0.5 +f64 >= 0.5 + i +f64 >= 0.5 - i +f64 >= 0.5 - i32 +f64 >= 0.5 ? nil : 0.5 +f64 >= 0.5 ^ 0.5 +f64 >= 1 * i +f64 >= 1 - 0.5 +f64 >= 1 / i64 +f64 >= 1 == ok +f64 >= 1 ^ 1 +f64 >= 1 || ok +f64 >= abs(1) +f64 >= abs(f32) +f64 >= abs(f64) +f64 >= count(list, true) +f64 >= f32 +f64 >= f32 != true +f64 >= f32 - f32 +f64 >= f32 ? true : nil +f64 >= f64 +f64 >= f64 * 0.5 +f64 >= f64 ? nil : f64 +f64 >= f64 ? score : f32 +f64 >= half(f64) +f64 >= i +f64 >= i - 1 +f64 >= i32 +f64 >= i32 != nil +f64 >= i32 ** 0.5 +f64 >= i32 + f32 +f64 >= i32 + i64 +f64 >= i32 ^ f32 +f64 >= i64 +f64 >= i64 * 0.5 +f64 >= i64 * f64 +f64 >= i64 * i64 +f64 >= i64 ? list : i >= f32 +f64 >= i64 ? ok : true +f64 >= i64 || ok +f64 >= max(f64) +f64 >= min(0.5) +f64 >= score(1) +f64 >= score(i) +f64 ^ (0.5 * 1) +f64 ^ (0.5 * f32) +f64 ^ (0.5 / i) +f64 ^ (1 + i) +f64 ^ (1 - f32) +f64 ^ (1 / 0.5) +f64 ^ (1 / i64) +f64 ^ -1 +f64 ^ 0.5 != f32 +f64 ^ 0.5 * i64 +f64 ^ 0.5 + f64 +f64 ^ 0.5 < 0.5 ^ 0.5 +f64 ^ 0.5 <= i64 +f64 ^ 0.5 > i == nil +f64 ^ 0.5 >= i32 / i64 +f64 ^ 1 != i +f64 ^ 1 ** i +f64 ^ 1 + i +f64 ^ 1 / f32 +f64 ^ 1 / i64 +f64 ^ 1 <= i32 +f64 ^ 1 ^ i +f64 ^ abs(i32) +f64 ^ count(array, true) +f64 ^ f32 +f64 ^ f32 != i32 +f64 ^ f32 * f32 +f64 ^ f32 ** i +f64 ^ f32 + f64 +f64 ^ f32 / i64 +f64 ^ f32 < i +f64 ^ f32 >= i64 +f64 ^ f32 ^ i64 +f64 ^ f64 +f64 ^ f64 != f32 +f64 ^ f64 * i +f64 ^ f64 + int(0.5) +f64 ^ float(i64) +f64 ^ half(0.5) +f64 ^ half(f64) +f64 ^ i +f64 ^ i ** i32 +f64 ^ i / i +f64 ^ i <= f32 +f64 ^ i32 +f64 ^ i32 ** i +f64 ^ i32 + f64 +f64 ^ i32 >= i +f64 ^ i32 ^ f64 +f64 ^ i64 +f64 ^ i64 + i64 +f64 ^ i64 - i +f64 ^ i64 < i +f64 ^ i64 >= i32 +f64 ^ int(f64) +f64 ^ last(array) +f64 ^ len(list) +f64 ^ max(0.5) +f64 ^ score(1) +false != true || 1 > f64 +false && ok or ok +false ? "bar" : 0.5 == f32 +false ? "bar" : 1 != i +false ? "bar" : foo.Qux +false ? 0.5 : foo.Qux +false ? 1 : half != div +false ? 1 : true != ok +false ? add : foo?.Bar +false ? f32 : foo.Bar +false ? f32 : foo?.String() +false ? f32 : i .. i32 +false ? f64 : 0.5 >= f64 +false ? f64 : f32 / f32 +false ? false : 0.5 + i32 +false ? false : i64 >= i +false ? foo : foo.Qux +false ? greet : i64 != i +false ? half : 0.5 > 1 + i64 +false ? half : f32 > min(0.5) +false ? i : 1 != i +false ? i32 : 1 >= f64 +false ? i64 : "foo" < toJSON(f64) +false ? i64 : foo?.Qux +false ? list : 1 < f32 +false ? list : f32 ** i32 +false ? list : foo.Bar +false ? nil : 1 >= get(array, 1) +false ? nil : foo?.Qux +false ? ok : foo.String +false ? score : 0.5 == i +false ? score : 1 / i64 +false ? score : f64 - -f32 +false ? true : 0.5 == f32 +false or ok ? string(1) : f64 == f32 +filter(1 .. 1, # == 0.5) +filter(1 .. i64, ok) +filter([div], any(array, true)) +filter([i32, i], # <= f64) +filter(array, !false) +filter(array, !ok) +filter(array, "bar" == "bar") +filter(array, "bar" matches "bar") +filter(array, "foo" not matches "bar") +filter(array, # != #) +filter(array, # != f64) +filter(array, # != i) +filter(array, # != i32) +filter(array, # != i64) +filter(array, # < #) +filter(array, # < 1) +filter(array, # < f32) +filter(array, # < f64) +filter(array, # < i) +filter(array, # < i32) +filter(array, # <= #) +filter(array, # <= 0.5) +filter(array, # <= 1) +filter(array, # <= f64) +filter(array, # <= i) +filter(array, # <= i32) +filter(array, # == #) +filter(array, # == 1) +filter(array, # == f32) +filter(array, # == f64) +filter(array, # == i) +filter(array, # == nil) +filter(array, # > #) +filter(array, # > 1) +filter(array, # > i) +filter(array, # >= #) +filter(array, # >= 1) +filter(array, # >= f32) +filter(array, # >= f64) +filter(array, # >= i32) +filter(array, # in array) +filter(array, # not in array) +filter(array, 0.5 != #) +filter(array, 0.5 < #) +filter(array, 0.5 < f32) +filter(array, 0.5 < f64) +filter(array, 0.5 == #) +filter(array, 0.5 > 0.5) +filter(array, 0.5 >= #) +filter(array, 1 != #) +filter(array, 1 != f32) +filter(array, 1 < #) +filter(array, 1 < f64) +filter(array, 1 <= #) +filter(array, 1 == #) +filter(array, 1 > #) +filter(array, 1 > 0.5) +filter(array, add == div) +filter(array, all(list, ok)) +filter(array, f32 != #) +filter(array, f32 < i32) +filter(array, f32 <= f32) +filter(array, f32 == #) +filter(array, f32 > 1) +filter(array, f32 >= #) +filter(array, f64 != #) +filter(array, f64 != 0.5) +filter(array, f64 <= #) +filter(array, f64 == #) +filter(array, f64 > #) +filter(array, f64 >= 1) +filter(array, foo == nil) +filter(array, greet == add) +filter(array, greet == half) +filter(array, i <= 1) +filter(array, i <= f64) +filter(array, i == f32) +filter(array, i >= 1) +filter(array, i >= f64 != false) +filter(array, i32 != #) +filter(array, i32 <= #) +filter(array, i32 == #) +filter(array, i32 == 1) +filter(array, i32 > # % #) +filter(array, i32 > #) +filter(array, i32 > 0.5) +filter(array, i32 >= #) +filter(array, i64 != #) +filter(array, i64 < #) +filter(array, i64 < 1) +filter(array, i64 < i64) +filter(array, i64 <= #) +filter(array, i64 == 1) +filter(array, nil != #) +filter(array, nil != greet) +filter(array, nil == #) +filter(array, nil == f32) +filter(array, nil in list) +filter(array, none(array, ok)) +filter(array, ok) +filter(array, score(#) != #) +filter(array, true && ok) +filter(array, true or false) +filter(array, true)[i:i32] +filter(filter(array, true), i >= f32) +filter(filter(list, false), "bar" in #) +filter(filter(list, ok), ok) +filter(i .. 1, not ok) +filter(i32 .. i32, nil == true) +filter(i32 .. i64, ok) +filter(list, !false) +filter(list, !ok) +filter(list, !true) +filter(list, "bar" not in #) +filter(list, "bar" not matches "foo") +filter(list, "bar" startsWith "bar") +filter(list, "foo" in #) +filter(list, "foo" not in #) +filter(list, # != #) +filter(list, # != foo) +filter(list, # != nil) +filter(list, # == #) +filter(list, # == foo) +filter(list, # == nil) +filter(list, 0.5 != f64) +filter(list, 0.5 != i) +filter(list, 0.5 > f32) +filter(list, 1 != 0.5) +filter(list, 1 != i32) +filter(list, 1 != nil) +filter(list, 1 < 0.5) +filter(list, 1 < 1) +filter(list, all(array, false)) +filter(list, all(array, true)) +filter(list, div == half) +filter(list, f32 < 0.5) +filter(list, f32 <= f32) +filter(list, f32 == i64) +filter(list, f32 >= 1) +filter(list, f64 >= 0.5) +filter(list, false == ok) +filter(list, foo != #) +filter(list, foo == #) +filter(list, foo == foo) +filter(list, foo in list) +filter(list, greet != nil) +filter(list, half != half) +filter(list, i <= 0.5) +filter(list, i <= i) +filter(list, i == f32) +filter(list, i == i32) +filter(list, i == i64) +filter(list, i >= i32) +filter(list, i32 != 1) +filter(list, i32 != nil) +filter(list, i32 < i64) +filter(list, i32 <= i32) +filter(list, i32 == i) +filter(list, i64 > f32) +filter(list, nil != f64) +filter(list, nil != score) +filter(list, nil != true) +filter(list, nil == #) +filter(list, not ok) +filter(list, ok or true) +filter(list, ok || true) +filter(list, ok) +filter(list, true == nil) +filter(map(array, "bar"), # >= #) +filter(map(array, "foo"), ok) +filter(map(array, #), # != 0.5) +filter(map(array, #), ok) +filter(map(array, 0.5 >= #), ok) +filter(map(list, "bar"), i >= i) +filter(map(list, "foo"), "bar" not matches #) +filter(map(list, #), # != #) +filter(map(list, #), ok) +filter(map(list, 1), f32 != #) +filter(map(list, false), #) +filter(sort(array), ok) +filter(split("foo", "bar"), ok) +find(1 .. 1, # <= #) +find([nil], 0.5 == 0.5) +find([ok], #) +find(array, !ok) +find(array, !true) +find(array, "bar" startsWith "foo") +find(array, # != #) +find(array, # != 0.5) +find(array, # != f32) +find(array, # != i32) +find(array, # - # != #) +find(array, # < #) +find(array, # < 0.5) +find(array, # < 1) +find(array, # < f32) +find(array, # < f64) +find(array, # < i32) +find(array, # <= #) +find(array, # <= 0.5) +find(array, # <= 1) +find(array, # <= f32) +find(array, # <= i) +find(array, # == #) +find(array, # == 0.5) +find(array, # == 1) +find(array, # == f32) +find(array, # == f64) +find(array, # == i) +find(array, # == i32) +find(array, # == nil) +find(array, # > #) +find(array, # > 0.5) +find(array, # > i) +find(array, # > i64) +find(array, # >= #) +find(array, # >= 1) +find(array, # >= i) +find(array, # >= i32) +find(array, 0.5 < i64) +find(array, 0.5 <= #) +find(array, 0.5 == #) +find(array, 0.5 > #) +find(array, 0.5 > 1) +find(array, 1 <= #) +find(array, 1 <= 0.5) +find(array, 1 == f32) +find(array, 1 == i64) +find(array, 1 > #) +find(array, 1 > 0.5) +find(array, 1 > i32) +find(array, 1 > i64) +find(array, 1 >= #) +find(array, 1 >= i) +find(array, add != div) +find(array, add != nil) +find(array, any(array, true)) +find(array, array == list) +find(array, div == half) +find(array, f32 <= #) +find(array, f32 > #) +find(array, f32 > 0.5) +find(array, f32 >= #) +find(array, f32 >= 1) +find(array, f64 != #) +find(array, f64 != i32) +find(array, f64 != nil) +find(array, f64 < #) +find(array, f64 == nil) +find(array, f64 >= 0.5) +find(array, false == false) +find(array, false) != i32 +find(array, i < #) +find(array, i <= #) +find(array, i == #) +find(array, i > #) +find(array, i >= #) +find(array, i >= i64) +find(array, i32 != #) +find(array, i32 != 1) +find(array, i32 < #) +find(array, i32 <= #) +find(array, i32 <= f32) +find(array, i32 <= f64) +find(array, i32 == #) +find(array, i32 == 1) +find(array, i32 == f64) +find(array, i32 > #) +find(array, i64 != #) +find(array, i64 < #) +find(array, nil != "bar") +find(array, nil != #) +find(array, nil == #) +find(array, nil not in array) +find(array, not false) +find(array, not true) +find(array, ok && ok) +find(array, ok == nil) +find(array, ok) +find(array, ok) * f64 +find(array, ok) ** i64 +find(array, ok) ^ i32 +find(array, score(#) >= #) +find(array, true) / get(array, i64) +find(array, true) > i +find(array, true) ^ i32 +find(filter(array, ok), # >= #) +find(filter(array, true), # != #) +find(i32 .. 1, # > 0.5) +find(i64 .. 1, ok) +find(list, !true) +find(list, "bar" startsWith "foo") +find(list, "foo" < "foo") +find(list, "foo" in #) +find(list, "foo" not in #) +find(list, # != #) +find(list, # == #) +find(list, # == nil) +find(list, # not in list) +find(list, 0.5 < f64) +find(list, 0.5 <= i64) +find(list, 0.5 > i) +find(list, 1 < 0.5) +find(list, 1 <= 0.5) +find(list, 1 > i) +find(list, add == add) +find(list, f32 != f32) +find(list, f32 < f64) +find(list, f32 <= f32) +find(list, f32 <= i32) +find(list, f32 == f32) +find(list, f64 != f32) +find(list, f64 <= i64) +find(list, f64 >= f32) +find(list, false)?.Bar +find(list, foo != #) +find(list, foo == #) +find(list, i < 1) +find(list, i >= f64) +find(list, i32 <= f32) +find(list, i64 != f64) +find(list, i64 >= 0.5) +find(list, list != array) +find(list, nil != #) +find(list, nil != greet) +find(list, nil != half) +find(list, nil != ok) +find(list, nil == #) +find(list, nil == half) +find(list, nil == score) +find(list, nil not in array) +find(list, nil not in list) +find(list, not ok) +find(list, ok or ok) +find(list, ok) +find(list, ok).Bar +find(list, ok).Qux +find(list, ok).String +find(list, ok)?.Qux +find(list, ok)?.String +find(list, score != add) +find(list, score != greet) +find(list, true).Bar +find(list, true).Qux +find(list, true).String +find(list, true)?.Bar +find(list, true)?.Qux +find(list, true)?.String +find(list, true)?.String() +find(map(array, #), # == #) +find(map(array, #), ok) +find(map(array, i), ok) +find(map(array, true), #) +find(map(list, "foo"), ok) +find(map(list, #), # != #) +find(map(list, 0.5), # >= #) +find(map(list, ok), ok) +find(map(list, true), #) +find(ok ? "bar" : 0.5, # != i32) +find(sort(array), ok) +find(true ? array : false, 0.5 > #)?.list +findIndex(["bar"], ok) +findIndex(["foo"], 0.5 > i64) +findIndex(["foo"], ok) +findIndex([1], # < #) +findIndex([f64, greet], 1 > f64) +findIndex([false], #) +findIndex(array, !(# != #)) +findIndex(array, !(# == 1)) +findIndex(array, !false) +findIndex(array, !ok) +findIndex(array, !true) +findIndex(array, "bar" not endsWith "bar") +findIndex(array, "bar" not startsWith "foo") +findIndex(array, # != #) +findIndex(array, # != 0.5) +findIndex(array, # != f32) +findIndex(array, # != f64) +findIndex(array, # != i32) +findIndex(array, # != i64) +findIndex(array, # != nil) +findIndex(array, # ** # > #) +findIndex(array, # < #) +findIndex(array, # < 1) +findIndex(array, # < f64) +findIndex(array, # < i) +findIndex(array, # < i32) +findIndex(array, # < i64) +findIndex(array, # <= #) +findIndex(array, # <= 1) +findIndex(array, # <= i) +findIndex(array, # <= i32) +findIndex(array, # == #) +findIndex(array, # == 1) +findIndex(array, # == f64) +findIndex(array, # == i32) +findIndex(array, # > #) +findIndex(array, # > 0.5) +findIndex(array, # > 1) +findIndex(array, # > f32) +findIndex(array, # > f64) +findIndex(array, # > i64 - i) +findIndex(array, # > i64) +findIndex(array, # >= #) +findIndex(array, # >= 1) +findIndex(array, # >= f32) +findIndex(array, # >= i) +findIndex(array, # >= i32) +findIndex(array, # in array) +findIndex(array, # not in array) +findIndex(array, 0.5 < #) +findIndex(array, 0.5 <= 1) +findIndex(array, 0.5 <= f32) +findIndex(array, 0.5 == #) +findIndex(array, 0.5 > i64) +findIndex(array, 0.5 >= #) +findIndex(array, 0.5 >= i) +findIndex(array, 1 != #) +findIndex(array, 1 < #) +findIndex(array, 1 < f32) +findIndex(array, 1 < i64) +findIndex(array, 1 <= #) +findIndex(array, 1 == #) +findIndex(array, 1 > #) +findIndex(array, 1 >= #) +findIndex(array, add != half) +findIndex(array, any(array, f32 < #)) +findIndex(array, f32 <= #) +findIndex(array, f32 == #) +findIndex(array, f32 == nil) +findIndex(array, f32 > #) +findIndex(array, f32 >= #) +findIndex(array, f64 <= #) +findIndex(array, f64 <= i64) +findIndex(array, f64 == #) +findIndex(array, f64 > #) +findIndex(array, f64 >= #) +findIndex(array, f64 >= 1) +findIndex(array, half != greet) +findIndex(array, i != #) +findIndex(array, i < 0.5) +findIndex(array, i <= #) +findIndex(array, i <= i32) +findIndex(array, i == #) +findIndex(array, i == i) +findIndex(array, i > #) +findIndex(array, i >= i) +findIndex(array, i32 != #) +findIndex(array, i32 < #) +findIndex(array, i32 < f64) +findIndex(array, i32 < i) +findIndex(array, i32 <= #) +findIndex(array, i32 == #) +findIndex(array, i32 == nil) +findIndex(array, i32 > #) +findIndex(array, i64 != #) +findIndex(array, i64 == #) +findIndex(array, i64 > #) +findIndex(array, i64 >= #) +findIndex(array, nil != #) +findIndex(array, nil != 1) +findIndex(array, nil != list) +findIndex(array, nil == foo) +findIndex(array, nil == i) +findIndex(array, not ok) +findIndex(array, ok) +findIndex(array, ok) * f64 +findIndex(array, ok) - i32 +findIndex(array, ok) / f64 +findIndex(array, ok) >= f64 +findIndex(array, score == greet) +findIndex(array, true or false) +findIndex(false ? div : list, ok) +findIndex(list, !false) +findIndex(list, !true) +findIndex(list, "bar" == "bar") +findIndex(list, "foo" != "bar") +findIndex(list, "foo" contains "bar") +findIndex(list, "foo" matches "bar") +findIndex(list, # != #) +findIndex(list, # != foo) +findIndex(list, # != nil) +findIndex(list, # == #) +findIndex(list, # == nil) +findIndex(list, # in list) +findIndex(list, 0.5 < i) +findIndex(list, 0.5 <= f64) +findIndex(list, 0.5 <= i64) +findIndex(list, 0.5 > f64) +findIndex(list, 0.5 >= f32) +findIndex(list, 1 == nil) +findIndex(list, array != list) +findIndex(list, f32 < f64) +findIndex(list, f64 <= f32) +findIndex(list, f64 <= f64) +findIndex(list, f64 == nil) +findIndex(list, f64 > f64) +findIndex(list, false && true) +findIndex(list, foo != #) +findIndex(list, foo == #) +findIndex(list, greet != half) +findIndex(list, half == add) +findIndex(list, i32 == i) +findIndex(list, i32 > f64) +findIndex(list, i32 >= i32) +findIndex(list, i64 < 0.5) +findIndex(list, i64 > f64) +findIndex(list, nil != #) +findIndex(list, nil != f64) +findIndex(list, nil != false) +findIndex(list, nil == #) +findIndex(list, nil == 0.5) +findIndex(list, nil == ok) +findIndex(list, nil in list) +findIndex(list, not false) +findIndex(list, not ok) +findIndex(list, ok != ok) +findIndex(list, ok or ok) +findIndex(list, ok) +findIndex(list, ok) + f32 +findIndex(list, ok) / i +findIndex(list, ok) > i32 +findIndex(list, one(list, ok)) +findIndex(list, true ? true : true) +findIndex(list, true) .. i +findIndex(list, true) == 0.5 ^ i32 +findIndex(list, true) > i32 ** f32 +findIndex(list, true) not in array +findIndex(map(array, #), # > #) +findIndex(map(array, #), # >= f32) +findIndex(map(array, 1), # != #) +findIndex(map(array, add), i64 >= i64) +findIndex(map(array, div), # == #) +findIndex(map(array, false), #) +findIndex(map(array, i64), ok) +findIndex(map(list, #), !ok) +findIndex(map(list, #), div == div) +findIndex(map(list, #), ok) +findIndex(map(list, f32), i32 == f64) +findIndex(map(list, list), ok) +findIndex(map(list, ok), # == ok) +findIndex(sort(array), # < #) +findIndex(true ? "bar" : i32, # < #) +findIndex(true ? "bar" : true, ok) +findLast([0.5], i64 != 0.5) +findLast(array, !false) +findLast(array, !true) +findLast(array, "bar" > "bar") +findLast(array, "foo" startsWith "foo") +findLast(array, # != #) +findLast(array, # != f64) +findLast(array, # != nil) +findLast(array, # < #) +findLast(array, # < 0.5) +findLast(array, # < 1) +findLast(array, # < f32) +findLast(array, # < f64) +findLast(array, # < i) +findLast(array, # <= #) +findLast(array, # <= 0.5) +findLast(array, # <= 1) +findLast(array, # <= f32) +findLast(array, # <= f64) +findLast(array, # <= i) +findLast(array, # <= i64) +findLast(array, # == #) +findLast(array, # == 0.5) +findLast(array, # == f64) +findLast(array, # == i64) +findLast(array, # > #) +findLast(array, # > 0.5) +findLast(array, # > i) +findLast(array, # > i32) +findLast(array, # > i64) +findLast(array, # >= #) +findLast(array, # >= 0.5) +findLast(array, # >= f64) +findLast(array, # >= i) +findLast(array, # >= i32) +findLast(array, # not in array) +findLast(array, 0.5 != #) +findLast(array, 0.5 != 0.5) +findLast(array, 0.5 != i) +findLast(array, 0.5 < #) +findLast(array, 0.5 < i64) +findLast(array, 0.5 <= #) +findLast(array, 0.5 == #) +findLast(array, 0.5 > 0.5) +findLast(array, 0.5 >= 1) +findLast(array, 0.5 >= f64) +findLast(array, 1 != #) +findLast(array, 1 != i64) +findLast(array, 1 < #) +findLast(array, 1 <= #) +findLast(array, 1 <= 0.5) +findLast(array, 1 <= f32) +findLast(array, 1 == #) +findLast(array, 1 == nil) +findLast(array, 1 > #) +findLast(array, 1 >= #) +findLast(array, 1 >= 1) +findLast(array, add != greet) +findLast(array, array == array) +findLast(array, div != score) +findLast(array, f32 != nil) +findLast(array, f32 < #) +findLast(array, f32 >= #) +findLast(array, f32 >= 1) +findLast(array, f64 != i) +findLast(array, f64 < i64) +findLast(array, f64 >= #) +findLast(array, foo != nil) +findLast(array, half == nil) +findLast(array, i != i32) +findLast(array, i < #) +findLast(array, i <= #) +findLast(array, i >= #) +findLast(array, i32 != #) +findLast(array, i32 <= f32) +findLast(array, i32 == 1) +findLast(array, i32 > #) +findLast(array, i32 >= #) +findLast(array, i32 >= 0.5) +findLast(array, i64 != #) +findLast(array, i64 != 1) +findLast(array, i64 < #) +findLast(array, i64 <= #) +findLast(array, i64 <= 0.5) +findLast(array, i64 == #) +findLast(array, i64 == nil) +findLast(array, i64 >= #) +findLast(array, i64 >= i32) +findLast(array, nil != #) +findLast(array, nil != nil) +findLast(array, nil == #) +findLast(array, nil == nil) +findLast(array, not false) +findLast(array, not true) +findLast(array, ok) +findLast(array, ok) < f64 +findLast(array, true) + i +findLast(array, true) + i32 +findLast(array, true) <= f64 +findLast(array, true) > i +findLast(i .. 1, # > f32) +findLast(i32 .. 1, # >= #) +findLast(i32 .. i32, ok) +findLast(i64 .. 1, f32 <= #) +findLast(list, !true) +findLast(list, "bar" in #) +findLast(list, "bar" not contains "bar") +findLast(list, "bar" not in #) +findLast(list, "bar" not matches "bar") +findLast(list, "foo" == "foo") +findLast(list, "foo" > "foo") +findLast(list, "foo" in #) +findLast(list, "foo" not in #) +findLast(list, # != #) +findLast(list, # == #) +findLast(list, # == foo) +findLast(list, # == nil) +findLast(list, # not in list) +findLast(list, 0.5 == nil) +findLast(list, 0.5 > f32) +findLast(list, 1 != 0.5) +findLast(list, 1 != 1) +findLast(list, 1 <= i) +findLast(list, 1 > 1) +findLast(list, 1 > i) +findLast(list, 1 >= 0.5) +findLast(list, 1 >= 1) +findLast(list, add == nil) +findLast(list, all(list, false)) +findLast(list, f32 < f64) +findLast(list, false)?.Bar +findLast(list, foo != #)?.Bar +findLast(list, foo == #) +findLast(list, greet == half) +findLast(list, i != 1) +findLast(list, i != i64) +findLast(list, i >= f32) +findLast(list, i32 == 1) +findLast(list, i64 <= 0.5) +findLast(list, i64 <= i) +findLast(list, i64 == i32) +findLast(list, i64 > 0.5) +findLast(list, i64 > i) +findLast(list, i64 >= i32) +findLast(list, nil != "bar") +findLast(list, nil != #) +findLast(list, nil != add) +findLast(list, nil != false) +findLast(list, nil != foo) +findLast(list, nil != nil) +findLast(list, nil != ok) +findLast(list, nil == #) +findLast(list, nil == i32) +findLast(list, nil == i64) +findLast(list, nil == list) +findLast(list, nil == nil) +findLast(list, not ok) +findLast(list, ok ? ok : nil) +findLast(list, ok) +findLast(list, ok).Bar +findLast(list, ok).Qux +findLast(list, ok).String +findLast(list, ok).String() +findLast(list, ok)?.Bar +findLast(list, ok)?.Qux +findLast(list, ok)?.String +findLast(list, one(list, true)) +findLast(list, true != nil) +findLast(list, true).Bar +findLast(list, true).Qux +findLast(list, true).String +findLast(list, true)?.Bar +findLast(list, true)?.Qux +findLast(list, true)?.String +findLast(map(array, #), # > f32) +findLast(map(array, #), # >= #) +findLast(map(array, #), i32 == #) +findLast(map(array, #), ok) +findLast(map(array, f64), # <= #) +findLast(map(array, i), # <= #) +findLast(map(array, ok), #) +findLast(map(array, ok), not #) +findLast(map(array, true), #) +findLast(map(list, #), # != #) +findLast(map(list, array), # == #) +findLast(map(list, i), # >= #) +findLast(map(list, list), ok) +findLast(map(list, score), 0.5 > f32) +findLast(ok ? array : div, # >= #) +findLast(sort(array), # && false) +findLastIndex([i32], # >= 0.5) +findLastIndex(array, !false) +findLastIndex(array, !ok) +findLastIndex(array, !true) +findLastIndex(array, "bar" != "bar") +findLastIndex(array, # != #) +findLastIndex(array, # != 0.5) +findLastIndex(array, # != i64) +findLastIndex(array, # != nil) +findLastIndex(array, # / f32 == #) +findLastIndex(array, # < # ** i32) +findLastIndex(array, # < #) +findLastIndex(array, # < 0.5) +findLastIndex(array, # < 1) +findLastIndex(array, # < f32) +findLastIndex(array, # < f64) +findLastIndex(array, # < i) +findLastIndex(array, # < i64) +findLastIndex(array, # <= #) +findLastIndex(array, # <= 0.5) +findLastIndex(array, # <= 1) +findLastIndex(array, # <= f32) +findLastIndex(array, # <= f64) +findLastIndex(array, # <= i) +findLastIndex(array, # <= i32) +findLastIndex(array, # <= i64) +findLastIndex(array, # == #) +findLastIndex(array, # == 0.5) +findLastIndex(array, # == 1) +findLastIndex(array, # == i32) +findLastIndex(array, # == nil) +findLastIndex(array, # > #) +findLastIndex(array, # > 0.5) +findLastIndex(array, # > 1) +findLastIndex(array, # > i) +findLastIndex(array, # > i64) +findLastIndex(array, # >= #) +findLastIndex(array, # >= 1) +findLastIndex(array, # >= f64) +findLastIndex(array, # in array) +findLastIndex(array, # not in array) +findLastIndex(array, 0.5 != #) +findLastIndex(array, 0.5 != 0.5) +findLastIndex(array, 0.5 < #) +findLastIndex(array, 0.5 < i) +findLastIndex(array, 0.5 <= #) +findLastIndex(array, 0.5 <= 0.5) +findLastIndex(array, 0.5 == #) +findLastIndex(array, 0.5 > #) +findLastIndex(array, 0.5 > i) +findLastIndex(array, 0.5 >= #) +findLastIndex(array, 0.5 >= f32) +findLastIndex(array, 1 != #) +findLastIndex(array, 1 < #) +findLastIndex(array, 1 <= #) +findLastIndex(array, 1 <= i) +findLastIndex(array, 1 <= i64) +findLastIndex(array, 1 == #) +findLastIndex(array, 1 > #) +findLastIndex(array, 1 > 1) +findLastIndex(array, 1 >= #) +findLastIndex(array, 1 in array) +findLastIndex(array, add != add) +findLastIndex(array, any(list, false)) +findLastIndex(array, f32 != #) +findLastIndex(array, f32 < #) +findLastIndex(array, f32 <= f64) +findLastIndex(array, f32 == f64) +findLastIndex(array, f32 > #) +findLastIndex(array, f32 >= f64) +findLastIndex(array, f64 != #) +findLastIndex(array, f64 < #) +findLastIndex(array, f64 == #) +findLastIndex(array, f64 > i) +findLastIndex(array, f64 >= #) +findLastIndex(array, i == #) +findLastIndex(array, i > #) +findLastIndex(array, i > 1) +findLastIndex(array, i >= #) +findLastIndex(array, i32 != #) +findLastIndex(array, i32 < #) +findLastIndex(array, i32 <= 0.5) +findLastIndex(array, i32 == #) +findLastIndex(array, i32 == i32) +findLastIndex(array, i32 > #) +findLastIndex(array, i64 != #) +findLastIndex(array, i64 != f32) +findLastIndex(array, i64 >= #) +findLastIndex(array, list != nil) +findLastIndex(array, nil != "foo") +findLastIndex(array, nil != #) +findLastIndex(array, nil != 0.5) +findLastIndex(array, nil != foo) +findLastIndex(array, nil != nil) +findLastIndex(array, nil == #) +findLastIndex(array, nil == i) +findLastIndex(array, nil not in list) +findLastIndex(array, none(array, true)) +findLastIndex(array, not (# != #)) +findLastIndex(array, not false) +findLastIndex(array, ok) +findLastIndex(array, ok) * f64 +findLastIndex(array, ok) / i64 +findLastIndex(array, ok) <= i64 +findLastIndex(array, ok) ^ f32 +findLastIndex(array, true ? ok : 1) +findLastIndex(array, true) / f32 +findLastIndex(array, true) <= i64 +findLastIndex(array, true) > f64 +findLastIndex(false ? i : "bar", ok) +findLastIndex(filter(list, true), ok) +findLastIndex(i .. i32, # == 1) +findLastIndex(i32 .. i, ok) +findLastIndex(i32 .. i64, f64 == nil) +findLastIndex(i64 .. 1, # != nil) +findLastIndex(i64 .. 1, add == nil) +findLastIndex(list, !ok) +findLastIndex(list, !true) +findLastIndex(list, "bar" in #) +findLastIndex(list, "foo" matches "bar") +findLastIndex(list, # != #) +findLastIndex(list, # != foo) +findLastIndex(list, # != nil) +findLastIndex(list, # == #) +findLastIndex(list, # == nil) +findLastIndex(list, # in list) +findLastIndex(list, 0.5 != i) +findLastIndex(list, 0.5 <= 0.5) +findLastIndex(list, 0.5 <= f32) +findLastIndex(list, 1 != 0.5) +findLastIndex(list, 1 != f64) +findLastIndex(list, 1 != i64) +findLastIndex(list, 1 < i32) +findLastIndex(list, 1 <= f32) +findLastIndex(list, 1 <= i) +findLastIndex(list, array != list) +findLastIndex(list, array != nil) +findLastIndex(list, array == list) +findLastIndex(list, div == add) +findLastIndex(list, div == score) +findLastIndex(list, f32 != 0.5) +findLastIndex(list, f32 < f64) +findLastIndex(list, f32 < i32) +findLastIndex(list, f32 <= i64) +findLastIndex(list, f32 == i32) +findLastIndex(list, f32 > f32) +findLastIndex(list, f64 <= 1) +findLastIndex(list, f64 == f64) +findLastIndex(list, false == false) +findLastIndex(list, false and false) +findLastIndex(list, false and ok) +findLastIndex(list, false) != i +findLastIndex(list, foo != #) +findLastIndex(list, foo == foo) +findLastIndex(list, greet != half) +findLastIndex(list, greet == nil) +findLastIndex(list, half != nil) +findLastIndex(list, i < i64) +findLastIndex(list, i <= i) +findLastIndex(list, i32 != nil) +findLastIndex(list, i32 < f64) +findLastIndex(list, i32 <= i32) +findLastIndex(list, i32 >= 0.5) +findLastIndex(list, i32 >= i) +findLastIndex(list, i64 < f64) +findLastIndex(list, i64 == f32) +findLastIndex(list, i64 >= i) +findLastIndex(list, i64 not in array) +findLastIndex(list, nil != #) +findLastIndex(list, nil == #) +findLastIndex(list, none(array, ok)) +findLastIndex(list, not ok) +findLastIndex(list, not true) +findLastIndex(list, ok != nil) +findLastIndex(list, ok) +findLastIndex(list, ok) ** f32 +findLastIndex(list, ok) ** f64 +findLastIndex(list, ok) - i +findLastIndex(list, ok) >= i64 +findLastIndex(list, true == nil) +findLastIndex(list, true) ** i64 +findLastIndex(list, true) + i +findLastIndex(list, true) .. i64 +findLastIndex(list, true) < i +findLastIndex(list, true) > f32 +findLastIndex(list, true) >= f32 +findLastIndex(list, true) in array +findLastIndex(map(array, "foo"), # == #) +findLastIndex(map(array, #), i < #) +findLastIndex(map(array, #), nil != half) +findLastIndex(map(array, #), ok) +findLastIndex(map(array, 0.5), ok) +findLastIndex(map(array, array), 1 != i) +findLastIndex(map(array, false), #) +findLastIndex(map(array, true), #) +findLastIndex(map(list, #), !ok) +findLastIndex(map(list, #), 0.5 < f32) +findLastIndex(map(list, 0.5), # <= #) +findLastIndex(map(list, f32), # == #) +findLastIndex(map(list, f32), # >= #) +findLastIndex(map(list, f32), ok) +findLastIndex(map(list, false), #) +findLastIndex(map(list, half), ok) +findLastIndex(map(list, ok), # or #) +findLastIndex(map(list, ok), #) +findLastIndex(sort(array), ok) +first(1 .. i) +first(1 .. i32) +first([f32]) +first([f64]) +first([false, list]) +first([i64, nil]) +first([list, i32]) +first([not false]) +first(array) +first(array) * i +first(array) ** i32 +first(array) ** i64 +first(array) + i32 +first(array) / 1 * 0.5 +first(array) <= i32 +first(array) <= i64 +first(array) == i64 +first(array) > i32 +first(array) > i64 +first(array) in array +first(false ? f64 : true) +first(false ? greet : i) +first(filter(array, false)) +first(filter(list, ok)) +first(i .. 1) +first(i .. i) +first(i .. i32) +first(i32 .. 1) +first(i32 .. i) +first(i32 .. i64) +first(i64 .. i32) +first(list) +first(list) not in list +first(list).Bar +first(list).Qux +first(list).String +first(list).String() +first(list)?.Bar +first(list)?.Qux +first(list)?.String +first(list)?.String() +first(map(array, "bar")) +first(map(array, #)) +first(map(array, 0.5)) +first(map(array, 1)) +first(map(array, add)) +first(map(array, f32)) +first(map(array, f64)) +first(map(array, foo)) +first(map(array, greet)) +first(map(array, half)) +first(map(array, i)) +first(map(array, list)) +first(map(array, ok)) +first(map(array, score)) +first(map(list, #)) +first(map(list, 0.5)) +first(map(list, add)) +first(map(list, array)) +first(map(list, div)) +first(map(list, f32)) +first(map(list, f64)) +first(map(list, i32)) +first(map(list, list)) +first(map(list, score)) +first(ok ? "bar" : 0.5) +first(ok ? 1 : "foo") +first(ok ? add : f32) +first(ok ? array : "bar") +first(ok ? list : nil) +first(ok ? ok : array) +first(ok ? ok : foo) +first(ok ? ok : score) +first(sort(array)) +first(true ? 0.5 : i64) +first(true ? add : ok) +first(true ? array : false) +first(true ? ok : div) +float(-(1 / i32)) float(-0.5) float(-1) -float(-2) -float(-a) -float(-add(b, a)) -float(-b) -float(-f) -float(0 * a) -float(0 * b) -float(0 * f) -float(0 ** 0) -float(0 + 2) -float(0 + b) -float(0 - 0.5) -float(0 - b) -float(0 - f) -float(0 / b) -float(0 / f) -float(0 ^ 0) -float(0 ^ 0.5) -float(0 ^ a) -float(0 ^ f) -float(0) != b ** a -float(0) - f -float(0) - obj.a -float(0) == b -float(0.5 * b) -float(0.5 * f) +float(-f32) +float(-f64) +float(-i) +float(-i32) +float(-i64) +float(0.5 * 0.5) +float(0.5 * f32) +float(0.5 * i) +float(0.5 * i32) +float(0.5 * i64) +float(0.5 ** 0.5) +float(0.5 ** 1) +float(0.5 ** f32) +float(0.5 ** i32) +float(0.5 + 1) +float(0.5 + f32) +float(0.5 + i) +float(0.5 + i64) float(0.5 - 0.5) -float(0.5 - a) -float(0.5 - b) +float(0.5 - 1) +float(0.5 - f32) +float(0.5 - i) +float(0.5 - i32) +float(0.5 - i64) +float(0.5 / 0.5) +float(0.5 / 1) +float(0.5 / f32) +float(0.5 / f64) +float(0.5 / i) +float(0.5 ^ 0.5) float(0.5 ^ 1) -float(0.5 ^ f) -float(0.5) != a + a -float(0.5) * obj?.head(0.5) -float(0.5) ** (0 - 0) -float(0.5) / b ** 0 -float(0.5) <= a -float(0.5) >= b -float(0.5) >= f / 0 -float(1 % a) +float(0.5 ^ f64) +float(0.5 ^ i32) +float(0.5 ^ i64) +float(0.5) != i32 +float(0.5) ** (1 % 1) +float(0.5) + 0.5 - f64 +float(0.5) + f32 +float(0.5) + i32 +float(0.5) - -f32 +float(0.5) - f32 +float(0.5) / f32 +float(0.5) < i32 +float(0.5) >= i32 +float(1 % 1) +float(1 % i) +float(1 % i32) +float(1 % i64) +float(1 * 0.5) +float(1 * 1) +float(1 * i) +float(1 * i32) +float(1 * i64) +float(1 ** 0.5) +float(1 ** i) +float(1 + 0.5) +float(1 + 1) +float(1 + f32) +float(1 + f64) +float(1 + i) +float(1 - 0.5) float(1 - 1) -float(1 - a) -float(1 - b) -float(1 - f) -float(1) + a -float(1) > a -float(2 % a) -float(2 ** b) -float(2 + b) -float(2 + f) -float(2 / f) -float(2 ^ 0) -float(2 ^ 0.5) -float(2) ** obj?.head(0, 0, "a", 0.5, obj) -float(2) - obj?.a -float(2) < float(b) -float(2) <= a -float(2) > b -float(2) > f -float(2) ^ b -float(a % a) -float(a % b) -float(a * 0) -float(a * 2) -float(a * a) -float(a * b) -float(a ** 1) -float(a ** f) -float(a + 0) -float(a + 2) -float(a + a) -float(a + b) -float(a + f) -float(a - 0) -float(a - a) -float(a - b) -float(a - f) -float(a / 0) -float(a / a) -float(a / b) -float(a ^ 1) -float(a ^ a) -float(a ^ b) -float(a ^ f) -float(a) -float(a) != add(a, a) -float(a) ** f -float(a) + a -float(a) - a -float(a) / obj?.head(f) -float(a) < a -float(a) < f -float(a) <= obj.a -float(a) > f -float(a) >= -0 -float(abs(a)) -float(abs(b)) -float(abs(f)) -float(add(0, a)) -float(add(1, b)) -float(add(2, a)) -float(add(2, b)) -float(add(a, 0)) -float(add(a, 2)) -float(add(a, a)) -float(add(a, b)) -float(add(b, 0)) -float(add(b, a)) -float(add(b, b)) -float(arr[a]) -float(arr[b]) -float(b % b) -float(b * 0) -float(b * a) -float(b * b) -float(b ** a) -float(b ** b) -float(b + 0) -float(b + f) -float(b - 0) -float(b - b) -float(b / a) -float(b ^ 0.5) -float(b ^ a) -float(b ^ b) -float(b) -float(b) * a -float(b) * b -float(b) ** (a / 0.5) -float(b) + a -float(b) + b -float(b) + obj?.a -float(b) - b -float(b) - f -float(b) / a - obj?.b -float(b) == a -float(count(arr, ok)) -float(div(0, a)) -float(div(0, b)) -float(div(1, a)) -float(div(2, a)) -float(div(a, a)) -float(div(b, 1)) -float(div(b, b)) -float(f * 0) -float(f * a) -float(f * b) -float(f * f) -float(f ** 0) -float(f ** b) -float(f ** f) -float(f + 0) -float(f + a) -float(f + obj.a) -float(f - 0) -float(f - a) -float(f - b) -float(f - f) -float(f / a) -float(f / f) -float(f ^ a) -float(f) -float(f) * a -float(f) + f -float(f) + obj.a -float(f) / a -float(f) < a ^ b -float(f) > a -float(f) >= b -float(f) ^ obj.b -float(false ? obj : b) -float(false ? ok : b) -float(first(arr)) +float(1 - f32) +float(1 - i) +float(1 / 0.5) +float(1 / 1) +float(1 / f64) +float(1 / i) +float(1 ^ 1) +float(1 ^ f32) +float(1 ^ f64) +float(1 ^ i) +float(1 ^ i32) +float(1 ^ i64) +float(1) != abs(f32) +float(1) != {"foo": i32}?.add +float(1) ** i64 +float(1) - i64 +float(1) / i +float(1) / i64 +float(1) < i32 +float(1) <= i64 +float(1) == int(0.5) +float(1) > i +float(1) >= f32 +float(1) >= i - i +float(abs(0.5)) +float(abs(1)) +float(abs(f32)) +float(abs(i)) +float(abs(i32)) +float(abs(i64)) +float(add(i, 1)) +float(array[1]) +float(array[i32]) +float(array[i64]) +float(array[i]) +float(count(array, true)) +float(count(list, false) * (i - 1)) +float(count(list, false)) +float(div(1, i)) +float(div(i, 1)) +float(f32 * 0.5) +float(f32 * f32) +float(f32 * i32) +float(f32 * i64) +float(f32 ** 0.5) +float(f32 ** 1) +float(f32 ** i) +float(f32 ** i64) +float(f32 + 0.5) +float(f32 + 1) +float(f32 + f32) +float(f32 + i32) +float(f32 - 0.5) +float(f32 - 1) +float(f32 - f64) +float(f32 - i) +float(f32 / 0.5) +float(f32 / 1) +float(f32 / f32) +float(f32 / i) +float(f32 / i64) +float(f32 ^ 0.5) +float(f32 ^ f32) +float(f32 ^ f64) +float(f32 ^ i64) +float(f32) +float(f32) * f32 +float(f32) + f32 +float(f32) - f32 +float(f32) - f64 +float(f32) - i64 +float(f32) / f64 +float(f32) < i32 +float(f32) <= f32 +float(f32) >= f32 +float(f32) >= f32 ** f32 +float(f32) ^ f64 +float(f32) ^ i32 +float(f64 * 0.5) +float(f64 * f32) +float(f64 * i) +float(f64 * i32) +float(f64 ** 1) +float(f64 ** f32) +float(f64 + 0.5) +float(f64 + 1) +float(f64 + i) +float(f64 - 0.5) +float(f64 - i) +float(f64 - i32) +float(f64 - i32) / i +float(f64 / -i32) +float(f64 / 1) +float(f64 / f32) +float(f64 / i32) +float(f64 ^ 0.5) +float(f64 ^ 1) +float(f64 ^ f32) +float(f64 ^ f64) +float(f64) +float(f64) != int(i32) +float(f64) * i32 +float(f64) / f32 +float(f64) / f64 +float(f64) / i64 +float(f64) < i +float(f64) < i32 +float(f64) <= f32 +float(f64) <= i64 +float(f64) == i32 +float(f64) > i32 +float(f64) >= f64 +float(f64) >= i +float(f64) >= i32 +float(f64) ^ i +float(false ? div : i32) +float(false ? f32 : 0.5) +float(find(array, ok)) +float(find(array, true)) +float(findIndex(list, true)) +float(findLast(array, ok)) +float(findLast(array, true)) +float(first(array)) float(float(0.5)) float(float(1)) -float(float(2)) -float(float(a)) -float(float(b)) -float(float(f)) -float(get(arr, 0)) -float(get(arr, a)) -float(get(arr, b)) +float(float(f32)) +float(float(f64)) +float(float(i)) +float(float(i32)) +float(float(i64)) +float(get(array, 1)) +float(get(array, i)) +float(get(array, i64)) +float(half(-f64)) +float(half(0.5)) +float(half(f64)) +float(i % 1) +float(i * 0.5) +float(i * 1) +float(i * f64) +float(i * i) +float(i * i32 * i32) +float(i * i32) +float(i * i64) +float(i ** 1) +float(i ** f64) +float(i ** i32) +float(i + 0.5) +float(i + f64) +float(i + i64) +float(i - 0.5) +float(i - 1) +float(i - findIndex(array, true)) +float(i / 1) +float(i / f64) +float(i / i64) +float(i ^ f32) +float(i ^ f64) +float(i ^ i64) +float(i) +float(i) != f32 +float(i) != i32 +float(i) != i64 +float(i) ** f32 +float(i) / i32 +float(i) < f32 +float(i) < i64 +float(i) <= f32 +float(i) == i32 +float(i) > f64 +float(i) ^ f64 +float(i) ^ i64 +float(i32 % 1) +float(i32 % i) +float(i32 * 1) +float(i32 * f32) +float(i32 ** 0.5) +float(i32 ** f64) +float(i32 ** i32) +float(i32 ** i64) +float(i32 + 1) +float(i32 + f32) +float(i32 - 0.5) +float(i32 - f64) +float(i32 - i) +float(i32 - i32) +float(i32 / 0.5) +float(i32 / 1) +float(i32 / 1) > f64 +float(i32 / i) +float(i32 ^ 1) +float(i32 ^ f64) +float(i32 ^ i) +float(i32) +float(i32) != f64 +float(i32) * i64 +float(i32) + i +float(i32) + i64 +float(i32) - i64 +float(i32) / i +float(i32) / i32 +float(i32) < -0.5 +float(i32) == f32 +float(i32) == i32 +float(i32) > f32 +float(i32) > i32 +float(i32) >= f32 +float(i32) >= f64 +float(i32) ^ f32 +float(i32) ^ f64 +float(i32) ^ i32 +float(i64 % i) +float(i64 % i32) +float(i64 * 0.5) +float(i64 * 1) +float(i64 ** f64) +float(i64 ** i64) +float(i64 + 0.5) +float(i64 + f64) +float(i64 - 1) +float(i64 - f32) +float(i64 - f64) +float(i64 - i32) +float(i64 - i64) +float(i64 / 0.5) +float(i64 / 1) +float(i64 / f32) +float(i64 ^ f64) +float(i64) +float(i64) ** i +float(i64) / i32 +float(i64) > f64 ^ f32 +float(i64) >= i +float(i64) >= i64 float(int(0.5)) -float(int(a)) -float(int(b)) -float(last(arr)) -float(len(arr)) +float(int(1)) +float(int(f32)) +float(int(f64)) +float(int(i)) +float(int(i32)) +float(int(i64)) +float(len("bar")) +float(len("foo")) +float(len(array)) +float(len(list)) float(max(0.5)) -float(max(b)) -float(min(0)) -float(min(a ** a)) -float(min(a, 0)) -float(min(f)) -float(obj.a) -float(obj.b) -float(obj.fn(0)) -float(obj.fn(2)) -float(obj.fn(a)) -float(obj.fn(b)) -float(obj.head(0)) -float(obj.head(0.5, 1)) -float(obj.head(1)) -float(obj.head(2)) -float(obj.head(a)) -float(obj.head(a, obj)) -float(obj.head(b)) -float(obj.head(b, arr, obj, nil)) -float(obj.head(b, b, a)) -float(obj.head(b, nil)) -float(obj.head(f)) -float(obj.obj.b) -float(obj.obj?.b) -float(obj?.a) -float(obj?.b) -float(obj?.fn(0)) -float(obj?.fn(a)) -float(obj?.fn(b)) -float(obj?.head(0)) -float(obj?.head(0, arr, ok)) -float(obj?.head(0, false, false)) -float(obj?.head(0.5)) -float(obj?.head(a)) -float(obj?.head(a, s)) -float(obj?.head(b)) -float(obj?.head(b, div, div)) -float(obj?.head(b, nil)) -float(obj?.head(b, obj?.obj)) -float(obj?.head(f, s)) -float(obj?.obj?.a) -float(ok ? 0 : arr) -float(ok ? 0 : true) -float(ok ? 2 : 2) -float(ok ? b : b) -float(ok ? f : s) -float(string(0)) -float(string(f)) -float(toJSON(0)) +float(max(0.5, i32)) +float(max(1)) +float(max(1, i)) +float(max(1, i64)) +float(max(f64)) +float(max(i)) +float(max(i32)) +float(max(i64)) +float(min(0.5)) +float(min(1)) +float(min(f32)) +float(min(f64)) +float(min(i)) +float(min(i32)) +float(min(i64)) +float(ok ? f64 : half) +float(ok ? i : greet) +float(score(1)) +float(score(i)) +float(score(i, i)) <= f32 +float(score(score(i))) +float(string(0.5)) +float(string(1)) +float(string(f32)) +float(string(f64)) +float(string(i)) +float(string(i64)) +float(toJSON(0.5)) float(toJSON(1)) -float(toJSON(2)) -float(toJSON(b)) -float(toJSON(f)) -float(true ? a : a) -float(true ? a : add) -float(true ? b : f) -float(true ? f : obj?.obj) -fromBase64(s + "a") -fromBase64(s[2:b]) -fromBase64(s[a:0]) -fromBase64(s[a:a]) -fromBase64(s[b:b]) +float(toJSON(f32)) +float(toJSON(f64)) +float(toJSON(i)) +float(toJSON(i32)) +float(true ? 1 : div) +float(true ? 1 : i64) +float(true ? f64 : div) +foo +foo != first(list) +foo != foo +foo != foo ? 1 : 1 +foo != get(list, i) +foo != last(list) +foo != nil ? half : nil +foo == foo +foo == foo ? i : score +foo == last(list) +foo == nil == nil +foo == nil || ok +foo in [half] +foo in filter(list, false) +foo in list +foo in list ? nil : i32 +foo in map(list, #) +foo not in list +foo.Bar +foo.Bar != string(i64) +foo.Bar + type(greet) +foo.Bar < toJSON(0.5) +foo.Bar == type(0.5) +foo.Bar not matches string(half) +foo.Bar not startsWith foo.String() +foo.Qux +foo.Qux != add +foo.Qux != half +foo.Qux != score +foo.Qux == div +foo.Qux == foo?.Qux +foo.Qux(foo?.String()) +foo.Qux(greet("bar")) +foo.Qux(toJSON(0.5)) +foo.Qux(toJSON(i)) +foo.Qux(toJSON(nil)) +foo.Qux(trimSuffix("foo")) +foo.Qux(type("bar")) +foo.Qux(type(i)) +foo.String +foo.String != div +foo.String == add +foo.String == greet +foo.String == half +foo.String == score +foo.String() +foo?.Bar +foo?.Bar + type(score) +foo?.Bar in foo +foo?.Bar not endsWith "bar" ? score : array +foo?.Qux +foo?.Qux != div +foo?.Qux != greet +foo?.Qux != half +foo?.Qux != score +foo?.Qux == add +foo?.Qux == greet +foo?.Qux == half +foo?.Qux == score +foo?.Qux(foo?.Bar) +foo?.Qux(string(0.5)) +foo?.Qux(type(0.5)) +foo?.Qux(upper("bar")) +foo?.String +foo?.String != div +foo?.String != greet +foo?.String != half +foo?.String != nil ? half : list +foo?.String != score +foo?.String == add +foo?.String == half +foo?.String() +foo?.String() + type(list) +foo?.String() < string(i32) +foo?.String() < toJSON(nil) +foo?.String() matches toBase64("bar") fromBase64(string(ok)) -fromBase64(toBase64(s)) +fromBase64(string(true)) +fromBase64(toBase64("foo")) +fromBase64(toBase64(toJSON(nil))) fromBase64(toJSON(nil)) fromBase64(toJSON(ok)) fromBase64(toJSON(true)) -fromJSON(string(b)) +fromBase64(type(add)) +fromBase64(type(div)) +fromBase64(type(false)) +fromBase64(type(greet)) +fromBase64(type(half)) +fromBase64(type(nil == score)) +fromBase64(type(ok)) +fromBase64(type(score)) +fromBase64(type(true)) +fromJSON("foo") not in list && false +fromJSON(string(0.5)) +fromJSON(string(1)) +fromJSON(string(f32)) +fromJSON(string(f64)) +fromJSON(string(false)) +fromJSON(string(i)) +fromJSON(string(i32)) +fromJSON(string(i64)) +fromJSON(string(i64)) ** f64 fromJSON(string(ok)) -fromJSON(toJSON(b)) -fromJSON(toJSON(f)) +fromJSON(string(true)) +fromJSON(toJSON("foo")) +fromJSON(toJSON(0.5 ** 0.5)) +fromJSON(toJSON(1)) +fromJSON(toJSON(abs(1))) +fromJSON(toJSON(array)) +fromJSON(toJSON(f32)) +fromJSON(toJSON(f64)) +fromJSON(toJSON(i)) +fromJSON(toJSON(i32)) +fromJSON(toJSON(i64)) +fromJSON(toJSON(list)) fromJSON(toJSON(nil)) -fromJSON(toJSON(s)) +fromJSON(toJSON(ok)) fromJSON(toJSON(true)) -get(0 .. b, -b) -get(0 .. b, a) -get(0 .. b, obj.obj) -get(1 .. 0, a) -get(1 .. 1, get(arr, a)) -get(2 .. 2, b) -get(2 .. a, a) -get(2 .. b, true ? div : "c") -get([1, arr], obj.a) -get([a, "a", div, 0, a], obj?.b) -get([b], obj.head(s)) -get([f], b) -get(a .. 0, b) -get(a .. b, b) -get(arr, -a) -get(arr, -b) -get(arr, 0 % a) -get(arr, 0 % b) -get(arr, 0) != obj?.head(s) -get(arr, 0) + a -get(arr, 0) - a -get(arr, 0) - b -get(arr, 0) == f -get(arr, 0) ^ 0 ** f -get(arr, 1 + a) -get(arr, 1) != b -get(arr, 1) ** a -get(arr, 1) - a -get(arr, 1) >= get(arr, b) -get(arr, 2) / obj?.b -get(arr, 2) == obj.a -get(arr, a) -get(arr, a) != b -get(arr, a) * a -get(arr, a) * b -get(arr, a) * obj.head(0, add) -get(arr, a) ** f ^ f -get(arr, a) .. b -get(arr, a) < f -get(arr, a) > f ** f -get(arr, a) ^ min(f) -get(arr, a) in arr -get(arr, add(0, a)) -get(arr, add(a, 0)) -get(arr, b * 1) -get(arr, b + 2) -get(arr, b + a) -get(arr, b - obj.a) -get(arr, b) -get(arr, b) != b -get(arr, b) != obj.head("a") -get(arr, b) % a * f -get(arr, b) % b -get(arr, b) * b -get(arr, b) ** f -get(arr, b) + b -get(arr, b) - 0 * 1 -get(arr, b) - b -get(arr, b) .. obj?.a -get(arr, b) < a -get(arr, b) <= obj?.b -get(arr, b) == a ? f : 1 -get(arr, b) >= obj?.b -get(arr, b) ^ f -get(arr, b) ^ obj?.a -get(arr, div(2, a)) -get(arr, div(a, b)) -get(arr, div(b, b)) -get(arr, int(0.5)) -get(arr, max(a, a, 0.5)) -get(arr, obj.a) -get(arr, obj.b) -get(arr, obj.fn(a)) -get(arr, obj.head(a, nil)) -get(arr, obj.head(add)) -get(arr, obj.head(add, 0, 0)) -get(arr, obj.head(arr)) -get(arr, obj.head(f)) -get(arr, obj.head(s, "c")) -get(arr, obj.obj) -get(arr, obj.obj?.obj) -get(arr, obj?.a) -get(arr, obj?.b) -get(arr, obj?.head(0.5)) -get(arr, obj?.head(1)) -get(arr, obj?.head(1, ok, 0)) -get(arr, obj?.head(add, add)) -get(arr, obj?.head(arr)) -get(arr, obj?.head(arr, "c")) -get(arr, obj?.head(false)) -get(arr, obj?.head(nil)) -get(arr, obj?.head(obj)) -get(arr, obj?.head(obj, f, div)?.b) -get(arr, obj?.obj) -get(arr, obj?.obj.a) -get(arr, obj[nil]) -get(arr, ok ? "a" : add) -get(arr, ok ? arr : div) -get(arr, ok ? obj : 0) -get(arr, ok ? obj : b) -get(arr[0:1], b) -get(arr[0:2], obj?.head(ok)) -get(arr[b:a], obj.b) -get(b .. 2, obj.head(arr, ok)) -get(b .. a, a) -get(b .. b, ok ? b : div) -get(false ? "a" : ok, get(add, f)) -get(false ? "b" : b, f != b) -get(false ? 0 : 0.5, s) -get(false ? 0 : add, obj.head(add, div)) -get(false ? 0 : arr, arr) -get(false ? 0 : ok, a) -get(false ? 0.5 : arr, div) -get(false ? 0.5 : s, f) -get(false ? 2 : f, 0.5 .. 0.5) -get(false ? arr : b, upper(0, true, "c")) -get(false ? div : b, 0 / f) -get(false ? div : b, s) -get(false ? f : add, ok) -get(false ? false : s, s) -get(false ? obj : 0, s) -get(false ? obj : ok, obj.head(s, div, "b")) -get(false ? ok : arr, count(arr, ok)) -get(filter(arr, ok), a) -get(get(obj, s), add) -get(get(obj, s), int(1)) -get(get(obj, s), now(0)) -get(get(obj, s), obj.a) -get(get(obj, s), s) -get(map(arr, "b"), obj.head(b, s)) -get(map(arr, 0.5), obj.a) -get(map(arr, add), a) -get(map(arr, add), obj.head(b)) -get(map(arr, b), a - a) -get(map(arr, b), add(b, 0)) -get(map(arr, div), b) -get(map(arr, false), a) -get(map(arr, obj), b) -get(map(arr, s), min(b, b)) -get(map(arr, s), obj.a) -get(map(arr, true), b) -get(obj, get(obj, s)) -get(obj, lower("a")) -get(obj, lower("c")) -get(obj, obj.a) -get(obj, obj.b) -get(obj, obj.head("b", add, 0.5)) -get(obj, obj.head(0)) -get(obj, obj.head(b, a)) -get(obj, obj.head(div)) -get(obj, obj.head(div, add)) -get(obj, obj.head(f, add)) -get(obj, obj.head(obj)) -get(obj, obj.head(obj, "b", b)) -get(obj, obj.head(ok, add, 0, 2, obj)) -get(obj, obj.head(s)) -get(obj, obj.obj) -get(obj, obj.obj.b) -get(obj, obj.obj?.obj) -get(obj, obj?.a) -get(obj, obj?.b) -get(obj, obj?.fn(0)) -get(obj, obj?.fn(1)) -get(obj, obj?.head("b", nil, a, f, f)) -get(obj, obj?.head(2)) -get(obj, obj?.head(a)) -get(obj, obj?.head(f, ok)) -get(obj, obj?.head(false, false, b)) -get(obj, obj?.head(s)) -get(obj, obj?.head(s))?.b -get(obj, obj?.head(true)) -get(obj, obj?.obj) -get(obj, ok ? "a" : a) -get(obj, ok ? a : true) -get(obj, ok ? obj : div) -get(obj, ok ? s : obj) -get(obj, s) -get(obj, s) != f -get(obj, s) != ok -get(obj, s)?.a -get(obj, s)?.a?.b -get(obj, s)?.a?.head(f, div) -get(obj, s)?.a?.obj -get(obj, s)?.b -get(obj, s)?.b?.b -get(obj, s)?.fn(a) -get(obj, s)?.fn(div) -get(obj, s)?.fn(s) -get(obj, s)?.head(add) -get(obj, s)?.head(add, int(1)) -get(obj, s)?.head(s) -get(obj, s)?.obj -get(obj, s)?.obj.b -get(obj, s)?.obj?.b -get(obj, string(b)) -get(obj, string(div)) -get(obj, string(ok)) -get(obj, toBase64(s)) -get(obj, toJSON(b)) -get(obj, toJSON(f)) -get(obj, toJSON(false)) -get(obj, toJSON(nil == add)) -get(obj, toJSON(ok))?.a -get(obj, trimPrefix("a")) -get(obj, trimSuffix(s)) -get(obj.a, "a" matches s) -get(obj.a, -f) -get(obj.a, 0 != a) -get(obj.a, 0 - 0) -get(obj.a, 0 .. a) -get(obj.a, 0 == arr) -get(obj.a, 0.5 * b) -get(obj.a, 0.5 >= f) -get(obj.a, 1 <= b) -get(obj.a, 1 > f) -get(obj.a, 2 == add) -get(obj.a, [s, a, obj]) -get(obj.a, a != nil) -get(obj.a, a / a) -get(obj.a, a) -get(obj.a, a)?.a -get(obj.a, abs(arr, false, 0)) -get(obj.a, add) -get(obj.a, arr and false) -get(obj.a, arr) -get(obj.a, b + a) -get(obj.a, b <= a) -get(obj.a, b == a) -get(obj.a, b) -get(obj.a, div) -get(obj.a, f * f) -get(obj.a, f ** 2) -get(obj.a, f <= 1) -get(obj.a, f == add) -get(obj.a, f == div) -get(obj.a, f == s) -get(obj.a, f) -get(obj.a, false != "b") -get(obj.a, float(nil, 2)) -get(obj.a, get("c", obj)) -get(obj.a, get(div, div)) -get(obj.a, get(div, obj)) -get(obj.a, get(f, 1)) -get(obj.a, get(false, b)) -get(obj.a, get(obj, true)) -get(obj.a, get(ok, true)) -get(obj.a, last(a, "a")) -get(obj.a, len(true, s, ok, "c", s)) -get(obj.a, lower(add, "c"))?.b -get(obj.a, map("c", 1)) -get(obj.a, map(arr, b)) -get(obj.a, map(obj, f)) -get(obj.a, map(s, s)) -get(obj.a, max(false)) -get(obj.a, obj != "c") -get(obj.a, obj) -get(obj.a, obj)?.b -get(obj.a, obj.b) -get(obj.a, obj.b)?.a -get(obj.a, obj.head(div, nil)) -get(obj.a, obj?.head(ok)) -get(obj.a, ok == f) -get(obj.a, ok || nil) -get(obj.a, ok) -get(obj.a, s != nil) -get(obj.a, s) -get(obj.a, s[f]) -get(obj.a, string(ok)) -get(obj.a, toJSON(0, b, 0, f)) -get(obj.a, toJSON(2)) -get(obj.a, true != s) -get(obj.a, true and "c") -get(obj.b, !true) -get(obj.b, "a" startsWith "a") -get(obj.b, "b" != add) -get(obj.b, "c" in nil) -get(obj.b, 0 + 0.5) -get(obj.b, 0 < f) -get(obj.b, 0.5 .. 0) -get(obj.b, a == nil) -get(obj.b, a == ok) -get(obj.b, a >= a) -get(obj.b, a and true)?.head(arr) -get(obj.b, a) -get(obj.b, a)?.head(s) -get(obj.b, add) -get(obj.b, arr == obj)?.a -get(obj.b, arr) -get(obj.b, b != f) -get(obj.b, b .. a) -get(obj.b, b >= b) -get(obj.b, b) -get(obj.b, div) -get(obj.b, f != ok) -get(obj.b, f) -get(obj.b, false != "b") -get(obj.b, filter(f .. 0.5, b or true)) -get(obj.b, get("b")) -get(obj.b, get(2, false)) -get(obj.b, get(arr, a)) -get(obj.b, get(b, div)) -get(obj.b, get(div, 0)) -get(obj.b, get(ok)) -get(obj.b, last("b", 0)) -get(obj.b, lower("b")) -get(obj.b, lower(f, s)) -get(obj.b, map(arr, arr)) -get(obj.b, map(obj, nil)) -get(obj.b, map(s, s)) -get(obj.b, max(nil, div)) -get(obj.b, not ok) -get(obj.b, now(add, a, div)) -get(obj.b, obj == 0.5) -get(obj.b, obj || true) -get(obj.b, obj) -get(obj.b, obj)?.b -get(obj.b, obj)?.b?.b -get(obj.b, obj.a) -get(obj.b, obj.fn(1)) -get(obj.b, obj.head(f, obj, 0)) -get(obj.b, obj.obj) -get(obj.b, obj?.a) -get(obj.b, obj?.b) -get(obj.b, obj?.head("b", nil, f)) -get(obj.b, obj?.head(div)) -get(obj.b, ok && s) -get(obj.b, ok == a) -get(obj.b, ok and arr) -get(obj.b, ok) -get(obj.b, one("b", true)) -get(obj.b, s == ok) -get(obj.b, s) -get(obj.b, s)?.a -get(obj.b, toJSON(2)) -get(obj.b, upper(s)) -get(obj.c, a) -get(obj.c, arr) -get(obj.c, ok) -get(obj.fn(0), a) -get(obj.fn(0), add) -get(obj.fn(0), arr) -get(obj.fn(0), f in nil) -get(obj.fn(0), int(b)) -get(obj.fn(0), ok) -get(obj.fn(1) + obj?.fn(0), obj) -get(obj.fn(1), div == a) -get(obj.fn(1), div) -get(obj.fn(1), f && false) -get(obj.fn(1), now(arr)) -get(obj.fn(2), arr) -get(obj.fn(a), f * f) -get(obj.fn(a), get(nil)) -get(obj.fn(a), now(nil)) -get(obj.fn(b), 0 + a) -get(obj.fn(b), 2 < 0.5) -get(obj.fn(b), arr) -get(obj.fn(b), div) -get(obj.fn(b), ok) -get(obj.fn(b), s) -get(obj.head("a"), obj?.obj) -get(obj.head("a", "a"), false ? obj : s) -get(obj.head("a", nil), add != div) -get(obj.head("b"), f) -get(obj.head("b", f, add), div) -get(obj.head("b", s, nil), a) -get(obj.head(0), div) -get(obj.head(0), f) -get(obj.head(0, "c"), get("a", arr)) -get(obj.head(0, "c"), toJSON(a)) -get(obj.head(0, "c", b), add) -get(obj.head(0, 0.5, div, s, a), b ** a) -get(obj.head(0, add), a) -get(obj.head(0, add, f), f) -get(obj.head(0, nil), arr) -get(obj.head(0.5), s) -get(obj.head(0.5, 0, ok), obj) -get(obj.head(0.5, false), add) -get(obj.head(1, false, obj, f, arr), obj) -get(obj.head(2, ok), get(obj, b)) -get(obj.head(a), a) -get(obj.head(a), add) -get(obj.head(a), obj == div) -get(obj.head(a), obj?.a) -get(obj.head(a), s) -get(obj.head(a, 0, "a"), f) -get(obj.head(a, 2, a, obj), div != ok) -get(obj.head(a, a, arr), ok || f) -get(obj.head(a, nil, a), arr) -get(obj.head(a, s, add), obj.b) -get(obj.head(add), add) -get(obj.head(add), first(s)) -get(obj.head(add), float(s, 1)) -get(obj.head(add), ok && a) -get(obj.head(add, 1), arr[0:a]) -get(obj.head(add, a, 2), b) -get(obj.head(add, add, add), div) -get(obj.head(arr), !ok) -get(obj.head(arr), a) -get(obj.head(arr), arr) -get(obj.head(arr), f != arr) -get(obj.head(arr), get(s, 2)) -get(obj.head(arr), ok) -get(obj.head(arr, 0), f) -get(obj.head(arr, 2), arr == nil) -get(obj.head(arr, nil), -0.5) -get(obj.head(arr, nil, nil), ok) -get(obj.head(b), a) -get(obj.head(b), arr) -get(obj.head(b), f ** a) -get(obj.head(b, 0), f != ok) -get(obj.head(b, 1), div) -get(obj.head(b, arr), "a" < s) -get(obj.head(b, b), get(1, s)) -get(obj.head(b, div, f), a / b) -get(obj.head(b, obj, s, true), 0 <= a) -get(obj.head(div), add) -get(obj.head(div), b - b) -get(obj.head(div), b) -get(obj.head(div), div != 1)?.b -get(obj.head(div), obj) -get(obj.head(div, "c", add), arr) -get(obj.head(div, a), obj and false) -get(obj.head(div, arr), a)?.b?.a -get(obj.head(div, div), s matches s) -get(obj.head(div, false), false != arr) -get(obj.head(div, ok), !ok) -get(obj.head(f), arr) -get(obj.head(f), obj.a)?.obj -get(obj.head(f), upper("c")) -get(obj.head(f, add, f, ok), 0.5 and false) -get(obj.head(f, b), obj.b) -get(obj.head(f, false), arr) -get(obj.head(f, nil), add) -get(obj.head(f, s), arr[a]) -get(obj.head(false), add != s) -get(obj.head(false), add) -get(obj.head(false), div) -get(obj.head(false), s) -get(obj.head(false, add), s) -get(obj.head(false, arr), div) -get(obj.head(false, b, 0, obj), get(f, b)) -get(obj.head(false, div), s in obj) -get(obj.head(get(s, 1)), div) -get(obj.head(nil), add) -get(obj.head(nil), obj?.head(true, "a")) -get(obj.head(nil), obj?.obj) -get(obj.head(nil), s) -get(obj.head(nil), s[b]) -get(obj.head(nil, obj, arr, add, arr), b) -get(obj.head(nil, true), string(b)) -get(obj.head(obj), div) -get(obj.head(obj), get(add, s)) -get(obj.head(obj), get(div, ok, obj)) -get(obj.head(obj), ok) -get(obj.head(obj), true || false) -get(obj.head(obj, "a"), s) -get(obj.head(obj, "c", nil), a) -get(obj.head(obj, 0, "a"), obj.obj)?.b -get(obj.head(obj, f), a) -get(obj.head(obj, f, obj), toJSON(s)) -get(obj.head(obj, nil), nil != a) -get(obj.head(obj, s, 0), arr) -get(obj.head(ok), a != true) -get(obj.head(ok), b ** 2) -get(obj.head(ok), get(1, add)) -get(obj.head(ok), obj) -get(obj.head(ok), obj?.a) -get(obj.head(ok), s) -get(obj.head(ok), toJSON(nil)) -get(obj.head(ok), true ? a : nil) -get(obj.head(ok, "a"), add) -get(obj.head(ok, 0.5, add, div), obj) -get(obj.head(ok, 1), 0.5 != 0) -get(obj.head(ok, a), "b" contains "b") -get(obj.head(ok, arr, div, true, s), get(2, nil)) -get(obj.head(ok, s), map(obj, true)) -get(obj.head(s), add && true) -get(obj.head(s), b) -get(obj.head(s), div == "a") -get(obj.head(s), get(obj, f)) -get(obj.head(s), map(s, f)) -get(obj.head(s), obj.head(0.5, true, ok)) -get(obj.head(s, a), get(div, nil)) -get(obj.head(s, arr, f), "a" in obj) -get(obj.head(s, f), last(nil, arr)) -get(obj.head(true), ok != 0.5) -get(obj.head(true, "c"), get(b, ok)) -get(obj.head(true, false, obj), true != f) -get(obj.obj, !true) -get(obj.obj, "a" == obj) -get(obj.obj, "a" == ok) -get(obj.obj, 0 <= 0) -get(obj.obj, 0 == nil) -get(obj.obj, 0 == s) -get(obj.obj, 0 == true) -get(obj.obj, 0 > a) -get(obj.obj, 0.5 ^ b) -get(obj.obj, a + f) -get(obj.obj, a - 0) -get(obj.obj, a) -get(obj.obj, a)?.a -get(obj.obj, abs(0)) -get(obj.obj, add(b, b)) -get(obj.obj, add) -get(obj.obj, all("b", ok)) != b -get(obj.obj, arr) -get(obj.obj, b) -get(obj.obj, count(s, false)) -get(obj.obj, div != "a") -get(obj.obj, div != add) -get(obj.obj, div) -get(obj.obj, f != obj) -get(obj.obj, f .. 0) -get(obj.obj, f < a) -get(obj.obj, f) -get(obj.obj, false or false) -get(obj.obj, false or s) -get(obj.obj, filter(obj, false)) -get(obj.obj, get(arr)) -get(obj.obj, get(arr, obj)) -get(obj.obj, get(arr, s)) -get(obj.obj, get(b, a)) -get(obj.obj, get(f, false)) -get(obj.obj, get(nil, s)) -get(obj.obj, get(obj, true)) -get(obj.obj, int(b, 0.5)) -get(obj.obj, int(b, b)) -get(obj.obj, last("c")) -get(obj.obj, map(arr, "a")) -get(obj.obj, map(s, "a")) -get(obj.obj, min(arr)) -get(obj.obj, nil != a) -get(obj.obj, now(obj)) -get(obj.obj, obj) -get(obj.obj, obj)?.obj -get(obj.obj, obj?.a) -get(obj.obj, obj?.b) -get(obj.obj, obj?.obj) -get(obj.obj, obj[s]) -get(obj.obj, ok != b) -get(obj.obj, ok) -get(obj.obj, one(obj, ok)) -get(obj.obj, one(s, ok)) -get(obj.obj, s) -get(obj.obj, s)?.obj -get(obj.obj, s[f]) -get(obj.obj, string(a, b)) -get(obj.obj, toBase64("a", 1)) -get(obj.obj, toJSON(arr)) -get(obj.obj, true or nil) -get(obj.obj.a, obj)?.fn(a) -get(obj.obj?.b, f) -get(obj?.a, "b" in arr) -get(obj?.a, -a) -get(obj?.a, -f) -get(obj?.a, 0 + a) -get(obj?.a, 0 - a) -get(obj?.a, 0 / a) -get(obj?.a, 0 <= f)?.a -get(obj?.a, 0.5 != 1) -get(obj?.a, 0.5 > 0.5) -get(obj?.a, 1 + f) -get(obj?.a, 1 <= 1) -get(obj?.a, a - a) -get(obj?.a, a == nil) -get(obj?.a, a) -get(obj?.a, a)?.b -get(obj?.a, add(a, a))?.obj -get(obj?.a, add) -get(obj?.a, all(s, false)) -get(obj?.a, arr) -get(obj?.a, b ** a) -get(obj?.a, b - a) -get(obj?.a, b < b) -get(obj?.a, b) -get(obj?.a, div(0, b)) -get(obj?.a, div) -get(obj?.a, f .. b) -get(obj?.a, f ^ f) -get(obj?.a, f) -get(obj?.a, false != ok) -get(obj?.a, false && s) -get(obj?.a, false ? 0 : false) -get(obj?.a, false || s) -get(obj?.a, get("a", nil)) -get(obj?.a, get(0, ok)) -get(obj?.a, get(0.5, 2)) -get(obj?.a, get(2, true)) -get(obj?.a, get(s, f)) -get(obj?.a, get(s, s)) -get(obj?.a, get(true, nil)) -get(obj?.a, int(f)) -get(obj?.a, last(0.5, add, 0.5)) -get(obj?.a, last(add)) -get(obj?.a, map(arr, div)) -get(obj?.a, max(f)) -get(obj?.a, min(a, 0.5) <= 2 != ok) -get(obj?.a, not ok) -get(obj?.a, now(0.5, 1, s, 0, f)) -get(obj?.a, now(div)) -get(obj?.a, obj) -get(obj?.a, obj.a) -get(obj?.a, obj.b) -get(obj?.a, obj.head(ok, 0)) -get(obj?.a, obj?.b) -get(obj?.a, obj?.head(f)) -get(obj?.a, ok && "a") -get(obj?.a, ok ? div : "a") -get(obj?.a, ok || f) -get(obj?.a, ok) -get(obj?.a, s) -get(obj?.a, string(div)) -get(obj?.a, toJSON(f, nil, s)) -get(obj?.a, true && false) -get(obj?.a, true ? false : add) -get(obj?.b, -f) -get(obj?.b, 0 or true) -get(obj?.b, 0 || false)?.fn(f) -get(obj?.b, 1 - b) -get(obj?.b, 2 % b) -get(obj?.b, 2 == 0) -get(obj?.b, a .. 0) -get(obj?.b, a < b) -get(obj?.b, a) -get(obj?.b, a)?.obj -get(obj?.b, add == s) -get(obj?.b, add in arr) -get(obj?.b, add) -get(obj?.b, arr == 0.5) -get(obj?.b, arr == a) -get(obj?.b, arr) -get(obj?.b, arr)?.b -get(obj?.b, arr[b]) -get(obj?.b, b % a) -get(obj?.b, b + 1) -get(obj?.b, b) -get(obj?.b, count(obj, true)) -get(obj?.b, div != "b") -get(obj?.b, div) -get(obj?.b, f != ok) -get(obj?.b, f + 0) -get(obj?.b, f / b) -get(obj?.b, f == div) -get(obj?.b, f) -get(obj?.b, false == nil) -get(obj?.b, false and f) -get(obj?.b, float(a)) -get(obj?.b, get(0.5, ok)) -get(obj?.b, get(a, 2)) -get(obj?.b, get(a, a)) -get(obj?.b, get(add)) -get(obj?.b, get(add, arr)) -get(obj?.b, get(add, s)) -get(obj?.b, get(f, 0.5)) -get(obj?.b, get(f, arr))?.obj -get(obj?.b, get(false, false)) -get(obj?.b, get(obj, div)) -get(obj?.b, get(obj, nil)) -get(obj?.b, get(ok, f)) -get(obj?.b, get(s)) -get(obj?.b, get(s, 0)) -get(obj?.b, int(2)) -get(obj?.b, last(ok, true, 0.5)) -get(obj?.b, map("a", s)) -get(obj?.b, map(obj, 0)) -get(obj?.b, map(obj, nil)) -get(obj?.b, map(s, 1)) -get(obj?.b, map(s, b)) -get(obj?.b, max(f)) -get(obj?.b, min(nil)) -get(obj?.b, nil or true) -get(obj?.b, nil || false) -get(obj?.b, now(s)) -get(obj?.b, now(true)) -get(obj?.b, obj == b) -get(obj?.b, obj) -get(obj?.b, obj.a) -get(obj?.b, obj.b) -get(obj?.b, obj.head(false)) -get(obj?.b, obj?.head(a, 0.5)) -get(obj?.b, obj?.head(obj, 0)) -get(obj?.b, obj?.head(ok)) -get(obj?.b, ok && arr) -get(obj?.b, ok ? f : arr) -get(obj?.b, ok and div) -get(obj?.b, ok) -get(obj?.b, s != obj) -get(obj?.b, s == s) -get(obj?.b, s > "a") -get(obj?.b, s) -get(obj?.b, s)?.obj -get(obj?.b, toJSON(f)) -get(obj?.c?.a?.b, ok) -get(obj?.fn(0), a) -get(obj?.fn(0), ok) -get(obj?.fn(0), s) -get(obj?.fn(1 + 0), ok ? ok : s?.a) -get(obj?.fn(1), obj) -get(obj?.fn(2), a / 0) -get(obj?.fn(2), a) -get(obj?.fn(2), none(s, true)) -get(obj?.fn(a), add) -get(obj?.fn(a), f) -get(obj?.fn(a), get(arr, b)) -get(obj?.fn(a), get(nil, 0)) -get(obj?.fn(a), obj) -get(obj?.fn(a), s) -get(obj?.fn(b + b), a) -get(obj?.fn(b), div) -get(obj?.fn(b), f .. f) -get(obj?.fn(b), obj) -get(obj?.head("a"), arr) -get(obj?.head("a"), map("a", a)) -get(obj?.head("a", f), obj?.b)?.b -get(obj?.head("b"), add) -get(obj?.head("b", 2, arr), ok) -get(obj?.head("c"), s > "c") -get(obj?.head("c"), s matches s) -get(obj?.head("c", 0.5, a), "a" || false) -get(obj?.head("c", b), nil == div) -get(obj?.head("c", div, ok), count("b", true)) -get(obj?.head(0), b .. b) -get(obj?.head(0), div) -get(obj?.head(0), map(s, add)) -get(obj?.head(0), obj) -get(obj?.head(0), obj?.b) -get(obj?.head(0), ok) -get(obj?.head(0), s) -get(obj?.head(0, 0), b) -get(obj?.head(0, 0, add, "b", 2), arr) -get(obj?.head(0, a, 0.5, a), a - b) -get(obj?.head(0, b, add, false, nil), b) -get(obj?.head(0, nil, obj, 0, add), div) -get(obj?.head(0.5), min(arr)) -get(obj?.head(0.5), s) -get(obj?.head(0.5, b), ok or b) -get(obj?.head(0.5, b), s) -get(obj?.head(0.5, div), add) -get(obj?.head(0.5, s, a, "c", b), obj?.head(add, 0)) -get(obj?.head(1), get(ok, 0)) -get(obj?.head(1, a), add) -get(obj?.head(1, a, f), get(f, nil)) -get(obj?.head(2), a) -get(obj?.head(2), max(0.5)) -get(obj?.head(2, true, a, ok), arr) -get(obj?.head(a), add) -get(obj?.head(a), arr) -get(obj?.head(a), b) -get(obj?.head(a), obj?.obj) -get(obj?.head(a), s) -get(obj?.head(a, "c", "c"), a) -get(obj?.head(a, add, b), div) -get(obj?.head(a, div), obj.head(b)) -get(obj?.head(a, s, s), map("a", a)) -get(obj?.head(add), b) -get(obj?.head(add), none(obj, false)) -get(obj?.head(add), now(obj, 1, add)) -get(obj?.head(add), s) -get(obj?.head(add, a, obj, "b", a), obj.obj) -get(obj?.head(add, b), div) -get(obj?.head(add, false), div != b) -get(obj?.head(add, float(f)), s) -get(obj?.head(add, obj, a), s) -get(obj?.head(add, obj, a, 0.5), add) -get(obj?.head(add, obj, obj), f) -get(obj?.head(add, ok), a) -get(obj?.head(arr), get(s, arr)) -get(obj?.head(arr), obj) -get(obj?.head(arr), s) -get(obj?.head(arr, 0.5, false), 0 > f) -get(obj?.head(arr, a), obj.obj) -get(obj?.head(arr, add), 0.5 / a) -get(obj?.head(arr, add), b) -get(obj?.head(arr, add), div) -get(obj?.head(arr, nil), f) -get(obj?.head(arr, nil, arr, ok), obj) -get(obj?.head(arr, obj, "a"), false == div) -get(obj?.head(arr, ok, arr), obj?.head(true, 0)) -get(obj?.head(arr, s), div) -get(obj?.head(arr, s), obj.a) -get(obj?.head(b), all(s, ok)) -get(obj?.head(b), b) -get(obj?.head(b), f)?.obj -get(obj?.head(b), false && 0) -get(obj?.head(b), get(0.5, b)) -get(obj?.head(b), obj?.b) -get(obj?.head(b, "b", nil), arr) -get(obj?.head(b, 0), obj.b) -get(obj?.head(b, div), add) -get(obj?.head(b, nil, ok), nil == f) -get(obj?.head(div), a) -get(obj?.head(div), arr) -get(obj?.head(div), div) -get(obj?.head(div, 1, ok, a), div) -get(obj?.head(div, a), obj && false) -get(obj?.head(div, arr), nil == "c") -get(obj?.head(div, false), f) -get(obj?.head(div, false, arr), map(s, b)) -get(obj?.head(div, obj), f) -get(obj?.head(f), arr) -get(obj?.head(f), obj.obj) -get(obj?.head(f), s) -get(obj?.head(f, nil), ok ? f : div) -get(obj?.head(f, ok, add), "a" == f) -get(obj?.head(false), false and f) -get(obj?.head(false), ok && obj) -get(obj?.head(false), ok) -get(obj?.head(false, b, ok, "a"), any(obj, ok)) -get(obj?.head(false, obj, 0, arr), div) -get(obj?.head(false, s, 0, f), true or s) -get(obj?.head(nil), a) -get(obj?.head(nil), add) -get(obj?.head(nil), f) -get(obj?.head(nil), get(false, add)) -get(obj?.head(nil), ok) -get(obj?.head(nil), s == arr) -get(obj?.head(nil), s) -get(obj?.head(nil, "c"), arr) -get(obj?.head(nil, arr), ok or obj) -get(obj?.head(nil, obj), first(f, nil)) -get(obj?.head(obj), add != true) -get(obj?.head(obj), arr) -get(obj?.head(obj), f) -get(obj?.head(obj), obj) -get(obj?.head(obj), ok) -get(obj?.head(obj, "a", add), ok == ok) -get(obj?.head(obj, arr), arr) -get(obj?.head(obj, f), obj) -get(obj?.head(obj, obj, ok), div) -get(obj?.head(obj?.a), a) -get(obj?.head(ok), a) -get(obj?.head(ok), b) -get(obj?.head(ok, 1), b == b) -get(obj?.head(ok, 1), ok) -get(obj?.head(ok, arr, div), get(add, s)) -get(obj?.head(ok, f, 0.5, b), 1 != true) -get(obj?.head(s), b % 2) -get(obj?.head(s), f) -get(obj?.head(s), get(a, obj)) -get(obj?.head(s), obj) -get(obj?.head(s), ok) -get(obj?.head(s, 0, arr), false or s) -get(obj?.head(s, 2, f, div), get(f, 0.5)) -get(obj?.head(s, add, s), hasPrefix("b", s)) -get(obj?.head(s, div, arr), s) -get(obj?.head(s, false), obj == add) -get(obj?.head(true), b) -get(obj?.head(true), f != s) -get(obj?.head(true), f) -get(obj?.head(true), first(div, b)) -get(obj?.head(true, add), a) -get(obj?.head(true, add, add), obj.head(ok, obj, 2, nil, 2)) -get(obj?.head(true, b), obj) -get(obj?.head(true, div), a) -get(obj?.head(true, f), filter(s, true)) -get(obj?.head(true, obj, 1, b), div) -get(obj?.obj, "a" matches s) -get(obj?.obj, -b) -get(obj?.obj, 0 != f) -get(obj?.obj, 0 != s) -get(obj?.obj, 0 / a) -get(obj?.obj, 0.5 + a)?.a -get(obj?.obj, 1 .. a) -get(obj?.obj, 2 + 2) -get(obj?.obj, a != 2) -get(obj?.obj, a * f) -get(obj?.obj, a ** f) -get(obj?.obj, a < b) -get(obj?.obj, a or true) -get(obj?.obj, a) -get(obj?.obj, add and false) -get(obj?.obj, add(a, b)) -get(obj?.obj, add) -get(obj?.obj, arr) -get(obj?.obj, b * b) -get(obj?.obj, b ** 2) -get(obj?.obj, b > a) -get(obj?.obj, b) -get(obj?.obj, div == 0) -get(obj?.obj, div) -get(obj?.obj, f < 0) -get(obj?.obj, f) -get(obj?.obj, false or "c") -get(obj?.obj, filter("a", ok)) -get(obj?.obj, filter(s, ok)) -get(obj?.obj, get("b", arr)) -get(obj?.obj, get("c", arr)) -get(obj?.obj, get(0, a)) -get(obj?.obj, get(add, s)) -get(obj?.obj, get(arr, 0)) -get(obj?.obj, get(nil, a)) -get(obj?.obj, get(nil, b)) -get(obj?.obj, int(false, arr, b)) -get(obj?.obj, map(obj, "b")) -get(obj?.obj, map(obj, div)) -get(obj?.obj, min(arr)) -get(obj?.obj, now("c", obj)) -get(obj?.obj, obj) -get(obj?.obj, obj)?.a?.a -get(obj?.obj, obj.a) -get(obj?.obj, obj.b) -get(obj?.obj, obj.head(nil)) -get(obj?.obj, obj.obj) -get(obj?.obj, obj?.a) -get(obj?.obj, obj?.head(add)) -get(obj?.obj, obj?.head(s, 0)) -get(obj?.obj, obj?.obj) -get(obj?.obj, ok != a) -get(obj?.obj, ok != false) -get(obj?.obj, ok ? 2 : true) -get(obj?.obj, ok and nil) -get(obj?.obj, ok or ok) -get(obj?.obj, ok) -get(obj?.obj, ok)?.obj -get(obj?.obj, one(obj, true)) -get(obj?.obj, s) -get(obj?.obj, string(f)) -get(obj?.obj, string(f, 0)) -get(obj?.obj, string(ok, s, s)) -get(obj?.obj, toJSON(b, b, nil)) -get(obj?.obj, toJSON(f)) -get(obj?.obj, true || 1) -get(obj?.obj.b, arr) -get(obj?.obj?.a, div) -get(obj?.obj?.b, obj) -get(obj?.obj?.b, s) -get(obj?.obj?.obj, f) -get(obj[nil], add) -get(obj[nil], arr) -get(obj[nil], f) -get(obj[nil], get(s, a)) -get(obj[nil], ok) -get(obj[nil], s) -get(obj[s], obj) -get(obj[s], obj?.a) -get(ok ? "a" : add, ok ? s : add) -get(ok ? "a" : arr, arr) -get(ok ? 0 : "c", obj) -get(ok ? 0 : arr, arr) -get(ok ? add : 0.5, b) -get(ok ? add : obj, ok) -get(ok ? arr : add, div) -get(ok ? arr : b, f) -get(ok ? arr : f, toJSON("c")) -get(ok ? b : div, first(nil)) -get(ok ? div : 1, add) -get(ok ? f : "a", f) -get(ok ? f : div, arr) -get(ok ? f : obj, div) -get(ok ? f : ok, obj.obj) -get(ok ? false : arr, s) -get(ok ? obj : 0, arr) -get(ok ? obj : a, a) -get(ok ? obj : div, div) -get(ok ? ok : b, ok and ok) -get(ok ? ok : f, last(ok)) -get(ok ? ok : obj, a) -get(ok ? ok : obj, arr) -get(ok ? s : f, arr) -get(ok ? s : false, 0 != f) -get(ok ? s : obj, obj?.head(ok, add))?.b -get(ok ? true : a, count(arr, ok)) -get(true ? "c" : 0, get("b", div)) -get(true ? 0.5 : 0, s) -get(true ? 1 : arr, f) -get(true ? 1 : ok, f == a) -get(true ? 1 : ok, ok or add) -get(true ? a : ok, f * 0.5) -get(true ? a : ok, get(nil, "c")) -get(true ? add : "a", a) -get(true ? add : 0.5, s[0.5:b]) -get(true ? b : s, div) -get(true ? div : 2, add) -get(true ? f : "c", get(arr)) -get(true ? obj : add, arr) -get(true ? ok : 0, 0 / a) -get(true ? s : 0.5, get(obj, f)) -get(values(obj), obj.a) -get({"b": b, "c": "c", "a": nil}?.b, obj.obj) -indexOf("b", s) != a -indexOf(s, s) -indexOf(s, upper(s)) -int(-0) +get(1 .. i32, i) +get(1 .. i64, abs(1)) +get(1 .. i64, i) +get(1 .. i64, i32) +get(["bar"], i64) +get([array], i) +get([greet], i) +get([nil, half], i) +get([score, 0.5, score], i64) +get(array, -1) +get(array, -i) +get(array, -i32) +get(array, 1 % 1) +get(array, 1 % i64) +get(array, 1 - 1) +get(array, 1 - i) +get(array, 1) * f64 +get(array, 1) < f32 +get(array, 1) <= i32 +get(array, 1) > i +get(array, 1) ^ f64 +get(array, 1) ^ i +get(array, array[1]) +get(array, count(list, true)) +get(array, false ? div : false) +get(array, first(array)) +get(array, i % i64) +get(array, i * 1) +get(array, i) +get(array, i) + i +get(array, i) > i32 +get(array, i) ^ f32 +get(array, i32 * i64) +get(array, i32) +get(array, i32) ** f32 +get(array, i32) == i32 +get(array, i32) > f64 +get(array, i64) +get(array, i64) ** i +get(array, i64) ** i64 +get(array, i64) .. i32 +get(array, i64) <= -i32 +get(array, i64) <= f64 / f32 +get(array, i64) <= i +get(array, i64) == i64 +get(array, int(1)) +get(array, int(f32)) +get(array, int(f64)) +get(array, int(i32)) +get(array, len(array)) +get(array, max(1)) +get(array, min(i)) +get(array, min(i32)) +get(array, score(1)) +get(array, true ? i : 1) +get(false ? "bar" : f64, list) +get(false ? "bar" : i32, greet) +get(false ? "foo" : i, ok) +get(false ? 0.5 : i64, true not in String) +get(false ? 1 : greet, ok) +get(false ? div : true, min("foo")) +get(false ? greet : score, score) +get(false ? half : list, i32) +get(false ? list : 1, i32) +get(false ? list : i64, i >= f64) +get(false ? score : 0.5, add) +get(false ? score : 0.5, half) +get(false ? score : f64, half) +get(filter(list, ok), i32) +get(filter(list, ok), i64) +get(i .. i, i) +get(i32 .. 1, i) +get(i64 .. 1, i32) +get(list, -i) +get(list, -i32) +get(list, -i64) +get(list, 1 * i) +get(list, 1).Bar +get(list, 1).Qux +get(list, 1).String +get(list, 1).String() +get(list, 1)?.Bar +get(list, 1)?.Qux +get(list, 1)?.String +get(list, 1)?.String() +get(list, abs(i)) +get(list, abs(i32)) +get(list, i) +get(list, i) != foo +get(list, i) == foo +get(list, i).Bar +get(list, i).Qux +get(list, i).String +get(list, i)?.Bar +get(list, i)?.Qux +get(list, i)?.String +get(list, i)?.String() +get(list, i32) +get(list, i32).Bar +get(list, i32).Qux +get(list, i32).String +get(list, i32).String() +get(list, i32)?.Bar +get(list, i32)?.Qux +get(list, i32)?.String +get(list, i32)?.String() +get(list, i64 * i32) +get(list, i64) +get(list, i64).Bar +get(list, i64).Qux +get(list, i64).String +get(list, i64).String() +get(list, i64)?.Bar +get(list, i64)?.Qux +get(list, i64)?.String +get(list, i64)?.String() +get(list, int(1) > 0.5 ? div : 0.5) +get(list, int(i)) +get(list, int(i32)) +get(list, int(i64)) +get(list, last(array)) +get(list, max(1, i64, i64)) +get(list, min(i32)) +get(list, min(i64)) +get(list, score(1)) +get(list[i32:i], i64) +get(map(array, #), i) +get(map(array, #), i64) +get(map(array, #), last(array)) +get(map(array, 0.5), i) +get(map(array, 1), i) +get(map(array, i32), i64) +get(map(array, ok), i) +get(map(array, ok), i64) +get(map(list, #), i) +get(map(list, #), i32) +get(map(list, #), i64) +get(map(list, 0.5), i64) +get(map(list, array), i) +get(map(list, div), i32) +get(map(list, i32), i64) +get(map(list, ok), i32) +get(map(list, true), i64) +get(ok ? 0.5 : add, f32) +get(ok ? add : 0.5, ok) +get(ok ? add : false, div) +get(ok ? array : 0.5, Bar) +get(ok ? array : i, add) +get(ok ? div : foo, filter("bar", ok)) +get(ok ? greet : 0.5, foo in String) +get(ok ? greet : f32, Bar) +get(ok ? i : f64, greet)?.f64 +get(ok ? i32 : "foo", score) +get(ok ? i32 : add, div) +get(ok ? list : "foo", f32) +get(ok ? ok : half, array) +get(ok ? true : i32, f32) +get(sort(array), i32) +get(true ? 0.5 : score, foo) +get(true ? 1 : f64, foo) +get(true ? 1 : greet, greet)?.foo +get(true ? 1 : score, String?.Qux()) +get(true ? add : score, i) +get(true ? array : 1, half) +get(true ? array : i64, ok) +get(true ? div : foo, list) +get(true ? f32 : 1, greet) +get(true ? f64 : greet, String) +get(true ? f64 : ok, Bar?.ok) +get(true ? i : f64, add) +get(true ? i64 : score, i) +get(true ? list : ok, ok) +get({"bar": i32}.i32, ok) +greet +greet != add +greet != div +greet != div != nil +greet != foo.Qux +greet != foo.String +greet != foo?.Qux +greet != foo?.String +greet != greet +greet != greet != nil +greet != greet or 0.5 == i +greet != half +greet != half ? 1 : ok +greet != half ? array : 0.5 +greet != half ? false : f64 +greet != half ? greet : greet +greet != nil ? i64 : 0.5 +greet != score +greet == add +greet == add == ok +greet == add ? div == greet : i64 +greet == div +greet == div ? add : i32 +greet == foo.Qux +greet == foo.String +greet == foo?.Qux +greet == foo?.String +greet == greet +greet == half +greet == nil != nil +greet == nil && ok +greet == nil == ok +greet == score +greet in [nil] +greet("bar" + "bar") +greet("bar" + "foo") +greet("bar") != foo.String() +greet("bar") != nil != false +greet("bar") in foo +greet("foo" + "bar") +greet("foo" + "foo") +greet("foo") >= string(foo) +greet("foo") not contains "bar" ? array : half +greet("foo") startsWith greet("bar") +greet(false ? f32 : "foo") +greet(false ? i : "bar") +greet(foo.Bar) +greet(foo.String()) +greet(foo?.Bar) +greet(foo?.String()) +greet(greet("bar")) +greet(greet("foo")) +greet(lower("bar")) +greet(lower("foo")) +greet(ok ? "bar" : div) +greet(string("bar")) +greet(string("foo")) +greet(string(-i64)) +greet(string(0.5 == 1)) +greet(string(0.5)) +greet(string(1)) +greet(string([0.5])) +greet(string(add)) +greet(string(array)) +greet(string(div)) +greet(string(f32)) +greet(string(f64)) +greet(string(false)) +greet(string(foo)) +greet(string(foo?.Qux)) +greet(string(greet)) +greet(string(half)) +greet(string(i)) +greet(string(i32)) +greet(string(i64)) +greet(string(list)) +greet(string(nil != false)) +greet(string(nil)) +greet(string(ok)) +greet(string(score)) +greet(string(true)) +greet(toBase64("bar")) +greet(toBase64("foo")) +greet(toJSON("bar")) +greet(toJSON("foo")) +greet(toJSON(0.5)) +greet(toJSON(1)) +greet(toJSON(array)) +greet(toJSON(f32)) +greet(toJSON(f64)) +greet(toJSON(false)) +greet(toJSON(foo)) +greet(toJSON(i)) +greet(toJSON(i32)) +greet(toJSON(i64)) +greet(toJSON(list)) +greet(toJSON(nil)) +greet(toJSON(ok)) +greet(toJSON(string(array))) +greet(toJSON(true)) +greet(trim("bar")) +greet(trim("foo")) +greet(trim(string(array))) +greet(trimPrefix("bar")) +greet(trimPrefix("foo")) +greet(trimSuffix("bar")) +greet(trimSuffix("foo")) +greet(trimSuffix("foo", "foo")) +greet(true ? "foo" : 0.5) +greet(type("bar")) +greet(type("foo")) +greet(type(0.5)) +greet(type(1)) +greet(type(abs(f32))) +greet(type(add)) +greet(type(array)) +greet(type(div)) +greet(type(f32)) +greet(type(f64 / i)) +greet(type(f64)) +greet(type(false)) +greet(type(foo)) +greet(type(greet)) +greet(type(half)) +greet(type(i)) +greet(type(i32)) +greet(type(i64)) +greet(type(list)) +greet(type(nil)) +greet(type(ok)) +greet(type(score)) +greet(type(true)) +greet(upper("bar")) +greet(upper("foo")) +half +half != add +half != add ? ok : half +half != div +half != div == true +half != foo.Qux +half != foo.String +half != foo?.Qux +half != foo?.String +half != greet +half != half +half != score +half == add +half == add ? "bar" : half +half == div +half == div ? add : 0.5 +half == div and 1 >= 1 +half == foo.Qux +half == foo.String +half == foo?.Qux +half == foo?.String +half == greet +half == greet == nil +half == greet ? ok : foo +half == greet || ok +half == half +half == half && i >= 0.5 +half == half ? score : "bar" +half == half and ok +half == nil == true +half == nil ? 1 : 0.5 +half == nil ? 1 : score +half == score +half not in [list, i64, ok] +half not in {"bar": list, "foo": 0.5}.ok +half(-(f32 - 0.5)) +half(--1) +half(-0.5) +half(-1) +half(-f32 ^ i) +half(-f64) +half(0.5 * 0.5) +half(0.5 * 1) +half(0.5 * f64) +half(0.5 * i) +half(0.5 * i32) +half(0.5 * i64) +half(0.5 ** 0.5) +half(0.5 ** 1) +half(0.5 ** f32) +half(0.5 ** f64) +half(0.5 ** i) +half(0.5 ** i32) +half(0.5 ** i64) +half(0.5 + 0.5) +half(0.5 + 1) +half(0.5 + f32) +half(0.5 + f64) +half(0.5 + i32) +half(0.5 + i64) +half(0.5 - 0.5) +half(0.5 - 1) +half(0.5 - f32) +half(0.5 - f64) +half(0.5 - i) +half(0.5 - i32) +half(0.5 - i64) +half(0.5 / 0.5) +half(0.5 / 1) +half(0.5 / f32) +half(0.5 / f64) +half(0.5 / i) +half(0.5 / i32) +half(0.5 / i64) +half(0.5 ^ 0.5) +half(0.5 ^ 1) +half(0.5 ^ f32) +half(0.5 ^ f64) +half(0.5 ^ i) +half(0.5 ^ i32) +half(0.5 ^ i64) +half(0.5) != f32 +half(0.5) != i64 +half(0.5) * f32 +half(0.5) ** f32 +half(0.5) ** f64 +half(0.5) + 1 * f64 +half(0.5) + f64 +half(0.5) + i32 +half(0.5) + i64 +half(0.5) - f32 +half(0.5) - f64 +half(0.5) - i +half(0.5) - i32 +half(0.5) / i +half(0.5) / i32 +half(0.5) / i64 +half(0.5) < i32 +half(0.5) <= i +half(0.5) == f32 != true +half(0.5) == i +half(0.5) == i32 +half(0.5) == i64 +half(0.5) > i +half(0.5) > i32 +half(0.5) > i64 +half(0.5) >= f32 +half(0.5) >= f64 +half(0.5) >= i +half(0.5) >= i32 +half(0.5) >= i64 +half(0.5) ^ (i32 - 1) +half(0.5) ^ i32 +half(1 * 0.5) +half(1 * 1) +half(1 * f32) +half(1 * f64) +half(1 * i) +half(1 * i32) +half(1 * i64) +half(1 ** 0.5) +half(1 ** 1) +half(1 ** f32) +half(1 ** f64) +half(1 ** i) +half(1 ** i32) +half(1 ** i64) +half(1 + 0.5) +half(1 + 1) +half(1 + f32) +half(1 + f64) +half(1 + i) +half(1 + i32) +half(1 + i64) +half(1 - 0.5) +half(1 - 1) +half(1 - f32) +half(1 - f64) +half(1 - i) +half(1 - i32) +half(1 - i64) +half(1 / 0.5) +half(1 / 1) +half(1 / f32) +half(1 / f64) +half(1 / i) +half(1 / i32) +half(1 / i64) +half(1 ^ 0.5) +half(1 ^ 1) +half(1 ^ f32) +half(1 ^ f64) +half(1 ^ i) +half(1 ^ i32) +half(abs(0.5)) +half(abs(f64)) +half(abs(f64)) - i +half(f32 * 0.5) +half(f32 * 1) +half(f32 * f64) +half(f32 * i) +half(f32 * i32) +half(f32 * i64) +half(f32 ** 0.5) +half(f32 ** f32) +half(f32 ** f64) +half(f32 + 0.5) +half(f32 + 1) +half(f32 + f32) +half(f32 + f64) +half(f32 + i) +half(f32 + i32) +half(f32 + i64) +half(f32 - 0.5) +half(f32 - 1) +half(f32 - f64) +half(f32 - i) +half(f32 - i32) +half(f32 - i64) +half(f32 / 0.5) +half(f32 / 1) +half(f32 / f32) +half(f32 / f64) +half(f32 / i32) +half(f32 / i64) +half(f32 ^ 0.5) +half(f32 ^ f32) +half(f32 ^ f64) +half(f32 ^ i32) +half(f32 ^ i64) +half(f64 * 0.5) +half(f64 * 1) +half(f64 * f32) +half(f64 * i) +half(f64 * i32) +half(f64 ** 0.5) +half(f64 ** 1) +half(f64 ** f32) +half(f64 ** f64) +half(f64 ** i) +half(f64 ** i32) +half(f64 + 1) +half(f64 + f32) +half(f64 + i) +half(f64 + i32) +half(f64 - 0.5) +half(f64 - 1) +half(f64 - f32) +half(f64 - f64) +half(f64 - i) +half(f64 - i32) +half(f64 - i64) +half(f64 / 1) +half(f64 / f32) +half(f64 / f64) +half(f64 / i32) +half(f64 / i64) +half(f64 ^ 0.5) +half(f64 ^ 1) +half(f64 ^ f32) +half(f64 ^ i) +half(f64 ^ i32) +half(f64 ^ i64) +half(f64) +half(f64) != f32 +half(f64) != f64 +half(f64) != i64 +half(f64) * f32 +half(f64) * i64 +half(f64) ** (i32 * 0.5) +half(f64) ** 0.5 ** i +half(f64) ** f64 +half(f64) ** i64 +half(f64) + 1 + f64 +half(f64) + f64 +half(f64) + i +half(f64) + i32 +half(f64) + i64 +half(f64) - f64 +half(f64) - i32 +half(f64) / f32 +half(f64) / f64 +half(f64) / i32 +half(f64) / i64 +half(f64) < f64 +half(f64) < i +half(f64) < i32 +half(f64) < i64 +half(f64) <= 0.5 + f64 +half(f64) <= f64 +half(f64) <= i64 +half(f64) == i64 +half(f64) > abs(i) +half(f64) > f32 * 0.5 +half(f64) > max(i64) +half(f64) >= f32 +half(f64) >= i +half(f64) >= i64 +half(f64) ^ f32 +half(false ? 0.5 : 0.5) +half(float(-f64)) +half(float(0.5)) +half(float(1)) +half(float(f32)) +half(float(f64)) +half(float(i)) +half(float(i32)) +half(float(i64)) +half(greet == div ? "bar" : 0.5) +half(half(0.5)) +half(half(f64)) +half(half(i - 0.5)) +half(i * 0.5) +half(i * 1) +half(i * f32) +half(i * f64) +half(i ** 0.5) +half(i ** 1) +half(i ** f32) +half(i ** f64) +half(i ** i) +half(i ** i64) +half(i + 0.5) +half(i + 1) +half(i + f32) +half(i + f64) +half(i - 0.5) +half(i - 1) +half(i - f64) +half(i / 0.5) +half(i / 1) +half(i / f32) +half(i / f64) +half(i / i) +half(i / i32) +half(i / i64) +half(i ^ 0.5) +half(i ^ 1) +half(i ^ f32) +half(i ^ i32) +half(i ^ i64) +half(i32 * 0.5) +half(i32 * 1) +half(i32 * f32) +half(i32 * f64) +half(i32 ** 0.5) +half(i32 ** 1) +half(i32 ** f32) +half(i32 ** f64) +half(i32 ** i) +half(i32 ** i32) +half(i32 ** i64) +half(i32 + 0.5) +half(i32 + 1) +half(i32 + f64) +half(i32 - 0.5) +half(i32 - 1) +half(i32 - f32) +half(i32 - f64) +half(i32 / 0.5) +half(i32 / 1) +half(i32 / f32) +half(i32 / f64) +half(i32 / i) +half(i32 / i32) +half(i32 / i64) +half(i32 ^ 0.5) +half(i32 ^ 1) +half(i32 ^ f32) +half(i32 ^ i) +half(i32 ^ i32) +half(i32 ^ i64) +half(i64 * 0.5) +half(i64 * 1) +half(i64 * f64) +half(i64 ** 0.5) +half(i64 ** 1) +half(i64 ** f32) +half(i64 ** f64) +half(i64 ** i64) +half(i64 + 0.5) +half(i64 + 1) +half(i64 + f32) +half(i64 + f64) +half(i64 - 0.5) +half(i64 - 1) +half(i64 - f32) +half(i64 / 0.5) +half(i64 / 1) +half(i64 / f32) +half(i64 / f64) +half(i64 / i) +half(i64 / i32) +half(i64 / i64) +half(i64 ^ 0.5) +half(i64 ^ 1) +half(i64 ^ f32) +half(i64 ^ f64) +half(i64 ^ i32) +half(i64 ^ i64) +half(max(0.5)) +half(max(0.5, f32)) +half(max(f64)) +half(min(0.5)) +half(min(0.5, 0.5)) +half(min(1, 0.5, 1)) +half(min(f64)) +half(ok ? 0.5 : f32) +half(ok ? 0.5 : false) +half(ok ? 0.5 : foo) +half(true ? 0.5 : 0.5) +hasPrefix("bar", "foo") != ok +hasSuffix("foo", "foo") or 0.5 <= i +i +i != -0.5 +i != -1 +i != -f32 +i != -f64 +i != -i +i != -i64 +i != 0.5 / 0.5 +i != 0.5 == ok +i != 0.5 ? 1 : array +i != 0.5 ? i32 : 0.5 +i != 0.5 ? score : score +i != 1 % i64 +i != 1 * i +i != 1 + 1 +i != 1 - 0.5 +i != 1 - 1 +i != 1 - i64 +i != 1 == ok +i != 1 ? ok : i64 +i != 1 or i64 != 1 +i != f32 +i != f32 + i +i != f32 / 1 +i != f32 ? div : list +i != f64 +i != f64 * 0.5 +i != f64 + 1 +i != f64 / 0.5 +i != f64 ? 0.5 : nil +i != f64 ? array : div +i != f64 ? half : 1 +i != f64 || ok +i != first(array) +i != float(1) +i != float(f32) +i != float(f64) +i != half(0.5) +i != i +i != i != nil +i != i ^ f64 +i != i32 +i != i32 % i32 +i != i32 * f64 +i != i32 - i64 +i != i32 / i64 +i != i32 ? 1 : i +i != i32 ? list : i +i != i32 || half != nil +i != i64 +i != i64 - f32 +i != i64 ? true : "foo" +i != i64 ^ f64 +i != int(1) +i != max(i32) +i != min(1) +i != nil != true +i != nil ? ok : "bar" +i != score(i) +i % -1 +i % -i +i % -i32 +i % -i64 +i % 1 != i64 +i % 1 .. i32 +i % 1 / i +i % 1 >= i +i % 1 >= i32 +i % array[i] +i % first(array) +i % get(array, i64) +i % i +i % i % i32 +i % i + i32 +i % i == i +i % i in array +i % i32 +i % i32 / i32 +i % i32 <= f32 +i % i64 +i % i64 != i +i % int(i64) +i % len(array) +i % score(1) +i % score(i) +i * (0.5 + 0.5) +i * (f32 + f32) +i * (i32 + 0.5) +i * (i32 - f64) +i * (i64 + 1) +i * -1 +i * -f32 +i * -i +i * -i64 +i * 0.5 * f64 +i * 0.5 + i +i * 0.5 - i +i * 0.5 < i +i * 0.5 <= i64 ** f64 +i * 1 % i +i * 1 ** i32 +i * 1 / f64 +i * 1 / i64 +i * 1 <= f32 +i * abs(0.5) +i * add(1, 1) +i * array[i32] +i * f32 +i * f32 != f32 +i * f32 ** 0.5 +i * f32 >= f32 +i * f32 ^ f32 +i * f64 +i * f64 * 1 +i * float(f64) +i * half(f64) +i * i +i * i != i64 +i * i / f32 +i * i / f64 +i * i / i32 +i * i / i64 +i * i32 +i * i32 ** f64 +i * i32 ** i32 +i * i32 - i +i * i32 / i32 +i * i32 <= i32 +i * i64 +i * i64 % i32 +i * i64 * 0.5 +i * i64 + f32 +i * i64 >= i32 +i * i64 ^ i64 +i * int(f64) +i * int(i) +i * int(i64) +i * max(0.5) +i * min(i64) +i * score(1) +i ** (0.5 + f64) +i ** (0.5 + i64) +i ** (1 * 1) +i ** (1 - 0.5) +i ** (i32 % i64) +i ** (i32 - 1) +i ** -0.5 +i ** -i +i ** -i32 +i ** -i64 +i ** 0.5 ** 0.5 +i ** 0.5 ** 1 +i ** 0.5 < f32 +i ** 0.5 <= i64 ^ i32 +i ** 1 != f64 +i ** 1 ** 1 +i ** 1 ** f64 +i ** 1 ** i +i ** 1 == f32 +i ** f32 +i ** f32 ** 0.5 +i ** f32 ** f64 +i ** f32 + f64 +i ** f32 <= f32 +i ** f32 <= i32 ? 1 : f32 +i ** f32 >= float(i64) +i ** f64 +i ** f64 != f64 +i ** f64 < 1 / 0.5 +i ** float(0.5) +i ** float(f32) +i ** float(i32) +i ** half(f64) +i ** i +i ** i + f64 +i ** i <= i +i ** i ^ i +i ** i32 +i ** i32 != i +i ** i32 != i32 +i ** i32 + i32 +i ** i64 +i ** i64 ** 1 +i ** i64 ** f64 +i ** i64 ** i64 +i ** i64 - f64 +i ** i64 >= i +i ** i64 >= i32 +i ** i64 ^ 1 +i ** int(1) +i ** max(f32) +i ** min(0.5, 1) +i ** min(f32) +i ** min(i) +i ** min(i32) +i ** score(1) +i + -1 +i + -f32 +i + -f64 +i + -i +i + 0.5 != i +i + 0.5 ** i32 +i + 0.5 - i +i + 0.5 < 1 + f32 +i + 0.5 <= i32 +i + 0.5 > f32 +i + 1 / array[i32] +i + 1 / f32 +i + 1 <= f32 +i + 1 > i64 +i + 1 >= f64 +i + array[i32] +i + count(list, false) +i + f32 +i + f32 != f64 +i + f32 * i +i + f32 ** i +i + f64 +i + f64 <= i64 +i + f64 == f64 +i + float(0.5) +i + float(f32) +i + get(array, i64) +i + half(0.5) +i + half(f64) +i + i +i + i + f32 +i + i - i32 +i + i32 +i + i32 != i64 +i + i32 - 0.5 +i + i32 .. i +i + i32 > f32 +i + i64 +i + i64 + f64 +i + i64 ^ 1 +i + int(f32) +i + int(i64) +i + last(array) +i + len("bar") +i + max(0.5) +i + max(f32) +i - -1 +i - -f32 +i - -i +i - -i64 +i - 0.5 * 0.5 +i - 0.5 * 1 +i - 0.5 / 1 +i - 1 * 1 +i - 1 * i32 +i - 1 - i +i - 1 ^ 0.5 +i - 1 ^ i32 +i - abs(0.5) +i - abs(f32) +i - abs(i32) +i - f32 +i - f32 * i32 +i - f32 ** 1 +i - f32 + f64 +i - f32 - 1 +i - f32 / 0.5 +i - f32 / f32 +i - f32 / i32 +i - f32 ^ i64 +i - f64 +i - findIndex(list, ok) +i - half(0.5) +i - i +i - i * 1 +i - i < i + f64 +i - i <= i +i - i <= i32 +i - i >= f32 +i - i not in array +i - i32 +i - i32 > len(array) +i - i32 ^ 0.5 +i - i64 +i - i64 ** 1 +i - i64 + i32 +i - i64 - 1 / 1 +i - i64 - f64 +i - int(1) +i - int(f32) +i - int(i) +i - last(array) +i - max(0.5) +i - max(i64) +i - min(f32) +i - score(1) +i - score(i) +i .. -i32 +i .. 1 % i32 +i .. 1 == array +i .. abs(1) +i .. abs(i32) +i .. i +i .. i % 1 +i .. i32 +i .. i32 == array +i .. i64 +i .. i64 + i +i .. i64 == list +i .. int(i64) +i .. last(array) +i .. len(list) +i .. min(1) +i .. score(i) +i / (f32 + f64) +i / (f64 + f32) +i / (i32 + f32) +i / -0.5 +i / -1 +i / -i32 +i / -i64 +i / 0.5 * f32 +i / 0.5 * f64 +i / 0.5 ** f32 +i / 0.5 / i32 +i / 0.5 < i64 +i / 0.5 <= i64 +i / 0.5 == 0.5 - f64 +i / 0.5 >= i64 +i / 1 ** 1 +i / 1 / i64 +i / 1 == f64 +i / 1 ^ 1 +i / 1 ^ i64 +i / abs(i64) +i / f32 +i / f32 != f32 +i / f32 ** i64 +i / f32 / i +i / f64 +i / f64 * f32 +i / f64 - f32 +i / float(i32) +i / half(0.5) +i / half(f64) +i / i +i / i != i64 +i / i > i32 +i / i > i64 +i / i32 +i / i32 - i +i / i32 / i +i / i32 / i64 +i / i32 ^ f32 +i / i64 +i / i64 != i +i / i64 ** f32 +i / i64 < i % 1 +i / i64 >= i32 ? div : div +i / len("bar") +i / len(list) +i / max(1 / i) +i / min(0.5) +i / min(f64) +i / min(i32) +i / score(1) +i / score(i) +i < -(f32 - 1) +i < -1 +i < -f32 +i < -i +i < -i32 +i < 0.5 != false +i < 0.5 != ok +i < 0.5 * i +i < 0.5 + 0.5 +i < 0.5 == ok +i < 0.5 ? "bar" : "bar" +i < 0.5 ? f32 : array +i < 0.5 ? f32 : half +i < 1 * 1 +i < 1 ** f32 +i < 1 == ok +i < 1 ? false : nil +i < abs(f64) +i < f32 +i < f32 * i +i < f32 ^ f32 +i < f64 +i < f64 * f64 +i < findIndex(list, ok) +i < half(f32 ^ i64) +i < half(f64) +i < i +i < i % 1 +i < i / 1 +i < i ? i32 : add +i < i ^ 0.5 +i < i ^ i32 +i < i32 +i < i32 ** 0.5 +i < i32 - f32 +i < i32 == nil +i < i64 +i < i64 && ok +i < i64 - f64 +i < i64 - i32 +i < i64 ? nil : "foo" +i < i64 ^ 0.5 +i < int(0.5) +i < int(i64) +i < len(array) +i < len(list) +i < min(i64) +i < score(1) +i < score(i) +i <= -f32 +i <= -i +i <= -i64 +i <= 0.5 ** 0.5 +i <= 0.5 ** f32 +i <= 0.5 == nil +i <= 0.5 ? score : array +i <= 1 != all(array, true) +i <= 1 != nil +i <= 1 % i +i <= 1 + 1 +i <= 1 - f64 +i <= 1 ? ok : 1 +i <= abs(1) +i <= abs(i32) +i <= add(1, 1) +i <= f32 +i <= f32 != nil +i <= f32 * 0.5 +i <= f32 / f32 +i <= f32 ? ok : 1 +i <= f32 or ok +i <= f64 +i <= f64 * 1 +i <= f64 == nil +i <= f64 ? foo : div +i <= f64 or add == greet +i <= float(f64) +i <= float(i) +i <= float(i32) +i <= half(-1) +i <= half(0.5) +i <= i +i <= i ** 1 +i <= i == true +i <= i32 +i <= i32 - f32 +i <= i32 - i64 +i <= i64 +i <= i64 % i32 +i <= i64 / 1 +i <= i64 ? ok : 1 +i <= int(1) +i <= int(i32) +i <= len("bar") +i <= len(array) +i <= max(i) +i <= min(f32) +i <= min(f64) +i <= min(i) +i <= min(i64) +i == -0.5 +i == -1 +i == -f32 +i == -f64 +i == -i +i == -i32 +i == -i64 +i == 0.5 + f32 +i == 0.5 - i32 +i == 0.5 == ok +i == 0.5 ? false : true +i == 0.5 ? list : i32 +i == 0.5 ^ 0.5 +i == 1 != true +i == 1 % i +i == 1 * f32 +i == 1 ** 1 +i == 1 ? foo : list +i == 1 || ok +i == abs(0.5) +i == abs(1) +i == div(1, i) +i == f32 +i == f32 * i64 +i == f64 +i == f64 != nil +i == f64 + i64 +i == f64 == ok +i == i +i == i - f64 +i == i / i32 +i == i ? ok : score +i == i ^ i +i == i32 +i == i32 ** f32 +i == i32 ** i +i == i32 ? list : foo +i == i64 +i == i64 != ok +i == i64 + i32 +i == i64 ? array : 0.5 +i == i64 ? score : 1 +i == i64 ^ f64 +i == int(f64) +i == len(array) +i == max(0.5) +i == max(i64) +i == min(i) +i == nil ? false : 1 +i == score(1) +i > -i64 +i > 0.5 * f64 +i > 0.5 ** 0.5 +i > 0.5 / 0.5 +i > 0.5 / 1 +i > 0.5 == nil +i > 0.5 ^ 0.5 +i > 1 ? greet : "bar" +i > 1 ? greet : f64 +i > abs(i64) +i > array[i] +i > f32 +i > f64 +i > f64 + 0.5 +i > float(1) +i > half(f64) +i > i +i > i ** i32 +i > i ** i64 +i > i / i +i > i or ok +i > i32 +i > i32 ? 1 : true +i > i32 ? foo : score +i > i32 ^ i +i > i64 +i > int(0.5) +i > int(i) +i > int(i32) +i > max(f32) +i > max(i) +i > min(0.5) +i > score(i) +i > score(len(array)) +i >= -0.5 +i >= -1 +i >= -i32 +i >= -i64 +i >= 0.5 ** f64 +i >= 0.5 + i32 +i >= 0.5 - 1 +i >= 0.5 == nil +i >= 0.5 ? div : i +i >= 0.5 ? score : f64 +i >= 1 / i +i >= 1 ? nil : 0.5 +i >= abs(0.5) +i >= abs(i64) +i >= f32 +i >= f32 ** f64 +i >= f32 - i +i >= f32 ? "bar" : array +i >= f32 ? score : half +i >= f64 +i >= f64 * i32 +i >= f64 + i32 +i >= f64 - i +i >= i +i >= i ** 0.5 +i >= i / 1 +i >= i / i +i >= i == nil +i >= i == ok +i >= i32 +i >= i32 ** 0.5 +i >= i32 - f64 +i >= i32 ? f64 : div +i >= i64 +i >= i64 * i +i >= i64 ^ 0.5 +i >= int(i32) +i >= len("foo") +i >= min(f32 ^ i64) +i >= score(i) +i ^ (0.5 * 1) +i ^ (0.5 - 0.5) +i ^ (f32 * 1) +i ^ (f32 * f32) +i ^ (f32 * f64) +i ^ (f32 / f64) +i ^ (i * 1) +i ^ (i - i64) +i ^ (i32 % 1) +i ^ (i32 + i) +i ^ (i32 / 0.5) +i ^ (i64 / 0.5) +i ^ (i64 / 1) +i ^ --f32 +i ^ -1 +i ^ -i +i ^ -i32 +i ^ -i64 +i ^ 0.5 != 1 + i +i ^ 0.5 * f32 +i ^ 0.5 - i +i ^ 0.5 / f64 +i ^ 0.5 <= f32 +i ^ 0.5 > i64 +i ^ 0.5 ^ f32 +i ^ 1 != f32 +i ^ 1 * f32 +i ^ 1 ** i +i ^ 1 - f32 +i ^ 1 / i32 +i ^ 1 ^ i64 +i ^ abs(1) +i ^ abs(f32) +i ^ abs(i64) +i ^ add(1, 1) +i ^ array[i] +i ^ f32 +i ^ f32 != 1 - i +i ^ f32 != i64 ? list : i32 +i ^ f32 + f64 +i ^ f32 / i +i ^ f32 < i +i ^ f32 >= i32 +i ^ f64 +i ^ f64 * i +i ^ f64 >= f64 +i ^ find(array, true) +i ^ float(f64) +i ^ i +i ^ i ** f64 +i ^ i + i32 +i ^ i >= f64 +i ^ i32 +i ^ i32 - f32 +i ^ i32 == i64 * i +i ^ i32 >= f64 +i ^ i32 >= max(i64) +i ^ i64 +i ^ i64 * i64 +i ^ i64 ** i +i ^ i64 == f32 +i ^ i64 >= i64 ^ f32 +i ^ i64 ^ f64 +i ^ int(f32) +i ^ max(1) +i ^ min(i32) +i ^ score(1) +i in array +i in array == ok +i in array ? f32 : greet +i in array ? foo : false +i in array || ok +i not in array +i not in array ? foo : list +i not in array and true +i not in i64 .. 1 +i not in map(array, #) +i not in {"foo": 1}.div +i32 +i32 != -0.5 +i32 != -1 +i32 != -f32 +i32 != -i +i32 != 0.5 && nil == i64 +i32 != 1 && ok +i32 != 1 * i64 +i32 != 1 + 1 +i32 != 1 / 1 +i32 != 1 ? 0.5 : greet +i32 != 1 ? false : i64 +i32 != 1 ? greet : half +i32 != 1 ? greet : ok +i32 != abs(i64) +i32 != array[i] +i32 != count(array, ok) +i32 != f32 +i32 != f32 && ok +i32 != f32 / f64 +i32 != f32 ? f64 : i32 +i32 != f32 and ok +i32 != f64 +i32 != f64 == true +i32 != findIndex(list, false) +i32 != first(array) +i32 != float(i) +i32 != get(array, i64) +i32 != half(f64) +i32 != i +i32 != i ** 1 +i32 != i ** f64 +i32 != i32 +i32 != i32 * 1 +i32 != i32 - 0.5 +i32 != i32 ? array : add +i32 != i64 +i32 != i64 % i32 +i32 != i64 * 0.5 +i32 != i64 ? div : nil +i32 != i64 ? true : nil +i32 != int(f32) +i32 != max(1) +i32 != max(f64, 0.5) +i32 != min(1, 0.5, f64) +i32 != min(i) +i32 != nil ? half : 1 +i32 != nil ? list : half(nil) +i32 % -i +i32 % -i32 +i32 % 1 != i64 +i32 % 1 % (i64 + i64) +i32 % 1 % i64 +i32 % 1 * f64 +i32 % 1 + f64 +i32 % 1 > i +i32 % add(1, 1) +i32 % count(list, ok) +i32 % i +i32 % i != f32 +i32 % i32 +i32 % i32 != i +i32 % i32 * f32 +i32 % i32 * i +i32 % i64 +i32 % i64 != f32 +i32 % i64 / i32 +i32 % i64 == i +i32 % i64 >= i64 +i32 % min(1, i64) +i32 % min(i) +i32 * (f32 + 1) +i32 * (f32 + f32) +i32 * (f32 + i) +i32 * (f64 - f32) +i32 * (i32 - 0.5) +i32 * (i32 - f64) +i32 * (i32 - i64) +i32 * -f32 +i32 * -f64 +i32 * -i +i32 * 0.5 ** 0.5 +i32 * 0.5 + f64 +i32 * 0.5 <= f32 +i32 * 1 % i64 +i32 * 1 * f32 +i32 * 1 * i32 +i32 * 1 < i +i32 * array[i32] +i32 * count(array, true) +i32 * f32 +i32 * f32 != i +i32 * f64 +i32 * f64 * i +i32 * f64 + f32 +i32 * f64 / i +i32 * f64 > i32 +i32 * i +i32 * i != i32 +i32 * i * 0.5 +i32 * i .. i +i32 * i / array[i32] +i32 * i / i32 +i32 * i / i64 +i32 * i32 +i32 * i32 % i32 +i32 * i32 * 0.5 +i32 * i32 ** 1 +i32 * i32 - f32 +i32 * i32 == i32 +i32 * i64 +i32 * i64 % 1 +i32 * i64 .. i +i32 * i64 / 1 +i32 * i64 / i32 +i32 * int(f32) +i32 * max(f64) +i32 * max(i64) +i32 * min(1) +i32 ** (0.5 * 0.5) +i32 ** (0.5 + 0.5) +i32 ** (0.5 + i32) +i32 ** (0.5 / f64) +i32 ** (f32 / i) +i32 ** (f64 + 0.5) +i32 ** (i + 1) +i32 ** (i64 - i) +i32 ** -1 ^ i32 +i32 ** -f32 +i32 ** -i32 +i32 ** -i64 +i32 ** 0.5 / f32 +i32 ** 0.5 <= i32 +i32 ** 0.5 ^ i +i32 ** 1 ** i64 +i32 ** 1 + f64 +i32 ** 1 + i64 +i32 ** 1 - f32 +i32 ** 1 >= i64 * 0.5 +i32 ** 1 ^ f64 +i32 ** array[i] +i32 ** f32 +i32 ** f32 ** i +i32 ** f32 == i64 +i32 ** f64 +i32 ** f64 != i64 ? i : half +i32 ** f64 + f64 +i32 ** f64 >= i +i32 ** f64 ^ f32 +i32 ** float(1) +i32 ** float(f64) +i32 ** half(0.5) +i32 ** i +i32 ** i ** 0.5 +i32 ** i ^ 0.5 +i32 ** i32 +i32 ** i64 +i32 ** i64 != 0.5 == true +i32 ** i64 - f64 +i32 ** i64 / f64 +i32 ** i64 / i +i32 ** i64 > i +i32 ** i64 ^ 1 +i32 ** i64 ^ i +i32 ** int(0.5) +i32 ** int(f64) +i32 ** len(array) +i32 ** min(f64) +i32 ** min(i32) +i32 ** score(1) +i32 ** score(i) +i32 + -0.5 +i32 + -1 +i32 + -f32 +i32 + -f64 +i32 + -i +i32 + -i32 +i32 + 0.5 * 0.5 +i32 + 0.5 * i32 +i32 + 0.5 + 1 +i32 + 0.5 + i64 +i32 + 0.5 - 0.5 +i32 + 0.5 - f32 +i32 + 0.5 <= i +i32 + 0.5 > i % 1 +i32 + 0.5 >= i +i32 + 1 / f64 +i32 + 1 < i32 +i32 + 1 ^ i +i32 + 1 ^ i32 +i32 + abs(i32) +i32 + count(array, false) +i32 + f32 +i32 + f64 +i32 + f64 * 1 +i32 + f64 * f64 +i32 + f64 ** 0.5 +i32 + f64 - f32 * 0.5 +i32 + f64 == i32 +i32 + f64 >= i +i32 + f64 ^ i32 +i32 + find(array, ok) +i32 + i +i32 + i * 1 +i32 + i - f32 +i32 + i > half(f64) +i32 + i >= -1 +i32 + i32 +i32 + i32 ** 0.5 +i32 + i32 >= f32 +i32 + i32 ^ i64 +i32 + i64 +i32 + i64 + i64 +i32 + i64 / f64 +i32 + i64 <= f32 +i32 + i64 ^ f32 +i32 + i64 not in array +i32 + int(f64) +i32 + last(array) +i32 + len("foo") +i32 + len(list) +i32 + min(0.5, i32) +i32 + min(1, i) +i32 + min(i) +i32 + min(i, i32) +i32 + score(i) +i32 - -0.5 +i32 - -1 +i32 - -f32 +i32 - -i32 +i32 - -i64 +i32 - 0.5 * 0.5 +i32 - 0.5 * i64 +i32 - 0.5 + i +i32 - 0.5 + i32 +i32 - 0.5 - f32 +i32 - 0.5 < i32 +i32 - 0.5 <= f64 +i32 - 1 != f32 +i32 - 1 * f32 +i32 - 1 ** i32 +i32 - 1 / 0.5 +i32 - 1 <= i64 +i32 - 1 not in array +i32 - array[1] +i32 - f32 +i32 - f32 * f32 +i32 - f32 ** f64 +i32 - f32 + 0.5 +i32 - f32 / f64 +i32 - f64 +i32 - f64 ** f64 +i32 - f64 + 0.5 +i32 - f64 - i64 +i32 - f64 / i64 +i32 - f64 < i64 +i32 - first(array) +i32 - float(i) +i32 - get(array, i64) +i32 - i +i32 - i % i +i32 - i + f32 +i32 - i - 1 +i32 - i / i +i32 - i <= i64 +i32 - i == i +i32 - i > f64 +i32 - i >= f64 +i32 - i32 +i32 - i32 ** 0.5 +i32 - i32 <= i32 + i64 +i32 - i32 ^ 1 +i32 - i64 +i32 - i64 % i +i32 - i64 % i64 +i32 - i64 .. i +i32 - i64 <= i +i32 - i64 ^ 0.5 +i32 - i64 ^ f64 +i32 - int(1) +i32 - int(f64) +i32 - max(i64) +i32 - max(i64, i) +i32 - min(0.5) +i32 - score(i) +i32 .. -1 +i32 .. -i +i32 .. -i32 +i32 .. -i64 +i32 .. 1 - 1 +i32 .. abs(i) +i32 .. array[i32] +i32 .. count(array, ok) +i32 .. i +i32 .. i - 1 +i32 .. i32 +i32 .. i32 != list +i32 .. i64 +i32 .. i64 - i32 +i32 .. int(0.5) +i32 .. len(list) +i32 .. min(1) +i32 .. min(1, 0.5) +i32 .. min(i32) +i32 .. min(i64) +i32 .. score(i) +i32 / (0.5 + i32) +i32 / (1 + f32) +i32 / (1 - f32) +i32 / (1 - i) +i32 / (f32 + i) +i32 / (f32 - f64) +i32 / (f64 + 0.5) +i32 / (f64 - 1) +i32 / (i32 - 1) +i32 / -0.5 +i32 / -1 +i32 / -f32 +i32 / -i +i32 / -i32 +i32 / 0.5 * i +i32 / 0.5 / i64 +i32 / 0.5 >= f64 +i32 / 1 != f64 +i32 / 1 < i32 +i32 / abs(0.5) +i32 / f32 +i32 / f64 +i32 / f64 * i32 +i32 / f64 >= f32 +i32 / half(f64) +i32 / i +i32 / i <= i +i32 / i32 +i32 / i32 * 1 +i32 / i32 / f32 / f64 +i32 / i32 / i64 +i32 / i64 +i32 / i64 != i64 +i32 / i64 * i +i32 / i64 / i +i32 / i64 == f32 +i32 / i64 == f64 +i32 / int(i) +i32 / len("bar") +i32 / len("foo") +i32 / max(i32) +i32 / min(f32) +i32 / min(f64) +i32 / min(i) +i32 / min(i32) +i32 < -(i - f32) +i32 < -0.5 +i32 < -f32 +i32 < -i32 +i32 < 0.5 ** i32 +i32 < 0.5 - f32 +i32 < 0.5 ^ 1 +i32 < 1 % 1 +i32 < 1 ** 1 +i32 < 1 + 0.5 +i32 < 1 + 1 +i32 < 1 ? "foo" : i32 +i32 < 1 ? 1 : 0.5 +i32 < 1 ^ i32 +i32 < abs(i64) +i32 < div(1, 1) +i32 < f32 +i32 < f32 == nil +i32 < f32 ? div : true +i32 < f32 || i64 != f32 +i32 < f64 +i32 < f64 != nil +i32 < f64 != true +i32 < f64 * f32 +i32 < f64 == nil +i32 < f64 ? f32 : half +i32 < f64 ? greet : false +i32 < f64 ? list : i32 +i32 < f64 ^ f32 +i32 < f64 || 1 < 1 +i32 < float(i) +i32 < float(i32) +i32 < half(0.5) +i32 < i +i32 < i != true +i32 < i ^ 0.5 +i32 < i32 +i32 < i32 != ok +i32 < i32 * f32 +i32 < i32 / i32 +i32 < i32 ? ok : 1 +i32 < i64 +i32 < i64 - 0.5 +i32 < i64 ^ f64 +i32 < int(0.5) +i32 < int(i32) +i32 < int(i64) +i32 < max(0.5) +i32 < max(1) +i32 < min(1, i32) +i32 < min(f64) +i32 < min(i) +i32 < min(i64) +i32 < score(1) +i32 <= -0.5 +i32 <= -f32 +i32 <= -i +i32 <= -i32 +i32 <= 0.5 != nil +i32 <= 0.5 != ok +i32 <= 0.5 * 0.5 +i32 <= 0.5 * i +i32 <= 0.5 + i64 +i32 <= 1 ? i : f32 +i32 <= 1 ? true : true +i32 <= 1 or 0.5 == 0.5 +i32 <= abs(i32) +i32 <= count(list, ok) +i32 <= f32 +i32 <= f32 * i64 +i32 <= f32 / 0.5 +i32 <= f32 ^ i64 +i32 <= f64 +i32 <= f64 * i +i32 <= f64 ^ 1 +i32 <= float(i) +i32 <= half(0.5) +i32 <= i +i32 <= i % i64 +i32 <= i32 +i32 <= i32 != nil +i32 <= i32 % 1 +i32 <= i32 ** f64 +i32 <= i64 +i32 <= i64 != false +i32 <= i64 != ok +i32 <= i64 + f32 +i32 <= i64 ? div : nil +i32 <= last(array) +i32 <= len(array) +i32 <= len(list) +i32 <= max(f64) +i32 <= min(i) +i32 <= score(1) +i32 <= score(i) +i32 == -0.5 +i32 == -1 +i32 == -f64 +i32 == -i +i32 == -i64 +i32 == 0.5 / f64 +i32 == 0.5 ? half : array +i32 == 0.5 ^ i +i32 == 0.5 ^ i64 +i32 == 1 ** 1 +i32 == 1 ** i +i32 == 1 || f32 < f64 +i32 == f32 +i32 == f32 ? f32 : nil +i32 == f32 ? half : "bar" +i32 == f32 ? score : false +i32 == f32 or ok +i32 == f64 +i32 == f64 != ok +i32 == f64 * 0.5 +i32 == f64 ** f32 +i32 == f64 ** i64 +i32 == f64 ? add : half +i32 == findLastIndex(array, ok) +i32 == float(i) +i32 == half(0.5) +i32 == i +i32 == i % i64 +i32 == i ? "foo" : greet +i32 == i ? type(false) : array +i32 == i ^ f64 +i32 == i and ok +i32 == i || ok +i32 == i32 +i32 == i32 ? add : add +i32 == i32 ? f32 : f64 +i32 == i32 ^ 1 +i32 == i64 +i32 == i64 + f32 +i32 == i64 ? foo : list +i32 == len(list) +i32 == max(0.5) +i32 == min(f32) +i32 == min(i32) +i32 == nil ? f32 : add +i32 == nil and ok +i32 == {"foo": f32, "foo": list}?.String?.Qux +i32 > -0.5 +i32 > -1 +i32 > -f32 +i32 > -f64 +i32 > -i +i32 > -i32 +i32 > -i64 +i32 > 0.5 != ok +i32 > 0.5 != true +i32 > 0.5 * f64 +i32 > 0.5 ** f32 +i32 > 0.5 ** i +i32 > 0.5 + 0.5 +i32 > 0.5 + 1 +i32 > 0.5 - 1 +i32 > 0.5 / i64 +i32 > 0.5 == nil +i32 > 0.5 ? greet : f32 +i32 > 0.5 ? ok : false +i32 > 0.5 ^ f32 +i32 > 1 ** f64 +i32 > 1 - i +i32 > 1 / 1 +i32 > 1 ? i : add +i32 > 1 || ok +i32 > abs(1) +i32 > abs(f64) +i32 > array[1] +i32 > array[i32] +i32 > f32 +i32 > f32 != ok +i32 > f32 && "bar" == nil +i32 > f32 * i64 +i32 > f32 ? "bar" : half +i32 > f64 +i32 > f64 * 0.5 +i32 > f64 - 1 +i32 > f64 / 1 +i32 > f64 / i32 +i32 > f64 == nil +i32 > f64 == ok +i32 > f64 == true +i32 > f64 ? 0.5 : add +i32 > f64 ^ i64 +i32 > float(i) +i32 > float(i32) +i32 > half(0.5) +i32 > half(f64) +i32 > i +i32 > i + f32 +i32 > i / f32 +i32 > i ^ i32 +i32 > i32 +i32 > i32 - 0.5 +i32 > i32 ? "bar" : div +i32 > i32 ? array : 0.5 +i32 > i32 ? foo : 1 +i32 > i64 +i32 > i64 ** f32 +i32 > i64 + f64 +i32 > i64 - i +i32 > i64 ? list : list +i32 > int(i) +i32 > int(i64) +i32 > max(i) +i32 > min(0.5) +i32 > score(1) +i32 >= -0.5 +i32 >= -1 +i32 >= -i +i32 >= 0.5 ** 0.5 +i32 >= 0.5 ^ f32 +i32 >= 0.5 || ok +i32 >= 1 && ok +i32 >= abs(i) +i32 >= abs(i64) +i32 >= array[i] +i32 >= f32 +i32 >= f32 != true +i32 >= f32 - 0.5 +i32 >= f32 ^ 0.5 +i32 >= f64 +i32 >= f64 && nil == 0.5 +i32 >= f64 - f64 +i32 >= f64 / 1 +i32 >= f64 ? f32 : list +i32 >= f64 ^ 1 +i32 >= float(1) +i32 >= half(0.5) +i32 >= half(f64) +i32 >= i +i32 >= i % i64 +i32 >= i ** i32 +i32 >= i / i +i32 >= i ? div : list +i32 >= i ? foo : 0.5 +i32 >= i32 +i32 >= i64 +i32 >= i64 != ok +i32 >= i64 ** i64 +i32 >= i64 / i64 +i32 >= i64 ? list : greet +i32 >= i64 ^ i32 +i32 >= int(i64) +i32 >= last(array) +i32 >= len(array) +i32 >= min(i32) +i32 >= score(1) +i32 >= score(i) +i32 ^ (f32 + i64) +i32 ^ (f64 + 0.5) +i32 ^ (i - f64) +i32 ^ (i32 + f32) +i32 ^ (i64 % i) +i32 ^ (i64 * 0.5) +i32 ^ (i64 + f32) +i32 ^ (i64 - f64) +i32 ^ --0.5 +i32 ^ -0.5 +i32 ^ -f64 +i32 ^ -i32 +i32 ^ 0.5 ** i +i32 ^ 0.5 + i32 +i32 ^ 0.5 - i +i32 ^ 0.5 < i +i32 ^ 0.5 == i64 +i32 ^ abs(1) +i32 ^ f32 +i32 ^ f32 * i64 +i32 ^ f32 ** 0.5 +i32 ^ f32 ** i +i32 ^ f32 < 0.5 * i +i32 ^ f32 ^ i +i32 ^ f64 +i32 ^ f64 ^ 1 +i32 ^ float(f32) +i32 ^ half(0.5) +i32 ^ half(f64) +i32 ^ i +i32 ^ i + i32 +i32 ^ i - f32 +i32 ^ i <= f32 +i32 ^ i ^ 1 +i32 ^ i32 +i32 ^ i32 ** f32 +i32 ^ i32 ** f64 +i32 ^ i32 + i32 +i32 ^ i32 + i64 +i32 ^ i32 <= i64 +i32 ^ i64 +i32 ^ i64 - f32 +i32 ^ max(0.5) +i32 ^ max(1) +i32 ^ max(i) +i32 ^ min(f32) +i32 ^ score(1) +i32 in array +i32 in map(array, #) +i32 not in array +i32 not in array ? score : score +i32 not in map(array, #) +i32 not in map(array, 1) +i64 +i64 != -0.5 +i64 != -1 +i64 != -f32 +i64 != -f64 +i64 != -i +i64 != 0.5 != nil +i64 != 0.5 != ok +i64 != 0.5 != true +i64 != 0.5 * 1 +i64 != 0.5 ? false : i64 +i64 != 0.5 ^ 1 +i64 != 0.5 and f64 == 1 +i64 != 1 || f64 < i +i64 != 1 || ok +i64 != abs(f64) +i64 != f32 +i64 != f32 + f32 +i64 != f32 / f32 +i64 != f32 ? div : 1 +i64 != f32 ? f64 : i64 +i64 != f32 ^ i +i64 != f64 +i64 != f64 != false +i64 != f64 - i32 +i64 != f64 / i32 +i64 != f64 / i64 +i64 != f64 ? 0.5 : score +i64 != f64 ? i64 : true +i64 != findLast(array, false) +i64 != first(array) +i64 != float(i32) +i64 != get(array, i64) +i64 != half(0.5) +i64 != half(f64) +i64 != i +i64 != i == nil +i64 != i ? array : f32 +i64 != i and ok +i64 != i32 +i64 != i32 ? 1 : f32 +i64 != i64 +i64 != i64 ? true : score +i64 != last(array) +i64 != len("foo") +i64 != min(0.5) +i64 != min(f32) +i64 != min(f64) +i64 != min(i64) +i64 != nil && ok +i64 != score(1) +i64 % -1 +i64 % -i +i64 % -i32 +i64 % 1 * i32 +i64 % 1 .. i +i64 % 1 / 0.5 +i64 % 1 / f64 +i64 % 1 < i32 +i64 % 1 <= -i32 +i64 % 1 == 0.5 + 0.5 +i64 % 1 not in array +i64 % abs(i64) +i64 % array[1] +i64 % find(array, true) +i64 % first(array) +i64 % i +i64 % i .. i32 +i64 % i not in array +i64 % i32 +i64 % i32 != f64 +i64 % i32 * f32 +i64 % i32 == i +i64 % i32 > f64 ^ i32 +i64 % i64 +i64 % i64 * 1 +i64 % i64 * f32 +i64 % i64 + -i64 +i64 % max(i32) +i64 % min(i) +i64 % score(1) +i64 * (0.5 + i64) +i64 * (0.5 - 1) +i64 * (1 + 1) +i64 * (f64 + f32) +i64 * (f64 - i) +i64 * (i - 1) +i64 * (i64 + 0.5) +i64 * --f64 +i64 * -0.5 +i64 * -1 +i64 * -f32 +i64 * -f64 +i64 * 0.5 != f64 +i64 * 0.5 * i32 +i64 * 0.5 - f32 +i64 * 0.5 < f32 +i64 * 0.5 == min(i64) +i64 * 0.5 >= f32 +i64 * 0.5 ^ i +i64 * 1 * 1 +i64 * 1 .. i32 +i64 * 1 <= i64 +i64 * 1 == i32 +i64 * 1 >= i32 +i64 * array[i32] +i64 * f32 +i64 * f32 - f32 +i64 * f32 / f64 +i64 * f32 >= i64 +i64 * f32 ^ i +i64 * f32 ^ i32 +i64 * f64 +i64 * f64 * i32 +i64 * f64 ^ f64 +i64 * float(i64) +i64 * get(array, i64) +i64 * half(f64) +i64 * i +i64 * i * i64 +i64 * i == i32 +i64 * i ^ i64 +i64 * i32 +i64 * i32 ** f32 +i64 * i32 >= f64 +i64 * i32 >= i64 +i64 * i32 ^ 1 +i64 * i64 +i64 * i64 ** 1 +i64 * i64 ** f32 +i64 * i64 - f64 +i64 * i64 in array +i64 * int(1) +i64 * min(f32, 0.5) +i64 * score(1) +i64 ** (0.5 * i64) +i64 ** (0.5 + 1) +i64 ** (1 % i) +i64 ** (f64 / i) +i64 ** (i * 0.5) +i64 ** (i - i) +i64 ** (i32 + i) +i64 ** -1 +i64 ** -i +i64 ** -i32 +i64 ** 0.5 * f64 +i64 ** 0.5 + f32 +i64 ** 0.5 + f32 - 1 +i64 ** 0.5 - i +i64 ** 0.5 ^ 1 +i64 ** 0.5 ^ f32 +i64 ** 1 != i +i64 ** 1 ** f32 +i64 ** 1 ** float(1) +i64 ** 1 / f64 +i64 ** 1 / i +i64 ** 1 == i64 +i64 ** 1 ^ i64 +i64 ** abs(f32) +i64 ** abs(i64) +i64 ** f32 +i64 ** f32 != f64 +i64 ** f32 != i64 +i64 ** f32 ** i32 +i64 ** f32 / i64 / 1 +i64 ** f32 <= i64 +i64 ** f32 > f32 +i64 ** f64 +i64 ** f64 / i +i64 ** f64 <= f32 +i64 ** f64 > f64 +i64 ** f64 >= f64 +i64 ** f64 >= i32 +i64 ** float(1) +i64 ** half(0.5) +i64 ** i +i64 ** i32 +i64 ** i32 != f32 +i64 ** i32 <= f64 +i64 ** i32 <= min(0.5) +i64 ** i64 +i64 ** i64 / f64 +i64 ** i64 >= f64 +i64 ** int(0.5) +i64 ** int(f64) +i64 ** len("foo") +i64 ** min(0.5) +i64 ** score(1) +i64 + -(f32 / i) +i64 + -0.5 +i64 + -f32 +i64 + -f64 +i64 + -i +i64 + -i64 +i64 + 0.5 * i +i64 + 0.5 ** 1 +i64 + 0.5 + 1 +i64 + 0.5 + i32 +i64 + 1 % i +i64 + 1 ** i +i64 + 1 + i32 +i64 + 1 - f64 +i64 + 1 - i32 +i64 + 1 .. i +i64 + 1 < i32 +i64 + 1 < i64 +i64 + 1 <= i +i64 + 1 == i +i64 + abs(1) +i64 + f32 +i64 + f32 ** 1 +i64 + f32 >= f64 +i64 + f64 +i64 + f64 != f32 +i64 + f64 + i +i64 + f64 <= f32 +i64 + f64 == i32 +i64 + findIndex(list, ok) +i64 + first(array) +i64 + get(array, i32) +i64 + half(0.5) +i64 + half(f64) +i64 + i +i64 + i + i +i64 + i - f64 +i64 + i / 1 +i64 + i32 +i64 + i32 * 1 +i64 + i32 * i +i64 + i32 < f64 +i64 + i32 >= f32 +i64 + i32 in array +i64 + i64 +i64 + i64 % i64 +i64 + i64 ** f32 +i64 + i64 + 0.5 +i64 + i64 - int(f64) +i64 + i64 ^ i +i64 + max(f32) +i64 + min(0.5) +i64 + min(1) +i64 + min(f32) +i64 + min(i32) +i64 + score(i) +i64 - -1 +i64 - -f32 +i64 - -i32 +i64 - -i64 +i64 - 0.5 != i32 +i64 - 0.5 * 1 +i64 - 0.5 + f32 +i64 - 0.5 + f64 +i64 - 0.5 / f64 +i64 - 0.5 == -0.5 +i64 - 0.5 ^ i32 +i64 - 1 - 0.5 +i64 - 1 - f32 +i64 - 1 - i32 +i64 - 1 == i32 +i64 - 1 >= f64 +i64 - 1 >= i +i64 - abs(1) +i64 - abs(i32) +i64 - array[i64] +i64 - f32 +i64 - f32 != score(i) +i64 - f32 * i32 +i64 - f32 - 1 +i64 - f32 <= f64 +i64 - f32 ^ f32 +i64 - f64 +i64 - f64 ** 0.5 +i64 - float(0.5) +i64 - float(f32) +i64 - float(i) +i64 - i +i64 - i != i32 +i64 - i * i64 +i64 - i + i32 +i64 - i - i64 +i64 - i > f64 - 0.5 +i64 - i >= i +i64 - i ^ i64 +i64 - i32 +i64 - i32 % i32 +i64 - i32 + i32 +i64 - i32 <= i +i64 - i64 +i64 - i64 + i32 +i64 - i64 .. i64 +i64 - i64 / i32 +i64 - max(f64) +i64 - min(1, 0.5) +i64 - score(1) +i64 .. -1 +i64 .. -i64 +i64 .. 1 == list +i64 .. findIndex(list, ok) +i64 .. get(array, 1) +i64 .. i +i64 .. i32 +i64 .. i32 * i +i64 .. i64 +i64 .. i64 + 1 +i64 .. int(f32) +i64 .. int(i32) +i64 .. last(array) +i64 .. len(list) +i64 .. score(1) +i64 / (0.5 + f64) +i64 / (1 - 0.5) +i64 / (i32 - 1) +i64 / -0.5 +i64 / -1 +i64 / -f32 +i64 / -f64 +i64 / -i +i64 / -i64 +i64 / 0.5 < f64 +i64 / 0.5 == f32 +i64 / 0.5 ^ f64 +i64 / 1 ** 1 +i64 / 1 - f32 +i64 / 1 - min(0.5) +i64 / 1 / 0.5 +i64 / abs(i64) +i64 / array[i] +i64 / f32 +i64 / f32 ** i +i64 / f32 <= i +i64 / f64 +i64 / f64 * 1 +i64 / f64 ** 0.5 +i64 / f64 ** f64 +i64 / f64 + i32 +i64 / f64 <= f32 +i64 / f64 <= i64 +i64 / float(f32) +i64 / float(f64) +i64 / float(i) +i64 / float(i64) +i64 / half(0.5) +i64 / half(f64) +i64 / i +i64 / i != i64 +i64 / i * 0.5 +i64 / i * f32 +i64 / i - i32 +i64 / i ^ i64 +i64 / i32 +i64 / i32 * i +i64 / i64 +i64 / i64 ** f32 +i64 / i64 - f64 +i64 / i64 / i64 +i64 / i64 < f32 +i64 / int(0.5) +i64 / min(f32) +i64 / score(1) +i64 < -1 +i64 < -i32 +i64 < -i64 +i64 < 1 != true +i64 < 1 * f64 +i64 < 1 + i64 +i64 < 1 / i32 +i64 < 1 ? half : ok +i64 < 1 ^ f64 +i64 < abs(f32) +i64 < array[1] +i64 < f32 +i64 < f32 * i32 +i64 < f32 ? "bar" : ok +i64 < f32 ^ 0.5 +i64 < f64 +i64 < f64 + f64 +i64 < f64 - f32 +i64 < f64 - i +i64 < f64 ? i64 : score +i64 < f64 or ok +i64 < float(f64) +i64 < half(0.5) +i64 < i +i64 < i != false +i64 < i32 +i64 < i32 * 1 +i64 < i32 + i64 +i64 < i32 - 0.5 +i64 < i32 - f32 +i64 < i32 ? greet : 1 +i64 < i32 ? nil : array +i64 < i32 ? true : "bar" +i64 < i64 +i64 < i64 + 1 +i64 < i64 ? f32 : foo +i64 < i64 ? half : i +i64 < int(i64) +i64 < max(0.5) +i64 < min(0.5) +i64 < min(i) +i64 < score(1) +i64 < score(1) * i64 +i64 <= -1 +i64 <= -f32 +i64 <= -i +i64 <= -i32 +i64 <= -i64 +i64 <= 0.5 != true +i64 <= 0.5 + i +i64 <= 0.5 - 1 +i64 <= 0.5 == nil +i64 <= 0.5 ? 0.5 : "foo" +i64 <= 1 != true +i64 <= 1 ** f64 +i64 <= 1 == ok +i64 <= 1 ? array : ok +i64 <= 1 and ok +i64 <= array[i32] +i64 <= f32 +i64 <= f32 && ok +i64 <= f32 + 1 +i64 <= f32 / f32 +i64 <= f32 ^ i32 +i64 <= f64 +i64 <= f64 + 1 +i64 <= f64 - f32 +i64 <= half(0.5) +i64 <= i +i64 <= i != true +i64 <= i * 1 +i64 <= i + 1 +i64 <= i / i64 +i64 <= i ? i32 : list +i64 <= i ^ 0.5 +i64 <= i32 +i64 <= i32 && ok +i64 <= i32 ? f64 : i < 1 +i64 <= i64 +i64 <= i64 - 0.5 +i64 <= i64 ? greet : div +i64 <= int(i64) +i64 <= last(array) +i64 <= min(0.5) +i64 <= min(f64) +i64 <= score(1) +i64 <= score(i) +i64 == -0.5 +i64 == -1 +i64 == -f64 +i64 == -i +i64 == 0.5 == ok +i64 == 0.5 ? 1 : list +i64 == 0.5 ? div : i64 +i64 == 0.5 ? foo : f32 +i64 == 0.5 ^ 0.5 +i64 == 0.5 ^ i +i64 == 1 % i64 +i64 == 1 && ok +i64 == 1 ** f64 +i64 == 1 + f32 +i64 == 1 - f64 +i64 == abs(0.5) +i64 == abs(i32) +i64 == count(array, true) +i64 == count(list, true) +i64 == f32 +i64 == f64 +i64 == f64 != ok +i64 == f64 != true +i64 == f64 - i +i64 == f64 ? f64 : add +i64 == findIndex(array, false) +i64 == i +i64 == i * f32 +i64 == i == false +i64 == i == ok +i64 == i ^ 1 +i64 == i32 +i64 == i32 ** 0.5 +i64 == i32 / f64 +i64 == i64 +i64 == i64 ^ 0.5 +i64 == int(1) +i64 == int(f32) +i64 == last(array) +i64 == max(0.5) +i64 == nil ? true : ok +i64 == score(1) +i64 == score(i) +i64 > -0.5 +i64 > -1 +i64 > -f32 +i64 > -f64 +i64 > -i +i64 > -i32 +i64 > -i64 +i64 > 0.5 * 1 +i64 > 0.5 ** 0.5 +i64 > 0.5 == true +i64 > 0.5 ? f64 : greet +i64 > 0.5 ? foo : add +i64 > 1 ** 0.5 +i64 > 1 - 0.5 +i64 > 1 ? false : array +i64 > 1 ? half : i64 +i64 > abs(1) +i64 > abs(f64) +i64 > array[i64] +i64 > f32 +i64 > f32 - 1 +i64 > f32 ? div : false +i64 > f64 +i64 > f64 == nil +i64 > f64 and 1 > i64 +i64 > first(array) +i64 > float(f32) +i64 > half(f64) +i64 > i +i64 > i % i32 +i64 > i * f64 +i64 > i ** 1 +i64 > i + i +i64 > i + i32 +i64 > i ^ i32 +i64 > i32 +i64 > i32 && ok +i64 > i32 ** 0.5 +i64 > i32 ** i +i64 > i64 +i64 > i64 % i32 +i64 > i64 - i64 +i64 > int(f32) +i64 > int(i32) +i64 > int(i64) +i64 > score(i) +i64 >= -0.5 +i64 >= -1 +i64 >= -f64 +i64 >= -i +i64 >= 0.5 * f64 +i64 >= 0.5 ** f32 +i64 >= 0.5 + f32 +i64 >= 0.5 == nil +i64 >= 0.5 == true +i64 >= 0.5 ? array : array +i64 >= 0.5 ? i32 : nil +i64 >= 0.5 ^ 0.5 +i64 >= 0.5 and f32 != nil +i64 >= 1 + f64 +i64 >= 1 + i32 +i64 >= 1 ? i : false +i64 >= 1 ? i : string(array) +i64 >= 1 ? true : i +i64 >= f32 +i64 >= f32 * f32 +i64 >= f32 ** f64 +i64 >= f32 ** i32 +i64 >= f32 / f64 +i64 >= f64 +i64 >= f64 + i +i64 >= f64 / i64 +i64 >= f64 == ok +i64 >= f64 and ok +i64 >= find(array, ok) +i64 >= float(f32) +i64 >= float(i) +i64 >= float(i32) +i64 >= half(0.5) +i64 >= i +i64 >= i and ok +i64 >= i32 +i64 >= i32 % i64 +i64 >= i64 +i64 >= i64 % i +i64 >= i64 && i64 > f32 +i64 >= i64 / i32 +i64 >= i64 == nil +i64 >= i64 in {"foo": f64}.half +i64 >= max(f64) +i64 >= max(i64) +i64 >= min(f32) +i64 >= score(1) +i64 ^ (0.5 + 1) +i64 ^ (0.5 / i32) +i64 ^ (1 * f32) +i64 ^ (1 / i) +i64 ^ (1 / i64) +i64 ^ (f32 + f32) +i64 ^ (f32 - f32) +i64 ^ (f64 * f32) +i64 ^ (i % i32) +i64 ^ (i - 0.5) +i64 ^ (i32 - f32) +i64 ^ (i64 + i32) +i64 ^ (i64 / f64) +i64 ^ -0.5 +i64 ^ -i32 +i64 ^ 0.5 ** f32 +i64 ^ 0.5 <= i +i64 ^ 0.5 >= f32 +i64 ^ 0.5 >= f64 +i64 ^ 0.5 >= i64 +i64 ^ 0.5 ^ 0.5 +i64 ^ 1 != i +i64 ^ 1 != i32 +i64 ^ 1 ** i32 +i64 ^ 1 + f32 +i64 ^ 1 < f32 +i64 ^ 1 <= i +i64 ^ abs(1) +i64 ^ abs(i) +i64 ^ array[i64] +i64 ^ f32 +i64 ^ f32 - f32 +i64 ^ f64 +i64 ^ f64 * i32 +i64 ^ f64 ** i +i64 ^ f64 + f32 +i64 ^ f64 < f32 +i64 ^ f64 == i64 +i64 ^ f64 > 1 + i64 +i64 ^ f64 ^ f32 +i64 ^ get(array, i) +i64 ^ half(f64) +i64 ^ i +i64 ^ i ** f32 +i64 ^ i ** i64 +i64 ^ i32 +i64 ^ i32 != f32 +i64 ^ i32 != i32 +i64 ^ i32 ** i +i64 ^ i32 + f32 +i64 ^ i32 + f64 +i64 ^ i32 / f32 +i64 ^ i64 +i64 ^ i64 * f64 +i64 ^ i64 * i64 +i64 ^ i64 ** f64 +i64 ^ i64 ^ f32 +i64 ^ i64 ^ f64 +i64 ^ i64 ^ i +i64 ^ int(i64) +i64 ^ last(array) +i64 ^ len(array) +i64 ^ max(0.5) +i64 ^ max(1) +i64 ^ max(f32) +i64 ^ score(1) +i64 ^ score(1, 1) +i64 ^ score(i) +i64 in array +i64 in array == nil +i64 in array ? false : greet +i64 in map(array, #) +i64 not in array +indexOf("bar", "bar") + i64 +indexOf(foo.Bar, string(i32)) +int(-(i * 0.5)) int(-0.5) int(-1) -int(-a) -int(-b) -int(-f) -int(0 % 1) -int(0 % a) -int(0 * 0) -int(0 * 0.5) -int(0 * f) -int(0 ** 0.5) -int(0 + 0) -int(0 + a) -int(0 + b) -int(0 + f) -int(0 - 0) -int(0 - a) -int(0 - b) -int(0 - f) -int(0 / a) -int(0 / f) -int(0 ^ a) -int(0) != -f -int(0) != a ? nil : a -int(0) != obj.obj -int(0) ** obj.b -int(0) + get(arr, 0) -int(0) .. b -int(0) / f -int(0) < min(1) -int(0) <= obj.b -int(0) > obj.head(b) -int(0) ^ f -int(0.5 * a) -int(0.5 * f) -int(0.5 ** 2) -int(0.5 ** a) -int(0.5 + f) -int(0.5 - f) +int(-abs(f64)) +int(-f32) +int(-f64) +int(-i) +int(-i32) +int(-i32) != i +int(-i64) +int(0.5 * 0.5) +int(0.5 * 1) +int(0.5 * f32) +int(0.5 * i) +int(0.5 * i32) +int(0.5 * i64) +int(0.5 ** 0.5) +int(0.5 ** 1) +int(0.5 ** f32) +int(0.5 ** f64) +int(0.5 ** i64) +int(0.5 + f32) +int(0.5 + f64) +int(0.5 + i) +int(0.5 + i32) +int(0.5 - 0.5) +int(0.5 - f32) +int(0.5 - i32) int(0.5 / 0.5) -int(0.5 / a) -int(0.5 / b) -int(0.5 / f) -int(0.5 ^ 0) +int(0.5 / 1) +int(0.5 / f32) +int(0.5 / f64) +int(0.5 / i32) +int(0.5 / i64) int(0.5 ^ 0.5) -int(0.5) != f ? 0.5 : arr -int(0.5) < b -int(0.5) > f -int(1 % 1 % b) -int(1 * f) -int(1 ** 0) -int(1 ** a) -int(1 ** b) -int(1 / b) -int(1) != a -int(1) * a -int(1) ** a -int(1) / 0 ^ f -int(1) <= b -int(2 % b) -int(2 ** 1) -int(2 ** f) -int(2 + 0) -int(2 - b) -int(2 / a) -int(2) != a -int(2) ** a -int(2) + int(b) -int(2) .. b -int(2) <= a * f -int(2) > b -int(a % 2) -int(a % b) -int(a * 0) -int(a * 0.5) -int(a * f) -int(a ** 0) -int(a ** b) -int(a ** f) -int(a + a) -int(a + b) -int(a - 0.5) -int(a - a) -int(a / 0) -int(a / a) -int(a / b) -int(a / f) -int(a ^ 0) -int(a ^ 0.5) -int(a ^ b) -int(a) -int(a) != b -int(a) != f != true -int(a) * a -int(a) * f -int(a) ** a -int(a) + -f -int(a) + a -int(a) - b -int(a) - f -int(a) / a -int(a) / obj.a -int(a) < obj.head(obj).a -int(a) <= b -int(a) == b -int(a) >= a -int(a) >= obj.fn(a) -int(a) ^ b -int(abs(a)) -int(abs(b)) -int(abs(f)) -int(add(0, 0)) -int(add(0, 2)) -int(add(a, 0)) -int(add(a, 2)) -int(add(a, a)) -int(add(a, b)) -int(add(add(0, b), b)) -int(add(add(b, a), b)) -int(add(b, 0)) -int(add(b, b)) -int(arr[0]) -int(arr[a]) -int(arr[b]) -int(b % a) -int(b * a) -int(b * b) -int(b ** a) -int(b ** b) -int(b ** f) -int(b + 0.5) -int(b + 2) -int(b + a) -int(b + b) -int(b - 0) -int(b - 2) -int(b - b) -int(b - f) -int(b / 1) -int(b / b) -int(b ^ b) -int(b ^ f) -int(b) -int(b) != 0 * 0 -int(b) != f -int(b) % a -int(b) * 0 % 2 -int(b) * a -int(b) - a -int(b) - b -int(b) .. a -int(b) / a -int(b) ^ f -int(count(arr, true)) -int(div(0, 2)) -int(div(0, a)) -int(div(1, a)) -int(div(1, b)) -int(div(2, a)) -int(div(2, b)) -int(div(a, 1)) -int(div(a, b)) -int(div(b, a)) -int(div(b, b)) -int(f * 0.5) -int(f * a) -int(f * b) -int(f ** b) -int(f + 0) -int(f + 0.5) -int(f + 2) -int(f + a) -int(f + b) -int(f + f) -int(f - 0) -int(f - 1) -int(f - a) -int(f - b) -int(f / 0) -int(f / f) -int(f ^ 0) -int(f ^ a) -int(f ^ b) -int(f ^ obj?.a) -int(f) -int(f) != a -int(f) * obj.a -int(f) * obj.fn(b) -int(f) ** b -int(f) .. a -int(f) < obj?.a -int(f) == obj?.b -int(f) >= 2 / a -int(f) ^ b -int(false ? "a" : a) -int(false ? 0 : a) -int(false ? add : 0) -int(first(arr)) -int(float(0)) -int(float(2)) -int(float(a)) -int(float(f)) -int(get(arr, 0)) -int(get(arr, a)) -int(get(arr, b)) +int(0.5 ^ 1) +int(0.5 ^ f32) +int(0.5 ^ i) +int(0.5) ** i64 +int(0.5) ** int(i64) +int(0.5) + f32 +int(0.5) + f64 +int(0.5) + i64 +int(0.5) - i +int(0.5) - i64 +int(0.5) .. i32 +int(0.5) < int(f64) +int(0.5) == f32 +int(0.5) == i +int(0.5) > -1 +int(0.5) >= i - i64 +int(0.5) ^ i32 +int(0.5) ^ i64 +int(0.5) in array +int(0.5) not in array +int(1 % 1) +int(1 % i) +int(1 % i32) +int(1 * 0.5) +int(1 * f32) +int(1 * f64) +int(1 * i) +int(1 * i64) +int(1 ** 0.5) +int(1 ** 1) +int(1 ** f32) +int(1 ** i32) +int(1 ** i64) +int(1 + 0.5) +int(1 + 1) +int(1 + f64) +int(1 + i) +int(1 - 0.5) +int(1 - 1) +int(1 - i64) +int(1 / 1) +int(1 / f64) +int(1 / i32) +int(1 / i64) +int(1 ^ 0.5) +int(1 ^ 1) +int(1 ^ i32) +int(1 ^ i64) +int(1) * f64 +int(1) * i +int(1) ** f32 +int(1) ** i64 +int(1) + 0.5 + 1 +int(1) + i64 +int(1) - f64 +int(1) - i64 +int(1) .. i +int(1) / f32 +int(1) / i +int(1) < f64 +int(1) <= f32 +int(1) <= f64 +int(1) == i +int(1) == i64 +int(1) > f64 +int(1) > float(1) +int(1) > i32 +int(1) >= f32 +int(1) >= f64 +int(1) >= half(0.5) +int(1) ^ f32 +int(1) ^ f64 +int(1) ^ i +int(1) ^ i32 +int(1) in array +int(abs(0.5)) +int(abs(f32)) +int(abs(f64)) +int(abs(i)) +int(abs(i32)) +int(abs(i64)) +int(array[1]) +int(array[i32]) +int(array[i64]) +int(count(list, ok)) +int(div(1, i)) +int(f32 * f32) +int(f32 * i64) +int(f32 ** 0.5) +int(f32 ** f64) +int(f32 ** i32) +int(f32 + f32) +int(f32 + i64) +int(f32 - 0.5) +int(f32 - f32) +int(f32 - i) +int(f32 / f64) +int(f32 ^ 1) +int(f32 ^ f32) +int(f32 ^ i) +int(f32 ^ i64) +int(f32) +int(f32) != f32 +int(f32) % i +int(f32) * f64 +int(f32) .. i32 +int(f32) / f32 +int(f32) / i +int(f32) == 0.5 != nil +int(f32) == i +int(f32) > i +int(f32) >= i32 +int(f32) ^ i64 +int(f32) in array +int(f64 * 0.5) +int(f64 * 1) +int(f64 * f32) +int(f64 * f64) +int(f64 * i32) +int(f64 * i64) +int(f64 ** 0.5) +int(f64 ** 1) +int(f64 ** f32) +int(f64 ** i) +int(f64 ** i32) +int(f64 ** i64) +int(f64 + f32) +int(f64 + i64) +int(f64 - 0.5) +int(f64 - 1) +int(f64 - f64) +int(f64 / 1) +int(f64 / i) +int(f64 ^ 0.5) +int(f64 ^ 1) +int(f64 ^ f32) +int(f64) +int(f64) != i32 +int(f64) * i32 +int(f64) ** i64 +int(f64) - i +int(f64) < i32 +int(f64) <= i32 +int(f64) == float(i32) +int(f64) ^ i32 +int(f64) ^ i64 +int(f64) not in array +int(false ? add : 0.5) +int(false ? f32 : 0.5) +int(false ? f64 : i32) +int(find(array, true)) +int(findIndex(array, ok)) +int(findIndex(array, true)) +int(findIndex(list, # == foo)) +int(findIndex(list, ok)) +int(findLastIndex(array, ok)) +int(findLastIndex(array, true)) +int(findLastIndex(list, true)) +int(first(array)) +int(float(0.5)) +int(float(1)) +int(float(f32)) +int(float(f64) ** i64) +int(float(f64)) +int(float(i)) +int(float(i32)) +int(float(i64)) +int(get(array, 1)) +int(get(array, i64)) +int(half(0.5)) +int(half(1 / f32)) +int(half(f64)) +int(i % 1) +int(i % i64) +int(i * 0.5) +int(i * 1) +int(i * f32) +int(i * f64) +int(i ** 0.5) +int(i ** f32) +int(i ** f64) +int(i ** i64) +int(i + 0.5) +int(i + f32) +int(i + i32) +int(i + i64) +int(i - f64) +int(i - i64) +int(i / 1) <= i32 +int(i / f64) +int(i / i) +int(i ^ f32) +int(i ^ f64) +int(i ^ i) +int(i ^ i32) +int(i) +int(i) != i +int(i) + f32 +int(i) + i32 +int(i) - i32 +int(i) .. i64 +int(i) / i +int(i) < f32 +int(i) < f64 +int(i) <= f64 +int(i) == f32 +int(i) > i32 +int(i) > i64 +int(i) > int(i) +int(i) >= i +int(i) ^ i64 +int(i32 % i64) +int(i32 * 0.5) +int(i32 * 1) +int(i32 * f64) +int(i32 ** i) +int(i32 + 0.5) +int(i32 + 1) +int(i32 + f32) +int(i32 - 0.5) +int(i32 - 1) +int(i32 - f64) +int(i32 - i) +int(i32 - i64) +int(i32 / 0.5) +int(i32 / f64) +int(i32 ^ 0.5) +int(i32 ^ f32) +int(i32 ^ f64) +int(i32 ^ i) +int(i32 ^ i64) +int(i32) +int(i32) != f32 +int(i32) % i64 +int(i32) ** -0.5 +int(i32) + i +int(i32) - f32 +int(i32) .. i32 +int(i32) / i +int(i32) / i32 +int(i32) < i64 +int(i32) <= f32 +int(i32) == -i32 +int(i32) == f64 +int(i32) > f64 +int(i64 % i32) +int(i64 * f32) +int(i64 * f64) +int(i64 * i) +int(i64 ** i) +int(i64 + 1) +int(i64 + i) +int(i64 + i64) +int(i64 - f32) +int(i64 - f64) +int(i64 - i32) +int(i64 / f32) +int(i64 / f64) +int(i64 / i) +int(i64 / i64) +int(i64 ^ 0.5) +int(i64 ^ f64) +int(i64 ^ i32) +int(i64 ^ i64) +int(i64) +int(i64) != f64 +int(i64) != i +int(i64) != nil ? 1 : half +int(i64) % i +int(i64) % i32 +int(i64) ** f64 +int(i64) - i32 +int(i64) .. i32 +int(i64) <= i +int(i64) <= i64 +int(i64) == min(i) +int(i64) > f64 +int(i64) > i32 +int(i64) >= f64 +int(i64) ^ f32 +int(i64) ^ i32 +int(i64) in array +int(i64) not in array +int(int(0.5)) int(int(1)) -int(int(a)) -int(int(f)) -int(last(arr)) -int(len(arr)) -int(len(obj)) -int(len(s)) +int(int(f32)) +int(int(f64)) +int(int(i32)) +int(int(i64)) +int(last(array)) +int(len("bar")) +int(len(array)) +int(len(list)) int(max(0.5)) -int(max(0.5, 0)) -int(max(1, b, f)) -int(max(b)) -int(max(b, f)) -int(max(f)) -int(min(0)) +int(max(1)) +int(max(f64)) +int(max(i)) +int(max(i64)) int(min(0.5)) -int(min(2)) -int(min(a)) -int(min(b)) -int(min(f)) -int(obj.a + f) -int(obj.a) -int(obj.b / f) -int(obj.b) -int(obj.fn(0)) -int(obj.fn(1)) -int(obj.fn(a)) -int(obj.fn(b)) -int(obj.head(0)) -int(obj.head(0, obj)) -int(obj.head(a)) -int(obj.head(a, "a", div)) -int(obj.head(a, f)) -int(obj.head(a, nil, nil)) -int(obj.head(a, obj)) -int(obj.head(b)) -int(obj.head(b, s, nil, 0)) -int(obj.head(f)) -int(obj.head(f, s, "a")) -int(obj.obj?.b) -int(obj?.a) -int(obj?.b) -int(obj?.fn(0)) -int(obj?.fn(b)) -int(obj?.fn(obj.b)) -int(obj?.head(0.5, add)) -int(obj?.head(2, 1, obj)) -int(obj?.head(a)) -int(obj?.head(a, 0.5)) -int(obj?.head(a, a == b)) -int(obj?.head(b)) -int(obj?.head(b, add, 0)) -int(obj?.head(f)) -int(obj?.head(f, a, 1)) -int(obj?.obj.a) -int(obj?.obj?.b) -int(ok ? 0 : ok) -int(ok ? 0.5 : add) -int(ok ? 1 : 0.5) -int(ok ? a : f) -int(ok ? b : ok) -int(ok ? f : s) -int(string(a)) -int(string(b)) -int(toJSON(0)) -int(toJSON(a)) -int(toJSON(b)) -int(true ? 0 : nil) -join(map(arr, s)) -keys(obj) -keys(obj) == obj?.head(0, obj) -keys(obj)[a] -keys(ok ? obj : nil) -keys({"b": 1, "c": obj}) -last(0 .. b) -last(2 .. 1) -last(["b"]) -last([nil, obj, b]) -last(a .. 0) -last(a .. 2) -last(a .. a) -last(abs(obj?.head(a, add, div))) -last(arr) -last(arr) * 0 * 0 -last(arr) * abs(b) -last(arr) * f * a -last(arr) * obj.head(obj, arr).a -last(arr) < b / 0.5 -last(arr) >= b -last(arr[b:a]) -last(b + obj?.b) -last(b - obj.b) -last(b .. 2) -last(b .. a) -last(div(0, a) > a ? "c" : false) -last(false ? f : a) -last(false ? f : s) -last(false ? obj : s) -last(false ? s : 1) -last(false ? s : obj) -last(filter(arr, false)) -last(filter(arr, true)) -last(first(obj?.obj)) -last(get(obj.a, obj.b)) -last(get(obj.b, ok != 0.5)) -last(get(obj.obj, ok)) -last(last(obj?.b)) -last(map(arr, "a")) -last(map(arr, 0)) -last(map(arr, 0.5)) -last(map(arr, a)) -last(map(arr, add)) -last(map(arr, arr)) -last(map(arr, b)) -last(map(arr, div)) -last(map(arr, false)) -last(map(arr, ok)) -last(map(arr, s)) -last(map(obj?.head("b"), b)) -last(obj.a) -last(obj.b) -last(obj.b)?.a -last(obj.b)?.obj -last(obj.fn(0)) -last(obj.fn(1)) -last(obj.fn(a)) -last(obj.fn(b)) -last(obj.head("a")) -last(obj.head("c", 0, ok)) -last(obj.head(0)) -last(obj.head(0, nil)) -last(obj.head(0, ok, ok)) -last(obj.head(0.5)) -last(obj.head(2)) -last(obj.head(2, add, "a", "a", "a")) -last(obj.head(a)) -last(obj.head(a, f)) -last(obj.head(a, true, f)) -last(obj.head(add, 2)) -last(obj.head(arr == div)) -last(obj.head(arr, s)) -last(obj.head(div)) -last(obj.head(div, 0.5, obj, s, 2)) -last(obj.head(f, a, s, a)) -last(obj.head(obj)) -last(obj.head(obj, b, add).a) -last(obj.head(ok)) -last(obj.head(ok, false)) -last(obj.head(s)) -last(obj.head(s, a, ok)) -last(obj.head(true)) -last(obj.head(true, div)) -last(obj.obj) -last(obj.obj)?.b -last(obj.obj.a) -last(obj.obj?.a) -last(obj.obj?.obj.a) -last(obj?.a) -last(obj?.a)?.b -last(obj?.b) -last(obj?.b)?.obj -last(obj?.fn(0)) -last(obj?.fn(a)) -last(obj?.fn(b)) -last(obj?.fn(b))?.b -last(obj?.head("a", 0, 1)) -last(obj?.head(0, 0.5, a)) -last(obj?.head(1, s, "a", obj)) -last(obj?.head(2)) -last(obj?.head(a, b)) -last(obj?.head(a, obj)) -last(obj?.head(add)) -last(obj?.head(add, false, 0, div, f)) -last(obj?.head(arr)) -last(obj?.head(arr, 1)) -last(obj?.head(b)) -last(obj?.head(div, add, nil, ok)) -last(obj?.head(div, nil, ok)) -last(obj?.head(f)) -last(obj?.head(f, div, s)) -last(obj?.head(nil)?.obj) -last(obj?.head(nil, div, ok)) -last(obj?.head(obj)) -last(obj?.head(obj))?.b -last(obj?.head(obj, a)) -last(obj?.head(obj, false)) -last(obj?.head(ok, arr, div)) -last(obj?.head(ok, div)) -last(obj?.head(s)) -last(obj?.head(true)) -last(obj?.obj) -last(obj?.obj)?.a -last(obj?.obj)?.b -last(obj?.obj.a) -last(obj?.obj.b) -last(obj?.obj?.obj) -last(obj[nil]) -last(obj[obj[nil]]) -last(ok ? "a" : div) -last(ok ? "c" : a) -last(ok ? 0 : obj) -last(ok ? a : s) -last(ok ? add : arr) -last(ok ? arr : false) -last(ok ? div : 0.5) -last(ok ? div : b) -last(ok ? div : f) -last(ok ? div : true) -last(ok ? f : "c") -last(ok ? f : b) -last(ok ? f : ok) -last(ok ? false : s) -last(ok ? obj : div) -last(ok ? obj : s) -last(ok ? ok : 2) -last(ok ? ok : f)?.obj -last(ok ? true : "c") -last(ok ? true : b) -last(split(s, "c")) -last(splitAfter("a", "a")) -last(true ? a : ok) -last(true ? add : f) -last(true ? div : false) -last(true ? div : ok) -last(true ? obj : 0.5) -last(true ? ok : b) -last(true ? ok : div) -lastIndexOf("a", "a") + f -lastIndexOf("b", s) * a -lastIndexOf(s, ok ? s : 0) -lastIndexOf(s, s) -len("a" + s) -len("a") .. b -len("a") == a -len("a") >= 0 * b -len("b" + "c") -len("b") ** b -len("b") >= f -len("c" + "a") -len(0 .. 0) -len(0 .. a) -len(2 .. 0) -len([s]) -len(a .. 1) -len(a .. a) -len(a .. b) -len(add != add or ok ? "c" : div) -len(arr) -len(arr) != f -len(arr) != obj?.obj -len(arr) - f -len(arr) - int(a) -len(arr) / a -len(arr) > f -len(arr) > last(arr) -len(arr) ^ -f -len(arr[a:2]) -len(filter(arr, false)) -len(filter(arr, ok)) -len(filter(arr, true)) -len(keys(obj)) -len(map(arr, "b")) -len(map(arr, 0)) -len(map(arr, 1)) -len(map(arr, a)) -len(map(arr, arr)) -len(map(arr, b)) -len(map(arr, f)) -len(map(arr, ok)) -len(map(arr, s)) -len(obj) -len(obj) % b -len(obj) ** f -len(obj) ** obj.b -len(obj) + b -len(obj) .. -b -len(obj) / obj?.a -len(obj) <= f -len(obj) <= min(0) -len(obj) == a -len(obj) > get(arr, a) -len(obj) > obj.a -len(obj) >= a -len(obj) >= count(arr, true) -len(obj.head("a", 2, false)) -len(obj.head("b")) -len(obj.head("c", ok)) -len(obj.head("c", true, obj, false, obj)) -len(obj.head(arr)) -len(obj.head(arr, div, b)) -len(obj.head(obj)) -len(obj.head(obj, 2)) -len(obj.head(s)) -len(obj.head(s, 0, div, s, add)) -len(obj.head(s, nil)) -len(obj.obj) -len(obj.obj) > b -len(obj?.head("c", b)) -len(obj?.head(arr, nil, f)) -len(obj?.head(arr, s, "c", div, "c")) -len(obj?.head(obj)) -len(obj?.head(s)) -len(obj?.head(s, add)) -len(obj?.obj) -len(obj?.obj.obj) -len(obj?.obj?.obj) -len(ok ? arr : a) -len(ok ? arr : obj) -len(s + "c") -len(s + s) -len(s) -len(s) != a -len(s) != obj.b -len(s) ** obj?.a -len(s) + a -len(s) + f -len(s) / f -len(s) >= a -len(s) >= b -len(s) ^ f -len(string(0)) +int(min(1)) +int(min(f32)) +int(min(f32, i32)) +int(min(f64)) +int(min(f64, 1)) +int(min(i)) +int(min(i32)) +int(min(i64)) +int(min(i64, 1)) +int(ok ? 0.5 : i64) +int(ok ? 1 : div) +int(ok ? i32 : add) +int(score(1)) +int(score(i)) +int(string(1)) +int(string(i)) +int(string(i32)) +int(string(i64)) +int(toJSON(1)) +int(toJSON(i)) +int(toJSON(i32)) +int(toJSON(i64)) +int(true ? f64 : 0.5) +int(true ? f64 : 1) +join(["bar"]) +join(map(array, "bar")) +join(map(array, "foo")) +join(map(list, "bar")) +keys({"bar": i64}) +keys({"foo": 0.5}) +keys({"foo": f32}) +keys({"foo": i}) +last(1 .. i32) +last([0.5]) +last([array]) +last([f64]) +last([half, i32]) +last(array) +last(array) != f32 +last(array) != i32 +last(array) % i32 +last(array) * i32 +last(array) + f32 +last(array) + i +last(array) - f32 +last(array) - i64 +last(array) - score(i) +last(array) .. max(i) +last(array) / f64 +last(array) > f64 +last(array) > max(1) +last(array) >= f32 +last(array) >= f64 +last(false ? 0.5 : greet) +last(false ? div : 1) +last(false ? f32 : 1) +last(false ? list : 1)?.add +last(false ? list : add) +last(filter(array, false)) +last(filter(array, ok)) +last(filter(list, true)) +last(i .. i32) +last(i32 .. i32) +last(i32 .. i64) +last(i64 .. i) +last(list) +last(list) == foo +last(list) not in list +last(list).Bar +last(list).Qux +last(list).String +last(list).String() +last(list)?.Bar +last(list)?.Qux +last(list)?.String +last(list)?.String() +last(map(array, "bar")) +last(map(array, #)) +last(map(array, array)) +last(map(array, i64)) +last(map(list, "bar")) +last(map(list, "foo")) +last(map(list, #)) +last(map(list, 0.5)) +last(map(list, add)) +last(map(list, f32)) +last(map(list, foo)) +last(map(list, i)) +last(map(list, i32)) +last(map(list, true)) +last(ok ? 0.5 : score) +last(ok ? array : false) +last(ok ? foo : add != half) +last(ok ? nil : list) +last(ok ? ok : i32) +last(true ? 1 : list)?.String +last(true ? foo : half) +last(true ? half : 1) +last(true ? i32 : ok) +last(true ? i64 : 1) +last(true ? ok : f64) +lastIndexOf("bar", "foo") < f32 ^ f64 +len("bar" + "foo") +len("bar") != f32 +len("bar") % score(i) +len("bar") * i32 +len("bar") ** f64 +len("bar") ** i32 +len("bar") <= i64 +len("bar") > i32 +len("bar") >= 0.5 ^ 0.5 +len("bar") >= f32 +len("bar") >= f64 +len("foo" + foo.Bar) +len("foo") * i32 +len("foo") * i64 +len("foo") - i +len("foo") .. i +len("foo") < f32 +len("foo") <= f32 +len("foo") <= f64 +len("foo") == i +len("foo") == i32 +len("foo") == i64 +len("foo") > f64 +len("foo") not in array +len([f64]) +len([false, add, half]) +len([false, foo, false]) +len([false]) +len(array) +len(array) != i +len(array) != i32 +len(array) * i +len(array) ** i +len(array) .. 1 - 1 +len(array) / f32 +len(array) < f32 +len(array) <= i +len(array) >= f32 +len(array) >= f64 +len(array) >= i64 +len(false ? 1 : list) +len(false ? nil : "foo") +len(foo.Bar) +len(foo.String()) +len(foo?.Bar) +len(foo?.String()) +len(greet("bar")) +len(greet("foo")) +len(i .. 1) +len(i32 .. 1) +len(i32 .. i) +len(i32 .. i32) +len(i32 .. i64) +len(i64 .. 1) +len(i64 .. i) +len(list) +len(list) != i64 +len(list) * f32 +len(list) ** i +len(list) / f64 +len(list) <= f64 +len(list) == f32 +len(list) == i +len(list) > i +len(list) > i64 - i +len(list) >= i +len(list) not in map(array, #) +len(lower("foo")) +len(lower(toBase64("foo"))) +len(lower(type(list))) +len(map(array, "bar")) +len(map(array, #)) +len(map(array, 0.5)) +len(map(array, array)) +len(map(array, f64)) +len(map(array, foo)) +len(map(array, half)) +len(map(array, i)) +len(map(array, i64)) +len(map(array, list)) +len(map(array, ok)) +len(map(array, score)) +len(map(list, "bar")) +len(map(list, "foo")) +len(map(list, #)) +len(map(list, 0.5)) +len(map(list, 1)) +len(map(list, f64)) +len(map(list, false)) +len(map(list, greet)) +len(map(list, half)) +len(map(list, i)) +len(map(list, score)) +len(map(list, true)) +len(sort(array)) +len(string("bar")) +len(string("foo")) len(string(0.5)) len(string(1)) -len(string(div == div)) -len(string(f)) -len(string(false)) +len(string(add)) +len(string(array)) +len(string(div)) +len(string(f32)) +len(string(f64)) +len(string(foo)) +len(string(greet)) +len(string(half)) +len(string(i32)) +len(string(i64)) +len(string(list)) len(string(nil)) -len(string(obj)) len(string(ok)) -len(string(s)) -len(toBase64("c")) -len(toJSON("a")) -len(toJSON("c")) -len(toJSON(a)) -len(toJSON(b)) -len(toJSON(f)) -len(toJSON(nil == ok)) -len(toJSON(s)) -len(trim("b")) -len(trim(s)) -len(trimPrefix("a")) -len(trimPrefix(s)) -len(trimSuffix("a")) -len(trimSuffix(s)) -len(true ? arr : add) -len(true ? arr : obj) -len(upper("b")) -len(values(obj)) -len({"a": arr, "b": a}) -lower("b") != obj.head(f, ok) -lower("b") contains s -lower("b") matches "c" ? f : b -lower("c" + s) -lower(false ? 0 : "c") -lower(obj.head(s)) -lower(obj.head(s, 2, s, "c")) -lower(obj?.head(s)) -lower(s + "b") -lower(s + "c") -lower(s) -lower(s) contains s -lower(s) in obj?.obj -lower(s[b:0]) -lower(string("a")) -lower(string(0)) +len(string(score)) +len(string(true)) +len(toJSON("bar")) +len(toJSON("foo")) +len(toJSON(0.5)) +len(toJSON(1 <= i32)) +len(toJSON(1)) +len(toJSON(array)) +len(toJSON(f32)) +len(toJSON(f64)) +len(toJSON(false)) +len(toJSON(foo)) +len(toJSON(foo.Bar)) +len(toJSON(i)) +len(toJSON(i32)) +len(toJSON(i64)) +len(toJSON(list)) +len(toJSON(nil)) +len(toJSON(ok)) +len(toJSON(true)) +len(trim("bar")) +len(trim("foo")) +len(trimPrefix("bar")) +len(trimPrefix("foo")) +len(trimSuffix("bar")) +len(trimSuffix("foo")) +len(type(0.5)) +len(type(1)) +len(type(array)) +len(type(div)) +len(type(f32)) +len(type(f64)) +len(type(false)) +len(type(foo)) +len(type(greet)) +len(type(half)) +len(type(half)) > f32 +len(type(i)) +len(type(i32)) +len(type(i64)) +len(type(list)) +len(type(nil)) +len(type(ok)) +len(type(score)) +len(upper("bar")) +len(upper("foo")) +len({"bar": 1}) +len({"bar": add}) +len({"bar": f64, "bar": i}) +len({"bar": greet, "bar": greet}) +len({"foo": "foo"}) +list +list != array +list != array == ok +list != array ? 0.5 : "bar" +list != filter(list, true) +list != list +list != map(array, #) +list != map(array, 1) +list != map(array, div) +list != map(list, #) +list != map(list, div) +list != map(list, list) +list == [add] +list == array +list == array ? div : i +list == list +list == list == nil +list == list ? f64 : array +list == list or add != nil +list == map(list, f32) +list == map(list, i64) +list == nil == nil +list == nil == ok +list == nil or i == 0.5 +list == sort(array) +list == {"bar": half, "foo": "foo"}?.i32 +list[-1] +list[-i32] +list[-i64] +list[-i64].String +list[-i] +list[-i].String +list[1 % i32] +list[1 * i64] +list[1:i] == list +list[1].Bar +list[1].Qux +list[1].String +list[1].String() +list[1]?.Bar +list[1]?.Qux +list[1]?.String +list[1]?.String() +list[false ? add : 1] +list[false ? nil : i] +list[false ? true : f64] +list[findIndex(list, ok)] +list[i * i32] +list[i32:i32] +list[i32:i64] +list[i32:i] +list[i32] +list[i32].Bar +list[i32].Qux +list[i32].String +list[i32].String() +list[i32]?.Bar +list[i32]?.Qux +list[i32]?.String +list[i64 % 1] +list[i64:i32] +list[i64:i64] +list[i64:i] +list[i64] +list[i64].Bar +list[i64].Qux +list[i64].String +list[i64].String() +list[i64]?.Bar +list[i64]?.Qux +list[i64]?.String +list[i:false ? false : i64] +list[i:i] +list[i] +list[i].Bar +list[i].Qux +list[i].String +list[i].String() +list[i]?.Bar +list[i]?.Qux +list[i]?.String() +list[int(0.5)] +list[int(f64)] +list[int(i)] +list[max(i)] +list[min(i)] +list[ok ? f32 : add] +list[score(1)] +list[score(i)] +list[true ? f64 : true] +lower("bar" + "bar") +lower(foo.Bar) +lower(foo.String()) +lower(foo?.Bar) +lower(foo?.String()) +lower(greet("bar")) +lower(greet("foo")) +lower(lower("bar")) +lower(lower(trimSuffix("bar"))) +lower(string("bar")) +lower(string("foo")) lower(string(0.5)) -lower(string(2)) -lower(string(a)) -lower(string(b)) -lower(string(f)) +lower(string(add)) +lower(string(array)) +lower(string(div)) +lower(string(f32)) +lower(string(f64)) lower(string(false)) +lower(string(foo)) +lower(string(greet)) +lower(string(half)) +lower(string(i)) +lower(string(i32)) +lower(string(i64)) +lower(string(list)) lower(string(nil)) lower(string(ok)) -lower(string(s)) +lower(string(score)) lower(string(true)) -lower(toBase64("b")) -lower(toBase64("c")) -lower(toBase64(s)) -lower(toJSON("b")) -lower(toJSON("c")) -lower(toJSON(a)) -lower(toJSON(f)) +lower(toBase64("bar" + "bar")) +lower(toBase64("bar")) +lower(toBase64("foo")) +lower(toJSON("bar")) +lower(toJSON("foo")) +lower(toJSON(0.5)) +lower(toJSON(1)) +lower(toJSON(array)) +lower(toJSON(f32)) +lower(toJSON(f64)) +lower(toJSON(false)) +lower(toJSON(foo)) +lower(toJSON(i)) +lower(toJSON(i32)) +lower(toJSON(i64)) +lower(toJSON(list)) +lower(toJSON(nil)) lower(toJSON(ok)) -lower(toJSON(s)) -lower(trim("a")) -lower(trim(s)) -lower(trimPrefix("a")) -lower(trimPrefix("c")) -lower(trimPrefix(s)) -lower(trimSuffix(s)) -lower(upper(s)) -map(0 .. 0, a) -map(0 .. 0, b) -map(0 .. 1, #) -map(0 .. a, !ok) -map(0 .. a, arr) -map(0 .. a, ok) -map(0 .. a, s) -map(0 .. b, #) -map(1 .. 0, count(arr, ok)) -map(1 .. 1, b) -map(1 .. a, #) -map(1 .. b, #) -map(1 .. b, obj.head(div)) -map(2 .. 1, b) -map(2 .. 2, map(arr, a)) -map(2 .. 2, true ? obj : a) -map(2 .. b, arr) -map([a], add) -map([nil], div) -map([obj, s], add) -map([ok], #) -map([s], arr) -map([true, obj, s], not ok) -map(a .. 0, #) -map(a .. 0, arr) -map(a .. 0, b) -map(a .. 1, f) -map(a .. a, #) -map(a .. a, div(0, a)) -map(a .. a, s) -map(a .. b, b) -map(a .. b, f) -map(a .. obj?.obj?.a, f != #) -map(arr, !any(arr, ok)) -map(arr, "a" startsWith "b") -map(arr, "b")[b] -map(arr, # * #) -map(arr, # + #) -map(arr, # + b) -map(arr, #) -map(arr, -#) -map(arr, -0) -map(arr, -1) -map(arr, -a) -map(arr, -b) -map(arr, -f) -map(arr, 0 != nil) -map(arr, 0 * 0) -map(arr, 0 * 0.5 > b) -map(arr, 0 + a) -map(arr, 0 >= 0) -map(arr, 0 ^ 0) -map(arr, 0 in arr) -map(arr, 0) != arr -map(arr, 0.5 != nil) -map(arr, 0.5 + 2) -map(arr, 0.5 - b) -map(arr, 0.5 <= b) -map(arr, 0.5 > b) -map(arr, 0.5 ^ a) -map(arr, 0.5 ^ f) -map(arr, 0.5) == arr -map(arr, 0.5) == obj.head(1, a) -map(arr, 1 + b) -map(arr, 1 - 0) -map(arr, 1 / a) -map(arr, 1 == b) -map(arr, 2 != nil) -map(arr, 2 * a) -map(arr, 2 ** 0.5) -map(arr, 2 - f) -map(arr, 2 ^ 2) -map(arr, a != nil) -map(arr, a % 2) -map(arr, a % a <= #) -map(arr, a * 0.5) -map(arr, a ** a) -map(arr, a + b) -map(arr, a - f) -map(arr, a / f) -map(arr, a < 2) -map(arr, a > 0) -map(arr, a > a) -map(arr, a > b) -map(arr, a ^ b) -map(arr, a) -map(arr, abs(0)) -map(arr, add != add) -map(arr, add != nil) -map(arr, add == add) -map(arr, add(#, #)) -map(arr, add(0, a)) -map(arr, add(0, b)) -map(arr, add(2, b)) -map(arr, add) -map(arr, add)[a] -map(arr, any(arr, ok)) -map(arr, arr) -map(arr, b != 0.5) -map(arr, b * 0.5) -map(arr, b * b) -map(arr, b + f) -map(arr, b - 0.5) -map(arr, b / f) -map(arr, b <= 0.5) -map(arr, b <= 2) -map(arr, b <= a) -map(arr, b > 1) -map(arr, b > a) -map(arr, b >= a) -map(arr, b ^ f) -map(arr, b) -map(arr, b) != obj.b -map(arr, b)[obj.b] -map(arr, count(arr, ok)) -map(arr, count(arr, true)) -map(arr, div == add) -map(arr, div(1, 1)) -map(arr, div(1, 2)) -map(arr, div(b, b)) -map(arr, div) -map(arr, div) == arr -map(arr, div)[obj.b] -map(arr, div)[obj?.a] -map(arr, f != b) -map(arr, f != nil) -map(arr, f ** 2) -map(arr, f + a) -map(arr, f + f) -map(arr, f - 0.5) -map(arr, f - f) -map(arr, f / f) -map(arr, f < b) -map(arr, f <= 0) -map(arr, f <= a) -map(arr, f == a) -map(arr, f == nil) -map(arr, f > a) -map(arr, f > f) -map(arr, f >= a) -map(arr, f ^ 0.5) -map(arr, f ^ 1) -map(arr, f) -map(arr, false ? 0 : f) -map(arr, false ? 0.5 : arr) -map(arr, false ? div : a) -map(arr, false) == obj.obj -map(arr, filter(arr, ok)) -map(arr, float(1)) -map(arr, float(b)) -map(arr, get(arr, 0)) -map(arr, get(obj, s)) -map(arr, int(f)) -map(arr, len("b")) -map(arr, lower(s)) -map(arr, map(arr, 0)) -map(arr, map(arr, 0.5)) -map(arr, map(arr, arr)) -map(arr, map(arr, true)) -map(arr, max(f)) -map(arr, min(0)) -map(arr, min(2)) -map(arr, min(b)) -map(arr, min(f)) -map(arr, nil != a) -map(arr, nil != div) -map(arr, nil == obj) -map(arr, not ok) -map(arr, not true) -map(arr, obj != nil) -map(arr, obj != obj?.b) -map(arr, obj) -map(arr, obj) != arr ? false : nil -map(arr, obj) != obj.b -map(arr, obj)[obj.a] -map(arr, obj)[obj?.b] -map(arr, obj.a) -map(arr, obj.b) -map(arr, obj.c) -map(arr, obj.head(add, nil)) -map(arr, obj.head(arr)) -map(arr, obj.head(div)) -map(arr, obj.head(ok, f)) -map(arr, obj.obj) -map(arr, obj.obj?.b) -map(arr, obj?.a) -map(arr, obj?.b) -map(arr, obj?.fn(0)) -map(arr, obj?.fn(a)) -map(arr, obj?.head("a", b, obj)) -map(arr, obj?.head(0)) -map(arr, obj?.head(1)) -map(arr, obj?.head(add, ok, f)) -map(arr, obj?.head(arr)) -map(arr, obj?.head(b)) -map(arr, obj?.head(s)) -map(arr, obj?.obj) -map(arr, obj?.obj.b) -map(arr, obj?.obj?.a) -map(arr, ok ? arr : s) -map(arr, ok) -map(arr, ok)[a] -map(arr, ok)[b] -map(arr, one(arr, ok)) -map(arr, repeat(s, a)) -map(arr, s + "a") -map(arr, s < s) -map(arr, s > s) -map(arr, s endsWith s) -map(arr, s in obj) -map(arr, s) -map(arr, s) != obj.a -map(arr, s) != obj?.obj -map(arr, s)[obj?.a] -map(arr, s)[ok ? f : ok:a] -map(arr, split(s, s)) -map(arr, string(arr)) -map(arr, toJSON(a)) -map(arr, trimPrefix(s)) -map(arr, true || ok) -map(arr[b:a], ok) -map(arr[b:b], b) -map(arr[b:b], ok) -map(b .. 0, b / b) -map(b .. 1, #) -map(b .. 1, s) -map(b .. a, arr != arr) -map(b .. a, b) -map(b .. a, f > 0.5) -map(b .. a, obj?.fn(ok, add)) -map(b .. a, s) -map(b .. b, #) -map(b .. b, ok) -map(b .. b, string(arr)) -map(div(1, b) <= a ? arr : ok, #) -map(false ? 0 : "a", obj?.obj) -map(false ? 0 : obj, b) -map(false ? 0.5 : arr, #) -map(false ? a : arr, s) -map(false ? b : "b", #) -map(false ? div : arr, 2 * f) -map(false ? obj : s, a) -map(false ? s : arr, #) -map(filter(arr, false), obj?.fn(nil)) -map(filter(arr, false), s) -map(filter(arr, ok), 1 >= b) -map(filter(arr, ok), 2 == nil) -map(filter(arr, ok), a) -map(filter(arr, ok), arr) -map(filter(arr, ok), div) -map(filter(arr, ok), obj) -map(filter(arr, ok), s) -map(filter(arr, true), #) -map(keys(obj), #) -map(keys(obj), b) -map(map(arr, "a"), arr) -map(map(arr, "a"), b) -map(map(arr, "b"), f) -map(map(arr, "b"), s) -map(map(arr, "c"), #) -map(map(arr, 0), #) -map(map(arr, 0), obj.head(ok)) -map(map(arr, 0.5), #) -map(map(arr, 0.5), a) -map(map(arr, 0.5), arr) -map(map(arr, 0.5), f) -map(map(arr, 1), #) -map(map(arr, 1), arr) -map(map(arr, 1), b) -map(map(arr, a), #) -map(map(arr, a), arr) -map(map(arr, add), "a" == nil) -map(map(arr, add), #) -map(map(arr, add), b) -map(map(arr, add), obj) -map(map(arr, arr), #) -map(map(arr, arr), div) -map(map(arr, arr), obj) -map(map(arr, arr), obj?.b) -map(map(arr, arr), ok) -map(map(arr, b), #) -map(map(arr, b), add) -map(map(arr, b), f) -map(map(arr, b), map(arr, ok)) -map(map(arr, b), obj) -map(map(arr, b), ok) -map(map(arr, b), s) -map(map(arr, div), !true) -map(map(arr, div), #) -map(map(arr, div), add(b, 1)) -map(map(arr, div), add) -map(map(arr, div), obj) -map(map(arr, div), obj?.a) -map(map(arr, div), split(s, s)) -map(map(arr, f), #) -map(map(arr, f), s) -map(map(arr, false), #) -map(map(arr, false), add) -map(map(arr, false), arr) -map(map(arr, obj), 0 >= a) -map(map(arr, obj), a in arr) -map(map(arr, obj), a) -map(map(arr, obj), add) -map(map(arr, obj), b) -map(map(arr, obj), ok) -map(map(arr, ok), #) -map(map(arr, s), #) -map(map(arr, s), f) -map(map(arr, s), obj) -map(map(arr, true), #) -map(map(arr, true), add) -map(map(arr, true), f > f) -map(map(arr, true), f ^ 1) -map(map(arr, true), obj) -map(obj.head("a"), #) -map(obj.head("a", a, 0), #) -map(obj.head("a", add, ok), b) -map(obj.head("a", obj, "b", obj), #) -map(obj.head("b"), a) -map(obj.head("b"), ok) -map(obj.head("b", nil, a, div, true), obj.a) -map(obj.head("c"), b * 1) -map(obj.head("c", 1, div, "a", f), #) -map(obj.head("c", arr), #) -map(obj.head("c", b), 0 * b) -map(obj.head("c", b), arr) -map(obj.head(arr), #) -map(obj.head(arr), a) -map(obj.head(arr), add) -map(obj.head(arr), obj.obj) -map(obj.head(arr), s) -map(obj.head(arr, 0.5), a) -map(obj.head(arr, arr, 0), a) -map(obj.head(arr, false), arr) -map(obj.head(arr, ok), #) -map(obj.head(obj), a .. 0) -map(obj.head(obj), a) -map(obj.head(obj), arr) -map(obj.head(obj), f) -map(obj.head(obj), obj) -map(obj.head(obj, a), 1 .. b) -map(obj.head(obj, div), obj.obj) -map(obj.head(s), #) -map(obj.head(s), 0 + f) -map(obj.head(s), a) -map(obj.head(s), arr) -map(obj.head(s), b % a) -map(obj.head(s), b) -map(obj.head(s), f) -map(obj.head(s), ok) -map(obj.head(s), s) -map(obj.head(s, add, div), f) -map(obj.head(s, b, f, ok, f), #) -map(obj.head(s, ok, 0), a / 0.5) -map(obj.obj, !false) -map(obj.obj, "b" startsWith s) -map(obj.obj, "c" > s) -map(obj.obj, -0.5) -map(obj.obj, -obj?.b) -map(obj.obj, 0 == 1) -map(obj.obj, 0.5 >= b) -map(obj.obj, 2 + a) -map(obj.obj, 2 .. b) -map(obj.obj, a) -map(obj.obj, add) -map(obj.obj, arr) -map(obj.obj, b ** b) -map(obj.obj, b == 2) -map(obj.obj, b) -map(obj.obj, div(0, a)) -map(obj.obj, div) -map(obj.obj, f) -map(obj.obj, false || true) -map(obj.obj, not false) -map(obj.obj, obj) -map(obj.obj, obj.a) -map(obj.obj, obj.b) -map(obj.obj, obj.fn(a)) -map(obj.obj, obj.head(a, obj, f, f)) -map(obj.obj, obj?.a) -map(obj.obj, obj?.head(f, add, s)) -map(obj.obj, obj?.head(nil, true)) -map(obj.obj, obj?.head(obj, arr)) -map(obj.obj, ok) -map(obj.obj, s > s) -map(obj.obj, s matches s) -map(obj.obj, s startsWith s) -map(obj.obj, s) -map(obj.obj, string(0.5)) -map(obj.obj, toBase64("c")) -map(obj.obj, toJSON(ok)) -map(obj.obj.obj, a) -map(obj.obj?.obj, b) -map(obj?.head("a"), a) -map(obj?.head("a"), add) -map(obj?.head("a"), obj) -map(obj?.head("b"), add) -map(obj?.head("b", a, arr, ok, true), add) -map(obj?.head("b", b), obj) -map(obj?.head("c"), #) -map(obj?.head("c"), ok && ok) -map(obj?.head("c", add, f, "b"), #) -map(obj?.head("c", arr, true), f ^ 0) -map(obj?.head("c", false), #) -map(obj?.head(arr), a) -map(obj?.head(arr), s) -map(obj?.head(arr, "b"), #) -map(obj?.head(arr, 2), obj) -map(obj?.head(arr, add), b) -map(obj?.head(arr, b, nil, arr), toJSON(ok)) -map(obj?.head(arr, true, f), s) -map(obj?.head(obj), -a) -map(obj?.head(obj), b) -map(obj?.head(obj), obj.b) -map(obj?.head(obj), ok) -map(obj?.head(obj, "c"), s) -map(obj?.head(obj, 0.5), add) -map(obj?.head(obj, a, false), arr) -map(obj?.head(obj, f, add, s, true), s >= "b") -map(obj?.head(obj, ok, b, a), div) -map(obj?.head(s), b > 0.5) -map(obj?.head(s), b) -map(obj?.head(s), f) -map(obj?.head(s), obj) -map(obj?.head(s, "a", arr, obj), arr) -map(obj?.head(s, b), obj?.a) -map(obj?.head(s, obj), #) -map(obj?.head(s, ok), a / 2) -map(obj?.obj, -2) -map(obj?.obj, 0 + a) -map(obj?.obj, 0 == f) -map(obj?.obj, 1 != 0) -map(obj?.obj, 1 .. 0) -map(obj?.obj, a != nil) -map(obj?.obj, a + 0) -map(obj?.obj, a) -map(obj?.obj, abs(0)) -map(obj?.obj, add) -map(obj?.obj, arr) -map(obj?.obj, b > a) -map(obj?.obj, b > f) -map(obj?.obj, b) -map(obj?.obj, count(arr, false)) -map(obj?.obj, count(arr, true)) -map(obj?.obj, div == add) -map(obj?.obj, div) -map(obj?.obj, f * a) -map(obj?.obj, f) -map(obj?.obj, first(arr)) -map(obj?.obj, len(s)) -map(obj?.obj, max(f, f * a)) -map(obj?.obj, nil != add) -map(obj?.obj, nil == obj?.a) -map(obj?.obj, obj) -map(obj?.obj, obj.a) -map(obj?.obj, obj.b) -map(obj?.obj, obj.fn(0)) -map(obj?.obj, obj.head(b)) -map(obj?.obj, obj.obj) -map(obj?.obj, obj?.a) -map(obj?.obj, obj?.b) -map(obj?.obj, obj?.fn(0)) -map(obj?.obj, obj?.head(ok, 0)) -map(obj?.obj, obj?.obj) -map(obj?.obj, ok == true) -map(obj?.obj, ok ? 0.5 : s) -map(obj?.obj, ok ? false : ok) -map(obj?.obj, ok) -map(obj?.obj, s) -map(obj?.obj, toBase64(s)) -map(obj?.obj, true ? 0 : arr) -map(obj?.obj.obj, a) -map(obj?.obj.obj, add) -map(obj?.obj.obj, div) -map(obj?.obj.obj, obj.a) -map(obj?.obj.obj, ok) -map(ok ? arr : "b", 1 + a) -map(ok ? arr : nil, a) -map(ok ? obj : "c", ok) -map(ok ? obj : 0, arr) -map(ok ? obj : add, div(b, a)) -map(ok ? obj : arr, arr) -map(ok ? s : arr, b) -map(ok ? s : div, #) -map(ok ? s : div, add) -map(split(s, "c"), #) -map(true ? "a" : obj, #) -map(true ? "b" : div, s) -map(true ? arr : arr, #) -map(true ? arr : f, abs(0.5)) -map(true ? arr : nil, arr) -map(true ? obj : f, obj.head(0, true, 0.5, s)) -map(true ? s : 0, a) -map(values(obj), f) -map(values(obj), filter(arr, ok)) -max(-0) +lower(toJSON(true)) +lower(trim("foo")) +lower(trimPrefix("bar")) +lower(trimSuffix("bar")) +lower(trimSuffix("foo")) +lower(trimSuffix(foo?.String())) +lower(type("bar")) +lower(type("foo")) +lower(type(0.5 * i64)) +lower(type(0.5)) +lower(type(1)) +lower(type(array)) +lower(type(div)) +lower(type(f32)) +lower(type(f64)) +lower(type(false)) +lower(type(foo)) +lower(type(greet)) +lower(type(half)) +lower(type(i)) +lower(type(i64)) +lower(type(nil)) +lower(type(ok)) +lower(type(score)) +lower(type(true)) +lower(upper("bar")) +lower(upper("foo")) +map(1 .. 1, # .. #) +map(1 .. 1, # == f64) +map(1 .. i, #) +map(1 .. i, foo) +map(1 .. i, greet) +map(1 .. i32, #) +map(1 .. i32, ok) +map(1 .. i64, f64 ^ 1) +map(1 .. i64, foo) +map(1 .. i64, list) +map(["bar"], # == #) +map(["foo"], #) +map([1, i], #) +map([add], foo) +map([f32], f64) +map([false], score) +map([greet, i32], #) +map([greet], #) +map([half], #) +map([i32], foo) +map([i64], #) +map([i], max(#)) +map([list, nil], i64) +map([list], #) +map([nil], #?.div(#)) +map([score, "bar"], #) +map([score], #) +map([score], array) +map(array, !false) +map(array, !true) +map(array, "bar" != "foo") +map(array, "bar" contains "foo") +map(array, "bar")[i64] +map(array, # != # ? # : array) +map(array, # != #) +map(array, # != 1) +map(array, # != f64) +map(array, # != i32) +map(array, # != nil) +map(array, # % #) +map(array, # % 1) +map(array, # % i) +map(array, # % i32) +map(array, # % i64) +map(array, # * #) +map(array, # * 0.5) +map(array, # * f64) +map(array, # * i32) +map(array, # * i64) +map(array, # ** #) +map(array, # ** 0.5) +map(array, # ** i) +map(array, # ** i32) +map(array, # ** i64) +map(array, # + #) +map(array, # + 0.5) +map(array, # + 1) +map(array, # + f64) +map(array, # + i) +map(array, # + i32) +map(array, # + i64) +map(array, # - #) +map(array, # - 0.5) +map(array, # - 1) +map(array, # - f32) +map(array, # - i) +map(array, # - i32) +map(array, # .. #) +map(array, # .. 1) +map(array, # .. i) +map(array, # .. i32) +map(array, # .. i64) +map(array, # / #) +map(array, # / 0.5) +map(array, # / f64) +map(array, # / i) +map(array, # / i32) +map(array, # / i64) +map(array, # < #) +map(array, # < 0.5) +map(array, # < 1) +map(array, # < f32) +map(array, # < f64) +map(array, # <= #) +map(array, # <= 1) +map(array, # <= i64) +map(array, # == #) +map(array, # == 1) +map(array, # == i64) +map(array, # > #) +map(array, # > 1) +map(array, # > f32) +map(array, # > i32) +map(array, # > i64) +map(array, # >= #) +map(array, # >= 0.5) +map(array, # >= 1) +map(array, # >= f64) +map(array, # >= i) +map(array, # >= i32) +map(array, # ^ #) +map(array, # ^ 0.5) +map(array, # ^ i) +map(array, # ^ i32) +map(array, # ^ i64) +map(array, # in array) +map(array, #) +map(array, #) != array +map(array, #) != list +map(array, #) != nil == nil +map(array, #)[i64] +map(array, #)[i] +map(array, -#) +map(array, -(# ** f64)) +map(array, -0.5) +map(array, -1) +map(array, -f64) +map(array, -i) +map(array, -i64) +map(array, 0.5 != #) +map(array, 0.5 != 0.5) +map(array, 0.5 != i32) +map(array, 0.5 * #) +map(array, 0.5 ** #) +map(array, 0.5 + #) +map(array, 0.5 - #) +map(array, 0.5 / #) +map(array, 0.5 < #) +map(array, 0.5 < 1) +map(array, 0.5 <= f32) +map(array, 0.5 == #) +map(array, 0.5 == i32) +map(array, 0.5 > #) +map(array, 0.5 ^ #) +map(array, 1 != #) +map(array, 1 != 1) +map(array, 1 != f32) +map(array, 1 % #) +map(array, 1 % i) +map(array, 1 * #) +map(array, 1 * f32) +map(array, 1 ** #) +map(array, 1 ** 1) +map(array, 1 ** i32) +map(array, 1 + #) +map(array, 1 .. #) +map(array, 1 / #) +map(array, 1 / 1) +map(array, 1 < 0.5) +map(array, 1 <= #) +map(array, 1 == #) +map(array, 1 == nil) +map(array, 1 >= #) +map(array, 1 >= f64) +map(array, 1 ^ #) +map(array, 1 ^ 1) +map(array, 1 in array) +map(array, 1)[i64] +map(array, 1)[i] +map(array, [array]) +map(array, [i32, foo]) +map(array, abs(#)) +map(array, abs(0.5)) +map(array, add(#, #)) +map(array, add(#, i)) +map(array, add(1, #)) +map(array, add) +map(array, add) != list +map(array, all(array, true)) +map(array, array != nil) +map(array, array) +map(array, array) == array +map(array, array[#:#]) +map(array, array[1]) +map(array, div(#, #)) +map(array, div) +map(array, f32 ** #) +map(array, f32 ** f64) +map(array, f32 + #) +map(array, f32 - f64) +map(array, f32 / #) +map(array, f32 < #) +map(array, f32 <= #) +map(array, f32 <= 1) +map(array, f32 == #) +map(array, f32 > #) +map(array, f32) +map(array, f64 != #) +map(array, f64 != 0.5) +map(array, f64 * 1) +map(array, f64 ** #) +map(array, f64 - #) +map(array, f64 / 1) +map(array, f64 <= f64) +map(array, f64 > #) +map(array, f64) +map(array, f64) != list +map(array, f64) == i .. 1 +map(array, false ? "foo" : #) +map(array, false ? 0.5 : #) +map(array, false)[i] +map(array, findLast(array, true)) +map(array, float(# * f64)) +map(array, float(#)) +map(array, float(1)) +map(array, float(i64)) +map(array, foo) +map(array, foo.Bar) +map(array, foo.Qux) +map(array, foo.String()) +map(array, foo.String) +map(array, foo?.Qux) +map(array, foo?.String) +map(array, get(array, #)) +map(array, get(list, #)) +map(array, greet != half) +map(array, greet("bar")) +map(array, greet("foo")) +map(array, greet) +map(array, greet) == list +map(array, half(0.5)) +map(array, half) +map(array, i != #) +map(array, i != f64) +map(array, i % i) +map(array, i * 0.5) +map(array, i ** #) +map(array, i ** 0.5) +map(array, i .. #) +map(array, i / #) +map(array, i == #) +map(array, i > #) +map(array, i >= f64) +map(array, i ^ #) +map(array, i) +map(array, i)[i64] +map(array, i32 % #) +map(array, i32 % i) +map(array, i32 * #) +map(array, i32 + 0.5) +map(array, i32 + i64) +map(array, i32 - #) +map(array, i32 / #) +map(array, i32 < 0.5) +map(array, i32 == #) +map(array, i32 == 0.5) +map(array, i32 == nil) +map(array, i32 > #) +map(array, i32 >= f32) +map(array, i32 ^ #) +map(array, i32) +map(array, i64 != #) +map(array, i64 * #) +map(array, i64 ** #) +map(array, i64 + #) +map(array, i64 - #) +map(array, i64 .. #) +map(array, i64 / #) +map(array, i64 <= 1) +map(array, i64 == #) +map(array, i64 == f64) +map(array, i64 > #) +map(array, i64 >= i64) +map(array, i64 ^ #) +map(array, i64 ^ i32) +map(array, i64) +map(array, i64)[i32] +map(array, int(#)) +map(array, int(0.5)) +map(array, int(f64)) +map(array, last(array)) +map(array, len(array)) +map(array, list) +map(array, map(array, #)) +map(array, map(array, true)) +map(array, map(list, #)) +map(array, map(list, f64)) +map(array, max(#)) +map(array, max(#, #, #)) +map(array, max(0.5)) +map(array, max(0.5, #)) +map(array, max(i64, #, i)) +map(array, min(# ^ #)) +map(array, min(#)) +map(array, min(#, #, #, #)) +map(array, min(#, 1)) +map(array, min(#, 1, #)) +map(array, min(#, 1, f64)) +map(array, min(#, f32)) +map(array, min(#, f64)) +map(array, nil != #) +map(array, nil == #) +map(array, nil == half) +map(array, not (# < 1)) +map(array, not false) +map(array, not true) +map(array, ok ? # : i64) +map(array, ok ? f32 : div) +map(array, ok || ok) +map(array, ok) +map(array, one(array, ok)) +map(array, one(array, true)) +map(array, score != nil) +map(array, score(#)) +map(array, score(#, #)) +map(array, score(#, #, 1)) +map(array, score(1)) +map(array, score) +map(array, sort(array)) +map(array, string("bar")) +map(array, string(# ** f64)) +map(array, string(#)) +map(array, string(array)) +map(array, string(foo)) +map(array, string(list)) +map(array, string(score)) +map(array, toJSON(#)) +map(array, toJSON(array)) +map(array, toJSON(ok)) +map(array, true ? # : #) +map(array, true ? f32 : i) +map(array, true ? nil : #) +map(array, true)[i] +map(array, type(#)) +map(array, type(half)) +map(array, type(i)) +map(array, upper("foo")) +map(array[i64:1], array) +map(array[i64:i64], #) +map(array[i:1], i > #) +map(false ? 0.5 : "bar", greet) +map(false ? 1 : list, half) +map(false ? array : "foo", i64 / 1) +map(false ? true : array, #) +map(filter(array, false), foo) +map(filter(array, ok), # <= #) +map(filter(array, ok), #) +map(filter(array, ok), i32 + #) +map(filter(array, ok), score) +map(filter(array, true), f64) +map(filter(array, true), i) +map(filter(list, false), #) +map(filter(list, true), score) +map(i .. 1, # > #) +map(i .. 1, -i64) +map(i .. 1, f64) +map(i .. i32, #) +map(i .. i32, score) +map(i .. i64, #) +map(i .. i64, f64) +map(i .. i64, score) +map(i32 .. 1, #) +map(i32 .. 1, list) +map(i32 .. i, add) +map(i32 .. i, half) +map(i32 .. i32, #) +map(i32 .. i32, greet) +map(i32 .. i64, abs(#)) +map(i32 .. i64, f64) +map(i64 .. i, #) +map(i64 .. i, i) +map(i64 .. i32, #) +map(list, !false) +map(list, !true) +map(list, "bar" in #) +map(list, "bar" not in #) +map(list, "bar") != list +map(list, "foo" + "foo") +map(list, "foo" in #) +map(list, "foo" not matches "bar") +map(list, "foo") == list +map(list, # != #) +map(list, # != foo) +map(list, # != nil) +map(list, # == #) +map(list, # == foo) +map(list, # not in list) +map(list, #) +map(list, #) == array +map(list, #) == list +map(list, #)[i32] +map(list, #)[i64] +map(list, #)[i] +map(list, #?.Bar) +map(list, #?.Qux("bar")) +map(list, #?.Qux) +map(list, #?.String()) +map(list, #?.String) +map(list, -0.5) +map(list, -1) +map(list, -f64) +map(list, -i) +map(list, .Bar not in # != true) +map(list, .Bar) +map(list, .Qux) +map(list, .String()) +map(list, .String) +map(list, 0.5 - i64) +map(list, 0.5 < f32) +map(list, 0.5 <= f32) +map(list, 0.5 <= i64) +map(list, 0.5 >= 1) +map(list, 0.5 ^ 1) +map(list, 1 + i) +map(list, 1 - f64) +map(list, 1 .. 1) +map(list, 1 .. i64) +map(list, 1 / 1) +map(list, 1 / f32) +map(list, 1 < i32) +map(list, 1 > i32) +map(list, 1 >= f64) +map(list, [1]) +map(list, [false]) +map(list, abs(0.5)) +map(list, abs(1)) +map(list, add) +map(list, array) +map(list, div != greet) +map(list, div == div) +map(list, div) +map(list, div) != list +map(list, f32 != f32) +map(list, f32 ** f32) +map(list, f32 / i32) +map(list, f32 < 0.5) +map(list, f32 <= 1) +map(list, f32) +map(list, f64 * 0.5) +map(list, f64 * f32) +map(list, f64 ** i32) +map(list, f64 + 1) +map(list, f64 + i32) +map(list, f64 - 0.5) +map(list, f64 < f64) +map(list, f64 ^ i64) +map(list, f64) +map(list, f64) != list +map(list, false ? # : nil) +map(list, false ? f32 : #) +map(list, false ? f32 : foo) +map(list, false and true) +map(list, filter(list, false)) +map(list, first(list)) +map(list, float(0.5)) +map(list, float(1)) +map(list, float(f32)) +map(list, float(i64)) +map(list, foo == #) +map(list, foo) +map(list, foo.Bar) +map(list, foo.String) +map(list, foo?.String()) +map(list, foo?.String) +map(list, greet == greet) +map(list, greet("foo")) +map(list, greet) +map(list, greet) != array ? 0.5 : 1 +map(list, half != score) +map(list, half(0.5)) +map(list, half) +map(list, i * 1) +map(list, i * i64) +map(list, i + i) +map(list, i >= f64) +map(list, i >= i64) +map(list, i ^ f32) +map(list, i ^ i64) +map(list, i) +map(list, i32 * f32) +map(list, i32 == i64) +map(list, i32 == nil) +map(list, i32 > i) +map(list, i32 ^ 0.5) +map(list, i32) +map(list, i64 == 1) +map(list, i64 == f32) +map(list, i64 ^ (i + i32)) +map(list, i64) +map(list, int(1)) +map(list, len(array)) +map(list, list) +map(list, map(array, score)) +map(list, map(list, #)) +map(list, min(i64)) +map(list, nil != #) +map(list, nil != 1) +map(list, nil != array) +map(list, nil != i) +map(list, nil != nil) +map(list, nil == #) +map(list, nil == div) +map(list, nil == foo) +map(list, nil == i32) +map(list, nil not in array) +map(list, not false) +map(list, not ok) +map(list, not true) +map(list, ok ? i64 : i64) +map(list, ok) +map(list, ok) != array +map(list, score != greet) +map(list, score(i)) +map(list, score) +map(list, string(#)) +map(list, string(foo)) +map(list, string(nil)) +map(list, toBase64("foo")) +map(list, toJSON(#)) +map(list, toJSON(1)) +map(list, toJSON(foo)) +map(list, toJSON(i)) +map(list, trimPrefix("bar")) +map(list, trimSuffix("foo")) +map(list, true ? false : score) +map(list, true ? nil : #) +map(list, true)[i32] +map(list, type(#)) +map(list, type(greet)) +map(list, type(half)) +map(list, type(i)) +map(list, type(i64)) +map(list[i:i], i) +map(map(array, "bar"), #) +map(map(array, # >= #), add) +map(map(array, #), # < #) +map(map(array, #), # ^ i32) +map(map(array, #), #) +map(map(array, #), add) +map(map(array, #), div) +map(map(array, #), f32) +map(map(array, #), f64) +map(map(array, #), foo) +map(map(array, #), foo.Qux) +map(map(array, #), greet) +map(map(array, #), half) +map(map(array, #), i) +map(map(array, #), i64) +map(map(array, #), int(#)) +map(map(array, #), nil != half) +map(map(array, #), score(i)) +map(map(array, #), score) +map(map(array, 0.5), # != #) +map(map(array, 0.5), #) +map(map(array, 0.5), -1) +map(map(array, 0.5), list) +map(map(array, 1), #) +map(map(array, 1), ok) +map(map(array, 1), score) +map(map(array, add), #) +map(map(array, add), list) +map(map(array, array), add) +map(map(array, array), f64) +map(map(array, f32), #) +map(map(array, f64), add) +map(map(array, f64), nil == nil) +map(map(array, foo), #) +map(map(array, foo), f64) +map(map(array, foo), greet) +map(map(array, half), div) +map(map(array, i64), f64) +map(map(array, list), #) +map(map(array, true), #) +map(map(array, true), div) +map(map(array, true), foo) +map(map(list, "foo"), add) +map(map(list, "foo"), div) +map(map(list, "foo"), i32) +map(map(list, #), "bar" + "foo") +map(map(list, #), # != #) +map(map(list, #), #) +map(map(list, #), array) +map(map(list, #), div) +map(map(list, #), f32) +map(map(list, #), f64) +map(map(list, #), greet) +map(map(list, #), i) +map(map(list, #), i32) +map(map(list, #), i64 < i32) +map(map(list, #), i64) +map(map(list, #), nil != i) +map(map(list, #), ok) +map(map(list, #), score) +map(map(list, 0.5), # / #) +map(map(list, 0.5), #) +map(map(list, 0.5), greet) +map(map(list, 0.5), list) +map(map(list, 0.5), score) +map(map(list, 1), # <= #) +map(map(list, 1), foo) +map(map(list, add), [#, #]) +map(map(list, add), f64) +map(map(list, f32), #) +map(map(list, f32), greet) +map(map(list, f32), true ? "foo" : "foo") +map(map(list, f64), #) +map(map(list, false), array) +map(map(list, false), f64) +map(map(list, false), i32) +map(map(list, false), list) +map(map(list, foo), #) +map(map(list, foo), ok) +map(map(list, greet), "bar" != "foo") +map(map(list, greet), # == #) +map(map(list, greet), #) +map(map(list, greet), ["foo", 1]) +map(map(list, greet), half) +map(map(list, half), #) +map(map(list, i), i32) +map(map(list, i32), half) +map(map(list, i32), list) +map(map(list, i64), #) +map(map(list, i64), array) +map(map(list, i64), div) +map(map(list, i64), f64) +map(map(list, i64), list) +map(map(list, list), #) +map(map(list, list), div) +map(map(list, list), i) +map(map(list, ok), #) +map(map(list, score), #) +map(map(list, score), ok) +map(map(list, true), #) +map(ok ? "foo" : 0.5, #) +map(ok ? "foo" : greet, f32) +map(ok ? array : "bar", ok) +map(ok ? array : foo, # / 1) +map(sort(array), # > #) +map(sort(array), i32 > #) +map(true ? "bar" : true, #) +map(true ? "foo" : add, i64) +map(true ? array : f64, #) +map(true ? array : true, #) +max(--1) max(-0.5) -max(-2) -max(-a) -max(-a, 0 + a) -max(-b) -max(-f) -max(0 % 2, b) -max(0 % a) -max(0 ** 0.5) -max(0 ** 2) -max(0 ** b) -max(0 ** f) -max(0 + 0.5) -max(0 + a) -max(0 - 2) -max(0 - a) -max(0 / 0) -max(0 / b) -max(0 / f) -max(0 ^ b) -max(0 ^ f) -max(0) != obj.head(false, f) -max(0) + b -max(0) .. a -max(0) <= b -max(0) == b -max(0) > b != ok -max(0, 0) != f -max(0, a) < f -max(0, b) * f -max(0.5 * f) -max(0.5 - a) -max(0.5 - f) -max(0.5 ^ 0) -max(0.5) != obj?.a -max(0.5) + f -max(0.5) <= 0 * b -max(0.5) ^ obj.head(b) -max(0.5, 2) != obj?.b -max(0.5, b) < b ? div : 2 -max(0.5, b, 0.5) < obj?.a +max(-1) +max(-1, i) +max(-count(list, false), i64) +max(-f32) +max(-f64) +max(-i) +max(-i, i32, i) +max(-i32) +max(-i64) +max(-i64, 0.5 / f64) +max(0.5 * 0.5) +max(0.5 * f64) +max(0.5 * i) +max(0.5 * i, i32) +max(0.5 * i32) +max(0.5 ** 0.5) +max(0.5 ** 1) +max(0.5 ** f32) +max(0.5 ** f64) +max(0.5 ** i) +max(0.5 ** i64) +max(0.5 + 0.5) +max(0.5 + 1) +max(0.5 + i) +max(0.5 + i32) +max(0.5 + i64) +max(0.5 - 0.5) +max(0.5 - 1) +max(0.5 - i) +max(0.5 - i32) +max(0.5 - i64) +max(0.5 / 0.5) +max(0.5 / f32) +max(0.5 / f64) +max(0.5 / f64, f64) +max(0.5 / i) +max(0.5 / i64) +max(0.5 ^ 0.5) +max(0.5 ^ 1) +max(0.5 ^ f32) +max(0.5 ^ i) +max(0.5 ^ i32) +max(0.5 ^ i64) +max(0.5) != i == ok +max(0.5) * f32 +max(0.5) * f64 +max(0.5) + i +max(0.5) - f32 +max(0.5) - f64 +max(0.5) < f64 +max(0.5) <= 0.5 - 0.5 +max(0.5) <= f64 +max(0.5) == f32 +max(0.5) == i64 +max(0.5) > f32 +max(0.5) >= i32 +max(0.5) ^ i32 +max(0.5, 1) <= i32 max(1 % 1) -max(1 * a) -max(1 ** f) -max(1 - a) -max(1 / 2) -max(1 / f) -max(1 ^ f) -max(1) .. b -max(1) / int(f) -max(1) / max(b, a, 0.5, 2) -max(1) > 0.5 ? add : ok -max(2 * 2) -max(2 * f) -max(2 + f) -max(2 - 0.5) -max(2 / a) -max(2 / f) -max(2 ^ 1) -max(2 ^ f) -max(2) * b -max(2) - 0 % a -max(2) ^ a ^ 0 -max(2, b) != b -max(a % a) -max(a % b) -max(a * 0.5) -max(a * f) -max(a ** a) -max(a ** f) -max(a + 0.5) -max(a + 1) -max(a + 1, f) -max(a + a) -max(a - 0) -max(a - 1) -max(a - f) -max(a / a, a) -max(a / obj?.b) -max(a / obj?.head(0.5, s, div)) -max(a ^ 0) -max(a ^ f) -max(a) -max(a) - b -max(a) - div(0, b) -max(a) .. a -max(a) < f -max(a) <= b -max(a) <= f -max(a) == b ? 0 : nil -max(a) > f -max(a, -b) -max(a, 0) - b -max(a, 1) ^ b ** f -max(a, a) -max(a, a, b) -max(a, b) -max(a, f) -max(abs(a)) -max(abs(arr[b])) -max(abs(b)) -max(abs(f ^ 0.5)) -max(add(0, 0)) -max(add(0, b)) -max(add(1, 1)) -max(add(1, 2)) -max(add(2, a)) -max(add(a, 1)) -max(add(a, 2)) -max(add(a, a)) -max(add(b - a, obj.a)) -max(add(b, b)) -max(arr[0]) -max(arr[0], a) -max(arr[1]) -max(arr[a]) -max(arr[b]) -max(b % b) -max(b * 0) -max(b * a) -max(b * f) -max(b ** 0) -max(b ** 0.5) -max(b ** 2) -max(b ** a) -max(b ** f) -max(b + a) -max(b - b) -max(b - f) -max(b / 0) -max(b / 2) -max(b / b) -max(b / f) -max(b ^ 0) -max(b ^ 0.5) -max(b ^ 1) -max(b ^ b) -max(b ^ f) -max(b) -max(b) != 0.5 ** 0 -max(b) * f -max(b) ** a -max(b) < b -max(b) == div(b, b) -max(b) == max(b) -max(b, 2) ^ b -max(b, a) -max(b, a) >= float(f) -max(b, b) -max(b, f) -max(b, float(a)) -max(count(arr, true)) -max(div(0, 2)) -max(div(0, a)) +max(1 % i) +max(1 % i32) +max(1 % i64) +max(1 * 0.5) +max(1 * 1) +max(1 ** 0.5) +max(1 ** 1) +max(1 ** f64) +max(1 ** i64) +max(1 + f32, f64) +max(1 + i64) +max(1 - 1) +max(1 - i32) +max(1 - i64) +max(1 / 0.5) +max(1 / 1) +max(1 / f32) +max(1 / f64) +max(1 ^ 1) +max(1 ^ i32) +max(1) != i +max(1) * i +max(1) - f64 +max(1) - i64 +max(1) .. i32 +max(1) / i +max(1) / i64 +max(1) <= f32 +max(1) <= i +max(1) <= i32 +max(1) <= i64 +max(1) == f32 +max(1) > f32 +max(1) > f64 +max(1) > i +max(1) > i64 +max(1, i32, f32) != i64 +max(abs(0.5)) +max(abs(1)) +max(abs(f32)) +max(abs(f64)) +max(abs(i)) +max(abs(i32)) +max(abs(i64)) +max(array[1]) +max(array[i64]) +max(array[i]) +max(count(array, false)) +max(count(list, false)) max(div(1, 1)) -max(div(1, a)) -max(div(1, b)) -max(div(a, 2)) -max(div(a, b)) -max(div(b, 2)) -max(div(b, a)) -max(div(b, b)) -max(f * 0) -max(f * a) -max(f * b) -max(f * b, a) -max(f * f) -max(f ** a) -max(f ** obj.b) -max(f + 0) -max(f + a) -max(f + b) -max(f - 0) -max(f - 1) -max(f - 2) -max(f - b) -max(f - f) -max(f / 0) -max(f / 0.5) -max(f / 1) -max(f / a) -max(f / b) -max(f / f) -max(f ^ a) -max(f ^ b) -max(f ^ f) -max(f ^ f) ^ b -max(f) -max(f) != obj.a -max(f) * a -max(f) - int(0) -max(f) / obj?.head(a, ok) -max(f, 2 / f) -max(f, a) -max(f, b) -max(f, f) -max(false ? 0 : b) -max(false ? b : b) +max(f32 * 0.5) +max(f32 * 1) +max(f32 * f32) +max(f32 * i32) +max(f32 ** 0.5) +max(f32 ** 1) +max(f32 ** i32) +max(f32 ** i64) +max(f32 + 1) +max(f32 + f64) +max(f32 + i64) +max(f32 - f64) +max(f32 - i) +max(f32 - i32) +max(f32 / 0.5) +max(f32 / f32) +max(f32 ^ 0.5) +max(f32 ^ 1) +max(f32 ^ f32) +max(f32 ^ i32) +max(f32 ^ i64) +max(f32) +max(f32) != -i32 +max(f32) != i32 +max(f32) + i64 +max(f32) - f32 +max(f32) <= i +max(f32) <= max(f64) +max(f32) >= i64 +max(f32) ^ f32 +max(f32) ^ i32 +max(f32, -f32) +max(f32, 1) > i32 +max(f32, f32) +max(f32, f64) +max(f32, i) +max(f32, i32) +max(f32, i64) +max(f32, min(i)) +max(f64 * 0.5) +max(f64 * f64) +max(f64 * i, f32) +max(f64 * i32) +max(f64 ** 1) +max(f64 ** i) +max(f64 ** i64) +max(f64 + 0.5) +max(f64 - i32) +max(f64 - i64) +max(f64 / 0.5) +max(f64 / f32) +max(f64 / i32) +max(f64 ^ 0.5) +max(f64 ^ i32) +max(f64 ^ i64) +max(f64) +max(f64) != i +max(f64) + f32 +max(f64) + i64 +max(f64) - f32 +max(f64) / f32 +max(f64) / i32 +max(f64) == f64 +max(f64) == i32 +max(f64) > f32 +max(f64) > f64 +max(f64) > i64 +max(f64) ^ 1 ^ i64 +max(f64) ^ i +max(f64) ^ min(i32, 1) +max(f64, -1) +max(f64, 0.5 ** i64) +max(f64, 1) <= f64 +max(f64, 1) == i32 +max(f64, f32) +max(f64, f32, i32) +max(f64, f32, i64) +max(f64, f64) +max(f64, f64, score(1)) +max(f64, float(i)) +max(f64, half(f64)) +max(f64, i) +max(f64, i32) +max(f64, i64) +max(false ? 1 : 0.5) +max(false ? 1 : nil) +max(false ? add : ok) +max(false ? half : list) +max(false ? i : nil) +max(false ? i32 : score) +max(false ? true : 1) +max(find(array, ok)) +max(find(array, true)) +max(findIndex(array, ok)) +max(findIndex(array, true)) +max(findIndex(list, ok)) +max(findIndex(list, true)) +max(findLast(array, false)) +max(findLast(array, true)) +max(findLastIndex(array, false)) +max(findLastIndex(list, true)) +max(first(array)) max(float(0.5)) -max(float(2)) -max(float(b)) -max(float(f)) -max(get(arr, 0), a) -max(get(arr, a)) -max(get(arr, b)) -max(int(0)) +max(float(1)) +max(float(f32)) +max(float(f64)) +max(float(i)) +max(float(i64)) +max(float(i64), f64) +max(get(array, 1)) +max(get(array, i)) +max(get(array, i32)) +max(get(array, i64)) +max(half(-0.5)) +max(half(0.5)) +max(half(f64)) +max(i % i) +max(i % i32) +max(i % i64) +max(i * 0.5) +max(i * 1) +max(i * f32) +max(i * i32) +max(i ** 0.5) +max(i ** 1) +max(i ** f64) +max(i ** i) +max(i ** i64) +max(i + 0.5) +max(i + 1) +max(i + f32) +max(i + f64) +max(i + i) +max(i - 1) +max(i - i32) +max(i - i32, f32) +max(i - i64) +max(i / 0.5) +max(i / f32) +max(i / i32, f64) +max(i ^ 0.5) +max(i ^ 1) +max(i ^ f32) +max(i ^ f64) +max(i) +max(i) != f64 +max(i) ** f64 +max(i) + f32 +max(i) + i64 +max(i) - f32 +max(i) - f64 +max(i) - i32 +max(i) - i64 +max(i) / f64 +max(i) >= i64 +max(i) ^ (i * i) +max(i) ^ f32 +max(i, -f32) +max(i, f32) +max(i, f32, f32) +max(i, f64) +max(i, i) +max(i, i32) +max(i, i64) +max(i, i64, i64) +max(i32 % 1) +max(i32 % i32) +max(i32 * 0.5) +max(i32 * 1) +max(i32 * f32) +max(i32 * i64) +max(i32 + 0.5, f64) +max(i32 + f64) +max(i32 + i) +max(i32 + i32) +max(i32 - i) +max(i32 - i64) +max(i32 / f32) +max(i32 / f64) +max(i32 / i64) +max(i32 ^ 0.5) +max(i32 ^ 1) +max(i32 ^ f32) +max(i32 ^ i) +max(i32 ^ i32) +max(i32) +max(i32) != min(i64) +max(i32) - f32 +max(i32) - i64 +max(i32) / f32 +max(i32) >= i32 +max(i32) ^ i64 +max(i32, 1) == i32 +max(i32, abs(f64)) +max(i32, f32) +max(i32, f32) != i32 +max(i32, f64) +max(i32, f64) - f32 +max(i32, i) +max(i32, i, i) +max(i32, i32) +max(i32, i32, i) +max(i32, i64) +max(i64 % i) +max(i64 % i32) +max(i64 * 0.5) +max(i64 * 1) +max(i64 * f32) +max(i64 * i32) +max(i64 ** 1) +max(i64 ** i64) +max(i64 + 0.5) +max(i64 + f32) +max(i64 + i32) +max(i64 - 0.5) +max(i64 - 1) +max(i64 - f32) +max(i64 - f64) +max(i64 - i) +max(i64 / 1) +max(i64 / f64) +max(i64 / i) +max(i64 / i64) +max(i64 ^ 0.5) +max(i64 ^ 1) +max(i64 ^ i) +max(i64 ^ i64) +max(i64) +max(i64) != f32 +max(i64) != i32 +max(i64) * i32 +max(i64) * i64 +max(i64) ** i64 +max(i64) + f32 +max(i64) + i64 +max(i64) / f32 +max(i64) / i +max(i64) / i64 +max(i64) < f32 +max(i64) < i64 +max(i64) <= i +max(i64) == f32 +max(i64) == f64 +max(i64) >= i32 +max(i64) ^ (i64 / f32) +max(i64) in array +max(i64, 1) * i32 +max(i64, f32) +max(i64, f64) +max(i64, i) +max(i64, i32) +max(i64, i64) max(int(0.5)) -max(int(a)) -max(int(b)) -max(last(arr)) -max(len("a")) -max(len("c"), b) -max(len(obj.head(s))) -max(max(0, f, b, a)) -max(max(2)) -max(max(a, 0.5)) -max(max(b)) -max(max(b, 2, f)) -max(max(f)) +max(int(1)) +max(int(f32)) +max(int(f64)) +max(int(i)) +max(int(i32)) +max(int(i64)) +max(last(array)) +max(len("bar")) +max(len("foo")) +max(len(array)) +max(len(list)) +max(len(list), 0.5 - i) +max(max(0.5)) +max(max(0.5, 0.5)) +max(max(1)) +max(max(f32)) +max(max(f64)) +max(max(i)) +max(max(i32)) +max(max(i64)) max(min(0.5)) -max(min(2)) -max(min(a)) -max(min(a, b)) -max(min(b, 0)) -max(min(f)) -max(true ? a : 0) -min(-(0.5 ^ b)) -min(-0) -min(-2) -min(-a) -min(-b) -min(-f) -min(-f, a) -min(0 % 2) -min(0 % b) -min(0 * a) -min(0 * b, b) -min(0 ** a) -min(0 ** b) -min(0 ** f, f) -min(0 + 0) -min(0 - b) -min(0 / 1) -min(0 / 2) -min(0 / f) -min(0 ^ 0) -min(0) % b -min(0) % obj.b -min(0) * obj?.b -min(0) + b -min(0) - b -min(0) / a -min(0) / obj?.head(a) -min(0) > a / b -min(0) ^ get(arr, a) -min(0, 2) ^ f -min(0.5 * 0) -min(0.5 ** a) -min(0.5 - f) -min(0.5 / a) -min(0.5 / b) -min(0.5 / f) -min(0.5 ^ 0) +max(min(0.5, i)) +max(min(1)) +max(min(1, i64, 1)) +max(min(f32)) +max(min(f64)) +max(min(f64, i64)) +max(min(i)) +max(min(i32)) +max(min(i32, i)) +max(ok ? 1 : foo) +max(ok ? 1 : i) +max(ok ? 1 : i32) +max(ok ? div : foo) +max(ok ? div : i64) +max(ok ? i : true) +max(ok ? ok : i64) +max(ok ? true : 0.5) +max(score(1)) +max(score(1), i64) +max(score(i)) +max(score(i, i)) +max(true ? 0.5 : half) +max(true ? 1 : i64) +max(true ? add : list) +max(true ? foo : add) +max(true ? foo : f32) +max(true ? i : ok) +max(true ? i64 : "bar") +min(-(0.5 + i)) +min(-(f32 + i64)) +min(-0.5) +min(-0.5, i) +min(-1) +min(-1, i) +min(-1, i64) +min(-f32) +min(-f32, i64) +min(-f64) +min(-f64, i32) +min(-i) +min(-i32) +min(-i64) +min(0.5 * 0.5) +min(0.5 * 1) +min(0.5 * f64) +min(0.5 * i32) +min(0.5 ** 0.5) +min(0.5 ** f64) +min(0.5 ** i64) +min(0.5 + 1) +min(0.5 + f32) +min(0.5 + f64) +min(0.5 + i) +min(0.5 - 0.5) +min(0.5 - 1) +min(0.5 - f64) +min(0.5 - i) +min(0.5 / 0.5) +min(0.5 / f64) min(0.5 ^ 1) -min(0.5 ^ a) -min(0.5) != f -min(0.5) * a -min(0.5) ** a -min(0.5) - f -min(0.5) > a -min(1 % b) -min(1 * f) -min(1 ** b) +min(0.5 ^ f32) +min(0.5 ^ i) +min(0.5) != i32 +min(0.5) * 0.5 ** i64 +min(0.5) ** i +min(0.5) + i +min(0.5) + i32 +min(0.5) + i64 +min(0.5) < f32 +min(0.5) <= i ? f32 : 1 +min(0.5) <= i64 +min(0.5) == i - 0.5 +min(0.5) > i64 +min(0.5) >= i +min(0.5, 0.5) == f32 +min(0.5, 1) >= i64 +min(0.5, i) == i64 +min(0.5, i32, f32) + f32 +min(1 % i32) +min(1 % i64) +min(1 * 0.5) +min(1 * 1) +min(1 * i) +min(1 * i32) +min(1 * i64) +min(1 ** 0.5) +min(1 ** f32) +min(1 ** f64) +min(1 ** i32) +min(1 + 0.5) min(1 + 1) -min(1 + a) -min(1 - a) -min(1 / a) -min(1 / b) -min(1 ^ 0) -min(1) .. obj?.b -min(1) == obj.obj -min(1) >= f ? b : arr -min(1) ^ b -min(2 % b + a) -min(2 % b) -min(2 * b) -min(2 ** 0) -min(2 ** f) -min(2 + 0.5) -min(2 - b) -min(2 ^ a) -min(2) ** f -min(a % 1) -min(a % a) -min(a % b) -min(a * a) -min(a * b, int(0)) -min(a * f) -min(a ** 0) -min(a ** a, b) -min(a ** b) -min(a ** f) -min(a - 2) -min(a - a) -min(a - f) -min(a / a) -min(a / b) -min(a ^ 0.5) -min(a ^ b) -min(a ^ obj.a) -min(a) -min(a) != f -min(a) % a -min(a) ** f -min(a) - obj.b -min(a) / b -min(a) < a / 0 -min(a) == a -min(a) > b -min(a) > obj?.a -min(a) >= a ^ b -min(a) >= obj.head(f, nil) -min(a) ^ a -min(a) ^ f -min(a, 0.5 / a) -min(a, 2) ^ f -min(a, a ** f) -min(a, a) -min(a, a) > f ** 0.5 -min(a, b) -min(a, b) != f / a -min(abs(0)) -min(abs(a)) -min(abs(b)) -min(add(0, 0)) -min(add(0, 1)) -min(add(0, 2)) -min(add(0, a)) -min(add(2, b)) -min(add(a, a)) -min(add(a, a), b) -min(add(a, b)) -min(add(b, 0)) -min(add(b, 1)) -min(add(b, a)) -min(add(b, b)) -min(arr[0]) -min(arr[1]) -min(arr[a]) -min(arr[b]) -min(b % a) -min(b * b) -min(b * f) -min(b ** 0) -min(b ** 0.5) -min(b ** a) -min(b + 1) -min(b + a) -min(b + b) -min(b + f) -min(b - 0) -min(b - 0.5) -min(b - a) -min(b / f) -min(b / obj.a) -min(b ^ a) -min(b ^ f) -min(b) -min(b) * obj.a -min(b) * obj.head(f, b) -min(b) ** a -min(b) + div(0, a) -min(b) .. obj.a -min(b) < -f -min(b) <= a / f -min(b) <= len(s) -min(b) == obj.a -min(b) ^ b -min(b, 0) >= b -min(b, 0, f) - b -min(b, 1) != obj?.head(f) -min(b, a - a) -min(b, a) -min(b, a) % obj.b -min(b, a) ^ 0.5 ^ 0.5 -min(b, f) -min(count(arr, ok)) -min(count(map(arr, add), f != nil)) -min(div(0, a) / f) -min(div(0, b)) -min(div(1, a)) -min(div(2, a)) -min(div(2, b)) -min(div(a, 1)) -min(div(a, 2)) -min(div(a, b)) -min(div(a, b), a) -min(div(b, 2)) -min(div(b, b)) -min(f * a, a) -min(f ** 0.5) -min(f ** a) -min(f ** b) -min(f ** f) -min(f - 0.5) -min(f - a) -min(f / 0) -min(f / a) -min(f / b) -min(f / f) -min(f ^ 0) -min(f ^ 0.5) -min(f ^ b) -min(f) -min(f) * a ^ f -min(f) ** obj?.head(b, nil, true, 2, add) -min(f) / obj.a -min(f) > f -min(f, a) -min(f, f) -min(first(arr)) -min(float(0)) -min(float(b)) -min(get(arr, 0)) -min(get(arr, 1)) -min(get(arr, 2)) -min(get(arr, a)) -min(get(arr, b)) -min(indexOf(s, s)) -min(int(0)) +min(1 + f32) +min(1 + i32) +min(1 + i64) +min(1 - 1) +min(1 - f64) +min(1 - i) +min(1 - i32) +min(1 / 1) +min(1 / i) +min(1 / i32) +min(1 / i32, f64) +min(1 / i64) +min(1 ^ 1) +min(1 ^ f32) +min(1 ^ f64) +min(1) != 1 ? list : f64 +min(1) != i +min(1) % i64 +min(1) * -0.5 +min(1) * 1 ** 1 +min(1) - i64 ^ 0.5 +min(1) .. i +min(1) .. i64 +min(1) / f64 +min(1) / i +min(1) < i +min(1) == f64 +min(1) == i32 +min(1) >= i64 +min(1) ^ f32 +min(abs(0.5)) +min(abs(1)) +min(abs(f32)) +min(abs(f64)) +min(abs(i * 1)) +min(abs(i)) +min(abs(i32)) +min(abs(i64)) +min(abs(i64), f64) +min(add(1, i)) +min(add(i, i)) +min(array[1]) +min(array[i]) +min(count(array, false)) +min(count(array, ok)) +min(count(array, true)) +min(count(list, ok)) +min(f32 * 1) +min(f32 * f32) +min(f32 * i32) +min(f32 ** i32) +min(f32 ** i64) +min(f32 ** i64, f32) +min(f32 + f64) +min(f32 + i) +min(f32 + i32) +min(f32 + i64) +min(f32 - f32) +min(f32 - i) +min(f32 - i32) +min(f32 - i64) +min(f32 / 0.5) +min(f32 / f64) +min(f32 / i) +min(f32 / i32) +min(f32 / i64) +min(f32 ^ 1) +min(f32 ^ f32) +min(f32 ^ i) +min(f32 ^ i32) +min(f32) +min(f32) * f32 +min(f32) * f64 +min(f32) + i +min(f32) + i32 +min(f32) + i64 +min(f32) - f32 +min(f32) < i64 +min(f32) == i +min(f32) == i32 * i32 +min(f32) == i64 +min(f32) > i32 +min(f32) ^ f64 +min(f32, 0.5 ^ 0.5) +min(f32, 0.5) <= i64 +min(f32, f32) +min(f32, f64) +min(f32, f64) >= i +min(f32, get(array, i64)) +min(f32, i) +min(f32, i32) +min(f32, i64) +min(f32, len(array)) +min(f32, len(list)) +min(f64 * 0.5) +min(f64 * 1) +min(f64 * f64) +min(f64 * i) +min(f64 * i32) +min(f64 ** 1) +min(f64 ** f64) +min(f64 ** i) +min(f64 ** i32) +min(f64 ** i64) +min(f64 + 1) +min(f64 + i) +min(f64 + i64) +min(f64 - 0.5) +min(f64 - i) +min(f64 - i32) +min(f64 - i64) +min(f64 / 1) +min(f64 / f32) +min(f64 / i) +min(f64 / i32) +min(f64 / i64) +min(f64 ^ 0.5) +min(f64 ^ f64) +min(f64 ^ i32) +min(f64) +min(f64) + f64 +min(f64) + i32 +min(f64) + i64 +min(f64) / f32 +min(f64) ^ 1 ^ 1 +min(f64) ^ i32 +min(f64) ^ i64 +min(f64, 0.5 ** 1) +min(f64, 0.5, i) <= f64 +min(f64, 1 ** i) +min(f64, 1) < i64 +min(f64, f32) +min(f64, f64) +min(f64, f64, i64) +min(f64, i) +min(f64, i32) +min(f64, i64) +min(false ? 1 : add) +min(false ? f64 : false) +min(false ? f64 : score) +min(false ? foo : 1) +min(false ? greet : i) +min(false ? i32 : "foo") +min(false ? i32 : i64) +min(false ? true : 0.5) +min(find(array, false)) +min(find(array, ok)) +min(findIndex(list, ok)) +min(findLast(array, true)) +min(findLastIndex(array, false)) +min(findLastIndex(array, ok)) +min(findLastIndex(array, true)) +min(findLastIndex(list, ok)) +min(first(array)) +min(float(0.5)) +min(float(1)) +min(float(f32)) +min(float(f64)) +min(float(i)) +min(float(i32)) +min(float(i64)) +min(get(array, i)) +min(get(array, i64)) +min(half(0.5 ^ i32)) +min(half(0.5)) +min(half(0.5), f32) +min(half(f64)) +min(i % 1) +min(i % i32) +min(i % i64) +min(i * 0.5) +min(i * 1) +min(i * i) +min(i * i64) +min(i ** 0.5) +min(i ** f32) +min(i ** f64) +min(i ** i) +min(i ** i64) +min(i + 0.5) +min(i + f32) +min(i + f64) +min(i + i) +min(i - 0.5) +min(i - 1) +min(i - i) +min(i / 0.5) +min(i / i64) +min(i / i64, i) +min(i ^ 0.5) +min(i ^ i, i32) +min(i) +min(i) != i32 +min(i) % i +min(i) * f32 +min(i) ** i +min(i) .. i +min(i) / f64 +min(i) < f32 +min(i) <= i64 +min(i, f32) +min(i, f64) +min(i, i) +min(i, i32 - i) +min(i, i32) +min(i, i64 * f32) +min(i, i64) +min(i32 % i) +min(i32 * 1) +min(i32 * f64) +min(i32 * i32) +min(i32 ** 1 ^ i64) +min(i32 ** f32) +min(i32 ** i) +min(i32 ** i64) +min(i32 + 0.5) +min(i32 + 1) +min(i32 + f32) +min(i32 - 0.5) +min(i32 - 1) +min(i32 - i32) +min(i32 / 1) +min(i32 / i) +min(i32 / i64) +min(i32 / i64, score(1)) +min(i32 ^ 1) +min(i32 ^ f64) +min(i32 ^ i) +min(i32 ^ i64) +min(i32) +min(i32) != i64 +min(i32) + f32 +min(i32) - i64 +min(i32) / f32 +min(i32) < i32 +min(i32) == f32 +min(i32) == i32 +min(i32) >= i32 +min(i32) ^ f64 +min(i32, 0.5) .. i32 +min(i32, f32) +min(i32, f64) +min(i32, i) +min(i32, i32) +min(i32, i32, i) +min(i32, i64) +min(i32, i64) .. i +min(i32, i64) <= f64 +min(i32, min(i)) +min(i64 % i32) +min(i64 * 1, f32) +min(i64 * f64) +min(i64 * i32) +min(i64 ** 0.5) +min(i64 ** 1) +min(i64 ** i) +min(i64 + 0.5) +min(i64 + 1) +min(i64 + f32) +min(i64 + i) +min(i64 + i32) +min(i64 - 0.5) +min(i64 - f32) +min(i64 - f64) +min(i64 - i) +min(i64 - i64) +min(i64 / 0.5) +min(i64 / f64) +min(i64 / i) +min(i64 / i64) +min(i64 ^ 1) +min(i64 ^ i32) +min(i64 ^ i64) +min(i64) +min(i64) != i64 +min(i64) % i32 +min(i64) ** -1 +min(i64) ** -f64 +min(i64) ** i +min(i64) + i32 +min(i64) .. i +min(i64) .. i64 +min(i64) <= f32 +min(i64) == i +min(i64) ^ f32 +min(i64) ^ f64 +min(i64) in array +min(i64, 1 ** 0.5) +min(i64, 1) <= f64 +min(i64, f32) +min(i64, f64) +min(i64, f64) != f64 +min(i64, f64) * i32 +min(i64, f64, i32) +min(i64, i) +min(i64, i32) +min(i64, i32, i) +min(i64, i64) +min(i64, i64, f32) +min(int(0.5)) min(int(1)) -min(int(a)) -min(int(b)) -min(last(arr)) -min(len("c")) -min(len(arr)) -min(len(obj)) -min(len(obj?.obj)) -min(len(s)) -min(len(s), a) -min(max(a)) -min(max(b)) -min(max(b, 0.5)) -min(max(f)) +min(int(f32)) +min(int(f64)) +min(int(i)) +min(int(i64)) +min(last(array)) +min(len("bar")) +min(len("foo")) +min(len(array)) +min(len(list)) +min(len(list), f64) +min(max(0.5)) +min(max(1)) +min(max(1, 0.5)) +min(max(1, f32)) +min(max(1, i32)) +min(max(f32)) +min(max(f64)) +min(max(i), i64) +min(max(i32)) +min(min(0.5)) +min(min(0.5, 1)) min(min(1)) -min(min(a)) -min(min(b, 0)) -min(min(f)) -min(min(int(f), b)) -min(ok ? b : 2) -min(ok ? b : a) -min(true ? 2 : 2) -nil != "a" == ok -nil != "a" || b <= 0 -nil != "c" or ok -nil != 0 && obj.a -nil != 0 || ok -nil != 0.5 != ok -nil != a and ok -nil != a or ok -nil != add && b > 0 -nil != add or obj.b -nil != arr != obj.obj -nil != arr or ok -nil != b != obj.obj -nil != b && obj.b -nil != b and ok ? ok : add -nil != b || obj.fn(s, ok).b -nil != div != obj?.head(ok) -nil != div != ok -nil != div and ok -nil != f and f < 2 -nil != f or obj?.obj -nil != false or obj.obj -nil != obj != (ok or ok) -nil != obj && "c" > "b" -nil != obj or ok -nil != obj.a -nil != obj.b -nil != obj.obj -nil != obj.obj.a -nil != obj.obj.obj -nil != obj?.a -nil != obj?.b -nil != obj?.b .. b -nil != obj?.obj -nil != obj?.obj?.b -nil != obj?.obj?.obj -nil != ok ? obj.a : add -nil != s and 0.5 == 2 -nil != s or obj?.fn(1) -nil != s or ok -nil != true ? ok != ok : int("c") -nil == "a" or nil != false -nil == "c" and obj.fn("b", s, a) -nil == a || 2 != b -nil == a || ok -nil == add != obj?.head(nil, add) -nil == add != obj?.obj -nil == add && obj.b -nil == add and obj == nil -nil == arr != true ? b : b -nil == arr && obj.b -nil == arr && obj?.head(obj, nil, a) -nil == arr and obj.head(div(arr, a)?.head(add?.fn(nil), arr ? "c" : 0), 0 matches a.obj) -nil == arr and ok -nil == div || any(arr, true) -nil == f != obj.a -nil == f && obj.a -nil == f and obj.obj -nil == false and nil == arr -nil == false and not false -nil == nil || 0 >= 0 -nil == obj && obj?.obj -nil == obj ? f / b : obj -nil == obj and ok -nil == obj || obj?.a -nil == obj || ok -nil == obj.a -nil == obj.b -nil == obj.head(add) -nil == obj.obj -nil == obj.obj.obj -nil == obj?.a -nil == obj?.b -nil == obj?.obj -nil == obj?.obj.a -nil == obj?.obj.obj -nil == obj[s] -nil == ok && !true -nil == ok && obj?.fn(b) -nil == ok ? s : b -nil == ok and obj.obj -nil == ok and obj?.head("c") -nil == ok or ok -nil == ok || obj.a -nil == ok || ok -nil == s != ok -nil == s and obj?.fn(true, 1) -nil == s or ok -nil == true and {"b": arr}.b -nil in arr && obj.a -nil in arr == ok -nil in arr ? 2 .. 2 : obj -nil in obj && ok -nil in obj or 2 < 0 -nil in obj.obj -nil in obj?.head(obj) -nil in obj?.obj -nil in obj?.obj?.obj -none(0 .. a, ok) -none(1 .. b, ok) -none([true], ok) -none(a .. 0, obj.a) -none(a .. a, "b" > "b") -none(a .. a, nil == obj) -none(arr, "a" < s) -none(arr, "a" contains s) -none(arr, "a" startsWith s) -none(arr, 0 < 1) -none(arr, 0 <= b) -none(arr, 0 == nil) -none(arr, 0 > 0.5) -none(arr, 0 >= 0) -none(arr, 0 >= b) -none(arr, 0.5 < b) -none(arr, 0.5 == b) -none(arr, 0.5 >= 0) -none(arr, 1 != a) -none(arr, 1 <= b) -none(arr, 1 in arr) -none(arr, 2 <= a) -none(arr, a != 0) -none(arr, a != 2) -none(arr, a != a) -none(arr, a != nil) -none(arr, a < 0) -none(arr, a < f) -none(arr, a <= 0.5) -none(arr, a == nil) -none(arr, a in arr) -none(arr, add != add) -none(arr, add == nil) -none(arr, all(arr, ok)) -none(arr, arr != arr) -none(arr, b != get(arr, 0)) -none(arr, b < 0) -none(arr, b < f) -none(arr, b == a) -none(arr, b >= a) -none(arr, div != obj.obj) -none(arr, div == div) -none(arr, f != 0) -none(arr, f != nil) -none(arr, f == 0.5) -none(arr, f > f) -none(arr, false) and ok -none(arr, nil != add) -none(arr, nil != b) -none(arr, nil != f) -none(arr, nil == 0) -none(arr, nil == arr) -none(arr, nil == f) -none(arr, nil == obj) -none(arr, none(arr, false)) -none(arr, not ok) -none(arr, obj.head(false, "b", nil)) -none(arr, obj?.head(false)) -none(arr, obj?.obj == (true and false)) -none(arr, ok ? true : b) -none(arr, ok and false) -none(arr, ok or ok) -none(arr, ok || false) -none(arr, ok) -none(arr, ok) && obj.obj -none(arr, ok) && obj?.obj -none(arr, ok) == obj.b -none(arr, ok) == obj?.obj -none(arr, ok) == ok -none(arr, s != "b") -none(arr, s != "c") -none(arr, s != s) -none(arr, s endsWith "c") -none(arr, s matches s) -none(arr, s startsWith "c") -none(arr, true) != obj.b -none(arr, true) and obj.b -none(arr, true) or obj.head(s, arr) -none(b .. 0, obj.a) -none(b .. 2, ok) -none(false ? 0.5 : arr, s <= "b") -none(filter(arr, ok), any(arr, ok)) -none(filter(arr, ok), ok and false) -none(keys(obj), nil == obj) -none(map(arr, "b"), f < b) -none(map(arr, add), 0 == f) -none(map(arr, add), b > a) -none(map(arr, b), ok) -none(map(arr, f), ok) -none(map(arr, false), #) -none(map(arr, false), ok) -none(map(arr, obj), s > s) -none(map(arr, ok), "b" <= "b") -none(map(arr, ok), #) -none(map(arr, s), b != nil) -none(map(arr, s), ok && ok) -none(map(arr, s), ok || ok) -none(obj.head(arr), nil == s) -none(obj.head(obj), s matches "b") -none(obj.head(obj, true), ok) -none(obj.head(s), !ok) -none(obj.obj, 1 < f) -none(obj.obj, b != a) -none(obj.obj, b == b) -none(obj.obj, nil != arr) -none(obj.obj, ok and true) -none(obj.obj, ok) -none(obj.obj, s endsWith s) -none(obj.obj, s matches s) -none(obj.obj, true ? ok : "c") -none(obj?.head("a"), 1 <= 0.5) -none(obj?.head("b", nil), ok) -none(obj?.head("b", true), f < f) -none(obj?.head(obj, b, obj), ok) -none(obj?.head(obj, nil), ok) -none(obj?.obj, !ok) -none(obj?.obj, 1 > b) -none(obj?.obj, a != f) -none(obj?.obj, a > f) -none(obj?.obj, div != add) -none(obj?.obj, f < 0.5) -none(obj?.obj, f >= f) -none(obj?.obj, ok != false) -none(obj?.obj, ok) -none(obj?.obj, s contains "b") -none(obj?.obj, s startsWith s) -none(obj?.obj, true == false) -none(obj?.obj.obj, ok) -none(ok ? "b" : false, ok == ok) -not !!true -not !(nil == 0.5) -not !all(arr, true) +min(min(f32)) +min(min(f32, i, i32)) +min(min(f64)) +min(min(i)) +min(min(i32)) +min(min(i64)) +min(ok ? add : 0.5) +min(ok ? f32 : "foo") +min(ok ? f64 : true) +min(ok ? foo : 1) +min(ok ? true : 1) +min(score(1)) +min(score(i)) +min(true ? 0.5 : ok) +min(true ? 1 : greet) +min(true ? add : greet) +min(true ? f32 : i) +min(true ? foo : 0.5) +min(true ? foo : half) +min(true ? i : 1) +min(true ? i32 : score) +nil != "bar" ? i64 : 0.5 - i +nil != 0.5 && 0.5 != f32 +nil != 1 && ok +nil != 1 or any(list, false) +nil != 1 || ok +nil != f32 || ok +nil != f64 && ok +nil != f64 or ok +nil != f64 || array != array +nil != false and not true +nil != false and ok +nil != false || ok +nil != foo == ok +nil != foo || ok +nil != foo.Bar +nil != foo.Qux +nil != foo.String +nil != foo?.Bar +nil != foo?.Qux +nil != foo?.String +nil != greet ? half : half +nil != greet or f32 < i +nil != i32 or f32 >= 1 +nil != i64 or i >= 1 +nil != ok == not true +nil != true == ok +nil == 1 != nil ? "bar" : i32 +nil == add == ("bar" not endsWith "foo") +nil == f32 && i64 < f64 +nil == foo.Bar +nil == foo.Qux +nil == foo.String +nil == foo.String() +nil == foo?.Bar +nil == foo?.Qux +nil == foo?.String +nil == foo?.String() +nil == i64 ? add : add +nil == nil == ok +nil == true ? i64 ^ f32 : foo +nil == true || ok +nil in array || ok +nil in array[i32:i64] +nil in list and ok +none(array, !ok) +none(array, !true) +none(array, "bar" == "bar") +none(array, # != #) +none(array, # != 1) +none(array, # != f32) +none(array, # != f64) +none(array, # != i32) +none(array, # != i64) +none(array, # < #) +none(array, # < 0.5) +none(array, # < 1) +none(array, # < f32) +none(array, # < i) +none(array, # < i32) +none(array, # < i64) +none(array, # <= #) +none(array, # <= 0.5) +none(array, # <= 1) +none(array, # <= f32) +none(array, # <= i) +none(array, # <= i32) +none(array, # == #) +none(array, # == 0.5) +none(array, # == 1) +none(array, # == i) +none(array, # == nil) +none(array, # > #) +none(array, # > 0.5) +none(array, # > f32) +none(array, # > f64) +none(array, # > i) +none(array, # > i32) +none(array, # >= #) +none(array, # >= 0.5) +none(array, # >= 1) +none(array, # >= f32) +none(array, # >= f64) +none(array, # in array) +none(array, # not in array) +none(array, 0.5 != #) +none(array, 0.5 != f32) +none(array, 0.5 < #) +none(array, 0.5 <= 0.5) +none(array, 0.5 <= 1) +none(array, 0.5 <= i) +none(array, 0.5 > #) +none(array, 0.5 >= #) +none(array, 1 != #) +none(array, 1 < #) +none(array, 1 < 0.5) +none(array, 1 < i) +none(array, 1 < i64) +none(array, 1 <= 1) +none(array, 1 == #) +none(array, 1 == f64) +none(array, 1 > #) +none(array, 1 > f64) +none(array, 1 >= i) +none(array, add != greet) +none(array, all(array, true)) +none(array, div == greet) +none(array, f32 != #) +none(array, f32 != nil) +none(array, f32 <= #) +none(array, f32 >= #) +none(array, f64 != #) +none(array, f64 == #) +none(array, f64 >= 0.5) +none(array, half != nil) +none(array, i < #) +none(array, i < 1) +none(array, i <= #) +none(array, i == i64) +none(array, i not in array) +none(array, i32 != #) +none(array, i32 != f64) +none(array, i32 != nil) +none(array, i32 < #) +none(array, i32 > #) +none(array, i32 >= #) +none(array, i64 < #) +none(array, i64 < f64) +none(array, i64 >= #) +none(array, nil != 0.5) +none(array, nil != div) +none(array, nil == #) +none(array, nil == 1) +none(array, nil == div) +none(array, none(array, !true)) +none(array, not ok) +none(array, ok == nil) +none(array, ok) +none(array, ok) != ok +none(array, ok) ? f32 : !ok +none(array, score == nil) +none(array, score == score) +none(array, true ? ok : f64) +none(array, true or true) +none(i64 .. i32, # > #) +none(list, "bar" not in #) +none(list, # != #) +none(list, # != foo) +none(list, # != nil) +none(list, # == #) +none(list, # == nil) +none(list, 0.5 != i) +none(list, 0.5 <= 1) +none(list, 0.5 <= f64) +none(list, 0.5 == nil) +none(list, 1 < i32) +none(list, 1 == f32) +none(list, any(list, ok)) +none(list, array == nil) +none(list, f32 > i) +none(list, f64 == i32) +none(list, false && false) +none(list, false) or f64 >= i64 +none(list, foo != #) +none(list, foo == #) +none(list, greet != add) +none(list, greet != half) +none(list, i <= i64) +none(list, i >= 1) +none(list, i >= f64) +none(list, i not in array) +none(list, i32 != nil) +none(list, i32 == f64) +none(list, i32 == nil) +none(list, i32 >= 1) +none(list, i32 >= f32) +none(list, i64 < f64) +none(list, i64 <= f64) +none(list, i64 > f64) +none(list, i64 > i64) +none(list, nil != array) +none(list, nil != true) +none(list, nil == foo) +none(list, not false) +none(list, not ok) +none(list, ok) +none(list, one(array, false)) +none(list, score != nil) +none(list, score == add) +none(list, true && ok) +none(list, true == ok) +none(list, true) ? div : array +none(map(array, "bar"), # not endsWith #) +none(map(array, "foo"), # not endsWith #) +none(map(array, #), ok) +none(map(array, 0.5), # == #) +none(map(array, 1), # >= #) +none(map(array, half), # == #) +none(map(array, ok), #) +none(map(list, "bar"), # not startsWith #) +none(map(list, "bar"), # startsWith #) +none(map(list, #), # != #) +none(map(list, #), ok) +none(map(list, i32), f64 > #) +none(map(list, true), # != #) +none(ok ? "bar" : ok, # >= f64) +not !("foo" not matches "foo") +not !(0.5 > 1) +not !(f64 >= i32) +not !(false && ok) +not !(i >= i32) not !false not !ok not !true -not ("a" != "b") -not ("a" != nil) -not ("a" <= "c") -not ("a" <= s) -not ("a" == "a") -not ("a" == "c") -not ("a" == nil) -not ("a" > s) -not ("a" >= s) -not ("a" contains "a") -not ("a" contains "b") -not ("a" contains s) -not ("a" endsWith "b") -not ("a" endsWith s) -not ("a" in obj) -not ("a" matches "c") -not ("a" startsWith "a") -not ("a" startsWith "b") -not ("b" != "a") -not ("b" != nil) -not ("b" <= "a") -not ("b" <= "c") -not ("b" <= s) -not ("b" == "a") -not ("b" == "c") -not ("b" == nil) -not ("b" == s) -not ("b" > s) -not ("b" >= s) -not ("b" contains "a") -not ("b" contains "b") -not ("b" contains s) -not ("b" endsWith "a") -not ("b" endsWith "b") -not ("b" endsWith s) -not ("b" in obj) -not ("b" matches "b") -not ("b" startsWith "b") -not ("b" startsWith s) -not ("c" != "a") -not ("c" != s) -not ("c" <= "c") -not ("c" == "a") -not ("c" > "b") -not ("c" >= "a") -not ("c" >= s) -not ("c" contains "a") -not ("c" contains "c") -not ("c" contains s) -not ("c" endsWith s) -not ("c" in obj) -not ("c" matches "a") -not ("c" matches "b") -not ("c" matches s) -not ("c" startsWith s) -not (-0.5 < a) -not (0 != 0) -not (0 != 2) -not (0 != a) -not (0 != b) -not (0 != f) -not (0 != nil) -not (0 < 0.5) -not (0 < 2) -not (0 < a) -not (0 < b) -not (0 < f) -not (0 <= 0) -not (0 <= 0.5) -not (0 <= 1) -not (0 <= a) -not (0 <= b) -not (0 <= f) -not (0 == 0.5) -not (0 == 1) -not (0 == 2) -not (0 == a) -not (0 == f) -not (0 == nil) -not (0 > 0) -not (0 > 0.5) -not (0 > 2) -not (0 > a) -not (0 > b) -not (0 > f) -not (0 >= 0) -not (0 >= 0.5) -not (0 >= 1) -not (0 >= 2) -not (0 >= a) -not (0 >= b) -not (0 >= f) -not (0 in arr) -not (0.5 != 0) +not ("bar" != "foo") +not ("bar" != nil) +not ("bar" < "foo") +not ("bar" <= "bar") +not ("bar" <= "foo") +not ("bar" == "bar") +not ("bar" == "foo") +not ("bar" == nil) +not ("bar" > "bar") +not ("bar" > "foo") +not ("bar" >= "bar") +not ("bar" >= "foo") +not ("bar" contains "bar") +not ("bar" contains "foo") +not ("bar" endsWith "bar") +not ("bar" endsWith "foo") +not ("bar" in foo) +not ("bar" matches "bar") +not ("bar" not contains "bar") +not ("bar" not contains "foo") +not ("bar" not endsWith "bar") +not ("bar" not endsWith "foo") +not ("bar" not in foo) +not ("bar" not matches "bar") +not ("bar" not matches "foo") +not ("bar" startsWith "bar") +not ("bar" startsWith "foo") +not ("foo" != "bar") +not ("foo" != "foo") +not ("foo" != nil) +not ("foo" < "bar") +not ("foo" < "foo") +not ("foo" <= "bar") +not ("foo" <= "foo") +not ("foo" == "bar") +not ("foo" == "foo") +not ("foo" == nil) +not ("foo" > "bar") +not ("foo" > "foo") +not ("foo" >= "foo") +not ("foo" contains "foo") +not ("foo" endsWith "bar") +not ("foo" endsWith "foo") +not ("foo" in foo) +not ("foo" matches "bar") +not ("foo" matches "foo") +not ("foo" not contains "bar") +not ("foo" not contains "foo") +not ("foo" not endsWith "bar") +not ("foo" not endsWith "foo") +not ("foo" not in foo) +not ("foo" not matches "bar") +not ("foo" not matches "foo") +not ("foo" not startsWith "bar") +not ("foo" not startsWith "foo") +not ("foo" startsWith "foo") not (0.5 != 0.5) -not (0.5 != a) -not (0.5 != b) -not (0.5 != f) +not (0.5 != 1) +not (0.5 != f64) +not (0.5 != i) +not (0.5 != i32) +not (0.5 != i64) not (0.5 != nil) not (0.5 < 0.5) -not (0.5 < a) -not (0.5 < b) -not (0.5 < f) -not (0.5 <= 0) -not (0.5 <= a) -not (0.5 <= b) -not (0.5 == 0) +not (0.5 < 1) +not (0.5 < f32) +not (0.5 < f64) +not (0.5 < i) +not (0.5 < i32) +not (0.5 < i64) +not (0.5 <= 0.5) +not (0.5 <= 1) +not (0.5 <= f32) +not (0.5 <= f64) +not (0.5 <= i) +not (0.5 <= i32) +not (0.5 <= i64) not (0.5 == 0.5) -not (0.5 == 2) -not (0.5 == a) -not (0.5 == b) -not (0.5 == f) +not (0.5 == 1) +not (0.5 == f32) +not (0.5 == f64) +not (0.5 == i) +not (0.5 == i32) +not (0.5 == i64) not (0.5 == nil) -not (0.5 > 0) +not (0.5 > 0.5) not (0.5 > 1) -not (0.5 > a) -not (0.5 > b) -not (0.5 > f) -not (0.5 >= 0) +not (0.5 > f32) +not (0.5 > f64) +not (0.5 > i) +not (0.5 > i32) +not (0.5 > i64) not (0.5 >= 0.5) -not (0.5 >= a) -not (0.5 >= b) -not (0.5 >= f) -not (1 != 0) -not (1 != b) -not (1 != f) +not (0.5 >= 1) +not (0.5 >= f32) +not (0.5 >= f64) +not (0.5 >= i) +not (0.5 >= i32) +not (0.5 >= i64) +not (1 != 0.5) +not (1 != 1) +not (1 != f32) +not (1 != f64) +not (1 != i) +not (1 != i32) +not (1 != i64) not (1 != nil) -not (1 < 0) -not (1 < a) -not (1 < f) -not (1 <= f) +not (1 + i > 0.5 ** i32) +not (1 < 0.5) +not (1 < 1) +not (1 < f32) +not (1 < f64) +not (1 < i) +not (1 < i32) +not (1 < i64) +not (1 <= 0.5) +not (1 <= 1) +not (1 <= f32) +not (1 <= f64) +not (1 <= i) +not (1 <= i32) +not (1 <= i64) not (1 == 0.5) -not (1 == b) -not (1 == f) +not (1 == 1) +not (1 == f32) +not (1 == f64) +not (1 == i) +not (1 == i64) +not (1 == nil) not (1 > 0.5) -not (1 > b) -not (1 > f) -not (1 >= 0) +not (1 > 1) +not (1 > f32) +not (1 > f64) +not (1 > i) +not (1 > i32) +not (1 > i64) not (1 >= 0.5) -not (1 >= 2) -not (1 >= a) -not (1 >= f) -not (1 in arr) -not (2 != 0.5) -not (2 != 2) -not (2 != a) -not (2 != f) -not (2 != nil) -not (2 < 0.5) -not (2 < b) -not (2 < f) -not (2 <= 0.5) -not (2 <= b) -not (2 <= f) -not (2 == a) -not (2 > 0) -not (2 > 1) -not (2 > a) -not (2 > b) -not (2 > f) -not (2 >= a) -not (2 >= b) -not (2 >= b) && ok -not (2 in arr) -not (a != 0) -not (a != 0.5) -not (a != 2) -not (a != a) -not (a != b) -not (a != f) -not (a < 0) -not (a < 1) -not (a < 2) -not (a < a) -not (a < b) -not (a < f) -not (a <= 0) -not (a <= 0.5) -not (a <= 1) -not (a <= a) -not (a <= b) -not (a <= f) -not (a == 0) -not (a == 0.5) -not (a == 1) -not (a == 2) -not (a == a) -not (a == b) -not (a == f) -not (a == nil) -not (a > 0) -not (a > 1) -not (a > a) -not (a > b) -not (a > f) -not (a >= 0) -not (a >= 0.5) -not (a >= 1) -not (a >= a) -not (a >= b) -not (a >= f) -not (a in arr) +not (1 >= 1) +not (1 >= f32) +not (1 >= f64) +not (1 >= i) +not (1 >= i32) +not (1 >= i64) +not (1 ^ f32 != i64) +not (1 in array) +not (1 not in array) +not (abs(i) <= i) not (add != add) not (add != div) +not (add != greet) +not (add != half) not (add != nil) +not (add != score) not (add == add) not (add == div) +not (add == greet) +not (add == half) not (add == nil) -not (arr != arr) -not (arr != nil) -not (arr == arr) -not (arr == nil) -not (b != 0) -not (b != 0.5) -not (b != 1) -not (b != 2) -not (b != a) -not (b != b) -not (b != f) -not (b != nil) -not (b ** 0 >= a) -not (b < 0) -not (b < 0.5) -not (b < a) -not (b < b) -not (b < f) -not (b <= 0.5) -not (b <= 1) -not (b <= 2) -not (b <= a) -not (b <= b) -not (b <= f) -not (b == 0) -not (b == 0.5) -not (b == 1) -not (b == 2) -not (b == a) -not (b == b) -not (b == f) -not (b == nil) -not (b > 0) -not (b > 1) -not (b > 2) -not (b > a) -not (b > b) -not (b > f) -not (b >= 0) -not (b >= 0.5) -not (b >= a) -not (b >= b) -not (b >= f) -not (b in arr) +not (add == score) +not (array != array) +not (array != list) +not (array != nil) +not (array == array) +not (array == list) +not (array == nil) not (div != add) not (div != div) +not (div != greet) +not (div != half) not (div != nil) +not (div != score) not (div == add) not (div == div) +not (div == greet) +not (div == half) not (div == nil) -not (f != 0) -not (f != 0.5) -not (f != a) -not (f != b) -not (f != f) -not (f < 0) -not (f < 1) -not (f < 2) -not (f < a) -not (f < b) -not (f < f) -not (f <= 1) -not (f <= a) -not (f <= b) -not (f <= f) -not (f == 0) -not (f == 0.5) -not (f == 1) -not (f == 2) -not (f == a) -not (f == b) -not (f == f) -not (f == nil) -not (f > 0) -not (f > 0.5) -not (f > 1) -not (f > 2) -not (f > a) -not (f > b) -not (f > f) -not (f > obj.b) -not (f >= 0) -not (f >= 1) -not (f >= 2) -not (f >= a) -not (f >= b) -not (f >= f) +not (div == score) +not (f32 != 0.5) +not (f32 != 1) +not (f32 != f32) +not (f32 != f64) +not (f32 != i) +not (f32 != i32) +not (f32 != i64) +not (f32 != nil) +not (f32 < 0.5) +not (f32 < 1) +not (f32 < abs(0.5)) +not (f32 < f32) +not (f32 < f64) +not (f32 < i) +not (f32 < i32) +not (f32 < i64) +not (f32 <= 0.5) +not (f32 <= 1) +not (f32 <= f32) +not (f32 <= f64) +not (f32 <= i) +not (f32 <= i32) +not (f32 <= i64) +not (f32 == 0.5) +not (f32 == 1) +not (f32 == f32) +not (f32 == f64) +not (f32 == i32) +not (f32 == i64) +not (f32 == nil) +not (f32 > 0.5) +not (f32 > 1) +not (f32 > f32) +not (f32 > f64) +not (f32 > i32) +not (f32 >= 0.5) +not (f32 >= 1) +not (f32 >= f32) +not (f32 >= f64) +not (f32 >= i) +not (f32 >= i64) +not (f64 != 0.5) +not (f64 != 1 * 0.5) +not (f64 != 1) +not (f64 != f32) +not (f64 != f64) +not (f64 != i) +not (f64 != i32) +not (f64 != i64) +not (f64 != nil) +not (f64 < 0.5) +not (f64 < 1) +not (f64 < f32) +not (f64 < f64) +not (f64 < i) +not (f64 < i32) +not (f64 < i64) +not (f64 <= 0.5) +not (f64 <= 1) +not (f64 <= f32) +not (f64 <= f64) +not (f64 <= i32) +not (f64 <= i64) +not (f64 == 0.5) +not (f64 == 1) +not (f64 == f32) +not (f64 == f64) +not (f64 == i) +not (f64 == i32) +not (f64 == i64 - f32) +not (f64 == nil) +not (f64 > 0.5) +not (f64 > 1) +not (f64 > f32) +not (f64 > f64) +not (f64 > i) +not (f64 > i64) +not (f64 >= 0.5) +not (f64 >= 1) +not (f64 >= f32) +not (f64 >= f64) +not (f64 >= i) +not (f64 >= i32) +not (f64 >= i64) not (false != false) not (false != nil) not (false != ok) +not (false != true) not (false && ok) not (false && true) +not (false == false) not (false == nil) -not (false == ok) not (false == true) +not (false and false) not (false and true) not (false or false) +not (false or ok) +not (false or true) not (false || false) not (false || ok) not (false || true) -not (nil != "b") -not (nil != "c") -not (nil != 0) -not (nil != 2) -not (nil != a) +not (foo != foo) +not (foo != nil) +not (foo == foo) +not (foo == nil) +not (foo in list) +not (foo not in list) +not (greet != add) +not (greet != div) +not (greet != greet) +not (greet != half) +not (greet != nil) +not (greet != score) +not (greet == add) +not (greet == div) +not (greet == greet) +not (greet == half) +not (greet == nil) +not (greet == score) +not (half != add) +not (half != div) +not (half != greet) +not (half != nil) +not (half != score) +not (half == add) +not (half == div) +not (half == greet) +not (half == half) +not (half == nil) +not (half == score) +not (i != 0.5) +not (i != 1) +not (i != f32) +not (i != f64) +not (i != i) +not (i != i32) +not (i != i64) +not (i != nil) +not (i < 0.5) +not (i < 1) +not (i < f32) +not (i < f64) +not (i < i) +not (i < i32) +not (i < i64) +not (i <= 0.5) +not (i <= 1) +not (i <= f32) +not (i <= f64) +not (i <= i32) +not (i <= i64) +not (i == 0.5) +not (i == 1) +not (i == f32) +not (i == f64) +not (i == i) +not (i == i32) +not (i == nil) +not (i > 0.5) +not (i > 1) +not (i > f32) +not (i > f64) +not (i > i) +not (i > i64) +not (i >= 0.5) +not (i >= 1) +not (i >= div(1, 1)) +not (i >= f32) +not (i >= f64) +not (i >= i) +not (i >= i64) +not (i in array) +not (i not in array) +not (i32 != 0.5) +not (i32 != 1) +not (i32 != f32) +not (i32 != f64) +not (i32 != i) +not (i32 != i64) +not (i32 != nil) +not (i32 < 0.5) +not (i32 < 1) +not (i32 < f64) +not (i32 < i) +not (i32 < i32) +not (i32 < i64) +not (i32 <= 0.5) +not (i32 <= 1) +not (i32 <= f32) +not (i32 <= f64) +not (i32 <= i) +not (i32 <= i32) +not (i32 <= i64) +not (i32 == 0.5) +not (i32 == 1) +not (i32 == f32) +not (i32 == f64) +not (i32 == i) +not (i32 == i32) +not (i32 == i64) +not (i32 == nil) +not (i32 > 0.5) +not (i32 > 1) +not (i32 > f32) +not (i32 > f64) +not (i32 > i) +not (i32 > i32) +not (i32 > i64) +not (i32 >= 0.5) +not (i32 >= 1) +not (i32 >= f32) +not (i32 >= f64) +not (i32 >= i) +not (i32 >= i32) +not (i32 >= i64) +not (i32 in array) +not (i64 != 0.5) +not (i64 != 1) +not (i64 != f32) +not (i64 != f64) +not (i64 != i) +not (i64 != i32) +not (i64 != i64) +not (i64 != nil) +not (i64 < 0.5) +not (i64 < 1) +not (i64 < f32) +not (i64 < f64) +not (i64 < i) +not (i64 < i32) +not (i64 < i64) +not (i64 < int(f64)) +not (i64 <= 0.5) +not (i64 <= 1) +not (i64 <= f32) +not (i64 <= f64) +not (i64 <= i) +not (i64 <= i64) +not (i64 == 0.5) +not (i64 == 1) +not (i64 == f32) +not (i64 == f64) +not (i64 == i) +not (i64 == i32) +not (i64 == i64) +not (i64 == nil) +not (i64 > 0.5) +not (i64 > 1) +not (i64 > f64) +not (i64 > i) +not (i64 > i32) +not (i64 > i64) +not (i64 >= 0.5) +not (i64 >= 1) +not (i64 >= f32) +not (i64 >= f64) +not (i64 >= i) +not (i64 >= i32) +not (i64 >= max(i)) +not (i64 in array) +not (i64 not in array) +not (list != array) +not (list != list) +not (list != nil) +not (list == array) +not (list == list) +not (list == nil) +not (nil != "bar") +not (nil != "foo") +not (nil != 0.5) +not (nil != 1) not (nil != add) -not (nil != arr) -not (nil != b) +not (nil != array) not (nil != div) -not (nil != f) +not (nil != f32) +not (nil != f64) +not (nil != false) +not (nil != foo) +not (nil != greet) +not (nil != half) +not (nil != i) +not (nil != i32) +not (nil != i64) +not (nil != list) not (nil != nil) -not (nil != obj) not (nil != ok) -not (nil != s) +not (nil != score) not (nil != true) -not (nil == "b") -not (nil == 0) +not (nil == "bar") +not (nil == "foo") not (nil == 0.5) -not (nil == a) +not (nil == 1) not (nil == add) -not (nil == arr) -not (nil == b) +not (nil == array) not (nil == div) -not (nil == f) +not (nil == f32) +not (nil == f64) not (nil == false) +not (nil == foo) +not (nil == greet) +not (nil == half) +not (nil == i) +not (nil == i32) +not (nil == i64) +not (nil == list) not (nil == nil) -not (nil == obj) not (nil == ok) -not (nil == s) +not (nil == score) not (nil == true) -not (nil in arr) -not (nil in obj) -not (obj != nil) -not (obj != obj) -not (obj == nil) -not (obj == obj) -not (obj.b != a ** a) -not (obj.b == ok) -not (obj.head(a) ** f <= f) -not (obj.head(b, div) == s) -not (obj.obj == f) -not (obj?.a != f ** 1) -not (obj?.b < b) -not (obj?.b == ok) +not (nil in array) +not (nil in list) +not (nil not in array) +not (nil not in list) not (ok != false) not (ok != nil) not (ok != ok) @@ -11205,9137 +11793,4584 @@ not (ok && ok) not (ok && true) not (ok == false) not (ok == nil) +not (ok == ok) not (ok == true) not (ok and false) not (ok and ok) not (ok and true) not (ok or false) not (ok or ok) -not (ok || obj.b) +not (ok or true) not (ok || ok) not (ok || true) -not (s != "a") -not (s != "b") -not (s != "c") -not (s != nil) -not (s != s) -not (s < "a") -not (s < "b") -not (s < "c") -not (s < s) -not (s <= "a") -not (s <= "b") -not (s <= "c") -not (s <= s) -not (s == "a") -not (s == "b") -not (s == "c") -not (s == nil) -not (s == s) -not (s > "c") -not (s > s) -not (s >= "a") -not (s >= "b") -not (s >= "c") -not (s >= s) -not (s contains "c") -not (s contains s) -not (s endsWith "a") -not (s endsWith "b") -not (s endsWith lower("b")) -not (s endsWith s) -not (s in obj) -not (s matches "a") -not (s matches "c") -not (s matches s) -not (s startsWith "a") -not (s startsWith "b") -not (s startsWith s) +not (score != add) +not (score != div) +not (score != greet) +not (score != half) +not (score != nil) +not (score != score) +not (score == add) +not (score == div) +not (score == greet) +not (score == half) +not (score == nil) +not (score == score) not (true != false) not (true != nil) not (true != ok) not (true != true) -not (true && false) +not (true && ok) not (true && true) not (true == nil) not (true == ok) not (true == true) not (true and false) not (true and ok) +not (true and true) not (true or false) not (true or ok) -not (true or true) -not (true || ok) -not (true || true) -not all(arr, false) -not all(arr, ok) -not all(arr, true) -not any(arr, false) -not any(arr, ok) -not any(arr, true) -not false ? "a" : obj -not false ? "c" : 0.5 -not false ? 0 : obj.obj -not false ? 0.5 : 0.5 -not false ? 0.5 : a -not false ? 2 : 1 -not false ? a : div -not false ? a : s -not false ? add : 2 -not false ? add : obj -not false ? arr : arr -not false ? b : div -not false ? b : ok -not false ? b : s -not false ? div : nil -not false ? div : ok -not false ? f : "a" -not false ? f : 0 -not false ? f : 1 -not false ? false : s -not false ? nil : "b" -not false ? nil : f -not false ? obj : "c" -not false ? obj : add -not false ? ok : nil -not false ? ok : ok -not false ? s : 0 -not false ? s : add -not false ? s : b -not false ? s : obj -not false ? s : true -not false ? true : false -not false and obj.head(add) -not false and obj?.obj.obj -not false or b == nil -not false or obj?.fn(false) -not false or obj?.head(arr, obj)?.b -not false or obj?.obj -not false || a <= b -not hasPrefix(s, "c") -not hasSuffix("a", "a") -not hasSuffix(s, "a") -not none(arr, false) -not none(arr, ok) -not none(arr, true) -not not (f > f) -not not (nil == div) +not (true || false) +not all(array, ok) +not all(array, true) +not all(list, false) +not all(list, ok) +not all(list, true) +not any(array, false) +not any(array, ok) +not any(array, true) +not any(list, # != #) +not any(list, false) +not any(list, ok) +not any(list, true) +not false && ok +not false && ok ? list : array +not false ? "bar" : 0.5 +not false ? "bar" : foo +not false ? "foo" : 0.5 +not false ? 0.5 : greet +not false ? 1 : div +not false ? 1 : i32 +not false ? add : i +not false ? array : "foo" +not false ? array : array +not false ? array : greet +not false ? array : ok +not false ? div : greet +not false ? foo : 1 +not false ? foo : array +not false ? greet : ok +not false ? half : 0.5 +not false ? half : i32 +not false ? i : i64 +not false ? i : score +not false ? i32 : 0.5 +not false ? i32 : add +not false ? i32 : f32 +not false ? i32 : true +not false ? i64 : list +not false ? list : i32 +not false ? nil : greet +not false ? nil : i32 +not false ? nil : nil +not false ? ok : "bar" +not false ? ok : 1 +not false ? ok : list +not false ? score : "foo" +not false ? score : array +not false ? score : score +not false ? score : true +not false ? true : 0.5 +not false ? true : 1 +not false ? true : nil +not false or "foo" > "bar" +not none(array, # == #) +not none(array, false) +not none(array, ok) +not none(array, true) +not none(list, false) +not none(list, ok) +not none(list, true) +not not ("bar" >= "foo") +not not (1 < i) +not not (add == nil) +not not (half == nil) not not false -not not obj.head(ok, ok) not not ok not not true -not obj.head(f != true) -not obj.head(false) -not obj.head(false, add) -not obj.head(false, div) -not obj.head(obj, arr, b, nil).head(f <= 0) -not obj.head(ok) -not obj.head(ok, a) -not obj.head(ok, add, a, s) -not obj.head(ok, b, s) -not obj.head(ok, div) -not obj.head(true == "c") -not obj.head(true) -not obj?.head(0.5 <= a) -not obj?.head(false) -not obj?.head(false, 1) -not obj?.head(false, b) -not obj?.head(false, nil) -not obj?.head(ok) -not obj?.head(ok, "c") -not obj?.head(ok, 0) -not obj?.head(ok, a) -not obj?.head(ok, div) -not obj?.head(ok, div, a) -not obj?.head(ok, f, true) -not obj?.head(ok, s) -not obj?.head(true) not ok -not ok != obj.obj -not ok != obj.obj?.obj -not ok != ok -not ok && obj.obj -not ok && obj?.b -not ok && obj?.head(b).a -not ok && s > obj?.a -not ok == obj?.a -not ok == obj?.b +not ok && ok not ok == ok -not ok ? "a" : b -not ok ? "a" : f -not ok ? "b" : a -not ok ? "b" : f -not ok ? "b" : s -not ok ? "c" : a -not ok ? 0 : obj -not ok ? 0 : true -not ok ? 0.5 : false -not ok ? 1 : b -not ok ? 1 : f -not ok ? 1 : true -not ok ? 2 : div -not ok ? 2 : true -not ok ? a : 1 -not ok ? a : a -not ok ? a : obj -not ok ? a : s -not ok ? add : 1 -not ok ? add : b -not ok ? add : nil -not ok ? add : s -not ok ? arr : nil -not ok ? arr : ok -not ok ? arr : true -not ok ? b : a -not ok ? b : add -not ok ? b : div -not ok ? b : obj +not ok ? "bar" : 1 +not ok ? "bar" : f32 +not ok ? 0.5 + f64 : half +not ok ? 0.5 : "foo" +not ok ? 0.5 : 0.5 +not ok ? 0.5 : div +not ok ? 0.5 : f32 +not ok ? 0.5 : greet +not ok ? 1 : 1 +not ok ? add : 0.5 +not ok ? array : f64 +not ok ? array : true not ok ? div : 1 -not ok ? div : a -not ok ? div : b -not ok ? div : obj.b -not ok ? f : "c" -not ok ? f : false -not ok ? f : obj?.obj -not ok ? f : s -not ok ? false : "c" -not ok ? obj : arr -not ok ? obj : b -not ok ? obj : div -not ok ? ok : "c" -not ok ? ok : 0 -not ok ? ok : a -not ok ? ok : add -not ok ? ok : arr -not ok ? ok : ok -not ok ? s : a -not ok ? true : add +not ok ? div : add +not ok ? f32 : div +not ok ? f64 : 1 +not ok ? f64 : half +not ok ? false : f32 +not ok ? false : i +not ok ? false : true +not ok ? foo : add +not ok ? foo : false +not ok ? foo : i64 +not ok ? greet : add +not ok ? half : true +not ok ? i : div +not ok ? i : true +not ok ? i32 : nil +not ok ? i64 : add +not ok ? nil : 0.5 +not ok ? nil : div +not ok ? nil : foo +not ok ? nil : half +not ok ? nil : i +not ok ? score : div +not ok ? score : i +not ok ? score : true +not ok ? true : f32 not ok ? true : false -not ok and obj?.a.obj -not ok or obj.a +not ok ? true : score +not ok and not ok not ok or ok -not ok || 0 <= f -not ok || obj.head(0, nil) -not ok || obj?.obj +not ok or one(array, true) not ok || ok -not one(arr, false) -not one(arr, ok) -not one(arr, true) -not true != obj?.b -not true ? "b" : b -not true ? 0 : div -not true ? 0.5 : ok -not true ? 1 : obj -not true ? a : a -not true ? arr : 1 -not true ? arr : b -not true ? b : "a" -not true ? b : 2 -not true ? b : a -not true ? b : div -not true ? b : obj +not ok || true ? 0.5 : 1 +not one(array, # > f32) +not one(array, false) +not one(array, ok) +not one(array, true) +not one(list, false) +not one(list, ok) +not one(list, true) +not true && i32 <= i32 +not true ? "foo" : i +not true ? 1 : i64 +not true ? add : add +not true ? add : foo +not true ? array : 1 +not true ? array : add +not true ? array : array +not true ? array : i32 +not true ? array : i64 not true ? div : nil -not true ? div : true -not true ? f : false -not true ? f : obj -not true ? f : true -not true ? nil : "c" -not true ? nil : a -not true ? obj : arr -not true ? obj : f -not true ? obj : ok -not true ? s : ok -not true and obj[s] -not true and ok -not true or obj.obj?.a +not true ? f64 : i64 +not true ? foo : foo +not true ? greet : "bar" +not true ? greet : add +not true ? greet : foo +not true ? greet : i32 +not true ? half : half +not true ? i : 1 +not true ? i : i +not true ? i32 : 0.5 +not true ? i64 : 1 +not true ? list : "bar" +not true ? list : 0.5 +not true ? list : 1 +not true ? list : array +not true ? list : type(add) +not true ? nil : list +not true ? score : 1 +not true ? score : list +not true ? score : true not true || ok -obj -obj != get(obj, s) -obj != nil == true -obj != nil ? f : "b" -obj != nil and obj?.fn(a) -obj != nil and s <= "a" -obj != nil || b <= obj.fn(fromJSON(a), trimSuffix(div(true), true % s, a startsWith obj, f ^ add), f) -obj != obj -obj != obj != ok -obj != obj && obj?.head(0, true) -obj != obj == ok -obj != obj ? 0 : obj -obj != obj ? 1 : 0.5 -obj != obj or obj.obj -obj != obj || obj?.obj -obj != obj.a -obj != obj.b -obj != obj.c -obj != obj.fn(a) -obj != obj.fn(b) -obj != obj.head(b, f) -obj != obj.head(f, s, s, ok) -obj != obj.head(false) -obj != obj.head(nil or false) -obj != obj.head(ok) -obj != obj.obj -obj != obj.obj.b -obj != obj.obj?.b -obj != obj.obj?.obj -obj != obj?.a -obj != obj?.b -obj != obj?.fn(b) -obj != obj?.head(0, b) -obj != obj?.head(a, 0) -obj != obj?.head(obj) -obj != obj?.obj -obj != obj?.obj.b -obj != obj?.obj.obj -obj != obj?.obj?.b -obj != obj?.obj?.obj -obj != obj[s] -obj != {"a": 2, "b": b} -obj == nil && obj?.fn(nil) -obj == nil == true ? 0.5 : obj -obj == nil ? add : add -obj == nil ? arr : arr -obj == nil ? b : 1 -obj == nil ? obj : "c" -obj == obj -obj == obj != any(arr, true) -obj == obj != ok -obj == obj && ok -obj == obj ? false : f -obj == obj ? ok : s -obj == obj or obj?.head(f, false, obj) -obj == obj.a -obj == obj.b -obj == obj.head(0.5) -obj == obj.head(2 == s) -obj == obj.head(a) -obj == obj.head(b) -obj == obj.head(false) -obj == obj.head(int(arr, ok, b, a), 2 * b) -obj == obj.head(obj, s) -obj == obj.head(s == div) -obj == obj.obj -obj == obj.obj.b -obj == obj?.a -obj == obj?.b -obj == obj?.fn(0 + b) -obj == obj?.fn(2) -obj == obj?.head(0, f) -obj == obj?.head(a) -obj == obj?.head(add, "c", add, "a") -obj == obj?.head(add, ok) -obj == obj?.head(filter(arr, ok)) -obj == obj?.head(nil) -obj == obj?.head(obj, 0) -obj == obj?.obj -obj == obj?.obj.a -obj == obj?.obj?.a -obj == obj?.obj?.b -obj == obj[nil] -obj in [0.5, a, true, obj] -obj in [arr] -obj in obj?.head(arr) -obj in obj[s] -obj.a -obj.a != "c" ? obj : a -obj.a != 0.5 - b -obj.a != a -obj.a != a * 0.5 -obj.a != add -obj.a != add ? false : ok -obj.a != arr -obj.a != b -obj.a != b / a && ok -obj.a != div -obj.a != div != false -obj.a != div ? s : a -obj.a != div or ok -obj.a != f -obj.a != last(arr) -obj.a != obj -obj.a != obj ? f : ok -obj.a != obj.a -obj.a != obj.head(add, obj) -obj.a != obj.obj.obj -obj.a != obj?.b -obj.a != obj?.obj.a -obj.a != ok -obj.a != ok ? ok : 0.5 -obj.a != s -obj.a != string(nil) -obj.a != string(ok) -obj.a != toJSON(0.5) -obj.a % a -obj.a % b -obj.a % int(b) -obj.a % obj.a -obj.a % obj?.b -obj.a * (0.5 + 0) -obj.a * -a -obj.a * 0 ^ f -obj.a * a -obj.a * b -obj.a * count(arr, ok) -obj.a * div(0, b) -obj.a * f -obj.a * len(arr) -obj.a * obj.b -obj.a * obj?.b -obj.a ** (a % 2) -obj.a ** (a + a) -obj.a ** (b - f) -obj.a ** 0 ** a -obj.a ** 0.5 ^ 0.5 -obj.a ** a -obj.a ** b -obj.a ** div(a, 1) -obj.a ** f -obj.a + -b -obj.a + a -obj.a + b -obj.a + f -obj.a + int(b) -obj.a + max(b, 2) -obj.a + obj.a -obj.a + obj.b -obj.a + obj.head(a, true, nil) -obj.a + obj?.a -obj.a + obj?.b -obj.a + obj?.fn(0) -obj.a - 0 + f -obj.a - a -obj.a - a - 0.5 -obj.a - b -obj.a - f -obj.a - obj.a -obj.a - obj.b -obj.a - obj.head(obj).a -obj.a - obj?.b -obj.a .. a -obj.a .. add(a, a) -obj.a .. b -obj.a .. div(0, a) -obj.a .. max(a) -obj.a / -f -obj.a / 0 ^ b -obj.a / a -obj.a / b -obj.a / f -obj.a / f * b -obj.a / obj.head(a, nil) -obj.a / obj?.b -obj.a < -2 -obj.a < 0 ? f : a -obj.a < a -obj.a < b -obj.a < b ^ f -obj.a < f -obj.a < obj.b -obj.a <= 0.5 / b -obj.a <= 1 / a -obj.a <= a -obj.a <= a + f -obj.a <= a ? 0 : nil -obj.a <= a ? 2 : 0.5 -obj.a <= b -obj.a <= b ** f -obj.a <= count(arr, ok) -obj.a <= f -obj.a <= f ** a -obj.a <= obj.a -obj.a == (true && ok) -obj.a == 2 / b -obj.a == a -obj.a == a * a -obj.a == abs(0.5) -obj.a == add -obj.a == arr -obj.a == arr != true -obj.a == arr[0] -obj.a == b -obj.a == div -obj.a == div == obj?.b -obj.a == f -obj.a == false ? div : add -obj.a == filter(arr, ok) -obj.a == map(arr, true) -obj.a == not false -obj.a == obj -obj.a == obj ? 0 : a -obj.a == obj ? arr : 0.5 -obj.a == obj.a -obj.a == obj.b -obj.a == obj.obj -obj.a == obj?.b -obj.a == obj?.obj -obj.a == ok -obj.a == s -obj.a == string(false) -obj.a > a -obj.a > a ** f -obj.a > a ? div : s -obj.a > add(a, a) -obj.a > add(b, 0) -obj.a > b -obj.a > f -obj.a > f ? f : 0 -obj.a > max(f) -obj.a > obj?.a -obj.a > obj?.b -obj.a >= 0 - 0 -obj.a >= a -obj.a >= abs(0) -obj.a >= add(b, 1) -obj.a >= b -obj.a >= f -obj.a >= f ^ 0.5 -obj.a >= obj.a -obj.a >= obj.b -obj.a >= obj?.b -obj.a ^ (a % a) -obj.a ^ a -obj.a ^ b -obj.a ^ f -obj.a ^ len(arr) -obj.a ^ obj.a -obj.a ^ obj.b -obj.a ^ obj.fn(a) -obj.a ^ obj?.a -obj.a and !true -obj.a in arr -obj.a or not false -obj.a or true || obj?.a -obj.b -obj.b != "c" ? s : ok -obj.b != 0 / a -obj.b != 1 / a -obj.b != a -obj.b != a ** f -obj.b != add -obj.b != arr -obj.b != arr[1] -obj.b != b -obj.b != div -obj.b != f -obj.b != f - 0.5 -obj.b != f ? ok : add -obj.b != int(f) -obj.b != nil ? f : obj.b -obj.b != obj -obj.b != obj.a -obj.b != obj.b -obj.b != obj?.a -obj.b != obj?.head(b, obj) -obj.b != obj?.obj -obj.b != ok -obj.b != ok ? 0 : b -obj.b != s -obj.b != s ? nil : arr -obj.b != trimSuffix("b") -obj.b % 2 * f -obj.b % a -obj.b % abs(a) -obj.b % b -obj.b % len(arr) -obj.b % len(obj) -obj.b % obj.a -obj.b % obj?.a -obj.b && false ? 0.5 : f -obj.b * (0.5 - b) -obj.b * (a + 0.5) -obj.b * 0.5 / a -obj.b * a -obj.b * add(0, a) -obj.b * b -obj.b * div(b, b) -obj.b * f -obj.b * f / f -obj.b * get(arr, a) -obj.b * obj.a -obj.b * obj.b -obj.b * obj.head(2, add, false, arr) -obj.b ** a -obj.b ** add(1, 2) -obj.b ** add(b, a) != f -obj.b ** b -obj.b ** f -obj.b ** f ^ 1 -obj.b ** obj.a -obj.b ** obj.b -obj.b ** obj?.b -obj.b ** obj?.head(f, obj, 0.5, arr, ok) -obj.b + -b -obj.b + 0 / 2 -obj.b + a -obj.b + a % 2 -obj.b + b -obj.b + f -obj.b + f / 2 -obj.b + len(s) -obj.b + obj.b -obj.b + obj?.a -obj.b + obj?.b -obj.b - 0 * f -obj.b - 0 ^ a -obj.b - a -obj.b - b -obj.b - div(a, a) -obj.b - f -obj.b - obj.b -obj.b - obj?.a -obj.b - obj?.b -obj.b .. 0 - b -obj.b .. 2 - a -obj.b .. a -obj.b .. b -obj.b .. b * 0 -obj.b .. b - 0 -obj.b .. obj.a -obj.b .. obj.b -obj.b .. obj?.head(f, ok, obj, add, 0.5) -obj.b / (0.5 + a) -obj.b / -f -obj.b / 0.5 ** a -obj.b / 0.5 / a -obj.b / a -obj.b / b -obj.b / f -obj.b / obj?.a -obj.b / obj?.head(a, div) -obj.b < 0 - b -obj.b < 1 / a -obj.b < 2 * 0 -obj.b < 2 + b -obj.b < a -obj.b < b -obj.b < f -obj.b < get(obj, "b") -obj.b < len("c") -obj.b < min(f) -obj.b < obj.a -obj.b < obj.b -obj.b <= 0.5 == nil -obj.b <= 2 ? "a" : a -obj.b <= a -obj.b <= a * f -obj.b <= a - f -obj.b <= a ? a : 0 -obj.b <= arr[a] -obj.b <= b -obj.b <= f -obj.b <= f != ok -obj.b <= get(arr, a) -obj.b <= min(b) -obj.b <= obj.a -obj.b <= obj.fn(0) -obj.b <= obj?.a -obj.b <= obj?.b -obj.b <= obj?.head(b, 0) -obj.b == !false -obj.b == "c" ? a : nil -obj.b == (ok && true) -obj.b == (ok and true) -obj.b == 0.5 ? arr : "c" -obj.b == a -obj.b == a .. a -obj.b == a ? false : false -obj.b == a ^ a -obj.b == add -obj.b == arr -obj.b == b -obj.b == b / 0 -obj.b == div -obj.b == f -obj.b == f ? 1 : "c" -obj.b == f ? nil : b -obj.b == f ? obj : ok -obj.b == f ? s : arr -obj.b == int(0.5) -obj.b == map(arr, 0) -obj.b == obj -obj.b == obj.a -obj.b == obj.b -obj.b == obj.head(nil) -obj.b == obj.obj -obj.b == obj?.a -obj.b == obj?.b -obj.b == ok -obj.b == s -obj.b == toBase64(s) -obj.b > -a -obj.b > 0 ? b : f -obj.b > a -obj.b > a ** a -obj.b > b -obj.b > b + 0 -obj.b > f -obj.b > int(1) -obj.b > obj.a -obj.b > obj.b -obj.b > obj?.b -obj.b > obj?.fn(0) -obj.b >= 0 ** 1 -obj.b >= 0.5 / f -obj.b >= 0.5 ^ 1 -obj.b >= 1 ? 2 : obj -obj.b >= a -obj.b >= a ? ok : b -obj.b >= b -obj.b >= b + b -obj.b >= f -obj.b >= max(b) -obj.b >= obj.a -obj.b >= obj.fn(b) -obj.b >= obj?.a -obj.b >= obj?.head(b) -obj.b ^ a -obj.b ^ b -obj.b ^ f -obj.b ^ obj.head(a, true, arr, s) -obj.b ^ obj.obj.b -obj.b ^ obj?.b -obj.b and !false -obj.b and !true -obj.b and false == true -obj.b in arr -obj.b or false and true -obj.c in obj -obj.c?.a -obj.c?.b -obj.c?.b.b -obj.c?.b?.b -obj.c?.fn(b) -obj.c?.head("a" != arr) -obj.c?.head(a) -obj.c?.head(b) -obj.c?.obj -obj.c?.obj?.head(div) -obj.fn(-0) -obj.fn(-1) -obj.fn(-2) -obj.fn(-a) -obj.fn(-b) -obj.fn(0 && true) -obj.fn(0 * a) -obj.fn(0 + 0) -obj.fn(0 + b) -obj.fn(0 - 0) -obj.fn(0 and true) -obj.fn(0 || false) -obj.fn(0) != b -obj.fn(0) * a -obj.fn(0) ** f -obj.fn(0) + f -obj.fn(0) - b -obj.fn(0) / a -obj.fn(0) / b -obj.fn(0) <= b + 0 -obj.fn(0) == a -obj.fn(0) == b -obj.fn(0) == s -obj.fn(0) >= a -obj.fn(0) ^ f -obj.fn(1 % b) -obj.fn(1 * b) -obj.fn(1 + b) -obj.fn(1 and true) -obj.fn(1) ** obj?.b -obj.fn(1) + b -obj.fn(1) == add -obj.fn(2 % 1) -obj.fn(2 * 1) -obj.fn(2 * a) -obj.fn(2 + b) -obj.fn(2) != add -obj.fn(2) < f -obj.fn(a % a) -obj.fn(a * 0) -obj.fn(a + 1) -obj.fn(a + 2) -obj.fn(a + a) -obj.fn(a - 1) -obj.fn(a - 2) -obj.fn(a and true) -obj.fn(a or false) -obj.fn(a) -obj.fn(a) != 2 - b -obj.fn(a) != b -obj.fn(a) != f -obj.fn(a) != ok -obj.fn(a) % a -obj.fn(a) % b -obj.fn(a) * a -obj.fn(a) ** a -obj.fn(a) ** b -obj.fn(a) - a -obj.fn(a) < a -obj.fn(a) == add -obj.fn(a) == arr -obj.fn(a) == map(arr, arr) -obj.fn(a) > b -obj.fn(a) >= b -obj.fn(a) ^ f -obj.fn(a) and !true -obj.fn(abs(1)) -obj.fn(abs(2)) -obj.fn(abs(f, s, b, b)) -obj.fn(add(0, 2)) -obj.fn(add(0, a)) -obj.fn(add(0, b)) -obj.fn(add(1, 1)) -obj.fn(add(1, b)) -obj.fn(add(2, a)) -obj.fn(add(a, 0)) -obj.fn(add(a, a)) -obj.fn(add(a, b)) -obj.fn(add(b, 2)) -obj.fn(add(b, b)) -obj.fn(arr[0]) -obj.fn(arr[a]) -obj.fn(arr[b]) -obj.fn(b % a) -obj.fn(b % b) -obj.fn(b && true) -obj.fn(b * 0) -obj.fn(b * 1) -obj.fn(b * b) -obj.fn(b + obj?.a) -obj.fn(b - 1) -obj.fn(b - 2) -obj.fn(b - a) -obj.fn(b or false) -obj.fn(b || false) -obj.fn(b) -obj.fn(b) != a -obj.fn(b) != div -obj.fn(b) * b ^ f -obj.fn(b) ** b -obj.fn(b) + b -obj.fn(b) .. a % 2 -obj.fn(b) .. b * b -obj.fn(b) < b -obj.fn(b) < f -obj.fn(b) <= 0 % b -obj.fn(b) <= b -obj.fn(b) == a / 1 -obj.fn(b) == div ? obj : div -obj.fn(b) == ok -obj.fn(b) > f -obj.fn(b) ^ obj?.a -obj.fn(count("a", false)) -obj.fn(count("b", ok)) -obj.fn(count("b", true)) -obj.fn(count("c", ok)) -obj.fn(count("c", true)) -obj.fn(count(1 .. f, s)) -obj.fn(count(arr, false)) -obj.fn(count(arr, ok)) -obj.fn(count(obj, ok)) -obj.fn(count(s, ok)) -obj.fn(div(0, a)) -obj.fn(div(0, b)) -obj.fn(div(1, 1)) -obj.fn(div(1, b)) -obj.fn(div(a, a)) -obj.fn(div(a, b)) -obj.fn(div(b, a)) -obj.fn(div(b, b)) -obj.fn(f == obj or b) -obj.fn(false ? 0 : b) -obj.fn(false or 0) -obj.fn(false or a) -obj.fn(false || 0) -obj.fn(false || 2) -obj.fn(false || a) -obj.fn(get(arr, 0)) -obj.fn(get(arr, 0.5)) -obj.fn(get(arr, b)) -obj.fn(int("b", a)) -obj.fn(int(0)) -obj.fn(int(1)) -obj.fn(int(a)) -obj.fn(int(a, 0)) -obj.fn(int(b)) -obj.fn(int(b, s, a, "a", f)) -obj.fn(int(obj, true, b)) -obj.fn(int(true, f)) -obj.fn(last(arr)) -obj.fn(last(arr, b)) -obj.fn(len("b")) -obj.fn(len(0, obj)) -obj.fn(len(arr)) -obj.fn(len(arr, s)) -obj.fn(len(f, arr)) -obj.fn(len(false, 1, s, obj)) -obj.fn(len(nil, arr)) -obj.fn(len(s)) -obj.fn(max(0)) -obj.fn(max(0, b)) -obj.fn(max(1)) -obj.fn(max(1, 0.5)) -obj.fn(max(a)) -obj.fn(max(b)) -obj.fn(min(0)) -obj.fn(min(0, f, a)) -obj.fn(min(1)) -obj.fn(min(a)) -obj.fn(min(b)) -obj.fn(min(f, f, 0)) -obj.fn(obj.a) -obj.fn(obj.a) < b -obj.fn(obj.b) -obj.fn(obj.fn(1)) -obj.fn(obj.fn(2)) -obj.fn(obj.fn(a)) -obj.fn(obj.head(0)) -obj.fn(obj.head(0, add)) -obj.fn(obj.head(2)) -obj.fn(obj.head(a)) -obj.fn(obj.head(a, s)) -obj.fn(obj.head(b)) -obj.fn(obj?.a) -obj.fn(obj?.b) -obj.fn(obj?.fn(0)) -obj.fn(obj?.fn(a)) -obj.fn(obj?.fn(b)) -obj.fn(obj?.head(0)) -obj.fn(obj?.head(0, div)) -obj.fn(obj?.head(1)) -obj.fn(obj?.head(a, arr)) -obj.fn(obj?.head(b)) -obj.fn(ok && 2) -obj.fn(ok && a) -obj.fn(ok && b) -obj.fn(ok ? 1 : 0) -obj.fn(ok ? a : s) -obj.fn(ok ? b : "b" .. all(obj, ok)) -obj.fn(ok and 0) -obj.fn(ok and a) -obj.fn(ok and b) -obj.fn(s, obj, nil) || true ? 0 : b -obj.fn(true && 0) -obj.fn(true && 2) -obj.fn(true ? 0 : add) -obj.fn(true and a) -obj.head(!false) -obj.head(!false, s, div) -obj.head(!ok) -obj.head(!true) -obj.head(!true, div) -obj.head(!true, ok ? true : add) -obj.head("a" != "c") -obj.head("a" != a) -obj.head("a" != add) -obj.head("a" != b) -obj.head("a" != div) -obj.head("a" != s) -obj.head("a" < s) -obj.head("a" == "c") -obj.head("a" == 0) -obj.head("a" == arr) -obj.head("a" == b) -obj.head("a" == f) -obj.head("a" >= "c") -obj.head("a" contains "a") -obj.head("a" in arr, obj) -obj.head("a" in nil) -obj.head("a" or true) -obj.head("a" || true) -obj.head("a") == add -obj.head("a", a) == b - 0.5 -obj.head("b" != "c", last(arr, ok, f), arr) -obj.head("b" != 1) -obj.head("b" != a) -obj.head("b" != add) -obj.head("b" != arr) -obj.head("b" != b) -obj.head("b" != s) -obj.head("b" + "b") -obj.head("b" <= "b") -obj.head("b" == f) -obj.head("b" == obj) -obj.head("b" || false) -obj.head("b") + s -obj.head("b") startsWith s -obj.head("b", ok) != add -obj.head("c" != a) -obj.head("c" != ok) -obj.head("c" + "a") -obj.head("c" + s) -obj.head("c" == "c") -obj.head("c" == add, ok) -obj.head("c" == arr) -obj.head("c" == div) -obj.head("c" == false) -obj.head("c" >= "b") -obj.head("c" >= s, get(0, ok)) -obj.head("c" and false) -obj.head("c" and true) -obj.head("c" contains "b") -obj.head("c" endsWith "c") -obj.head("c" startsWith "c") -obj.head("c" || false) -obj.head("c") endsWith s -obj.head("c", "c") > s -obj.head((nil || true) == arr) -obj.head(-0) -obj.head(-0.5) -obj.head(-0.5, add) -obj.head(-2) -obj.head(-a) -obj.head(-b) -obj.head(-f) -obj.head(-f, obj?.head(obj, ok, arr)) -obj.head(0 != arr) -obj.head(0 != b) -obj.head(0 != div) -obj.head(0 != nil) -obj.head(0 != nil, b) -obj.head(0 != ok) -obj.head(0 && true) -obj.head(0 * 0.5) -obj.head(0 * a) -obj.head(0 ** 0) -obj.head(0 ** 1) -obj.head(0 ** b) -obj.head(0 ** f) -obj.head(0 + 2) -obj.head(0 + a) -obj.head(0 + f) -obj.head(0 - 0.5) -obj.head(0 - 1) -obj.head(0 - a) -obj.head(0 - f) -obj.head(0 .. 0) -obj.head(0 .. 0.5) -obj.head(0 .. b) -obj.head(0 / b) -obj.head(0 < 0) -obj.head(0 < b, obj?.head(obj, obj, add, "a")) -obj.head(0 <= 0.5) -obj.head(0 <= 0.5, obj.a) -obj.head(0 <= 1) -obj.head(0 == "a") -obj.head(0 == 0) -obj.head(0 == 1) -obj.head(0 == add, f) -obj.head(0 == arr) -obj.head(0 == div) -obj.head(0 == f) -obj.head(0 == false) -obj.head(0 == ok) -obj.head(0 == s, float(b)) -obj.head(0 == true) -obj.head(0 > 0) -obj.head(0 > b) -obj.head(0 >= 0) -obj.head(0 >= a, s) -obj.head(0 ^ 0.5) -obj.head(0 ^ 1) -obj.head(0 ^ a) -obj.head(0 ^ f) -obj.head(0 in nil) -obj.head(0 || true) -obj.head(0) != s -obj.head(0) - b -obj.head(0) .. obj?.head(1) -obj.head(0) / a -obj.head(0) / b -obj.head(0) < b ^ b -obj.head(0) == b -obj.head(0) > a - b -obj.head(0) >= 0.5 ? 2 : obj -obj.head(0) >= a -obj.head(0) ^ (b % 1) -obj.head(0) ^ b -obj.head(0, "a") - f -obj.head(0, "b") + f -obj.head(0, "b") .. add(b, b) -obj.head(0, 0) == "c" ? nil : a -obj.head(0, 0, "c") == obj?.a -obj.head(0, 0.5, "b", 0) <= 0.5 != true -obj.head(0, 1, div) < a -obj.head(0, add) / a -obj.head(0, arr) > b -obj.head(0, arr, add, nil) < a -obj.head(0, b, s) .. a -obj.head(0, div) + f -obj.head(0, div, a) < obj?.a -obj.head(0, f) <= b -obj.head(0, f, arr) == ok -obj.head(0, f, b) == s -obj.head(0, f, obj, 0, "a") + a -obj.head(0, ok) - a -obj.head(0, ok) > -b -obj.head(0, true, b) - a -obj.head(0.5 != 1) -obj.head(0.5 != a) -obj.head(0.5 != add) -obj.head(0.5 != arr) -obj.head(0.5 != b) -obj.head(0.5 != f) -obj.head(0.5 != obj) -obj.head(0.5 * 0) -obj.head(0.5 * a, arr) -obj.head(0.5 ** a) -obj.head(0.5 + a) -obj.head(0.5 + f) -obj.head(0.5 - 1) -obj.head(0.5 - a) -obj.head(0.5 - f) -obj.head(0.5 .. 0) -obj.head(0.5 .. a, max(div)) -obj.head(0.5 / 0) -obj.head(0.5 < 0.5) -obj.head(0.5 <= 0) -obj.head(0.5 <= b) -obj.head(0.5 == a) -obj.head(0.5 == add, div) -obj.head(0.5 == obj) -obj.head(0.5 >= a) -obj.head(0.5 >= f) -obj.head(0.5 ^ 1) -obj.head(0.5 and true) -obj.head(0.5 in nil) -obj.head(0.5) - b / f -obj.head(0.5) / obj.head(2, obj) -obj.head(0.5, f) != a -obj.head(0.5, false, b) + obj.a -obj.head(0.5, nil) >= f -obj.head(0.5, nil, s) > a -obj.head(1 != add, obj.a) -obj.head(1 != arr) -obj.head(1 != nil) -obj.head(1 != obj) -obj.head(1 != s) -obj.head(1 && true) -obj.head(1 * 0) -obj.head(1 ** 2) -obj.head(1 - a) -obj.head(1 .. b) -obj.head(1 / 0.5) -obj.head(1 / 1) -obj.head(1 / a) -obj.head(1 / f) -obj.head(1 < 1) -obj.head(1 < a) -obj.head(1 == 0, get(div, b)) -obj.head(1 == b) -obj.head(1 == div) -obj.head(1 == div, get(div, false)) -obj.head(1 == s, 0 ** 0, ok) -obj.head(1 >= 0) -obj.head(1 >= a, ok) -obj.head(1 >= f) -obj.head(1 and false) -obj.head(1) + a -obj.head(1) + a + a -obj.head(1) == f -obj.head(1) ^ obj.b -obj.head(1, a, ok) <= a -obj.head(1, add, ok) > a -obj.head(1, div) == b ? a : a -obj.head(2 != "a") -obj.head(2 != b) -obj.head(2 != true) -obj.head(2 % b) -obj.head(2 * b) -obj.head(2 ** b) -obj.head(2 + 2) -obj.head(2 + b) -obj.head(2 - 1) -obj.head(2 - f, obj, get(obj, a)) -obj.head(2 .. a) -obj.head(2 / 0) -obj.head(2 / a, add) -obj.head(2 / f) -obj.head(2 == ok) -obj.head(2 >= 0.5) -obj.head(2 >= b) -obj.head(2 >= f) -obj.head(2 ^ b, 0.5 && false) -obj.head(2 ^ f) -obj.head(2 in arr) -obj.head(2 in nil, a) -obj.head(2) != s -obj.head(2) + f -obj.head(2) == obj.a -obj.head(2, 0.5) % obj?.b -obj.head(2, 0.5) - obj.a -obj.head(2, arr, 2, obj, div) > f -obj.head(2, div, ok) in 2 .. 2 -obj.head(["c"]) -obj.head([arr, add]) -obj.head(a != 0) -obj.head(a != a) -obj.head(a != arr) -obj.head(a != b) -obj.head(a != f) -obj.head(a != nil) -obj.head(a != obj) -obj.head(a != ok) -obj.head(a != ok, obj.b) -obj.head(a % 2) -obj.head(a % b) -obj.head(a * 0) -obj.head(a * 0.5) -obj.head(a * 1) -obj.head(a * a) -obj.head(a * b) -obj.head(a * b, get(0.5, nil)) -obj.head(a * f) -obj.head(a ** a) -obj.head(a ** f) -obj.head(a + 0) -obj.head(a + 0.5, none(obj, true), a) -obj.head(a - 0) -obj.head(a - 0.5) -obj.head(a - 1) -obj.head(a - 2) -obj.head(a - a) -obj.head(a - b) -obj.head(a - b, 0 && false, f) -obj.head(a - f) -obj.head(a .. f) -obj.head(a / 0) -obj.head(a / 1) -obj.head(a < 0) -obj.head(a < 1) -obj.head(a < a) -obj.head(a < b) -obj.head(a <= a) -obj.head(a <= b, false in arr) -obj.head(a <= b, ok ? a : div) -obj.head(a <= f) -obj.head(a == "b") -obj.head(a == 0) -obj.head(a == 0, f == nil) -obj.head(a == add) -obj.head(a == b) -obj.head(a == f) -obj.head(a == f, ok ? obj : arr) -obj.head(a == obj) -obj.head(a > 1) -obj.head(a >= a) -obj.head(a >= f) -obj.head(a ^ 0) -obj.head(a ^ a) -obj.head(a ^ a, add) -obj.head(a ^ f) -obj.head(a and true) -obj.head(a in arr) -obj.head(a or true) -obj.head(a) -obj.head(a) != div -obj.head(a) * a -obj.head(a) * b -obj.head(a) ** f -obj.head(a) + b -obj.head(a) + f -obj.head(a) < add(b, a) -obj.head(a) < b ** 0 -obj.head(a) <= 0.5 - 0.5 -obj.head(a) >= 0.5 ^ f -obj.head(a) >= int(a) -obj.head(a) ^ a -obj.head(a, "a", false, 0) % b -obj.head(a, "b", "b") == obj ? "b" : arr -obj.head(a, 1 != arr) -obj.head(a, a) -obj.head(a, add) -obj.head(a, add) != div ? 0 : 0.5 -obj.head(a, arr) -obj.head(a, arr) < obj.a -obj.head(a, b) -obj.head(a, b, f) -obj.head(a, div) -obj.head(a, f) -obj.head(a, f) == f -obj.head(a, f, div, "b") ^ b -obj.head(a, f, f) * b ** a -obj.head(a, f, obj.a) -obj.head(a, false) ^ 0.5 ** a -obj.head(a, nil) == f -obj.head(a, nil) == obj -obj.head(a, obj, ok, nil, ok) <= b -obj.head(a, obj.a) -obj.head(a, obj.b) -obj.head(a, obj.obj) -obj.head(a, obj?.head(s)) -obj.head(a, ok) -obj.head(a, s) -obj.head(a, s) - a -obj.head(a, string(0.5, 1), f) -obj.head(a, true || arr) -obj.head(abs(0)) -obj.head(abs(1), ok && add) -obj.head(abs(2)) -obj.head(abs(b)) -obj.head(abs(b, add, true, b)) -obj.head(abs(div, "b", b)) -obj.head(abs(div, arr, f)) -obj.head(abs(f)) -obj.head(abs(f, "b", a)) -obj.head(abs(obj, b), add != obj) -obj.head(abs(obj, div, 1), a, get(0, f)) -obj.head(add != "a") -obj.head(add != "c", ok) -obj.head(add != 0) -obj.head(add != 2) -obj.head(add != add) -obj.head(add != arr) -obj.head(add != b) -obj.head(add != f) -obj.head(add != false, a) -obj.head(add != nil, s) -obj.head(add != obj) -obj.head(add != ok) -obj.head(add != true) -obj.head(add && false, map(obj, obj)) -obj.head(add && true) -obj.head(add == 0.5) -obj.head(add == add) -obj.head(add == arr) -obj.head(add == f) -obj.head(add == ok) -obj.head(add == s) -obj.head(add == true) -obj.head(add in arr) -obj.head(add in nil) -obj.head(add or true) -obj.head(add(0, 0)) -obj.head(add(0, 1), obj, s) -obj.head(add(0, a)) -obj.head(add(1, a), int(0)) -obj.head(add(2, 0)) -obj.head(add(2, b)) -obj.head(add(a, 0)) -obj.head(add(a, 0), div) -obj.head(add(a, a)) -obj.head(add(a, a), get(s, a)) -obj.head(add(b, 0)) -obj.head(add(b, a)) -obj.head(add(b, b)) -obj.head(add) -obj.head(add) != div -obj.head(add) != f -obj.head(add) == f ** 1 -obj.head(add, a) -obj.head(add, a, b, arr) == add -obj.head(add, add) -obj.head(add, b) -obj.head(add, b, s) == ok -obj.head(add, div) -obj.head(add, f) -obj.head(add, filter(arr, true)) -obj.head(add, obj) -obj.head(add, s <= "b") -obj.head(add, s) -obj.head(add, s, arr) != add(a, 0) -obj.head(add, string(b)) -obj.head(all("b", ok)) -obj.head(all("b", true)) -obj.head(all("c", false)) -obj.head(all("c", ok)) -obj.head(all(arr, false) == map(s, nil)) -obj.head(all(arr, ok)) -obj.head(all(arr, true)) -obj.head(all(arr, true), a) -obj.head(all(obj, false)) -obj.head(all(obj, true)) -obj.head(all(s, ok)) -obj.head(any("a", false)) -obj.head(any("b", false)) -obj.head(any(arr, ok)) -obj.head(any(arr, true)) -obj.head(any(obj, false)) -obj.head(any(obj, true)) -obj.head(arr != 2) -obj.head(arr != a) -obj.head(arr != add) -obj.head(arr != arr) -obj.head(arr != b) -obj.head(arr != div) -obj.head(arr != f) -obj.head(arr != false) -obj.head(arr != s) -obj.head(arr && false) -obj.head(arr && true) -obj.head(arr == "a") -obj.head(arr == a) -obj.head(arr == arr) -obj.head(arr == b) -obj.head(arr == f) -obj.head(arr == nil) -obj.head(arr == nil, all("b", ok), b) -obj.head(arr == obj) -obj.head(arr == s) -obj.head(arr in nil) -obj.head(arr || true) -obj.head(arr) -obj.head(arr) != a -obj.head(arr) != a ** b -obj.head(arr) != add -obj.head(arr) != obj -obj.head(arr) != obj.head(ok) -obj.head(arr) in arr -obj.head(arr)[obj?.a] -obj.head(arr, 0) != obj?.head(obj) -obj.head(arr, a) == 0.5 * f -obj.head(arr, add) -obj.head(arr, add)[obj.b] -obj.head(arr, arr) -obj.head(arr, b) -obj.head(arr, b, arr) -obj.head(arr, div) -obj.head(arr, div, 0, "b", arr) != f -obj.head(arr, div, arr) -obj.head(arr, div, false, a, div) != arr -obj.head(arr, f or true) -obj.head(arr, f) -obj.head(arr, f, arr, 0) != ok -obj.head(arr, map(obj, false)) -obj.head(arr, obj) -obj.head(arr, obj, add) == ok -obj.head(arr, obj?.a) -obj.head(arr, ok) -obj.head(arr, ok, false) == add -obj.head(arr[0:f]) -obj.head(arr[0], get(ok, f), arr) -obj.head(arr[1]) -obj.head(arr[1], ok) -obj.head(arr[a]) -obj.head(arr[b:f]) -obj.head(arr[b]) -obj.head(arr[b], s) -obj.head(arr[f]) -obj.head(b != 0, ok, a) -obj.head(b != a) -obj.head(b != arr) -obj.head(b != arr, s) -obj.head(b != f) -obj.head(b != false) -obj.head(b != obj) -obj.head(b != ok) -obj.head(b != true) -obj.head(b % 1, obj.b) -obj.head(b % b, get(arr, arr)) -obj.head(b * 0.5) -obj.head(b * 1) -obj.head(b * a) -obj.head(b * b, b) -obj.head(b * f) -obj.head(b ** 0) -obj.head(b ** 0.5, add) -obj.head(b ** b) -obj.head(b ** f, div) -obj.head(b + a) -obj.head(b + b) -obj.head(b + f) -obj.head(b - 0) -obj.head(b - 0, b ** b) -obj.head(b - 0.5) -obj.head(b - 1) -obj.head(b - 2, obj.head(obj)) -obj.head(b - a) -obj.head(b - f) -obj.head(b .. a) -obj.head(b .. a, 2 <= a) -obj.head(b .. b) -obj.head(b .. f, get(obj, a), map(arr, true)) -obj.head(b / 0) -obj.head(b / b) -obj.head(b / b, a) -obj.head(b < a) -obj.head(b < b) -obj.head(b < f) -obj.head(b <= a) -obj.head(b <= f) -obj.head(b == "a") -obj.head(b == "b") -obj.head(b == 0) -obj.head(b == a) -obj.head(b == add) -obj.head(b == arr) -obj.head(b == b) -obj.head(b == div) -obj.head(b == nil) -obj.head(b == obj) -obj.head(b == ok) -obj.head(b == ok, div) -obj.head(b == s) -obj.head(b > 0) -obj.head(b > 0.5) -obj.head(b > 1) -obj.head(b > a) -obj.head(b >= a, arr) -obj.head(b >= b, obj.a) -obj.head(b >= f) -obj.head(b ^ 0.5) -obj.head(b ^ 1, not ok) -obj.head(b ^ a) -obj.head(b in arr) -obj.head(b in nil) -obj.head(b or false) -obj.head(b || false) -obj.head(b || true) -obj.head(b) -obj.head(b) != a -obj.head(b) % a -obj.head(b) % b -obj.head(b) * b -obj.head(b) ** div(1, 1) -obj.head(b) ** obj?.a -obj.head(b) - -0 -obj.head(b) - a -obj.head(b) - b -obj.head(b) .. div(a, a) -obj.head(b) / (b + a) -obj.head(b) / b -obj.head(b) < -f -obj.head(b) <= a + a -obj.head(b) <= obj.b -obj.head(b) == add -obj.head(b) == map(arr, add) -obj.head(b) == obj -obj.head(b) > obj.b -obj.head(b) >= a -obj.head(b) ^ obj.a -obj.head(b) in arr -obj.head(b, 0 / 2, max(div)) -obj.head(b, 0.5, add, nil) == f -obj.head(b, 2) != first(arr) -obj.head(b, a + a) -obj.head(b, a - a) -obj.head(b, a) -obj.head(b, a) ^ b -obj.head(b, a, obj) <= b ? ok : "c" -obj.head(b, a, obj) ^ f -obj.head(b, a, s) >= obj?.a -obj.head(b, add) - f -obj.head(b, add, false, false, false) == s ? 1 : div -obj.head(b, add, s, arr) < 0.5 + b -obj.head(b, add, true) == f -obj.head(b, arr) -obj.head(b, arr) != add -obj.head(b, arr) ** b -obj.head(b, arr) >= b -obj.head(b, b + f) -obj.head(b, b) -obj.head(b, b) != obj.obj -obj.head(b, b, ok) / b -obj.head(b, div) -obj.head(b, f != "b") -obj.head(b, f) != add -obj.head(b, f, b, obj, a) ^ f ** f -obj.head(b, f, false) + a -obj.head(b, f, s, div, b) > b -obj.head(b, false, b) - obj?.a -obj.head(b, first(0.5)) -obj.head(b, get(b, arr)) -obj.head(b, get(div, true), "a" != 0) -obj.head(b, get(s, 0)) -obj.head(b, get(true, obj)) -obj.head(b, last(nil)) -obj.head(b, nil != div) -obj.head(b, nil or false) -obj.head(b, obj) -obj.head(b, obj) % b -obj.head(b, obj.a) -obj.head(b, obj.head(add)) -obj.head(b, ok or ok?.a) -obj.head(b, ok) -obj.head(b, s) -obj.head(b, true) == div -obj.head(count("a", true)) -obj.head(count("c", ok)) -obj.head(count(arr, false)) -obj.head(count(arr, ok)) -obj.head(count(arr, ok), 0 == arr) -obj.head(count(arr, true)) -obj.head(count(obj, false)) -obj.head(count(obj, ok)) -obj.head(count(s, false)) -obj.head(count(s, ok)) -obj.head(count(s, ok), obj.b) -obj.head(count(s, true)) -obj.head(date(s, s)) -obj.head(div != "a") -obj.head(div != 1) -obj.head(div != a) -obj.head(div != add) -obj.head(div != arr) -obj.head(div != b, f) -obj.head(div != f) -obj.head(div != false) -obj.head(div != obj, arr) -obj.head(div != s) -obj.head(div && true) -obj.head(div == "b", div, b == nil) -obj.head(div == 0) -obj.head(div == 0.5) -obj.head(div == 1) -obj.head(div == 2) -obj.head(div == a) -obj.head(div == a, add) -obj.head(div == div) -obj.head(div == f) -obj.head(div == f, add) -obj.head(div == nil) -obj.head(div == obj, b) -obj.head(div == obj, toBase64(s)) -obj.head(div and true) -obj.head(div in arr) -obj.head(div in nil) -obj.head(div || true) -obj.head(div(0, a)) -obj.head(div(0, b), ok ? b : "a") -obj.head(div(1, a)) -obj.head(div(1, a), obj, "b" in arr) -obj.head(div(a, 2)) -obj.head(div(a, a)) -obj.head(div(a, b)) -obj.head(div(a, b), s) -obj.head(div(b, 2)) -obj.head(div(b, a)) -obj.head(div(b, b)) -obj.head(div) -obj.head(div) != ok -obj.head(div) == a -obj.head(div) == b -obj.head(div) == div -obj.head(div) == obj -obj.head(div, 0 > f) -obj.head(div, 0.5) != -0.5 -obj.head(div, a == f) -obj.head(div, a) -obj.head(div, add) -obj.head(div, b ** a) -obj.head(div, b + a, b, a) -obj.head(div, b) == a -obj.head(div, b, div) -obj.head(div, b, obj, add) == b -obj.head(div, div != obj) -obj.head(div, div(0, 2)) -obj.head(div, div) -obj.head(div, f != false) -obj.head(div, f >= f) -obj.head(div, f) -obj.head(div, false, "c", s) != obj.head(add, "c") -obj.head(div, get(a, 0)) -obj.head(div, get(false, f)) -obj.head(div, get(false, obj)) -obj.head(div, max(b)) -obj.head(div, not ok) -obj.head(div, obj) -obj.head(div, obj.a) -obj.head(div, ok != arr) -obj.head(div, ok and div) -obj.head(div, ok) -obj.head(div, s != div) -obj.head(div, s < s, a) -obj.head(div, s) -obj.head(div, s[2]) -obj.head(f != "c") -obj.head(f != "c", 0 * 0.5) -obj.head(f != a) -obj.head(f != a, ok, obj) -obj.head(f != add) -obj.head(f != b) -obj.head(f != nil) -obj.head(f != ok) -obj.head(f != s) -obj.head(f != s, upper(0.5, s)) -obj.head(f != true) -obj.head(f * 0) -obj.head(f * 0.5) -obj.head(f * 2) -obj.head(f * b) -obj.head(f * f) -obj.head(f ** 0) -obj.head(f ** 2) -obj.head(f ** b) -obj.head(f ** obj.a) -obj.head(f + 0) -obj.head(f + a) -obj.head(f + b) -obj.head(f - 0) -obj.head(f - 0.5) -obj.head(f - 2) -obj.head(f - a) -obj.head(f - b, f ** f) -obj.head(f - f) -obj.head(f .. a) -obj.head(f .. b, add == nil) -obj.head(f .. f) -obj.head(f .. f) != arr -obj.head(f / 0.5) -obj.head(f / 1) -obj.head(f / a) -obj.head(f / f) -obj.head(f < b) -obj.head(f <= 1, obj) -obj.head(f <= b) -obj.head(f == "b", now(ok, 2)) -obj.head(f == "c", one(arr, true)) -obj.head(f == 0) -obj.head(f == add) -obj.head(f == b) -obj.head(f == f) -obj.head(f == obj, div) -obj.head(f == s) -obj.head(f == s, ok) -obj.head(f > 0) -obj.head(f > 1) -obj.head(f > f) -obj.head(f > f, any(s, ok), f ^ 0) -obj.head(f >= 0) -obj.head(f >= 0.5) -obj.head(f >= f) -obj.head(f >= f, int(s, nil, f)) -obj.head(f ^ 2, a) -obj.head(f ^ b) -obj.head(f ^ f) -obj.head(f ^ f, s < s) -obj.head(f in arr) -obj.head(f in arr, f == 0) -obj.head(f in nil) -obj.head(f or false) -obj.head(f) -obj.head(f) != abs(0.5) -obj.head(f) != div -obj.head(f) != ok -obj.head(f) * b -obj.head(f) .. int(0.5) -obj.head(f) / a -obj.head(f) < b -obj.head(f) < f / 0 -obj.head(f) == f -obj.head(f) == obj.a -obj.head(f) == ok -obj.head(f) == s -obj.head(f) >= b -obj.head(f) ^ f -obj.head(f, 0 / f, a - a) -obj.head(f, 0, 0.5) * a -obj.head(f, 0, arr, a) >= f -obj.head(f, a) -obj.head(f, arr != div) -obj.head(f, arr) -obj.head(f, arr) == obj -obj.head(f, b + f) -obj.head(f, b and true, s) -obj.head(f, b) -obj.head(f, b, s) * f / 1 -obj.head(f, div != arr) -obj.head(f, div) != ok -obj.head(f, div, get(f, obj)) -obj.head(f, div, true, div) ** obj.a -obj.head(f, f) -obj.head(f, f) != obj.a -obj.head(f, false ? true : 0) -obj.head(f, float(b)) -obj.head(f, get(false, false)) -obj.head(f, last(obj)) -obj.head(f, nil != ok) -obj.head(f, obj) -obj.head(f, obj) != add -obj.head(f, ok && f) -obj.head(f, ok) -obj.head(f, ok, f ** f) -obj.head(f, s) && false ? add : ok -obj.head(f, s) >= a / b -obj.head(f, s, obj) -obj.head(f, s[b]) -obj.head(false != 0) -obj.head(false != add) -obj.head(false != arr) -obj.head(false != b) -obj.head(false != div) -obj.head(false != f) -obj.head(false != obj) -obj.head(false != s) -obj.head(false && add) -obj.head(false && b) -obj.head(false && f) -obj.head(false && obj) -obj.head(false && s, obj?.head("a", nil, b)) -obj.head(false && s, s[2]) -obj.head(false == 0.5) -obj.head(false == a) -obj.head(false == add) -obj.head(false == f, true != 2) -obj.head(false == nil) -obj.head(false == obj) -obj.head(false ? add : add) -obj.head(false ? arr : ok) -obj.head(false ? obj : 0) -obj.head(false ? obj : s) -obj.head(false and "c") -obj.head(false and add) -obj.head(false and b) -obj.head(false and div) -obj.head(false and false) -obj.head(false and obj) -obj.head(false and s) -obj.head(false in nil) -obj.head(false or "b") -obj.head(false or b) -obj.head(false or f, get("a", arr)) -obj.head(false or ok) -obj.head(false or s) -obj.head(false or s, ok ? 0 : 0.5) -obj.head(false || 0) -obj.head(false || 1) -obj.head(false || add) -obj.head(false || arr) -obj.head(false || b) -obj.head(false || obj, get(arr, div)) -obj.head(false || s) -obj.head(false || true) -obj.head(false) && 2 == nil -obj.head(false) && arr == nil -obj.head(false) == a -obj.head(false, "b") || "b" startsWith "a" -obj.head(false, 0, nil, "c") == obj -obj.head(false, a) != arr -obj.head(false, arr, obj, 2, div) == arr -obj.head(false, f) != div -obj.head(false, obj) != a == ok -obj.head(false, ok) == obj.b -obj.head(filter("b", ok)) -obj.head(filter("c", ok), obj, get("c", add)) -obj.head(filter(arr, true)) -obj.head(filter(obj, false)) -obj.head(filter(s, ok)) -obj.head(first("a", 0.5, s)) -obj.head(first("b", add, nil, div)) -obj.head(first(0)) -obj.head(first(0.5)) -obj.head(first(0.5), obj?.a) == obj -obj.head(first(0.5, ok)) -obj.head(first(2)) -obj.head(first(a)) -obj.head(first(a, 1, f)) -obj.head(first(add)) -obj.head(first(arr)) -obj.head(first(b, arr)) -obj.head(first(false, obj)) -obj.head(first(nil, "b", obj)) -obj.head(first(obj)) -obj.head(first(ok, b)) -obj.head(first(ok, ok)) -obj.head(first(s)) -obj.head(float("a", a)) -obj.head(float(0)) -obj.head(float(1)) -obj.head(float(2)) -obj.head(float(a)) -obj.head(float(a), ok and f) -obj.head(float(a, 0, a)) -obj.head(float(a, b), add) -obj.head(float(add, 2)) -obj.head(float(arr, b)) -obj.head(float(b)) -obj.head(float(div, obj, add, 0), false && obj) -obj.head(float(f)) -obj.head(float(f), f) -obj.head(float(f, 0)) -obj.head(float(ok, b)) -obj.head(get("a")) -obj.head(get("a"))?.a -obj.head(get("a"), b) -obj.head(get("a", arr)) -obj.head(get("a", b)) -obj.head(get("a", div)) -obj.head(get("a", f)) -obj.head(get("a", obj)) -obj.head(get("a", ok)) -obj.head(get("b")) -obj.head(get("b", 0)) -obj.head(get("b", a)) -obj.head(get("b", add)) -obj.head(get("b", arr)) -obj.head(get("b", nil)) -obj.head(get("b", obj, a)) -obj.head(get("b", ok)) -obj.head(get("b", s)) -obj.head(get("c", a)) -obj.head(get("c", arr)) -obj.head(get("c", arr)) == a -obj.head(get("c", b)) -obj.head(get(0)) -obj.head(get(0, 0)) -obj.head(get(0, add)) -obj.head(get(0, arr)) -obj.head(get(0, arr), obj) -obj.head(get(0, arr)?.b) -obj.head(get(0, b)) -obj.head(get(0, div)) -obj.head(get(0, f), b) -obj.head(get(0, ok)) -obj.head(get(0, s)) -obj.head(get(0, true)) -obj.head(get(0.5)) -obj.head(get(0.5, 0)) -obj.head(get(0.5, arr)) -obj.head(get(0.5, false)) -obj.head(get(0.5, nil, arr, 1, 2)) -obj.head(get(0.5, obj)) -obj.head(get(0.5, obj), ok) -obj.head(get(1), map(arr, obj))?.b -obj.head(get(1, a)) -obj.head(get(1, div)) -obj.head(get(1, f)) -obj.head(get(1, false)) -obj.head(get(1, s)) -obj.head(get(2, f)) -obj.head(get(a, 0)) -obj.head(get(a, 0.5)) -obj.head(get(a, add)) -obj.head(get(a, b)) -obj.head(get(a, b), min(false)) -obj.head(get(a, div)) -obj.head(get(a, nil)) -obj.head(get(a, nil), arr) -obj.head(get(a, obj)) -obj.head(get(a, obj), div == nil) -obj.head(get(a, s)) -obj.head(get(add, 0.5)) -obj.head(get(add, 0.5), ok) -obj.head(get(add, 1)) -obj.head(get(add, 2)) -obj.head(get(add, a)) -obj.head(get(add, arr)) -obj.head(get(add, b)) -obj.head(get(add, div)) -obj.head(get(add, f)) -obj.head(get(add, f, a, s)) -obj.head(get(add, nil)) -obj.head(get(add, obj)) -obj.head(get(add, ok)) -obj.head(get(add, s)) -obj.head(get(arr)) -obj.head(get(arr, 0.5)) -obj.head(get(arr, 2)) -obj.head(get(arr, a)) -obj.head(get(arr, add)) -obj.head(get(arr, arr)) -obj.head(get(arr, f)) -obj.head(get(arr, f)) * f -obj.head(get(arr, f), add) -obj.head(get(arr, f, obj, a)) -obj.head(get(arr, nil)) -obj.head(get(arr, obj))?.a -obj.head(get(arr, ok)) -obj.head(get(arr, s)) -obj.head(get(b)) -obj.head(get(b, 0.5)) -obj.head(get(b, 2)) -obj.head(get(b, a)) -obj.head(get(b, add)) -obj.head(get(b, b)) -obj.head(get(b, b), div, toJSON(arr)) -obj.head(get(b, b), ok) -obj.head(get(b, div)) -obj.head(get(b, f)) -obj.head(get(b, nil)) -obj.head(get(b, obj)) -obj.head(get(b, ok)) -obj.head(get(b, s)) -obj.head(get(b, s))?.obj -obj.head(get(b, true)) -obj.head(get(b, true), ok)?.a -obj.head(get(div)) -obj.head(get(div, 0.5)) -obj.head(get(div, a)) -obj.head(get(div, add)) -obj.head(get(div, b)) -obj.head(get(div, b))?.obj -obj.head(get(div, div)) -obj.head(get(div, nil)) -obj.head(get(div, obj.b)) -obj.head(get(div, ok)) -obj.head(get(div, s)?.obj) -obj.head(get(div, true)) -obj.head(get(f, 0)) -obj.head(get(f, 0.5)) -obj.head(get(f, a)) -obj.head(get(f, add)) -obj.head(get(f, arr)) -obj.head(get(f, b)) -obj.head(get(f, div)) -obj.head(get(f, div, arr)) -obj.head(get(f, nil)) -obj.head(get(f, nil), add) -obj.head(get(f, nil, a), a) -obj.head(get(f, obj)) -obj.head(get(f, true)) -obj.head(get(false ? s : arr, obj?.head(a, add))) -obj.head(get(false, arr)) -obj.head(get(false, div)) -obj.head(get(false, false)) -obj.head(get(false, ok)) -obj.head(get(nil)) -obj.head(get(nil, 0)) -obj.head(get(nil, 0.5)) -obj.head(get(nil, 1)) -obj.head(get(nil, a), arr) -obj.head(get(nil, add)) -obj.head(get(nil, add))?.b -obj.head(get(nil, div)) -obj.head(get(nil, div)) != float(a ** 0) -obj.head(get(nil, f)) -obj.head(get(nil, nil)) -obj.head(get(nil, obj)) -obj.head(get(nil, ok)) -obj.head(get(nil, s)) -obj.head(get(nil, s), a) -obj.head(get(nil, true)) -obj.head(get(obj)) -obj.head(get(obj), ok) -obj.head(get(obj, 0)) -obj.head(get(obj, 1)) -obj.head(get(obj, 1))?.b -obj.head(get(obj, a)) -obj.head(get(obj, arr) != a) -obj.head(get(obj, arr)) -obj.head(get(obj, arr))?.obj -obj.head(get(obj, b)) -obj.head(get(obj, div)) -obj.head(get(obj, f)) -obj.head(get(obj, false)) -obj.head(get(obj, nil)) -obj.head(get(obj, obj)) -obj.head(get(obj, ok)) -obj.head(get(obj, s)) -obj.head(get(obj, true)) -obj.head(get(ok)) -obj.head(get(ok, 0)) -obj.head(get(ok, 0.5)) -obj.head(get(ok, 1)) -obj.head(get(ok, a))?.b -obj.head(get(ok, add)) -obj.head(get(ok, add), obj) -obj.head(get(ok, arr)) -obj.head(get(ok, div)) -obj.head(get(ok, f)) -obj.head(get(ok, false), map(arr, "a"), toJSON(0.5)) -obj.head(get(ok, nil)) -obj.head(get(ok, ok)) -obj.head(get(ok, ok), 0 + 0.5) -obj.head(get(ok, s), a > 0.5) -obj.head(get(ok, s), arr[0:b]) -obj.head(get(s)) -obj.head(get(s, "a", ok)) -obj.head(get(s, 0.5)) -obj.head(get(s, 1)) -obj.head(get(s, 1), b) -obj.head(get(s, a)) -obj.head(get(s, a), obj.head(0.5, div)) -obj.head(get(s, add)) -obj.head(get(s, arr)) -obj.head(get(s, div)) -obj.head(get(s, div))?.b -obj.head(get(s, f)) -obj.head(get(s, nil)) -obj.head(get(s, obj)) -obj.head(get(s, obj), get(a, f)) -obj.head(get(s, ok), true ? b : "a") -obj.head(get(s, true)) -obj.head(get(true && nil)) -obj.head(get(true)) -obj.head(get(true, 0)) -obj.head(get(true, 0), arr) -obj.head(get(true, a)) -obj.head(get(true, add)) -obj.head(get(true, add), arr) -obj.head(get(true, arr)) -obj.head(get(true, f), ok || 1) -obj.head(get(true, nil)) -obj.head(int("b", arr, f)) -obj.head(int("b", nil, a)) -obj.head(int(a)) -obj.head(int(a), string(true)) -obj.head(int(arr, a, f)) -obj.head(int(s, 0)) -obj.head(keys(obj)) -obj.head(last(0.5)) -obj.head(last(0.5), arr) -obj.head(last(0.5), get(nil, ok)) -obj.head(last(a)) -obj.head(last(a, "a")) -obj.head(last(a, obj)) -obj.head(last(add)) -obj.head(last(add), ok) -obj.head(last(add, obj, add)) -obj.head(last(arr)) -obj.head(last(arr, s), f) -obj.head(last(b)) -obj.head(last(b, b)) -obj.head(last(div)) -obj.head(last(f)) -obj.head(last(f, b, b)) -obj.head(last(false)) -obj.head(last(obj)) -obj.head(last(obj, 2, obj)) -obj.head(last(obj, a, s)) -obj.head(last(ok, arr, nil, ok)) -obj.head(last(s)) -obj.head(last(s, ok, a), nil == arr) -obj.head(len(add, add, s, obj)) -obj.head(len(add, obj)) -obj.head(len(arr)) -obj.head(len(b, s)) -obj.head(len(obj)) -obj.head(len(obj, "a")) -obj.head(len(s) <= f) -obj.head(len(s)) -obj.head(len(s, arr, "b"), obj?.b) -obj.head(lower(a, "b")) -obj.head(lower(a, div, "b")) -obj.head(lower(s)) -obj.head(map("a", 0.5)) -obj.head(map("a", a)) -obj.head(map("a", nil)) -obj.head(map("a", s)) -obj.head(map("b", 0)) -obj.head(map("b", div)) -obj.head(map("b", f)) -obj.head(map("b", nil)) -obj.head(map("b", s)) -obj.head(map("b", true)) -obj.head(map("c", "b")) -obj.head(map("c", a)) -obj.head(map("c", a), get(arr, div)) -obj.head(map("c", arr)) -obj.head(map("c", arr), ok) -obj.head(map("c", b)) -obj.head(map("c", f)) -obj.head(map("c", s)) -obj.head(map(arr, "c")) -obj.head(map(arr, 0)) -obj.head(map(arr, 1)) -obj.head(map(arr, a)) -obj.head(map(arr, arr)) -obj.head(map(arr, b)) -obj.head(map(arr, b), div != obj) -obj.head(map(arr, div)) -obj.head(map(arr, f)) -obj.head(map(arr, false)) -obj.head(map(arr, nil)) -obj.head(map(arr, obj), toJSON(b)) -obj.head(map(arr, ok) == b) -obj.head(map(arr, ok)) -obj.head(map(arr, s)) -obj.head(map(obj, "a")) -obj.head(map(obj, "b")) -obj.head(map(obj, "c")) -obj.head(map(obj, 0)) -obj.head(map(obj, 0.5)) -obj.head(map(obj, a)) -obj.head(map(obj, add)) -obj.head(map(obj, div)) -obj.head(map(obj, f)) -obj.head(map(obj, false)) -obj.head(map(obj, nil)) -obj.head(map(obj, obj)) -obj.head(map(obj, ok)) -obj.head(map(obj, s)) -obj.head(map(s, "a")) -obj.head(map(s, 0)) -obj.head(map(s, 0.5)) -obj.head(map(s, a)) -obj.head(map(s, add)) -obj.head(map(s, arr)) -obj.head(map(s, div)) -obj.head(map(s, f)) -obj.head(map(s, false)) -obj.head(map(s, get(f, f))) -obj.head(map(s, nil)) -obj.head(map(s, nil), obj.a) -obj.head(map(s, obj)) -obj.head(map(s, ok)) -obj.head(map(s, ok), int(b)) -obj.head(map(s, s)) -obj.head(map(s, true)) -obj.head(max("a")) -obj.head(max("c")) -obj.head(max(0.5)) -obj.head(max(1)) -obj.head(max(a)) -obj.head(max(add)) -obj.head(max(b)) -obj.head(max(f)) -obj.head(max(f), a) -obj.head(max(nil, 0), div) -obj.head(max(obj)) -obj.head(max(ok)) -obj.head(max(s)) -obj.head(min(0)) -obj.head(min(0, 0)) -obj.head(min(0, a, f, f)) -obj.head(min(a)) -obj.head(min(a, f), obj) -obj.head(min(add)) -obj.head(min(arr)) -obj.head(min(div)) -obj.head(min(f)) -obj.head(min(nil)) -obj.head(min(ok)) -obj.head(min(s)) -obj.head(min(true)) -obj.head(nil != 0) -obj.head(nil != 0, a) -obj.head(nil != a) -obj.head(nil != add) -obj.head(nil != add, f) -obj.head(nil != f) -obj.head(nil != false) -obj.head(nil != obj) -obj.head(nil != true) -obj.head(nil != true, obj?.b) -obj.head(nil && true) -obj.head(nil == "a") -obj.head(nil == 0) -obj.head(nil == 0.5) -obj.head(nil == a) -obj.head(nil == add) -obj.head(nil == b, arr) -obj.head(nil == f) -obj.head(nil == nil, div, a) -obj.head(nil == obj) -obj.head(nil == s) -obj.head(nil and false) -obj.head(nil and true) -obj.head(nil in arr, a) -obj.head(nil in obj) -obj.head(nil || true, b % a) -obj.head(nil) != div -obj.head(nil) != s -obj.head(nil) == f / f -obj.head(nil) in obj?.obj -obj.head(nil)?.a -obj.head(nil)?.a?.a -obj.head(nil)?.b -obj.head(nil)?.b.obj -obj.head(nil)?.fn(div) -obj.head(nil)?.fn(map(arr, arr)) -obj.head(nil)?.head(arr) -obj.head(nil)?.head(f ^ b) -obj.head(nil)?.obj -obj.head(nil)?.obj.a -obj.head(nil, "a", 0)?.obj -obj.head(nil, "b")?.a -obj.head(nil, "b")?.obj -obj.head(nil, "c")?.head(arr) -obj.head(nil, 0)?.b -obj.head(nil, 0, nil)?.obj -obj.head(nil, 0, obj, s)?.a -obj.head(nil, 0, s)?.b -obj.head(nil, 1)?.obj -obj.head(nil, 1, arr)?.obj -obj.head(nil, a)?.a.head(s, a) -obj.head(nil, a)?.b -obj.head(nil, a, 0)?.head(false or a) -obj.head(nil, a, a, arr)?.b -obj.head(nil, a, add)?.a -obj.head(nil, a, arr)?.b -obj.head(nil, a, b, true, a)?.b -obj.head(nil, a, f)?.b -obj.head(nil, add)?.b -obj.head(nil, add)?.b?.a -obj.head(nil, add, 2, ok) == ok -obj.head(nil, add, a)?.obj -obj.head(nil, add, b)?.a -obj.head(nil, add, b)?.fn(a) -obj.head(nil, add, b)?.obj -obj.head(nil, arr) == arr -obj.head(nil, arr)?.b -obj.head(nil, arr)?.b.obj -obj.head(nil, arr)?.obj -obj.head(nil, arr, 0.5, obj, ok)?.b -obj.head(nil, arr, arr)?.a -obj.head(nil, arr, div)?.a -obj.head(nil, arr, f)?.a -obj.head(nil, b)?.a -obj.head(nil, b)?.b?.obj -obj.head(nil, b)?.obj -obj.head(nil, b, 0, s, f)?.b -obj.head(nil, b, div) in arr -obj.head(nil, b, s)?.obj -obj.head(nil, div) == f -obj.head(nil, div)?.a -obj.head(nil, div)?.b -obj.head(nil, div, 0, b)?.b -obj.head(nil, div, a)?.b -obj.head(nil, div, nil, 1)?.obj -obj.head(nil, f)?.a -obj.head(nil, f)?.b.obj -obj.head(nil, f)?.obj -obj.head(nil, f, b, a)?.a?.b -obj.head(nil, f, div)?.a -obj.head(nil, f, div, arr)?.b -obj.head(nil, f, f)?.a -obj.head(nil, f, obj)?.a -obj.head(nil, false)?.a -obj.head(nil, false)?.b -obj.head(nil, nil)?.b -obj.head(nil, nil)?.obj -obj.head(nil, nil, add)?.a -obj.head(nil, nil, arr, nil, s)?.obj -obj.head(nil, obj)?.a -obj.head(nil, obj)?.b -obj.head(nil, obj)?.obj -obj.head(nil, obj, 1)?.b -obj.head(nil, obj, f, div, a)?.b -obj.head(nil, ok)?.a -obj.head(nil, ok)?.b -obj.head(nil, ok)?.obj -obj.head(nil, ok, 0.5)?.a -obj.head(nil, ok, f)?.head(ok) -obj.head(nil, ok, ok)?.obj -obj.head(nil, s)?.b -obj.head(nil, s)?.obj -obj.head(nil, s, a)?.b -obj.head(nil, true)?.a -obj.head(nil, true)?.b -obj.head(nil, true, 0)?.a -obj.head(nil, true, s)?.a -obj.head(none("c", false)) -obj.head(none(arr, false)) -obj.head(none(arr, ok)) -obj.head(none(obj, false)) -obj.head(none(obj, ok)) -obj.head(none(s, false)) -obj.head(none(s, ok)) -obj.head(none(s, true)) -obj.head(none(s, true), a) -obj.head(not (obj == obj)) -obj.head(not false) -obj.head(not ok) -obj.head(not true) -obj.head(now("b")) -obj.head(now("c")) -obj.head(now(1, s, 0), add) -obj.head(now(a)) -obj.head(now(add)) -obj.head(now(arr)) -obj.head(now(b)) -obj.head(now(b, nil)) -obj.head(now(div)) -obj.head(now(f)) -obj.head(now(f, a, s)) -obj.head(now(false, a, 0.5, arr)) -obj.head(now(nil)) -obj.head(now(nil, obj)) -obj.head(now(obj)) -obj.head(now(obj, div, ok, obj)) -obj.head(now(obj, ok)) -obj.head(now(ok)) -obj.head(now(ok, "b")) -obj.head(obj != "a") -obj.head(obj != 0) -obj.head(obj != a) -obj.head(obj != add) -obj.head(obj != arr) -obj.head(obj != b) -obj.head(obj != div) -obj.head(obj != f, filter("c", ok)) -obj.head(obj != obj) -obj.head(obj != obj, b, true and 2) -obj.head(obj != obj, get(add, a)) -obj.head(obj != ok) -obj.head(obj != s) -obj.head(obj && true) -obj.head(obj == 0) -obj.head(obj == 1) -obj.head(obj == add) -obj.head(obj == b) -obj.head(obj == div) -obj.head(obj == false) -obj.head(obj == nil) -obj.head(obj in nil) -obj.head(obj or true) -obj.head(obj) -obj.head(obj) != a ? nil : 2 -obj.head(obj) != add -obj.head(obj) == obj.a -obj.head(obj) == s -obj.head(obj).a -obj.head(obj).b -obj.head(obj).b * a -obj.head(obj).fn(add(b, b)) -obj.head(obj).head(add) -obj.head(obj).obj -obj.head(obj).obj != obj -obj.head(obj).obj.b -obj.head(obj)?.a -obj.head(obj)?.b -obj.head(obj)?.fn(a) -obj.head(obj)?.head(-0.5) -obj.head(obj)?.head(arr) -obj.head(obj)?.head(get(0.5 / f)) -obj.head(obj)?.head(last(ok, "b" contains "a")) -obj.head(obj)?.head(s) -obj.head(obj)?.obj -obj.head(obj)?.obj == add -obj.head(obj)?.obj.obj -obj.head(obj)?.obj?.a -obj.head(obj)?.obj?.obj -obj.head(obj, "a").a -obj.head(obj, "a")?.obj -obj.head(obj, "a", add, arr, div)?.b -obj.head(obj, "b" in arr) -obj.head(obj, "b").b -obj.head(obj, "b").obj -obj.head(obj, "b")?.a -obj.head(obj, "b", "b", arr)?.a -obj.head(obj, "b", a).a -obj.head(obj, "b", b)?.a -obj.head(obj, "b", div, div, a).obj -obj.head(obj, "c").obj -obj.head(obj, "c")?.obj -obj.head(obj, "c", obj)?.a -obj.head(obj, 0 ** f) -obj.head(obj, 0) == add -obj.head(obj, 0).b -obj.head(obj, 0).obj -obj.head(obj, 0)?.a -obj.head(obj, 0)?.b -obj.head(obj, 0)?.obj -obj.head(obj, 0, "b")?.a -obj.head(obj, 0, "b")?.b -obj.head(obj, 0, 0.5)?.obj?.obj?.b -obj.head(obj, 0, 1, nil).obj -obj.head(obj, 0, b).b -obj.head(obj, 0, f, true).b -obj.head(obj, 0, false)?.b -obj.head(obj, 0, ok)?.obj -obj.head(obj, 0, s)?.a -obj.head(obj, 0.5 ^ b) -obj.head(obj, 0.5).a -obj.head(obj, 0.5).b -obj.head(obj, 0.5).obj -obj.head(obj, 0.5)?.a -obj.head(obj, 0.5, "c")?.a -obj.head(obj, 0.5, div)?.obj -obj.head(obj, 0.5, obj).b -obj.head(obj, 1).b -obj.head(obj, 1).obj -obj.head(obj, 1)?.a -obj.head(obj, 1, a).obj?.obj?.a -obj.head(obj, 1, false).obj -obj.head(obj, 2, "a")?.b -obj.head(obj, 2, true) != s -obj.head(obj, a) -obj.head(obj, a).a -obj.head(obj, a).b -obj.head(obj, a)?.b -obj.head(obj, a)?.obj -obj.head(obj, a, 0).a -obj.head(obj, a, 1)?.b -obj.head(obj, a, 2, a).b -obj.head(obj, a, a).b -obj.head(obj, a, a, false).b -obj.head(obj, a, add, add, s).a -obj.head(obj, a, add, s)?.obj -obj.head(obj, a, arr).b -obj.head(obj, a, ok, b)?.obj -obj.head(obj, a, s, 2).obj -obj.head(obj, add) -obj.head(obj, add).a -obj.head(obj, add).b -obj.head(obj, add).obj -obj.head(obj, add)?.a -obj.head(obj, add)?.b -obj.head(obj, add)?.head(div) -obj.head(obj, add)?.obj -obj.head(obj, add, "c", false, div).b -obj.head(obj, add, 0, add).b -obj.head(obj, add, obj)?.b -obj.head(obj, add, ok, ok).a -obj.head(obj, arr) -obj.head(obj, arr).a -obj.head(obj, arr).b -obj.head(obj, arr)?.a -obj.head(obj, arr)?.b -obj.head(obj, arr, add)?.a -obj.head(obj, arr, arr).obj -obj.head(obj, arr, b).b -obj.head(obj, arr, b)?.obj -obj.head(obj, arr, b, obj, div)?.b -obj.head(obj, arr, obj, add)?.b -obj.head(obj, arr, ok).b -obj.head(obj, arr, ok).obj -obj.head(obj, arr, ok)?.obj -obj.head(obj, arr, ok, 0).a -obj.head(obj, arr, ok, arr).b -obj.head(obj, arr, s, b, add)?.obj -obj.head(obj, b) -obj.head(obj, b).a -obj.head(obj, b).b -obj.head(obj, b).obj -obj.head(obj, b)?.b -obj.head(obj, b)?.obj -obj.head(obj, b)?.obj?.obj -obj.head(obj, b, add).obj -obj.head(obj, b, b)?.a -obj.head(obj, b, b, a).obj -obj.head(obj, b, nil)?.obj -obj.head(obj, b, true)?.b -obj.head(obj, div) -obj.head(obj, div).a -obj.head(obj, div).obj -obj.head(obj, div)?.a -obj.head(obj, div)?.b -obj.head(obj, div)?.head(div) -obj.head(obj, div)?.obj -obj.head(obj, div, "a", a).obj -obj.head(obj, div, "b")?.a -obj.head(obj, div, "b")?.b -obj.head(obj, div, 0).a -obj.head(obj, div, 0, ok).b -obj.head(obj, div, arr, add)?.b -obj.head(obj, div, f, div, add)?.obj -obj.head(obj, div, f, obj, ok)?.obj -obj.head(obj, div, obj) -obj.head(obj, div, obj, a)?.obj -obj.head(obj, div, s) -obj.head(obj, f <= 0.5)?.a -obj.head(obj, f) -obj.head(obj, f).a -obj.head(obj, f).b -obj.head(obj, f).obj -obj.head(obj, f)?.a -obj.head(obj, f)?.b -obj.head(obj, f, 2)?.head(arr) -obj.head(obj, f, arr, a, "a").b -obj.head(obj, f, f, true, s)?.obj -obj.head(obj, f, obj).b -obj.head(obj, f, obj)?.a -obj.head(obj, false).a -obj.head(obj, false).b -obj.head(obj, false).obj -obj.head(obj, false)?.a -obj.head(obj, false, f).obj -obj.head(obj, false, ok, f).obj -obj.head(obj, false, s, ok).a -obj.head(obj, get(arr, b), b < b).b -obj.head(obj, get(ok, arr)) -obj.head(obj, last(add)) -obj.head(obj, map(obj, nil)) -obj.head(obj, nil).a -obj.head(obj, nil).b -obj.head(obj, nil)?.a -obj.head(obj, nil)?.b -obj.head(obj, nil)?.obj -obj.head(obj, nil, 1)?.obj -obj.head(obj, nil, a).b -obj.head(obj, nil, arr)?.a -obj.head(obj, nil, div).obj -obj.head(obj, nil, obj).a -obj.head(obj, not ok) -obj.head(obj, obj) -obj.head(obj, obj).b -obj.head(obj, obj).obj -obj.head(obj, obj)?.a -obj.head(obj, obj)?.obj -obj.head(obj, obj, arr).obj -obj.head(obj, obj, b).a -obj.head(obj, obj, b, ok, div).obj -obj.head(obj, obj, div) -obj.head(obj, obj, div)?.b -obj.head(obj, obj, false)?.a -obj.head(obj, obj, s)?.a -obj.head(obj, obj.obj) -obj.head(obj, ok in nil) -obj.head(obj, ok or 0, s == "a", add, max("c")) -obj.head(obj, ok) -obj.head(obj, ok) and false ? 1 : arr -obj.head(obj, ok).a -obj.head(obj, ok).b -obj.head(obj, ok)?.a -obj.head(obj, ok)?.b -obj.head(obj, ok)?.obj -obj.head(obj, ok, "b")?.a -obj.head(obj, ok, a)?.head(f) -obj.head(obj, ok, add).obj -obj.head(obj, ok, b).b -obj.head(obj, ok, f)?.b -obj.head(obj, ok, nil)?.a -obj.head(obj, ok, obj)?.b -obj.head(obj, ok, s)?.a -obj.head(obj, ok, true, s)?.obj -obj.head(obj, s) -obj.head(obj, s).a -obj.head(obj, s).b -obj.head(obj, s)?.a -obj.head(obj, s)?.b -obj.head(obj, s)?.obj -obj.head(obj, s, 0, nil).a -obj.head(obj, s, 2, b)?.obj -obj.head(obj, s, a)?.b -obj.head(obj, s, b)?.a -obj.head(obj, s, div, s)?.obj -obj.head(obj, true != 0.5, add, abs(b)) -obj.head(obj, true) == obj?.b -obj.head(obj, true).b -obj.head(obj, true)?.obj -obj.head(obj, true)[s] -obj.head(obj, true, "a").b -obj.head(obj, true, "a", div, true)?.a -obj.head(obj.a) -obj.head(obj.a, f && false) -obj.head(obj.a, map(obj, "a"), obj) -obj.head(obj.b) -obj.head(obj.b, 0 == obj) -obj.head(obj.b, 0.5 != nil) -obj.head(obj.b, arr) -obj.head(obj.b, false ? 0 : add) -obj.head(obj.b, true ? arr : 0) -obj.head(obj.fn(0)) -obj.head(obj.fn(a)) -obj.head(obj.fn(b)) -obj.head(obj.head(0)) -obj.head(obj.head(0, b, b, obj)) -obj.head(obj.head(0.5), string(f, a)) -obj.head(obj.head(1, ok, b, 0, div)) -obj.head(obj.head(a)) -obj.head(obj.head(a), arr) -obj.head(obj.head(a, b)) -obj.head(obj.head(add)) -obj.head(obj.head(add, a, false)) -obj.head(obj.head(arr)) -obj.head(obj.head(arr), f) -obj.head(obj.head(arr), ok) -obj.head(obj.head(arr, 0.5)) -obj.head(obj.head(b, add)) -obj.head(obj.head(b, obj, ok)) -obj.head(obj.head(div)) -obj.head(obj.head(false)) -obj.head(obj.head(false, false, "a", "c", 2)) -obj.head(obj.head(nil)) -obj.head(obj.head(nil, b)) -obj.head(obj.head(nil, nil)) -obj.head(obj.head(obj)) -obj.head(obj.head(obj, s, a, s, add)).obj -obj.head(obj.head(ok)) -obj.head(obj.head(ok, b)) -obj.head(obj.head(ok, s, 0)) -obj.head(obj.head(s)) -obj.head(obj.head(true)) -obj.head(obj.obj) -obj.head(obj.obj)?.a -obj.head(obj.obj)?.b -obj.head(obj.obj, div, b) -obj.head(obj.obj, f) -obj.head(obj?.a) -obj.head(obj?.a, first(div)) -obj.head(obj?.a, get(div, add)) -obj.head(obj?.a, ok) -obj.head(obj?.b) -obj.head(obj?.b, a) -obj.head(obj?.b, div) -obj.head(obj?.b, f) -obj.head(obj?.b, get(0, div)) -obj.head(obj?.b, s) -obj.head(obj?.c) -obj.head(obj?.fn(1)) -obj.head(obj?.fn(a)) -obj.head(obj?.fn(b)) -obj.head(obj?.head("a", 1)) -obj.head(obj?.head("a", ok, 0.5, a)) -obj.head(obj?.head("b")) -obj.head(obj?.head(0.5)) -obj.head(obj?.head(0.5), obj?.obj) -obj.head(obj?.head(0.5, add)) -obj.head(obj?.head(1)) -obj.head(obj?.head(2)) -obj.head(obj?.head(2, f, 0.5, "b", b)) -obj.head(obj?.head(a)) -obj.head(obj?.head(a, f, obj, obj, nil)) -obj.head(obj?.head(add)) -obj.head(obj?.head(arr)) -obj.head(obj?.head(arr, true)) -obj.head(obj?.head(b)) -obj.head(obj?.head(b, a), a && true) -obj.head(obj?.head(b, b)) -obj.head(obj?.head(div)) -obj.head(obj?.head(div), get(s, 1)) -obj.head(obj?.head(f), get(nil, a, "b")) -obj.head(obj?.head(false)) -obj.head(obj?.head(false, arr)) -obj.head(obj?.head(false, false)) -obj.head(obj?.head(false, obj), b) -obj.head(obj?.head(nil)) -obj.head(obj?.head(nil, a)) -obj.head(obj?.head(nil, true), a / f) -obj.head(obj?.head(obj)) -obj.head(obj?.head(obj).head(arr)) -obj.head(obj?.head(obj, div, obj)) -obj.head(obj?.head(ok)) -obj.head(obj?.head(ok, "b", true, b, f)) -obj.head(obj?.head(ok, b, false)) -obj.head(obj?.head(ok, ok, ok)) -obj.head(obj?.head(s)) -obj.head(obj?.head(s, "b"), b, a) -obj.head(obj?.head(true, ok)) -obj.head(obj?.obj) -obj.head(obj?.obj).a -obj.head(obj?.obj).obj -obj.head(obj?.obj)?.obj -obj.head(obj?.obj, add != nil) -obj.head(obj?.obj, b) -obj.head(obj?.obj, obj?.obj) -obj.head(obj[s])?.obj -obj.head(ok != "b", obj.a) -obj.head(ok != 0) -obj.head(ok != add) -obj.head(ok != arr) -obj.head(ok != f) -obj.head(ok != nil) -obj.head(ok != obj) -obj.head(ok != ok) -obj.head(ok != s) -obj.head(ok != true) -obj.head(ok && "c") -obj.head(ok && "c", ok) -obj.head(ok && 0) -obj.head(ok && 0, s) -obj.head(ok && 0.5) -obj.head(ok && a) -obj.head(ok && add) -obj.head(ok && add, div) -obj.head(ok && arr) -obj.head(ok && arr, a ^ 0, add) -obj.head(ok && b) -obj.head(ok && div) -obj.head(ok && f) -obj.head(ok && false) -obj.head(ok && nil) -obj.head(ok && s) -obj.head(ok && true) -obj.head(ok == 0) -obj.head(ok == 0.5) -obj.head(ok == 2, a / 0.5) -obj.head(ok == a) -obj.head(ok == add) -obj.head(ok == arr) -obj.head(ok == b) -obj.head(ok == f) -obj.head(ok == false) -obj.head(ok == ok) -obj.head(ok == s) -obj.head(ok ? 0 : add) -obj.head(ok ? 2 : s) -obj.head(ok ? add : 0) -obj.head(ok ? arr : false) -obj.head(ok ? arr : ok) -obj.head(ok ? b : f) -obj.head(ok ? b : nil) -obj.head(ok ? div : 0) -obj.head(ok ? obj : s) -obj.head(ok ? ok : obj) -obj.head(ok ? ok : s) -obj.head(ok ? s : add) -obj.head(ok and a) == obj -obj.head(ok and add) -obj.head(ok and arr) -obj.head(ok and div) -obj.head(ok and f) -obj.head(ok and obj) -obj.head(ok and true) -obj.head(ok in map("b", nil)) -obj.head(ok or "a") -obj.head(ok or "c") -obj.head(ok or 0) -obj.head(ok or 1) -obj.head(ok or a) -obj.head(ok or add) -obj.head(ok or div) -obj.head(ok or false) -obj.head(ok or int(a)?.a?.b) -obj.head(ok or obj) -obj.head(ok or ok) -obj.head(ok or s, get(0, nil)) -obj.head(ok || "a") -obj.head(ok || a) -obj.head(ok || add) -obj.head(ok || arr) -obj.head(ok || arr, any(obj, ok), b) -obj.head(ok || div) -obj.head(ok || f) -obj.head(ok || nil) -obj.head(ok || ok) -obj.head(ok || s) -obj.head(ok) -obj.head(ok) != add -obj.head(ok) != arr -obj.head(ok) != f -obj.head(ok) != obj.a -obj.head(ok) && obj.a -obj.head(ok) == add -obj.head(ok) == string(a) -obj.head(ok) ? arr : ok -obj.head(ok) or !false -obj.head(ok) or ok -obj.head(ok, 1) == obj?.a -obj.head(ok, 2, 0) != ok -obj.head(ok, a + a) -obj.head(ok, a <= a) -obj.head(ok, a) == obj -obj.head(ok, add) -obj.head(ok, add) && obj.b -obj.head(ok, arr, "a") or f != nil -obj.head(ok, div) -obj.head(ok, div) || obj.a.head(ok, a.head(nil, div) < false < "c", add) -obj.head(ok, f != "a") -obj.head(ok, f) -obj.head(ok, false) == add(1, 1) -obj.head(ok, get(a, obj)) -obj.head(ok, get(nil, a)) -obj.head(ok, map(obj, f)) -obj.head(ok, obj) -obj.head(ok, obj.head(f)) -obj.head(ok, obj.obj) -obj.head(ok, ok, div) -obj.head(ok, s && false) -obj.head(ok, s) -obj.head(ok, s, add) -obj.head(one("c", ok)) -obj.head(one(obj, ok)) -obj.head(one(s, false)) -obj.head(one(s, ok)) -obj.head(repeat("b", b)) -obj.head(repeat(s, 0)) -obj.head(s != "c") -obj.head(s != 2, 0 .. b) -obj.head(s != add, f ^ 0) -obj.head(s != arr) -obj.head(s != false) -obj.head(s != obj) -obj.head(s != ok) -obj.head(s != s) -obj.head(s + "a") -obj.head(s + s) -obj.head(s < "b") -obj.head(s < s) -obj.head(s <= "b", arr) -obj.head(s <= s) -obj.head(s == a) -obj.head(s == arr) -obj.head(s == b) -obj.head(s == div) -obj.head(s == f, a) -obj.head(s == false) -obj.head(s == ok) -obj.head(s == true) -obj.head(s > "b") -obj.head(s >= "c") -obj.head(s and false) -obj.head(s contains s) -obj.head(s contains s, obj.a) -obj.head(s matches "b") -obj.head(s matches "c") -obj.head(s startsWith s) -obj.head(s) -obj.head(s) != "a" ? ok : s -obj.head(s) != a -obj.head(s) != obj?.obj -obj.head(s) != string(b) -obj.head(s) != true ? f : true -obj.head(s) == 0 .. b -obj.head(s) == div -obj.head(s) == div != ok -obj.head(s) == f -obj.head(s) == nil ? arr : 0 -obj.head(s) == obj -obj.head(s) in obj -obj.head(s) in obj.obj -obj.head(s) matches s ? obj : b -obj.head(s) or false and ok -obj.head(s)[a] -obj.head(s)[obj?.b] -obj.head(s, "a" == "a") -obj.head(s, 0) <= s -obj.head(s, 0, nil, a) <= s -obj.head(s, 0.5 ** 1) -obj.head(s, 0.5, 0.5) >= s -obj.head(s, 2)[obj?.a] -obj.head(s, a + f) -obj.head(s, a) -obj.head(s, all(arr, true), 0.5 * 0.5) -obj.head(s, b ^ 0) -obj.head(s, b) -obj.head(s, b) == div -obj.head(s, div) -obj.head(s, f * b) -obj.head(s, f == obj) -obj.head(s, f) -obj.head(s, f, obj) -obj.head(s, false and nil) -obj.head(s, false, true)[b] -obj.head(s, get("a", obj), s != f) -obj.head(s, nil != arr, ok) -obj.head(s, now(add)) -obj.head(s, now(nil)) -obj.head(s, obj == arr) -obj.head(s, obj) -obj.head(s, ok, a) -obj.head(s, s) -obj.head(s, s) != obj.a -obj.head(s[0]) -obj.head(s[a:1]) -obj.head(s[f]) -obj.head(splitAfter("c", "c")) -obj.head(string("a"), obj, a) -obj.head(string("c", ok, ok)) -obj.head(string(0, ok)) -obj.head(string(0.5, "a", b)) -obj.head(string(1)) -obj.head(string(2, nil)) -obj.head(string(a)) -obj.head(string(a, nil)) -obj.head(string(add)) -obj.head(string(add, a, arr, f)) -obj.head(string(arr)) -obj.head(string(arr, b, f, s, f)) -obj.head(string(arr, obj, s, arr), all("c", ok)) -obj.head(string(b)) -obj.head(string(b, arr)) -obj.head(string(div)) -obj.head(string(div), ok == 1) -obj.head(string(f, ok)) -obj.head(string(obj, false)) -obj.head(string(ok)) -obj.head(string(ok, true)) -obj.head(string(s)) -obj.head(string(s), div) -obj.head(string(s, 0, obj)) -obj.head(string(true, div, obj, b)) -obj.head(toBase64("a", "b")) -obj.head(toBase64("c")) -obj.head(toBase64("c", b, a)) -obj.head(toBase64(s)) -obj.head(toJSON("a")) -obj.head(toJSON("b")) -obj.head(toJSON("b"), obj) -obj.head(toJSON("c")) -obj.head(toJSON("c", s)) -obj.head(toJSON(0)) -obj.head(toJSON(0, 0.5)) -obj.head(toJSON(0.5 < a)) -obj.head(toJSON(0.5)) -obj.head(toJSON(0.5, f, arr)) -obj.head(toJSON(1, ok, arr)) -obj.head(toJSON(2), f, 0.5 < f) -obj.head(toJSON(a, f, 0, f)) -obj.head(toJSON(arr)) -obj.head(toJSON(b, add, ok)) -obj.head(toJSON(b, f, b)) -obj.head(toJSON(f)) -obj.head(toJSON(f, "b")) -obj.head(toJSON(f, add, nil, obj)) -obj.head(toJSON(f, div)) -obj.head(toJSON(false), ok) -obj.head(toJSON(false, f)) -obj.head(toJSON(nil)) -obj.head(toJSON(nil, div)) -obj.head(toJSON(ok)) -obj.head(toJSON(ok, obj, f)) -obj.head(toJSON(s, nil, ok)) -obj.head(toJSON(true), string(nil)) -obj.head(trim(s)) -obj.head(trimPrefix("c")) -obj.head(trimPrefix(s), s) -obj.head(trimSuffix("b")) -obj.head(trimSuffix("c")) -obj.head(trimSuffix(s)) -obj.head(true != 0) -obj.head(true != add) -obj.head(true != add, b == false) -obj.head(true != div) -obj.head(true != f, a) -obj.head(true != obj) -obj.head(true != ok, string(false, b, b, arr)) -obj.head(true && a) != f -obj.head(true && add, get(nil, ok)) -obj.head(true && ok) -obj.head(true && s) -obj.head(true == "a") -obj.head(true == 0.5) -obj.head(true == a) -obj.head(true == arr, ok) -obj.head(true == f) -obj.head(true == nil) -obj.head(true ? add : false) -obj.head(true ? arr : b) -obj.head(true ? b : ok startsWith add.fn(true)) -obj.head(true ? div : arr, b) -obj.head(true ? f : "b", s) -obj.head(true ? obj : f) -obj.head(true ? obj : nil) -obj.head(true ? s : "a") -obj.head(true and a) -obj.head(true and arr) -obj.head(true and b, s) -obj.head(true and div) -obj.head(true and nil) -obj.head(true and obj) -obj.head(true in arr) -obj.head(true in nil) -obj.head(true or 0) -obj.head(true or 1, b) -obj.head(true or a) -obj.head(true or arr) -obj.head(true or b) -obj.head(true or obj) -obj.head(true or ok) -obj.head(true || arr) -obj.head(true || obj) -obj.head(true) != b -obj.head(true) != obj -obj.head(true) && obj?.obj?.b -obj.head(true) == f -obj.head(true, 0) or ok -obj.head(true, add) or obj.b -obj.head(true, add, b) && ok -obj.head(true, div) || 0 == f -obj.head(true, f) == s -obj.head(upper("b"), b) -obj.head(upper("c")) -obj.head(upper("c"), b) -obj.head(upper(a, "c")) -obj.head(upper(s)) -obj.head(upper(s, a, 0.5, s)) -obj.head(upper(true, "a")) -obj.head(values(obj)) -obj.head({"a": add}) -obj.head({"b": add, "b": b, "c": s}) -obj.obj -obj.obj != 2 % 1 -obj.obj != a -obj.obj != a / 1 -obj.obj != a == true -obj.obj != a ? f : true -obj.obj != add -obj.obj != add(a, a) -obj.obj != any(arr, true) -obj.obj != arr -obj.obj != arr ? false : b -obj.obj != b -obj.obj != b .. b -obj.obj != b ? a : s -obj.obj != div -obj.obj != div(b, b) -obj.obj != f -obj.obj != f != nil -obj.obj != f / f -obj.obj != float(b) -obj.obj != min(b) -obj.obj != obj -obj.obj != obj.a -obj.obj != obj.head(0) -obj.obj != obj?.a -obj.obj != obj?.b -obj.obj != ok -obj.obj != s -obj.obj != string(0.5) -obj.obj != string(2) -obj.obj && !false -obj.obj == -b -obj.obj == 0 == nil ? get(arr, a) : ok -obj.obj == 2 ** f -obj.obj == a -obj.obj == a ** f -obj.obj == add -obj.obj == add ? arr : obj -obj.obj == add ? div : "c" -obj.obj == add(a, 0) -obj.obj == any(arr, false) -obj.obj == arr -obj.obj == b -obj.obj == div -obj.obj == div != ok -obj.obj == f -obj.obj == f == ok -obj.obj == f ? div : 0.5 -obj.obj == none(arr, ok) -obj.obj == not true -obj.obj == obj -obj.obj == obj.obj -obj.obj == obj.obj?.obj -obj.obj == obj?.b -obj.obj == obj?.head(0, ok) -obj.obj == ok -obj.obj == ok == ok -obj.obj == s -obj.obj == true ? 1 : a -obj.obj == true ? nil : "a" -obj.obj in arr -obj.obj in map(arr, "a") -obj.obj or "b" == "a" -obj.obj or false and obj?.b?.b -obj.obj.a -obj.obj.a != b -obj.obj.a ** a -obj.obj.b -obj.obj.b ** b -obj.obj.b .. b -obj.obj.b < b -obj.obj.b ^ -f ^ -f -obj.obj.obj -obj.obj.obj.a -obj.obj.obj.b -obj.obj.obj.obj -obj.obj.obj?.a -obj.obj.obj?.b -obj.obj.obj?.obj -obj.obj?.a -obj.obj?.a ** f -obj.obj?.a == arr -obj.obj?.b -obj.obj?.b != add -obj.obj?.b * f -obj.obj?.obj -obj.obj?.obj != b -obj.obj?.obj.a -obj.obj?.obj.b -obj.obj?.obj.obj -obj.obj?.obj?.a -obj.obj?.obj?.b -obj.obj?.obj?.obj -obj.obj?.obj[s] -obj.obj[obj.head(nil)] -obj.obj[s] -obj.obj[toJSON(s)] -obj.obj[trimPrefix(s)] -obj?.a -obj?.a != (ok and ok) -obj?.a != a -obj?.a != add -obj?.a != arr -obj?.a != b -obj?.a != div -obj?.a != f -obj?.a != f ** a -obj?.a != obj -obj?.a != obj.head(s, div, "b", 1) -obj?.a != obj.obj -obj?.a != obj?.a -obj?.a != obj?.b -obj?.a != ok -obj?.a != ok ? b : arr -obj?.a != s -obj?.a != s != false -obj?.a != toJSON(arr) -obj?.a != trimPrefix("a") -obj?.a % a -obj?.a % b -obj?.a % obj.a -obj?.a % obj?.b -obj?.a * -0.5 -obj?.a * a -obj?.a * arr[a] -obj?.a * b -obj?.a * f -obj?.a * min(f, f) -obj?.a * obj.a -obj?.a ** a -obj?.a ** abs(0) -obj?.a ** add(b, 0) -obj?.a ** b -obj?.a ** f -obj?.a ** obj?.head(f, ok) -obj?.a + a -obj?.a + abs(a) -obj?.a + add(0, 0) -obj?.a + arr[b] -obj?.a + b -obj?.a + f -obj?.a + f ** a -obj?.a + obj.a -obj?.a + obj?.a -obj?.a + obj?.b -obj?.a - 0 % 1 -obj?.a - 0 * 0 -obj?.a - 0 * 0.5 -obj?.a - 0 * 2 -obj?.a - a -obj?.a - b -obj?.a - f -obj?.a - obj.b -obj?.a - obj?.a -obj?.a .. a -obj?.a .. b -obj?.a .. count(arr, true) -obj?.a .. div(b, 2) -obj?.a .. obj.b -obj?.a .. obj?.a -obj?.a / (b + f) -obj?.a / a -obj?.a / b -obj?.a / b ** f -obj?.a / f -obj?.a / obj.head(b, a) -obj?.a / obj?.b -obj?.a < a -obj?.a < a ? "c" : add -obj?.a < a ? s : false -obj?.a < b -obj?.a < f -obj?.a < float(b) -obj?.a < obj.a -obj?.a < obj?.a -obj?.a <= 0 * 0.5 -obj?.a <= 0 == false -obj?.a <= 2 ? b : ok -obj?.a <= a -obj?.a <= a + f -obj?.a <= b -obj?.a <= b + a -obj?.a <= count(arr, ok) -obj?.a <= div(b, a) -obj?.a <= f -obj?.a <= f ^ f -obj?.a <= len(arr) -obj?.a <= obj.head(0.5, add, false, nil) -obj?.a <= obj?.b -obj?.a == -1 -obj?.a == 0.5 ^ a -obj?.a == a -obj?.a == a ** f -obj?.a == add -obj?.a == arr -obj?.a == b -obj?.a == b ? ok : obj -obj?.a == count(arr, ok) -obj?.a == div -obj?.a == div ? 2 : true -obj?.a == div ? b : div -obj?.a == div ? s : b -obj?.a == f -obj?.a == f != ok -obj?.a == f ^ 0.5 -obj?.a == min(2, 0) -obj?.a == nil ? 0 : a -obj?.a == obj -obj?.a == ok -obj?.a == s -obj?.a == toJSON(s) -obj?.a > -1 -obj?.a > 1 ? 2 : 0.5 -obj?.a > a -obj?.a > a ^ f -obj?.a > b -obj?.a > b + a -obj?.a > b ? "b" : obj.a -obj?.a > f -obj?.a > f * b -obj?.a > get(arr, 0) -obj?.a > obj.a -obj?.a > obj?.a -obj?.a > obj?.b -obj?.a >= 0 != nil -obj?.a >= 0 * 0 -obj?.a >= 2 != nil -obj?.a >= 2 / a -obj?.a >= a -obj?.a >= b -obj?.a >= div(b, a) -obj?.a >= f -obj?.a >= f ? true : a == obj?.a?.a -obj?.a >= obj.a -obj?.a >= obj.b -obj?.a >= obj.head(2, obj) -obj?.a >= obj?.a -obj?.a >= obj?.head(f, f) -obj?.a ^ (b * 1) -obj?.a ^ -b -obj?.a ^ a -obj?.a ^ arr[b] -obj?.a ^ b -obj?.a ^ f -obj?.a ^ len(s) -obj?.a ^ obj.a -obj?.a ^ obj?.a -obj?.a ^ obj?.b -obj?.a ^ obj?.head(b, "c", 1) -obj?.a in arr -obj?.a in values(obj) -obj?.a || !true -obj?.a || not false -obj?.b -obj?.b != "a" ? f : false -obj?.b != "a" ? nil : nil -obj?.b != 0 ** f -obj?.b != 0.5 + b -obj?.b != 2 * b -obj?.b != a -obj?.b != a ? a : add -obj?.b != a ? false : b -obj?.b != add -obj?.b != add == nil -obj?.b != add ? 0 : "a" -obj?.b != arr -obj?.b != arr[a] -obj?.b != b -obj?.b != b ** 0 -obj?.b != div -obj?.b != div ? div : 2 -obj?.b != f -obj?.b != float(b) -obj?.b != map(arr, a) -obj?.b != map(arr, arr) -obj?.b != max(0) -obj?.b != min(a) -obj?.b != obj -obj?.b != obj.head(b, b) -obj?.b != obj.obj -obj?.b != obj?.a -obj?.b != ok -obj?.b != s -obj?.b != toBase64(s) -obj?.b % -a -obj?.b % a -obj?.b % b -obj?.b % get(arr, 2) -obj?.b % obj.a -obj?.b % obj.head(a, f, arr) -obj?.b % obj?.a -obj?.b % obj?.head(1) -obj?.b * (a + a) -obj?.b * (f + b) -obj?.b * 0 ^ f -obj?.b * a -obj?.b * a ** b -obj?.b * a / f -obj?.b * b -obj?.b * div(b, a) -obj?.b * f -obj?.b * float(b) -obj?.b * obj.a -obj?.b * obj.head(2, add) -obj?.b * obj.head(b, 0) -obj?.b * obj?.b -obj?.b ** (0 + b) -obj?.b ** (b + b) -obj?.b ** a -obj?.b ** add(a, 0) -obj?.b ** b -obj?.b ** b ^ 0.5 -obj?.b ** f -obj?.b ** max(0) -obj?.b ** obj.a -obj?.b ** obj.b -obj?.b ** obj.head(a) -obj?.b ** obj?.a -obj?.b + a -obj?.b + add(b, 2) -obj?.b + b -obj?.b + b * f -obj?.b + div(a, 2) -obj?.b + obj.a -obj?.b + obj.b -obj?.b + obj?.b -obj?.b - -a -obj?.b - 0 * 0 -obj?.b - 0 + a -obj?.b - 0 ^ b -obj?.b - a -obj?.b - a + a -obj?.b - b -obj?.b - b - 1 -obj?.b - f -obj?.b - f ** a -obj?.b - obj.a -obj?.b - obj.b -obj?.b - obj?.a -obj?.b .. 2 - 0 -obj?.b .. a -obj?.b .. add(b, a) -obj?.b .. b -obj?.b .. obj.b -obj?.b .. obj?.a -obj?.b .. obj?.b -obj?.b .. obj?.fn(a) -obj?.b / (0 - b) -obj?.b / 0 * f -obj?.b / 0.5 ** b -obj?.b / a -obj?.b / b -obj?.b / count(arr, ok) -obj?.b / div(a, b) -obj?.b / f -obj?.b / get(arr, 0) -obj?.b / obj.b -obj?.b / obj?.a -obj?.b / obj?.b -obj?.b < 0 != ok -obj?.b < 1 + 2 -obj?.b < 1 - a -obj?.b < a -obj?.b < add(b, 0) -obj?.b < b -obj?.b < b != ok -obj?.b < f -obj?.b < f * b -obj?.b < obj?.b -obj?.b <= -a -obj?.b <= a -obj?.b <= add(0, 1) -obj?.b <= b -obj?.b <= f -obj?.b <= f + b -obj?.b <= f / 2 -obj?.b <= f / b -obj?.b <= obj?.b -obj?.b == !false -obj?.b == 0 * a -obj?.b == 1 .. 0 -obj?.b == a -obj?.b == a + f -obj?.b == add -obj?.b == arr -obj?.b == arr ? add : s -obj?.b == b -obj?.b == b - a -obj?.b == div -obj?.b == f -obj?.b == obj -obj?.b == obj.obj -obj?.b == obj?.b -obj?.b == obj?.obj -obj?.b == ok -obj?.b == s -obj?.b == s == nil -obj?.b == s == ok -obj?.b == s ? 0.5 : "a" -obj?.b == s ? add : obj -obj?.b == upper("c") -obj?.b > 0 * a -obj?.b > a -obj?.b > b -obj?.b > b ^ 0 -obj?.b > f -obj?.b > max(1) -obj?.b > min(0.5) -obj?.b >= -a -obj?.b >= 0 ** a -obj?.b >= 0.5 != true -obj?.b >= 0.5 ? div : arr -obj?.b >= a -obj?.b >= b -obj?.b >= b + 0 -obj?.b >= b + b -obj?.b >= div(b, 1) -obj?.b >= f -obj?.b >= max(f, f) -obj?.b >= obj.a -obj?.b >= obj.head(a, arr, add) -obj?.b >= obj?.b -obj?.b ^ (0 * f) -obj?.b ^ -b -obj?.b ^ a -obj?.b ^ arr[2] -obj?.b ^ b -obj?.b ^ f -obj?.b ^ int(f) -obj?.b ^ obj.a -obj?.b ^ obj.head(0) -obj?.b ^ obj?.head(obj, obj, a).a -obj?.b and (true || false) -obj?.b in arr -obj?.b in arr ? arr : a -obj?.b in map(arr, true) -obj?.c != div -obj?.c != obj -obj?.c?.a -obj?.c?.a?.b -obj?.c?.b -obj?.c?.b.obj -obj?.c?.fn(div) -obj?.c?.obj -obj?.c?.obj.b -obj?.fn(-0) -obj?.fn(-1) -obj?.fn(-2) -obj?.fn(-a) -obj?.fn(-b) -obj?.fn(0 % a) -obj?.fn(0 * a) -obj?.fn(0 + 0) -obj?.fn(0 + a) -obj?.fn(0 + b) -obj?.fn(0 - 0) -obj?.fn(0 - b) -obj?.fn(0 or false) -obj?.fn(0) != a -obj?.fn(0) != ok -obj?.fn(0) != {"b": 1, "a": div} -obj?.fn(0) ** f -obj?.fn(0) + b -obj?.fn(0) / b -obj?.fn(0) == a -obj?.fn(0) == add -obj?.fn(0) == obj -obj?.fn(0) >= b -obj?.fn(0) ^ b -obj?.fn(0) ^ obj?.a -obj?.fn(1 % a) -obj?.fn(1 * b) -obj?.fn(1 + 0) -obj?.fn(1 + a) -obj?.fn(1 - b) -obj?.fn(1) != string(f) -obj?.fn(1) * f / b -obj?.fn(1) / b -obj?.fn(1) < obj.head(0.5, s) -obj?.fn(1) < obj?.head(a) -obj?.fn(2 - 0) -obj?.fn(2 - b) -obj?.fn(2) % a -obj?.fn(2) - obj.head(0.5, 0, b, 0.5) -obj?.fn(2) <= a -obj?.fn(2) == arr ? obj : b -obj?.fn(a % 2) -obj?.fn(a % a) -obj?.fn(a % b) -obj?.fn(a * 0) -obj?.fn(a * 1) -obj?.fn(a * 2) -obj?.fn(a * a) -obj?.fn(a + 2) -obj?.fn(a + a) -obj?.fn(a + b) -obj?.fn(a - 1) -obj?.fn(a - 2) -obj?.fn(a - b) -obj?.fn(a || false) -obj?.fn(a) -obj?.fn(a) != 0 .. b -obj?.fn(a) != arr -obj?.fn(a) != b -obj?.fn(a) != div -obj?.fn(a) != toBase64(s) -obj?.fn(a) - 0.5 ** f -obj?.fn(a) .. b -obj?.fn(a) / a -obj?.fn(a) == add -obj?.fn(a) == s -obj?.fn(a) > b -obj?.fn(a) > obj.a -obj?.fn(a) >= a -obj?.fn(a) ^ a -obj?.fn(a) || ok || true -obj?.fn(abs(0.5, div, a)) -obj?.fn(abs(2)) -obj?.fn(abs(a)) -obj?.fn(abs(add, b, "b", a)) -obj?.fn(abs(arr, a)) -obj?.fn(abs(b)) -obj?.fn(abs(s, a)) -obj?.fn(add(0, 1)) -obj?.fn(add(0, b)) -obj?.fn(add(1, 0)) -obj?.fn(add(1, 2)) -obj?.fn(add(2, a)) -obj?.fn(add(2, b)) -obj?.fn(add(a, 0)) -obj?.fn(add(a, 2)) -obj?.fn(add(a, b)) -obj?.fn(add(b, a)) -obj?.fn(add(b, b)) -obj?.fn(arr[0.5]) -obj?.fn(arr[1]) -obj?.fn(arr[b]) -obj?.fn(arr[f]) -obj?.fn(b % 2) -obj?.fn(b % a) -obj?.fn(b && true) -obj?.fn(b * b) -obj?.fn(b + 0) -obj?.fn(b + a) -obj?.fn(b + b) -obj?.fn(b - a) -obj?.fn(b - b) -obj?.fn(b) -obj?.fn(b) != (false and ok) -obj?.fn(b) != obj -obj?.fn(b) != ok -obj?.fn(b) != string("c") -obj?.fn(b) * obj.obj?.a -obj?.fn(b) - a -obj?.fn(b) - f -obj?.fn(b) - obj.b -obj?.fn(b) .. b -obj?.fn(b) < a -obj?.fn(b) < b -obj?.fn(b) == obj -obj?.fn(b) > div(b, a) -obj?.fn(b) ^ a -obj?.fn(b) ^ b -obj?.fn(b) in arr -obj?.fn(count("a", false)) -obj?.fn(count("a", true)) -obj?.fn(count(arr, false)) -obj?.fn(count(arr, ok)) -obj?.fn(count(obj, false)) -obj?.fn(count(s, ok)) -obj?.fn(count(s, true)) -obj?.fn(div(0, 1)) -obj?.fn(div(0, b)) -obj?.fn(div(1, a)) -obj?.fn(div(2, 1)) -obj?.fn(div(2, a)) -obj?.fn(div(2, b)) -obj?.fn(div(a, 1)) -obj?.fn(div(a, a)) -obj?.fn(div(a, b)) -obj?.fn(div(b, 1)) -obj?.fn(div(b, 2)) -obj?.fn(div(b, a)) -obj?.fn(div(b, b)) -obj?.fn(false ? false : a) -obj?.fn(false or 2) -obj?.fn(false || 0) -obj?.fn(get(arr, 0)) -obj?.fn(get(arr, 1)) -obj?.fn(get(arr, 2)) -obj?.fn(get(arr, a)) -obj?.fn(get(arr, b)) -obj?.fn(get(arr, f)) -obj?.fn(get(obj, "b")) -obj?.fn(int(0)) -obj?.fn(int(0.5)) -obj?.fn(int(2)) -obj?.fn(int(a)) -obj?.fn(int(a, nil, 0)) -obj?.fn(int(add, b)) -obj?.fn(int(b)) -obj?.fn(int(b, 1)) -obj?.fn(int(f)) -obj?.fn(int(f, a, s, a)) -obj?.fn(int(ok, ok, 0)) -obj?.fn(int(s, "c", 0.5)) -obj?.fn(last(arr)) -obj?.fn(last(arr, 0.5)) -obj?.fn(len(0, f, obj, nil, "c")) -obj?.fn(len(arr)) -obj?.fn(len(f, arr, obj)) -obj?.fn(len(obj)) -obj?.fn(len(ok, s)) -obj?.fn(max(0)) -obj?.fn(max(a)) -obj?.fn(max(b, a)) -obj?.fn(min(0)) -obj?.fn(min(2)) -obj?.fn(min(a)) -obj?.fn(obj.a) -obj?.fn(obj.b) -obj?.fn(obj.fn(1)) -obj?.fn(obj.head(0)) -obj?.fn(obj.head(0, nil)) -obj?.fn(obj.head(2, f, 0)) -obj?.fn(obj.head(a)) -obj?.fn(obj.head(a, arr)) -obj?.fn(obj.head(b)) -obj?.fn(obj.head(b, nil, 2)) -obj?.fn(obj.head(b, true)) -obj?.fn(obj.obj?.b) -obj?.fn(obj?.a) -obj?.fn(obj?.a) == b -obj?.fn(obj?.b) -obj?.fn(obj?.fn(0)) -obj?.fn(obj?.fn(1)) -obj?.fn(obj?.fn(2)) -obj?.fn(obj?.fn(a)) -obj?.fn(obj?.fn(b)) -obj?.fn(obj?.head(0)) -obj?.fn(obj?.head(0, arr)) -obj?.fn(obj?.head(0, s)) -obj?.fn(obj?.head(a)) -obj?.fn(obj?.head(a, 0, nil)) -obj?.fn(obj?.head(a, arr)) -obj?.fn(obj?.head(a, div, add)) -obj?.fn(obj?.head(b, 2)) -obj?.fn(obj?.head(b, add)) -obj?.fn(obj?.head(b, add, b)) -obj?.fn(obj?.head(b, add, nil)) -obj?.fn(obj?.obj.a) -obj?.fn(ok ? 2 : 0) -obj?.fn(ok ? b : obj) -obj?.fn(ok and 1) -obj?.fn(ok and a) -obj?.fn(ok and b) -obj?.fn(ok) and not true -obj?.fn(true && 0) -obj?.fn(true and 0) -obj?.fn(true and a) -obj?.head(!(add == arr)) -obj?.head(!false) -obj?.head(!ok) -obj?.head(!true) -obj?.head("a" != 2) -obj?.head("a" != arr) -obj?.head("a" != b) -obj?.head("a" != false) -obj?.head("a" != true) -obj?.head("a" < "b") -obj?.head("a" == add) -obj?.head("a" == arr, div) -obj?.head("a" == false) -obj?.head("a" > "b") -obj?.head("a" > s) -obj?.head("a" matches "c") -obj?.head("a" startsWith "a") -obj?.head("a" startsWith "b") -obj?.head("a") <= s -obj?.head("a") == arr -obj?.head("a") > s -obj?.head("a") contains s -obj?.head("a") in 0 .. a -obj?.head("a") in obj.obj -obj?.head("a", 0) == b ** 0 -obj?.head("a", a) != arr ? s : false -obj?.head("b" != "c") -obj?.head("b" != 0) -obj?.head("b" != 1) -obj?.head("b" != 2) -obj?.head("b" != arr) -obj?.head("b" != nil) -obj?.head("b" + "a") -obj?.head("b" + s) -obj?.head("b" == 0) -obj?.head("b" == b, indexOf(s, s), a, b) -obj?.head("b" == nil) -obj?.head("b" > s) -obj?.head("b" endsWith "a") -obj?.head("b" in obj) -obj?.head("b" matches s) -obj?.head("b") == obj.a -obj?.head("b", s, arr) == obj -obj?.head("c" != "a") -obj?.head("c" != arr) -obj?.head("c" != div) -obj?.head("c" + s) -obj?.head("c" == arr) -obj?.head("c" == div) -obj?.head("c" == obj) -obj?.head("c" == s) -obj?.head("c" >= s) -obj?.head("c" startsWith s) -obj?.head("c") != ok -obj?.head("c") == false == false -obj?.head("c") == s -obj?.head("c", 2, 0) + s -obj?.head("c", add) contains s -obj?.head("c", add) in obj -obj?.head("c", b) != arr -obj?.head("c", b) in arr -obj?.head((b + 0) * a < b) -obj?.head(-0) -obj?.head(-0.5) -obj?.head(-1) -obj?.head(-a) -obj?.head(-a, add) -obj?.head(-b) -obj?.head(-b, obj?.head("c", 0)) -obj?.head(-f) -obj?.head(-f, add) -obj?.head(0 != 0) -obj?.head(0 != 1) -obj?.head(0 != a) -obj?.head(0 != arr) -obj?.head(0 != b) -obj?.head(0 != div) -obj?.head(0 != f) -obj?.head(0 != false) -obj?.head(0 != nil) -obj?.head(0 != obj) -obj?.head(0 != obj, obj, -b) -obj?.head(0 != obj?.obj) -obj?.head(0 % 2) -obj?.head(0 % a) -obj?.head(0 % b) -obj?.head(0 && false) -obj?.head(0 * 0) -obj?.head(0 * f) -obj?.head(0 + 0) -obj?.head(0 + 2) -obj?.head(0 + a) -obj?.head(0 + b) -obj?.head(0 - 0) -obj?.head(0 - 0.5) -obj?.head(0 - 2) -obj?.head(0 - a) -obj?.head(0 - b) -obj?.head(0 - f) -obj?.head(0 .. 2) -obj?.head(0 .. b) -obj?.head(0 / 0) -obj?.head(0 < 0.5) -obj?.head(0 < a) -obj?.head(0 <= 0) -obj?.head(0 <= 0.5) -obj?.head(0 <= a, get("a", b)) -obj?.head(0 <= b, obj) -obj?.head(0 <= f) -obj?.head(0 == "b") -obj?.head(0 == 1) -obj?.head(0 == add) -obj?.head(0 == arr) -obj?.head(0 == b) -obj?.head(0 == div) -obj?.head(0 == div, f != b) -obj?.head(0 == nil) -obj?.head(0 == obj) -obj?.head(0 == s) -obj?.head(0 > 0) -obj?.head(0 > b) -obj?.head(0 > f) -obj?.head(0 > f, false or "b") -obj?.head(0 >= 0) -obj?.head(0 >= 2) -obj?.head(0 >= a) -obj?.head(0 >= f) -obj?.head(0 ^ 0) -obj?.head(0 ^ 0, f != obj) -obj?.head(0 ^ 0, string(div, f, b, s)) -obj?.head(0 ^ b, obj, now(0.5)) -obj?.head(0 or true) -obj?.head(0) != add -obj?.head(0) != b -obj?.head(0) != div -obj?.head(0) != filter(arr, ok) -obj?.head(0) % obj.a -obj?.head(0) ** b -obj?.head(0) - obj?.fn(b) -obj?.head(0) .. a -obj?.head(0) .. obj.b -obj?.head(0) / obj?.a -obj?.head(0) < div(b, b) -obj?.head(0) in map(arr, false) -obj?.head(0, 1) != f -obj?.head(0, 1) != nil ? "a" : arr -obj?.head(0, 2, ok) == f -obj?.head(0, 2, s) * b -obj?.head(0, arr) .. b -obj?.head(0, arr, ok, ok) % b -obj?.head(0, f, 0, ok) .. a -obj?.head(0, ok) % a -obj?.head(0, ok) % b -obj?.head(0.5 != 0) -obj?.head(0.5 != 1) -obj?.head(0.5 != 2) -obj?.head(0.5 != a, add, 0 == ok) -obj?.head(0.5 != arr, obj) -obj?.head(0.5 != false) -obj?.head(0.5 != obj) -obj?.head(0.5 && true) -obj?.head(0.5 * 0.5) -obj?.head(0.5 * b) -obj?.head(0.5 * b, f <= a) -obj?.head(0.5 ** 0) -obj?.head(0.5 ** 0.5, a) -obj?.head(0.5 ** a) -obj?.head(0.5 + 2) -obj?.head(0.5 + f) -obj?.head(0.5 - f) -obj?.head(0.5 - f, add, a) -obj?.head(0.5 .. f) -obj?.head(0.5 / 0.5) -obj?.head(0.5 / 2) -obj?.head(0.5 < 0) -obj?.head(0.5 <= 0) -obj?.head(0.5 <= f) -obj?.head(0.5 == "c") -obj?.head(0.5 == a) -obj?.head(0.5 == arr) -obj?.head(0.5 == ok) -obj?.head(0.5 == true) -obj?.head(0.5 > f) -obj?.head(0.5) != a -obj?.head(0.5) != arr -obj?.head(0.5) != b -obj?.head(0.5) - f -obj?.head(0.5) <= f ? true : a -obj?.head(0.5) == b -obj?.head(0.5) == ok ? 0 : obj -obj?.head(0.5) > f -obj?.head(0.5) > f / f -obj?.head(0.5, a) in arr ? add : f -obj?.head(0.5, a, f) + 2 * f -obj?.head(0.5, arr, div, f, "a") >= f -obj?.head(0.5, arr, true) > obj?.b -obj?.head(0.5, b) == obj -obj?.head(0.5, nil) != b -obj?.head(0.5, nil) ^ b -obj?.head(0.5, nil, 0) / add(b, a) -obj?.head(0.5, ok) <= a -obj?.head(0.5, true) < obj?.a -obj?.head(1 != 0) -obj?.head(1 != ok) -obj?.head(1 % b, ok, obj) -obj?.head(1 * a) -obj?.head(1 * b) -obj?.head(1 + 0) -obj?.head(1 + b, obj.head(add, ok)) -obj?.head(1 - b) -obj?.head(1 - f, get(add, 1)) -obj?.head(1 .. b) -obj?.head(1 < b) -obj?.head(1 == add) -obj?.head(1 == arr) -obj?.head(1 == s) -obj?.head(1 > b) -obj?.head(1 >= f) -obj?.head(1 ^ 1) -obj?.head(1 ^ a) -obj?.head(1 ^ f) -obj?.head(1 and false) -obj?.head(1 in nil) -obj?.head(1 or true) -obj?.head(1) != div -obj?.head(1) * a -obj?.head(1) >= f -obj?.head(1, add) != obj.a -obj?.head(1, add, s, ok) / obj.a -obj?.head(1, s) + obj.head(0) -obj?.head(2 != 0.5, filter(arr, false)) -obj?.head(2 != b) -obj?.head(2 != div) -obj?.head(2 != f) -obj?.head(2 != nil) -obj?.head(2 != nil, one("c", false)) -obj?.head(2 != s) -obj?.head(2 != true) -obj?.head(2 * f) -obj?.head(2 ** b, upper(false, s)) -obj?.head(2 ** f) -obj?.head(2 + 0.5) -obj?.head(2 - b) -obj?.head(2 .. 0) -obj?.head(2 .. 0, f, s endsWith s) -obj?.head(2 .. a) -obj?.head(2 .. f) -obj?.head(2 / a, arr, obj.obj) -obj?.head(2 < 0.5) -obj?.head(2 <= 0) -obj?.head(2 <= a) -obj?.head(2 <= f, f && false, add) -obj?.head(2 == nil) -obj?.head(2 == true) -obj?.head(2 ^ b) -obj?.head(2 in arr) -obj?.head(2 || false) -obj?.head(2) != a -obj?.head(2) * a -obj?.head(2) ** a -obj?.head(2) - f -obj?.head(2) == arr -obj?.head(2) > a * f -obj?.head(2) in obj?.head(nil) -obj?.head(2, 1, arr, b, add) in arr -obj?.head(2, arr, div) == a -obj?.head(2, obj, "a", div) <= b % a -obj?.head(2, obj, nil) .. b -obj?.head(2, s, b) in arr -obj?.head(["c", "a"]) -obj?.head(a != "a") -obj?.head(a != "b") -obj?.head(a != arr) -obj?.head(a != div) -obj?.head(a != false) -obj?.head(a != nil) -obj?.head(a != obj) -obj?.head(a != obj, arr) -obj?.head(a != ok) -obj?.head(a % b) -obj?.head(a * 0) -obj?.head(a * a, obj) -obj?.head(a ** 0) -obj?.head(a ** 0.5) -obj?.head(a ** a) -obj?.head(a ** b) -obj?.head(a ** f) -obj?.head(a + 0) -obj?.head(a + 0.5) -obj?.head(a + 1) -obj?.head(a + a) -obj?.head(a + b) -obj?.head(a - 0) -obj?.head(a - 0.5) -obj?.head(a - 1) -obj?.head(a - b) -obj?.head(a - f, ok) -obj?.head(a .. 1) -obj?.head(a .. a) -obj?.head(a .. f) -obj?.head(a / 0) -obj?.head(a / a) -obj?.head(a / b) -obj?.head(a < 0) -obj?.head(a < 0.5) -obj?.head(a < a) -obj?.head(a < a, a) -obj?.head(a < b) -obj?.head(a <= 0) -obj?.head(a <= b) -obj?.head(a == 0.5, string(2, true)) -obj?.head(a == add) -obj?.head(a == arr) -obj?.head(a == obj) -obj?.head(a == obj, a, obj in nil, s) -obj?.head(a == obj, obj.b) -obj?.head(a == ok) -obj?.head(a == s) -obj?.head(a > 0) -obj?.head(a > a) -obj?.head(a >= 0) -obj?.head(a >= 0, a) -obj?.head(a ^ 0.5) -obj?.head(a ^ 2, map(arr, obj)) -obj?.head(a ^ a) -obj?.head(a ^ b) -obj?.head(a ^ f) -obj?.head(a and false) -obj?.head(a in arr) -obj?.head(a || false) -obj?.head(a) -obj?.head(a) != s -obj?.head(a) * 2 ^ f -obj?.head(a) ** (b * 0) -obj?.head(a) ** b -obj?.head(a) + obj?.a -obj?.head(a) - 0.5 / f -obj?.head(a) / b -obj?.head(a) / obj?.head(2, s, arr) -obj?.head(a) < -a -obj?.head(a) <= a -obj?.head(a) == nil ? nil : nil -obj?.head(a) == one(arr, ok) -obj?.head(a) > f -obj?.head(a) > obj?.b -obj?.head(a) >= b - b -obj?.head(a) ^ a -obj?.head(a, "c", 1, div, nil) != ok -obj?.head(a, "c", arr) % a -obj?.head(a, 0, ok, add) .. b -obj?.head(a, 0.5, s, f) ^ a -obj?.head(a, a) -obj?.head(a, a, add) -obj?.head(a, all(obj, true)) -obj?.head(a, arr) -obj?.head(a, arr, obj) -obj?.head(a, b > b) -obj?.head(a, b) <= a -obj?.head(a, b) == 0 + f -obj?.head(a, div, div, ok) -obj?.head(a, f ** f, a != 0.5) -obj?.head(a, f, s) >= b -obj?.head(a, false or f) -obj?.head(a, false) != div -obj?.head(a, max(a, f, f)) -obj?.head(a, obj) -obj?.head(a, obj, f, 0) ^ obj?.a -obj?.head(a, obj.head(b)) -obj?.head(a, obj?.a) -obj?.head(a, ok, a) -obj?.head(a, ok, b, s, add) in arr -obj?.head(a, s) -obj?.head(a, s, a) -obj?.head(a, true, a) * b -obj?.head(abs(0)) -obj?.head(abs(0, b)) -obj?.head(abs(0, b, s, obj, 0)) -obj?.head(abs(0.5)) -obj?.head(abs(2)) -obj?.head(abs(a, s, a)) -obj?.head(abs(b)) -obj?.head(abs(f)) -obj?.head(abs(obj, a)) -obj?.head(abs(obj, b)) -obj?.head(abs(obj, true, a)) -obj?.head(abs(s, a)) -obj?.head(abs(s, a), add, f) -obj?.head(add != 0.5) -obj?.head(add != a) -obj?.head(add != add) -obj?.head(add != div) -obj?.head(add != false) -obj?.head(add != nil) -obj?.head(add != ok) -obj?.head(add != s) -obj?.head(add != true) -obj?.head(add && false) -obj?.head(add && true) -obj?.head(add == "a") -obj?.head(add == 0.5, b != nil) -obj?.head(add == a, s != obj) -obj?.head(add == arr) -obj?.head(add == b) -obj?.head(add == div) -obj?.head(add == f) -obj?.head(add == obj) -obj?.head(add == ok) -obj?.head(add == ok, obj) -obj?.head(add == s) -obj?.head(add and true) -obj?.head(add in arr) -obj?.head(add in arr, div) -obj?.head(add in nil) -obj?.head(add or false) -obj?.head(add || false) -obj?.head(add(0, 0)) -obj?.head(add(1, 0)) -obj?.head(add(1, 1)) -obj?.head(add(1, b)) -obj?.head(add(2, a)) -obj?.head(add(a, 0)) -obj?.head(add(b, 0)) -obj?.head(add(b, a)) -obj?.head(add(b, b)) -obj?.head(add) -obj?.head(add) != arr -obj?.head(add) != s -obj?.head(add) == arr -obj?.head(add) in arr -obj?.head(add, "a") == div -obj?.head(add, 0.5 ^ b) -obj?.head(add, 2 / f) -obj?.head(add, add) -obj?.head(add, add, nil) == ok -obj?.head(add, arr == add) -obj?.head(add, arr) != s -obj?.head(add, arr, s) != a -obj?.head(add, b) -obj?.head(add, div) -obj?.head(add, f) -obj?.head(add, f) != upper("c") -obj?.head(add, get(b, s)) -obj?.head(add, get(false, obj)) -obj?.head(add, get(ok, b)) -obj?.head(add, obj) -obj?.head(add, obj?.b) -obj?.head(add, ok) -obj?.head(add, s) -obj?.head(add, string(s)) -obj?.head(all("a", ok)) -obj?.head(all("b", ok)) -obj?.head(all(arr, false)) -obj?.head(all(arr, ok)) -obj?.head(all(obj, false)) -obj?.head(all(s, ok)) -obj?.head(all(s, true)) -obj?.head(any("c", ok)) -obj?.head(any(obj, false)) -obj?.head(any(obj, ok)) -obj?.head(any(obj, ok), 1 == arr, b == 0.5) -obj?.head(any(obj, true)) -obj?.head(any(s, ok), ok) -obj?.head(arr != "b") -obj?.head(arr != "c") -obj?.head(arr != "c", arr) -obj?.head(arr != 0.5) -obj?.head(arr != div) -obj?.head(arr != nil) -obj?.head(arr != obj) -obj?.head(arr != s) -obj?.head(arr && true, ok and obj) -obj?.head(arr == 0) -obj?.head(arr == 0.5) -obj?.head(arr == 1) -obj?.head(arr == a) -obj?.head(arr == add) -obj?.head(arr == arr) -obj?.head(arr == b) -obj?.head(arr == div) -obj?.head(arr == f) -obj?.head(arr == nil) -obj?.head(arr == obj) -obj?.head(arr == ok) -obj?.head(arr and false) -obj?.head(arr) -obj?.head(arr) != div(a, a) -obj?.head(arr) != s -obj?.head(arr) == a ? 1 : b -obj?.head(arr) == arr -obj?.head(arr) == obj.b -obj?.head(arr) == obj?.obj -obj?.head(arr) == ok -obj?.head(arr)[-1] -obj?.head(arr)[0.5 - a] -obj?.head(arr)[b] -obj?.head(arr, 0) == ok -obj?.head(arr, 1 - f, ok) -obj?.head(arr, a, a) -obj?.head(arr, a, false) == 2 ? obj : "b" -obj?.head(arr, add(0, 0), 0 - 0.5) -obj?.head(arr, add) -obj?.head(arr, all(obj, false), obj.a) -obj?.head(arr, all(s, ok)) -obj?.head(arr, arr) in arr -obj?.head(arr, b) -obj?.head(arr, b) != a -obj?.head(arr, b, div) != ok -obj?.head(arr, div(a, b)) -obj?.head(arr, div) -obj?.head(arr, filter(obj, false)) -obj?.head(arr, map(arr, obj)) -obj?.head(arr, max(ok)) -obj?.head(arr, none(obj, ok), any(arr, true)) -obj?.head(arr, obj) -obj?.head(arr, obj?.head(a, 0)) -obj?.head(arr, obj?.head(add, add, 0)) -obj?.head(arr, obj?.obj) -obj?.head(arr, ok) -obj?.head(arr, ok)[b] -obj?.head(arr, one(arr, ok)) -obj?.head(arr, s && true) -obj?.head(arr, s) -obj?.head(arr, string(div, 0)) -obj?.head(arr, true) == a -obj?.head(arr[0.5:0]) -obj?.head(arr[0]) -obj?.head(arr[a]) -obj?.head(arr[a], s) -obj?.head(arr[b]) -obj?.head(arr[f]) -obj?.head(b != "c") -obj?.head(b != 0) -obj?.head(b != 0.5) -obj?.head(b != a) -obj?.head(b != a, ok) -obj?.head(b != add) -obj?.head(b != arr) -obj?.head(b != b) -obj?.head(b != div) -obj?.head(b != nil) -obj?.head(b != obj) -obj?.head(b != obj?.obj) -obj?.head(b != ok) -obj?.head(b != s) -obj?.head(b != true) -obj?.head(b % 2, f) -obj?.head(b % a) -obj?.head(b % a, s in nil) -obj?.head(b && true) -obj?.head(b * 0.5) -obj?.head(b * a) -obj?.head(b * b) -obj?.head(b ** b) -obj?.head(b + 0) -obj?.head(b + 1) -obj?.head(b + a) -obj?.head(b + f) -obj?.head(b - 0) -obj?.head(b - 1) -obj?.head(b - a) -obj?.head(b - b) -obj?.head(b - f) -obj?.head(b .. 0.5) -obj?.head(b .. 2) -obj?.head(b .. a) -obj?.head(b / 0) -obj?.head(b / f) -obj?.head(b < 0.5) -obj?.head(b < 2) -obj?.head(b < a) -obj?.head(b < a, arr) -obj?.head(b < f) -obj?.head(b <= 0) -obj?.head(b <= 1) -obj?.head(b <= b) -obj?.head(b == "b") -obj?.head(b == "c") -obj?.head(b == 0) -obj?.head(b == 0.5) -obj?.head(b == arr) -obj?.head(b == div) != ok -obj?.head(b == obj) -obj?.head(b == ok) -obj?.head(b > f) -obj?.head(b >= 0) -obj?.head(b >= 0.5) -obj?.head(b >= 2) -obj?.head(b >= b) -obj?.head(b >= f) -obj?.head(b ^ 0) -obj?.head(b ^ b) -obj?.head(b ^ f) -obj?.head(b and false) -obj?.head(b and true) -obj?.head(b in nil) -obj?.head(b or true) -obj?.head(b || false) -obj?.head(b) -obj?.head(b) != 1 == ok -obj?.head(b) % obj?.head(obj, div).a -obj?.head(b) + 0.5 - b -obj?.head(b) + b -obj?.head(b) .. a -obj?.head(b) / a -obj?.head(b) <= a -obj?.head(b) <= f -obj?.head(b) == -f -obj?.head(b) == b -obj?.head(b) == f -obj?.head(b) > 0 * 2 -obj?.head(b) >= a + b -obj?.head(b, "a") .. b -obj?.head(b, 0, b) > b -obj?.head(b, 1 < f) -obj?.head(b, 1 > b) -obj?.head(b, add(b, 1)) -obj?.head(b, add) -obj?.head(b, arr) - f -obj?.head(b, arr) == div -obj?.head(b, arr) == s -obj?.head(b, arr) ^ b -obj?.head(b, b > 1) -obj?.head(b, b) -obj?.head(b, b) ^ b -obj?.head(b, b, b - a) -obj?.head(b, div != ok) -obj?.head(b, div) <= 0 ^ f -obj?.head(b, f) -obj?.head(b, f, a and false) -obj?.head(b, f, div) <= f -obj?.head(b, f, f) < obj?.b -obj?.head(b, false, nil) / (0.5 - f) -obj?.head(b, first(nil)) -obj?.head(b, get(nil, 0)) -obj?.head(b, get(s, a)) -obj?.head(b, max(arr)) -obj?.head(b, obj) -obj?.head(b, obj) ** f -obj?.head(b, obj, ok) .. 0 + a -obj?.head(b, obj.a) -obj?.head(b, obj.fn(b)) -obj?.head(b, obj?.obj) -obj?.head(b, ok && add) -obj?.head(b, ok ? b : 0) -obj?.head(b, ok, 0.5) != b -obj?.head(b, s) -obj?.head(b, trim(s), b) -obj?.head(count("a", ok)) -obj?.head(count("b", ok)) -obj?.head(count("c", ok)) -obj?.head(count(arr, ok)) -obj?.head(count(arr, true)) -obj?.head(count(obj, false)) -obj?.head(count(obj, ok)) -obj?.head(count(obj, true)) -obj?.head(count(s, false)) -obj?.head(count(s, ok)) -obj?.head(count(s, true), div, map("c", add)) -obj?.head(div != "c") -obj?.head(div != 2, obj) -obj?.head(div != a) -obj?.head(div != f) -obj?.head(div != f, div) -obj?.head(div != s) -obj?.head(div && false) -obj?.head(div == "b", arr) -obj?.head(div == 0) -obj?.head(div == 2) -obj?.head(div == a) -obj?.head(div == arr) -obj?.head(div == arr, arr) -obj?.head(div == arr, ok) -obj?.head(div == div) -obj?.head(div == f) -obj?.head(div == nil) -obj?.head(div == obj) -obj?.head(div == ok) -obj?.head(div in arr) -obj?.head(div or false) -obj?.head(div || false) -obj?.head(div(0, 1)) -obj?.head(div(0, 2)) -obj?.head(div(2, a)) -obj?.head(div(a, 1)) -obj?.head(div(a, 2), b) -obj?.head(div(a, a)) -obj?.head(div(a, b)) -obj?.head(div(b, 1)) -obj?.head(div(b, a)) -obj?.head(div(b, b)) -obj?.head(div) -obj?.head(div) != add -obj?.head(div) != arr -obj?.head(div) != f -obj?.head(div) != s -obj?.head(div) == obj -obj?.head(div, 0, ok) != add -obj?.head(div, 0.5 .. f) -obj?.head(div, a == f) -obj?.head(div, a) -obj?.head(div, add == nil, get(0, arr)) -obj?.head(div, add) -obj?.head(div, arr) -obj?.head(div, arr, ok) -obj?.head(div, b .. 0) -obj?.head(div, b) -obj?.head(div, b, arr) != arr -obj?.head(div, div) -obj?.head(div, f) -obj?.head(div, f, ok) != f ** f -obj?.head(div, false && "b") -obj?.head(div, get(b, b)) -obj?.head(div, get(nil, div, nil, ok)) -obj?.head(div, nil) != s -obj?.head(div, now(f, ok, ok, a), f) -obj?.head(div, now(ok)) -obj?.head(div, obj) -obj?.head(div, obj.a, s != 0.5) -obj?.head(div, obj.head(f)) -obj?.head(div, obj?.a) -obj?.head(div, ok) -obj?.head(div, s) -obj?.head(div, s) == ok ? f : a -obj?.head(div, s, string(ok)) -obj?.head(f != "c") -obj?.head(f != 0) -obj?.head(f != 2) -obj?.head(f != any(obj, ok)) -obj?.head(f != arr) -obj?.head(f != b) -obj?.head(f != div) -obj?.head(f != f, ok) -obj?.head(f != false) -obj?.head(f != obj) -obj?.head(f != s, b or true) -obj?.head(f && false) -obj?.head(f * 0) -obj?.head(f * 0.5) -obj?.head(f * 1) -obj?.head(f * 2) -obj?.head(f * a) -obj?.head(f * f) -obj?.head(f ** 0) -obj?.head(f ** 2) -obj?.head(f ** b) -obj?.head(f ** f) -obj?.head(f + 0.5) -obj?.head(f + 1) -obj?.head(f + f) -obj?.head(f - 0) -obj?.head(f - 0.5) -obj?.head(f - 1) -obj?.head(f - 2) -obj?.head(f - b) -obj?.head(f .. a) -obj?.head(f .. b) -obj?.head(f .. f) -obj?.head(f / 0) -obj?.head(f / 2) -obj?.head(f / a) -obj?.head(f / b) -obj?.head(f < a) -obj?.head(f < b) -obj?.head(f < f) -obj?.head(f <= 0) -obj?.head(f <= a) -obj?.head(f <= a, a) -obj?.head(f <= f) -obj?.head(f == add) -obj?.head(f == arr) -obj?.head(f == f) -obj?.head(f == obj) -obj?.head(f == ok) -obj?.head(f == s) -obj?.head(f == true, obj != false) -obj?.head(f > b) -obj?.head(f >= 0) -obj?.head(f >= 0.5) -obj?.head(f >= b) -obj?.head(f >= f) -obj?.head(f ^ 2) -obj?.head(f ^ a) -obj?.head(f in arr) -obj?.head(f in nil) -obj?.head(f or false) -obj?.head(f or true) -obj?.head(f) -obj?.head(f) * b -obj?.head(f) ** -f -obj?.head(f) + obj?.a -obj?.head(f) - b -obj?.head(f) / a -obj?.head(f) <= a -obj?.head(f) == 0 ^ 0.5 -obj?.head(f) == b != true -obj?.head(f) == f -obj?.head(f) > 1 + 1 -obj?.head(f) > a -obj?.head(f) >= b -obj?.head(f) >= b ^ b -obj?.head(f) in arr -obj?.head(f, 0) <= a - f -obj?.head(f, 2, arr, false, a) > a -obj?.head(f, a) -obj?.head(f, add) -obj?.head(f, add, f) < add(a, a) -obj?.head(f, add, obj) - a -obj?.head(f, arr, 0.5, b) + f -obj?.head(f, arr, f) + f -obj?.head(f, b != "a") -obj?.head(f, b, s, b) ^ obj.a -obj?.head(f, div == arr) -obj?.head(f, div) -obj?.head(f, div, f) ** b -obj?.head(f, f * b) -obj?.head(f, f) -obj?.head(f, f) + -b -obj?.head(f, f, obj) != f -obj?.head(f, f, ok, arr) <= f + 0 -obj?.head(f, get(0.5, arr), map(arr, nil)) -obj?.head(f, get(ok, add)) -obj?.head(f, nil) - a -obj?.head(f, obj != arr) -obj?.head(f, obj != b) -obj?.head(f, obj) -obj?.head(f, obj?.head(b, arr, "c"), b) -obj?.head(f, ok ? add : b) -obj?.head(f, ok ? s : 0) -obj?.head(f, ok and add, string(add)) -obj?.head(f, ok) -obj?.head(f, s) -obj?.head(f, true and f) -obj?.head(f, true || a) -obj?.head(false != a) -obj?.head(false != f) -obj?.head(false != false) -obj?.head(false != ok) -obj?.head(false != s) -obj?.head(false != s, upper(0, "b"), obj) -obj?.head(false && a, a) -obj?.head(false && add) -obj?.head(false && b) -obj?.head(false && obj) -obj?.head(false == obj) -obj?.head(false == s) -obj?.head(false ? "c" : false) -obj?.head(false ? a : 0, obj.fn(2)) -obj?.head(false ? a : add) -obj?.head(false ? a : false) -obj?.head(false ? add : ok, a ^ b) -obj?.head(false ? arr : nil) -obj?.head(false ? nil : 0.5) -obj?.head(false ? obj : s, obj?.head("c")) -obj?.head(false ? s : add) -obj?.head(false ? s : f, div) -obj?.head(false and "a", b) -obj?.head(false and "b") -obj?.head(false and 0.5) -obj?.head(false and a) -obj?.head(false and add) -obj?.head(false and arr) -obj?.head(false and obj) -obj?.head(false or add) -obj?.head(false or arr) -obj?.head(false or b) -obj?.head(false or f) -obj?.head(false or true) -obj?.head(false || add, arr != "a") -obj?.head(false || arr) -obj?.head(false || b) -obj?.head(false || ok) -obj?.head(false) == obj -obj?.head(false) ? 0 % 1 : obj.obj -obj?.head(false) in arr -obj?.head(false, 0, b) == s + "a" -obj?.head(false, 0.5, div) || obj.head(add, obj) -obj?.head(false, 1) || b > 2 -obj?.head(false, b) == b -obj?.head(false, b, "a") || obj?.a -obj?.head(false, obj) in arr -obj?.head(filter(arr, false)) -obj?.head(filter(arr, ok)) -obj?.head(filter(arr, true)) -obj?.head(filter(s, ok)) -obj?.head(filter(s, true)) -obj?.head(first(0)) -obj?.head(first(0.5, 1, arr, obj, arr)) -obj?.head(first(a), map(arr, add)) -obj?.head(first(a, 0.5)) -obj?.head(first(a, div)) -obj?.head(first(add)) -obj?.head(first(b, div)) -obj?.head(first(b, false, a)) -obj?.head(first(b, nil)) -obj?.head(first(div)) -obj?.head(first(f)) -obj?.head(first(f))?.b -obj?.head(first(f), f) -obj?.head(first(f, a), true != nil) -obj?.head(first(false)) -obj?.head(first(false, nil), a != f)?.a -obj?.head(first(false, ok)) -obj?.head(first(nil, nil)) -obj?.head(first(obj, 0), b * b) -obj?.head(first(ok)) -obj?.head(first(ok, arr)) -obj?.head(first(s)) -obj?.head(first(s, b)) -obj?.head(first(s, s), abs(0.5)) -obj?.head(first(true, div, 0)) -obj?.head(float(0)) -obj?.head(float(0.5)) -obj?.head(float(2)) -obj?.head(float(b)) -obj?.head(float(b, 0.5)) -obj?.head(float(f)) -obj?.head(float(f, div, f)) -obj?.head(get("a", "b"))?.b -obj?.head(get("a", nil)) -obj?.head(get("a", nil), f) -obj?.head(get("a", ok)) -obj?.head(get("b", a)) -obj?.head(get("b", add)) -obj?.head(get("b", b)) -obj?.head(get("b", div)) -obj?.head(get("b", false)) -obj?.head(get("c", arr), a) -obj?.head(get(0, 0)) -obj?.head(get(0, 0.5)) -obj?.head(get(0, a)) -obj?.head(get(0, add)) -obj?.head(get(0, arr)) -obj?.head(get(0, b)) -obj?.head(get(0, b), add) -obj?.head(get(0, f)) -obj?.head(get(0, f), add) -obj?.head(get(0, nil)) -obj?.head(get(0, obj))?.b -obj?.head(get(0, ok)) -obj?.head(get(0, ok)?.b) -obj?.head(get(0.5), get(ok, false)) -obj?.head(get(0.5, 0.5)) -obj?.head(get(0.5, b)) -obj?.head(get(0.5, false)) -obj?.head(get(0.5, nil)) -obj?.head(get(0.5, obj)) -obj?.head(get(0.5, ok)) -obj?.head(get(0.5, s)) -obj?.head(get(0.5, true)) -obj?.head(get(1, 0)) -obj?.head(get(1, a)) -obj?.head(get(1, add)) -obj?.head(get(1, b)) -obj?.head(get(1, nil)) -obj?.head(get(1, obj)) -obj?.head(get(1, ok)) -obj?.head(get(1, s)) -obj?.head(get(1, s), obj.head(nil), div) -obj?.head(get(2)) -obj?.head(get(2, 0)) -obj?.head(get(2, a)) -obj?.head(get(2, add)) -obj?.head(get(2, div)) -obj?.head(get(a)) -obj?.head(get(a), ok) -obj?.head(get(a, 0)) -obj?.head(get(a, 2)) -obj?.head(get(a, a)) -obj?.head(get(a, b)) -obj?.head(get(a, b))?.a -obj?.head(get(a, div)) -obj?.head(get(a, f)) -obj?.head(get(a, false)) -obj?.head(get(a, obj)) -obj?.head(get(a, obj), b in nil) -obj?.head(get(a, s)) -obj?.head(get(add, 0)) -obj?.head(get(add, 2)) -obj?.head(get(add, arr)) -obj?.head(get(add, b)) -obj?.head(get(add, div)) -obj?.head(get(add, f)) -obj?.head(get(add, false)) -obj?.head(get(add, nil)) -obj?.head(get(add, ok)) -obj?.head(get(add, s)) -obj?.head(get(add, true)) -obj?.head(get(arr)) -obj?.head(get(arr, 0.5)) -obj?.head(get(arr, a)) -obj?.head(get(arr, arr)) -obj?.head(get(arr, div)) -obj?.head(get(arr, false)) -obj?.head(get(arr, nil)) -obj?.head(get(arr, s)) -obj?.head(get(b)) -obj?.head(get(b, 0.5)) -obj?.head(get(b, 1), add) -obj?.head(get(b, 2)) -obj?.head(get(b, a)) -obj?.head(get(b, arr)) -obj?.head(get(b, b)) -obj?.head(get(b, b), obj) -obj?.head(get(b, div), obj.obj) -obj?.head(get(b, nil)) -obj?.head(get(b, obj)) -obj?.head(get(b, ok)) -obj?.head(get(div, 0)) -obj?.head(get(div, 0.5)) -obj?.head(get(div, a)) -obj?.head(get(div, a, nil), ok || div) -obj?.head(get(div, add)) -obj?.head(get(div, b)) -obj?.head(get(div, div)) -obj?.head(get(div, f)) -obj?.head(get(div, nil)) -obj?.head(get(div, obj)) -obj?.head(get(div, s)) -obj?.head(get(div, s), f == nil) -obj?.head(get(div, true)) -obj?.head(get(f, 0)) -obj?.head(get(f, 0.5)) -obj?.head(get(f, 1)) -obj?.head(get(f, 2)) -obj?.head(get(f, a))?.a -obj?.head(get(f, add)) -obj?.head(get(f, b), toBase64("c", ok, f)) -obj?.head(get(f, f)) -obj?.head(get(f, false)) -obj?.head(get(f, nil)) -obj?.head(get(f, ok)) -obj?.head(get(false, 0)) -obj?.head(get(false, 0)?.a) -obj?.head(get(false, 0.5), s == div) -obj?.head(get(false, div)) -obj?.head(get(false, nil)) -obj?.head(get(false, ok)) -obj?.head(get(false, s)) -obj?.head(get(nil)) -obj?.head(get(nil, add)) -obj?.head(get(nil, arr)) -obj?.head(get(nil, arr, s)) -obj?.head(get(nil, b), obj?.fn(b)) -obj?.head(get(nil, div)) -obj?.head(get(nil, nil)) -obj?.head(get(nil, nil), ok) -obj?.head(get(nil, ok)) -obj?.head(get(nil, ok), map("c", add)) -obj?.head(get(nil, ok), ok) -obj?.head(get(nil, s)) -obj?.head(get(obj)?.fn(ok)) -obj?.head(get(obj, 0)) -obj?.head(get(obj, 0.5)) -obj?.head(get(obj, 2)) -obj?.head(get(obj, a)) -obj?.head(get(obj, add)) -obj?.head(get(obj, arr)) -obj?.head(get(obj, b)) -obj?.head(get(obj, obj)) -obj?.head(get(obj, s)) -obj?.head(get(obj, s)?.obj?.obj) -obj?.head(get(obj, s, arr)) -obj?.head(get(ok)) -obj?.head(get(ok, a)) -obj?.head(get(ok, add)) -obj?.head(get(ok, arr)) -obj?.head(get(ok, b)) -obj?.head(get(ok, div)) -obj?.head(get(ok, nil)) -obj?.head(get(ok, nil), false and add) -obj?.head(get(ok, obj)) -obj?.head(get(ok, obj))?.b -obj?.head(get(ok, obj), s) -obj?.head(get(ok, s)) -obj?.head(get(ok, true)) -obj?.head(get(s)) -obj?.head(get(s), f == a) -obj?.head(get(s)?.a) -obj?.head(get(s, 1)) -obj?.head(get(s, 2), add) -obj?.head(get(s, a)) -obj?.head(get(s, a, true)) -obj?.head(get(s, add)) -obj?.head(get(s, arr)) -obj?.head(get(s, arr), get(arr, arr)) -obj?.head(get(s, b)) -obj?.head(get(s, div)) -obj?.head(get(s, div), a, a) -obj?.head(get(s, f)) -obj?.head(get(s, nil)) -obj?.head(get(s, obj))?.b -obj?.head(get(s, ok)) -obj?.head(get(s, ok))?.a -obj?.head(get(s, s)) -obj?.head(get(s, true)) -obj?.head(get(s, true), obj) -obj?.head(get(true, 0.5), arr) -obj?.head(get(true, a)) -obj?.head(get(true, add)) -obj?.head(get(true, div)) -obj?.head(get(true, div), any("b", false)) -obj?.head(get(true, f)) -obj?.head(get(true, false)) -obj?.head(get(true, s)) -obj?.head(int("b", a)) -obj?.head(int(2)) -obj?.head(int(a)) -obj?.head(int(b)) -obj?.head(int(f)) -obj?.head(int(false, s, false, a)) -obj?.head(last(0)) -obj?.head(last(0.5)) -obj?.head(last(0.5, add)) -obj?.head(last(0.5, b, f, "b")) -obj?.head(last(1, true, a, s)) -obj?.head(last(a)) -obj?.head(last(a, false, f, "a")) -obj?.head(last(add)) -obj?.head(last(arr, arr)) -obj?.head(last(b)) -obj?.head(last(b, add, ok, 2)) -obj?.head(last(div)) -obj?.head(last(div, b)) -obj?.head(last(f)) -obj?.head(last(f, arr, arr)) -obj?.head(last(obj)) -obj?.head(last(obj, "c", a, ok)) -obj?.head(last(ok)) -obj?.head(last(ok, ok)) -obj?.head(last(s)) -obj?.head(len("a")) -obj?.head(len(add, "a")) -obj?.head(len(arr)) -obj?.head(len(arr), arr) -obj?.head(len(false, div, obj)) -obj?.head(len(obj, "c")) -obj?.head(lower("a")) -obj?.head(lower("b")) -obj?.head(lower(arr, s)) -obj?.head(lower(false, true, s)) -obj?.head(lower(s)) -obj?.head(map("a", "a")) -obj?.head(map("a", "b")) -obj?.head(map("a", 0)) -obj?.head(map("a", 2)) -obj?.head(map("a", a), obj.head(a)) -obj?.head(map("a", add), s, get(arr, b)) -obj?.head(map("a", arr)) -obj?.head(map("a", div)) -obj?.head(map("a", f)) -obj?.head(map("b", add)) -obj?.head(map("b", f)) -obj?.head(map("b", nil)) -obj?.head(map("b", ok), add) -obj?.head(map("c", 0.5)) -obj?.head(map("c", div), b) -obj?.head(map("c", nil), get(s)) -obj?.head(map("c", obj)) -obj?.head(map("c", s)) -obj?.head(map(arr, "a")) -obj?.head(map(arr, "b")) -obj?.head(map(arr, 0)) -obj?.head(map(arr, 0.5)) -obj?.head(map(arr, arr)) -obj?.head(map(arr, b)) -obj?.head(map(arr, div)) -obj?.head(map(arr, f)) -obj?.head(map(arr, false)) -obj?.head(map(arr, false), f) -obj?.head(map(arr, nil)) -obj?.head(map(arr, obj)) -obj?.head(map(arr, ok)) -obj?.head(map(arr, s)) -obj?.head(map(arr, true)) -obj?.head(map(obj, 0.5)) -obj?.head(map(obj, 1), add == f) -obj?.head(map(obj, add)) -obj?.head(map(obj, arr)) -obj?.head(map(obj, b)) -obj?.head(map(obj, b), get(nil, ok), arr) -obj?.head(map(obj, b), obj) -obj?.head(map(obj, div)) -obj?.head(map(obj, f)) -obj?.head(map(obj, nil), ok || true) -obj?.head(map(obj, obj)) -obj?.head(map(obj, obj), obj.b) -obj?.head(map(obj, ok)) -obj?.head(map(obj, s)) -obj?.head(map(obj.obj, a or false)) -obj?.head(map(s, #)) -obj?.head(map(s, 0)) -obj?.head(map(s, 0.5)) -obj?.head(map(s, 1)) -obj?.head(map(s, 2), arr) -obj?.head(map(s, a)) -obj?.head(map(s, add)) -obj?.head(map(s, arr)) -obj?.head(map(s, div)) -obj?.head(map(s, f)) -obj?.head(map(s, nil), add(a, a)) -obj?.head(map(s, obj), f, b + 2) -obj?.head(map(s, ok)) -obj?.head(map(s, ok), 0 ** f) -obj?.head(map(s, s)) -obj?.head(max("a")) -obj?.head(max("b")) -obj?.head(max("c")) -obj?.head(max(1, b)) -obj?.head(max(b, b)) -obj?.head(max(div)) -obj?.head(max(f != 0)) -obj?.head(max(false)) -obj?.head(max(get(ok, b))) -obj?.head(max(obj)?.obj) -obj?.head(max(ok)) -obj?.head(max(s)) -obj?.head(min("a")) -obj?.head(min("c"), arr) -obj?.head(min(0)) -obj?.head(min(a)) -obj?.head(min(add)) -obj?.head(min(arr)) -obj?.head(min(b)) -obj?.head(min(f)) -obj?.head(min(nil)) -obj?.head(min(nil, 1), 0 / f) -obj?.head(min(ok)) -obj?.head(min(ok), arr, f) -obj?.head(min(s, s), f) -obj?.head(nil != 0) -obj?.head(nil != 0.5) -obj?.head(nil != 1) -obj?.head(nil != 2) -obj?.head(nil != a) -obj?.head(nil != add, obj.fn(b)) -obj?.head(nil != arr) -obj?.head(nil != b, "b" != 0) -obj?.head(nil != false) -obj?.head(nil != nil) -obj?.head(nil != obj) -obj?.head(nil != ok) -obj?.head(nil != true) -obj?.head(nil == "b") or add(a, 0) - obj.b -obj?.head(nil == "c" || add == f) -obj?.head(nil == arr) -obj?.head(nil == div) -obj?.head(nil == nil) -obj?.head(nil == obj) -obj?.head(nil == ok) -obj?.head(nil == s) -obj?.head(nil in arr) -obj?.head(nil || false) -obj?.head(nil || true) -obj?.head(nil) != add -obj?.head(nil) != arr -obj?.head(nil) != div -obj?.head(nil) != f -obj?.head(nil) == 2 + a -obj?.head(nil) == add -obj?.head(nil) == map(arr, "b") -obj?.head(nil) == obj.obj -obj?.head(nil) in obj -obj?.head(nil) in obj?.obj -obj?.head(nil)?.a -obj?.head(nil)?.a.b -obj?.head(nil)?.a?.b -obj?.head(nil)?.b -obj?.head(nil)?.b.a -obj?.head(nil)?.b.obj -obj?.head(nil)?.b?.obj -obj?.head(nil)?.fn(obj.obj) -obj?.head(nil)?.fn(s, "b" != f) -obj?.head(nil)?.head(ok) -obj?.head(nil)?.obj -obj?.head(nil)?.obj?.a -obj?.head(nil)?.obj?.b -obj?.head(nil, "a")?.obj -obj?.head(nil, "b")?.b -obj?.head(nil, "b", obj)?.b -obj?.head(nil, "b", s)?.b -obj?.head(nil, "b", s, f)?.obj -obj?.head(nil, "c")?.obj -obj?.head(nil, "c", 0.5)?.obj -obj?.head(nil, "c", f)?.a -obj?.head(nil, 0)?.a -obj?.head(nil, 0)?.b -obj?.head(nil, 0)?.obj -obj?.head(nil, 0, b, s)?.a -obj?.head(nil, 0.5, 0, s)?.b -obj?.head(nil, 1)?.b -obj?.head(nil, 1)?.obj -obj?.head(nil, 1, false)?.a -obj?.head(nil, 1, nil)?.obj -obj?.head(nil, 2)?.b -obj?.head(nil, 2)?.obj -obj?.head(nil, 2, 0, nil)?.a -obj?.head(nil, a) != s ? add : obj?.b -obj?.head(nil, a) == s -obj?.head(nil, a)?.a -obj?.head(nil, a)?.obj -obj?.head(nil, a, 0.5, a)?.a -obj?.head(nil, a, 0.5, add, false)?.b -obj?.head(nil, a, add)?.a -obj?.head(nil, a, ok, nil)?.obj -obj?.head(nil, a, s)?.b -obj?.head(nil, add)?.a -obj?.head(nil, add)?.obj -obj?.head(nil, add, "b")?.obj -obj?.head(nil, add, b)?.obj.obj -obj?.head(nil, add, false)?.a -obj?.head(nil, add, false)?.b -obj?.head(nil, add, nil, add)?.obj -obj?.head(nil, arr)?.a -obj?.head(nil, arr)?.b -obj?.head(nil, arr)?.obj -obj?.head(nil, arr, "a")?.obj -obj?.head(nil, arr, "c")?.b -obj?.head(nil, arr, 1)?.b -obj?.head(nil, arr, s)?.a -obj?.head(nil, b)?.a -obj?.head(nil, b)?.b -obj?.head(nil, b)?.obj -obj?.head(nil, b, a, ok, ok)?.b -obj?.head(nil, b, add)?.a -obj?.head(nil, b, b)?.b -obj?.head(nil, b, false)?.a -obj?.head(nil, b, s)?.a -obj?.head(nil, div)?.a -obj?.head(nil, div)?.obj -obj?.head(nil, div, arr)?.b -obj?.head(nil, f)?.b -obj?.head(nil, f)?.obj -obj?.head(nil, f, add, add)?.b -obj?.head(nil, f, nil)?.a -obj?.head(nil, f, s)?.a -obj?.head(nil, false)?.a -obj?.head(nil, false)?.obj -obj?.head(nil, false, s)?.a -obj?.head(nil, nil)?.a -obj?.head(nil, nil, 0.5)?.obj -obj?.head(nil, nil, add)?.b -obj?.head(nil, nil, add, arr)?.obj -obj?.head(nil, nil, ok)?.obj -obj?.head(nil, obj) in obj -obj?.head(nil, obj)?.a -obj?.head(nil, obj)?.b -obj?.head(nil, obj)?.b.a -obj?.head(nil, obj)?.obj -obj?.head(nil, ok)?.a -obj?.head(nil, ok)?.b -obj?.head(nil, ok)?.obj -obj?.head(nil, ok, "b")?.b -obj?.head(nil, ok, 0.5)?.a -obj?.head(nil, ok, arr)?.b -obj?.head(nil, ok, div, arr, obj)?.obj -obj?.head(nil, ok, nil, ok)?.obj -obj?.head(nil, ok, s, 1, true)?.obj.a -obj?.head(nil, s)?.a -obj?.head(nil, s)?.obj -obj?.head(nil, s, 0.5)?.obj -obj?.head(nil, s, a)?.obj -obj?.head(nil, s, false, s)?.a -obj?.head(nil, s, s)?.b -obj?.head(nil, true)?.a -obj?.head(nil, true)?.head(f, arr) -obj?.head(nil, true)?.obj -obj?.head(none("b", true), s == f) -obj?.head(none("c", false)) -obj?.head(none("c", ok)) -obj?.head(none("c", true)) -obj?.head(none(arr, ok), get(nil, 1), now(div, "a", s, div, f), a) -obj?.head(none(obj, false)) -obj?.head(none(obj, ok)) -obj?.head(none(s, false)) -obj?.head(not false) -obj?.head(not ok) -obj?.head(not true) -obj?.head(now(0, s)) -obj?.head(now(0, s), f + b) -obj?.head(now(0.5), arr, obj.a) -obj?.head(now(1)) -obj?.head(now(a)) -obj?.head(now(a, a, a)) -obj?.head(now(arr)) -obj?.head(now(b, b)) -obj?.head(now(b, div, f)) -obj?.head(now(b, s)) -obj?.head(now(div)) -obj?.head(now(div, div, "b", obj, 1)) -obj?.head(now(f, add)) -obj?.head(now(false)) -obj?.head(now(nil)) -obj?.head(now(nil, obj)) -obj?.head(now(obj), 0 == 1) -obj?.head(now(obj, 0)) -obj?.head(now(ok)) -obj?.head(now(ok, arr)) -obj?.head(now(ok, b)) -obj?.head(now(ok, b, arr, nil)) -obj?.head(now(ok, f), true == 0.5) -obj?.head(now(ok, true, a)) -obj?.head(now(s)) -obj?.head(now(s, b, s), "a" startsWith s) -obj?.head(now(s, nil)) -obj?.head(now(true)) -obj?.head(now(true, "b", add)) -obj?.head(obj != "a") -obj?.head(obj != 0) -obj?.head(obj != 0.5) -obj?.head(obj != add) -obj?.head(obj != nil) -obj?.head(obj != s) -obj?.head(obj && true) -obj?.head(obj == 0.5) -obj?.head(obj == 1) -obj?.head(obj == a) -obj?.head(obj == div) -obj?.head(obj == f, now(1)) -obj?.head(obj == false) -obj?.head(obj == obj) -obj?.head(obj == ok) -obj?.head(obj and true, 2 .. b) -obj?.head(obj in arr) -obj?.head(obj in nil) -obj?.head(obj or true) -obj?.head(obj) -obj?.head(obj) != a ** 0.5 -obj?.head(obj) != a ? obj : s -obj?.head(obj) != div -obj?.head(obj) != map(arr, s) -obj?.head(obj) != ok -obj?.head(obj) != s -obj?.head(obj) == add -obj?.head(obj) == div -obj?.head(obj) == f -obj?.head(obj) == s -obj?.head(obj) in arr -obj?.head(obj).a -obj?.head(obj).b -obj?.head(obj).head(b) -obj?.head(obj).head(get(div, f)) -obj?.head(obj).obj -obj?.head(obj).obj.obj -obj?.head(obj).obj?.a -obj?.head(obj).obj?.b -obj?.head(obj)?.a -obj?.head(obj)?.b -obj?.head(obj)?.head(0 <= f) -obj?.head(obj)?.head(a) -obj?.head(obj)?.head(add) -obj?.head(obj)?.obj -obj?.head(obj)?.obj.obj -obj?.head(obj)[s] -obj?.head(obj, "a").b -obj?.head(obj, "a").obj -obj?.head(obj, "a")?.a -obj?.head(obj, "a")?.obj -obj?.head(obj, "a", arr, obj)?.head(obj == s) -obj?.head(obj, "b").a -obj?.head(obj, "b").b -obj?.head(obj, "b", nil).b -obj?.head(obj, "c").b -obj?.head(obj, "c")?.a -obj?.head(obj, "c")?.obj -obj?.head(obj, 0 > a) -obj?.head(obj, 0).a -obj?.head(obj, 0).b -obj?.head(obj, 0).obj -obj?.head(obj, 0)?.a -obj?.head(obj, 0)?.b -obj?.head(obj, 0, add).b -obj?.head(obj, 0.5).a -obj?.head(obj, 0.5).obj -obj?.head(obj, 0.5)[s] -obj?.head(obj, 0.5, div)?.b -obj?.head(obj, 0.5, nil).b -obj?.head(obj, 1).b -obj?.head(obj, 1, 0).obj -obj?.head(obj, 1, 0)?.head(add) -obj?.head(obj, 1, ok)?.b -obj?.head(obj, 2).a -obj?.head(obj, 2).obj -obj?.head(obj, 2)?.obj -obj?.head(obj, 2, true).a -obj?.head(obj, a <= a) -obj?.head(obj, a) -obj?.head(obj, a).a -obj?.head(obj, a).b -obj?.head(obj, a).obj -obj?.head(obj, a)?.a -obj?.head(obj, a)?.b -obj?.head(obj, a)?.obj -obj?.head(obj, a, "c").a -obj?.head(obj, a, 1, add, s)?.obj -obj?.head(obj, a, 2, obj).obj -obj?.head(obj, a, a).a -obj?.head(obj, a, add, "b").b -obj?.head(obj, a, b)?.b * b -obj?.head(obj, a, f, b, a)?.b -obj?.head(obj, a, obj, 0.5).obj?.b -obj?.head(obj, a, ok, 1).obj?.a -obj?.head(obj, a, ok, add).b -obj?.head(obj, a, s)?.obj -obj?.head(obj, a, s, ok).b -obj?.head(obj, a, true)?.b -obj?.head(obj, add == ok) -obj?.head(obj, add) -obj?.head(obj, add).b -obj?.head(obj, add).obj -obj?.head(obj, add)?.a -obj?.head(obj, add)?.b -obj?.head(obj, add)?.obj -obj?.head(obj, add, nil).b -obj?.head(obj, add, s).a -obj?.head(obj, arr).a -obj?.head(obj, arr).a == ok -obj?.head(obj, arr).b -obj?.head(obj, arr).obj -obj?.head(obj, arr)?.b -obj?.head(obj, arr)?.obj -obj?.head(obj, arr, 0).b -obj?.head(obj, arr, a, b, s)?.a -obj?.head(obj, arr, f).b -obj?.head(obj, arr, f)?.b -obj?.head(obj, arr, nil).a -obj?.head(obj, arr, nil).b -obj?.head(obj, b) -obj?.head(obj, b).obj -obj?.head(obj, b)?.a -obj?.head(obj, b)?.b -obj?.head(obj, b)?.obj -obj?.head(obj, b, "a")?.obj -obj?.head(obj, b, 0.5).b -obj?.head(obj, b, b).obj -obj?.head(obj, b, div)?.b -obj?.head(obj, b, f).obj -obj?.head(obj, b, false, s)?.b -obj?.head(obj, b, nil, arr, true).a -obj?.head(obj, b, obj)?.b -obj?.head(obj, b, obj)?.obj -obj?.head(obj, b, ok).obj -obj?.head(obj, b, s).obj -obj?.head(obj, div != a) -obj?.head(obj, div) -obj?.head(obj, div).a -obj?.head(obj, div).head(add) -obj?.head(obj, div).obj -obj?.head(obj, div)?.a -obj?.head(obj, div)?.b -obj?.head(obj, div)?.fn(-b) -obj?.head(obj, div, "b")?.a -obj?.head(obj, div, "b", 0, "b").obj -obj?.head(obj, div, 0).b -obj?.head(obj, div, 0)?.a -obj?.head(obj, div, 1, false, b).a -obj?.head(obj, div, f).obj -obj?.head(obj, div, nil).a -obj?.head(obj, div, nil).obj -obj?.head(obj, div, obj.b) -obj?.head(obj, div, ok).b -obj?.head(obj, div, ok, nil).a -obj?.head(obj, div, true, a)?.b -obj?.head(obj, f * b) -obj?.head(obj, f) -obj?.head(obj, f) != obj?.head(arr, div) -obj?.head(obj, f) == b -obj?.head(obj, f).b -obj?.head(obj, f).obj -obj?.head(obj, f)?.b -obj?.head(obj, f)?.obj -obj?.head(obj, f, a).a -obj?.head(obj, f, a, f).a -obj?.head(obj, f, div).obj -obj?.head(obj, f, f)?.b -obj?.head(obj, f, false, b).b -obj?.head(obj, f, obj).a -obj?.head(obj, f, obj)?.obj?.b -obj?.head(obj, f, ok, obj.a) -obj?.head(obj, f, true).a -obj?.head(obj, false).a -obj?.head(obj, false).b -obj?.head(obj, false)?.b -obj?.head(obj, false, obj)?.obj -obj?.head(obj, false, ok)?.obj -obj?.head(obj, filter(arr, ok), arr) -obj?.head(obj, first(0.5), f).obj -obj?.head(obj, get(0.5), 0.5 ^ a) -obj?.head(obj, get(a, obj)) -obj?.head(obj, get(add, add), add) -obj?.head(obj, get(div, 0)) -obj?.head(obj, nil).a -obj?.head(obj, nil).obj -obj?.head(obj, nil)?.b -obj?.head(obj, nil, 1, s, obj).b -obj?.head(obj, nil, a).b -obj?.head(obj, nil, add, obj).obj?.b -obj?.head(obj, nil, b, a)?.obj -obj?.head(obj, nil, f).obj -obj?.head(obj, obj) -obj?.head(obj, obj).a -obj?.head(obj, obj).head(add) -obj?.head(obj, obj)?.a -obj?.head(obj, obj)?.b -obj?.head(obj, obj)?.obj -obj?.head(obj, obj, 0)?.b -obj?.head(obj, obj, a, "a", a)?.b -obj?.head(obj, obj, arr).a -obj?.head(obj, obj, b)?.a -obj?.head(obj, obj, false, f, 1).obj -obj?.head(obj, obj, nil, true)?.obj -obj?.head(obj, obj.b) -obj?.head(obj, obj.fn(b)) -obj?.head(obj, obj?.head(f)).b -obj?.head(obj, obj?.obj) -obj?.head(obj, ok == arr)?.b -obj?.head(obj, ok) -obj?.head(obj, ok).obj -obj?.head(obj, ok)?.a -obj?.head(obj, ok)?.b -obj?.head(obj, ok)?.obj -obj?.head(obj, ok, 0.5).obj -obj?.head(obj, ok, a).b -obj?.head(obj, ok, a, "b")?.obj -obj?.head(obj, ok, a, div, 0.5).a -obj?.head(obj, ok, a, true)?.a -obj?.head(obj, ok, b).obj -obj?.head(obj, ok, f).obj -obj?.head(obj, ok, false, f, div)?.obj -obj?.head(obj, ok, nil)?.b -obj?.head(obj, ok, obj).a -obj?.head(obj, s) -obj?.head(obj, s).a -obj?.head(obj, s).obj -obj?.head(obj, s).obj.a -obj?.head(obj, s)?.head(get(b, a)?.obj) -obj?.head(obj, s, 0, 0)?.obj -obj?.head(obj, s, a, a, ok).b -obj?.head(obj, s, add) -obj?.head(obj, s, add, obj)?.a -obj?.head(obj, s, f, a, b)?.b -obj?.head(obj, s, nil, s)?.a -obj?.head(obj, s, s, a, 2).b -obj?.head(obj, s[2]) -obj?.head(obj, string(a)) -obj?.head(obj, true).a -obj?.head(obj, true)?.a -obj?.head(obj, true)?.b -obj?.head(obj, true, 1, arr)?.b -obj?.head(obj, true, div, obj)?.b -obj?.head(obj, true, nil).obj -obj?.head(obj.a) -obj?.head(obj.a, add) -obj?.head(obj.a, get(a, add)) -obj?.head(obj.b) -obj?.head(obj.b, get(a, 2)) -obj?.head(obj.b, obj.head(ok, 0, add, 0.5, add)) -obj?.head(obj.b, string("a")) -obj?.head(obj.fn(2)) -obj?.head(obj.fn(a)) -obj?.head(obj.head("c", "c"), map(obj, true)) -obj?.head(obj.head(0)) -obj?.head(obj.head(0, false, s)) -obj?.head(obj.head(0.5, true)) -obj?.head(obj.head(2)) -obj?.head(obj.head(add)) -obj?.head(obj.head(arr)) -obj?.head(obj.head(arr, add)) -obj?.head(obj.head(arr, div)) -obj?.head(obj.head(b)) -obj?.head(obj.head(b), b, 0 == add) -obj?.head(obj.head(b, 0.5, a)) -obj?.head(obj.head(div)) -obj?.head(obj.head(div, div)) -obj?.head(obj.head(f)) -obj?.head(obj.head(false, b, f, b, a)) -obj?.head(obj.head(obj)) -obj?.head(obj.head(ok)) -obj?.head(obj.head(ok, nil, f)) -obj?.head(obj.head(s, a, add, add, add)) -obj?.head(obj.head(s, ok)) -obj?.head(obj.head(true)) -obj?.head(obj.obj) -obj?.head(obj.obj).b -obj?.head(obj.obj)?.b -obj?.head(obj.obj, f) -obj?.head(obj.obj, get(add, 0)) -obj?.head(obj.obj, obj) -obj?.head(obj.obj, ok) -obj?.head(obj?.a) -obj?.head(obj?.a, div) -obj?.head(obj?.a, obj) -obj?.head(obj?.a, obj.a) -obj?.head(obj?.a, ok or false) -obj?.head(obj?.a, s) -obj?.head(obj?.b) -obj?.head(obj?.b, "c" <= s) -obj?.head(obj?.b, f) -obj?.head(obj?.b, filter(arr, ok)) -obj?.head(obj?.fn(a), b) -obj?.head(obj?.fn(b)) -obj?.head(obj?.head("a")) -obj?.head(obj?.head(0)) -obj?.head(obj?.head(0.5)) -obj?.head(obj?.head(1)) -obj?.head(obj?.head(a)) -obj?.head(obj?.head(a, arr)) -obj?.head(obj?.head(a, ok, obj, add)) -obj?.head(obj?.head(add)) -obj?.head(obj?.head(add, add)) -obj?.head(obj?.head(add, false)) -obj?.head(obj?.head(arr, nil)) -obj?.head(obj?.head(b)) -obj?.head(obj?.head(b, a)) -obj?.head(obj?.head(b, a, div)) -obj?.head(obj?.head(b, false)) -obj?.head(obj?.head(b, s)) -obj?.head(obj?.head(f, a, 1)) -obj?.head(obj?.head(false)) -obj?.head(obj?.head(false, "c")) -obj?.head(obj?.head(obj)) -obj?.head(obj?.head(obj)).obj -obj?.head(obj?.head(obj, 0)) -obj?.head(obj?.head(ok)) -obj?.head(obj?.head(ok), div) -obj?.head(obj?.head(ok, 0)) -obj?.head(obj?.head(ok, 0, add), obj?.a) -obj?.head(obj?.head(s)) -obj?.head(obj?.head(s, arr, 0.5)) -obj?.head(obj?.head(s, arr, true)) -obj?.head(obj?.head(s, nil, 0)) -obj?.head(obj?.head(s, true)) -obj?.head(obj?.obj) -obj?.head(obj?.obj).obj -obj?.head(obj?.obj)?.obj -obj?.head(obj?.obj, a) -obj?.head(obj?.obj, map(obj, ok)) -obj?.head(obj[nil]) -obj?.head(obj[s]) -obj?.head(ok != "c", b) -obj?.head(ok != a) -obj?.head(ok != arr) -obj?.head(ok != b) -obj?.head(ok != div) -obj?.head(ok != f) -obj?.head(ok != false) -obj?.head(ok != obj) -obj?.head(ok != s, get(s, 1), add) -obj?.head(ok && "a") -obj?.head(ok && 0) -obj?.head(ok && 1 % b) -obj?.head(ok && a) -obj?.head(ok && a, obj != f) -obj?.head(ok && arr) -obj?.head(ok && f) -obj?.head(ok && obj) -obj?.head(ok && ok) -obj?.head(ok == 0) -obj?.head(ok == 0, f) -obj?.head(ok == 1, add == obj) -obj?.head(ok == 2) -obj?.head(ok == a) -obj?.head(ok == b) -obj?.head(ok == div) -obj?.head(ok == div, f) -obj?.head(ok == obj) -obj?.head(ok == ok) -obj?.head(ok == s) -obj?.head(ok == true) -obj?.head(ok ? "b" : add) -obj?.head(ok ? "c" : "b") -obj?.head(ok ? 1 : arr) -obj?.head(ok ? 1 : div.b) -obj?.head(ok ? a : "c") -obj?.head(ok ? a : f) -obj?.head(ok ? a : obj, add) -obj?.head(ok ? add : div) -obj?.head(ok ? add : obj, s, obj.head(a, obj)) -obj?.head(ok ? arr : div) -obj?.head(ok ? arr : nil) -obj?.head(ok ? b : 0.5) -obj?.head(ok ? b : b) -obj?.head(ok ? b : nil && div) -obj?.head(ok ? div : 0.5) -obj?.head(ok ? div : arr) -obj?.head(ok ? div : nil) -obj?.head(ok ? f : 1) -obj?.head(ok ? false : ok) -obj?.head(ok ? nil : 0.5) -obj?.head(ok ? nil : arr) -obj?.head(ok ? nil : b, obj?.b) -obj?.head(ok ? nil : f, arr) -obj?.head(ok ? nil : ok) -obj?.head(ok ? obj : add) -obj?.head(ok ? obj : b) -obj?.head(ok ? obj : s) -obj?.head(ok ? ok : arr) -obj?.head(ok ? true : add) -obj?.head(ok and "a") -obj?.head(ok and a, last(0.5)) -obj?.head(ok and add) -obj?.head(ok and b) -obj?.head(ok and div, get(0, arr)) -obj?.head(ok and f) -obj?.head(ok and nil, f)?.obj -obj?.head(ok and obj) -obj?.head(ok and obj).obj -obj?.head(ok and ok) -obj?.head(ok and s) -obj?.head(ok in arr) -obj?.head(ok or "a") -obj?.head(ok or "c") -obj?.head(ok or 2) -obj?.head(ok or a) -obj?.head(ok or add) -obj?.head(ok or arr) -obj?.head(ok or div) -obj?.head(ok or get(div >= b, arr?.head("b"))) -obj?.head(ok or nil) -obj?.head(ok or obj) -obj?.head(ok or true, a) -obj?.head(ok || 0) -obj?.head(ok || 0, f) -obj?.head(ok || a) -obj?.head(ok || add) -obj?.head(ok || arr.obj in map("b" / a, min(f)).obj) -obj?.head(ok || b || add.fn(0.5, obj)) -obj?.head(ok || div) -obj?.head(ok || div, 1 != add) -obj?.head(ok || s) -obj?.head(ok) -obj?.head(ok) != a -obj?.head(ok) != f -obj?.head(ok) != obj?.a -obj?.head(ok) != obj?.b -obj?.head(ok) && not ok -obj?.head(ok) && ok -obj?.head(ok) == a -obj?.head(ok) == obj.obj -obj?.head(ok) == ok -obj?.head(ok) ? s : arr -obj?.head(ok) and 0 == nil -obj?.head(ok) and 0.5 != a -obj?.head(ok) or ok -obj?.head(ok) || obj?.a?.head(b <= a ? s : a / a || lastIndexOf(2) % (arr matches 0.5)) -obj?.head(ok, "a" contains "b") -obj?.head(ok, 2) == keys(obj) -obj?.head(ok, a) -obj?.head(ok, add != a) -obj?.head(ok, arr) -obj?.head(ok, b) -obj?.head(ok, div) -obj?.head(ok, f) -obj?.head(ok, f) == s -obj?.head(ok, f, b) -obj?.head(ok, false or ok) -obj?.head(ok, false) or ok -obj?.head(ok, map(arr, false)) -obj?.head(ok, none(s, false)) -obj?.head(ok, not ok) -obj?.head(ok, obj) -obj?.head(ok, obj) != add ? b : nil -obj?.head(ok, obj.head(s), obj) -obj?.head(ok, obj?.obj) -obj?.head(ok, ok or 0.5) -obj?.head(ok, s) -obj?.head(ok, s, ok, 0.5) == obj -obj?.head(ok, s, s) == a -obj?.head(one("a", ok)) -obj?.head(one("b", true)) -obj?.head(one(arr, false)) -obj?.head(one(arr, ok)) -obj?.head(one(arr, ok), ok) -obj?.head(one(arr, true)) -obj?.head(one(obj, false)) -obj?.head(one(obj, ok)) -obj?.head(one(obj, true)) -obj?.head(one(s, # < #)) -obj?.head(one(s, ok)) -obj?.head(one(s, true)) -obj?.head(s != "a", f) -obj?.head(s != "b") -obj?.head(s != 0) -obj?.head(s != 1) -obj?.head(s != 2) -obj?.head(s != 2, obj) -obj?.head(s != a) -obj?.head(s != add) -obj?.head(s != arr) -obj?.head(s != b) -obj?.head(s != div) -obj?.head(s != f) -obj?.head(s != nil) -obj?.head(s != obj) -obj?.head(s != ok) -obj?.head(s + s) -obj?.head(s <= "b") -obj?.head(s <= s) -obj?.head(s == "b") -obj?.head(s == "c") -obj?.head(s == 0) -obj?.head(s == 2) -obj?.head(s == a) -obj?.head(s == add) -obj?.head(s == arr) -obj?.head(s == f) -obj?.head(s == false) -obj?.head(s == obj) -obj?.head(s == ok) -obj?.head(s == s) -obj?.head(s == true) -obj?.head(s > s) -obj?.head(s >= s) -obj?.head(s and false) -obj?.head(s contains "a") -obj?.head(s contains s, add != 0.5) -obj?.head(s endsWith "a") -obj?.head(s endsWith s) -obj?.head(s in arr) -obj?.head(s in obj) -obj?.head(s matches s, ok or ok) -obj?.head(s or false) -obj?.head(s startsWith "b") -obj?.head(s startsWith s) -obj?.head(s) -obj?.head(s) != div -obj?.head(s) != obj.a -obj?.head(s) == arr -obj?.head(s) == ok -obj?.head(s) endsWith string(0.5) -obj?.head(s)[a] -obj?.head(s, "a") != s -obj?.head(s, "b" == a) -obj?.head(s, "b", 0.5) == div -obj?.head(s, a % a) -obj?.head(s, a) -obj?.head(s, add) -obj?.head(s, add, nil, arr) != f -obj?.head(s, arr) -obj?.head(s, arr) == f -obj?.head(s, arr) == ok -obj?.head(s, arr, div) -obj?.head(s, b == add) -obj?.head(s, div) -obj?.head(s, f) -obj?.head(s, get(0, div)) -obj?.head(s, get(f, obj)) -obj?.head(s, nil) != ok -obj?.head(s, nil, add)[2 + 0] -obj?.head(s, nil, ok, f)[a] -obj?.head(s, none(s, ok)) -obj?.head(s, now(0.5, f, ok)) -obj?.head(s, obj.obj) -obj?.head(s, ok in nil) -obj?.head(s, ok) -obj?.head(s, ok) in obj -obj?.head(s, ok, ok) != f == nil -obj?.head(s, s) -obj?.head(s[0.5]) -obj?.head(s[a]) -obj?.head(s[b]) -obj?.head(s[f]) -obj?.head(string("a")) -obj?.head(string("a", b)) -obj?.head(string("c")) -obj?.head(string(1, nil)) -obj?.head(string(2)) -obj?.head(string(a)) -obj?.head(string(a), 0 or false) -obj?.head(string(arr)) -obj?.head(string(arr), arr) -obj?.head(string(arr), b == 2) -obj?.head(string(div)) -obj?.head(string(div, f)) -obj?.head(string(f)) -obj?.head(string(nil)) -obj?.head(string(nil, "c", s)) -obj?.head(string(nil, s)) -obj?.head(string(obj)) -obj?.head(string(obj, arr, ok, nil)) -obj?.head(string(s)) -obj?.head(string(s, "b")) -obj?.head(string(s, 2)) -obj?.head(string(s, arr, ok, obj)) -obj?.head(toBase64("a")) -obj?.head(toBase64("b")) -obj?.head(toBase64(s)) -obj?.head(toBase64(s, 0.5)) -obj?.head(toBase64(s, 1)) -obj?.head(toJSON("a")) -obj?.head(toJSON("c")) -obj?.head(toJSON("c", nil)) -obj?.head(toJSON(0.5, nil)) -obj?.head(toJSON(2, "c")) -obj?.head(toJSON(2, b)) -obj?.head(toJSON(a)) -obj?.head(toJSON(a, 0)) -obj?.head(toJSON(a, s)) -obj?.head(toJSON(arr)) -obj?.head(toJSON(arr), div) -obj?.head(toJSON(b)) -obj?.head(toJSON(b, 0, s)) -obj?.head(toJSON(f)) -obj?.head(toJSON(f, "b")) -obj?.head(toJSON(false), ok) -obj?.head(toJSON(nil)) -obj?.head(toJSON(nil, nil, 2, div)) -obj?.head(toJSON(true, a)) -obj?.head(trim("c")) -obj?.head(trimPrefix("a", ok, "c", s, 0.5)) -obj?.head(trimPrefix("c")) -obj?.head(trimPrefix("c", s)) -obj?.head(trimSuffix("b")) -obj?.head(true != 0.5) -obj?.head(true != ok) -obj?.head(true != s) -obj?.head(true != true) -obj?.head(true && a) -obj?.head(true && arr) -obj?.head(true && arr, any(arr, ok)) -obj?.head(true && b) -obj?.head(true == add) -obj?.head(true == div) -obj?.head(true == obj, div(2, 1)) -obj?.head(true == ok) -obj?.head(true ? "b" : obj) -obj?.head(true ? a : obj) -obj?.head(true ? add : div) -obj?.head(true ? arr : add) -obj?.head(true ? div : b) -obj?.head(true ? nil : arr) -obj?.head(true ? obj : arr) -obj?.head(true ? obj : ok) -obj?.head(true ? ok : b) -obj?.head(true and "c") -obj?.head(true and nil) -obj?.head(true and obj) -obj?.head(true and true, b) -obj?.head(true in nil) -obj?.head(true or b, string("c")) -obj?.head(true or nil) -obj?.head(true or obj) -obj?.head(true or s) -obj?.head(true || div) -obj?.head(true || false, s contains s) -obj?.head(true || nil, add) -obj?.head(true) != div -obj?.head(true) or f < 1 -obj?.head(true, div) or obj.b -obj?.head(true, f, ok, obj) and add == add -obj?.head(true, obj) == b ? 0 : obj.b -obj?.head(true, ok, b, 0) or obj.a -obj?.head(true, s, div, f) == obj.b -obj?.head(upper("a")) -obj?.head(upper("b")) -obj?.head(upper(1, s)) -obj?.head(upper(s)) -obj?.head(upper(true, f, 1, s)) -obj?.head(values(obj)) -obj?.head({"a": 0, "b": div}) -obj?.head({"b": s}) -obj?.head({"c": f}) -obj?.obj -obj?.obj != -a -obj?.obj != -f -obj?.obj != a -obj?.obj != add -obj?.obj != any(arr, false) -obj?.obj != arr -obj?.obj != arr ? ok : s -obj?.obj != arr ? s : nil -obj?.obj != b -obj?.obj != div -obj?.obj != div(b, a) -obj?.obj != f -obj?.obj != float(0.5) -obj?.obj != map(arr, true) -obj?.obj != max(0.5) -obj?.obj != nil == nil -obj?.obj != nil == ok -obj?.obj != obj ? arr : ok -obj?.obj != obj.obj -obj?.obj != obj?.a -obj?.obj != obj?.b -obj?.obj != ok -obj?.obj != s -obj?.obj == -a -obj?.obj == a -obj?.obj == a ** a -obj?.obj == a ** f -obj?.obj == add -obj?.obj == add(2, b) -obj?.obj == add(a, b) -obj?.obj == add(b, 0) -obj?.obj == arr -obj?.obj == b -obj?.obj == b ? 2 : div -obj?.obj == b ? add : a -obj?.obj == div -obj?.obj == div ? arr : a -obj?.obj == f -obj?.obj == map(arr, ok) -obj?.obj == obj -obj?.obj == obj ? b : false -obj?.obj == obj.obj -obj?.obj == obj.obj.a -obj?.obj == obj?.b -obj?.obj == ok -obj?.obj == s -obj?.obj == s + "a" -obj?.obj in arr -obj?.obj in obj.head(arr, obj) -obj?.obj or 1 == 0 -obj?.obj.a -obj?.obj.a != add -obj?.obj.a != arr -obj?.obj.a == arr -obj?.obj.a == f -obj?.obj.b -obj?.obj.b > b -obj?.obj.b >= a -obj?.obj.obj -obj?.obj.obj == arr -obj?.obj.obj.a -obj?.obj.obj.b -obj?.obj.obj.b == add -obj?.obj.obj.obj -obj?.obj.obj?.a -obj?.obj.obj?.b -obj?.obj.obj?.obj -obj?.obj?.a -obj?.obj?.a <= b -obj?.obj?.a == add -obj?.obj?.b -obj?.obj?.b == div -obj?.obj?.b == obj -obj?.obj?.obj -obj?.obj?.obj != ok -obj?.obj?.obj.a -obj?.obj?.obj.b -obj?.obj?.obj.obj -obj?.obj?.obj?.a -obj?.obj?.obj?.b -obj?.obj?.obj?.obj -obj?.obj[obj.head(s, 0)] == add -obj?.obj[obj?.head(nil, "a")] -obj?.obj[obj?.head(s)] -obj?.obj[s] -obj?.obj[string(0.5)]?.a -obj[nil] != div -obj[nil] != s -obj[nil] == add -obj[nil] == arr -obj[nil] == f -obj[nil]?.a -obj[nil]?.a.a -obj[nil]?.a.b -obj[nil]?.a.obj -obj[nil]?.a?.a -obj[nil]?.b -obj[nil]?.b?.b -obj[nil]?.fn(b) -obj[nil]?.fn(ok) -obj[nil]?.head(arr) -obj[nil]?.obj -obj[nil]?.obj.obj -obj[obj.head(s)] -obj[ok ? "b" : add] -obj[s[a:b]] -obj[s] -obj[s] != arr -obj[s] != div -obj[s] != f -obj[s] != f ? add : div -obj[s] != s -obj[s] == !ok -obj[s] == add -obj[s] == obj.head(s) -obj[s]?.a -obj[s]?.a.b -obj[s]?.a?.b -obj[s]?.b -obj[s]?.b.a -obj[s]?.b.b -obj[s]?.b?.obj -obj[s]?.fn(a > 0).b -obj[s]?.fn(f) -obj[s]?.head(get(b == a)) -obj[s]?.head(obj.a) -obj[s]?.head(ok || a) -obj[s]?.obj -obj[s]?.obj.b -obj[s]?.obj.obj -obj[s]?.obj?.a -obj[s]?.obj?.b.obj -obj[s]?.obj?.obj -obj[string("a")] -obj[string(2)]?.a -obj[string(add)] -obj[string(nil)] -obj[string(obj)] -obj[toJSON("b")] -obj[toJSON(a)] -obj[toJSON(f)] -obj[toJSON(ok)]?.obj -obj[trimPrefix("b")] -obj[upper(s)] ok +ok != !ok ok != !true -ok != (arr != arr || a > a) -ok != (ok or true) -ok != (true || true) -ok != false ? 1 : "b" -ok != first(obj?.head(0.5)) -ok != nil != nil -ok != nil != ok -ok != nil != true -ok != nil == ok -ok != nil ? true : f -ok != nil || one(arr, ok) -ok != none(arr, false) -ok != obj.a -ok != obj.b -ok != obj.head("a", true) -ok != obj.head(add) -ok != obj.head(arr) -ok != obj.head(f, "c") -ok != obj.head(ok, "c", nil, nil) -ok != obj.obj -ok != obj.obj.obj -ok != obj?.a -ok != obj?.b -ok != obj?.fn(a) -ok != obj?.fn(b) -ok != obj?.head(1) -ok != obj?.head(get(ok, obj))?.b -ok != obj?.head(nil, add) -ok != obj?.head(obj == obj) -ok != obj?.head(ok) -ok != obj?.obj -ok != obj?.obj.a -ok != obj?.obj.obj == nil ? s : obj.obj?.obj -ok != obj?.obj?.a -ok != obj?.obj?.b +ok != false != ok +ok != false ? 1 : i +ok != nil == nil +ok != none(list, ok) +ok != not !ok +ok != not ok ok != ok -ok != ok != ok -ok != ok and obj.fn(f, nil) -ok != ok or b >= a -ok != one(arr, false) -ok != true ? "b" : nil -ok && !ok -ok && "a" > "a" -ok && "a" >= s -ok && "c" < s -ok && (true || ok) -ok && 0 != f -ok && 0 <= f -ok && 0 == nil -ok && 0.5 != b -ok && 0.5 >= f -ok && 1 != 2 -ok && 2 != f -ok && 2 > f -ok && a < 1 -ok && a < b -ok && a <= 0 -ok && a <= a -ok && a <= f -ok && a == 0 -ok && a >= f -ok && all(arr, ok) -ok && all(arr, true) -ok && arr != arr -ok && arr == arr -ok && b < 0.5 -ok && b == b -ok && b >= f -ok && b in arr -ok && div == nil -ok && f != 0 -ok && f != f -ok && f < f -ok && false && ok -ok && false ? f : toJSON("c") -ok && nil == "c" -ok && nil == f -ok && none(arr, ok) -ok && not ok -ok && obj.a -ok && obj.b -ok && obj.head(a) -ok && obj.head(b) -ok && obj.head(b, obj) -ok && obj.head(false) -ok && obj.obj -ok && obj.obj?.a -ok && obj.obj?.obj -ok && obj?.a -ok && obj?.b -ok && obj?.head(a, b) -ok && obj?.head(add, b, nil, obj) -ok && obj?.head(arr) -ok && obj?.head(false) -ok && obj?.head(nil) -ok && obj?.obj -ok && obj?.obj != obj.b -ok && obj?.obj?.a -ok && obj?.obj?.b +ok != ok || ok +ok && !ok ? f32 : 0.5 +ok && !true +ok && "bar" >= "bar" +ok && "foo" <= "bar" +ok && 0.5 != nil +ok && 0.5 == 0.5 +ok && 0.5 >= f32 +ok && 1 != f64 +ok && 1 != i32 +ok && 1 < 1 +ok && 1 <= 0.5 +ok && 1 == f64 +ok && 1 >= f32 +ok && div == half +ok && f32 != 0.5 +ok && f32 < 0.5 +ok && f32 == f32 +ok && f32 == i64 +ok && f64 < 1 +ok && f64 < i32 +ok && f64 == i32 +ok && f64 >= i32 +ok && false == false +ok && i != i +ok && i32 != 0.5 +ok && i32 < f32 +ok && i32 <= i64 +ok && i32 == 1 +ok && i32 >= 1 +ok && i64 < i32 +ok && i64 <= i32 +ok && i64 > 1 +ok && list != array +ok && nil != f64 +ok && nil == add +ok && nil == i32 +ok && nil == true ok && ok -ok && ok ? a : ok -ok && ok ? add : s -ok && ok ? b : a -ok && ok ? f : obj -ok && ok and obj?.obj -ok && ok or nil == a -ok && ok or obj?.head(div, f) -ok && ok || ok -ok && s != s -ok && s contains "b" -ok && true && obj.obj -ok && true and ok -ok && true or obj?.obj -ok == !true -ok == (false || ok) -ok == (ok and true) -ok == false == ok ? b : obj -ok == false || 0.5 >= f -ok == false || s != nil -ok == nil ? 2 : arr -ok == nil ? add : arr -ok == nil ? div : "a" -ok == nil ? div : obj.b -ok == nil ? f : ok -ok == nil ? nil : "c" -ok == obj.a -ok == obj.b -ok == obj.head(a) -ok == obj.head(add) -ok == obj.head(b) -ok == obj.head(div) -ok == obj.head(f, s, 0, 2) -ok == obj.head(ok) -ok == obj.head(s) -ok == obj.head(true) -ok == obj.obj -ok == obj?.a -ok == obj?.b -ok == obj?.head(0, s) -ok == obj?.head(a != a) -ok == obj?.head(a, 0, obj) -ok == obj?.head(a, obj, 0, s, obj) -ok == obj?.head(add) -ok == obj?.head(add, add) -ok == obj?.head(b, "a", add) -ok == obj?.head(div, "b") -ok == obj?.head(nil, false) -ok == obj?.head(obj.head(arr, b)) -ok == obj?.head(ok) -ok == obj?.head(ok, div, f, nil, 0.5) -ok == obj?.obj +ok && score != add +ok && true != ok +ok && true == nil +ok == !false +ok == !ok +ok == (false or true) +ok == (ok and ok) +ok == any(list, ok) +ok == false == nil +ok == nil ? false : add +ok == nil ? score : array +ok == not false +ok == not true ok == ok -ok == ok != (ok or true) -ok == ok == obj?.a -ok == ok ? add : nil -ok == ok ? b : s -ok == ok and arr == arr -ok == ok || obj.obj -ok == one(arr, ok) -ok == true != nil -ok == true ? add : s -ok == true and ok -ok ? "a" : a != b / b -ok ? "a" : f == obj.b -ok ? "a" : obj.a -ok ? "a" : obj.b -ok ? "a" : obj?.a -ok ? "b" : b % obj.head(ok) -ok ? "b" : obj.b -ok ? "b" : obj.obj -ok ? "b" : obj?.b?.b -ok ? "b" : obj?.obj -ok ? "b" : s endsWith obj.head(add) -ok ? "c" : 0 % a -ok ? "c" : 0.5 * f -ok ? "c" : obj?.b -ok ? "c" : obj?.fn(add(arr, a) in none(0, b)) -ok ? "c" : obj?.head(arr?.head(a), arr.head(!arr, div?.head(obj, "c"), int(div, div))) -ok ? 0 * b : obj?.obj -ok ? 0 : 1 / obj.fn(add, false, add) -ok ? 0 : a == b -ok ? 0 : f * b -ok ? 0 : obj != obj -ok ? 0 : obj.a -ok ? 0 : obj.obj -ok ? 0 : obj?.a -ok ? 0 : obj?.b -ok ? 0 : obj?.b.head(add(map(f / b, add(0.5)), add(arr * s, upper(b)))) -ok ? 0 : obj?.fn(add?.obj).b -ok ? 0 : obj?.fn(any(a, ok)) -ok ? 0 : obj?.fn(div(a.head("c", obj), div(div))) -ok ? 0 : obj?.fn(div(false))?.a -ok ? 0 : obj?.head(any(ok, div(obj))) -ok ? 0 : obj?.head(hasPrefix(true, "c", add, f), div.a) -ok ? 0 : obj?.obj -ok ? 0 : s <= obj.b -ok ? 0 == 0 : s -ok ? 0.5 != 0 : trim(nil, s) -ok ? 0.5 : add == obj.fn(s) -ok ? 0.5 : b == obj?.a -ok ? 0.5 : f ^ f -ok ? 0.5 : obj.a -ok ? 0.5 : obj.b -ok ? 0.5 : obj.fn(obj) -ok ? 0.5 : obj.head(add.a * div.fn(0, f)) -ok ? 0.5 : obj.obj -ok ? 0.5 : obj?.a -ok ? 0.5 : obj?.b -ok ? 0.5 : obj?.head(nil - arr) -ok ? 0.5 : obj?.obj -ok ? 1 + b : a -ok ? 1 : obj in obj.b -ok ? 1 : obj.b -ok ? 1 : obj?.head(arr[0:obj], a?.a) -ok ? 1 : obj?.obj -ok ? 2 : add == div -ok ? 2 : obj.b -ok ? 2 : obj.obj -ok ? 2 : obj?.a -ok ? a : "a" != s -ok ? a : -0 -ok ? a : 0 < b -ok ? a : 0 > a -ok ? a : 0.5 / a -ok ? a : 1 + f -ok ? a : 2 / a -ok ? a : a / obj.obj -ok ? a : a >= a -ok ? a : add -ok ? a : obj.a -ok ? a : obj.b -ok ? a : obj.head(all(b, a)) -ok ? a : obj.obj -ok ? a : obj.obj < a -ok ? a : obj?.a -ok ? a : obj?.b -ok ? a : obj?.head(add).head(join(nil, ok) + f) -ok ? a : obj?.head(div(add(arr, div, b, "a", b))) -ok ? a : obj?.head(now(add(div, obj, add), add.obj, get(ok, b), div(arr))) -ok ? a : obj?.obj -ok ? a : s -ok ? a < 1 : add -ok ? a < a : obj -ok ? abs(0) : f -ok ? add : 0.5 * a -ok ? add : 0.5 >= a -ok ? add : a -ok ? add : arr -ok ? add : b .. a +ok ? "bar" : i == f32 +ok ? "bar" : i32 < i32 +ok ? "foo" : foo.String +ok ? -0.5 : foo +ok ? -f32 : i64 + 1 +ok ? -f64 : score +ok ? -i64 : ok +ok ? 0.5 * array[i64] : greet +ok ? 0.5 : f64 < i64 +ok ? 0.5 : half != add +ok ? 0.5 : i .. i +ok ? 0.5 < i32 : score +ok ? 0.5 == 0.5 : half +ok ? 1 : 1 + i64 + i32 +ok ? 1 : foo.Bar +ok ? 1 : foo.String +ok ? add : add +ok ? add : array ok ? add : div -ok ? add : f -ok ? add : nil != obj.b -ok ? add : nil == div -ok ? add : obj -ok ? add : obj in obj.b -ok ? add : obj.a -ok ? add : obj.b -ok ? add : obj.b?.obj -ok ? add : obj.fn("c", b).obj -ok ? add : obj.fn(f.a < a?.head(1), f) -ok ? add : obj.head(arr, s) -ok ? add : obj.head(true)?.obj -ok ? add : obj.obj -ok ? add : obj.obj != obj.obj -ok ? add : obj?.a -ok ? add : obj?.b -ok ? add : obj?.b.b -ok ? add : obj?.fn(a?.fn(filter(0.5, "b"), add(a, arr))) -ok ? add : obj?.fn(add(obj endsWith obj), obj) -ok ? add : obj?.fn(none(arr, ok) > f - arr) -ok ? add : obj?.obj +ok ? add : f32 +ok ? add : greet +ok ? add : i +ok ? add : i32 +ok ? add : i64 +ok ? add : list ok ? add : ok -ok ? add : s -ok ? arr : "c" == obj?.obj -ok ? arr : 0 ** a -ok ? arr : a -ok ? arr : a + add(b, nil) -ok ? arr : a > b -ok ? arr : add -ok ? arr : arr -ok ? arr : arr in fromJSON(s) -ok ? arr : arr in obj?.fn(a) -ok ? arr : b -ok ? arr : b .. a -ok ? arr : b > obj.head(0.5, 0, ok) -ok ? arr : div == obj?.head(nil) -ok ? arr : f -ok ? arr : obj.b -ok ? arr : obj.fn(arr)?.a -ok ? arr : obj.head(all(f, a) matches div?.head("a", a), all(arr, b) / s?.fn(2), obj?.b?.a, count("b", add).b) -ok ? arr : obj.head(div(add(a), arr?.fn(nil)), none(nil, ok) < hasSuffix(true, add), min(0.5, "c", true, div) ? div.obj : lower(false, a, 0)) -ok ? arr : obj.head(f.head(ok) + a) -ok ? arr : obj.head(s, s) -ok ? arr : obj.obj -ok ? arr : obj?.b -ok ? arr : obj?.b.b -ok ? arr : obj?.fn(f startsWith len(true, obj, 0), arr matches b?.a).b -ok ? arr : obj?.fn(obj in min(true, ok), all(a .. arr, f), ("c" == ok) * a) -ok ? arr : obj?.obj -ok ? arr : ok -ok ? arr : s + s -ok ? arr : s contains obj.a -ok ? arr : s matches obj?.b -ok ? arr[a:a] : nil != false -ok ? b ** f : arr -ok ? b + f : obj?.b -ok ? b : (false ? b : nil) -ok ? b : 0 + b -ok ? b : add -ok ? b : b -ok ? b : div -ok ? b : f >= f -ok ? b : int(s) -ok ? b : obj -ok ? b : obj.a -ok ? b : obj.obj -ok ? b : obj?.a -ok ? b : obj?.b -ok ? b : obj?.fn("b" .. 0) -ok ? b : obj?.fn(b?.obj, none(obj, ok)) -ok ? b : obj?.obj -ok ? b : ok -ok ? b : s < s -ok ? b : s endsWith obj.b -ok ? div : 1 * obj.a -ok ? div : a -ok ? div : a < f -ok ? div : add -ok ? div : b -ok ? div : b - b ^ 0 +ok ? array : div +ok ? array : f64 +ok ? array : float(i32) +ok ? array : foo +ok ? array : foo?.Bar +ok ? array : i32 +ok ? array : i64 +ok ? array : list +ok ? array : ok in map(array, ok) ok ? div : div -ok ? div : f -ok ? div : keys(obj) -ok ? div : nil == ok -ok ? div : obj.b -ok ? div : obj.fn(ok != f, div?.obj) -ok ? div : obj.obj -ok ? div : obj?.a -ok ? div : obj?.b -ok ? div : obj?.fn(add) -ok ? div : obj?.fn(obj.head(1)) -ok ? div : obj?.head(div, a.a) -ok ? div : obj?.head(false ** true <= date(arr, s)) -ok ? div : obj?.head(obj?.head(s, 0, obj) .. add, none(div.a, false != 2)) -ok ? div : obj?.head(ok, add.fn(add)) * a -ok ? div : obj?.obj -ok ? div : obj[obj?.head(arr)] -ok ? div : ok -ok ? div : s <= s -ok ? div : s contains s != true -ok ? div : toJSON(0) -ok ? div(a, b) : f -ok ? f - 0 : a / a -ok ? f : (true ? arr : "b")?.a -ok ? f : 0 == obj.obj -ok ? f : 0.5 ** b -ok ? f : 0.5 - f -ok ? f : 0.5 > f -ok ? f : 2 % obj.fn(div) -ok ? f : a * a -ok ? f : a <= obj.head(true, ok) -ok ? f : add -ok ? f : b -ok ? f : f -ok ? f : f - obj.obj -ok ? f : f >= f -ok ? f : obj.a?.a -ok ? f : obj.b -ok ? f : obj.fn(any(div, f)) -ok ? f : obj.head(obj.head(1), all(s, b), add(true)) -ok ? f : obj.obj -ok ? f : obj?.a -ok ? f : obj?.b -ok ? f : obj?.fn(div.obj, a, map(f, f), one(s, b)) -ok ? f : obj?.obj -ok ? f : obj[obj.head("c")]?.b -ok ? false : a / obj.a?.fn(div(arr, a, ok).b, add(obj[nil])) -ok ? false : b - f -ok ? false : obj.a -ok ? false : obj.b -ok ? false : obj.fn(div).a -ok ? false : obj.head(ok) -ok ? false : obj.head(s.fn(obj, add, obj)) -ok ? false : obj.obj -ok ? false : obj?.a -ok ? false : obj?.head(map(b, ok)).b -ok ? false : obj?.obj -ok ? map(arr, f) : arr -ok ? map(arr, f) : obj?.b -ok ? max(b) : s -ok ? nil : 0 * get(arr, b) -ok ? nil : a == f * b -ok ? nil : arr[a:obj.obj] -ok ? nil : b .. obj.b?.obj -ok ? nil : f == a - a -ok ? nil : obj.a -ok ? nil : obj.b -ok ? nil : obj.fn(0 % add.a) -ok ? nil : obj.fn(div(s)) -ok ? nil : obj.obj -ok ? nil : obj?.a -ok ? nil : obj?.fn(add(arr, nil, b, obj)) -ok ? nil : obj?.fn(arr != ok, f.obj) -ok ? nil : obj?.fn(filter(obj, b) and div(ok, b))?.head(b) -ok ? nil : obj?.head(get("b" ** div, count(ok, add))) -ok ? nil : obj?.obj -ok ? nil == add : s -ok ? not false : true || false -ok ? obj : "b" startsWith obj.a -ok ? obj : "c" < "a" -ok ? obj : 0 - a ^ b -ok ? obj : 0.5 * obj.b -ok ? obj : 2 >= obj?.obj -ok ? obj : a -ok ? obj : a >= f -ok ? obj : add -ok ? obj : b ^ b -ok ? obj : div -ok ? obj : f -ok ? obj : nil != s -ok ? obj : obj -ok ? obj : obj.a -ok ? obj : obj.b -ok ? obj : obj.fn(indexOf(map(add, div))) -ok ? obj : obj.head(none(a, a / 0), nil .. f?.obj, div(0).a) -ok ? obj : obj.obj -ok ? obj : obj?.a -ok ? obj : obj?.b -ok ? obj : obj?.head(add.obj.a) -ok ? obj : obj?.head(arr) -ok ? obj : obj?.obj -ok ? obj : ok -ok ? obj : s -ok ? obj : true != nil -ok ? obj.a : 0.5 != 1 -ok ? obj.b : (ok ? 2 : add) -ok ? obj.b : a -ok ? obj.head(a) : a -ok ? obj.head(nil, div, 0.5, add) : add -ok ? obj.obj : s -ok ? obj?.fn(0) : 1 * a -ok ? obj?.obj : obj -ok ? ok : a -ok ? ok : a ^ obj.fn(a, 1) -ok ? ok : add -ok ? ok : arr -ok ? ok : b > a - 0 -ok ? ok : div -ok ? ok : obj.b -ok ? ok : obj.b?.obj?.b -ok ? ok : obj.fn(0.5 ^ f, none(arr, b), f?.obj, all(b, obj), splitN(true)) -ok ? ok : obj.fn(a || 0.5) -ok ? ok : obj.fn(add.head(true && f, arr.head(f))) -ok ? ok : obj.fn(arr.a, obj.head(a), any(f, obj), 0.5 - obj) -ok ? ok : obj.fn(div, hasSuffix(f, 1)[ok], get(0 ? add : div, one(arr, s))) -ok ? ok : obj.head(a) -ok ? ok : obj.obj?.b -ok ? ok : obj?.a -ok ? ok : obj?.b -ok ? ok : obj?.obj -ok ? ok : obj?.obj.fn(arr) -ok ? ok : s >= obj?.fn(false, "b") -ok ? s : 0 - -0 -ok ? s : 0 - f -ok ? s : 2 in arr ? a : a -ok ? s : a % b -ok ? s : add -ok ? s : add in map(arr, add) -ok ? s : add(b, a) -ok ? s : arr -ok ? s : arr == arr -ok ? s : div -ok ? s : f -ok ? s : f + 2 -ok ? s : map(arr, #) -ok ? s : nil == div -ok ? s : obj -ok ? s : obj.a -ok ? s : obj.a.fn(add(s?.fn(a)).obj, get(arr.head("c"), 0 <= 0.5) > count(obj.a, s startsWith obj)) -ok ? s : obj.b -ok ? s : obj.fn(a) -ok ? s : obj.fn(div, a, false) -ok ? s : obj.fn(filter(nil, arr) ^ div(ok, nil, f, s), arr?.head(not 0.5), div?.a) -ok ? s : obj.fn(join(1)) -ok ? s : obj.fn(one(add, 1), div?.b) -ok ? s : obj.head(div % f?.b) -ok ? s : obj.obj -ok ? s : obj?.a -ok ? s : obj?.b -ok ? s : obj?.obj -ok ? s : obj?.obj.a -ok ? s : s endsWith s -ok ? trimSuffix("b") : obj -ok ? true : false and 0 < a -ok ? true : obj.a -ok ? true : obj.fn((a startsWith add) - ok ? false : obj) -ok ? true : obj.head(s <= div) -ok ? true : obj?.a -ok ? true : obj?.b -ok ? true : obj?.obj -ok ? true || obj?.a : obj +ok ? div : f32 +ok ? div : f64 +ok ? div : foo?.String +ok ? div : greet +ok ? div : half +ok ? div : half(1) +ok ? div : i32 +ok ? div : i64 +ok ? div : list +ok ? div : list == array +ok ? div : score +ok ? div : score(i) +ok ? f32 : add +ok ? f32 : array +ok ? f32 : div +ok ? f32 : f32 +ok ? f32 : f64 +ok ? f32 : foo +ok ? f32 : foo?.Bar +ok ? f32 : half +ok ? f32 : i != i64 +ok ? f32 : i32 +ok ? f64 : array +ok ? f64 : greet +ok ? f64 : half +ok ? f64 : i64 +ok ? f64 : score +ok ? false : foo?.String() +ok ? foo : add +ok ? foo : foo +ok ? foo : foo?.Bar +ok ? foo : greet +ok ? foo : i +ok ? foo : i == i32 +ok ? foo : i32 +ok ? foo : i64 +ok ? foo : i64 ^ f32 +ok ? foo : list +ok ? get(array, i32) : ok +ok ? greet : add +ok ? greet : div +ok ? greet : f64 == i64 +ok ? greet : greet +ok ? greet : half +ok ? greet : i / i32 +ok ? greet : i32 +ok ? greet : i64 % i64 +ok ? greet : list +ok ? greet : type(f64) +ok ? half : 0.5 ^ i32 +ok ? half : add +ok ? half : array +ok ? half : div +ok ? half : f32 == f64 +ok ? half : f64 +ok ? half : f64 <= i +ok ? half : foo +ok ? half : foo?.Bar +ok ? half : greet +ok ? half : half +ok ? half : i +ok ? half : i32 +ok ? half : list +ok ? half : ok +ok ? half : type(add) +ok ? i : -i32 +ok ? i : 0.5 * i64 +ok ? i : 1 ** f64 +ok ? i : array +ok ? i : div +ok ? i : f32 +ok ? i : f64 +ok ? i : foo.Bar +ok ? i : i +ok ? i : i32 +ok ? i : ok +ok ? i : score +ok ? i32 + f32 : half +ok ? i32 : -i32 +ok ? i32 : 1 not in array +ok ? i32 : add +ok ? i32 : array +ok ? i32 : f32 +ok ? i32 : foo.Qux +ok ? i32 : foo?.Qux +ok ? i32 : half +ok ? i32 : i +ok ? i32 : i32 +ok ? i32 : list +ok ? i32 : ok +ok ? i32 >= f64 : f32 +ok ? i64 : array +ok ? i64 : div +ok ? i64 : f32 +ok ? i64 : f64 +ok ? i64 : half +ok ? i64 : i32 +ok ? i64 : i64 +ok ? i64 : ok +ok ? int(1) : div +ok ? list : -1 +ok ? list : add +ok ? list : array +ok ? list : div +ok ? list : f32 +ok ? list : i32 +ok ? list : i64 +ok ? list : list +ok ? list : nil in array +ok ? list : ok +ok ? list : score +ok ? lower("foo") : f32 +ok ? map(array, #) : duration("foo") +ok ? map(list, #) : score +ok ? min(f32) : score +ok ? min(i) : score +ok ? nil : foo?.Bar +ok ? ok : -f32 +ok ? ok : 0.5 + i +ok ? ok : array +ok ? ok : f64 +ok ? ok : foo +ok ? ok : greet +ok ? ok : i64 +ok ? ok : list +ok ? ok : score +ok ? score : add +ok ? score : array +ok ? score : f32 +ok ? score : foo.String +ok ? score : foo?.String +ok ? score : greet +ok ? score : half +ok ? score : half("bar") +ok ? score : i +ok ? score : i32 +ok ? score : list +ok ? score : nil != div +ok ? score : ok +ok ? score : score +ok ? string(half) : array +ok ? toJSON("foo") : i32 +ok ? true : foo?.Qux ok and !ok -ok and "a" == obj.a -ok and "a" > "a" -ok and 0 >= 0 -ok and 0.5 != b -ok and 0.5 < f -ok and 0.5 <= f -ok and 0.5 > f -ok and 1 >= 0 -ok and 2 >= 1 -ok and a < b -ok and a == 0 -ok and a > b -ok and b != 2 -ok and div != div -ok and div == add -ok and f <= a -ok and f <= f -ok and f == nil -ok and f >= 0.5 -ok and f >= f -ok and false && nil != obj -ok and false && ok -ok and false and ok -ok and nil == "b" -ok and nil == div -ok and nil == obj +ok and "bar" not endsWith foo?.Bar +ok and "foo" endsWith "foo" +ok and 0.5 <= f32 +ok and 0.5 > f64 +ok and 0.5 >= f64 +ok and 1 != 1 +ok and 1 != nil +ok and 1 < i64 +ok and 1 == 1 +ok and add == add +ok and any(list, false) +ok and f32 >= 1 +ok and f64 != i +ok and f64 != nil +ok and f64 > 1 +ok and false != true +ok and i > i32 +ok and i >= f64 +ok and i >= i64 +ok and i32 != nil +ok and i32 == 0.5 +ok and i32 >= f64 +ok and i64 != nil +ok and i64 <= i +ok and i64 > 1 +ok and list == list +ok and nil != i +ok and nil != true +ok and none(list, ok) ok and not ok -ok and obj.a -ok and obj.b -ok and obj.fn(b) -ok and obj.head(1, 0.5) -ok and obj.head(f, "a", s) -ok and obj.head(s) -ok and obj.obj -ok and obj.obj.b -ok and obj.obj.obj -ok and obj?.a -ok and obj?.b -ok and obj?.fn(not false ? 1 : arr) -ok and obj?.head(add) -ok and obj?.head(div) -ok and obj?.head(obj?.head(arr)) -ok and obj?.head(one("c", ok)) -ok and obj?.obj -ok and obj?.obj.obj -ok and obj?.obj?.a -ok and obj?.obj?.obj -ok and obj[s] +ok and not true ok and ok -ok and ok && ok -ok and ok ? 1 > b : a ** 1 -ok and ok ? add : !ok -ok and ok ? arr : "c" -ok and ok ? div : s -ok and ok ? nil : arr -ok and ok ? s : f -ok and ok and true == false -ok and s contains s -ok and true or arr == arr -ok in obj.head(nil, div, s) -ok in obj?.head(arr, ok, add) -ok in values(obj) -ok or !obj?.obj +ok not in sort(array) +ok or !false ok or !ok -ok or "b" <= s -ok or "b" == nil -ok or "b" > s -ok or 0 < f -ok or 0 <= b -ok or 0 == f -ok or 0 >= b -ok or 0.5 != 0 -ok or 0.5 >= 0 -ok or 2 <= 0 -ok or a < 0 -ok or a <= b -ok or a == nil -ok or add != nil -ok or add == div -ok or b > f -ok or b in arr -ok or div != div -ok or div != nil -ok or div == div -ok or f != 0.5 -ok or f != b -ok or f < 0 -ok or f == f -ok or f > 0 -ok or f >= b -ok or false && ok -ok or false ? s : nil -ok or false or 2 < a -ok or fromJSON(nil) -ok or nil != add -ok or nil != arr -ok or nil == ok -ok or nil in obj?.fn(obj != splitN("c", true, "b"), count(nil * f, div), add(0.5)?.b) +ok or !true +ok or "bar" < "bar" +ok or "foo" != nil +ok or 0.5 != i32 +ok or 0.5 != i64 +ok or 0.5 <= 0.5 +ok or 0.5 == 1 +ok or 0.5 >= i +ok or 1 != i32 +ok or 1 >= 0.5 +ok or f64 < f32 +ok or f64 < i64 +ok or fromJSON("bar") +ok or greet != add +ok or half == nil +ok or half == score +ok or i != 0.5 +ok or i < 1 +ok or i32 < 0.5 +ok or i32 == f64 +ok or i32 > 0.5 +ok or i64 != f32 +ok or i64 == 1 +ok or list == array +ok or nil != 0.5 ok or not false ok or not ok ok or not true -ok or obj.a -ok or obj.a.b -ok or obj.a.head(all(0 && nil, add(obj, false, "b"))) -ok or obj.a.obj -ok or obj.a?.b -ok or obj.a?.obj -ok or obj.b -ok or obj.b?.head(f) -ok or obj.fn(-nil endsWith (nil || nil)) -ok or obj.fn(a, div) -ok or obj.fn(a, s[div:arr]?.a) -ok or obj.fn(add(arr)[arr:f], none(none(f, b), 0 .. 0)) -ok or obj.fn(arr .. a)?.b?.b -ok or obj.fn(arr.b <= ok, b in add?.fn(obj))?.fn(add(arr, nil)?.head(b?.fn(nil, "b", false) .. none(add, b), filter(a.obj, div >= a), 0.5 ? div : arr matches date(nil), 0 ** nil * obj.head(ok), count(add(div), map(0, a))).a) -ok or obj.fn(arr.fn(ok.head(0, add, a, a))) -ok or obj.fn(b?.head(1, nil, 1, a, nil) matches add(s, a)) -ok or obj.fn(div(div .. 0, add(div)), indexOf(nil endsWith add)) -ok or obj.fn(div).head(filter(count(s, 0.5), add(obj)), arr startsWith obj || obj != div) -ok or obj.fn(f, nil, arr)?.head(true contains b, ok.head(ok, arr)).b -ok or obj.fn(fromBase64(any(b, true), s, add(div)), s)?.obj -ok or obj.fn(map(2, b)?.obj, arr * 0.5 > filter(a, a)) -ok or obj.fn(obj ? div : div - add(add), b, none(div, a).obj) -ok or obj.fn(ok, 0) -ok or obj.head(0.5) -ok or obj.head(0.5, obj) -ok or obj.head(1, b, add, obj).b -ok or obj.head(2 matches b, float(obj), none(b, div), add[add:1], 0.5 && s) -ok or obj.head(a) -ok or obj.head(add(div(0.5)), f) -ok or obj.head(add.fn(2) matches obj?.head(nil, "c")) -ok or obj.head(arr) -ok or obj.head(arr?.obj, count(s, 0)) -ok or obj.head(b - nil) -ok or obj.head(b ? s : "b" < div(arr), f.obj.fn(map(s, b))) -ok or obj.head(b, b[nil] startsWith filter(false, b), s, div?.fn("a", obj, f) ? obj ** false : ok) -ok or obj.head(div(count(2, obj), false || obj), filter(ok.fn(add), add?.head(ok))) -ok or obj.head(div(count(nil, b), add("c"))) -ok or obj.head(div, a) -ok or obj.head(div, ok) -ok or obj.head(f) -ok or obj.head(filter(add.head(s), one(a, 0.5)), add) -ok or obj.head(obj) -ok or obj.head(obj?.head(f)) -ok or obj.head(split(b)) -ok or obj.head(splitAfterN(a?.a) != (f && div(nil, 0)) != -min(div, 1), b) -ok or obj.head(true) -ok or obj.head(true, add) -ok or obj.obj -ok or obj.obj.a -ok or obj.obj.obj -ok or obj?.a -ok or obj?.a.a -ok or obj?.a.obj -ok or obj?.a?.b -ok or obj?.b -ok or obj?.b.obj -ok or obj?.fn("c" + 0) -ok or obj?.fn("c", ok) -ok or obj?.fn(a) -ok or obj?.fn(a, div(filter(2, f)), add(first(a, true, s, "c"))) -ok or obj?.fn(add(a), b != b.b) -ok or obj?.fn(add(s)) -ok or obj?.fn(add.b, ok endsWith arr) -ok or obj?.fn(add?.b > s) -ok or obj?.fn(arr, 1 ** nil) -ok or obj?.fn(b) -ok or obj?.fn(b?.head(s), arr) -ok or obj?.fn(count(s?.head(0.5), add in f), join(add.a)) -ok or obj?.fn(div(s, obj, add))?.a.b -ok or obj?.fn(f?.a) -ok or obj?.fn(float(div)) -ok or obj?.fn(min(arr)[b:get(0.5, nil)]) -ok or obj?.fn(ok?.head(add(ok)), add(add?.obj)) -ok or obj?.fn(one(add(f, obj), a.fn(a))) -ok or obj?.fn(one(arr, false) <= ok?.a) -ok or obj?.fn(s) -ok or obj?.fn(s?.b) -ok or obj?.head(0) -ok or obj?.head(2, a) -ok or obj?.head(a in false matches add(nil), last(add(0), a.a), arr ^ obj == keys(nil, add), ok.obj) -ok or obj?.head(add <= obj, "b" || a, a, get(a, div)) -ok or obj?.head(add == f, filter("a", ok)) -ok or obj?.head(add.obj, s) -ok or obj?.head(all(div, add), max(s, ok)) -ok or obj?.head(arr).b -ok or obj?.head(b) -ok or obj?.head(f, a) -ok or obj?.head(f, div) -ok or obj?.head(fromJSON(b) endsWith b.a, none(map(b, b), s?.fn(arr, b))) -ok or obj?.head(nil ? ok : f.a) -ok or obj?.head(nil) -ok or obj?.head(nil, ok, ok, a) -ok or obj?.head(none(f.head(ok), f)) -ok or obj?.head(obj >= "c") -ok or obj?.head(obj, f) -ok or obj?.head(s) -ok or obj?.head(s?.a) -ok or obj?.obj -ok or obj?.obj.b -ok or obj?.obj?.b -ok or obj[toJSON("b")] ok or ok -ok or ok != false -ok or ok == ok -ok or ok ? 0 : a -ok or ok ? false : a -ok or ok ? obj : "b" -ok or ok || !obj?.a -ok or ok || nil != s -ok or s != nil -ok or s <= "b" -ok or s == nil -ok or s endsWith s -ok or true ? 0 : true -ok or true || ok -ok || !ok -ok || !true -ok || "b" in obj -ok || "c" != s -ok || "c" > obj.obj -ok || 0 in arr -ok || 0.5 != 2 -ok || 0.5 <= f -ok || 0.5 >= 0.5 -ok || 2 < f -ok || 2 > f -ok || a < f -ok || a == 1 -ok || arr != arr -ok || b != 2 -ok || b == a -ok || b == f -ok || b > 0 -ok || b > f -ok || div == div -ok || f == obj?.b -ok || f > 0 -ok || f > b -ok || f >= 0.5 -ok || f in obj.head(obj) -ok || false ? obj : 0 -ok || false or obj.fn(div) -ok || get(false ? b : 0.5, add.head(0.5, div))?.a -ok || nil != b -ok || nil == "b" -ok || nil == f -ok || nil == nil -ok || nil == s -ok || not obj?.head(b.head(div(ok)).a) -ok || obj != obj -ok || obj.a -ok || obj.a startsWith toJSON(nil) -ok || obj.a.b -ok || obj.a?.a -ok || obj.b -ok || obj.b.b -ok || obj.b.obj -ok || obj.b?.b -ok || obj.b?.obj -ok || obj.fn(a.head(arr)) -ok || obj.fn(add(add.b, div?.a), s?.head(add.fn("b", b)), count(div, obj) % int(a, b, "c", false), obj) -ok || obj.fn(add(f)) -ok || obj.fn(add, nil)?.head(arr contains a) -ok || obj.fn(b) -ok || obj.fn(div(obj), obj / obj, div(a, nil)) -ok || obj.fn(div).a -ok || obj.fn(int(ok, nil, s, obj)[ok.a]) -ok || obj.fn(map("c", add), div(ok)) -ok || obj.fn(map(arr, div(f))) -ok || obj.fn(nil, div)?.a -ok || obj.fn(not 0 || nil - nil) -ok || obj.fn(ok, obj) -ok || obj.fn(ok.fn(nil)) -ok || obj.fn(s) -ok || obj.fn(s[1], f < add) -ok || obj.fn(true < arr matches div?.fn(a, s), div(add startsWith obj)) -ok || obj.fn(true <= a || f) -ok || obj.head(0.5) -ok || obj.head(2) -ok || obj.head(a) -ok || obj.head(add) -ok || obj.head(arr) -ok || obj.head(arr, filter(div(obj), -arr), fromBase64(1)?.obj, filter(f, 1) && b?.head(s, b)) -ok || obj.head(arr?.a?.obj) -ok || obj.head(div.a) -ok || obj.head(f, b) -ok || obj.head(f, nil)?.obj.obj -ok || obj.head(f.head(0 in arr, arr.head(s, s), div && a), s).b -ok || obj.head(get(arr, false) && a ^ s) -ok || obj.head(get(s?.b, f.a), s?.a ** ok) -ok || obj.head(obj ? s : f, b * nil, one(false, nil)) -ok || obj.head(obj[add(b)], ok[add] in arr, arr) -ok || obj.head(trim(false) matches filter(f, ok)) -ok || obj.obj -ok || obj.obj.a -ok || obj.obj?.a -ok || obj.obj?.b -ok || obj.obj?.fn(count(div(add || true, f, a?.fn(f, a, ok, nil)), add(a.b, add(nil)))) -ok || obj?.a -ok || obj?.a?.b -ok || obj?.a?.obj -ok || obj?.b -ok || obj?.b.b -ok || obj?.b?.a -ok || obj?.b?.head(f?.b ** arr.a) -ok || obj?.b?.obj -ok || obj?.fn("a", s)?.a -ok || obj?.fn(-map(f, a), arr.fn(obj) == 0 .. arr) -ok || obj?.fn(0, a)?.a -ok || obj?.fn(0, nil, false) -ok || obj?.fn(2, s) -ok || obj?.fn(a) -ok || obj?.fn(a.a) -ok || obj?.fn(a.b, string(arr), ok).a -ok || obj?.fn(a?.b >= hasSuffix(add)) -ok || obj?.fn(add("a"), arr matches nil, a?.obj) -ok || obj?.fn(add(obj)) -ok || obj?.fn(add?.a) -ok || obj?.fn(add[arr] in obj) -ok || obj?.fn(any(a, arr), add(add, arr, f, 0.5, obj)) -ok || obj?.fn(arr) -ok || obj?.fn(div >= true, a - arr, obj <= nil) -ok || obj?.fn(div(0, arr, 0.5, b, div), ok ^ a) -ok || obj?.fn(div, trimPrefix(add, arr, s, div)) -ok || obj?.fn(f?.a, b[0:false]) -ok || obj?.fn(f?.head(ok, div, add) < (arr or ok), div(0.5, s).b) -ok || obj?.fn(get(f, ok) ^ div(2)) -ok || obj?.fn(get(get(ok, obj), div(b, 0.5, div))) -ok || obj?.fn(hasPrefix(2), div.head(1)) -ok || obj?.fn(hasPrefix(b)) -ok || obj?.fn(map(none(add, 0), div)) -ok || obj?.fn(obj ** a, arr.fn("a", add, s)).head(ok) -ok || obj?.fn(ok.fn(f, ok), get(nil, f)) -ok || obj?.fn(ok.head(arr), s) -ok || obj?.fn(s[ok .. s]) -ok || obj?.head(-ok[ok], add(s < div)) -ok || obj?.head(0)?.a -ok || obj?.head(0, "a", f, 0) -ok || obj?.head(0.5, nil) -ok || obj?.head(a in 2) -ok || obj?.head(a) -ok || obj?.head(add(b, add), div && nil) -ok || obj?.head(add) -ok || obj?.head(any(arr, true)) -ok || obj?.head(arr) -ok || obj?.head(b) -ok || obj?.head(b, ok, 2) -ok || obj?.head(div || s) -ok || obj?.head(div, div).a -ok || obj?.head(f) -ok || obj?.head(fromBase64(add(div)), b.b.obj) -ok || obj?.head(ok && f) -ok || obj?.head(ok) -ok || obj?.head(ok, "c", 0, nil, s) -ok || obj?.head(one(add, ok)) -ok || obj?.head(s) -ok || obj?.head(s, f) -ok || obj?.head(s.a) -ok || obj?.head(true) -ok || obj?.obj -ok || obj?.obj.a -ok || obj?.obj.b -ok || obj?.obj.obj?.obj -ok || obj?.obj?.b -ok || obj[obj.b] -ok || obj[s]?.b +ok or ok || false +ok or one(array, true) +ok || "bar" not contains string(true) +ok || 0.5 < i32 +ok || 0.5 <= 0.5 +ok || 0.5 == i64 +ok || 1 != 0.5 +ok || 1 != 1 +ok || 1 != nil +ok || 1 < 0.5 +ok || 1 <= 1 +ok || add != score +ok || all(array, ok) +ok || div == nil +ok || f32 <= 0.5 +ok || f32 <= 1 +ok || f32 > i64 +ok || f32 >= f64 +ok || false && ok +ok || i != f64 +ok || i <= 0.5 +ok || i32 != 0.5 +ok || i32 < 0.5 +ok || i32 > 1 +ok || i64 > 0.5 ok || ok -ok || ok && true -ok || ok == nil -ok || ok ? false : arr -ok || ok ? obj : s -ok || ok or obj?.obj -ok || s <= s -ok || s >= s -ok || s endsWith "b" -ok || true ? f : ok -ok || true or 1 != f -ok || true or s matches s -ok || true || obj?.c -one(0 .. 2, ok) -one(0 .. b, ok) -one(2 .. 0, f > 0) -one([add, false], ok) -one(arr, !false) -one(arr, !ok) -one(arr, "b" contains "b") -one(arr, "b" endsWith s) -one(arr, "b" startsWith "c") -one(arr, "c" contains "c") -one(arr, # <= #) -one(arr, 0 != 0.5) -one(arr, 0 != nil) -one(arr, 0 != obj?.obj) -one(arr, 0 == 1) -one(arr, 0 == nil) -one(arr, 0 > b) -one(arr, 0.5 <= b) -one(arr, 0.5 == obj.obj) -one(arr, 0.5 >= b) -one(arr, 1 == 0) -one(arr, a != 0.5) -one(arr, a != a) -one(arr, a < 0) -one(arr, a <= b) -one(arr, a == 0.5) -one(arr, a == a) -one(arr, a >= 0) -one(arr, a >= a) -one(arr, a >= b) -one(arr, any(arr, ok)) -one(arr, arr != arr) -one(arr, arr != nil) -one(arr, arr == nil) -one(arr, b != b) -one(arr, b < #) -one(arr, b < f) -one(arr, b == f) -one(arr, div != div) -one(arr, div != nil) -one(arr, div == div) -one(arr, f != a) -one(arr, f <= 0) -one(arr, f <= a) -one(arr, f == nil) -one(arr, f >= 0) -one(arr, false != obj.b) -one(arr, false == obj.obj) -one(arr, false) ? (true ? s : b) : 0 < 0 -one(arr, false) and ok -one(arr, hasSuffix(s, "b")) -one(arr, nil != 0) -one(arr, nil != arr) -one(arr, nil != f) -one(arr, nil == add) -one(arr, not ok) -one(arr, obj.head(true, a)) -one(arr, ok != nil) -one(arr, ok == ok) -one(arr, ok) -one(arr, ok) != obj.obj -one(arr, ok) != ok -one(arr, ok) && obj.obj -one(arr, ok) && ok -one(arr, ok) && ok ? a : div -one(arr, ok) == obj.fn(0) -one(arr, ok) and obj?.b -one(arr, one(arr, ok)) -one(arr, s != "b") -one(arr, s > s) -one(arr, s endsWith s) -one(arr, true && true) -one(arr, true ? false : add) -one(arr, true and true) -one(arr, true) or obj?.head(0.5) -one(b .. 0, obj.b) -one(b .. 1, ok) -one(b .. 2, any(arr, true)) -one(b .. a, ok) -one(b .. b, "a" == nil) -one(b .. b, f != nil) -one(false ? 0 : arr, "a" < s) -one(filter(arr, false), obj?.a) -one(filter(arr, ok), nil == div) -one(map(arr, "b"), div != add) -one(map(arr, 0), f != f) -one(map(arr, 0), ok == false) -one(map(arr, 0), ok) -one(map(arr, 0.5), ok) -one(map(arr, 2), b <= 0.5) -one(map(arr, a), ok) -one(map(arr, add), ok) -one(map(arr, arr), ok) -one(map(arr, b), ok) -one(map(arr, div), div != add) -one(map(arr, div), ok) -one(map(arr, f), s contains "b") -one(map(arr, false), #) -one(map(arr, ok), #) -one(map(arr, ok), 0.5 < 0.5) -one(map(arr, ok), ok) -one(map(arr, true), #) -one(obj.head("c"), obj == obj) -one(obj.head("c", add), b == f) -one(obj.head(arr), ok) -one(obj.head(obj), ok) -one(obj.head(s, obj), ok) -one(obj.obj, b <= a) -one(obj.obj, b > 1) -one(obj.obj, f < 0.5) -one(obj.obj, ok) -one(obj?.head("c"), ok) -one(obj?.head(arr), "a" matches "b") -one(obj?.head(arr), "c" < s) -one(obj?.head(s), b == nil) -one(obj?.head(s), ok) -one(obj?.head(s), s > s) -one(obj?.obj, "b" != nil) -one(obj?.obj, a == b) -one(obj?.obj, b != 0) -one(obj?.obj, false == true) -one(obj?.obj, nil in obj) -one(obj?.obj, obj.head(ok, 0, "b", 1, div)) -one(obj?.obj, ok) -one(ok ? arr : f, ok) -one(ok ? s : ok, ok) -one(values(obj), nil == ok) -repeat(s, a) -repeat(s, b) -repeat(toJSON(arr), obj?.a) -s -s != "b" ? add : add -s != "b" ? obj : f -s != "c" && nil != b -s != nil != obj.a -s != nil == ok -s != nil ? arr : ok -s != nil ? b : false -s != nil and "b" < "c" -s != nil || obj.b -s != obj.a -s != obj.b -s != obj.head(0) -s != obj.head(a) -s != obj.head(arr) -s != obj.head(div, arr) -s != obj.head(f) -s != obj.head(nil, add, f, s) -s != obj.head(ok, "b", add) -s != obj.head(s) -s != obj.obj -s != obj.obj.obj -s != obj.obj?.a -s != obj.obj?.b -s != obj.obj?.obj -s != obj?.a -s != obj?.b -s != obj?.b or add != obj.a -s != obj?.fn(1) -s != obj?.fn(int(b)) -s != obj?.head(add) -s != obj?.head(add, 0.5, arr, add) -s != obj?.obj -s != obj?.obj.a -s != obj?.obj?.obj -s != s -s != s != obj.head(obj) -s != s != true -s != s == ok -s != s ? 1 : ok -s != s ? b : s -s != s || ok -s != string(0.5) -s != string(b) -s != toJSON(1) -s != toJSON(b) -s != toJSON(true) -s != trim("c") -s + lower("a") -s + repeat(s, 0) -s + s -s + s != s -s + s + trimPrefix("a") -s + s == obj?.obj -s + s >= s -s + s matches lower(s) -s + string("c") -s + string(f) -s + toJSON("b") -s + toJSON(ok) -s + trim(s) -s < "a" + s -s < "a" ? 2 : ok -s < "a" and obj?.obj -s < "c" && s <= "b" -s < "c" ? b : arr -s < "c" and a > f -s < "c" or obj.a -s < "c" or obj?.head(s, obj) -s < lower(s) -s < obj.head(s) -s < obj?.head("b", 0.5) -s < s -s < s != nil -s < s || a == 1 -s < s || ok -s < s[a:0] -s < string(s) -s < toJSON(0) -s < trimPrefix("b") -s <= "a" != nil -s <= "a" ? nil : f -s <= "b" ? "c" : nil -s <= "c" ? "b" : a -s <= "c" ? 1 : 2 -s <= "c" ? obj : add -s <= "c" || obj.fn(b, b) -s <= obj.head(s, b, "a", add) -s <= s -s <= s != ok -s <= s == obj.b -s <= s == ok -s <= s ? 2 : 0.5 -s <= s ? b : ok -s <= s || !ok -s <= string(obj) -s == "a" + "b" -s == "b" ? obj : s -s == -obj?.b -s == f + obj.b -s == get(obj, s) -s == nil != nil -s == nil != obj?.a -s == nil == obj.obj -s == nil ? obj : f -s == nil ? obj : s -s == nil or ok -s == nil || obj?.b -s == nil || true ? 2 : s -s == obj.a -s == obj.b -s == obj.head(0.5) -s == obj.head(0.5, b, true) -s == obj.head(arr) -s == obj.head(b) -s == obj.head(nil, arr)?.fn(arr)?.obj -s == obj.head(true or f) -s == obj.obj -s == obj.obj.b -s == obj.obj?.b -s == obj.obj?.obj?.b -s == obj?.a -s == obj?.b -s == obj?.fn(a) -s == obj?.head(arr) -s == obj?.head(f, div) -s == obj?.head(obj) -s == obj?.head(obj).b -s == obj?.head(obj, ok) -s == obj?.head(ok) -s == obj?.obj -s == obj?.obj.obj -s == obj?.obj?.a -s == s -s == s != ok -s == s ? arr : "c" -s == s || obj.b -s == s[1:a] -s == string("c") -s == string(0) -s == string(1) -s == string(arr) -s == string(div) -s == toJSON(a) -s == trimPrefix("b") -s > "b" ? "c" : obj -s > "b" ? b : 0.5 -s > "b" ? div : "b" -s > "c" && obj.head(s, obj) -s > obj.head(s) -s > obj?.head(s) -s > s -s > s != true -s > s && ok -s > s + "c" -s > s == obj?.a -s > s ? add : ok -s > s ? div : obj?.fn(2) -s > s ? div : true -s > s ? ok : obj.a -s > s ? s : add -s > s and b == 0 -s > s || obj.a -s > string(2) -s > string(arr) -s > string(s) -s > toBase64("c") -s > toJSON(false) -s > trimPrefix(s) -s >= "a" + s -s >= "a" == obj.a -s >= "a" ? arr : b -s >= "c" ? b : ok -s >= "c" ? f : obj -s >= "c" and obj.obj -s >= "c" or obj?.head(add, 0, 2, add) -s >= obj.head("c", s) -s >= s -s >= s != obj?.fn(b) -s >= s && obj.b -s >= s && obj?.a -s >= s and obj?.a -s >= s or obj.head(a) -s >= string(0) -s >= string(a) -s >= string(nil) -s >= string(s) -s >= toJSON(arr) -s >= toJSON(b) -s >= trim(s) -s contains "a" && a < f -s contains "a" ? arr : true -s contains "b" == ok -s contains "b" ? a : f -s contains "b" ? s : a -s contains "c" ? "c" : b -s contains "c" ? a : obj?.a -s contains "c" ? b : obj.fn(obj) -s contains "c" || obj?.obj -s contains obj.head(s) -s contains obj.head(s, div, add) -s contains obj?.head("c") -s contains obj?.head(s) -s contains s -s contains s == ok -s contains s ? f : obj -s contains s and !ok -s contains s or obj?.head(b, b, obj)?.a in obj -s contains s or ok -s contains string(ok) -s contains toBase64(s) -s contains toJSON(nil) -s contains toJSON(ok) -s contains toJSON(s) -s endsWith "a" && obj.head(0) -s endsWith "a" == nil -s endsWith "a" ? obj : 0 -s endsWith "b" and (ok || true) -s endsWith "c" != ok ? arr : obj -s endsWith "c" == ok -s endsWith "c" ? b : arr -s endsWith lower("c") -s endsWith lower(s) -s endsWith s -s endsWith s != nil -s endsWith s && ok -s endsWith s + s -s endsWith s == nil -s endsWith s ? 0 : 0 -s endsWith s ? div : f -s endsWith s ? div : obj?.b -s endsWith s ? obj : arr -s endsWith s ? ok : add -s endsWith s and obj.head(arr, s) -s endsWith s and ok -s endsWith s or a < b -s endsWith s || obj.fn(nil) -s endsWith s || ok -s endsWith string(add) -s endsWith string(arr) -s endsWith string(s) -s endsWith toJSON(2) -s in [0.5] -s in map(arr, s) -s in obj -s in obj && s matches s -s in obj == ok -s in obj ? div : arr -s in obj ? div : div -s in obj or obj?.a -s in obj.head(arr, div) -s in obj.head(nil) -s in obj.obj -s in obj.obj.obj -s in obj?.head(last(b)) -s in obj?.obj -s in obj?.obj?.obj -s matches "a" ? false : true -s matches "b" != obj.b -s matches "b" == ok -s matches "b" ? arr : ok -s matches "b" ? b : b < b -s matches "b" ? nil : obj -s matches "b" or "c" contains "b" -s matches "b" or obj.head(add)?.obj -s matches "c" && obj?.obj -s matches "c" ? add : 1 -s matches "c" ? ok : nil -s matches "c" ? s : add -s matches obj?.head("a") -s matches obj?.head(lower(s, s)) -s matches s -s matches s == obj.b -s matches s == obj?.head(a) -s matches s == ok -s matches s ? a : 2 -s matches s ? add : a -s matches s ? nil : a >= a -s matches s ? obj : arr -s matches s and ok -s matches toJSON(f) -s matches toJSON(s) -s matches trimSuffix(s, s) -s startsWith "a" ? s : false -s startsWith "c" || obj.b -s startsWith s -s startsWith s == false -s startsWith s ? "a" : b -s startsWith s ? arr : f -s startsWith s ? obj : arr -s startsWith s ? s : "a" -s startsWith s || add == add -s startsWith s || ok -s startsWith string(arr) -s startsWith toJSON(arr) -s startsWith trimSuffix("b") -s[0 + 2:min(0)] -s[2:b] >= s -s[a:a] -s[a:a] == obj?.head(ok) -s[a:b] -s[a:obj?.a] -s[add(a, a):obj.b] -s[b:a] -split(s, s) -splitAfter(s, s) -splitAfter(s[b:b], s) +ok || score != score +ok || toJSON(f64) > trimSuffix("bar") +one([1], ok) +one([i32], i32 >= #) +one([score, greet], # == #) +one([score], ok) +one(array, "bar" matches "foo") +one(array, "bar" not in foo) +one(array, "foo" != "foo") +one(array, "foo" > "foo") +one(array, # != #) +one(array, # != 0.5) +one(array, # != f64) +one(array, # != i32) +one(array, # != nil) +one(array, # % # <= #) +one(array, # < #) +one(array, # < 0.5) +one(array, # < 1) +one(array, # < f32) +one(array, # < f64) +one(array, # < i) +one(array, # < i32) +one(array, # <= #) +one(array, # <= f32) +one(array, # <= f64) +one(array, # <= i) +one(array, # <= i32) +one(array, # == #) +one(array, # == 0.5) +one(array, # == 1) +one(array, # == f64) +one(array, # == i) +one(array, # == i32) +one(array, # == i64) +one(array, # > #) +one(array, # > f64) +one(array, # > i32) +one(array, # > i64) +one(array, # >= #) +one(array, # >= 0.5) +one(array, # >= 1) +one(array, # >= f32) +one(array, # >= i) +one(array, # >= i32) +one(array, # in array) +one(array, 0.5 != #) +one(array, 0.5 < #) +one(array, 0.5 <= #) +one(array, 0.5 == #) +one(array, 0.5 > #) +one(array, 0.5 > f32) +one(array, 0.5 >= #) +one(array, 1 != #) +one(array, 1 < 0.5) +one(array, 1 < i) +one(array, 1 <= #) +one(array, 1 <= 0.5) +one(array, 1 == #) +one(array, 1 == i32) +one(array, 1 > #) +one(array, 1 >= #) +one(array, 1 >= f32) +one(array, f32 < 1) +one(array, f32 <= #) +one(array, f32 <= i64) +one(array, f32 == #) +one(array, f32 == 0.5) +one(array, f32 == 1) +one(array, f32 >= #) +one(array, f64 != #) +one(array, f64 != 1) +one(array, f64 != i) +one(array, f64 != nil) +one(array, f64 == #) +one(array, f64 > #) +one(array, false == nil) +one(array, greet == score) +one(array, i != 0.5) +one(array, i < i32) +one(array, i <= #) +one(array, i == #) +one(array, i > f64) +one(array, i >= #) +one(array, i >= f32) +one(array, i32 != #) +one(array, i32 <= #) +one(array, i32 == #) +one(array, i32 == i) +one(array, i32 > #) +one(array, i64 <= #) +one(array, i64 == #) +one(array, i64 > #) +one(array, i64 > 1) +one(array, nil != #) +one(array, nil != foo) +one(array, nil == i64) +one(array, not ok) +one(array, not true) +one(array, ok && true) +one(array, ok) +one(array, one(array, false)) +one(array, score != greet) +one(array, score == div) +one(array, true || ok) +one(array, true || true) +one(filter(list, true), ok) +one(i32 .. i32, ok) +one(i32 .. i64, # >= #) +one(list, !ok) +one(list, !true) +one(list, "bar" not in #) +one(list, "foo" != "bar") +one(list, "foo" < "foo") +one(list, "foo" not in #) +one(list, # != #) +one(list, # != nil) +one(list, # == #) +one(list, # == foo) +one(list, # == nil) +one(list, # in list) +one(list, 0.5 != f32) +one(list, 0.5 > 0.5) +one(list, 1 < 1) +one(list, any(array, true)) +one(list, any(list, ok)) +one(list, any(list, true)) +one(list, f32 == 0.5) +one(list, f32 == f64) +one(list, f32 > f32) +one(list, f64 != nil) +one(list, f64 == f32) +one(list, f64 >= 0.5) +one(list, f64 >= 1) +one(list, foo == #) +one(list, greet != nil) +one(list, greet == score) +one(list, half != add) +one(list, i != nil) +one(list, i == i64) +one(list, i64 != f32) +one(list, i64 < 1) +one(list, i64 <= 0.5) +one(list, i64 > 0.5) +one(list, i64 > 1) +one(list, list != nil) +one(list, nil != nil) +one(list, nil != score) +one(list, nil == #) +one(list, none(array, ok)) +one(list, none(list, ok)) +one(list, not false) +one(list, not ok) +one(list, not true) +one(list, ok) +one(list, ok) and ok +one(list, one(list, ok)) +one(list, score == half) +one(list, true) && ok ? i : i64 +one(map(array, "foo"), # matches #) +one(map(array, #), # != #) +one(map(array, #), # < #) +one(map(array, #), # <= #) +one(map(array, #), # > #) +one(map(array, #), # > 1) +one(map(array, #), f64 <= 0.5) +one(map(array, #), ok) +one(map(array, div), # == nil) +one(map(array, i64), ok) +one(map(array, true), #) +one(map(list, "bar"), ok) +one(map(list, #), nil != #) +one(map(list, 1), # < 0.5) +one(map(list, f64), # <= #) +one(map(list, false), #) +one(map(list, i), ok) +one(map(list, list), ok) +one(map(list, ok), #) +repeat(toJSON(nil), i) +score +score != add +score != add != true +score != add ? i64 : "foo" +score != div +score != div ? i : f32 +score != div and ok +score != foo.Qux +score != foo.String +score != foo?.Qux +score != foo?.String +score != greet +score != greet ? score : array +score != half +score != score +score != score ? 1 : i +score == add +score == add == false +score == add ? f64 : not false +score == div +score == div || foo == foo +score == foo.Qux +score == foo.String +score == foo?.Qux +score == foo?.String +score == greet +score == greet ? half : f64 +score == greet and ok +score == half +score == score +score == score ? 0.5 : foo +score == score ? nil : i32 +score == score or ok +score == {"bar": 0.5}.f32 +score(-1) +score(-i) +score(-i, i) +score(1 % 1) +score(1 % i) +score(1 % i32) +score(1 % i64) +score(1 * 1) +score(1 * 1, i) +score(1 * i) +score(1 * i32) +score(1 * i64) +score(1 + 1) +score(1 + i) +score(1 + i32) +score(1 + i64) +score(1 - 1) +score(1 - i) +score(1 - i32) +score(1 - i64) +score(1) != -0.5 +score(1) != f32 +score(1) != float(f64) +score(1) != i +score(1) % i32 +score(1) * f32 +score(1) * f64 +score(1) * i64 +score(1) ** -1 +score(1) ** f32 +score(1) ** i64 +score(1) + f32 +score(1) + f64 +score(1) - f32 +score(1) - i +score(1) .. i64 +score(1) / f64 +score(1) / i +score(1) / i32 +score(1) / i64 +score(1) < i32 +score(1) < i64 +score(1) <= i32 +score(1) <= i64 +score(1) == 1 ^ 1 +score(1) == f64 +score(1) == i ** f64 +score(1) == i32 +score(1) == i64 +score(1) > i64 +score(1) >= f32 +score(1) >= f64 +score(1) >= i +score(1) >= i32 +score(1) >= i64 +score(1) ^ f32 +score(1) ^ f64 +score(1) ^ i +score(1) in array +score(1, i) > f32 +score(abs(1)) +score(abs(i)) +score(add(1, 1)) +score(add(1, i)) +score(array[1]) +score(array[i32]) +score(array[i64]) +score(array[i]) +score(count(array, f64 < 1)) +score(count(array, false)) +score(count(array, ok)) +score(count(array, true)) +score(count(list, false)) +score(count(list, ok)) +score(count(list, true)) +score(div(1, 1)) +score(div(i, 1)) +score(false ? true : i) +score(find(array, ok)) +score(findIndex(array, ok)) +score(findIndex(array, true)) +score(findIndex(list, ok)) +score(findIndex(list, true)) +score(findLast(array, 0.5 != #)) +score(findLast(array, ok)) +score(findLastIndex(array, ok)) +score(findLastIndex(array, true)) +score(findLastIndex(list, ok)) +score(findLastIndex(list, true)) +score(first(array)) +score(get(array, 1)) +score(get(array, i)) +score(get(array, i32)) +score(get(array, i64)) +score(i % i) +score(i % i32) +score(i * 1) +score(i * i32) +score(i * i64) +score(i + 1) +score(i + i) +score(i + i32) +score(i + i64) +score(i - 1) +score(i - i) +score(i - i32) +score(i - i64) +score(i) +score(i) != 1 == true +score(i) != float(i32) +score(i) != i +score(i) != i32 +score(i) % i32 % i64 +score(i) % i64 +score(i) * f64 +score(i) * i32 +score(i) * i64 +score(i) ** f64 +score(i) ** i32 +score(i) + f32 +score(i) + i +score(i) + i32 +score(i) + i64 +score(i) - f32 +score(i) - i +score(i) - i32 +score(i) / f32 +score(i) / i +score(i) < f32 +score(i) < i32 +score(i) <= f32 - f32 +score(i) == f32 +score(i) == i32 +score(i) == i64 +score(i) >= f32 +score(i) ^ f64 +score(i) ^ i +score(i, i + i) +score(i, i) +score(i, i) >= i +score(i, int(i64)) +score(i, score(i)) - i32 +score(i32 % i) +score(i32 % i64) +score(i32 * 1) +score(i32 * i) +score(i32 + i) +score(i32 + i64) +score(i32 - 1) +score(i32 - i) +score(i64 % 1) +score(i64 % i) +score(i64 * 1) +score(i64 * i) +score(i64 * i32) +score(i64 + 1) +score(i64 - 1) +score(i64 - i) +score(i64 - i32) +score(int(0.5)) +score(int(1)) +score(int(f32 * i)) +score(int(f32)) +score(int(f64)) +score(int(i)) +score(int(i32)) +score(int(i64)) +score(last(array)) +score(len("bar")) +score(len("foo")) +score(len(array)) +score(len(i32 .. i64)) +score(len(list)) +score(max(1)) +score(max(1, 1)) +score(max(i)) +score(max(i, 1)) +score(min(1)) +score(min(1, i64)) +score(min(i)) +score(score(1)) +score(score(1, 1)) +score(score(i)) +score(score(i32 % 1)) +score(true ? 1 : true) +score(true ? i : i64) +sort(1 .. 1) +sort(1 .. i64) +sort([0.5]) +sort([1]) +sort([i32]) +sort([i64]) +sort([nil]) +sort(array) +sort(array) != list +sort(false ? i64 : array) +sort(filter(array, false)) +sort(filter(array, true)) +sort(filter(list, false)) +sort(i .. 1) +sort(i .. i64) +sort(i32 .. 1) +sort(i32 .. i32) +sort(map(array, "bar")) +sort(map(array, "foo")) +sort(map(array, #)) +sort(map(array, 1)) +sort(map(array, i32)) +sort(map(list, "foo")) != list +sort(map(list, i)) +sort(sort(array)) +string(!(i <= f32)) string(!false) string(!ok) string(!true) -string("a" < s) -string("a" == nil) -string("a" == s) -string("a" >= s) -string("b" + "a") -string("b" + s) -string("b" <= "c") -string("b" contains "c") -string("b" matches "a") -string("b" matches s) -string("b") matches s -string("c" != "b") -string("c" != nil) -string("c" <= "c") -string("c" == "a") -string("c" matches s) -string("c") != string(s) -string("c") <= string(s) -string("c") in obj -string(-(f >= 0 ? f : add)) -string(-0) +string("bar" != "bar") +string("bar" < "bar") +string("bar" == "bar") +string("bar" > "bar") +string("bar" contains "foo") +string("bar" endsWith "bar") +string("bar" not endsWith "bar") +string("bar" not matches "foo") +string("bar" not startsWith "foo") +string("bar" startsWith "bar") +string("bar") >= type(score) +string("bar") endsWith "foo" + "foo" +string("bar") in foo +string("foo" != nil) +string("foo" <= "foo") +string("foo" >= "bar") +string("foo" matches "foo") +string("foo" not endsWith "foo") +string("foo" not in foo) +string("foo" not matches "foo") +string("foo" startsWith "bar") +string(-(0.5 + f64)) string(-0.5) -string(-2) -string(-a) -string(-b) -string(-f) -string(-obj.obj?.b) -string(-obj?.b) -string(0 != 0) -string(0 != 1) -string(0 != a) -string(0 != nil) -string(0 % 1) -string(0 % 2) -string(0 % a) -string(0 % b) -string(0 * 0) -string(0 * a) -string(0 * f) -string(0 ** 1) -string(0 ** 2) -string(0 ** a) -string(0 ** f) -string(0 + 0) -string(0 + 2) -string(0 + b) -string(0 - 1) -string(0 - 2) -string(0 - a) -string(0 - b) -string(0 / 2) -string(0 / f) -string(0 < a) -string(0 < f) -string(0 < obj.b) -string(0 <= 0) -string(0 <= 0.5) -string(0 <= a) -string(0 <= b) -string(0 <= f) -string(0 == a) -string(0 == b) -string(0 == f) -string(0 > 2) -string(0 > b) -string(0 >= b) -string(0 ^ 0) -string(0 ^ 2) -string(0) < s -string(0) > s -string(0) startsWith string(a) -string(0.5 != a) -string(0.5 != b) +string(-1) +string(-f32) +string(-f64) +string(-i) +string(-i32) +string(-i64) +string(0.5 != 0.5) +string(0.5 != 1) +string(0.5 != f32) +string(0.5 != f64) +string(0.5 != i) +string(0.5 != nil) +string(0.5 * 0.5) +string(0.5 * f32) +string(0.5 * i) +string(0.5 * i32) +string(0.5 ** 0.5) string(0.5 ** 1) -string(0.5 ** b) -string(0.5 ** f) +string(0.5 ** i32) +string(0.5 ** i64) +string(0.5 + 0.5) string(0.5 + 1) -string(0.5 + a) -string(0.5 - b) +string(0.5 + f32) +string(0.5 + f64) +string(0.5 + i64) +string(0.5 - 0.5) +string(0.5 - 1) string(0.5 / 0.5) -string(0.5 / a) -string(0.5 / f) -string(0.5 < 2) -string(0.5 < arr[-1]) -string(0.5 < b) -string(0.5 < f) -string(0.5 == 0) -string(0.5 == b) -string(0.5 == f) +string(0.5 / f64) +string(0.5 / i) +string(0.5 < 1) +string(0.5 < f32) +string(0.5 < i) +string(0.5 < i32) +string(0.5 <= f64) +string(0.5 <= i) +string(0.5 <= i64) +string(0.5 == 0.5) +string(0.5 == 1) +string(0.5 == f32) +string(0.5 == f64) +string(0.5 == i) +string(0.5 == i32) +string(0.5 == i64) string(0.5 == nil) -string(0.5 > a) -string(0.5 > b) -string(0.5 > f) -string(0.5 ^ 0) +string(0.5 > 0.5) +string(0.5 > 1) +string(0.5 > i64) +string(0.5 >= 0.5) +string(0.5 >= 1) +string(0.5 >= f32) +string(0.5 >= f64) +string(0.5 >= i) +string(0.5 >= i32) string(0.5 ^ 0.5) +string(0.5 ^ 1) +string(0.5 ^ f32) +string(0.5 ^ i) +string(0.5 ^ i32) +string(0.5) not endsWith type(1) +string(1 != 1) +string(1 != f32) +string(1 != f64) +string(1 != i) +string(1 != i32) string(1 != nil) -string(1 % a) -string(1 ** a) -string(1 + b) -string(1 + f) -string(1 - 0) -string(1 .. a) +string(1 % 1) +string(1 % i) +string(1 % i32) +string(1 % i64) +string(1 * 1) +string(1 * i) +string(1 * i64) +string(1 ** 0.5) +string(1 ** 1) +string(1 ** f64) +string(1 ** i) +string(1 ** i32) +string(1 + 0.5) +string(1 + f32) +string(1 + f64) +string(1 + i64) +string(1 - f32) +string(1 - i) +string(1 - i64) +string(1 .. 1) +string(1 .. i) +string(1 .. i32) string(1 / 0.5) -string(1 < 0) -string(1 < b) -string(1 <= 0) -string(1 <= f) -string(1 == 2) -string(1 == b) +string(1 / 1) +string(1 / f32) +string(1 / i) +string(1 < i) +string(1 < i32) +string(1 < i64) +string(1 <= 0.5) +string(1 <= 1) +string(1 <= f32) +string(1 <= f64) +string(1 <= i32) +string(1 == 0.5) +string(1 == 1) +string(1 == f64) +string(1 == i) +string(1 == i64) string(1 == nil) string(1 > 1) -string(1 > f) -string(1 ^ 0) -string(1 ^ f) -string(1) != s -string(1) == obj.b -string(2 != 0) -string(2 != nil) -string(2 != obj.b) -string(2 * f) -string(2 + 0) -string(2 + a) -string(2 - a) -string(2 .. a) -string(2 / 0.5) -string(2 < 0) -string(2 <= 0) -string(2 <= a) -string(2 == f) -string(2 > b) -string(2 >= 0) -string(2 >= a) -string(2 ^ 0) -string(2 in arr) -string([arr]) -string([div, a]) -string(a != 0.5) -string(a != a) -string(a != b) -string(a % b) -string(a * 0.5) -string(a * 2) -string(a * b) -string(a ** f) -string(a + a) -string(a + f) -string(a - 0) -string(a - a) -string(a - f) -string(a .. a) -string(a .. b) -string(a / 0) -string(a / f) -string(a < 0) -string(a < a) -string(a < f) -string(a <= 0.5) -string(a <= a) -string(a <= f) -string(a == b) -string(a == nil) -string(a > b) -string(a > f) -string(a >= 0) -string(a >= 1) -string(a >= a) -string(a in arr) -string(a) -string(a) == s -string(a) > lower("c") -string(a) endsWith s -string(a) in obj -string(a)[b:b] +string(1 > f32) +string(1 >= 0.5) +string(1 >= 1) +string(1 >= f32) +string(1 >= f64) +string(1 >= i) +string(1 >= i32) +string(1 >= i64) +string(1 ^ 1) +string(1 ^ f32) +string(1 ^ f64) +string(1 ^ i) +string(1 ^ i32) +string(1 ^ i64) +string(1 in array) +string(1 not in array) +string(1)[i64:i64] +string([0.5, f32]) +string([add]) +string([f32]) +string([greet]) +string([i32, half]) +string([i32]) +string([i]) +string([ok]) +string([score]) string(abs(0.5)) -string(abs(a)) +string(abs(1)) +string(abs(f32)) +string(abs(f64)) +string(abs(half(0.5))) +string(abs(i)) +string(abs(i64)) string(add != add) -string(add != div) -string(add == nil) -string(add(0, 1)) -string(add(0, b)) -string(add(1, 2)) -string(add(2, a)) -string(add(b, 0)) -string(add(b, 1)) -string(add(b, a)) -string(add(b, b)) +string(add != half) +string(add != nil) +string(add != score) +string(add == greet) string(add) -string(add) + s -string(add) < s -string(add) <= s -string(add) > s -string(add) >= s -string(add) startsWith "b" ? div : f -string(any(arr, true)) -string(arr != nil) -string(arr == obj.obj) -string(arr) -string(arr) <= s -string(arr) == lower(s) -string(arr) contains s -string(arr) in obj -string(arr) matches s == nil -string(arr) matches trim("b", s) -string(arr) startsWith lower(s) -string(arr[0]) -string(arr[1]) -string(arr[2:0]) -string(arr[a]) -string(arr[b:a]) -string(b != 0) -string(b != a) -string(b != b) -string(b != f) -string(b % 1) -string(b % b) -string(b * 0) -string(b ** 0.5) -string(b ** 1) -string(b ** 2) -string(b ** a) -string(b ** b) -string(b + 1) -string(b + 2) -string(b + b) -string(b - a) -string(b - f) -string(b .. 0) -string(b .. b) -string(b / 0.5) -string(b / 1) -string(b / a) -string(b < 0) -string(b < 1) -string(b < a) -string(b < b) -string(b < f == nil) -string(b <= a) -string(b <= b) -string(b <= f) -string(b == 0) -string(b == 0.5) -string(b == 1) -string(b == a) -string(b == f) -string(b == nil) -string(b > 0.5) -string(b > 1) -string(b > b) -string(b ^ 0.5) -string(b ^ 2) -string(b ^ b) -string(b ^ f) -string(b) -string(b) < s -string(b) <= s -string(b) >= s -string(b) matches s -string(count(arr, false)) -string(count(arr, ok)) +string(add) contains type(list) +string(add) not in foo +string(all(array, false)) +string(all(array, true)) +string(any(array, false)) +string(any(list, true)) +string(array != array) +string(array == nil) +string(array) +string(array) not in foo +string(array[1:i]) +string(array[1]) +string(array[i64]) +string(count(array, # <= #)) +string(count(array, ok)) +string(div != greet) string(div != nil) -string(div == div) string(div == nil) -string(div(0, 2)) -string(div(0, a)) -string(div(0, b)) -string(div(2, a)) -string(div(a, 1)) -string(div(a, a)) -string(div(a, b)) -string(div(b, 1)) -string(div(b, 2)) -string(div(b, a)) -string(div(b, b)) +string(div == score) string(div) -string(div) != string(b) -string(div) >= s -string(div) endsWith s -string(div)[a:count(arr, true)] -string(f != 0.5) -string(f != f) -string(f != nil) -string(f * 0) -string(f * a) -string(f * f) -string(f ** b) -string(f ** f) -string(f + b) -string(f - 2) -string(f - a) -string(f - b) -string(f / 0) -string(f / 0.5) -string(f / a) -string(f / f) -string(f / obj.a) -string(f < 0.5) -string(f < a) -string(f < b) -string(f < f) -string(f <= a) -string(f <= b) -string(f <= f) -string(f == 0) -string(f == 0.5) -string(f == b) -string(f == nil) -string(f > a) -string(f > b) -string(f > f) -string(f >= 0) -string(f >= 1) -string(f ^ a) -string(f ^ b) -string(f ^ f) -string(f) -string(f) + s -string(f) < s -string(f) > s -string(f) >= s -string(f) endsWith s -string(false != nil) -string(false != ok) -string(false && ok) -string(false && true) -string(false == nil) -string(false ? arr : f) -string(false ? div : div) -string(false ? f : a) -string(false || true) -string(filter(arr, ok)) -string(float(0)) +string(f32 != 0.5) +string(f32 != 1) +string(f32 != f32) +string(f32 != f64) +string(f32 != nil) +string(f32 * 0.5) +string(f32 * f64) +string(f32 * i) +string(f32 * i32) +string(f32 ** 1) +string(f32 ** i64) +string(f32 + 1) +string(f32 + f32) +string(f32 - i) +string(f32 / 1) +string(f32 / i) +string(f32 / i64) +string(f32 < 0.5) +string(f32 < f64) +string(f32 < i32) +string(f32 <= 0.5) +string(f32 <= 1) +string(f32 <= f32) +string(f32 <= i) +string(f32 <= i32) +string(f32 == 0.5) +string(f32 == 1) +string(f32 == i64) +string(f32 == nil) +string(f32 > 1) +string(f32 > f32) +string(f32 > f64) +string(f32 > i) +string(f32 > i32) +string(f32 >= 0.5) +string(f32 >= f32) +string(f32 >= f64) +string(f32 >= i32) +string(f32 ^ 1) +string(f32 ^ f32) +string(f32 ^ f64) +string(f32 ^ i) +string(f32 ^ i64) +string(f32) +string(f32) matches trim("bar") +string(f64 != 1) +string(f64 != f32) +string(f64 * 0.5) +string(f64 * 1) +string(f64 * f32) +string(f64 * f64) +string(f64 * i) +string(f64 ** 0.5) +string(f64 ** 1) +string(f64 ** f64) +string(f64 ** i32) +string(f64 + 0.5) +string(f64 + 1) +string(f64 + f32) +string(f64 + i) +string(f64 + i32) +string(f64 + i64) +string(f64 - 0.5) +string(f64 - f64) +string(f64 - i32) +string(f64 / 0.5) +string(f64 / f64) +string(f64 / i64) +string(f64 < 1) +string(f64 < f64) +string(f64 < i32) +string(f64 <= f64) +string(f64 <= i) +string(f64 == 0.5) +string(f64 == 1) +string(f64 == f32) +string(f64 == f64) +string(f64 == i) +string(f64 == i32) +string(f64 == i64) +string(f64 > 0.5) +string(f64 > 1) +string(f64 > f32) +string(f64 > f64) +string(f64 > i64) +string(f64 >= 1) +string(f64 >= f32) +string(f64 >= i) +string(f64 >= i64) +string(f64 ^ 0.5) +string(f64 ^ i) +string(f64 ^ i32) +string(f64 ^ i64) +string(f64) +string(false && false) +string(false ? 0.5 : i32) +string(false ? 1 : "bar") +string(false ? 1 : f32) +string(false ? 1 : score) +string(false ? div : "foo") +string(false ? f32 : foo) +string(false and true) +string(false) <= foo.Bar +string(false) > string(add) +string(filter(list, ok)) +string(find(array, ok)) +string(findIndex(array, true)) +string(findIndex(list, ok)) +string(findLast(array, # >= #)) +string(findLast(array, false)) +string(findLast(array, ok)) +string(findLast(list, ok)) +string(findLastIndex(array, not false)) +string(findLastIndex(array, ok)) +string(findLastIndex(array, true)) +string(findLastIndex(list, false)) +string(findLastIndex(list, ok)) +string(findLastIndex(list, true)) +string(first(array)) +string(first(list)) string(float(0.5)) -string(float(a)) -string(float(b)) -string(float(f)) -string(get(arr, a)) -string(get(obj, s)) -string(int(0)) -string(int(b)) -string(int(f)) -string(keys(obj)) -string(last(arr)) -string(len("b")) -string(len(obj)) -string(len(s)) -string(lower("c")) -string(map(arr, 0.5)) -string(map(arr, a)) -string(map(arr, add)) -string(map(arr, arr)) -string(map(arr, b)) -string(map(arr, div)) -string(map(arr, obj)) -string(map(arr, ok)) -string(max(0)) +string(float(1)) +string(float(f32)) +string(float(f64)) +string(float(i)) +string(float(i64)) +string(foo != nil) +string(foo not in list) +string(foo) +string(foo.Bar) +string(foo.Qux) +string(foo.String()) +string(foo.String) +string(foo?.Bar) +string(foo?.Qux) +string(foo?.String()) +string(foo?.String) +string(get(array, 1)) +string(get(array, i)) +string(get(list, i)) +string(get(list, i64)) +string(greet != add) +string(greet != greet) +string(greet != nil) +string(greet != score) +string(greet == add) +string(greet == greet) +string(greet == half) +string(greet == nil) +string(greet == score) +string(greet("bar")) +string(greet("foo")) +string(greet) +string(greet)[i64:i] +string(half != add) +string(half != div) +string(half != half) +string(half == greet) +string(half == nil) +string(half == score) +string(half(-1)) +string(half(0.5)) +string(half(f64)) +string(half) +string(half) > toJSON(nil) +string(half) not endsWith type("foo") +string(i != 0.5) +string(i != f32) +string(i != f64) +string(i % 1) +string(i % i32) +string(i * i32) +string(i * i64) +string(i ** 1) +string(i ** f32) +string(i + 1) +string(i + i) +string(i + i32) +string(i + i64) +string(i - f32) +string(i - i64) +string(i .. 1) +string(i .. i) +string(i .. i64) +string(i / 1) +string(i / f32) +string(i / i) +string(i / i32) +string(i / i64) +string(i < 1) +string(i < f32) +string(i < i32) +string(i <= 0.5) +string(i <= 1) +string(i == 0.5) +string(i == f32) +string(i == i32) +string(i > 0.5) +string(i > 1) +string(i > f64) +string(i > i64) +string(i >= 1) +string(i >= f64) +string(i ^ 0.5) +string(i ^ 1) +string(i ^ i) +string(i in array) +string(i not in array) +string(i) +string(i32 != f64) +string(i32 != i) +string(i32 != nil) +string(i32 * 0.5) +string(i32 * 1) +string(i32 * f32) +string(i32 * f64) +string(i32 * i64) +string(i32 ** 0.5) +string(i32 ** f64) +string(i32 ** i) +string(i32 + f64) +string(i32 + i32) +string(i32 - f32) +string(i32 - f64) +string(i32 .. 1) +string(i32 .. i32) +string(i32 .. i64) +string(i32 / 0.5) +string(i32 / i64) +string(i32 < 0.5) +string(i32 < f32) +string(i32 < i) +string(i32 < i32) +string(i32 < i64) +string(i32 <= f64) +string(i32 <= i64) +string(i32 == 1) +string(i32 == f32) +string(i32 == f64) +string(i32 == i) +string(i32 == nil) +string(i32 > 1) +string(i32 > f64) +string(i32 >= 0.5) +string(i32 >= 1) +string(i32 >= f64) +string(i32 >= i) +string(i32 >= i64) +string(i32 ^ 1) +string(i32 ^ f64) +string(i32 ^ i32) +string(i32 ^ i64) +string(i32 in array) +string(i32 not in array) +string(i32) +string(i32) == type("bar") +string(i64 != 0.5) +string(i64 != 1) +string(i64 != i) +string(i64 != i32) +string(i64 != i64) +string(i64 != nil) +string(i64 % 1) +string(i64 % i64) +string(i64 * 1) +string(i64 * f32) +string(i64 * i32) +string(i64 * i64) +string(i64 ** 0.5) +string(i64 ** f32) +string(i64 ** i) +string(i64 ** i32) +string(i64 + 0.5) +string(i64 + f32) +string(i64 + f64) +string(i64 + i) +string(i64 + i32) +string(i64 - f32) +string(i64 - i) +string(i64 / 0.5) +string(i64 / 1) +string(i64 / f32) +string(i64 / f64) +string(i64 / i) +string(i64 / i64) +string(i64 < 1) +string(i64 <= 0.5) +string(i64 <= f32) +string(i64 <= i) +string(i64 <= i32) +string(i64 <= i64) +string(i64 == 1) +string(i64 == i) +string(i64 == i32) +string(i64 == nil) +string(i64 > 1) +string(i64 > f32) +string(i64 > f64) +string(i64 > i) +string(i64 > i32) +string(i64 > i64) +string(i64 >= f64) +string(i64 >= i64) +string(i64 ^ 0.5) +string(i64 ^ f64) +string(i64 ^ i) +string(i64 in array) +string(i64) +string(i64) >= foo.Bar +string(i64) not in foo +string(int(0.5)) +string(int(1)) +string(int(f32 - i)) +string(int(f32)) +string(int(f64)) +string(int(i)) +string(int(i32)) +string(int(i64)) +string(last(array)) +string(last(list)) +string(len(array)) +string(len(list)) +string(len(string("foo"))) +string(list == array) +string(list == list) +string(list == nil) +string(list) +string(list) != toJSON(i64) +string(list[1]) +string(list[i64]) +string(list[i64].String) +string(lower("bar")) +string(lower("foo")) +string(map(array, "bar")) +string(map(array, #)) +string(map(array, 0.5)) +string(map(array, 1)) +string(map(array, array)) +string(map(array, div)) +string(map(array, greet)) +string(map(array, i)) +string(map(array, i32)) +string(map(array, ok)) +string(map(array, true)) +string(map(list, "bar")) +string(map(list, "foo")) +string(map(list, #)) +string(map(list, 0.5)) +string(map(list, 1)) +string(map(list, add)) +string(map(list, f32)) +string(map(list, f64)) +string(map(list, false)) +string(map(list, greet)) +string(map(list, i64)) +string(map(list, list)) string(max(0.5)) -string(max(f)) -string(min(2)) -string(min(f)) -string(nil != "b") -string(nil != "c") -string(nil != 2) -string(nil != a) -string(nil != add) -string(nil != b) -string(nil != f) -string(nil != obj) -string(nil != ok) -string(nil != s) -string(nil == 2) +string(max(1)) +string(max(1, 0.5)) +string(max(1, f32)) +string(max(f32)) +string(max(f64)) +string(max(i)) +string(max(i32)) +string(max(i32, 1, i64)) +string(max(i64)) +string(min(0.5)) +string(min(0.5, f64, f32)) +string(min(1)) +string(min(f32)) +string(min(f64)) +string(min(i)) +string(min(i32)) +string(min(i32, i64)) +string(min(i64)) +string(nil != "foo") +string(nil != 0.5) +string(nil != 1) +string(nil != array) +string(nil != div) +string(nil != f64) +string(nil != false) +string(nil != greet) +string(nil != i) +string(nil != i64) +string(nil != nil) +string(nil != score) +string(nil == "foo") +string(nil == 1) string(nil == add) -string(nil == b) -string(nil == div) +string(nil == f32) +string(nil == f64) string(nil == false) -string(nil == obj) +string(nil == list) string(nil == ok) -string(nil == s) -string(nil in arr) -string(nil in obj) -string(nil) != toJSON(true) -string(nil) + s -string(nil) == obj.a -string(nil) in obj -string(nil) matches s -string(none(arr, false)) -string(none(arr, ok)) -string(none(arr, true)) +string(nil == true) +string(nil in array) +string(nil in list) +string(nil) > string(1) +string(nil) >= string(greet) +string(nil) in foo +string(none(array, ok)) +string(none(list, true)) string(not false) string(not ok) string(not true) -string(obj == obj) -string(obj) -string(obj) < s -string(obj) <= s -string(obj) contains s -string(obj.a) -string(obj.b) -string(obj.fn(1)) -string(obj.fn(2)) -string(obj.fn(a)) -string(obj.fn(b)) -string(obj.head("a")) -string(obj.head("c", b, "b", 2)) -string(obj.head(2)) -string(obj.head(a)) -string(obj.head(a, 0, arr, obj, b)) -string(obj.head(a, div)) -string(obj.head(add)) -string(obj.head(add, b, arr)) -string(obj.head(arr)) -string(obj.head(arr, f, obj)) -string(obj.head(arr, obj)) -string(obj.head(b)) -string(obj.head(b, a, s)) -string(obj.head(div)) -string(obj.head(f, "b", a, 0)) -string(obj.head(f, arr, "b", 2)) -string(obj.head(f, nil, a, f)) -string(obj.head(nil, 1)) -string(obj.head(obj, f)) -string(obj.head(ok)) -string(obj.head(ok, div, add)) -string(obj.head(s)) -string(obj.head(s, b, b, arr)) -string(obj.head(s, true)) -string(obj.obj == s) -string(obj.obj) -string(obj.obj.b) -string(obj.obj.obj) -string(obj.obj?.b) -string(obj?.a) -string(obj?.b <= f) -string(obj?.b) -string(obj?.b) contains s -string(obj?.fn(0)) -string(obj?.fn(a)) -string(obj?.fn(b)) -string(obj?.head("c", 0.5, f)) -string(obj?.head(0, "a")) -string(obj?.head(0.5)) -string(obj?.head(0.5, s)) -string(obj?.head(a)) -string(obj?.head(a, add)) -string(obj?.head(add)) -string(obj?.head(add, f, "a")) -string(obj?.head(arr)) -string(obj?.head(arr, true)) -string(obj?.head(b, obj, arr)) -string(obj?.head(div)) -string(obj?.head(div, s, arr)) -string(obj?.head(f)) -string(obj?.head(false, true)) -string(obj?.head(nil)) -string(obj?.head(nil)?.a) -string(obj?.head(obj)) -string(obj?.head(ok)) -string(obj?.head(s, b, s)) -string(obj?.obj) -string(obj?.obj.a) -string(obj?.obj.obj) -string(obj[nil]) -string(obj[s]) -string(obj[s]?.a) -string(obj[s]?.b) -string(ok != ok) string(ok && false) string(ok && ok) -string(ok ? a : b) -string(ok ? add : 1) -string(ok ? add : a) -string(ok ? add : div) -string(ok ? arr : div) -string(ok ? b : true) -string(ok ? div : nil) -string(ok ? s : obj) -string(ok ? true : add) -string(ok and ok) -string(ok or true) +string(ok == nil) +string(ok == true) +string(ok ? 0.5 : "foo") +string(ok ? 0.5 : true) +string(ok ? true : i32) +string(ok or false) +string(ok or ok) string(ok || ok) -string(ok || true) string(ok) -string(ok) < s == ok -string(one(arr, true)) -string(s != "c") -string(s != nil) -string(s != s) -string(s < "b") -string(s <= "a") -string(s <= s) -string(s == s) -string(s > s) -string(s >= "b") -string(s >= s) -string(s contains "c") -string(s contains s) -string(s endsWith s) -string(s in obj) -string(s startsWith s) -string(s) -string(s) startsWith s -string(s[a:a]) -string(string("b")) -string(string("c")) +string(one(array, false)) +string(one(array, ok)) +string(one(array, true)) +string(one(list, true)) +string(score != nil) +string(score == div) +string(score == nil) +string(score(1)) +string(score(i)) +string(score(score(i))) +string(score) +string(score) < string(ok) +string(score) not in foo +string(sort(array)) +string(string("bar")) +string(string("foo")) string(string(0.5)) string(string(1)) -string(string(2)) -string(string(a)) string(string(add)) -string(string(arr)) -string(string(b)) +string(string(array)) string(string(div)) +string(string(f64)) +string(string(false)) +string(string(foo)) +string(string(greet)) +string(string(half)) +string(string(i)) +string(string(i32)) +string(string(i64)) +string(string(list)) string(string(nil)) -string(string(obj?.head(obj, a))) string(string(ok)) -string(string(s)) -string(toJSON(2)) -string(toJSON(a)) -string(toJSON(arr)) -string(toJSON(b)) -string(toJSON(f)) +string(string(score)) +string(string(true)) +string(toJSON("bar")) +string(toJSON("foo")) +string(toJSON(0.5)) +string(toJSON(1)) +string(toJSON(array)) +string(toJSON(f32)) +string(toJSON(f64)) +string(toJSON(false)) +string(toJSON(foo)) +string(toJSON(i)) +string(toJSON(i64)) +string(toJSON(list)) string(toJSON(nil)) string(toJSON(ok)) -string(toJSON(s)) -string(trim("a")) -string(trimSuffix("a")) -string(true != nil) -string(true ? "a" : div) -string(true ? a : ok) -string(true ? add : add) -string(true ? arr : f) -string(true ? div : b) -string(true ? s : div) -string(true) == s -string(values(obj)) -string({"b": div, "b": nil}) -toBase64("c" + "c") -toBase64(lower(s)) -toBase64(obj.head("b", add)) -toBase64(obj.head("b", arr, s, 2)) -toBase64(obj.head("c")) -toBase64(obj.head(s)) -toBase64(obj.head(s, ok, 0)) -toBase64(obj?.head("c", div)) -toBase64(obj?.head(s)) -toBase64(obj?.head(s, arr, 1, b)) -toBase64(ok ? "a" : obj) -toBase64(ok ? s : obj?.fn(div(1, ok), true ** obj)) -toBase64(s + s) -toBase64(s) -toBase64(s) != "a" ? false : 0 -toBase64(s) + s[b:a] -toBase64(s) == obj.head(ok, false) -toBase64(s) endsWith s -toBase64(string(2)) -toBase64(string(a)) -toBase64(string(add)) -toBase64(string(arr)) -toBase64(string(b)) -toBase64(string(obj)) +string(toJSON(true)) +string(trim("foo")) +string(trim(toJSON(0.5))) +string(trimPrefix("bar")) +string(trimPrefix("foo")) +string(trimPrefix(type(f32))) +string(trimSuffix("bar")) +string(true != true) +string(true == nil) +string(true == ok) +string(true ? 1 : true) +string(true ? array : f32) +string(true ? div : i64) +string(true ? i32 : "foo") +string(true ? i32 : greet) +string(true ? score : 0.5) +string(true ? true : i32) +string(true and false) +string(true or true) +string(true || false) +string(true) endsWith string(i64) +string(true) not in foo +string(type("foo")) +string(type(0.5)) +string(type(1 < f64)) +string(type(1)) +string(type(add)) +string(type(array)) +string(type(div)) +string(type(f32)) +string(type(f64)) +string(type(false)) +string(type(foo)) +string(type(half)) +string(type(i)) +string(type(i32)) +string(type(i64)) +string(type(list)) +string(type(nil)) +string(type(ok)) +string(type(score(1))) +string(type(score)) +string(type(true)) +string(type(type(false))) +string(upper("bar")) +string(upper("foo")) +string({"bar": 0.5}) +string({"bar": i32, "foo": i64}) +string({"foo": f64}) +string({"foo": true}) +toBase64(foo.Bar) +toBase64(foo.String()) +toBase64(foo?.Bar) +toBase64(foo?.String()) +toBase64(greet("bar")) +toBase64(greet("foo")) +toBase64(greet(string(array))) +toBase64(lower("bar")) +toBase64(lower("foo")) +toBase64(lower(type(i32))) +toBase64(ok ? "foo" : 1) +toBase64(ok ? "foo" : foo) +toBase64(string("bar")) +toBase64(string("foo")) +toBase64(string(0.5)) +toBase64(string(1)) +toBase64(string(array)) +toBase64(string(f32 <= i32)) +toBase64(string(f32)) +toBase64(string(f64)) +toBase64(string(false)) +toBase64(string(foo)) +toBase64(string(greet)) +toBase64(string(half)) +toBase64(string(i)) +toBase64(string(i32)) +toBase64(string(i64)) +toBase64(string(list)) +toBase64(string(nil)) +toBase64(string(ok)) +toBase64(string(score)) toBase64(string(true)) -toBase64(toBase64("a")) -toBase64(toBase64(s)) -toBase64(toJSON(a)) -toBase64(toJSON(b)) -toBase64(toJSON(f)) +toBase64(toBase64("bar")) +toBase64(toBase64("foo")) +toBase64(toJSON("bar")) +toBase64(toJSON("foo")) +toBase64(toJSON(0.5)) +toBase64(toJSON(1)) +toBase64(toJSON(array)) +toBase64(toJSON(f32)) +toBase64(toJSON(f64)) +toBase64(toJSON(false)) +toBase64(toJSON(foo)) +toBase64(toJSON(i)) +toBase64(toJSON(i32)) +toBase64(toJSON(i64)) +toBase64(toJSON(list)) toBase64(toJSON(nil)) toBase64(toJSON(ok)) -toBase64(toJSON(s)) -toBase64(trim("c")) -toBase64(trimPrefix("b")) -toBase64(trimPrefix(s)) -toBase64(trimSuffix("b")) -toBase64(trimSuffix(s)) -toBase64(true ? "b" : arr) -toBase64(upper("b")) +toBase64(toJSON(true)) +toBase64(trim("bar")) +toBase64(trim("foo")) +toBase64(trimPrefix("foo")) +toBase64(trimSuffix("bar")) +toBase64(trimSuffix("foo")) +toBase64(true ? "bar" : ok) +toBase64(type("bar")) +toBase64(type("foo")) +toBase64(type(0.5)) +toBase64(type(1)) +toBase64(type(add)) +toBase64(type(array)) +toBase64(type(div)) +toBase64(type(f32)) +toBase64(type(f64)) +toBase64(type(false)) +toBase64(type(foo)) +toBase64(type(get(array, i))) +toBase64(type(greet)) +toBase64(type(i)) +toBase64(type(i32)) +toBase64(type(i64)) +toBase64(type(list)) +toBase64(type(ok)) +toBase64(type(true)) +toBase64(upper("bar")) +toBase64(upper("foo")) +toBase64(upper(foo.Bar)) toJSON(!false) toJSON(!ok) toJSON(!true) -toJSON("a" != nil) -toJSON("a" == "b") -toJSON("a" == nil) -toJSON("a" == s) -toJSON("a" contains s) -toJSON("a" matches s) -toJSON("a") >= trimSuffix("c") -toJSON("b" != s) -toJSON("b" < s) -toJSON("b" <= "a") -toJSON("b" == nil) -toJSON("b" > "b") -toJSON("b" >= s) -toJSON("b" in obj) -toJSON("b" matches "b") -toJSON("b" matches s) -toJSON("b") <= s -toJSON("b") matches s -toJSON("c" < "a") -toJSON("c" <= s) -toJSON("c" == nil) -toJSON("c" endsWith "a") -toJSON("c" matches "c") -toJSON("c" startsWith "c") -toJSON("c" startsWith s) -toJSON("c") in obj -toJSON("c") startsWith lower("c") -toJSON(-(a - 0)) -toJSON(-(f - 0.5)) -toJSON(-0) +toJSON("bar" != "foo") +toJSON("bar" + "bar") +toJSON("bar" + "foo") +toJSON("bar" <= "foo") +toJSON("bar" >= "foo") +toJSON("bar" contains "bar") +toJSON("bar" matches "bar") +toJSON("bar" not matches "bar") +toJSON("bar" not matches "foo") +toJSON("foo" != "bar") +toJSON("foo" + "bar") +toJSON("foo" <= "bar") +toJSON("foo" == nil) +toJSON("foo" contains "bar") +toJSON("foo" matches "foo") +toJSON("foo" not in foo) +toJSON("foo" not matches "bar") +toJSON("foo") > foo?.Bar +toJSON("foo") not in foo toJSON(-0.5) toJSON(-1) -toJSON(-2) -toJSON(-a) -toJSON(-b) -toJSON(-f) -toJSON(0 != 0) -toJSON(0 != 1) -toJSON(0 != 2) -toJSON(0 != b) -toJSON(0 != f) -toJSON(0 % a) -toJSON(0 % b) -toJSON(0 * 1) -toJSON(0 * f) -toJSON(0 ** 0.5) -toJSON(0 ** a) -toJSON(0 + 1) -toJSON(0 + a) -toJSON(0 + b) -toJSON(0 + f) -toJSON(0 - 0) -toJSON(0 - a) -toJSON(0 - b) -toJSON(0 .. 1) -toJSON(0 .. 2) -toJSON(0 .. a) -toJSON(0 < 0) -toJSON(0 < a) -toJSON(0 < f) -toJSON(0 <= 0) -toJSON(0 <= a) -toJSON(0 <= obj?.a) -toJSON(0 == 0) -toJSON(0 == 0.5) -toJSON(0 == 1) -toJSON(0 == a) -toJSON(0 == nil) -toJSON(0 >= 1) -toJSON(0 >= a) -toJSON(0 >= b) -toJSON(0 >= f) -toJSON(0 ^ 0.5) -toJSON(0 ^ b) -toJSON(0 in arr) -toJSON(0) + s -toJSON(0) in obj?.obj +toJSON(-f32) +toJSON(-f64) +toJSON(-i) +toJSON(-i32) +toJSON(-i64) +toJSON(0.5 != 0.5) toJSON(0.5 != 1) -toJSON(0.5 != a) +toJSON(0.5 != f32) +toJSON(0.5 != f64) +toJSON(0.5 != i) +toJSON(0.5 != i32) toJSON(0.5 * 0.5) -toJSON(0.5 * b) -toJSON(0.5 * f) -toJSON(0.5 ** 2) -toJSON(0.5 - b) -toJSON(0.5 / b) -toJSON(0.5 < 0) -toJSON(0.5 < b) -toJSON(0.5 == b) -toJSON(0.5 == f) -toJSON(0.5 == nil) -toJSON(0.5 > a) +toJSON(0.5 * i) +toJSON(0.5 * i32) +toJSON(0.5 ** f64) +toJSON(0.5 ** i) +toJSON(0.5 ** i64) +toJSON(0.5 + 0.5) +toJSON(0.5 + f32) +toJSON(0.5 - 0.5) +toJSON(0.5 - 1) +toJSON(0.5 - f32) +toJSON(0.5 - f64) +toJSON(0.5 / 0.5) +toJSON(0.5 / 1) +toJSON(0.5 / f32) +toJSON(0.5 / f64) +toJSON(0.5 / i) +toJSON(0.5 / i32) +toJSON(0.5 / i64) +toJSON(0.5 < 0.5) +toJSON(0.5 < 1) +toJSON(0.5 < f32) +toJSON(0.5 < i) +toJSON(0.5 <= 1) +toJSON(0.5 <= f32) +toJSON(0.5 <= f64) +toJSON(0.5 <= i) +toJSON(0.5 == 0.5) +toJSON(0.5 == 1) +toJSON(0.5 == f32) +toJSON(0.5 == i) +toJSON(0.5 == i64) +toJSON(0.5 > 1) +toJSON(0.5 > f32) +toJSON(0.5 > f64) +toJSON(0.5 > i32) +toJSON(0.5 >= 0.5) toJSON(0.5 >= 1) -toJSON(0.5 >= f) -toJSON(0.5 ^ 0) -toJSON(0.5 ^ f) -toJSON(0.5) contains s -toJSON(1 != 2) -toJSON(1 != b) -toJSON(1 % a) -toJSON(1 % b) -toJSON(1 * 0) -toJSON(1 ** 0) -toJSON(1 + b) -toJSON(1 - 0) +toJSON(0.5 >= f32) +toJSON(0.5 >= f64) +toJSON(0.5 >= i) +toJSON(0.5 >= i32) +toJSON(0.5 >= i64) +toJSON(0.5 ^ 0.5) +toJSON(0.5 ^ 1) +toJSON(0.5 ^ f32) +toJSON(0.5 ^ f64) +toJSON(0.5 ^ i) +toJSON(0.5 ^ i32) +toJSON(0.5 ^ i64) +toJSON(0.5) contains "bar" ? "bar" : array +toJSON(1 != 0.5) +toJSON(1 != f32) +toJSON(1 != nil) +toJSON(1 % 1) +toJSON(1 % i32) +toJSON(1 * 0.5) +toJSON(1 * f32) +toJSON(1 * f64) +toJSON(1 * i32) +toJSON(1 * i64) +toJSON(1 ** 0.5) +toJSON(1 ** 1) +toJSON(1 ** f32) +toJSON(1 ** f64) +toJSON(1 ** i >= f64) +toJSON(1 ** i32) +toJSON(1 + 0.5) +toJSON(1 + f32) +toJSON(1 + f64) +toJSON(1 + i64) toJSON(1 - 0.5) -toJSON(1 - a) -toJSON(1 == a) +toJSON(1 - 1) +toJSON(1 - f32) +toJSON(1 - f64) +toJSON(1 - i32) +toJSON(1 .. 1) +toJSON(1 .. i) +toJSON(1 .. i64) +toJSON(1 / 0.5) +toJSON(1 / 1) +toJSON(1 / f32) +toJSON(1 / i32) +toJSON(1 < 0.5) +toJSON(1 < 1) +toJSON(1 < f32) +toJSON(1 < f64) +toJSON(1 < i) +toJSON(1 <= 0.5) +toJSON(1 <= 1) +toJSON(1 <= i) +toJSON(1 <= i32) +toJSON(1 <= i64) +toJSON(1 == 0.5) +toJSON(1 == f32) +toJSON(1 == i) +toJSON(1 == i32) +toJSON(1 == i64) +toJSON(1 == nil) toJSON(1 > 0.5) -toJSON(1 > b) -toJSON(1 >= b) -toJSON(1) startsWith s -toJSON(1) startsWith string(0) -toJSON(2 != 1) -toJSON(2 != f) -toJSON(2 % obj.a) -toJSON(2 * 0) -toJSON(2 * b) -toJSON(2 + 2) -toJSON(2 + f) -toJSON(2 - 0.5) -toJSON(2 - a) -toJSON(2 .. a) -toJSON(2 <= 1) -toJSON(2 == f) -toJSON(2 >= f) -toJSON(2 ^ 0) -toJSON(2 ^ a) -toJSON(2 ^ b) -toJSON([0]) -toJSON([b]) -toJSON(a != 0) -toJSON(a != 0.5 and obj?.b) -toJSON(a != b) -toJSON(a != nil) -toJSON(a % a) -toJSON(a % b) -toJSON(a * b) -toJSON(a ** 0) -toJSON(a ** 0.5) -toJSON(a ** f) -toJSON(a + 0.5) -toJSON(a + 2) -toJSON(a + b) -toJSON(a + f) -toJSON(a - 0) -toJSON(a - 0.5) -toJSON(a - a) -toJSON(a .. 0) -toJSON(a .. a) -toJSON(a .. b) -toJSON(a / 0.5) -toJSON(a / b) -toJSON(a < a) -toJSON(a <= 0) -toJSON(a <= 0.5) -toJSON(a <= 1) -toJSON(a <= a) -toJSON(a <= b) -toJSON(a <= f) -toJSON(a == 0) -toJSON(a == 0.5) -toJSON(a == 2) -toJSON(a == b) -toJSON(a > 0) -toJSON(a > 0.5) -toJSON(a > b) -toJSON(a > f) -toJSON(a >= 0.5) -toJSON(a >= a) -toJSON(a >= b) -toJSON(a >= f) -toJSON(a >= obj.a) -toJSON(a ^ f) -toJSON(a) -toJSON(a) != obj.obj -toJSON(a) < s -toJSON(a) == "c" ? 0.5 : nil +toJSON(1 > f64) +toJSON(1 > i) +toJSON(1 > i32) +toJSON(1 > i64) +toJSON(1 >= 0.5) +toJSON(1 >= 1) +toJSON(1 >= f32) +toJSON(1 >= i32) +toJSON(1 ^ 0.5) +toJSON(1 ^ 1) +toJSON(1 ^ f32) +toJSON(1 ^ f64) +toJSON(1 ^ i32) +toJSON(1 ^ i64) +toJSON(1 in array) +toJSON(1) == nil == true +toJSON(1) in foo +toJSON(1) not in foo +toJSON(1) startsWith foo.String() +toJSON([1]) +toJSON([i64]) toJSON(abs(0.5)) -toJSON(abs(a)) -toJSON(abs(b)) -toJSON(abs(obj.a)) -toJSON(add != div) +toJSON(abs(1)) +toJSON(abs(f32)) +toJSON(abs(f64)) +toJSON(abs(i)) +toJSON(abs(i32)) +toJSON(abs(i64)) toJSON(add != nil) -toJSON(add != obj.b) -toJSON(add == add) -toJSON(add(0, a)) -toJSON(add(1, 2)) -toJSON(add(a, 0)) -toJSON(add(a, 1)) -toJSON(add(a, a)) -toJSON(add(b, 0)) -toJSON(add(b, 2)) -toJSON(add(b, b)) -toJSON(all(arr, ok)) -toJSON(any(arr, ok)) -toJSON(arr == arr) -toJSON(arr == nil) -toJSON(arr) -toJSON(arr) > s -toJSON(arr) endsWith s -toJSON(arr) in obj?.obj -toJSON(arr) matches "b" ? b : obj -toJSON(arr[0]) -toJSON(arr[a]) -toJSON(arr[b:b]) -toJSON(arr[b]) -toJSON(b != 0) -toJSON(b != b) -toJSON(b % 1) -toJSON(b * 0.5) -toJSON(b * a) -toJSON(b ** a) -toJSON(b ** b) -toJSON(b ** f) -toJSON(b + 0.5) -toJSON(b + 2) -toJSON(b + f) -toJSON(b + obj.a) -toJSON(b - 0) -toJSON(b - 2) -toJSON(b - a) -toJSON(b - b) -toJSON(b - f) -toJSON(b / b) -toJSON(b < a) -toJSON(b < f) -toJSON(b <= 0) -toJSON(b <= 2) -toJSON(b <= a) -toJSON(b <= b) -toJSON(b == 0) -toJSON(b == 0.5) -toJSON(b == a) -toJSON(b == f) -toJSON(b == nil) -toJSON(b > a) -toJSON(b > b) -toJSON(b > obj.a) -toJSON(b >= b) -toJSON(b >= f) -toJSON(b ^ 2) -toJSON(b) -toJSON(b) != s -toJSON(b) >= s -toJSON(b) contains s -toJSON(b) startsWith s -toJSON(count(arr, false)) -toJSON(count(arr, true)) -toJSON(date("b", "b")) -toJSON(div == add) +toJSON(add != score) +toJSON(add == div) +toJSON(add == half) +toJSON(add == nil) +toJSON(add == score) +toJSON(all(list, false)) +toJSON(all(list, ok)) +toJSON(all(list, true)) +toJSON(any(array, false)) +toJSON(any(array, true)) +toJSON(array != array) +toJSON(array != nil) +toJSON(array) +toJSON(array) != toJSON(ok) +toJSON(array) > "bar" != false +toJSON(array) endsWith greet("foo") +toJSON(array) endsWith string(i32) +toJSON(array) in foo +toJSON(array) not startsWith greet("foo") +toJSON(array[1:1]) +toJSON(array[i32]) +toJSON(array[i]) +toJSON(count(array, false)) +toJSON(count(array, ok)) +toJSON(div != div) +toJSON(div != greet) +toJSON(div != score) toJSON(div == div) +toJSON(div == half) toJSON(div == nil) -toJSON(div == obj.a) -toJSON(div == obj?.b) -toJSON(div(0, a)) -toJSON(div(1, a)) -toJSON(div(a, 2)) -toJSON(div(a, a)) -toJSON(div(a, b)) -toJSON(div(b, 2)) -toJSON(div(b, a)) -toJSON(div(b, b)) -toJSON(f != b) -toJSON(f != f) -toJSON(f != obj?.b) -toJSON(f * a) -toJSON(f * b) -toJSON(f * f) -toJSON(f ** a) -toJSON(f ** b) -toJSON(f ** f) -toJSON(f + 0.5) -toJSON(f + a) -toJSON(f + b) -toJSON(f - 0.5) -toJSON(f - a) -toJSON(f - b) -toJSON(f - f) -toJSON(f / a) -toJSON(f < 0) -toJSON(f < f) -toJSON(f <= 0) -toJSON(f <= f) -toJSON(f == a) -toJSON(f > 0) -toJSON(f > 0.5) -toJSON(f > a) -toJSON(f > f) -toJSON(f >= b) -toJSON(f ^ 0.5) -toJSON(f ^ 1) -toJSON(f) -toJSON(f) endsWith s -toJSON(f) startsWith s -toJSON(false ? false : 0) -toJSON(false ? false : b) -toJSON(false ? obj : 1) -toJSON(false or ok) -toJSON(false || true) -toJSON(false) contains s -toJSON(filter(arr, false)) -toJSON(filter(arr, ok)) -toJSON(first(arr)) -toJSON(float(2)) -toJSON(float(a)) -toJSON(float(b)) -toJSON(get(arr, 0)) -toJSON(get(arr, b)) -toJSON(get(obj, s)) -toJSON(get(obj, s)?.a) -toJSON(int(0)) -toJSON(int(2)) -toJSON(int(a)) -toJSON(int(b)) -toJSON(int(f)) -toJSON(last(arr)) -toJSON(len("c")) -toJSON(len(arr)) -toJSON(len(s)) -toJSON(lower("c")) -toJSON(lower(s)) -toJSON(map(arr, "c")) -toJSON(map(arr, 0)) -toJSON(map(arr, 0.5)) -toJSON(map(arr, 2)) -toJSON(map(arr, a)) -toJSON(map(arr, b)) -toJSON(map(arr, f)) -toJSON(map(arr, false)) -toJSON(map(arr, s)) -toJSON(max(0)) -toJSON(max(b)) -toJSON(max(f)) -toJSON(min(2)) -toJSON(min(a)) -toJSON(min(f)) -toJSON(nil != "b") -toJSON(nil != 0) -toJSON(nil != a) +toJSON(div == score) +toJSON(f32 != 1) +toJSON(f32 * 0.5) +toJSON(f32 * 1) +toJSON(f32 * f32) +toJSON(f32 * f64) +toJSON(f32 * i32) +toJSON(f32 ** f32) +toJSON(f32 ** i32) +toJSON(f32 ** i64) +toJSON(f32 + 1) +toJSON(f32 + i) +toJSON(f32 + i32) +toJSON(f32 - f64) +toJSON(f32 - i32) +toJSON(f32 / 0.5) +toJSON(f32 / 1) +toJSON(f32 < 0.5) +toJSON(f32 < f32) +toJSON(f32 < f64) +toJSON(f32 <= f32) +toJSON(f32 == 1) +toJSON(f32 == f64) +toJSON(f32 == i) +toJSON(f32 == nil) +toJSON(f32 > 0.5) +toJSON(f32 > f64) +toJSON(f32 > i) +toJSON(f32 >= 1) +toJSON(f32 >= f32) +toJSON(f32 ^ 0.5) +toJSON(f32 ^ 1) +toJSON(f32 ^ f64) +toJSON(f32 ^ i) +toJSON(f32 ^ i64) +toJSON(f32) +toJSON(f64 != 1) +toJSON(f64 != f32) +toJSON(f64 != f64) +toJSON(f64 != i) +toJSON(f64 != i32 / i32) +toJSON(f64 != i32) +toJSON(f64 != nil) +toJSON(f64 * 0.5) +toJSON(f64 * f64) +toJSON(f64 * i) +toJSON(f64 * i64) +toJSON(f64 ** 0.5) +toJSON(f64 ** f32) +toJSON(f64 ** i) +toJSON(f64 ** i64) +toJSON(f64 + 1) +toJSON(f64 + f32) +toJSON(f64 + i) +toJSON(f64 + i32) +toJSON(f64 - 1) +toJSON(f64 - f64) +toJSON(f64 - i) +toJSON(f64 - i32) +toJSON(f64 / 0.5) +toJSON(f64 / f32) +toJSON(f64 / i32) +toJSON(f64 < 1) +toJSON(f64 < f32) +toJSON(f64 < i32) +toJSON(f64 < i64) +toJSON(f64 <= 0.5) +toJSON(f64 <= 1) +toJSON(f64 <= i32) +toJSON(f64 == 1) +toJSON(f64 == i64) +toJSON(f64 == nil) +toJSON(f64 > 1) +toJSON(f64 > f64) +toJSON(f64 >= 0.5) +toJSON(f64 >= i64) +toJSON(f64 ^ 1) +toJSON(f64 ^ f64) +toJSON(f64 ^ i) +toJSON(f64) +toJSON(false != nil) +toJSON(false && false) +toJSON(false == false) +toJSON(false ? 0.5 : nil) +toJSON(false ? 1 : f32) +toJSON(false ? f32 : list) +toJSON(false ? false : i32) +toJSON(false ? greet : 1) +toJSON(false ? greet : i32) +toJSON(false ? nil : f64) +toJSON(false and ok) +toJSON(false and true) +toJSON(filter(array, ok)) +toJSON(filter(list, false)) +toJSON(filter(list, true)) +toJSON(find(array, false)) +toJSON(find(array, ok)) +toJSON(findIndex(array, ok)) +toJSON(findIndex(array, true)) +toJSON(findIndex(list, ok)) +toJSON(findIndex(list, true)) +toJSON(findLast(array, false)) +toJSON(findLast(list, true)) +toJSON(findLastIndex(array, true)) +toJSON(findLastIndex(list, false)) +toJSON(findLastIndex(list, ok)) +toJSON(first(array)) +toJSON(first(list)) +toJSON(float(0.5)) +toJSON(float(1)) +toJSON(float(f32)) +toJSON(float(f64)) +toJSON(float(i)) +toJSON(float(i32)) +toJSON(float(i64)) +toJSON(foo != foo) +toJSON(foo != nil) +toJSON(foo == foo) +toJSON(foo == nil) +toJSON(foo in list) +toJSON(foo) +toJSON(foo.Bar) +toJSON(foo.String()) +toJSON(foo?.Bar) +toJSON(foo?.String()) +toJSON(get(array, 1)) +toJSON(get(array, i64)) +toJSON(get(list, 1)) +toJSON(get(list, i)) +toJSON(get(list, i64)) +toJSON(greet != div) +toJSON(greet != greet) +toJSON(greet != half) +toJSON(greet == add) +toJSON(greet == div) +toJSON(greet == greet) +toJSON(greet == half) +toJSON(greet("bar")) +toJSON(greet("foo")) +toJSON(half != greet) +toJSON(half != nil) +toJSON(half != score) +toJSON(half == add) +toJSON(half == div) +toJSON(half == greet) +toJSON(half == nil) +toJSON(half == score) +toJSON(half(0.5)) +toJSON(half(f64)) +toJSON(i != 1) +toJSON(i != f32) +toJSON(i != i) +toJSON(i != i32) +toJSON(i % 1) +toJSON(i % i64) +toJSON(i * 0.5) +toJSON(i * 1) +toJSON(i * f32) +toJSON(i * i32) +toJSON(i ** 0.5) +toJSON(i ** f32) +toJSON(i ** i32) +toJSON(i + 0.5) +toJSON(i + 1) +toJSON(i + f32) +toJSON(i + f64) +toJSON(i + i) +toJSON(i - 1) +toJSON(i .. 1) +toJSON(i .. i) +toJSON(i / f32) +toJSON(i < i32) +toJSON(i < i64) +toJSON(i <= 1) +toJSON(i <= f32) +toJSON(i <= f64) +toJSON(i <= i) +toJSON(i <= i32) +toJSON(i == i32) +toJSON(i == i64) +toJSON(i == nil) +toJSON(i > 0.5) +toJSON(i > 1) +toJSON(i > f32) +toJSON(i >= 0.5) +toJSON(i >= 1) +toJSON(i >= f32) +toJSON(i >= i) +toJSON(i ^ 1) +toJSON(i ^ f64) +toJSON(i) +toJSON(i) != string(1) +toJSON(i32 != f32) +toJSON(i32 != i) +toJSON(i32 % 1) +toJSON(i32 % i64) +toJSON(i32 * i) +toJSON(i32 * i64) +toJSON(i32 ** i64) +toJSON(i32 + f64) +toJSON(i32 + i) +toJSON(i32 + i32) +toJSON(i32 + i64) +toJSON(i32 - 0.5) +toJSON(i32 - 1) +toJSON(i32 - f32) +toJSON(i32 - f64) +toJSON(i32 - i) +toJSON(i32 .. i) +toJSON(i32 .. i64) +toJSON(i32 / 0.5) +toJSON(i32 / f32) +toJSON(i32 / i) +toJSON(i32 / i64) +toJSON(i32 < 0.5) +toJSON(i32 < f32) +toJSON(i32 <= 0.5) +toJSON(i32 <= i32) +toJSON(i32 == 1) +toJSON(i32 == f32) +toJSON(i32 == i) +toJSON(i32 == nil ? i32 : i32) +toJSON(i32 == nil) +toJSON(i32 > 0.5) +toJSON(i32 > f64) +toJSON(i32 > i) +toJSON(i32 >= 0.5) +toJSON(i32 >= 1) +toJSON(i32 >= f32) +toJSON(i32 >= f64) +toJSON(i32 >= i) +toJSON(i32 ^ 1) +toJSON(i32 ^ f64) +toJSON(i32 ^ i) +toJSON(i32 in array) +toJSON(i32 not in array) +toJSON(i32) +toJSON(i32) < string(i64) +toJSON(i64 != 0.5) +toJSON(i64 != 1) +toJSON(i64 != f32) +toJSON(i64 != i) +toJSON(i64 != i32) +toJSON(i64 != nil) +toJSON(i64 % 1) +toJSON(i64 % i) +toJSON(i64 % i32) +toJSON(i64 % i64) +toJSON(i64 * i) +toJSON(i64 + 0.5) +toJSON(i64 + i) +toJSON(i64 + i64) +toJSON(i64 - 0.5) +toJSON(i64 - 1) +toJSON(i64 - i64) +toJSON(i64 .. 1) +toJSON(i64 / 1) +toJSON(i64 / f32) +toJSON(i64 / i) +toJSON(i64 / i64) +toJSON(i64 < 0.5) +toJSON(i64 < i32) +toJSON(i64 <= 0.5) +toJSON(i64 <= 1) +toJSON(i64 <= f32) +toJSON(i64 <= i64) +toJSON(i64 == 0.5) +toJSON(i64 == 1) +toJSON(i64 == i32) +toJSON(i64 == nil) +toJSON(i64 > f32) +toJSON(i64 > i) +toJSON(i64 >= 0.5) +toJSON(i64 >= 1) +toJSON(i64 >= i64) +toJSON(i64 ^ i) +toJSON(i64) +toJSON(int(0.5)) +toJSON(int(1)) +toJSON(int(f32)) +toJSON(int(f64)) +toJSON(int(i)) +toJSON(int(i32)) +toJSON(last(list)) +toJSON(len("bar")) +toJSON(len("foo")) +toJSON(len(array)) +toJSON(len(list)) +toJSON(list != list) +toJSON(list == nil) +toJSON(list) +toJSON(list) <= foo?.Bar +toJSON(list[1]) +toJSON(list[i32]) +toJSON(list[i64:1]) +toJSON(list[i64]) +toJSON(list[i]) +toJSON(lower("bar")) +toJSON(lower("foo")) +toJSON(map(array, #)) +toJSON(map(array, 0.5)) +toJSON(map(array, 1)) +toJSON(map(array, false)) +toJSON(map(array, i)) +toJSON(map(array, i32)) +toJSON(map(array, list)) +toJSON(map(array, true)) +toJSON(map(list, "foo")) +toJSON(map(list, #)) +toJSON(map(list, 1)) +toJSON(map(list, f32)) +toJSON(map(list, f64)) +toJSON(map(list, list)) +toJSON(max(0.5)) +toJSON(max(1)) +toJSON(max(f32)) +toJSON(max(f64)) +toJSON(max(i)) +toJSON(max(i32)) +toJSON(max(i64)) +toJSON(min(0.5)) +toJSON(min(0.5, f32)) +toJSON(min(1)) +toJSON(min(1, 1)) +toJSON(min(f32)) +toJSON(min(f64)) +toJSON(min(i)) +toJSON(min(i32) / f32) +toJSON(min(i32)) +toJSON(min(i64)) +toJSON(nil != "bar") +toJSON(nil != "foo") +toJSON(nil != 0.5) toJSON(nil != add) -toJSON(nil != b) -toJSON(nil != div) +toJSON(nil != f32) +toJSON(nil != f64) +toJSON(nil != foo) +toJSON(nil != i32) +toJSON(nil != list) +toJSON(nil != nil) +toJSON(nil != score) toJSON(nil != true) -toJSON(nil == 0) -toJSON(nil == a) -toJSON(nil == arr) -toJSON(nil == f) +toJSON(nil == 0.5) +toJSON(nil == 1) +toJSON(nil == add) +toJSON(nil == div) +toJSON(nil == f32) +toJSON(nil == f64) toJSON(nil == false) -toJSON(nil == nil) -toJSON(nil == s) +toJSON(nil == foo) +toJSON(nil == i) +toJSON(nil == i64) +toJSON(nil == list) +toJSON(nil == ok) +toJSON(nil == score) toJSON(nil == true) -toJSON(nil in arr) -toJSON(nil in obj) -toJSON(nil) < s -toJSON(nil) endsWith s -toJSON(nil) in obj -toJSON(none(arr, false)) -toJSON(none(arr, true)) +toJSON(nil in array) +toJSON(nil not in array) +toJSON(nil not in list) +toJSON(nil) + string("bar") +toJSON(nil) == toJSON(1) +toJSON(nil) == type(nil) +toJSON(nil) in foo +toJSON(none(array, true)) +toJSON(none(list, true)) +toJSON(not ("foo" not in foo)) toJSON(not false) toJSON(not ok) toJSON(not true) -toJSON(obj != obj) -toJSON(obj == nil) -toJSON(obj.a <= f) -toJSON(obj.a) -toJSON(obj.b / a) -toJSON(obj.b) -toJSON(obj.c) -toJSON(obj.fn(0)) -toJSON(obj.fn(a)) -toJSON(obj.fn(b)) -toJSON(obj.head(!true)) -toJSON(obj.head(0.5)) -toJSON(obj.head(1, 0.5, nil, f)) -toJSON(obj.head(2, a, div)) -toJSON(obj.head(a)) -toJSON(obj.head(a, "a")) -toJSON(obj.head(a, ok)) -toJSON(obj.head(arr)) -toJSON(obj.head(arr, "c")) -toJSON(obj.head(b)) -toJSON(obj.head(b, "a")) -toJSON(obj.head(f)) -toJSON(obj.head(f, f)) -toJSON(obj.head(false)) -toJSON(obj.head(nil)) -toJSON(obj.head(nil, add)) -toJSON(obj.head(obj).a) -toJSON(obj.head(obj)?.obj) -toJSON(obj.head(obj?.b)) -toJSON(obj.head(ok)) -toJSON(obj.head(ok, div, ok, b, nil)) -toJSON(obj.head(s == f, div != s)) -toJSON(obj.head(s)) -toJSON(obj.head(s, add, 1)) -toJSON(obj.head(true, "b")) -toJSON(obj.head(true, div)) -toJSON(obj.obj) -toJSON(obj.obj.b) -toJSON(obj.obj.obj) -toJSON(obj.obj?.a) -toJSON(obj.obj?.obj) -toJSON(obj?.a) -toJSON(obj?.b) -toJSON(obj?.c) -toJSON(obj?.fn(a)) -toJSON(obj?.fn(b)) -toJSON(obj?.head("a", 0, 0.5, "a")) -toJSON(obj?.head("a", div)) -toJSON(obj?.head("c")) -toJSON(obj?.head(-a)) -toJSON(obj?.head(0)) -toJSON(obj?.head(0, true)) -toJSON(obj?.head(1)) -toJSON(obj?.head(1, s, 1)) -toJSON(obj?.head(a)) -toJSON(obj?.head(a, 0, arr)) -toJSON(obj?.head(arr, nil, s, arr, "b")) -toJSON(obj?.head(f)) -toJSON(obj?.head(f, b)) -toJSON(obj?.head(false)) -toJSON(obj?.head(nil)) -toJSON(obj?.head(ok, add, arr, ok)) -toJSON(obj?.obj) -toJSON(obj?.obj[s]) -toJSON(obj[nil]) -toJSON(obj[s]) +toJSON(ok != false) toJSON(ok != nil) -toJSON(ok != obj?.obj) toJSON(ok != ok) -toJSON(ok != true) -toJSON(ok && false) -toJSON(ok == false) +toJSON(ok && true) toJSON(ok == nil) -toJSON(ok ? "b" : "c") -toJSON(ok ? "b" : ok) -toJSON(ok ? "c" : 0) -toJSON(ok ? 0.5 : s) -toJSON(ok ? 1 : a) -toJSON(ok ? a : add) -toJSON(ok ? a : arr) -toJSON(ok ? arr : arr) -toJSON(ok ? b : b) -toJSON(ok ? f : div) -toJSON(ok ? f : obj) -toJSON(ok ? nil : div) -toJSON(ok ? nil : true) -toJSON(ok ? ok : b) -toJSON(ok ? s : obj) -toJSON(ok and ok) -toJSON(ok || obj?.b) -toJSON(ok || true) +toJSON(ok == ok) +toJSON(ok ? 1 : half) +toJSON(ok ? f32 : div) +toJSON(ok ? false : i32) +toJSON(ok ? nil : f32) +toJSON(ok or true) +toJSON(ok || ok) toJSON(ok) -toJSON(ok) == obj?.a -toJSON(ok) >= s -toJSON(ok) >= toJSON(b) -toJSON(one(arr, true)) -toJSON(repeat(s, 2)) -toJSON(s != "a") -toJSON(s != nil) -toJSON(s + "b") -toJSON(s < "b") -toJSON(s <= s) -toJSON(s == "b") -toJSON(s == nil) -toJSON(s == s) -toJSON(s > "a") -toJSON(s > s) -toJSON(s >= s) -toJSON(s contains s) -toJSON(s matches "b") -toJSON(s matches s) -toJSON(s startsWith "a") -toJSON(s startsWith "c") -toJSON(s startsWith s) -toJSON(s) -toJSON(s) in obj -toJSON(s[0:0]) -toJSON(string("a")) -toJSON(string("c")) +toJSON(one(array, i32 < #)) +toJSON(score != div) +toJSON(score != greet) +toJSON(score != nil) +toJSON(score != score) +toJSON(score == add) +toJSON(score == div) +toJSON(score == nil) +toJSON(score(1)) +toJSON(score(i)) +toJSON(score(i, i)) +toJSON(string("bar")) +toJSON(string("foo")) toJSON(string(0.5)) -toJSON(string(add)) -toJSON(string(arr)) +toJSON(string(1)) +toJSON(string(array)) toJSON(string(div)) +toJSON(string(f32)) +toJSON(string(f64)) toJSON(string(false)) -toJSON(string(obj)) +toJSON(string(foo)) +toJSON(string(greet)) +toJSON(string(half)) +toJSON(string(i)) +toJSON(string(i32)) +toJSON(string(i64)) +toJSON(string(list)) +toJSON(string(nil)) toJSON(string(ok)) -toJSON(string(true)) -toJSON(toBase64(s)) -toJSON(toJSON(0)) -toJSON(toJSON(2)) -toJSON(toJSON(a)) -toJSON(toJSON(arr)) -toJSON(toJSON(b)) -toJSON(toJSON(f)) +toJSON(string(score)) +toJSON(toBase64("bar")) +toJSON(toBase64("foo")) +toJSON(toJSON("bar")) +toJSON(toJSON("foo")) +toJSON(toJSON(1)) +toJSON(toJSON(array)) +toJSON(toJSON(f32)) +toJSON(toJSON(f64)) +toJSON(toJSON(false)) +toJSON(toJSON(foo)) +toJSON(toJSON(i)) +toJSON(toJSON(i32)) +toJSON(toJSON(i64)) +toJSON(toJSON(list)) toJSON(toJSON(nil)) toJSON(toJSON(ok)) -toJSON(toJSON(s)) -toJSON(trimPrefix("a")) -toJSON(trimPrefix(s)) -toJSON(trimSuffix("b")) -toJSON(trimSuffix("c")) -toJSON(true != false) -toJSON(true != ok) -toJSON(true && ok) +toJSON(toJSON(true)) +toJSON(trim("bar")) +toJSON(trim("foo")) +toJSON(trimPrefix("foo")) +toJSON(trimSuffix("foo")) toJSON(true && true) -toJSON(true ? arr : arr) -toJSON(true ? b : add) -toJSON(true ? false : s) -toJSON(true ? ok : obj) -toJSON(true ? ok : s) -toJSON(true and false) -toJSON(true and obj.obj) +toJSON(true ? array : nil) +toJSON(true ? i32 : div) +toJSON(true ? list : true) +toJSON(true ? nil : array) +toJSON(true ? ok : list) +toJSON(true ? true : f64) toJSON(true and ok) -toJSON(true || ok) -toJSON(true) + upper("a") -toJSON(true) > obj?.head("a") -toJSON(upper("a")) -toJSON(upper(s)) -toJSON({"a": true, "b": 2, "c": a}) -trim("a") != s -trim("b" + "a") -trim("c" + "c") -trim(b != b ? s : "b") -trim(false ? obj : s) -trim(lower(s)) -trim(obj.head("a")) -trim(obj.head("a", 0)) -trim(obj.head("c")) -trim(obj.head("c", obj)) -trim(obj.head("c", ok, 0.5)) -trim(obj.head(s)) -trim(obj.head(s, 1, ok)) -trim(obj.head(s, false, f), s) -trim(obj?.head("c")) -trim(obj?.head("c", a, nil, s, "a")) -trim(obj?.head(s)) -trim(ok ? "a" : false) -trim(s + s) -trim(s) -trim(s) != obj?.head(div, s, nil, add) -trim(s) in obj?.obj -trim(s) startsWith string(nil) -trim(s, s) -trim(s, toBase64("a")) -trim(s, toBase64(s)) -trim(s[a:1]) -trim(s[a:b]) -trim(string("a")) -trim(string(a)) -trim(string(b)) +toJSON(true) in foo +toJSON(type("bar")) +toJSON(type("foo")) +toJSON(type(0.5)) +toJSON(type(1)) +toJSON(type(add)) +toJSON(type(array)) +toJSON(type(f32)) +toJSON(type(f64)) +toJSON(type(false)) +toJSON(type(foo)) +toJSON(type(greet)) +toJSON(type(half)) +toJSON(type(i)) +toJSON(type(i32)) +toJSON(type(i64)) +toJSON(type(list)) +toJSON(type(nil)) +toJSON(type(ok)) +toJSON(type(score)) +toJSON(type(true)) +toJSON(upper("bar")) +toJSON(upper("foo")) +toJSON({"bar": 0.5, "bar": array}) +toJSON({"foo": "foo"}) +toJSON({"foo": 0.5}) +toJSON({"foo": nil}) +toJSON({"foo": ok, "bar": 0.5}) +trim("bar") in foo +trim("foo" + "foo") +trim(false ? greet : "bar") +trim(foo.Bar) +trim(foo.String()) +trim(foo?.Bar) +trim(foo?.String()) +trim(greet("bar")) +trim(greet("foo")) +trim(lower("bar")) +trim(lower(toJSON(0.5))) +trim(ok ? "bar" : i32) +trim(string("foo")) +trim(string(0.5)) +trim(string(1)) +trim(string(add)) trim(string(div)) +trim(string(f32)) +trim(string(f64)) trim(string(false)) +trim(string(foo)) +trim(string(greet)) +trim(string(half)) +trim(string(i)) +trim(string(i32)) +trim(string(i64)) +trim(string(list)) trim(string(nil)) -trim(string(obj)) trim(string(ok)) -trim(toBase64("a")) -trim(toBase64(s)) -trim(toBase64(trim(s))) -trim(toJSON(0 != a)) -trim(toJSON(0 + 0.5)) -trim(toJSON(b)) +trim(string(score)) +trim(string(true)) +trim(toBase64("bar")) +trim(toBase64("foo")) +trim(toJSON("foo")) +trim(toJSON(0.5)) +trim(toJSON(1)) +trim(toJSON(array)) +trim(toJSON(f32)) +trim(toJSON(f64)) trim(toJSON(false)) -trim(toJSON(nil != div)) +trim(toJSON(foo)) +trim(toJSON(i)) +trim(toJSON(i32)) +trim(toJSON(i64)) +trim(toJSON(list)) trim(toJSON(nil)) trim(toJSON(ok)) -trim(toJSON(s)) trim(toJSON(true)) -trim(trim(s)) -trim(trim(trimSuffix(s))) -trim(trimPrefix("b")) -trim(trimPrefix("c")) -trim(trimSuffix("a")) -trim(trimSuffix(s)) -trim(true ? "c" : add) -trim(upper(s)) -trimPrefix("a" + "b") -trimPrefix("a") == obj.head(b) -trimPrefix("b" + "b") -trimPrefix("c" + s) -trimPrefix(lower("c")) -trimPrefix(lower(s)) -trimPrefix(obj.head("b", s)) -trimPrefix(obj.head("c", f)) -trimPrefix(obj.head(s)) -trimPrefix(obj?.head("a", div)) -trimPrefix(obj?.head("c")) -trimPrefix(obj?.head(s)) -trimPrefix(ok ? "c" : div) -trimPrefix(ok ? s : obj) -trimPrefix(s + s) -trimPrefix(s) -trimPrefix(s) > s -trimPrefix(s, s) -trimPrefix(s[0:2]) -trimPrefix(string("b")) -trimPrefix(string(a)) -trimPrefix(string(arr)) -trimPrefix(string(b)) -trimPrefix(string(f)) -trimPrefix(string(false)) -trimPrefix(string(obj)) +trim(trim("bar")) +trim(trimPrefix("bar")) +trim(trimPrefix("foo")) +trim(trimPrefix(string(i))) +trim(trimSuffix("bar")) +trim(trimSuffix("foo")) +trim(type("foo")) +trim(type(0.5)) +trim(type(1)) +trim(type(add)) +trim(type(array)) +trim(type(div)) +trim(type(f32)) +trim(type(f64)) +trim(type(false)) +trim(type(foo)) +trim(type(greet)) +trim(type(half)) +trim(type(i)) +trim(type(i32)) +trim(type(i64)) +trim(type(list)) +trim(type(nil != list)) +trim(type(nil)) +trim(type(ok)) +trim(type(score)) +trim(type(toJSON(1))) +trim(type(true)) +trim(upper("bar")) +trimPrefix("foo" + "foo") +trimPrefix(foo.Bar) +trimPrefix(foo.String()) +trimPrefix(foo?.Bar) +trimPrefix(foo?.String()) +trimPrefix(greet("bar")) +trimPrefix(greet("foo")) +trimPrefix(greet(foo.String())) +trimPrefix(lower("bar")) +trimPrefix(lower("foo")) +trimPrefix(ok ? "bar" : i64) +trimPrefix(string("foo")) +trimPrefix(string(0.5)) +trimPrefix(string(1)) +trimPrefix(string(add)) +trimPrefix(string(array)) +trimPrefix(string(div)) +trimPrefix(string(f32)) +trimPrefix(string(foo)) +trimPrefix(string(greet)) +trimPrefix(string(half)) +trimPrefix(string(i)) +trimPrefix(string(i32)) +trimPrefix(string(i64)) +trimPrefix(string(list)) +trimPrefix(string(nil)) trimPrefix(string(ok)) -trimPrefix(string(s)) -trimPrefix(toBase64("b")) -trimPrefix(toBase64(s)) +trimPrefix(string(score)) +trimPrefix(toBase64("bar")) +trimPrefix(toBase64("foo")) +trimPrefix(toJSON("bar")) +trimPrefix(toJSON("foo")) trimPrefix(toJSON(0.5)) trimPrefix(toJSON(1)) -trimPrefix(toJSON(2)) -trimPrefix(toJSON(ok)) -trimPrefix(toJSON(s)) -trimPrefix(trim("b")) -trimPrefix(trim("c", "a")) -trimPrefix(trim(s)) -trimPrefix(trimPrefix("b")) -trimPrefix(trimPrefix(s)) -trimPrefix(trimSuffix("b")) -trimPrefix(trimSuffix("c")) -trimPrefix(trimSuffix(s)) -trimSuffix("b" + s) -trimSuffix("b") contains s -trimSuffix("c") endsWith s -trimSuffix(false ? obj : s) -trimSuffix(lower("b")) -trimSuffix(obj.head("c", 0.5, arr, obj)) -trimSuffix(obj.head(s, nil, obj)) -trimSuffix(obj.head(toJSON(b, b, s, 0.5, nil))) -trimSuffix(obj?.head("a")) -trimSuffix(obj?.head("c")) -trimSuffix(obj?.head("c", 0.5)) -trimSuffix(obj?.head(s)) -trimSuffix(obj?.head(s, 2, div)) -trimSuffix(obj?.head(s, div, true, b)) -trimSuffix(ok ? s : add) -trimSuffix(repeat(s, 0)) -trimSuffix(s + "a") -trimSuffix(s + "b") -trimSuffix(s + "c") -trimSuffix(s + s) -trimSuffix(s) -trimSuffix(s) == s -trimSuffix(s) > s -trimSuffix(s, "b") startsWith s -trimSuffix(s, s) -trimSuffix(string("a")) -trimSuffix(string("b")) +trimPrefix(toJSON(array)) +trimPrefix(toJSON(f32)) +trimPrefix(toJSON(f64)) +trimPrefix(toJSON(false)) +trimPrefix(toJSON(foo)) +trimPrefix(toJSON(i)) +trimPrefix(toJSON(i32)) +trimPrefix(toJSON(i64)) +trimPrefix(toJSON(nil)) +trimPrefix(toJSON(true)) +trimPrefix(trim("bar")) +trimPrefix(trim("foo")) +trimPrefix(trimPrefix("bar")) +trimPrefix(trimPrefix("foo")) +trimPrefix(trimSuffix("bar")) +trimPrefix(trimSuffix("foo")) +trimPrefix(type("bar")) +trimPrefix(type(0.5 == 0.5)) +trimPrefix(type(0.5)) +trimPrefix(type(1 == f64)) +trimPrefix(type(1)) +trimPrefix(type(add)) +trimPrefix(type(array)) +trimPrefix(type(div)) +trimPrefix(type(f32)) +trimPrefix(type(f64)) +trimPrefix(type(false)) +trimPrefix(type(foo)) +trimPrefix(type(greet)) +trimPrefix(type(half)) +trimPrefix(type(i)) +trimPrefix(type(i32)) +trimPrefix(type(i64)) +trimPrefix(type(list)) +trimPrefix(type(nil)) +trimPrefix(type(ok)) +trimPrefix(type(score)) +trimPrefix(upper("foo")) +trimSuffix("bar" + "bar") +trimSuffix("foo") <= trimPrefix("foo") +trimSuffix(foo.Bar) +trimSuffix(foo.String()) +trimSuffix(foo?.Bar) +trimSuffix(foo?.Qux("bar")) +trimSuffix(foo?.String()) +trimSuffix(greet("bar")) +trimSuffix(greet("foo")) +trimSuffix(greet(toJSON(i64))) +trimSuffix(lower("bar")) +trimSuffix(lower("foo")) +trimSuffix(repeat("foo", i)) +trimSuffix(string("bar")) trimSuffix(string(0.5)) -trimSuffix(string(a)) +trimSuffix(string(1)) trimSuffix(string(add)) -trimSuffix(string(arr)) -trimSuffix(string(b)) +trimSuffix(string(array)) +trimSuffix(string(f32)) +trimSuffix(string(f64)) trimSuffix(string(false)) +trimSuffix(string(foo)) +trimSuffix(string(greet)) +trimSuffix(string(half)) +trimSuffix(string(i)) +trimSuffix(string(i32)) +trimSuffix(string(i64)) +trimSuffix(string(list)) trimSuffix(string(nil)) -trimSuffix(toJSON("a")) -trimSuffix(toJSON("b")) -trimSuffix(toJSON(a)) -trimSuffix(toJSON(arr)) -trimSuffix(toJSON(b)) -trimSuffix(toJSON(f)) +trimSuffix(string(score)) +trimSuffix(string(type("foo"))) +trimSuffix(toBase64("bar")) +trimSuffix(toJSON("bar")) +trimSuffix(toJSON(0.5)) +trimSuffix(toJSON(1)) +trimSuffix(toJSON(array)) +trimSuffix(toJSON(f64)) +trimSuffix(toJSON(false)) +trimSuffix(toJSON(first(array))) +trimSuffix(toJSON(foo)) +trimSuffix(toJSON(i)) +trimSuffix(toJSON(i32)) +trimSuffix(toJSON(i64)) +trimSuffix(toJSON(list)) trimSuffix(toJSON(nil)) -trimSuffix(toJSON(obj?.head("b", add))) -trimSuffix(toJSON(obj?.obj)) trimSuffix(toJSON(ok)) -trimSuffix(toJSON(toJSON(s))) -trimSuffix(toJSON(true)) -trimSuffix(trim("c")) -trimSuffix(trim(s)) -trimSuffix(trimPrefix("a")) -trimSuffix(trimPrefix("b")) -trimSuffix(trimPrefix(s)) -trimSuffix(trimSuffix("b")) -trimSuffix(trimSuffix("c")) -trimSuffix(trimSuffix(s)) -trimSuffix(true ? s : a) -trimSuffix(upper("b")) -trimSuffix(upper(s)) -true != false && a != a -true != false == obj.a -true != nil or ok && ok -true != obj.a -true != obj.b -true != obj.head(a % a) -true != obj.obj -true != obj.obj.a -true != obj?.a -true != obj?.b -true != obj?.obj -true != ok and arr != nil -true != true || obj?.obj -true && false or false ? f : add -true && obj.a -true && obj.b -true && obj.obj -true && obj.obj?.obj -true && obj?.a -true && obj?.b -true && obj?.head(add) -true && obj?.head(s) -true && obj?.obj -true && obj?.obj?.obj -true && ok ? arr : b -true && ok or ok -true && true || ok -true == nil != obj?.head(obj) -true == nil in obj?.head(arr, div, obj) -true == obj.a -true == obj.b -true == obj.head(ok ? one("b", ok) : arr) -true == obj.obj -true == obj.obj?.b -true == obj?.a -true == obj?.b -true == obj?.head(b) -true == obj?.obj -true == ok != ok -true == ok == obj.head(add) -true == ok or obj.b -true ? "a" : f > f -true ? "b" : obj.obj -true ? "b" : obj?.a -true ? "b" : obj?.b -true ? "c" : nil == ok -true ? "c" : obj?.b -true ? 0 : arr != nil != ok -true ? 0 : obj?.b -true ? 0 : obj?.obj -true ? 0.5 : obj.a -true ? 0.5 : obj.b -true ? 0.5 : obj?.a -true ? 1 : obj.head(s or obj) -true ? 1 : obj?.head(s[obj]) -true ? 2 : obj.fn(b?.fn(div)) -true ? 2 : obj.fn(div(obj), keys(2), a?.a, ok * div) -true ? 2 : obj.head(filter(arr, any(arr, div))) -true ? 2 : obj.obj -true ? 2 : obj?.fn(ok, b startsWith obj) -true ? 2 : obj?.obj -true ? a : b + f -true ? a : obj.b -true ? a : obj.fn(abs(true).a) -true ? a : obj.obj -true ? a : obj?.a -true ? a : obj?.b -true ? a : obj?.fn(f.a) -true ? a : obj?.obj -true ? add : obj.b -true ? add : obj.fn(all(div(b), div(add))) -true ? add : obj.obj -true ? add : obj?.head(add(f, b)) -true ? arr : "c" + s -true ? arr : a == obj.a -true ? arr : nil == f -true ? arr : obj.a -true ? arr : obj.b -true ? arr : obj.fn(arr?.head(f.fn(false))) -true ? arr : obj.fn(s matches s) -true ? arr : obj.head(keys(s >= obj, 1 .. true, any("a", a)), add(div.fn(add, 0.5, nil), a, add(f, false), a.a, -f)).b -true ? arr : obj.obj -true ? arr : obj?.a -true ? b : 0 / b -true ? b : 2 * obj.a -true ? b : a >= b -true ? b : div == div -true ? b : nil != b -true ? b : obj.a -true ? b : obj.fn(a > obj) -true ? b : obj.head(1 matches f.b, div(count(s, div), f < obj, obj?.obj, div(f))) -true ? b : obj.obj -true ? b : obj.obj?.obj -true ? b : obj?.a -true ? b : obj?.a.obj -true ? b : obj?.b -true ? div : obj.b -true ? div : obj?.a -true ? div : obj?.obj -true ? f : 2 + a -true ? f : arr[b] -true ? f : f != obj.a -true ? f : f < a ** 2 -true ? f : obj.head(add(f.b, ok, a?.head(s, 0, f, true))) -true ? f : obj.head(none(b, "b"), a.a) -true ? f : obj.obj -true ? f : obj?.a?.obj -true ? f : obj?.b -true ? f : obj?.obj -true ? f : obj?.obj.fn(div(obj)?.obj .. none(ok, s).obj) -true ? f : obj?.obj?.obj -true ? false : obj.a -true ? false : obj.fn(none(obj, arr) startsWith b?.fn(f)) -true ? false : obj.head(div(any(0, b))) -true ? false : obj?.head(add and div) -true ? false : obj?.head(b) -true ? nil : 0 % b -true ? nil : a - f -true ? nil : a <= obj.head(nil, "a", ok, nil) -true ? nil : nil != b -true ? nil : obj.head(all(add(add), f and 0.5)) -true ? nil : obj.obj -true ? nil : obj.obj?.a -true ? nil : obj?.b -true ? nil : obj?.head(obj.obj < a.fn(false)) -true ? nil : obj?.obj -true ? obj : f * f -true ? obj : f + b - 1 -true ? obj : obj.a -true ? obj : obj.b -true ? obj : obj.fn(none(a, div or arr)).obj -true ? obj : obj.fn(s.head(arr), ok > ok) -true ? obj : obj.head(ok, map(arr, !ok))?.a?.a -true ? obj : obj.head(values(s?.b), -b <= (ok and add)) -true ? obj : obj?.a -true ? ok : b in obj.b -true ? ok : obj.b -true ? ok : obj.obj.obj -true ? ok : obj?.b.b -true ? ok : obj?.fn(not 0) -true ? ok : obj?.obj -true ? s : "a" matches s -true ? s : arr in obj?.head(b) -true ? s : f ^ (0.5 / b) -true ? s : obj.a -true ? s : obj.b -true ? s : obj.head(div(add?.head(arr, f, 0.5))) -true ? s : obj.obj -true ? s : obj?.a -true ? s : obj?.head(obj.a, div) -true ? true : nil == obj.obj -true ? true : obj.obj -true ? true : ok && ok -true and false ? b : obj -true and obj.a -true and obj.b -true and obj.head(obj.obj) -true and obj.obj -true and obj?.a -true and obj?.a >= b -true and obj?.b -true and obj?.obj -true and obj?.obj == ok -true and obj?.obj.obj -true and ok and obj?.head(div) -true or obj.a -true or obj.a.a -true or obj.a.obj -true or obj.b -true or obj.fn(a?.obj, b?.b, ok) -true or obj.fn(b, add(add)?.obj).a -true or obj.fn(div?.fn(add), ok?.head(div, b)) -true or obj.fn(join(b)) -true or obj.fn(s != add) -true or obj.head(add?.a, false > div) -true or obj.head(any(f, ok)) -true or obj.head(div(arr != b, add(add), 2 != arr, div || ok), b[b] >= ok > s, fromJSON(get(obj))) -true or obj.head(duration(f.a)) -true or obj.head(filter(div, a) endsWith div.fn(obj, s, obj, b), arr.obj.obj, not b or a ? ok : true) -true or obj.head(join(1)) -true or obj.head(none(ok?.b, count(0, 0.5))) -true or obj.obj -true or obj.obj.a?.obj -true or obj.obj?.head(map(0.5, f) matches one(obj, "c")) -true or obj?.a -true or obj?.a.fn(ok + b?.fn(obj)) -true or obj?.a.head("c" * b matches not div) -true or obj?.a?.a -true or obj?.b -true or obj?.fn(arr.b && obj?.head(b), ok.fn(obj .. arr)) -true or obj?.fn(div(b, arr) and obj?.b, obj[add(b)]) -true or obj?.fn(f, f).a -true or obj?.fn(hasPrefix(add(ok))) -true or obj?.fn(map(not ok, "b" < add), map("b" && a, one(0, add))) -true or obj?.head(add(f)) -true or obj?.head(one(none(add, add), add?.b)) -true or obj?.obj -true or obj?.obj.head(get(add(s), div)) -true or ok || obj.a -true || obj.a -true || obj.a.a -true || obj.b -true || obj.fn((add || div) - b) -true || obj.fn(arr, any(add(arr, ok, div), 0 startsWith false)) -true || obj.head(a?.fn(arr contains b, div?.head(0, add, false), obj.head(0.5), values(f), s.b))?.a -true || obj.head(add(abs(b))) -true || obj.head(add(ok.obj), any(add, f) != obj.head(b, add, arr)) -true || obj.head(all(f, 0), div("a", true)) -true || obj.head(count("a", obj)) -true || obj.head(f.b) -true || obj.head(f?.fn(0) <= b.b) -true || obj.head(filter(add.head(s), map(s, 0.5))) -true || obj.head(obj.b) -true || obj.head(obj?.fn(b)) -true || obj.obj -true || obj.obj == add -true || obj.obj.a -true || obj.obj?.b -true || obj.obj?.obj -true || obj?.a -true || obj?.b -true || obj?.fn(a?.head(div(div)), 2 .. add?.b) -true || obj?.fn(div * a == ok?.b) -true || obj?.fn(div(0.5 && 0.5, s?.head(0.5))).a -true || obj?.fn(get(a, arr)) -true || obj?.head(all(f.b, #)) -true || obj?.head(div(nil, "b"), add(nil, f)) -true || obj?.head(repeat(now(true, div, b, ok)), now(s, div(add, "c"))).a -true || obj?.head(true == nil) -true || obj?.obj -true || true or obj.obj -upper("a" + "a") -upper("a") startsWith s -upper("b") < s -upper("b") <= s -upper("c") <= s -upper(f >= 2 ? b : s) -upper(false ? 0.5 : s) -upper(lower(s)) -upper(obj.head(s)) -upper(obj.head(s, arr, obj)) -upper(obj.head(s, ok)) -upper(obj?.head("a")) -upper(obj?.head("b")) -upper(obj?.head(s)) -upper(obj?.head(s, f)) -upper(ok ? s : ok) -upper(s + s) -upper(s) -upper(s) <= s -upper(s) matches s -upper(string("a")) -upper(string("b")) -upper(string(0)) +trimSuffix(trim("bar")) +trimSuffix(trim("foo")) +trimSuffix(trimPrefix("bar")) +trimSuffix(trimPrefix("foo")) +trimSuffix(trimSuffix("foo")) +trimSuffix(type("bar")) +trimSuffix(type("foo")) +trimSuffix(type(0.5)) +trimSuffix(type(1)) +trimSuffix(type(add)) +trimSuffix(type(array)) +trimSuffix(type(div)) +trimSuffix(type(f32)) +trimSuffix(type(f64)) +trimSuffix(type(false)) +trimSuffix(type(foo)) +trimSuffix(type(half)) +trimSuffix(type(i)) +trimSuffix(type(i32)) +trimSuffix(type(i64)) +trimSuffix(type(list)) +trimSuffix(type(nil)) +trimSuffix(type(ok)) +trimSuffix(type(true)) +trimSuffix(upper("bar")) +trimSuffix(upper("foo")) +true != nil || true != nil +true == nil && ok +true ? "bar" : 0.5 ^ i +true ? "bar" : 1 <= 1 / 1 +true ? "bar" : i != i32 +true ? "foo" : foo?.Bar +true ? 0.5 : foo.Qux +true ? 1 : f64 + f32 +true ? 1 : nil == array +true ? array : foo.Qux +true ? array : foo.String +true ? array : i32 / i32 +true ? array : nil != map(list, #) +true ? array : nil != ok +true ? f32 : f64 == i32 +true ? f64 : foo?.String +true ? greet : 0.5 == i +true ? i : 0.5 + i64 +true ? i : 0.5 >= i64 +true ? i32 : foo.Bar +true ? i64 : foo.Bar +true ? list : f64 / f64 +true ? nil : 0.5 != i32 +true ? nil : foo.Qux +true ? nil : foo.String +true ? nil : i32 .. i +true ? nil : i64 ** -i +true ? ok : f32 / f32 +true ? ok : f64 + f64 +true ? score : foo.Qux +true ? true : f32 >= i64 +true ? true : foo?.String +true and ok and ok +true || 1 not in array +type(!false) +type(!ok) +type(!true) +type("bar" != nil) +type("bar" + "foo") +type("bar" < "bar") +type("bar" <= "bar") +type("bar" <= "foo") +type("bar" == nil) +type("bar" > "foo") +type("bar" endsWith "foo") +type("bar" matches "bar") +type("bar" matches "foo") +type("bar" not contains "bar") +type("bar" not endsWith "bar") +type("bar" not endsWith "foo") +type("bar" startsWith "foo") +type("bar") == string(array) +type("foo" != "bar") +type("foo" == "foo") +type("foo" > "bar") +type("foo" contains "foo") +type("foo" endsWith "foo") +type("foo" in foo) +type("foo" not endsWith "bar") +type("foo" not endsWith "foo") +type("foo" startsWith "foo") +type("foo" startsWith foo.Bar) +type(-0.5) +type(-1) +type(-f32) +type(-f64) +type(-i) +type(-i32) +type(-i64) +type(0.5 != 0.5) +type(0.5 != 1) +type(0.5 != i) +type(0.5 != i32) +type(0.5 != nil) +type(0.5 * 0.5) +type(0.5 * 1) +type(0.5 * i) +type(0.5 * i32) +type(0.5 * i64) +type(0.5 ** 0.5) +type(0.5 ** 1) +type(0.5 ** f32) +type(0.5 ** i) +type(0.5 ** i32) +type(0.5 ** i64) +type(0.5 + f32) +type(0.5 + i32) +type(0.5 + i64) +type(0.5 - 0.5) +type(0.5 - i) +type(0.5 / 0.5) +type(0.5 / 1) +type(0.5 / f64) +type(0.5 / i) +type(0.5 < 1) +type(0.5 < f64) +type(0.5 < i) +type(0.5 < i64) +type(0.5 <= 1) +type(0.5 <= f32) +type(0.5 <= i) +type(0.5 <= i64) +type(0.5 == 1) +type(0.5 == i) +type(0.5 == nil) +type(0.5 > 0.5) +type(0.5 > 1) +type(0.5 > f64) +type(0.5 > i) +type(0.5 >= 0.5) +type(0.5 >= 1) +type(0.5 >= f64) +type(0.5 >= i) +type(0.5 >= i32) +type(0.5 ^ 0.5) +type(0.5 ^ 1) +type(0.5 ^ f32) +type(0.5 ^ f64) +type(0.5 ^ i) +type(0.5) not contains trimPrefix("bar") +type(0.5) not in foo +type(0.5) startsWith "bar" == nil +type(0.5)[i32:i64] +type(1 != 0.5) +type(1 != 1) +type(1 != f32) +type(1 != i32) +type(1 != nil) +type(1 % 1) +type(1 % i) +type(1 % i32) +type(1 % i64) +type(1 * 1) +type(1 * f32) +type(1 * i) +type(1 * i64) +type(1 ** 0.5) +type(1 ** 1) +type(1 ** f64) +type(1 ** i32) +type(1 ** i64) +type(1 + 0.5) +type(1 + f32) +type(1 + f64) +type(1 + i64) +type(1 - 0.5) +type(1 - 1) +type(1 - f64) +type(1 - i32) +type(1 .. 1) +type(1 .. i) +type(1 .. i64) +type(1 / 1) +type(1 / f32) +type(1 / f64) +type(1 < 1) +type(1 < f32) +type(1 < i) +type(1 <= f32) +type(1 <= f64) +type(1 <= i32) +type(1 <= i64) +type(1 == 1) +type(1 == i) +type(1 == i64) +type(1 == nil) +type(1 > 0.5) +type(1 > 1) +type(1 > f32) +type(1 > f64) +type(1 >= 0.5) +type(1 >= 1) +type(1 >= f64) +type(1 >= i) +type(1 >= i32) +type(1 >= i64) +type(1 ^ 0.5) +type(1 ^ f32) +type(1 ^ i64) +type(1 in array) +type(1 not in array) +type(1) != toJSON(0.5) +type(1) == nil ? 1 : f64 +type(1) endsWith greet("foo") +type(1) in foo +type(1) in foo != true +type(1) not contains type(nil) +type(1) not endsWith toJSON(ok) +type([half, 1]) +type([nil]) +type(abs(0.5)) +type(abs(1)) +type(abs(f64)) +type(abs(i)) +type(abs(i32)) +type(abs(i64)) +type(add != add) +type(add != greet) +type(add != half) +type(add == half) +type(add == nil) +type(add(1, 1)) +type(add) +type(add) in foo +type(all(array, true)) +type(all(list, false)) +type(any(array, false)) +type(any(list, true)) +type(array == array) +type(array == list) +type(array) +type(array) in foo +type(array) not in foo +type(array[1]) +type(array[i32]) +type(array[i]) +type(count(list, ok)) +type(count(list, true)) +type(div != div) +type(div != half) +type(div != nil) +type(div == add) +type(div == greet) +type(div == half) +type(div) +type(div) not in foo +type(f32 != 0.5) +type(f32 != 1) +type(f32 != f32) +type(f32 != i32) +type(f32 * 0.5) +type(f32 * 1) +type(f32 * f32) +type(f32 * f64) +type(f32 * i) +type(f32 * i64) +type(f32 ** 0.5) +type(f32 ** 1) +type(f32 ** f32) +type(f32 ** i) +type(f32 ** i32) +type(f32 + 0.5) +type(f32 + 1) +type(f32 + f64) +type(f32 + i) +type(f32 + i64) +type(f32 - 0.5) +type(f32 - 1) +type(f32 - f32) +type(f32 - i) +type(f32 - i32) +type(f32 - i64) +type(f32 < 1) +type(f32 < f64) +type(f32 < i32) +type(f32 <= 0.5) +type(f32 <= 1) +type(f32 <= i64) +type(f32 == 0.5) +type(f32 == 1) +type(f32 == i32) +type(f32 > 1) +type(f32 > f32) +type(f32 > f64) +type(f32 >= 0.5) +type(f32 ^ 0.5) +type(f32 ^ f32) +type(f32 ^ f64) +type(f32 ^ i32) +type(f32 ^ i64) +type(f32) +type(f64 != f64) +type(f64 != i64) +type(f64 * 0.5) +type(f64 * 1) +type(f64 * i32) +type(f64 * i64) +type(f64 ** 0.5) +type(f64 ** 1) +type(f64 ** f32) +type(f64 ** i) +type(f64 ** i32) +type(f64 + 0.5) +type(f64 + f64) +type(f64 + i) +type(f64 - 0.5) +type(f64 - f32) +type(f64 - f64) +type(f64 - i) +type(f64 / 1) +type(f64 / i) +type(f64 < 0.5) +type(f64 < 1) +type(f64 < f64) +type(f64 < i64) +type(f64 <= 0.5) +type(f64 <= i) +type(f64 <= i32) +type(f64 == 1) +type(f64 == f64) +type(f64 == nil) +type(f64 > 1) +type(f64 > f64) +type(f64 > i) +type(f64 > i32) +type(f64 >= 0.5) +type(f64 >= 1) +type(f64 ^ 1) +type(f64 ^ f64) +type(f64 ^ i) +type(f64 ^ i32) +type(f64 ^ i64) +type(f64) +type(false != nil) +type(false && true) +type(false == ok) +type(false ? add : div) +type(false ? half : i) +type(false ? half : i32) +type(false ? i32 : 1) +type(false ? i32 : true) +type(false ? list : "foo") +type(false || ok) +type(false) not contains toJSON(i) +type(filter(array, true)) +type(filter(list, false)) +type(find([f64], "foo" == nil)) +type(find(array, false)) +type(find(list, false)) +type(findIndex(array, false)) +type(findIndex(list, ok)) +type(findIndex(list, true)) +type(findLast(array, false)) +type(findLast(array, ok)) +type(findLast(list, false)) +type(findLastIndex(array, ok)) +type(findLastIndex(array, true)) +type(findLastIndex(list, ok)) +type(first(array)) +type(first(list)) +type(float(0.5)) +type(float(1)) +type(float(f32)) +type(float(f64)) +type(float(i)) +type(float(i32)) +type(float(i64)) +type(foo != foo) +type(foo in list) +type(foo) +type(foo) in foo +type(foo.Bar) +type(foo.Qux) +type(foo.String()) +type(foo.String) +type(foo?.Bar) +type(foo?.Qux) +type(foo?.String()) +type(foo?.String) +type(get(array, 1)) +type(get(array, i)) +type(get(array, i32)) +type(get(list, 1)) +type(get(list, i32)) +type(greet != div) +type(greet != half) +type(greet != score) +type(greet == div) +type(greet == greet) +type(greet == half) +type(greet("bar")) +type(greet("foo")) +type(greet(lower("foo"))) +type(greet) +type(greet) not in foo +type(half != add) +type(half != nil) +type(half == add) +type(half == div) +type(half(0.5)) +type(half(f64)) +type(half) +type(half) endsWith toJSON(1) +type(i != 0.5) +type(i != 1) +type(i != f32) +type(i != i64) +type(i % 1) +type(i * 0.5) +type(i * i64) +type(i ** 0.5) +type(i ** 1) +type(i ** f32) +type(i ** f64) +type(i ** i) +type(i ** i32) +type(i + 1) +type(i + i) +type(i + i32) +type(i .. i64) +type(i / 0.5) +type(i / 1) +type(i < f32) +type(i < i64) +type(i == f32) +type(i == i32) +type(i == i64) +type(i > f64) +type(i >= 1) +type(i >= f32) +type(i >= f64) +type(i ^ 0.5) +type(i ^ 1) +type(i ^ f32) +type(i ^ f64) +type(i ^ i64) +type(i not in array) +type(i) +type(i) not endsWith greet("foo") +type(i32 != 0.5) +type(i32 != 1) +type(i32 != nil) +type(i32 % 1) +type(i32 % i64) +type(i32 * 0.5) +type(i32 * 1) +type(i32 * i32) +type(i32 * i64) +type(i32 ** f32) +type(i32 ** f64) +type(i32 ** i) +type(i32 + 1) +type(i32 + f32) +type(i32 + f64) +type(i32 + i) +type(i32 + i32) +type(i32 + i64) +type(i32 - f32) +type(i32 - i32) +type(i32 .. 1) +type(i32 .. i) +type(i32 / f64) +type(i32 / i32) +type(i32 < 1) +type(i32 < f32) +type(i32 < i) +type(i32 < i64) +type(i32 <= f64) +type(i32 <= i32) +type(i32 <= i64) +type(i32 == 0.5) +type(i32 == 1) +type(i32 == f32) +type(i32 == f64) +type(i32 == i) +type(i32 == i64) +type(i32 > 0.5) +type(i32 > 1) +type(i32 > f64) +type(i32 > i32) +type(i32 >= 1) +type(i32 >= f32) +type(i32 >= i) +type(i32 >= i32) +type(i32 ^ 0.5) +type(i32 ^ i) +type(i32 ^ i32) +type(i32 ^ i64) +type(i32 in array) +type(i32) +type(i32) startsWith greet("foo") +type(i64 != 1) +type(i64 != array[i32]) +type(i64 != f32) +type(i64 != i) +type(i64 != nil) +type(i64 % i) +type(i64 % i64) +type(i64 * 0.5) +type(i64 * f32) +type(i64 * f64) +type(i64 * i64) +type(i64 ** 1) +type(i64 + 0.5) +type(i64 + f64) +type(i64 + i) +type(i64 + i64) +type(i64 - 0.5) +type(i64 .. 1) +type(i64 .. i32) +type(i64 .. i64) +type(i64 / 0.5) +type(i64 / 1) +type(i64 / i) +type(i64 / i64) +type(i64 < 1) +type(i64 < f64) +type(i64 < i) +type(i64 < i64) +type(i64 <= 1) +type(i64 <= f32) +type(i64 <= i64) +type(i64 == i32) +type(i64 == nil) +type(i64 > f64) +type(i64 >= 0.5) +type(i64 >= f32) +type(i64 >= i) +type(i64 >= i64) +type(i64 ^ 0.5) +type(i64 ^ 1) +type(i64 ^ f32) +type(i64 ^ f64) +type(i64 ^ i) +type(i64 ^ i32) +type(i64 in array) +type(i64 not in array) +type(i64) +type(i64) != foo?.Bar +type(i64) contains string(foo) ? i : array +type(i64) not in foo +type(i64) not startsWith lower("foo") +type(int(0.5)) +type(int(1)) +type(int(f32)) +type(int(f64)) +type(int(i)) +type(int(i32)) +type(int(i64) <= f32) +type(int(i64)) +type(last(array)) +type(last(list)) +type(len("bar")) +type(len("foo")) +type(len(array)) +type(len(list)) +type(list == array) +type(list == nil) +type(list) +type(list[1]) +type(list[i32]) +type(list[i64]) +type(list[i]) +type(lower("bar")) +type(lower("foo")) +type(lower(string(nil))) +type(map(array, "foo")) +type(map(array, #)) +type(map(array, 0.5)) +type(map(array, add)) +type(map(array, array)) +type(map(array, false)) +type(map(array, foo)) +type(map(array, half)) +type(map(array, i)) +type(map(array, i64)) +type(map(array, ok)) +type(map(i .. i32, i64)) +type(map(list, #)) +type(map(list, 0.5)) +type(map(list, 1)) +type(map(list, array)) +type(map(list, f32)) +type(map(list, f64)) +type(map(list, foo)) +type(map(list, greet)) +type(map(list, i)) +type(map(list, list)) +type(map(list, ok)) +type(max(0.5)) +type(max(1)) +type(max(f32)) +type(max(f32, i32)) +type(max(f64)) +type(max(f64, 0.5)) +type(max(i)) +type(max(i32)) +type(max(i32, i64)) +type(max(i64)) +type(min(0.5)) +type(min(1)) +type(min(1, 0.5)) +type(min(1, 1, f32)) +type(min(f32)) +type(min(f64)) +type(min(i)) +type(min(i, 1)) +type(min(i32)) +type(min(i32, 0.5)) +type(min(i64)) +type(nil != "bar") +type(nil != 0.5) +type(nil != 1) +type(nil != div) +type(nil != f64) +type(nil != false) +type(nil != foo) +type(nil != greet) +type(nil != i32) +type(nil != nil) +type(nil != ok) +type(nil == "bar") +type(nil == "foo") +type(nil == 0.5) +type(nil == 1) +type(nil == add) +type(nil == array) +type(nil == f32) +type(nil == f64) +type(nil == i) +type(nil == i32) +type(nil == nil) +type(nil == ok) +type(nil == score) +type(nil == true) +type(nil in array) +type(nil not in array) +type(nil) != type(1) +type(none(array, ok)) +type(none(array, true)) +type(none(list, ok)) +type(none(list, true)) +type(not false) +type(not ok) +type(not true) +type(ok != nil) +type(ok == false) +type(ok ? 0.5 : i32) +type(ok ? 0.5 : list) +type(ok ? 1 : f32) +type(ok ? add : "bar") +type(ok ? false : i64) +type(ok ? foo : false) +type(ok ? half : half) +type(ok ? i32 : f64) +type(ok ? i64 : "bar") +type(ok ? list : "foo") +type(ok ? ok : half) +type(ok ? true : false) +type(ok and ok) +type(ok and true) +type(ok or false) +type(ok or true) +type(ok || true) +type(ok) +type(ok) in foo +type(ok) not matches string(i64) +type(ok) not startsWith lower("bar") +type(score != div) +type(score != greet) +type(score != half) +type(score != nil) +type(score == add) +type(score == foo.String) +type(score == greet) +type(score == half) +type(score == nil) +type(score == score) +type(score(1)) +type(score(i)) +type(score(i, 1)) +type(score) +type(score) < foo?.Bar +type(score) > string(score) +type(score) in foo +type(score) not contains type(1) +type(sort(array)) +type(string("bar")) +type(string("foo")) +type(string(0.5)) +type(string(1)) +type(string(add)) +type(string(array)) +type(string(div)) +type(string(f64)) +type(string(false)) +type(string(foo)) +type(string(greet)) +type(string(half)) +type(string(i <= i32)) +type(string(i)) +type(string(i64)) +type(string(list)) +type(string(nil)) +type(string(ok)) +type(string(score)) +type(toBase64("foo")) +type(toJSON("bar")) +type(toJSON("foo")) +type(toJSON(0.5 < i)) +type(toJSON(0.5)) +type(toJSON(1)) +type(toJSON(array)) +type(toJSON(f32)) +type(toJSON(f64)) +type(toJSON(false)) +type(toJSON(foo)) +type(toJSON(i32)) +type(toJSON(i64)) +type(toJSON(list)) +type(toJSON(nil)) +type(toJSON(ok)) +type(toJSON(true)) +type(trim("bar")) +type(trim("foo")) +type(trimPrefix("foo")) +type(trimPrefix(toJSON(true))) +type(trimSuffix("bar")) +type(true == false) +type(true == nil) +type(true ? "bar" : 0.5) +type(true ? div : 0.5) +type(true ? f64 : array) +type(true ? foo : foo) +type(true ? foo : true) +type(true ? greet : "foo") +type(true ? list : ok) +type(true ? nil : list) +type(true ? nil : ok) +type(true ? true : 1) +type(true and true) +type(true) endsWith toBase64("foo") +type(type("bar")) +type(type("foo")) +type(type(0.5)) +type(type(1)) +type(type(add)) +type(type(array)) +type(type(div)) +type(type(f32)) +type(type(f64)) +type(type(false)) +type(type(foo)) +type(type(half)) +type(type(i)) +type(type(i32)) +type(type(i64)) +type(type(list)) +type(type(nil)) +type(type(ok)) +type(type(score)) +type(type(true)) +type(upper("bar")) +type(upper("foo")) +type({"bar": 0.5}) +type({"bar": 1}) +type({"bar": greet}) +type({"foo": 0.5, "bar": foo}) +type({"foo": div}) +type({"foo": i64}) +type({"foo": nil}) +upper("bar" + "foo") +upper("bar") <= type(nil) +upper("bar") contains lower("foo") +upper("foo" + "bar") +upper(false ? 0.5 : "foo") +upper(foo.Bar) +upper(foo.String()) +upper(foo?.Bar) +upper(foo?.String()) +upper(greet("foo")) +upper(greet(string(ok))) +upper(lower("bar")) +upper(ok ? "bar" : i) +upper(string("bar")) +upper(string("foo")) upper(string(0.5)) -upper(string(a)) -upper(string(add)) -upper(string(b)) -upper(string(f)) +upper(string(1)) +upper(string(array)) +upper(string(div)) +upper(string(f32)) +upper(string(f64)) +upper(string(foo)) +upper(string(greet)) +upper(string(half)) +upper(string(i)) +upper(string(i32)) +upper(string(i64)) +upper(string(list)) upper(string(nil)) -upper(string(obj)) upper(string(ok)) +upper(string(score)) +upper(string(string(0.5))) upper(string(true)) -upper(toBase64("c")) -upper(toBase64(s)) -upper(toJSON("c")) -upper(toJSON(2)) -upper(toJSON(a)) -upper(toJSON(arr)) -upper(toJSON(f)) +upper(toBase64("foo")) +upper(toJSON("foo")) +upper(toJSON(0.5)) +upper(toJSON(1)) +upper(toJSON(array)) +upper(toJSON(f32)) +upper(toJSON(f64)) upper(toJSON(false)) +upper(toJSON(foo)) +upper(toJSON(i)) +upper(toJSON(i32)) +upper(toJSON(i64)) +upper(toJSON(list)) +upper(toJSON(nil)) upper(toJSON(ok)) -upper(toJSON(s)) upper(toJSON(true)) -upper(trim("c")) -upper(trim(s)) -upper(trimPrefix(s)) -upper(trimSuffix("a")) -upper(trimSuffix(s)) -upper(upper(s)) -values(obj) -values(obj) != obj?.obj -values(obj)[a] -{"a": "a", "c": a}.obj -{"a": "a"}?.obj -{"a": "c"}?.a -{"a": 0 > b} -{"a": 0, "a": "a", "a": nil, "c": ok}.b -{"a": 0, "b": f}.obj -{"a": 0, "c": 0.5}.a -{"a": 0.5, "a": s}?.b -{"a": 0.5, "b": b}?.obj -{"a": 0.5, "b": obj}?.obj -{"a": 0.5, "c": a}.b -{"a": 0.5, "c": false, "c": arr, "c": obj}.b -{"a": 0}.b -{"a": 0}?.a -{"a": 0}?.b -{"a": 0}?.obj -{"a": 1}.b -{"a": 1}.obj -{"a": 2 >= 1} -{"a": 2, "a": obj, "b": ok}?.obj -{"a": 2, "b": a, "b": f}.b -{"a": 2}.b -{"a": a - 1} -{"a": a / 0.5} -{"a": a, "a": arr} -{"a": a, "a": b, "a": "b", "c": f, "c": ok}?.obj -{"a": a, "a": div}?.obj?.a -{"a": a, "a": ok}?.b -{"a": a, "b": obj?.b} -{"a": a, "c": add, "c": nil}?.obj?.b -{"a": a, "c": obj.a} -{"a": a, "c": s, "b": nil}?.a -{"a": add(b, 2)} -{"a": add(b, b)} -{"a": add, "a": ok ? add : obj}?.b -{"a": add, "a": s, "b": div}.b -{"a": add} -{"a": add}.a -{"a": arr, "b": 1, "c": 0.5, "b": f}?.b -{"a": arr, "c": arr} -{"a": arr} -{"a": arr} == obj -{"a": arr}.a -{"a": arr}.b -{"a": a} -{"a": a}.obj -{"a": a}?.a -{"a": a}?.obj -{"a": b + b} -{"a": b - a} -{"a": b - f} -{"a": b / b} -{"a": b, "a": obj, "a": div}?.b -{"a": b, "a": ok} -{"a": b, "b": a, "c": 0}?.b -{"a": b, "b": s, "b": s}.b -{"a": b, "c": "b"}.a -{"a": b, "c": b}?.a -{"a": b} -{"a": b}.a -{"a": b}.b -{"a": b}.obj -{"a": b}?.a -{"a": b}?.b -{"a": b}?.obj -{"a": b}?.obj?.obj -{"a": div == nil} -{"a": div, "a": b, "c": nil, "a": 0}?.obj -{"a": div, "a": ok, "b": s}.a -{"a": div, "b": arr}.b -{"a": div, "c": nil}.a -{"a": div, "c": true}.b -{"a": div} -{"a": div}.b -{"a": div}.obj -{"a": div}?.obj -{"a": f, "a": add}.b -{"a": f, "a": obj}?.b -{"a": f, "b": div(b, a)} -{"a": false, "b": 1}?.b -{"a": false}.obj -{"a": f} -{"a": f}.a -{"a": f}.obj -{"a": f}?.a -{"a": f}?.obj -{"a": map(arr, a)} -{"a": map(arr, obj)} -{"a": nil, "a": b}.a -{"a": nil, "b": 1}?.b -{"a": nil}.obj -{"a": nil}?.a -{"a": obj, "a": arr}.a -{"a": obj, "a": nil}?.b -{"a": obj, "b": obj?.obj, "a": add} -{"a": obj, "b": obj}.b -{"a": obj, "c": f, "a": true}.obj -{"a": obj, "c": false, "b": arr, "b": "b"}?.a -{"a": obj.a} -{"a": obj.b} -{"a": obj.head(b, ok, nil)} -{"a": obj.obj} -{"a": obj?.a} -{"a": obj?.head(arr)} -{"a": obj?.head(b)} -{"a": obj?.head(f)} -{"a": obj?.head(obj, nil, s, false)} -{"a": obj?.obj}.b -{"a": obj} -{"a": obj}.b -{"a": obj}.obj -{"a": obj}?.b -{"a": ok, "b": f} -{"a": ok, "b": ok}?.obj -{"a": ok} -{"a": ok}.a -{"a": ok}.b -{"a": ok}?.a -{"a": ok}?.obj -{"a": s, "a": "a", "a": b}.a -{"a": s, "a": arr}?.obj -{"a": s, "a": b}.obj -{"a": s, "a": obj}.b -{"a": s, "b": nil, "c": add}?.b?.obj -{"a": s, "c": div}.obj -{"a": s, "c": div}?.a -{"a": string(f)} -{"a": s} -{"a": s}.a -{"a": toBase64("a")} -{"a": true || true} -{"a": true}.a -{"a": true}.b -{"a": true}?.a -{"b": "a", "a": "b", "a": add}.a -{"b": "a", "b": add, "a": div}?.obj -{"b": "a"}?.a -{"b": "b", "b": "b"}.a -{"b": "b", "b": arr, "b": a}.obj -{"b": "b", "b": true}?.a -{"b": "c", "b": "a"}.a -{"b": 0 == a, "a": ok} -{"b": 0, "c": arr}.b -{"b": 0.5, "b": arr, "a": 0}?.b -{"b": 0.5, "c": f, "b": div, "c": ok}?.b -{"b": 0.5, "c": ok}.b -{"b": 0}.obj -{"b": 0}.obj?.obj != div -{"b": 0}?.a -{"b": 0}?.obj -{"b": 1 .. a} -{"b": 1 < b} -{"b": 1, "c": f}?.a -{"b": 1}.a -{"b": 2, "b": a}?.a -{"b": 2}?.b -{"b": a, "a": add} -{"b": a, "a": false, "c": arr}.obj -{"b": a, "c": b != a} -{"b": add, "a": a, "a": div, "a": nil, "a": a}.obj -{"b": add, "a": true, "b": 0, "c": 0.5, "b": nil}.obj -{"b": add, "b": ok}?.a -{"b": add, "b": s}.b -{"b": add} -{"b": add}.b -{"b": add}.obj?.obj -{"b": add}?.obj -{"b": arr, "a": arr, "b": add}?.obj -{"b": arr, "a": div} -{"b": arr, "b": add} -{"b": arr, "b": f, "b": arr, "b": 0}?.b -{"b": arr, "c": f, "a": nil}[s]?.a -{"b": arr} -{"b": arr}?.a -{"b": a} -{"b": a}.a -{"b": a}.b -{"b": a}?.obj -{"b": b .. b} -{"b": b < f} -{"b": b == a} -{"b": b, "a": ok}?.a -{"b": b, "b": 0, "b": b}.obj -{"b": b, "b": a}?.a -{"b": b, "b": div, "b": arr, "b": add}.a -{"b": b, "b": obj.obj} -{"b": b, "c": a}.obj -{"b": b} -{"b": b}.a -{"b": b}.obj -{"b": b}?.a -{"b": b}?.obj -{"b": div, "a": a > a} -{"b": div, "a": arr, "a": obj, "c": 0}.a -{"b": div, "b": add}?.b -{"b": div, "c": ok, "c": 2}?.obj -{"b": div} -{"b": div}.b -{"b": div}?.a -{"b": div}?.obj -{"b": f != 0} -{"b": f <= 0.5} -{"b": f, "a": false}?.a -{"b": f, "b": add}?.obj -{"b": f, "b": s}?.obj -{"b": f, "c": arr, "b": div}?.obj -{"b": f, "c": arr, "b": f}.a -{"b": f, "c": f}?.a -{"b": false ? 0 : 2} -{"b": false, "a": obj}.b -{"b": false, "c": s}.a -{"b": f} -{"b": f}?.a?.a -{"b": f}?.obj -{"b": nil == nil, "c": obj?.obj}?.b -{"b": nil, "a": f, "b": "c"}.obj -{"b": nil, "a": f, "c": 1}.obj -{"b": nil, "a": obj, "a": f}.a -{"b": nil, "a": obj}.b -{"b": nil, "b": b}.b -{"b": nil, "b": div}.b -{"b": nil, "b": true}.b -{"b": nil, "c": div, "c": div}.b -{"b": nil}.obj -{"b": nil}?.a -{"b": not ok, "a": a} -{"b": not ok} -{"b": obj != obj.b} -{"b": obj, "a": add, "c": s}.a -{"b": obj, "a": a}?.obj -{"b": obj, "c": f, "b": nil}?.a -{"b": obj.a} -{"b": obj.b} -{"b": obj.head("b")} -{"b": obj.head(nil, b, obj)} -{"b": obj.head(s)} -{"b": obj.obj} -{"b": obj?.a} -{"b": obj?.b} -{"b": obj} -{"b": obj}.b -{"b": obj}.b?.a -{"b": obj}.obj -{"b": obj}?.b -{"b": ok, "a": a}.obj -{"b": ok, "a": b}.obj -{"b": ok, "c": 1, "c": f}?.a -{"b": ok} -{"b": ok}.obj -{"b": ok}?.a -{"b": s, "a": b, "c": obj, "b": f}?.obj -{"b": s, "b": 0, "b": nil, "c": 0}?.a -{"b": s, "b": f}?.obj -{"b": s, "c": "a", "b": div, "c": 1}.b -{"b": string(div)} -{"b": s} -{"b": s}.a -{"b": s}?.a -{"b": true ? obj : add} -{"b": true, "b": arr, "a": add} == obj ? add : b -{"b": true}.obj -{"b": true}?.obj -{"c": "a", "a": obj, "c": "b"}?.b?.obj?.b -{"c": "a", "c": obj}.b -{"c": "a"}?.a -{"c": "b", "b": false}?.obj -{"c": "b"}.a -{"c": "b"}.obj -{"c": "b"}?.obj -{"c": "c"}?.obj?.fn(arr) -{"c": 0 ** 0, "c": ok ? arr : f} -{"c": 0, "a": s, "c": add}.b -{"c": 0, "c": 0, "a": "b", "b": false}.b -{"c": 0, "c": f, "b": false}?.obj -{"c": 0, "c": f}.a -{"c": 0, "c": obj}?.a?.a -{"c": 0, "c": s, "b": s, "c": false, "b": obj}.a -{"c": 0.5, "b": b, "c": a, "b": 2}?.b -{"c": 0.5, "c": b, "b": 0}.b -{"c": 0.5, "c": true, "a": true}.b -{"c": 0}.b -{"c": 0}.obj -{"c": 1, "b": ok}?.b -{"c": 1}?.a -{"c": 2, "a": "c"}.b -{"c": 2}.a -{"c": 2}?.b -{"c": a != 1} -{"c": a .. 2}.obj -{"c": a / 0} -{"c": a <= 1} -{"c": a, "a": arr}?.obj -{"c": a, "a": b, "b": div, "b": f, "b": div}.b -{"c": a, "b": ok ? "c" : div} -{"c": a, "b": s, "a": s, "c": b, "a": add}.obj -{"c": a, "c": true}?.obj -{"c": abs(a)} -{"c": add, "a": true, "b": s}?.a -{"c": add, "b": 0, "b": b, "b": 1}?.obj -{"c": add, "b": 0.5, "c": arr}?.obj -{"c": add, "b": a, "b": s}?.a -{"c": add, "b": arr}?.obj -{"c": add, "b": obj, "b": false}?.b -{"c": add, "b": ok, "b": f, "b": s}.a -{"c": add, "c": arr} -{"c": add, "c": b}?.b -{"c": add} -{"c": add}.a?.obj -{"c": add}.b -{"c": add}.obj -{"c": add}?.a -{"c": arr != nil} -{"c": arr == arr} -{"c": arr, "a": nil, "b": b}.obj -{"c": arr, "c": arr}?.a -{"c": arr, "c": s}.obj -{"c": arr} -{"c": arr}.a -{"c": arr}.obj -{"c": arr}?.b -{"c": arr}?.obj -{"c": arr}?.obj?.b -{"c": a} -{"c": a}.a -{"c": a}.obj -{"c": a}?.a -{"c": b % a} -{"c": b, "a": obj, "b": 0.5, "a": obj, "a": s}.b -{"c": b, "c": "c", "a": f, "b": div, "c": b}?.obj -{"c": b, "c": f, "a": arr}?.b -{"c": b} -{"c": b}.a -{"c": b}.obj -{"c": b}?.b -{"c": b}?.obj -{"c": div, "a": a} -{"c": div, "a": ok, "b": obj}?.obj -{"c": div, "b": add}.obj -{"c": div, "b": b, "a": arr, "b": true}.b -{"c": div, "c": ok}?.a -{"c": div} -{"c": div}.a -{"c": div}.b -{"c": div}.obj -{"c": div}?.b -{"c": f - f} -{"c": f, "a": "b", "b": "a", "b": 0.5}?.b -{"c": f, "b": 0.5}.b -{"c": f, "b": add, "a": a}.b -{"c": f, "b": obj, "b": 2}?.obj -{"c": false}?.b -{"c": first(arr)}.a -{"c": f} -{"c": f}.a -{"c": f}.obj -{"c": f}?.a -{"c": f}?.obj -{"c": get(arr, a), "a": a != nil} -{"c": get(arr, b)} -{"c": get(obj, s)} -{"c": nil, "a": false, "c": arr, "a": f, "a": nil}.b -{"c": nil, "b": false}?.a -{"c": nil}.a -{"c": nil}.b -{"c": nil}?.a -{"c": obj, "a": div}.b -{"c": obj, "b": b}?.a -{"c": obj, "c": add} -{"c": obj, "c": nil}?.b -{"c": obj.fn(a)} -{"c": obj.head(arr, f), "a": div, "b": s}.obj -{"c": obj.head(div)} -{"c": obj.obj} -{"c": obj?.a} -{"c": obj?.obj} -{"c": obj} -{"c": obj}.a -{"c": obj}.b -{"c": obj}.obj -{"c": obj}?.a -{"c": obj}?.b -{"c": ok and ok} -{"c": ok, "c": 0}?.a -{"c": ok} -{"c": ok}.b -{"c": s, "a": b}?.a -{"c": s, "b": a}?.b -{"c": s, "b": f}?.a -{"c": s, "b": obj, "a": div}?.a -{"c": s, "c": "c", "b": false, "a": a}?.a -{"c": s, "c": add, "b": arr, "a": ok, "b": obj}?.obj -{"c": s, "c": div}.obj -{"c": s} -{"c": s}.b -{"c": s}.obj -{"c": toBase64(s)} -{"c": toJSON(a)} -{"c": true, "c": a}.obj -{"c": true}?.b +upper(trim("bar")) +upper(trim("bar", "bar")) +upper(trim("foo")) +upper(trimPrefix("bar")) +upper(trimPrefix("foo")) +upper(trimSuffix("bar")) +upper(trimSuffix("foo")) +upper(true ? "bar" : f32) +upper(true ? "foo" : i32) +upper(type("bar")) +upper(type("foo")) +upper(type(0.5)) +upper(type(1)) +upper(type(add)) +upper(type(div)) +upper(type(f32)) +upper(type(f64)) +upper(type(false)) +upper(type(foo)) +upper(type(greet)) +upper(type(half)) +upper(type(i)) +upper(type(i64)) +upper(type(list)) +upper(type(nil)) +upper(type(score)) +upper(type(true)) +upper(upper("bar")) +values({"bar": f32}) +values({"bar": greet}) +values({"bar": i64}) +values({"foo": 1}) +values({"foo": div}) +values({"foo": false}) +values({"foo": foo, "foo": ok}) +values({"foo": list, "bar": 1}) +{"bar": !false} +{"bar": !true} +{"bar": "bar", "foo": nil}?.String +{"bar": "bar", "foo": score}.i +{"bar": "bar", "foo": true}?.i?.foo +{"bar": "bar"}.add +{"bar": "bar"}.array +{"bar": "bar"}.f32 +{"bar": "bar"}.f64 +{"bar": "bar"}.list +{"bar": "bar"}.ok +{"bar": "bar"}?.Bar +{"bar": "bar"}?.greet +{"bar": "bar"}?.half +{"bar": "bar"}?.i +{"bar": "foo", "foo": 0.5}.add +{"bar": "foo", "foo": 1}.String?.ok +{"bar": "foo", "foo": greet}.half +{"bar": "foo", "foo": ok, "bar": f64}?.Bar +{"bar": "foo", "foo": ok}.Qux +{"bar": "foo", "foo": true}.ok +{"bar": "foo"}.Qux +{"bar": "foo"}.String +{"bar": "foo"}.add +{"bar": "foo"}.array +{"bar": "foo"}.div +{"bar": "foo"}.f32 +{"bar": "foo"}.i +{"bar": "foo"}.i64 +{"bar": "foo"}.score +{"bar": "foo"}?.Qux +{"bar": "foo"}?.Qux?.score +{"bar": "foo"}?.String +{"bar": "foo"}?.div +{"bar": "foo"}?.foo +{"bar": "foo"}?.i32 +{"bar": "foo"}?.i64 +{"bar": -0.5} +{"bar": -1} +{"bar": -1}?.array +{"bar": -f32} +{"bar": 0.5 * f64} +{"bar": 0.5 + 1} +{"bar": 0.5 - i32} +{"bar": 0.5 - i64} +{"bar": 0.5 < i64} +{"bar": 0.5 == nil} +{"bar": 0.5 > 1}.Qux +{"bar": 0.5, "bar": "bar"}.ok +{"bar": 0.5, "bar": 0.5}.f32 +{"bar": 0.5, "bar": 1}?.half +{"bar": 0.5, "foo": array}?.ok +{"bar": 0.5, "foo": i32, "bar": add}?.Bar +{"bar": 0.5}.Bar +{"bar": 0.5}.Qux +{"bar": 0.5}.String +{"bar": 0.5}.add +{"bar": 0.5}.div +{"bar": 0.5}.div?.array.foo +{"bar": 0.5}.f32 +{"bar": 0.5}.f64 +{"bar": 0.5}.foo +{"bar": 0.5}.greet +{"bar": 0.5}.i32 +{"bar": 0.5}.ok +{"bar": 0.5}.score +{"bar": 0.5}?.Bar +{"bar": 0.5}?.String +{"bar": 0.5}?.add +{"bar": 0.5}?.array +{"bar": 0.5}?.div +{"bar": 0.5}?.f32 +{"bar": 0.5}?.foo +{"bar": 0.5}?.greet?.i32 +{"bar": 0.5}?.half +{"bar": 0.5}?.i +{"bar": 0.5}?.i32 +{"bar": 0.5}?.i32?.i32 +{"bar": 0.5}?.i64 +{"bar": 1 * i32} +{"bar": 1 * i} +{"bar": 1 + i32} +{"bar": 1 - f32} +{"bar": 1 / 0.5} +{"bar": 1 < f32} +{"bar": 1 <= 1} +{"bar": 1, "bar": "bar"}.i32 +{"bar": 1, "bar": array}?.f32 +{"bar": 1, "bar": false}.array +{"bar": 1, "bar": greet, "foo": "bar"}?.i64 +{"bar": 1, "bar": i64}?.array +{"bar": 1, "foo": 0.5}?.String +{"bar": 1, "foo": add, "foo": f32}?.i +{"bar": 1, "foo": foo}.div +{"bar": 1, "foo": i64}.i64 +{"bar": 1}.Bar +{"bar": 1}.Qux +{"bar": 1}.String +{"bar": 1}.add +{"bar": 1}.div +{"bar": 1}.f64 +{"bar": 1}.greet +{"bar": 1}.half +{"bar": 1}.i +{"bar": 1}.ok +{"bar": 1}?.Bar +{"bar": 1}?.add +{"bar": 1}?.add?.i32 +{"bar": 1}?.div?.list +{"bar": 1}?.f32 +{"bar": 1}?.f64 +{"bar": 1}?.i +{"bar": 1}?.i32 +{"bar": 1}?.ok +{"bar": ["bar", score]} +{"bar": add, "bar": "foo"}.String?.array +{"bar": add, "bar": 1}?.i64 +{"bar": add, "bar": div}?.f32 +{"bar": add, "bar": foo} +{"bar": add, "bar": list}.Bar +{"bar": add, "bar": score}.f64?.f64 +{"bar": add, "foo": "foo"}.i64 +{"bar": add, "foo": f64}?.score +{"bar": add, "foo": i32}?.half +{"bar": add, "foo": ok} +{"bar": add, "foo": score} +{"bar": add} +{"bar": add}.Qux +{"bar": add}.String +{"bar": add}.f64 +{"bar": add}.foo +{"bar": add}.greet +{"bar": add}.i32 +{"bar": add}.list +{"bar": add}?.String +{"bar": add}?.add +{"bar": add}?.div +{"bar": add}?.i +{"bar": add}?.i64 +{"bar": add}?.score +{"bar": any(array, false)} +{"bar": any(list, ok)} +{"bar": array, "bar": f64} +{"bar": array, "bar": false, "bar": i}?.Qux +{"bar": array, "bar": false}.Qux +{"bar": array, "bar": half}.i32 +{"bar": array, "bar": i64}.i64 +{"bar": array, "bar": score} +{"bar": array, "foo": "foo"}?.array +{"bar": array, "foo": add == add} +{"bar": array, "foo": count(list, true)}.add +{"bar": array} +{"bar": array}.Bar +{"bar": array}.Qux +{"bar": array}.String +{"bar": array}.add +{"bar": array}.f32 +{"bar": array}.half?.foo +{"bar": array}.i +{"bar": array}.i64 +{"bar": array}?.Bar +{"bar": array}?.div +{"bar": array}?.greet +{"bar": array}?.half +{"bar": array}?.i32 +{"bar": array}?.i64 +{"bar": array}?.ok +{"bar": div != greet} +{"bar": div, "bar": "bar", "bar": foo}.greet +{"bar": div, "bar": "bar", "foo": 1}?.div +{"bar": div, "bar": greet}?.i32 +{"bar": div, "bar": i32}?.array +{"bar": div, "foo": div}?.list +{"bar": div, "foo": greet, "foo": 1}?.score?.Qux +{"bar": div, "foo": i}?.i +{"bar": div, "foo": list}.f64 +{"bar": div, "foo": ok}?.i64 +{"bar": div, "foo": score} +{"bar": div} +{"bar": div}.add +{"bar": div}.div +{"bar": div}.f32 +{"bar": div}.f32?.score +{"bar": div}.half +{"bar": div}.i32 +{"bar": div}.i64 +{"bar": div}.score +{"bar": div}?.div +{"bar": div}?.div?.f32 +{"bar": div}?.foo +{"bar": div}?.half +{"bar": div}?.i +{"bar": div}?.i64 +{"bar": div}?.list +{"bar": div}?.ok +{"bar": f32 ** 1} +{"bar": f32 - i32} +{"bar": f32, "bar": true, "bar": list}?.Bar +{"bar": f32, "foo": i32} +{"bar": f32, "foo": ok, "foo": f32}.half +{"bar": f32, "foo": score}?.greet +{"bar": f32} +{"bar": f32}.Bar +{"bar": f32}.Qux?.i64 +{"bar": f32}.String +{"bar": f32}.add +{"bar": f32}.half +{"bar": f32}.list +{"bar": f32}?.String?.score +{"bar": f32}?.f64 +{"bar": f32}?.foo +{"bar": f32}?.i32 +{"bar": f32}?.i64 +{"bar": f32}?.list +{"bar": f32}?.score +{"bar": f64, "bar": 0.5}.div +{"bar": f64, "bar": i} +{"bar": f64, "bar": nil}?.f64 +{"bar": f64, "foo": "foo"}?.half +{"bar": f64, "foo": 0.5, "bar": foo}?.half +{"bar": f64, "foo": f64}.foo +{"bar": f64, "foo": i32} +{"bar": f64} +{"bar": f64}.String +{"bar": f64}.div?.String() +{"bar": f64}.f32 +{"bar": f64}.f64 +{"bar": f64}.f64?.list +{"bar": f64}.greet +{"bar": f64}.half +{"bar": f64}.i +{"bar": f64}.ok +{"bar": f64}?.Bar +{"bar": f64}?.Qux +{"bar": f64}?.f64 +{"bar": f64}?.half +{"bar": f64}?.i32 +{"bar": f64}?.i64 +{"bar": f64}?.score +{"bar": false, "bar": 0.5, "bar": foo}.add +{"bar": false, "foo": greet, "foo": i64}.div +{"bar": false}.add +{"bar": false}.div +{"bar": false}.f64 +{"bar": false}.foo +{"bar": false}.greet +{"bar": false}.half +{"bar": false}.i32 +{"bar": false}.list +{"bar": false}.ok +{"bar": false}.score +{"bar": false}?.array +{"bar": false}?.greet +{"bar": false}?.i32 +{"bar": false}?.ok?.Qux?.score() +{"bar": false}?.score +{"bar": first(list)} +{"bar": float(f32)} +{"bar": foo, "bar": 0.5}.div +{"bar": foo, "bar": div}.array +{"bar": foo, "bar": half} +{"bar": foo, "bar": list}.f32 +{"bar": foo, "foo": greet}?.div +{"bar": foo, "foo": i32}.score +{"bar": foo, "foo": true}?.f32 +{"bar": foo.Bar} +{"bar": foo.String()} +{"bar": foo?.Qux}?.foo +{"bar": foo?.String} +{"bar": foo} +{"bar": foo}.Qux +{"bar": foo}.String +{"bar": foo}.array +{"bar": foo}.div +{"bar": foo}.f64 +{"bar": foo}.half +{"bar": foo}.half?.list(i32).array +{"bar": foo}.i +{"bar": foo}.list +{"bar": foo}.ok +{"bar": foo}?.div +{"bar": foo}?.f64 +{"bar": foo}?.greet +{"bar": foo}?.i +{"bar": foo}?.i64 +{"bar": foo}?.list +{"bar": greet, "bar": foo} +{"bar": greet, "bar": nil}.f64 +{"bar": greet, "foo": foo} +{"bar": greet} +{"bar": greet}.Qux +{"bar": greet}.add +{"bar": greet}.array +{"bar": greet}.div +{"bar": greet}.foo +{"bar": greet}.i +{"bar": greet}.i32 +{"bar": greet}.ok +{"bar": greet}.score +{"bar": greet}?.Bar +{"bar": greet}?.String +{"bar": greet}?.add +{"bar": greet}?.f32 +{"bar": greet}?.foo?.foo +{"bar": greet}?.half +{"bar": greet}?.i +{"bar": greet}?.list +{"bar": greet}?.ok +{"bar": half(0.5), "bar": ok} +{"bar": half(0.5)} +{"bar": half(0.5)}?.array +{"bar": half, "bar": "foo", "bar": ok}?.String +{"bar": half, "bar": array}?.div?.i32 +{"bar": half, "bar": div} +{"bar": half, "bar": f32} +{"bar": half, "bar": greet}?.i64 +{"bar": half, "bar": list} +{"bar": half, "bar": score, "bar": i == f32} +{"bar": half, "bar": score} +{"bar": half, "foo": array} +{"bar": half, "foo": f64 == i64} +{"bar": half, "foo": greet} +{"bar": half, "foo": i64}.array +{"bar": half, "foo": list}?.list?.ok +{"bar": half} +{"bar": half}.String +{"bar": half}.String?.score +{"bar": half}.half +{"bar": half}.i32 +{"bar": half}.i64 +{"bar": half}.ok +{"bar": half}.score +{"bar": half}?.Qux +{"bar": half}?.Qux?.f32 +{"bar": half}?.div +{"bar": half}?.f32 +{"bar": half}?.foo?.f32() +{"bar": half}?.half +{"bar": half}?.half?.f32 +{"bar": half}?.i +{"bar": i ** 0.5} +{"bar": i + i64} +{"bar": i .. i32} +{"bar": i .. i} +{"bar": i > i32} +{"bar": i >= 0.5, "bar": array} +{"bar": i >= i} +{"bar": i, "bar": 0.5}?.Qux +{"bar": i, "bar": foo}.foo +{"bar": i, "bar": nil}?.f32 +{"bar": i, "foo": 1 >= f64} +{"bar": i, "foo": array}.array +{"bar": i, "foo": f64}.i64 +{"bar": i, "foo": greet}?.foo +{"bar": i32 + 0.5} +{"bar": i32 < i32} +{"bar": i32 <= f64} +{"bar": i32, "bar": "foo"}?.half +{"bar": i32, "foo": f64}?.foo +{"bar": i32, "foo": foo, "foo": i32}?.i32?.String() +{"bar": i32, "foo": i64, "bar": true}?.i64 +{"bar": i32, "foo": i64}.half +{"bar": i32, "foo": list} +{"bar": i32, "foo": score, "foo": 1}.array +{"bar": i32, "foo": score, "foo": greet}.add +{"bar": i32, "foo": score, "foo": ok}.foo +{"bar": i32} +{"bar": i32}.Bar +{"bar": i32}.i +{"bar": i32}.i64 +{"bar": i32}.list +{"bar": i32}.score?.f32 +{"bar": i32}?.String +{"bar": i32}?.div +{"bar": i32}?.f32 +{"bar": i32}?.foo +{"bar": i32}?.greet +{"bar": i32}?.half +{"bar": i32}?.i +{"bar": i32}?.list?.list +{"bar": i32}?.ok +{"bar": i32}?.score +{"bar": i64 != f32, "bar": score} +{"bar": i64 ** f64} +{"bar": i64 / f64} +{"bar": i64, "bar": "bar", "foo": i64}.array +{"bar": i64, "bar": foo}.list +{"bar": i64, "bar": greet, "foo": score}.array +{"bar": i64, "bar": half}?.f64 +{"bar": i64, "bar": i64}?.Qux?.array() +{"bar": i64, "bar": list} +{"bar": i64, "foo": "foo"}.Bar +{"bar": i64, "foo": 0.5, "foo": list}.i64 +{"bar": i64, "foo": f32, "foo": nil}.i32 +{"bar": i64, "foo": f32}?.half +{"bar": i64, "foo": i, "foo": greet}.array +{"bar": i64, "foo": nil}.add +{"bar": i64, "foo": nil}?.Qux +{"bar": i64} +{"bar": i64}.add +{"bar": i64}.array +{"bar": i64}.div +{"bar": i64}.div?.i64 +{"bar": i64}.f32 +{"bar": i64}.foo +{"bar": i64}.greet +{"bar": i64}.i64 +{"bar": i64}.list +{"bar": i64}.ok +{"bar": i64}?.Qux +{"bar": i64}?.String +{"bar": i64}?.array +{"bar": i64}?.array?.foo +{"bar": i64}?.div +{"bar": i64}?.f32 +{"bar": i64}?.i64 +{"bar": i64}?.list +{"bar": i64}?.ok +{"bar": i64}?.score +{"bar": i} +{"bar": i}.Bar +{"bar": i}.String +{"bar": i}.array +{"bar": i}.div +{"bar": i}.f64 +{"bar": i}.foo +{"bar": i}.greet +{"bar": i}.half +{"bar": i}.i +{"bar": i}.i32 +{"bar": i}.i64 +{"bar": i}.list?.list +{"bar": i}?.Qux +{"bar": i}?.String +{"bar": i}?.add +{"bar": i}?.foo +{"bar": i}?.greet +{"bar": i}?.list +{"bar": list, "bar": 1}?.f64 +{"bar": list, "bar": div} +{"bar": list, "bar": f32, "bar": i64}.Bar +{"bar": list, "bar": f32, "bar": ok}.add +{"bar": list, "bar": f64}.foo +{"bar": list, "bar": false, "bar": 1}?.f32 +{"bar": list, "bar": i32}.half +{"bar": list, "bar": ok} +{"bar": list, "foo": div, "foo": ok}?.i64 +{"bar": list, "foo": f64, "foo": list}.half +{"bar": list, "foo": half}?.Qux +{"bar": list, "foo": i} +{"bar": list, "foo": list} +{"bar": list, "foo": ok, "foo": f64}?.half +{"bar": list} +{"bar": list}.Bar +{"bar": list}.add +{"bar": list}.f32 +{"bar": list}.f64 +{"bar": list}.greet +{"bar": list}.score +{"bar": list}?.add +{"bar": list}?.add?.array +{"bar": list}?.div +{"bar": list}?.half +{"bar": list}?.i32 +{"bar": list}?.list +{"bar": list}?.score +{"bar": map(list, i32)} +{"bar": min(0.5)} +{"bar": min(f32)} +{"bar": nil != "bar"} +{"bar": nil != false} +{"bar": nil == "foo"} +{"bar": nil == 1} +{"bar": nil == f64} +{"bar": nil, "bar": div}.f32 +{"bar": nil, "bar": greet, "foo": "bar"}?.i64 +{"bar": nil, "bar": greet}.score +{"bar": nil, "bar": i}.f64 +{"bar": nil, "foo": 0.5}?.array +{"bar": nil, "foo": f64}?.add +{"bar": nil, "foo": half}?.foo +{"bar": nil}.String +{"bar": nil}.add +{"bar": nil}.array +{"bar": nil}.f32 +{"bar": nil}.foo +{"bar": nil}.half +{"bar": nil}?.Bar +{"bar": nil}?.add +{"bar": nil}?.array +{"bar": nil}?.f32 +{"bar": nil}?.f64 +{"bar": nil}?.foo +{"bar": nil}?.foo?.i32 +{"bar": nil}?.greet +{"bar": nil}?.half +{"bar": nil}?.i32 +{"bar": nil}?.i64 +{"bar": nil}?.list +{"bar": nil}?.ok +{"bar": ok or ok} +{"bar": ok || ok} +{"bar": ok, "bar": list} +{"bar": ok, "bar": nil == half}.f64 +{"bar": ok, "foo": div, "bar": "bar"}.Qux +{"bar": ok, "foo": i32, "bar": 1}.score +{"bar": ok} +{"bar": ok}.String +{"bar": ok}.add +{"bar": ok}.array +{"bar": ok}.i +{"bar": ok}.i64 +{"bar": ok}.ok +{"bar": ok}?.Qux +{"bar": ok}?.array +{"bar": ok}?.f64 +{"bar": ok}?.foo +{"bar": ok}?.greet +{"bar": ok}?.i +{"bar": ok}?.i32 +{"bar": ok}?.i64 +{"bar": score != score} +{"bar": score, "bar": 0.5}?.Bar +{"bar": score, "bar": div} +{"bar": score, "bar": foo} +{"bar": score, "bar": i64}.div +{"bar": score, "bar": i} +{"bar": score, "foo": greet} +{"bar": score} +{"bar": score}.Bar +{"bar": score}.add +{"bar": score}.array +{"bar": score}.div +{"bar": score}.f64 +{"bar": score}.i32 +{"bar": score}.i64 +{"bar": score}.list +{"bar": score}.ok +{"bar": score}.score +{"bar": score}?.f32 +{"bar": score}?.f64 +{"bar": score}?.i32 +{"bar": score}?.list +{"bar": score}?.score +{"bar": string(array)} +{"bar": toJSON(array)} +{"bar": toJSON(i)}.i64?.i64 +{"bar": toJSON(i32)} +{"bar": true, "bar": false}.Bar +{"bar": true, "bar": foo}?.String +{"bar": true, "foo": 0.5}?.i +{"bar": true, "foo": div}.score +{"bar": true, "foo": foo}.div +{"bar": true}.Bar +{"bar": true}.Qux?.greet() +{"bar": true}.f32 +{"bar": true}.f64 +{"bar": true}.half +{"bar": true}.i +{"bar": true}.list?.String() +{"bar": true}.score +{"bar": true}?.Bar +{"bar": true}?.i64 +{"bar": true}?.list +{"bar": type(f64)} +{"bar": type(greet)} +{"bar": {"foo": "bar", "bar": "bar", "bar": nil}} +{"foo": "bar", "bar": i32}.half +{"foo": "bar", "bar": nil}?.add?.i64 +{"foo": "bar"}.Bar +{"foo": "bar"}.Qux +{"foo": "bar"}.String +{"foo": "bar"}.array +{"foo": "bar"}.f64 +{"foo": "bar"}.half +{"foo": "bar"}.i +{"foo": "bar"}.i64 +{"foo": "bar"}.list +{"foo": "bar"}.ok +{"foo": "bar"}?.add +{"foo": "bar"}?.div?.ok +{"foo": "bar"}?.f64 +{"foo": "bar"}?.foo +{"foo": "bar"}?.half +{"foo": "foo" != "bar"} +{"foo": "foo", "bar": nil}?.String +{"foo": "foo", "foo": add, "foo": "foo"}?.i +{"foo": "foo", "foo": div}.i64 +{"foo": "foo", "foo": greet}.array +{"foo": "foo", "foo": i, "bar": greet}?.score +{"foo": "foo", "foo": i32, "bar": f32}.greet +{"foo": "foo", "foo": i}?.foo +{"foo": "foo", "foo": list}.f32 +{"foo": "foo"}.Bar +{"foo": "foo"}.array +{"foo": "foo"}.f32 +{"foo": "foo"}.foo +{"foo": "foo"}.greet +{"foo": "foo"}.i64 +{"foo": "foo"}?.Bar +{"foo": "foo"}?.add +{"foo": "foo"}?.div +{"foo": "foo"}?.greet +{"foo": "foo"}?.half +{"foo": "foo"}?.score +{"foo": -1} +{"foo": -i64} +{"foo": -i} +{"foo": 0.5 ** i64} +{"foo": 0.5 - 0.5} +{"foo": 0.5 <= 0.5} +{"foo": 0.5 > i64} +{"foo": 0.5, "bar": 1}.half +{"foo": 0.5, "bar": add}.Bar +{"foo": 0.5, "bar": div}.array +{"foo": 0.5, "bar": i32}?.String +{"foo": 0.5, "bar": score, "foo": score}.half +{"foo": 0.5, "foo": 1, "foo": list}.div +{"foo": 0.5, "foo": nil}?.div +{"foo": 0.5, "foo": nil}?.i64 +{"foo": 0.5}.Bar +{"foo": 0.5}.Qux +{"foo": 0.5}.array +{"foo": 0.5}.f32 +{"foo": 0.5}.f64 +{"foo": 0.5}.greet +{"foo": 0.5}.half +{"foo": 0.5}.i +{"foo": 0.5}.i64 +{"foo": 0.5}.list +{"foo": 0.5}.ok +{"foo": 0.5}?.Bar?.i +{"foo": 0.5}?.String +{"foo": 0.5}?.add +{"foo": 0.5}?.array +{"foo": 0.5}?.array?.score +{"foo": 0.5}?.foo +{"foo": 0.5}?.greet +{"foo": 0.5}?.half +{"foo": 0.5}?.i64 +{"foo": 0.5}?.ok +{"foo": 1 + 0.5} +{"foo": 1 / 0.5} +{"foo": 1 / i64} +{"foo": 1 < i32}?.i64 +{"foo": 1 not in array} +{"foo": 1, "bar": 0.5}.array +{"foo": 1, "bar": div}.f32 +{"foo": 1, "bar": f32}.Qux?.half?.list +{"foo": 1, "bar": i64, "foo": 0.5}.list +{"foo": 1, "bar": i64}?.ok +{"foo": 1, "bar": score}.foo +{"foo": 1, "foo": 0.5}.f32 +{"foo": 1, "foo": array}?.array +{"foo": 1, "foo": ok}.add +{"foo": 1, "foo": true}?.Qux +{"foo": 1}.add +{"foo": 1}.f32 +{"foo": 1}.foo +{"foo": 1}.greet +{"foo": 1}.half +{"foo": 1}.i64 +{"foo": 1}.list +{"foo": 1}.ok +{"foo": 1}?.Bar +{"foo": 1}?.add +{"foo": 1}?.div +{"foo": 1}?.f32 +{"foo": 1}?.foo +{"foo": 1}?.greet +{"foo": 1}?.half +{"foo": 1}?.i +{"foo": 1}?.i32 +{"foo": 1}?.score +{"foo": abs(0.5)} +{"foo": add, "bar": 0.5}.i +{"foo": add, "bar": nil}.score +{"foo": add, "bar": ok} +{"foo": add, "bar": score}.half +{"foo": add, "foo": "bar"}?.String +{"foo": add, "foo": half, "foo": div}?.greet +{"foo": add, "foo": i32}.foo +{"foo": add, "foo": nil}?.list +{"foo": add} +{"foo": add}.Bar +{"foo": add}.div +{"foo": add}.foo +{"foo": add}.half +{"foo": add}.i +{"foo": add}.i64 +{"foo": add}.list +{"foo": add}.ok +{"foo": add}?.String +{"foo": add}?.array +{"foo": add}?.div +{"foo": add}?.greet +{"foo": add}?.half +{"foo": add}?.i32 +{"foo": add}?.ok +{"foo": array, "bar": "foo"}?.f32 +{"foo": array, "bar": f64} +{"foo": array, "bar": greet} +{"foo": array, "bar": list}?.f32 +{"foo": array, "bar": ok} +{"foo": array, "foo": add} +{"foo": array, "foo": greet} +{"foo": array, "foo": true}?.i +{"foo": array} +{"foo": array}.Qux +{"foo": array}.Qux?.String +{"foo": array}.String +{"foo": array}.f64 +{"foo": array}.greet +{"foo": array}.i32 +{"foo": array}.ok +{"foo": array}?.Bar +{"foo": array}?.String +{"foo": array}?.add +{"foo": array}?.array +{"foo": array}?.div +{"foo": array}?.f64 +{"foo": array}?.half +{"foo": array}?.ok +{"foo": div, "bar": 1}?.add +{"foo": div, "bar": add} +{"foo": div, "bar": div} +{"foo": div, "bar": half}.half +{"foo": div, "bar": list, "bar": 0.5}?.Qux +{"foo": div, "foo": array}.Bar +{"foo": div, "foo": true}?.Qux +{"foo": div} +{"foo": div}.Qux +{"foo": div}.array +{"foo": div}.div +{"foo": div}.foo +{"foo": div}.greet +{"foo": div}?.Bar +{"foo": div}?.Qux +{"foo": div}?.String +{"foo": div}?.add +{"foo": div}?.f64 +{"foo": div}?.half +{"foo": div}?.i +{"foo": div}?.i64 +{"foo": div}?.list +{"foo": div}?.ok +{"foo": f32 != i} +{"foo": f32 - f32} +{"foo": f32 == 0.5} +{"foo": f32, "bar": "bar"}?.String +{"foo": f32, "bar": 0.5}.f32 +{"foo": f32, "bar": i32} +{"foo": f32, "bar": list} +{"foo": f32, "foo": 1, "foo": i32}?.i32 +{"foo": f32, "foo": div} +{"foo": f32, "foo": i} +{"foo": f32, "foo": ok}?.i +{"foo": f32, "foo": type("bar")} +{"foo": f32} +{"foo": f32}.String +{"foo": f32}.add +{"foo": f32}.array +{"foo": f32}.f32 +{"foo": f32}.foo +{"foo": f32}.greet +{"foo": f32}.half +{"foo": f32}.i +{"foo": f32}.i32 +{"foo": f32}.list +{"foo": f32}?.Bar +{"foo": f32}?.Qux +{"foo": f32}?.add +{"foo": f32}?.f32 +{"foo": f32}?.f64 +{"foo": f32}?.half +{"foo": f32}?.i32 +{"foo": f32}?.score +{"foo": f64 * i} +{"foo": f64 / 1} +{"foo": f64 == 0.5} +{"foo": f64 >= 1} +{"foo": f64 ^ f32} +{"foo": f64, "bar": "foo"}.Qux +{"foo": f64, "bar": "foo"}.add +{"foo": f64, "bar": 0.5}.div +{"foo": f64, "bar": div} +{"foo": f64, "bar": greet} +{"foo": f64, "bar": half}?.list +{"foo": f64, "bar": ok}.half +{"foo": f64, "foo": foo, "bar": greet}.String +{"foo": f64, "foo": foo, "foo": "foo"}.Bar +{"foo": f64, "foo": greet} +{"foo": f64, "foo": ok, "foo": i64}?.f64 +{"foo": f64} +{"foo": f64}.Qux +{"foo": f64}.String?.f32 +{"foo": f64}.String?.i64 +{"foo": f64}.add +{"foo": f64}.array +{"foo": f64}.f64 +{"foo": f64}.foo +{"foo": f64}.greet +{"foo": f64}.i +{"foo": f64}.list +{"foo": f64}?.Bar +{"foo": f64}?.String +{"foo": f64}?.div +{"foo": f64}?.f32 +{"foo": f64}?.f64 +{"foo": f64}?.foo +{"foo": f64}?.greet +{"foo": f64}?.i +{"foo": f64}?.ok +{"foo": false, "foo": greet}?.add +{"foo": false, "foo": ok}.score +{"foo": false}.Bar +{"foo": false}.array +{"foo": false}.div +{"foo": false}.half +{"foo": false}.i +{"foo": false}?.array +{"foo": false}?.f32 +{"foo": false}?.f64 +{"foo": false}?.foo +{"foo": false}?.i64 +{"foo": false}?.list +{"foo": foo, "bar": add, "foo": foo}.Bar +{"foo": foo, "bar": ok, "foo": array}.String +{"foo": foo, "foo": foo} +{"foo": foo, "foo": list, "foo": greet}.i +{"foo": foo, "foo": nil}?.f32 +{"foo": foo, "foo": true}?.array +{"foo": foo?.Qux} +{"foo": foo} +{"foo": foo}.div +{"foo": foo}.f64 +{"foo": foo}.greet +{"foo": foo}.list +{"foo": foo}.ok +{"foo": foo}.score +{"foo": foo}?.String +{"foo": foo}?.array +{"foo": foo}?.div +{"foo": foo}?.f32 +{"foo": foo}?.foo +{"foo": foo}?.greet +{"foo": foo}?.half +{"foo": foo}?.list +{"foo": foo}?.ok +{"foo": get(array, i32)}?.i64 +{"foo": greet, "bar": 0.5, "bar": "foo"}?.half +{"foo": greet, "bar": 0.5}.Bar +{"foo": greet, "bar": f64} +{"foo": greet, "bar": f64}.list +{"foo": greet, "bar": i, "foo": foo}?.f32 +{"foo": greet, "foo": "bar", "foo": score}.i +{"foo": greet, "foo": f32} +{"foo": greet} +{"foo": greet}.Qux +{"foo": greet}.String +{"foo": greet}.add +{"foo": greet}.array +{"foo": greet}.f32?.greet +{"foo": greet}.half?.greet +{"foo": greet}.i64 +{"foo": greet}.list +{"foo": greet}.ok +{"foo": greet}?.add +{"foo": greet}?.array +{"foo": greet}?.f32 +{"foo": greet}?.half +{"foo": greet}?.i32 +{"foo": greet}?.i64 +{"foo": greet}?.list +{"foo": greet}?.score +{"foo": half(0.5)} +{"foo": half(f64)} +{"foo": half, "bar": 1}?.half +{"foo": half, "bar": add}?.foo +{"foo": half, "bar": f32}.i32 +{"foo": half, "bar": foo} +{"foo": half, "bar": half} +{"foo": half, "bar": i64, "bar": i32}.foo +{"foo": half, "bar": i64} +{"foo": half, "bar": nil}?.ok +{"foo": half, "foo": 1}?.ok +{"foo": half, "foo": div} +{"foo": half, "foo": greet, "bar": f32}?.add +{"foo": half, "foo": true}.f64 +{"foo": half} +{"foo": half}.Bar +{"foo": half}.String +{"foo": half}.div +{"foo": half}.f64 +{"foo": half}.greet +{"foo": half}.half +{"foo": half}.i +{"foo": half}.i32 +{"foo": half}.ok +{"foo": half}?.Bar +{"foo": half}?.Qux +{"foo": half}?.add +{"foo": half}?.f64 +{"foo": half}?.foo +{"foo": half}?.greet +{"foo": half}?.half +{"foo": half}?.list +{"foo": half}?.score +{"foo": hasPrefix("bar", "foo")} +{"foo": i < f64} +{"foo": i > 0.5} +{"foo": i, "bar": score} +{"foo": i, "foo": i}.i64 +{"foo": i, "foo": ok} +{"foo": i, "foo": ok}?.ok +{"foo": i32, "bar": 0.5, "foo": array}.Bar +{"foo": i32, "bar": i32}.i64 +{"foo": i32, "bar": nil}?.i64 +{"foo": i32, "foo": 0.5}.i +{"foo": i32, "foo": add} +{"foo": i32, "foo": div, "foo": nil}.Bar +{"foo": i32, "foo": foo} +{"foo": i32, "foo": greet}?.foo +{"foo": i32, "foo": i32}?.score +{"foo": i32, "foo": ok, "bar": true}.f32 +{"foo": i32, "foo": ok}?.i32 +{"foo": i32} +{"foo": i32}.Bar +{"foo": i32}.Qux +{"foo": i32}.i64 +{"foo": i32}.list +{"foo": i32}.ok +{"foo": i32}.score +{"foo": i32}?.Bar +{"foo": i32}?.Qux +{"foo": i32}?.add +{"foo": i32}?.div +{"foo": i32}?.f32 +{"foo": i32}?.greet +{"foo": i32}?.half +{"foo": i32}?.i +{"foo": i32}?.i64 +{"foo": i32}?.score +{"foo": i64 * f64, "foo": i64} +{"foo": i64 <= 0.5} +{"foo": i64 ^ i32} +{"foo": i64, "bar": "bar"}.Qux +{"foo": i64, "bar": array}.add +{"foo": i64, "bar": div} +{"foo": i64, "bar": f64, "bar": greet}.f32 +{"foo": i64, "bar": list} +{"foo": i64, "foo": 0.5, "bar": 0.5}.half +{"foo": i64, "foo": div} +{"foo": i64, "foo": i32} +{"foo": i64} +{"foo": i64}.Qux +{"foo": i64}.add +{"foo": i64}.array +{"foo": i64}?.Qux +{"foo": i64}?.String +{"foo": i64}?.f32 +{"foo": i64}?.foo +{"foo": i64}?.greet +{"foo": i64}?.i32 +{"foo": i64}?.list +{"foo": i64}?.score +{"foo": i} +{"foo": i}.Bar +{"foo": i}.String +{"foo": i}.div +{"foo": i}.foo +{"foo": i}.greet +{"foo": i}.i32?.add +{"foo": i}.ok +{"foo": i}.score +{"foo": i}?.Bar +{"foo": i}?.array +{"foo": i}?.div +{"foo": i}?.f64 +{"foo": i}?.foo +{"foo": i}?.half +{"foo": i}?.i64 +{"foo": i}?.score +{"foo": list == list}.f32 +{"foo": list, "bar": f32, "foo": i32}.i32 +{"foo": list, "bar": foo}?.list +{"foo": list, "bar": i64} +{"foo": list, "bar": score} +{"foo": list, "foo": score} +{"foo": list} +{"foo": list}.Bar +{"foo": list}.String +{"foo": list}.add +{"foo": list}.div +{"foo": list}.foo +{"foo": list}.half +{"foo": list}.i32 +{"foo": list}.score +{"foo": list}?.add +{"foo": list}?.div +{"foo": list}?.i +{"foo": list}?.i64 +{"foo": list}?.ok +{"foo": map(array, #)} +{"foo": map(array, 0.5)} +{"foo": map(array, foo)} +{"foo": map(array, ok), "bar": i32} +{"foo": map(list, 0.5)} +{"foo": map(list, score)} +{"foo": min(0.5)} +{"foo": min(1)}?.f32 +{"foo": nil == 0.5} +{"foo": nil, "bar": 0.5}.score +{"foo": nil, "bar": add}?.array +{"foo": nil, "bar": div}.Bar +{"foo": nil, "bar": f64, "foo": div}.i32 +{"foo": nil, "bar": greet}?.add +{"foo": nil, "bar": i64}?.i64 +{"foo": nil, "bar": list}?.i32 +{"foo": nil, "foo": "foo"}.add +{"foo": nil, "foo": 1}.score +{"foo": nil, "foo": false}?.add +{"foo": nil, "foo": i64}.add +{"foo": nil}.Bar +{"foo": nil}.Qux +{"foo": nil}.String +{"foo": nil}.array +{"foo": nil}.div +{"foo": nil}.f32 +{"foo": nil}.f64 +{"foo": nil}.greet?.i() +{"foo": nil}.greet?.i32 +{"foo": nil}.half +{"foo": nil}.i +{"foo": nil}.i64 +{"foo": nil}.list +{"foo": nil}?.Bar +{"foo": nil}?.Qux +{"foo": nil}?.String +{"foo": nil}?.array +{"foo": nil}?.div +{"foo": nil}?.f32?.ok +{"foo": nil}?.greet +{"foo": nil}?.i32 +{"foo": nil}?.i?.half +{"foo": nil}?.list +{"foo": nil}?.list?.greet() +{"foo": nil}?.score +{"foo": not false} +{"foo": not ok} +{"foo": ok && ok} +{"foo": ok == nil} +{"foo": ok ? true : div} +{"foo": ok, "bar": f32} +{"foo": ok, "bar": i, "foo": greet}.i32 +{"foo": ok, "bar": i32} +{"foo": ok, "foo": 0.5}?.array +{"foo": ok, "foo": 1}.Qux +{"foo": ok, "foo": half, "bar": div}.score +{"foo": ok, "foo": i64} +{"foo": ok, "foo": i64}.i +{"foo": ok, "foo": nil}?.add +{"foo": ok} +{"foo": ok}.Bar +{"foo": ok}.add +{"foo": ok}.div +{"foo": ok}.f64 +{"foo": ok}.greet +{"foo": ok}.i +{"foo": ok}.score +{"foo": ok}?.Qux +{"foo": ok}?.String +{"foo": ok}?.div +{"foo": ok}?.f32 +{"foo": ok}?.greet +{"foo": ok}?.half?.half +{"foo": ok}?.i32 +{"foo": ok}?.i64 +{"foo": ok}?.list +{"foo": score(1)} +{"foo": score, "bar": 0.5}.list +{"foo": score, "bar": 1 ^ 1} +{"foo": score, "bar": i32} +{"foo": score, "bar": i64} +{"foo": score, "foo": 0.5}.add +{"foo": score, "foo": 1}?.div +{"foo": score, "foo": add, "bar": ok} +{"foo": score, "foo": f32, "bar": false}.div +{"foo": score, "foo": f32}?.i32 +{"foo": score, "foo": i}?.f32 +{"foo": score} +{"foo": score}.Bar +{"foo": score}.array +{"foo": score}.list +{"foo": score}?.Bar +{"foo": score}?.String +{"foo": score}?.add +{"foo": score}?.f32 +{"foo": score}?.greet +{"foo": score}?.half +{"foo": score}?.i +{"foo": score}?.list +{"foo": score}?.score +{"foo": string(i32)} +{"foo": string(list)} +{"foo": toBase64("bar")} +{"foo": toJSON(f32)} +{"foo": toJSON(i64)}?.i32 +{"foo": toJSON(nil)} +{"foo": true, "bar": false}?.array +{"foo": true, "bar": nil}?.div +{"foo": true, "bar": true}.f64 +{"foo": true, "foo": array, "bar": i32}?.ok +{"foo": true, "foo": i32}.i64 +{"foo": true, "foo": ok, "foo": add}.foo +{"foo": true}.String +{"foo": true}.f32 +{"foo": true}.foo +{"foo": true}.i +{"foo": true}.i64 +{"foo": true}?.String +{"foo": true}?.greet +{"foo": true}?.i32 +{"foo": type(1)} +{"foo": type(list)} +{"foo": type(nil)} +{"foo": type(ok)} From 3c8c30596c70aaa387c9014fbb2cb3c0bed0814a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 09:39:45 +0200 Subject: [PATCH 130/506] Replace chzyer/readline with bettercap/readline --- repl/go.mod | 3 ++- repl/go.sum | 23 +++-------------------- repl/repl.go | 2 +- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/repl/go.mod b/repl/go.mod index c099d3b85..ea7e9c9b2 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -5,10 +5,11 @@ go 1.20 require ( github.com/antonmedv/expr v1.13.0 github.com/antonmedv/expr/debug v0.0.0 - github.com/chzyer/readline v1.5.1 + github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf ) require ( + github.com/chzyer/test v1.0.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.6.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect diff --git a/repl/go.sum b/repl/go.sum index c6908b013..b584a8acf 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -1,12 +1,10 @@ +github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf h1:pwGPRc5PIp4KCF9QbKn0iLVMhfigUMw4IzGZEZ81m1I= +github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf/go.mod h1:03rWiUf60r1miMVzMEtgtkq7RdZniecZFw3/Zgvyxcs= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= @@ -17,36 +15,25 @@ github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -66,9 +53,5 @@ golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/repl/repl.go b/repl/repl.go index b3bb9a00b..1e70feffe 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -9,7 +9,7 @@ import ( "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/debug" "github.com/antonmedv/expr/vm" - "github.com/chzyer/readline" + "github.com/bettercap/readline" ) var keywords = []string{ From e67d2edbb744aabda40ea22fef2184fbea120b37 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 09:55:05 +0200 Subject: [PATCH 131/506] Update fuzz testing --- test/fuzz/fuzz_corpus.txt | 16445 +++++++++++++++++++++++++- test/fuzz/fuzz_expr.dict | 47 +- test/fuzz/fuzz_expr_seed_corpus.zip | Bin 11768 -> 2827388 bytes test/fuzz/fuzz_test.go | 67 +- 4 files changed, 16445 insertions(+), 114 deletions(-) diff --git a/test/fuzz/fuzz_corpus.txt b/test/fuzz/fuzz_corpus.txt index 43b3f7e4a..f427f787d 100644 --- a/test/fuzz/fuzz_corpus.txt +++ b/test/fuzz/fuzz_corpus.txt @@ -1,73 +1,16376 @@ -.5 + .5 -i + j -i - j -i * j -i / j -i % j -true || false -true && false -i == j -i != j -i > j -i >= j -i < j -i <= j -i in a -i not in a -s in m -m.a -m.m.a -a[0] -a[i] -a[i:j] -a[i:] -a[:j] -a[:] -a[1:-1] -len(a) -type(a) +!!!true +!!(f32 > f64) +!!(half != greet) +!!(nil == add) +!!(ok or true) +!!false +!!not false +!!ok +!!true +!("bar" != "bar") +!("bar" != "foo") +!("bar" != nil) +!("bar" < "bar") +!("bar" < "foo") +!("bar" <= "bar") +!("bar" <= "foo") +!("bar" == "bar") +!("bar" == "foo") +!("bar" == nil) +!("bar" > "bar") +!("bar" > "foo") +!("bar" >= "bar") +!("bar" >= "foo") +!("bar" contains "foo") +!("bar" in foo) +!("bar" matches "foo") +!("bar" not contains "bar") +!("bar" not contains "foo") +!("bar" not endsWith "foo") +!("bar" not in foo) +!("bar" not matches "foo") +!("bar" not startsWith "bar") +!("bar" not startsWith "foo") +!("bar" startsWith "bar") +!("foo" != "bar") +!("foo" != "foo") +!("foo" != nil) +!("foo" < "bar") +!("foo" <= "bar") +!("foo" <= "foo") +!("foo" == "foo") +!("foo" == nil) +!("foo" > "bar") +!("foo" > "foo") +!("foo" >= "bar") +!("foo" >= "foo") +!("foo" contains "bar") +!("foo" contains "foo") +!("foo" endsWith "bar") +!("foo" endsWith "foo") +!("foo" in foo) +!("foo" matches "bar") +!("foo" matches "foo") +!("foo" not contains "bar") +!("foo" not contains "foo") +!("foo" not endsWith "bar") +!("foo" not endsWith "foo") +!("foo" not in foo) +!("foo" not matches "bar") +!("foo" not matches "foo") +!("foo" not startsWith "bar") +!("foo" not startsWith "foo") +!("foo" startsWith "bar") +!("foo" startsWith "foo") +!(0.5 != 0.5) +!(0.5 != 1) +!(0.5 != f32) +!(0.5 != f64) +!(0.5 != i) +!(0.5 != i32) +!(0.5 != i64) +!(0.5 != nil) +!(0.5 / i32 > i) +!(0.5 < 0.5) +!(0.5 < 1) +!(0.5 < f32) +!(0.5 < f64) +!(0.5 < i) +!(0.5 < i32) +!(0.5 < i64) +!(0.5 <= 0.5) +!(0.5 <= 1) +!(0.5 <= f32) +!(0.5 <= i) +!(0.5 <= i32) +!(0.5 <= i64) +!(0.5 == 0.5) +!(0.5 == 1) +!(0.5 == f32) +!(0.5 == f64) +!(0.5 == i) +!(0.5 == i32) +!(0.5 == i64) +!(0.5 == nil) +!(0.5 > 0.5) +!(0.5 > 1) +!(0.5 > f32) +!(0.5 > f64) +!(0.5 > i) +!(0.5 > i32) +!(0.5 > i64) +!(0.5 >= 0.5) +!(0.5 >= 1) +!(0.5 >= f32) +!(0.5 >= f64) +!(0.5 >= i) +!(0.5 >= i32) +!(0.5 >= i64) +!(0.5 ^ i64 < i64) +!(1 != 0.5) +!(1 != 1) +!(1 != f32) +!(1 != f64) +!(1 != i) +!(1 != i32) +!(1 != i64) +!(1 != nil) +!(1 < 0.5) +!(1 < 1) +!(1 < f32) +!(1 < f64) +!(1 < i) +!(1 < i32) +!(1 < i64) +!(1 <= 0.5) +!(1 <= 1) +!(1 <= f32) +!(1 <= f64) +!(1 <= i) +!(1 <= i32) +!(1 <= i64) +!(1 == 0.5) +!(1 == 1) +!(1 == f32) +!(1 == f64) +!(1 == i) +!(1 == i32) +!(1 == i64) +!(1 == nil) +!(1 > 0.5) +!(1 > 1) +!(1 > f64) +!(1 > i) +!(1 > i32) +!(1 > i64) +!(1 >= 0.5) +!(1 >= 1) +!(1 >= f32) +!(1 >= f64) +!(1 >= i) +!(1 >= i32) +!(1 >= i64) +!(1 in array) +!(1 not in array) +!(add != add) +!(add != div) +!(add != greet) +!(add != half) +!(add != nil) +!(add != score) +!(add == add) +!(add == div) +!(add == half) +!(add == nil) +!(add == score) +!(array != array) +!(array != nil) +!(array == array) +!(array == list) +!(array == nil) +!(div != add) +!(div != div) +!(div != greet) +!(div != half) +!(div != nil) +!(div != score) +!(div == add) +!(div == div) +!(div == greet) +!(div == half) +!(div == nil) +!(div == score) +!(f32 != 0.5) +!(f32 != 1) +!(f32 != f32) +!(f32 != i32) +!(f32 != i64) +!(f32 != nil) +!(f32 + i == 0.5 * i) +!(f32 < 0.5) +!(f32 < 1) +!(f32 < f32) +!(f32 < f64) +!(f32 < i) +!(f32 < i32) +!(f32 < i64) +!(f32 <= 0.5) +!(f32 <= 1) +!(f32 <= f32) +!(f32 <= f64) +!(f32 <= i) +!(f32 <= i32) +!(f32 <= i64) +!(f32 == 0.5) +!(f32 == 1) +!(f32 == f32) +!(f32 == f64) +!(f32 == i) +!(f32 == i32) +!(f32 == i64) +!(f32 == nil) +!(f32 > 0.5) +!(f32 > 1) +!(f32 > f32) +!(f32 > f64) +!(f32 > i) +!(f32 > i32) +!(f32 > i64) +!(f32 >= 0.5) +!(f32 >= 1) +!(f32 >= f32) +!(f32 >= f64) +!(f32 >= i) +!(f32 >= i64) +!(f64 != 0.5) +!(f64 != 1) +!(f64 != f32) +!(f64 != f64) +!(f64 != i32) +!(f64 != i64) +!(f64 != nil) +!(f64 < 0.5) +!(f64 < 1) +!(f64 < f32) +!(f64 < f64) +!(f64 < i) +!(f64 < i32) +!(f64 < i64) +!(f64 <= 0.5) +!(f64 <= 1) +!(f64 <= f32) +!(f64 <= f64) +!(f64 <= i) +!(f64 <= i32) +!(f64 <= i64) +!(f64 == 0.5) +!(f64 == 1) +!(f64 == f32) +!(f64 == i32) +!(f64 == i64) +!(f64 == nil) +!(f64 > 0.5) +!(f64 > 1) +!(f64 > f64) +!(f64 > i32) +!(f64 > i64) +!(f64 >= 0.5) +!(f64 >= 1) +!(f64 >= f32) +!(f64 >= f64) +!(f64 >= i) +!(f64 >= i32) +!(f64 >= i64) +!(false != false) +!(false != nil) +!(false != ok) +!(false != true) +!(false && false) +!(false && ok) +!(false == false) +!(false == nil) +!(false == ok) +!(false and ok) +!(false or ok) +!(false or true) +!(false || false) +!(false || ok) +!(false || true) +!(foo != foo) +!(foo != nil) +!(foo == foo) +!(foo == nil) +!(foo in list) +!(foo not in list) +!(greet != div) +!(greet != greet) +!(greet != half) +!(greet != nil) +!(greet != score) +!(greet == add) +!(greet == div) +!(greet == greet) +!(greet == half) +!(greet == nil) +!(greet == score) +!(half != add) +!(half != div) +!(half != greet) +!(half != half) +!(half != nil) +!(half != score) +!(half == add) +!(half == div) +!(half == greet) +!(half == half) +!(half == nil) +!(half == score) +!(i != 0.5) +!(i != 1) +!(i != f32) +!(i != f64) +!(i != i) +!(i != i32) +!(i != i64) +!(i != nil) +!(i < 0.5) +!(i < 1) +!(i < f32) +!(i < f64) +!(i < i) +!(i < i32) +!(i < i64) +!(i <= 0.5) +!(i <= 1) +!(i <= f32) +!(i <= f64) +!(i <= i) +!(i <= i32) +!(i <= i64) +!(i == 0.5) +!(i == 1) +!(i == f32) +!(i == f64) +!(i == i) +!(i == i32) +!(i == i64) +!(i == nil) +!(i > 0.5) +!(i > 1) +!(i > f32) +!(i > f64) +!(i > i) +!(i > i32) +!(i > i64) +!(i >= 0.5) +!(i >= 1) +!(i >= f32) +!(i >= f64) +!(i >= i32) +!(i >= i64) +!(i in array) +!(i32 != 0.5) +!(i32 != 1) +!(i32 != f64) +!(i32 != i) +!(i32 != i32) +!(i32 != i64) +!(i32 != nil) +!(i32 * 0.5 != i32) +!(i32 < 0.5) +!(i32 < 1) +!(i32 < f32) +!(i32 < f64) +!(i32 < i) +!(i32 < i32) +!(i32 < i64) +!(i32 <= 0.5) +!(i32 <= 1) +!(i32 <= f32) +!(i32 <= f64) +!(i32 <= i) +!(i32 <= i32) +!(i32 <= i64) +!(i32 == 0.5) +!(i32 == 1) +!(i32 == f64) +!(i32 == i) +!(i32 == i32) +!(i32 == i64) +!(i32 == nil) +!(i32 > 0.5) +!(i32 > 1) +!(i32 > f64) +!(i32 > i) +!(i32 > i32) +!(i32 > i64) +!(i32 >= 0.5) +!(i32 >= 1) +!(i32 >= f32) +!(i32 >= f64) +!(i32 >= i) +!(i32 >= i32) +!(i32 >= i64) +!(i32 in array) +!(i32 not in array) +!(i64 != 0.5) +!(i64 != 1) +!(i64 != f32) +!(i64 != f64) +!(i64 != i) +!(i64 != i32) +!(i64 != nil) +!(i64 < 0.5) +!(i64 < 1) +!(i64 < f32) +!(i64 < f64) +!(i64 < i) +!(i64 < i32) +!(i64 < i64) +!(i64 <= 0.5) +!(i64 <= 1) +!(i64 <= f32) +!(i64 <= f64) +!(i64 <= i) +!(i64 <= i32) +!(i64 <= i64) +!(i64 == 0.5) +!(i64 == 1) +!(i64 == f32) +!(i64 == f64) +!(i64 == i) +!(i64 == i32) +!(i64 == nil) +!(i64 > 0.5) +!(i64 > 1) +!(i64 > f32) +!(i64 > f64) +!(i64 > i) +!(i64 > i32) +!(i64 > i64) +!(i64 >= 0.5) +!(i64 >= 1) +!(i64 >= f32) +!(i64 >= f64) +!(i64 >= i) +!(i64 >= i32) +!(i64 in array) +!(i64 not in array) +!(list != array) +!(list != list) +!(list != nil) +!(list == array) +!(list == list) +!(list == nil) +!(nil != "bar") +!(nil != "foo") +!(nil != 0.5) +!(nil != 1) +!(nil != add) +!(nil != array) +!(nil != div) +!(nil != f32) +!(nil != f64) +!(nil != false) +!(nil != foo) +!(nil != greet) +!(nil != half) +!(nil != i) +!(nil != i32) +!(nil != i64) +!(nil != list) +!(nil != nil) +!(nil != ok) +!(nil != score) +!(nil != true) +!(nil == "bar") +!(nil == "foo") +!(nil == 0.5) +!(nil == 1) +!(nil == array) +!(nil == div) +!(nil == f32) +!(nil == f64) +!(nil == foo) +!(nil == greet) +!(nil == half) +!(nil == i) +!(nil == i32) +!(nil == i64) +!(nil == list) +!(nil == nil) +!(nil == ok) +!(nil == score) +!(nil == true) +!(nil in array) +!(nil in list) +!(nil not in array) +!(nil not in list) +!(ok != false) +!(ok != nil) +!(ok != ok) +!(ok != true) +!(ok && false) +!(ok && ok) +!(ok && true) +!(ok == false) +!(ok == nil) +!(ok == ok) +!(ok and ok) +!(ok and true) +!(ok or ok) +!(ok || false) +!(ok || ok) +!(score != add) +!(score != div) +!(score != greet) +!(score != half) +!(score != nil) +!(score != score) +!(score == add) +!(score == div) +!(score == greet) +!(score == half) +!(score == nil) +!(true != false) +!(true != nil) +!(true != ok) +!(true != true) +!(true && false) +!(true && ok) +!(true && true) +!(true == false) +!(true == nil) +!(true == ok) +!(true == true) +!(true and false) +!(true and ok) +!(true and true) +!(true or true) +!(true || ok) +!(true || true) +!all(array, false) +!all(array, ok) +!all(array, true) +!all(list, false) +!all(list, ok) +!all(list, true) +!any(array, false) +!any(array, ok) +!any(array, true) +!any(list, # != #) +!any(list, ok) +!false && ok +!false ? "bar" : i +!false ? "foo" : false +!false ? 0.5 : "bar" +!false ? 0.5 : 1 +!false ? 0.5 : div +!false ? 0.5 : i64 +!false ? 1 : add +!false ? 1 : true +!false ? add : array +!false ? add : nil +!false ? array : array +!false ? div : 0.5 +!false ? div : foo +!false ? div : map(list, #) +!false ? div : nil +!false ? f32 : 0.5 +!false ? f32 : greet +!false ? f64 : 1 +!false ? f64 : half +!false ? false : f32 +!false ? false : false +!false ? foo : 1 +!false ? foo : i64 +!false ? greet : array +!false ? greet : i32 +!false ? half : nil +!false ? half : ok +!false ? i : foo +!false ? i32 : "foo" +!false ? i64 : f32 +!false ? i64 : nil +!false ? list : list +!false ? nil : 1 +!false ? nil : add +!false ? nil : f64 +!false ? nil : foo +!false ? ok : ok +!false ? true : array +!false and (true or false) +!false and ok +!false or 0.5 != 1 +!false || not false +!hasSuffix("bar", "bar") +!none(array, false) +!none(array, true) +!none(list, false) +!none(list, ok) +!none(list, true) +!not (1 != i) +!not (i64 != 0.5) +!not any(list, ok) +!not false +!not ok +!not true +!not true ? i64 : true +!ok +!ok != ok +!ok && (ok || ok) +!ok == !ok +!ok == ok +!ok ? "bar" : 0.5 +!ok ? "foo" : nil +!ok ? 0.5 : "foo" +!ok ? 1 : 0.5 +!ok ? 1 : 1 +!ok ? 1 : div +!ok ? 1 : foo +!ok ? 1 : greet +!ok ? 1 : ok +!ok ? add : f32 +!ok ? add : false +!ok ? add : i +!ok ? add : score +!ok ? f32 : "foo" +!ok ? f32 : 1 +!ok ? f64 : i +!ok ? false : "foo" +!ok ? false : half +!ok ? greet : "bar" +!ok ? greet : add +!ok ? greet : false +!ok ? half : array +!ok ? i : foo +!ok ? i : greet +!ok ? i : true +!ok ? i64 : list +!ok ? list : "foo" +!ok ? list : true +!ok ? nil : i +!ok ? nil : true +!ok ? ok : 1 +!ok ? ok : i64 +!ok ? ok : score +!ok ? score : array +!ok ? score : i +!ok ? true : greet +!ok and i != f32 +!ok and ok +!ok or none(array, ok) +!one(array, ok) +!one(array, true) +!one(list, false) +!one(list, ok) +!one(list, true) +!true != false ? ok : 0.5 +!true != nil == nil +!true != ok +!true && ok +!true == ok +!true ? "bar" : false +!true ? "bar" : i +!true ? "foo" : ok +!true ? 0.5 : 1 +!true ? 0.5 : div +!true ? 0.5 : i +!true ? add : div +!true ? add : greet +!true ? array : foo +!true ? array : i +!true ? array : i64 +!true ? array : score +!true ? div : f32 +!true ? div : ok +!true ? f32 : 0.5 +!true ? f32 : add +!true ? f32 : foo +!true ? f32 : i32 +!true ? f64 : "bar" +!true ? f64 : f64 +!true ? f64 : i32 +!true ? foo : 1 +!true ? greet : array +!true ? greet : list +!true ? half : add +!true ? half : greet +!true ? i32 : i64 +!true ? i64 : score +!true ? list : div +!true ? list : score +!true ? nil : 0.5 +!true ? nil : f32 +!true ? nil : f64 +!true ? nil : foo +!true ? nil : half +!true ? nil : i +!true ? ok : list +!true ? score : array +!true ? score : nil +!true and ok +!true or !false +!true or nil != ok +!true || ok +"bar" != foo.Bar +"bar" != foo?.Bar +"bar" != foo?.String() +"bar" != nil and true ? i64 : 0.5 +"bar" + "foo" not endsWith greet("bar") +"bar" + foo.Bar +"bar" + foo?.Bar +"bar" + foo?.String() +"bar" < foo.Bar +"bar" < foo?.Bar +"bar" <= foo.Bar +"bar" <= foo.String() +"bar" <= foo?.Bar +"bar" == foo.Bar +"bar" == foo?.Bar +"bar" > foo.Bar +"bar" > foo.String() +"bar" > foo?.Bar +"bar" contains "bar" == ok +"bar" contains "foo" ? array : f64 +"bar" contains foo.Bar +"bar" contains foo?.Bar +"bar" contains foo?.String() +"bar" endsWith foo.Bar +"bar" endsWith foo?.Bar +"bar" endsWith foo?.String() +"bar" in foo || ok +"bar" matches "bar" != ok +"bar" matches foo.Bar +"bar" matches foo?.Bar +"bar" not contains foo.Bar +"bar" not contains foo.String() +"bar" not contains foo?.Bar +"bar" not endsWith foo.Bar +"bar" not endsWith foo?.Bar +"bar" not endsWith foo?.String() +"bar" not in list[i] +"bar" not matches "foo" ? i32 < 0.5 : ok +"bar" not matches foo.Bar +"bar" not matches foo.String() +"bar" not matches foo?.Bar +"bar" not startsWith "foo" ? add : ok +"bar" not startsWith foo.Bar +"bar" not startsWith foo?.Bar +"bar" startsWith foo.Bar +"bar" startsWith foo?.Bar +"foo" != "bar" != ok +"foo" != foo.Bar +"foo" != foo?.Bar +"foo" != foo?.String() +"foo" + "foo" not in foo +"foo" + foo.Bar +"foo" + foo.String() +"foo" + foo?.Bar +"foo" + foo?.String() +"foo" < "bar" and i32 != 0.5 +"foo" < "foo" ? list : f32 +"foo" < foo.Bar +"foo" < foo?.Bar +"foo" <= foo.Bar +"foo" <= foo?.Bar +"foo" == "foo" && i32 > 1 +"foo" == foo.Bar +"foo" == foo.String() +"foo" == foo?.String() +"foo" == nil ? foo : f64 +"foo" > "bar" && ok +"foo" > "foo" == not false +"foo" > foo?.Bar +"foo" > foo?.String() +"foo" >= foo.Bar +"foo" >= foo?.Bar +"foo" contains foo.Bar +"foo" contains foo?.Bar +"foo" endsWith foo.Bar +"foo" endsWith foo.String() +"foo" endsWith foo?.Bar +"foo" endsWith foo?.String() +"foo" in foo && nil == 1 +"foo" matches "bar" ? f64 > f64 : half +"foo" matches foo.Bar +"foo" matches foo.String() +"foo" matches foo?.Bar +"foo" not contains foo.Bar +"foo" not contains foo?.Bar +"foo" not endsWith foo.Bar +"foo" not endsWith foo?.Bar +"foo" not endsWith foo?.String() +"foo" not matches foo.Bar +"foo" not matches foo.String() +"foo" not matches foo?.Bar +"foo" not startsWith foo.Bar +"foo" not startsWith foo?.String() +"foo" startsWith foo.Bar +"foo" startsWith foo?.Bar +"foo" startsWith foo?.String() +("bar" not endsWith "bar") and i64 < i32 +("bar" not endsWith "foo") == ok +("bar" not in foo) == ok +("foo" not matches "bar") and false ? f64 : array +(0.5 * 0.5) ** f32 +(0.5 * 0.5) ** i +(0.5 * 0.5) ** i64 +(0.5 * 0.5) ^ f32 +(0.5 * 0.5) ^ i32 +(0.5 * f32) ** i +(0.5 * f64) ^ f32 +(0.5 * i32) ** f32 +(0.5 + 1) * i +(0.5 + 1) ** i64 +(0.5 + 1) / i +(0.5 + i64) / f32 +(0.5 - 0.5) ^ half(f64) +(0.5 - 1) * i64 +(0.5 - 1) ** i64 +(0.5 - f32) ** (0.5 * f64) +(0.5 - f64) * f64 +(0.5 - f64) / f32 +(0.5 - i) ^ f32 +(0.5 - i32) ** i64 +(0.5 - i32) ^ f64 +(0.5 / 0.5) ^ f64 +(0.5 / f32) ** f32 +(0.5 / f32) ^ i32 +(0.5 / f64) ** i +(0.5 / f64) ** i32 +(0.5 / i32) ** i +(0.5 / i64) ** f32 +(1 % i) ** f32 +(1 % i) ^ i +(1 % i64) ** f32 +(1 * 1) ** f64 +(1 * 1) ^ i +(1 * f32) ** f32 +(1 * i32) ** i +(1 * i64) ** i32 +(1 + 0.5) * f64 +(1 + 0.5) ^ i32 +(1 + 1) / i32 +(1 + 1) ^ i +(1 + f32) / f32 / i64 +(1 + f64) ** i64 +(1 + f64) / i32 +(1 + f64) ^ f64 +(1 + i32) / f32 +(1 + i64) / f64 +(1 - 0.5) / f64 +(1 - 0.5) ^ i32 +(1 - 1) * i +(1 - 1) * i32 +(1 - 1) ** f32 +(1 - 1) / i +(1 - f64) * 1 * i +(1 - f64) ^ i32 +(1 - i) ** i +(1 - i) / i64 +(1 - i32) ** i ^ 0.5 +(1 - i64) % i64 +(1 / 0.5) ^ f32 +(1 / 0.5) ^ f64 +(1 / 1) ** i32 +(1 / 1) ^ i32 +(1 / f64) ** f64 +(1 / i) ** i64 +(1 not in array) and none(list, true) +(f32 * 1) ** f32 +(f32 * 1) ** i64 +(f32 * i) ^ i64 +(f32 * i32) ** i +(f32 * i64) ** i64 +(f32 * i64) ^ i +(f32 + 0.5) / 0.5 ** 0.5 +(f32 + 1) ** i +(f32 + 1) / i +(f32 + 1) / i64 +(f32 + i32) ** i64 +(f32 + i64) ** i32 +(f32 - 0.5) * f64 +(f32 - 0.5) * i +(f32 - f32) ** f32 +(f32 - i) / f64 +(f32 - i) ^ i64 +(f32 - i64) * i64 +(f32 - i64) ** i64 +(f32 - i64) / i64 +(f32 / f64) ^ f32 +(f32 / f64) ^ i +(f32 / i32) ^ i32 +(f64 * 0.5) ^ i +(f64 * f64) ** i32 +(f64 * i64) ** i32 +(f64 + f32) ** i64 +(f64 + i32) * f32 +(f64 + i64) / i32 +(f64 - 0.5) * -i +(f64 - 0.5) * i +(f64 - 0.5) / f32 +(f64 - 0.5) / i64 +(f64 - 0.5) ^ i +(f64 - 0.5) ^ i64 +(f64 - 1) * f32 +(f64 - f32) * i64 +(f64 - f64) / i32 +(f64 - i) * i32 ** 1 +(f64 - i64) / i64 +(f64 / 0.5) ** f64 +(f64 / i) ^ i64 +(false || ok) and ok +(i % 1) ** -f32 +(i % 1) ** f64 +(i % i) ** f32 +(i * 1) ** i +(i * f32) ** i32 +(i * f32) ^ f64 +(i * i) ^ count(array, true) +(i + 0.5) ** i32 +(i + 0.5) ^ f32 +(i + 1) % i32 +(i + 1) / i64 +(i + f64) ^ (f32 * f64) +(i + i) * -f64 +(i + i32) ^ i64 +(i - 0.5) / f32 +(i - 0.5) ^ f64 +(i - 1) ** i64 +(i - 1) / f32 +(i - 1) ^ f64 +(i - i64) ** f64 +(i - i64) ^ i +(i / 0.5) ^ i32 +(i / 1) ** f64 +(i / 1) ** i64 +(i / i32) ^ f32 +(i < i32 ? nil : f64) ** f64 +(i32 * 1) ** f32 +(i32 * f32) ^ i64 +(i32 * i) ^ i +(i32 * i32) ** f64 +(i32 + 0.5) / f64 +(i32 + 0.5) ^ i64 +(i32 + 1) * f64 +(i32 + 1) ** float(1) +(i32 + 1) / i +(i32 + 1) / i64 +(i32 + f32) ** f32 +(i32 + f64) ** i +(i32 + i32) * i32 +(i32 + i32) / i64 +(i32 + i64) ^ i +(i32 - 0.5) * i64 +(i32 - f32) * i32 +(i32 - i32) ** i +(i32 - i32) ** i64 +(i32 / 0.5) ^ i32 +(i32 / i32) ^ f32 +(i32 / i32) ^ i +(i64 * 0.5) ^ f32 +(i64 * 1) ** i64 +(i64 * 1) ^ f32 +(i64 * 1) ^ f64 +(i64 * f32) ** findIndex(list, ok) +(i64 + 1) * i32 +(i64 + f32) ^ f64 +(i64 + f64) / 1 * 1 +(i64 + f64) ^ f64 +(i64 + i) ^ i64 +(i64 + i32) * f32 +(i64 - 0.5) * i64 +(i64 - 0.5) / i32 +(i64 - i) % i32 +(i64 - i32) / len(array) +(i64 - i64) / i64 +(i64 / f64) ** f32 +(i64 / i32) ** f32 +(i64 / i32) ** i +(i64 / i32) ^ -1 +(i64 not in array) && ok +(ok && ok) == ok +(ok or false) and ok +(ok or ok) == not false +(ok || true) && i32 >= f64 +-(0.5 * 0.5) +-(0.5 * 1) +-(0.5 * f32) +-(0.5 * f64) +-(0.5 * i) +-(0.5 * i32) +-(0.5 * i64) +-(0.5 ** 0.5) +-(0.5 ** 1) +-(0.5 ** f32) +-(0.5 ** f64) +-(0.5 ** i) +-(0.5 ** i32) +-(0.5 ** i64) +-(0.5 + 0.5) +-(0.5 + 1) +-(0.5 + f32) +-(0.5 + f64) +-(0.5 + i) +-(0.5 + i32) +-(0.5 + i64) +-(0.5 - 0.5) +-(0.5 - 1) +-(0.5 - f32) +-(0.5 - f64) +-(0.5 - i) +-(0.5 - i32) +-(0.5 - i64) +-(0.5 / 0.5) +-(0.5 / 0.5) < i32 +-(0.5 / 1) +-(0.5 / f32) +-(0.5 / f64) +-(0.5 / i) +-(0.5 / i32) +-(0.5 / i64) +-(0.5 ^ 0.5) +-(0.5 ^ 1) +-(0.5 ^ f32) +-(0.5 ^ f64) +-(0.5 ^ i) +-(0.5 ^ i32) +-(0.5 ^ i64) +-(1 % 1) +-(1 % i) +-(1 % i32) +-(1 % i64) +-(1 * 0.5) +-(1 * 1) +-(1 * f32) +-(1 * i) +-(1 * i32) +-(1 * i64) +-(1 ** 0.5) +-(1 ** 1) +-(1 ** f32) +-(1 ** f64) +-(1 ** i) +-(1 ** i32) +-(1 ** i64) +-(1 + 0.5) +-(1 + 1) +-(1 + f32) +-(1 + f64) +-(1 + i) +-(1 + i32) +-(1 + i64) +-(1 - 0.5) +-(1 - 1) +-(1 - f32) +-(1 - f64) +-(1 - i) +-(1 - i32) +-(1 - i64) +-(1 / 0.5) +-(1 / 1) +-(1 / f32) +-(1 / f64) +-(1 / i) +-(1 / i32) +-(1 / i64) +-(1 ^ 0.5) +-(1 ^ 1) +-(1 ^ f32) +-(1 ^ f64) +-(1 ^ i) +-(1 ^ i32) +-(1 ^ i64) +-(f32 * 0.5) +-(f32 * 1) +-(f32 * f32) +-(f32 * f64) +-(f32 * i) +-(f32 * i32) +-(f32 * i64) +-(f32 ** 0.5) +-(f32 ** 1) +-(f32 ** f32) +-(f32 ** f64) +-(f32 ** i) +-(f32 ** i32) +-(f32 ** i64) +-(f32 + 0.5) +-(f32 + 1) +-(f32 + f32) +-(f32 + f64) +-(f32 + i) +-(f32 + i32) +-(f32 + i64) +-(f32 - 0.5) +-(f32 - 1) +-(f32 - f64) +-(f32 - i - f32) +-(f32 - i) +-(f32 - i32) +-(f32 - i64) +-(f32 / 0.5) +-(f32 / 1) +-(f32 / f32) +-(f32 / f64) +-(f32 / i) +-(f32 / i32) +-(f32 / i64) +-(f32 ^ 0.5) +-(f32 ^ 1) +-(f32 ^ f32) +-(f32 ^ i) +-(f32 ^ i32) +-(f32 ^ i64) +-(f64 * 0.5) +-(f64 * 1) +-(f64 * f32) +-(f64 * f64) +-(f64 * i) +-(f64 * i32) +-(f64 * i64) +-(f64 ** 0.5) +-(f64 ** 1) +-(f64 ** f32) +-(f64 ** f64) +-(f64 ** i) +-(f64 ** i32) +-(f64 ** i32) > i32 +-(f64 ** i64) +-(f64 + 0.5) +-(f64 + 1) +-(f64 + f32) +-(f64 + i) +-(f64 + i32) +-(f64 + i64) +-(f64 - 0.5) +-(f64 - 1) +-(f64 - f32) +-(f64 - f64) +-(f64 - i) +-(f64 - i32) +-(f64 - i64) +-(f64 / 0.5) +-(f64 / 1) +-(f64 / f32) +-(f64 / f64) +-(f64 / i) +-(f64 / i32) +-(f64 / i64) +-(f64 ^ 0.5) +-(f64 ^ 1) +-(f64 ^ f32) +-(f64 ^ f64) +-(f64 ^ i) +-(f64 ^ i32) +-(f64 ^ i64) +-(i % 1) +-(i % i) +-(i % i32) +-(i % i64) +-(i % score(1)) +-(i * 0.5) +-(i * 1) +-(i * f32) +-(i * f64) +-(i * i) +-(i * i32) +-(i * i64) +-(i ** 1) +-(i ** f32) +-(i ** f64) +-(i ** i) +-(i ** i32) +-(i ** i64) +-(i ** int(i)) +-(i + 0.5) +-(i + 1) +-(i + f32) +-(i + f64) +-(i + i) +-(i + i64) +-(i - 0.5) +-(i - 1) +-(i - f32) +-(i - f64) +-(i - i) +-(i - i32) +-(i / 0.5) +-(i / 1) +-(i / f32) +-(i / f64) +-(i / i) +-(i / i32) +-(i ^ 0.5) +-(i ^ 1) +-(i ^ f32) +-(i ^ f64) +-(i ^ i) +-(i32 % 1 % i) +-(i32 % 1) +-(i32 % i) +-(i32 % i32) +-(i32 % i64) +-(i32 * 0.5) +-(i32 * 1) +-(i32 * f32) +-(i32 * f64) +-(i32 * i) +-(i32 * i32) +-(i32 * i64) +-(i32 ** 0.5) +-(i32 ** 1) +-(i32 ** f32) +-(i32 ** i) +-(i32 ** i32) +-(i32 ** i64) +-(i32 + 0.5) +-(i32 + 1 ^ i64) +-(i32 + 1) +-(i32 + f32) +-(i32 + f64) +-(i32 + i) +-(i32 + i32) +-(i32 + i64) +-(i32 - 0.5) +-(i32 - 1) +-(i32 - f32) +-(i32 - f64) +-(i32 - i) +-(i32 - i32) +-(i32 - i64) +-(i32 / 0.5) +-(i32 / 1) +-(i32 / f32) +-(i32 / f64) +-(i32 / i) +-(i32 / i32) +-(i32 / i64) +-(i32 ^ 0.5) +-(i32 ^ 1) +-(i32 ^ f32) +-(i32 ^ f64) +-(i32 ^ i) +-(i64 % 1) +-(i64 % i) +-(i64 % i32) +-(i64 % i64) +-(i64 * 0.5) +-(i64 * 1) +-(i64 * f32) +-(i64 * f64) +-(i64 * i) +-(i64 * i32) +-(i64 * i64) +-(i64 ** 0.5) +-(i64 ** 1) +-(i64 ** f32) +-(i64 ** f64) +-(i64 ** i) +-(i64 ** i32) +-(i64 ** i64) +-(i64 + 0.5) +-(i64 + 1) +-(i64 + f32) +-(i64 + f64) +-(i64 + i) +-(i64 + i32) +-(i64 + i64) +-(i64 - 0.5) +-(i64 - 1) +-(i64 - f64) +-(i64 - i) +-(i64 - i32) +-(i64 - i64) +-(i64 / 0.5) +-(i64 / 1 / 1) +-(i64 / 1) +-(i64 / f32) +-(i64 / f64) +-(i64 / i) +-(i64 / i32) +-(i64 / i64) +-(i64 ^ 0.5) +-(i64 ^ 1) +-(i64 ^ f32) +-(i64 ^ f64) +-(i64 ^ i) +-(i64 ^ i32) +-(i64 ^ i64) +-(max(0.5) + i64) +--(1 * i64) +--(i64 * 1) +---1 +---i +--0.5 +--1 +--abs(f64) +--f32 +--f64 +--i +--i32 +--i64 +--max(0.5) +-0.5 != 1 ? array : f64 +-0.5 != f32 +-0.5 != f64 ** 0.5 +-0.5 != i32 +-0.5 != max(i64) +-0.5 * f64 +-0.5 * i +-0.5 * i32 +-0.5 * i64 +-0.5 * len(array) +-0.5 ** f32 +-0.5 ** i +-0.5 ** i32 +-0.5 ** i64 +-0.5 + f32 +-0.5 + f64 +-0.5 + f64 / f64 +-0.5 + i +-0.5 + i32 +-0.5 - -i32 +-0.5 - 1 + 1 +-0.5 - f32 +-0.5 - f64 +-0.5 - i +-0.5 - i32 +-0.5 - i32 * i +-0.5 / (f32 + 0.5) +-0.5 / -i32 +-0.5 / f32 +-0.5 / f64 +-0.5 / float(f64) +-0.5 / i +-0.5 / i64 +-0.5 / i64 ** 1 +-0.5 < f32 +-0.5 < f64 +-0.5 < i32 +-0.5 < i32 ? false : "bar" +-0.5 < i32 ^ f64 +-0.5 <= 1 == false +-0.5 <= f32 +-0.5 <= f64 +-0.5 <= f64 + f32 +-0.5 <= i64 +-0.5 == f32 +-0.5 == f64 / 0.5 +-0.5 == i +-0.5 == i32 +-0.5 == i64 +-0.5 > f32 +-0.5 > f64 +-0.5 > i32 +-0.5 > i64 +-0.5 >= f64 +-0.5 >= i +-0.5 >= i32 +-0.5 >= i64 +-0.5 ^ f32 +-0.5 ^ f64 +-0.5 ^ i +-0.5 ^ i32 +-0.5 ^ i64 +-1 != f64 +-1 != i +-1 != i64 +-1 != i64 * f32 +-1 % i32 +-1 % i64 +-1 * 1 ** i64 +-1 * f32 +-1 * i32 +-1 * i64 +-1 ** f32 +-1 ** i +-1 ** i64 +-1 + 1 + 0.5 +-1 + f32 +-1 + half(f64) +-1 + i +-1 + i64 +-1 - f32 +-1 - i +-1 - i32 +-1 - i64 +-1 .. i +-1 .. i32 +-1 .. i64 +-1 / 1 * 1 +-1 / f32 +-1 / i32 +-1 < 0.5 ^ i64 +-1 < f32 +-1 < f64 * 1 +-1 < i32 +-1 < i64 +-1 <= f32 +-1 <= f32 == true +-1 <= f64 +-1 <= i32 +-1 == f32 +-1 == f64 +-1 == nil != nil +-1 > -i32 +-1 > f32 +-1 > half(0.5) +-1 > i +-1 > i32 +-1 > i64 +-1 > i64 ? array : nil +-1 >= 0.5 * 0.5 +-1 >= f32 +-1 >= f64 +-1 >= i32 +-1 >= i32 - 1 +-1 >= i64 +-1 ^ f32 +-1 ^ f64 +-1 ^ i64 +-1 in array +-1 not in array +-abs(0.5 * f64) +-abs(0.5) +-abs(1) +-abs(1) .. i +-abs(f32) +-abs(f64) +-abs(i) +-abs(i32) +-abs(i64) +-add(1, 1) +-add(i, 1) +-array[1] +-array[i32] +-array[i64] +-array[i] +-count(array, false) +-count(array, ok) +-count(array, true) +-count(list, ok) +-count(list, true) +-div(1, 1) +-div(1, i) +-div(i, i) +-f32 +-f32 != 1 / i +-f32 != f32 +-f32 != f64 +-f32 != i64 +-f32 * 1 ** i32 +-f32 * f32 +-f32 ** f32 +-f32 ** f32 ** 1 +-f32 ** i64 +-f32 + f32 +-f32 + i32 +-f32 + i64 +-f32 - f32 +-f32 - f64 +-f32 - i +-f32 - i32 +-f32 - i64 +-f32 / f32 +-f32 / i32 +-f32 / i64 +-f32 < f64 +-f32 < i32 +-f32 < i64 +-f32 <= i +-f32 <= i32 +-f32 == f32 +-f32 == f64 +-f32 == i +-f32 == i32 +-f32 == i64 +-f32 > f32 +-f32 > f64 +-f32 > i +-f32 > i64 +-f32 >= 1 / f32 +-f32 >= f32 +-f32 >= f64 +-f32 >= i64 +-f32 ^ f32 +-f32 ^ f64 +-f32 ^ i64 +-f32 ^ min(f64) +-f64 +-f64 != f64 +-f64 != i +-f64 != i64 +-f64 * f64 +-f64 ** f32 +-f64 ** i32 +-f64 ** i64 +-f64 + f32 +-f64 + i32 +-f64 + i64 +-f64 - 0.5 / i32 +-f64 - f64 +-f64 - i32 +-f64 / f64 +-f64 / i +-f64 / i64 +-f64 < f32 +-f64 < i +-f64 <= f32 +-f64 <= f64 +-f64 <= i32 +-f64 == f32 +-f64 == i +-f64 == i32 +-f64 > f64 +-f64 > i32 +-f64 > i64 +-f64 >= f64 +-f64 >= f64 ^ 0.5 +-f64 >= i +-f64 ^ 0.5 ** i64 +-f64 ^ f32 +-f64 ^ f64 +-f64 ^ i +-f64 ^ i32 +-f64 ^ i64 +-find(array, ok) +-find(array, true) +-findIndex(array, ok) +-findIndex(array, true) +-findIndex(list, ok) +-findLast(array, ok) +-findLast(array, true) +-findLastIndex(array, ok) +-findLastIndex(array, true) +-findLastIndex(list, ok) +-findLastIndex(list, true) +-first(array) +-float(-1) +-float(0.5) +-float(1) +-float(f32 ** 0.5) +-float(f32) +-float(f64) +-float(i) +-float(i32) +-float(i64) +-get(array, 1) +-get(array, i) +-get(array, i32) +-get(array, i64) +-half(-1) +-half(0.5) +-half(f64) +-i +-i != f64 +-i != i32 +-i != i32 * 1 +-i != i64 +-i % i +-i % i32 +-i % i64 +-i * f32 +-i * f64 +-i * i32 +-i * i64 +-i ** f32 +-i ** f64 +-i ** i32 +-i ** i64 +-i + f32 +-i + i +-i + i32 +-i + i64 +-i - f32 +-i - f64 +-i - i +-i - i64 +-i .. i32 +-i / f64 +-i / i +-i / i32 +-i / i64 +-i < f32 +-i < i64 +-i <= f32 +-i <= i32 +-i == -0.5 +-i == 1 ** f64 +-i == 1 + 0.5 +-i > f32 +-i > i +-i > i32 +-i >= f32 +-i >= i32 +-i ^ -i +-i ^ f64 +-i ^ i32 +-i not in array +-i32 +-i32 != f32 +-i32 != f64 +-i32 != i +-i32 != i64 +-i32 % i32 +-i32 % i64 +-i32 * f32 +-i32 * f64 +-i32 * i +-i32 * i32 +-i32 ** f64 +-i32 ** i32 +-i32 ** i64 +-i32 + 1 + i +-i32 + f32 +-i32 + f64 +-i32 + i +-i32 + i32 +-i32 - i32 +-i32 - i64 +-i32 .. i +-i32 .. i64 +-i32 / (i32 - f64) +-i32 / f64 +-i32 / i +-i32 < 0.5 * 1 +-i32 < f32 +-i32 < f64 - f64 +-i32 < i32 +-i32 < i64 +-i32 <= 0.5 ? f64 : 1 +-i32 <= f32 +-i32 <= f64 +-i32 <= f64 + i +-i32 == f32 +-i32 == i32 +-i32 > i +-i32 > i32 +-i32 > i64 +-i32 >= f32 +-i32 >= f64 +-i32 >= i64 +-i32 ^ (i - 0.5) +-i32 ^ i +-i32 ^ i32 +-i32 ^ i64 +-i32 ^ i64 ** i32 +-i32 in array +-i32 not in array +-i64 +-i64 != i +-i64 != i ? i : foo +-i64 != i64 +-i64 % i +-i64 % i32 +-i64 * f32 +-i64 * f64 +-i64 * i +-i64 * i32 +-i64 * i64 +-i64 ** f64 +-i64 ** i64 +-i64 + 0.5 * i32 +-i64 + f64 +-i64 + i +-i64 - f32 +-i64 - f64 +-i64 - i32 +-i64 - i64 +-i64 .. i +-i64 .. i32 +-i64 / f32 +-i64 / i +-i64 / i64 +-i64 / i64 * f32 +-i64 < -0.5 +-i64 < f32 +-i64 < f64 +-i64 < i +-i64 < i32 +-i64 < i64 +-i64 <= i32 +-i64 <= i64 +-i64 == f32 +-i64 == i +-i64 == i32 +-i64 == i64 +-i64 > f32 +-i64 > f64 +-i64 > i32 +-i64 >= i +-i64 >= i32 +-i64 >= i64 +-i64 ^ f64 +-i64 ^ i32 +-i64 ^ i64 +-i64 not in array +-i64 not in sort(array) +-int(0.5) +-int(1) +-int(f32) +-int(f64) +-int(i) +-int(i32) +-int(i64 - i) +-int(i64) +-int(int(1)) +-last(array) +-len("bar") +-len("foo") +-len([foo]) +-len(array) +-len(false ? greet : "foo") +-len(list) +-max(0.5 * i) +-max(0.5) +-max(0.5, 1) +-max(1) +-max(f32) +-max(f32, 0.5, f32) +-max(f32, i64) +-max(f64) +-max(i) +-max(i, 1) +-max(i, i64) +-max(i32) +-max(i32, 0.5) +-max(i64) +-max(score(1)) +-min(0.5) +-min(0.5, 1) +-min(0.5, i32) +-min(1) +-min(1, f32) +-min(f32) +-min(f32, 0.5) +-min(f64) +-min(f64, 0.5) +-min(f64, f32) +-min(f64, i64) +-min(i) +-min(i, i) +-min(i32) +-min(i32, 1) +-min(i32, f64) +-min(i64) +-min(i64, f32) +-min(i64, f64) +-score(1) +-score(1, 1) +-score(1, i) +-score(i) +-score(i, 1) +-score(i32 * i) +0.5 != 0.5 ? f64 : half +0.5 != 0.5 ? i64 : f64 +0.5 != 0.5 ? list : array +0.5 != 0.5 or ok +0.5 != f32 || 0.5 > 0.5 +0.5 != i && i64 > 1 +0.5 != i64 != ok +0.5 != i64 ? -f32 : add +0.5 != nil or ok +0.5 * 0.5 != i / 1 +0.5 * 0.5 * i +0.5 * 0.5 * i32 +0.5 * 0.5 + i32 +0.5 * 0.5 - i +0.5 * 0.5 / f64 +0.5 * 0.5 / i32 +0.5 * 0.5 < f32 +0.5 * 0.5 < i +0.5 * 0.5 > i32 +0.5 * 1 + f32 +0.5 * 1 + half(f64) +0.5 * 1 < f64 +0.5 * 1 > f64 +0.5 * 1 > i32 +0.5 * f32 / i64 +0.5 * f32 == i32 +0.5 * f64 * f64 +0.5 * f64 + i64 +0.5 * f64 > i +0.5 * f64 >= i +0.5 * f64 >= i64 +0.5 * i - i +0.5 * i / i64 +0.5 * i / i64 ^ 0.5 +0.5 * i == f32 +0.5 * i32 < i32 +0.5 * i32 in [f64] +0.5 * i64 != f32 +0.5 * i64 != i +0.5 * i64 + f32 +0.5 * i64 <= i64 +0.5 ** 0.5 != i +0.5 ** 0.5 ** f32 +0.5 ** 0.5 / f32 +0.5 ** 0.5 / i +0.5 ** 0.5 < i / i32 +0.5 ** 0.5 == f32 +0.5 ** 0.5 == i32 +0.5 ** 1 + i64 +0.5 ** 1 / f32 +0.5 ** f32 < 1 / f64 +0.5 ** f32 < i +0.5 ** f32 < i32 +0.5 ** f32 < min(i64) +0.5 ** f32 == f64 +0.5 ** f32 ^ f32 +0.5 ** f32 ^ i64 +0.5 ** f64 * f32 +0.5 ** f64 + -i +0.5 ** i * 0.5 ** i +0.5 ** i < f32 +0.5 ** i <= i32 +0.5 ** i > f32 +0.5 ** i ^ f64 +0.5 ** i32 != f64 +0.5 ** i32 <= i32 +0.5 ** i32 ^ f32 +0.5 ** i64 != f32 +0.5 ** i64 - f32 +0.5 ** i64 - i64 +0.5 ** i64 ^ min(i) +0.5 + 0.5 != i32 +0.5 + 0.5 - f32 +0.5 + 0.5 - i64 +0.5 + 0.5 < 1 ? f32 : score +0.5 + 0.5 <= f32 +0.5 + 0.5 == f64 +0.5 + 0.5 > i64 +0.5 + 0.5 >= i64 +0.5 + 1 != i +0.5 + 1 < f32 +0.5 + 1 >= i +0.5 + f32 != i +0.5 + f32 != i + i64 +0.5 + f32 >= i +0.5 + f64 == i32 +0.5 + f64 > f64 +0.5 + i > f32 +0.5 + i32 + i64 +0.5 + i32 < f32 +0.5 + i64 + f64 +0.5 + i64 < f64 +0.5 + i64 <= 0.5 + 1 +0.5 + i64 == i32 +0.5 + i64 >= i64 +0.5 - 0.5 != i64 +0.5 - 0.5 + i32 +0.5 - 0.5 - f64 +0.5 - 0.5 < 0.5 * f32 +0.5 - 0.5 == f32 +0.5 - 1 != i ? "foo" : div +0.5 - 1 + f32 +0.5 - 1 - f64 +0.5 - 1 <= i32 +0.5 - 1 <= i64 +0.5 - f32 + i +0.5 - f64 <= i32 +0.5 - i - i32 +0.5 - i > f64 +0.5 - i > i +0.5 - i32 + 0.5 ^ i +0.5 - i32 + f32 +0.5 - i32 < i +0.5 - i32 <= i64 +0.5 - i64 == f64 +0.5 - i64 > f32 +0.5 - i64 >= f64 +0.5 - i64 >= i +0.5 / 0.5 != i32 +0.5 / 0.5 / i +0.5 / 0.5 / i32 +0.5 / 0.5 < i +0.5 / 0.5 == i +0.5 / 0.5 >= i32 +0.5 / 0.5 >= min(i32) +0.5 / 1 != i32 == nil +0.5 / 1 - i +0.5 / 1 < f32 +0.5 / 1 < i32 +0.5 / 1 == i64 +0.5 / 1 > 1 ** 0.5 +0.5 / f32 != i32 +0.5 / f32 * f64 +0.5 / f64 / i +0.5 / f64 <= f64 +0.5 / f64 == i +0.5 / f64 == i64 +0.5 / f64 >= f64 ^ 1 +0.5 / i < f64 ? i64 : i64 +0.5 / i <= i +0.5 / i == i64 - f32 +0.5 / i32 + i32 +0.5 / i32 < f32 +0.5 / i64 * i32 +0.5 < 0.5 == nil ? true : foo +0.5 < 0.5 || ok +0.5 < 1 and ok +0.5 < 1 or fromJSON("foo")?.Bar +0.5 < f32 ? map(list, i32) : i +0.5 < f64 != false ? f32 : score +0.5 < f64 ? list : greet +0.5 < f64 || ok +0.5 < i ? f64 : foo +0.5 < i32 or i32 == 1 +0.5 < i64 or ok +0.5 <= 0.5 and ok +0.5 <= 1 ? half : greet +0.5 <= array[i32] +0.5 <= f32 or ok +0.5 <= f64 and !true +0.5 <= f64 or ok +0.5 <= i == ok +0.5 <= i and nil == list +0.5 <= i32 and i < i64 +0.5 <= i64 && f64 >= f64 +0.5 == 0.5 ? score : i +0.5 == 1 == ok +0.5 == 1 == ok ? "foo" : div +0.5 == 1 or ok +0.5 == 1 || nil != score +0.5 == f32 ? score : i32 +0.5 == f64 && ok +0.5 == nil || div != score +0.5 == nil || ok +0.5 > 1 == ok +0.5 > 1 or ok +0.5 > f32 or !true +0.5 > f64 != ok +0.5 >= 0.5 == ok +0.5 >= 0.5 || ok +0.5 >= 1 != ok +0.5 >= 1 and ok +0.5 >= i32 && i > f32 +0.5 >= i64 and ok +0.5 ^ 0.5 != i32 +0.5 ^ 0.5 + i32 +0.5 ^ 0.5 / i +0.5 ^ 0.5 < f64 +0.5 ^ 0.5 > i +0.5 ^ 0.5 > i64 +0.5 ^ 0.5 >= i32 +0.5 ^ 1 * f64 +0.5 ^ 1 * i +0.5 ^ 1 + i64 +0.5 ^ 1 - -i +0.5 ^ 1 / i +0.5 ^ 1 == f32 +0.5 ^ 1 == i32 +0.5 ^ f32 + i32 +0.5 ^ f32 <= i32 +0.5 ^ f32 > f64 ? array : nil +0.5 ^ f32 >= f64 +0.5 ^ f32 ^ i32 +0.5 ^ f64 - i32 +0.5 ^ f64 > f32 +0.5 ^ f64 >= f32 +0.5 ^ f64 >= f64 +0.5 ^ f64 >= i +0.5 ^ f64 ^ i64 +0.5 ^ i == i64 +0.5 ^ i >= i32 +0.5 ^ i32 * i +0.5 ^ i32 * score(i) +0.5 ^ i32 / i +0.5 ^ i32 == i +0.5 ^ i64 < i +0.5 ^ i64 <= f32 +0.5 ^ i64 == f64 +0.5 ^ i64 > f64 +0.5 ^ i64 > i +0.5 ^ i64 > i32 +0.5 ^ i64 >= f32 +1 != 1 != hasPrefix("bar", "bar") +1 != array[i - 1] +1 != f32 && i32 <= 0.5 +1 != f32 == ok +1 != f32 ? i64 : foo +1 != f32 and i in array +1 != f64 != ok +1 != i32 ? score : greet +1 != i64 && ok +1 != i64 ? f32 : greet +1 != nil && ok +1 != nil ? half : foo +1 % 1 != f64 +1 % 1 * f32 +1 % 1 < f32 +1 % 1 > f32 +1 % 1 > i +1 % 1 >= i64 +1 % i / i32 +1 % i < f64 +1 % i < i32 +1 % i == f32 +1 % i32 * i64 +1 % i32 < max(i64) +1 % i64 != f32 +1 % i64 * f64 +1 % i64 + f32 +1 % i64 .. i64 +1 % i64 <= i64 +1 % i64 > f32 +1 % i64 > i32 +1 * 0.5 + i +1 * 0.5 - -i +1 * 0.5 <= f32 +1 * 0.5 > f32 +1 * 1 % i +1 * 1 + i32 +1 * 1 <= f64 +1 * array[i64] +1 * f32 < i +1 * f32 < i32 +1 * f32 <= i32 +1 * f64 * -i +1 * f64 * f32 +1 * f64 + i +1 * i % i +1 * i + f32 +1 * i < int(1) +1 * i <= 1 % 1 +1 * i > f32 +1 * i not in array +1 * i32 % i64 +1 * i32 * i32 +1 * i32 / i32 +1 * i32 > f32 +1 * i64 + f64 +1 * i64 == i32 +1 * i64 > i64 +1 ** 0.5 * f64 +1 ** 0.5 - i +1 ** 0.5 > i32 +1 ** 0.5 ^ f64 +1 ** 1 != i +1 ** 1 != i64 +1 ** 1 - i +1 ** 1 / i64 +1 ** 1 < i64 +1 ** 1 == i32 +1 ** 1 >= i +1 ** f32 != i64 +1 ** f32 / i +1 ** f64 != i64 +1 ** f64 ** i64 +1 ** f64 + i +1 ** f64 / f32 +1 ** f64 < i +1 ** i != i +1 ** i ** i64 +1 ** i < f64 +1 ** i < i32 +1 ** i > f64 +1 ** i32 ** (1 / 1) +1 ** i32 == i +1 ** i32 > i +1 ** i64 ** f64 +1 ** i64 - f64 +1 + 0.5 != i +1 + 0.5 <= f64 / f32 +1 + 0.5 <= i32 +1 + 1 - i32 +1 + 1 < i +1 + 1 == f64 +1 + 1 == i64 +1 + 1 >= i64 +1 + f32 != i +1 + f32 > i +1 + f64 != f64 +1 + f64 - i +1 + f64 >= i32 +1 + i <= f64 +1 + i in map(list, i32) +1 + i32 - i64 +1 + i32 < i +1 + i64 >= f32 +1 - 0.5 != half(0.5) +1 - 0.5 + i +1 - 0.5 + i32 +1 - 0.5 - i64 +1 - 0.5 <= f64 +1 - 0.5 == i64 +1 - 1 .. i64 +1 - 1 < i64 +1 - 1 == f64 +1 - 1 > -f32 +1 - f32 != i +1 - f32 <= f64 +1 - f32 <= i32 +1 - f64 - f32 +1 - f64 - f64 +1 - f64 < i64 +1 - f64 <= i +1 - i .. i64 +1 - i < min(f64) +1 - i32 < f64 +1 - i32 <= f64 +1 - i32 <= i32 +1 - i32 >= f64 +1 - i64 + i +1 - i64 - f32 +1 .. 1 == list +1 .. array[i] +1 .. i == list +1 .. i64 == list +1 / 0.5 + f64 +1 / 0.5 - array[i64] +1 / 0.5 < f64 +1 / 1 + -0.5 +1 / 1 + i32 +1 / 1 - -0.5 +1 / 1 / f64 +1 / 1 < f32 +1 / 1 <= f32 +1 / 1 <= i +1 / 1 == f64 +1 / 1 == i +1 / 1 == i32 +1 / 1 > f32 +1 / 1 > i64 +1 / f32 + -1 +1 / f64 * i +1 / f64 * i32 +1 / f64 + i32 +1 / f64 / f32 +1 / f64 == f32 +1 / f64 == i +1 / f64 > i +1 / i * i +1 / i < f64 ? ok : add +1 / i32 <= f32 +1 / i32 == i +1 / i32 == i64 +1 / i32 > i +1 / i64 + i64 +1 / i64 == i64 +1 / i64 > i +1 / i64 >= i32 +1 < array[i64] +1 < f64 != ok +1 < i32 and 1 == nil +1 < i64 ? "foo" not endsWith "foo" : i +1 <= 0.5 and i32 == 1 +1 <= 0.5 || ok +1 <= 1 && greet != greet +1 <= 1 and ok +1 <= f32 != ok +1 <= f32 == !ok +1 <= f64 ? add : f64 +1 <= i64 or nil == f32 +1 == array[i] +1 > 0.5 != ok +1 > 1 and ok +1 > 1 || ok +1 > f32 and ok +1 > f64 == ok +1 > f64 and ok +1 > i32 == ok +1 > i64 || i32 < i +1 >= 1 || ok +1 >= i || ok +1 >= i64 or nil in list +1 ^ 0.5 - f32 +1 ^ 0.5 <= f32 +1 ^ 0.5 <= i64 +1 ^ 0.5 ^ i32 +1 ^ 1 - f64 +1 ^ 1 - i32 +1 ^ 1 - i64 +1 ^ 1 / f32 +1 ^ 1 < f32 +1 ^ 1 < i64 / f32 +1 ^ 1 <= 1 ** f64 +1 ^ 1 == f64 +1 ^ 1 >= f32 +1 ^ 1 >= i64 +1 ^ f32 == i64 +1 ^ f32 > max(f32) +1 ^ f64 != i32 +1 ^ f64 * f32 +1 ^ f64 ** f64 +1 ^ i != findLast(array, false) +1 ^ i != i +1 ^ i * f64 +1 ^ i < i32 +1 ^ i <= f32 +1 ^ i == abs(1) +1 ^ i32 + i +1 ^ i32 < i +1 ^ i32 < i64 +1 ^ i32 >= i32 +1 ^ i64 ** f64 +1 ^ i64 ** i32 +1 ^ i64 + i +1 ^ i64 <= i +1 ^ i64 <= i32 +1 ^ i64 > i +1 ^ i64 >= i64 +[!false] +[!ok] +["foo" != nil] +["foo" endsWith "bar"] +[-0.5] +[-f32] +[-f64] +[-i32] +[-i64, add] +[-i64] +[0.5 * 1] +[0.5 + 0.5] +[0.5 / i] +[0.5 <= f64] +[0.5 <= i, -1] +[0.5 >= i] +[0.5 ^ 1] +[1 != 1] +[1 % 1, !true] +[1 < 0.5] +[1 == i] +[abs(0.5)] +[add != div] +[add == nil] +[add, array] +[add, f32] +[add, f64] +[add, greet] +[add, half] +[add, i64] +[add, score] +[add, toJSON(array)] +[add] +[array == list] +[array, f32] +[array, f64] +[array, greet] +[array, half] +[array, list] +[array, ok] +[array, score] +[array[1]] +[array[i64]] +[array] +[div == half] +[div, f32] +[div, greet] +[div, map(list, half)] +[div, ok] +[div, score] +[div] +[f32 + 1] +[f32 - 0.5] +[f32 < i] +[f32 ^ 0.5] +[f32 ^ f64] +[f32, f64] +[f32, half] +[f32, max(f64)] +[f32] +[f64 != 1] +[f64 != i32] +[f64 * f64] +[f64 < f32] +[f64 >= 1] +[f64, f64] +[f64, foo] +[f64, i32] +[f64, i64] +[f64, list] +[f64, score] +[f64] +[false ? f64 : f32] +[findIndex(array, true)] +[first(array)] +[float(i64)] +[foo, add] +[foo, f32] +[foo, foo] +[foo, i] +[foo, list] +[foo.Qux] +[foo.String(), greet] +[foo.String()] +[foo?.Bar] +[foo?.Qux] +[foo] +[greet, div] +[greet, f32 ^ 0.5] +[greet, f32] +[greet, f64] +[greet, half] +[greet, i32] +[greet, i64] +[greet, list] +[greet] +[half, div] +[half, foo] +[half, greet] +[half] +[i != i64] +[i != i] +[i - 1] +[i .. 1] +[i / 0.5] +[i < f32] +[i > f64] +[i, add] +[i, half] +[i32 * 1] +[i32 <= 0.5] +[i32 == 0.5] +[i32 > 1] +[i32 > f32] +[i32, i] +[i32, score] +[i32] +[i64 / f64] +[i64 == i32] +[i64 >= 1] +[i64 ^ i, i32] +[i64, add] +[i64, div] +[i64, foo] +[i64, i32] +[i64, ok] +[i64] +[i64] == array +[i] +[int(1)] +[len(array)] +[list == list] +[list, div] +[list, f64] +[list, i] +[list] +[map(array, #)] +[map(array, 1 >= i32)] +[map(array, foo)] +[map(list, #)] +[map(list, half)] +[map(list, ok)] +[max(1)] +[max(i32)] +[min(0.5)] +[min(f64)] +[min(i32)] +[nil != ok, foo] +[nil == 0.5] +[nil not in list] +[not false] +[not ok] +[not true] +[ok && ok] +[ok, f32] +[ok, half] +[ok, score] +[ok] +[score != add] +[score(1)] +[score(i)] +[score, array, foo] +[score, f32] +[score, f64] +[score, greet] +[score] +[string(0.5), foo] +[string(f64)] +[string(i32)] +[toJSON(1)] +[toJSON(nil)] +[type(0.5)] +[type(1)] +[type(add)] +[type(false)] +[type(i32)] +[{"foo": foo}] +abs(-0.5) abs(-1) -int(0.5) -float(42) +abs(-f32) +abs(-f64) +abs(-i) +abs(-i32) +abs(-i64) +abs(0.5 * 0.5) +abs(0.5 * 1) +abs(0.5 * f64) +abs(0.5 * i32) +abs(0.5 * i64) +abs(0.5 ** 0.5) +abs(0.5 ** 1) +abs(0.5 ** f32) +abs(0.5 ** f64) +abs(0.5 ** i64) +abs(0.5 + 0.5) +abs(0.5 + f32) +abs(0.5 + i) +abs(0.5 + i64) +abs(0.5 - 0.5) +abs(0.5 - f32) +abs(0.5 - i) +abs(0.5 - i64) +abs(0.5 / 0.5) +abs(0.5 / 1) +abs(0.5 / f32) +abs(0.5 / f64) +abs(0.5 / i) +abs(0.5 / i64) +abs(0.5 ^ 0.5) +abs(0.5 ^ 1) +abs(0.5 ^ f64) +abs(0.5 ^ i32) +abs(0.5) * i +abs(0.5) - i +abs(0.5) - i64 +abs(0.5) / i32 +abs(0.5) < f32 +abs(0.5) == i32 +abs(0.5) > f32 +abs(0.5) >= f32 +abs(0.5) >= i +abs(0.5) >= i32 +abs(0.5) ^ f64 +abs(1 % 1) +abs(1 % i) +abs(1 * 0.5) +abs(1 * 1) +abs(1 * f32) +abs(1 ** 1) +abs(1 ** i) +abs(1 + 1) +abs(1 + f64) +abs(1 - 0.5) +abs(1 - i) +abs(1 - i32) +abs(1 / 0.5) +abs(1 / 1) +abs(1 / f32) +abs(1 / f64) +abs(1 / i32) +abs(1 / i64) +abs(1 ^ 0.5) +abs(1 ^ 1) +abs(1 ^ f64) +abs(1) * f64 +abs(1) * i +abs(1) ** f64 +abs(1) + f64 +abs(1) + i +abs(1) - f64 +abs(1) .. i +abs(1) / f32 +abs(1) < f32 +abs(1) < i +abs(1) == f64 ? 1 : foo +abs(1) > i +abs(1) ^ f32 +abs(1) ^ i32 +abs(abs(0.5)) +abs(abs(1)) +abs(abs(abs(i))) +abs(abs(f32)) +abs(abs(f64)) +abs(abs(i)) +abs(abs(i32)) +abs(abs(i64)) +abs(array[1]) +abs(array[i]) +abs(count(list, true)) +abs(f32 * 0.5) +abs(f32 * 1) +abs(f32 * f64) +abs(f32 ** 0.5) +abs(f32 ** 1) +abs(f32 ** i32) +abs(f32 + 0.5) +abs(f32 + 1) +abs(f32 + f32) +abs(f32 + f64) +abs(f32 + i) +abs(f32 + i32) +abs(f32 - 0.5) +abs(f32 - 1) +abs(f32 - f32) +abs(f32 / 1) +abs(f32 / f32) +abs(f32 / f64) +abs(f32 / i32) +abs(f32 ^ 1) +abs(f32 ^ f64) +abs(f32 ^ i32) +abs(f32 ^ i64) +abs(f32) +abs(f32) != i64 / i64 +abs(f32) * i32 +abs(f32) + i32 +abs(f32) <= i64 +abs(f32) == i +abs(f32) ^ f64 +abs(f64 * 1) +abs(f64 * f32) +abs(f64 * i32) +abs(f64 ** 1) +abs(f64 ** f32) +abs(f64 ** i32) +abs(f64 + 0.5) +abs(f64 + 1) +abs(f64 + i32) +abs(f64 + i64) +abs(f64 - 0.5) +abs(f64 - 1) +abs(f64 - f32) +abs(f64 - i32) +abs(f64 / 0.5) +abs(f64 / f64) +abs(f64 / i) +abs(f64 / i64) +abs(f64 ^ i32) +abs(f64) +abs(f64) * i64 +abs(f64) - f32 +abs(f64) - i64 - i32 +abs(f64) / i +abs(f64) / i64 +abs(f64) < f64 +abs(f64) <= abs(i32) +abs(f64) <= i +abs(f64) <= i32 +abs(f64) == i +abs(false ? 1 : f32) +abs(false ? f64 : 0.5) +abs(false ? false : i64) +abs(findIndex(array, # > i32)) +abs(findIndex(array, ok)) +abs(findIndex(array, true)) +abs(findIndex(list, true)) +abs(findLastIndex(array, ok)) +abs(findLastIndex(array, true)) +abs(findLastIndex(list, ok)) +abs(first(array)) +abs(float(0.5)) +abs(float(1)) +abs(float(f32)) +abs(float(f64)) +abs(float(i)) +abs(float(i32)) +abs(float(i64)) +abs(get(array, i32)) +abs(get(array, i64)) +abs(half(0.5)) +abs(half(f64)) +abs(i % i64) +abs(i * 1) +abs(i * i) +abs(i * i32) +abs(i ** 0.5) +abs(i ** 1) +abs(i ** i32) +abs(i + 1) +abs(i + i32) +abs(i - 0.5) +abs(i - 1) +abs(i / 1) +abs(i / i32) +abs(i ^ 0.5) +abs(i ^ f32) +abs(i ^ i32) +abs(i) +abs(i) != float(0.5) +abs(i) % i64 +abs(i) * f32 +abs(i) ** i +abs(i) ** max(1) +abs(i) / i64 +abs(i) <= i32 +abs(i) <= i64 +abs(i) > f64 +abs(i32 % i64) +abs(i32 * 0.5) +abs(i32 * 1) +abs(i32 * i32) +abs(i32 * i64) +abs(i32 ** 0.5) +abs(i32 ** 1) +abs(i32 ** f64) +abs(i32 ** i) +abs(i32 ** i64) +abs(i32 + 0.5) +abs(i32 + f64) +abs(i32 + i32) +abs(i32 - 1) +abs(i32 - f32) +abs(i32 - f64) +abs(i32 - i64) +abs(i32 / 1) +abs(i32 / i) +abs(i32 / i32) +abs(i32 ^ 0.5) +abs(i32 ^ 1) +abs(i32 ^ i) +abs(i32 ^ i64) +abs(i32) +abs(i32) % i32 +abs(i32) ** i64 +abs(i32) / -f32 +abs(i32) < f32 +abs(i32) > min(i64, f64, i32) +abs(i32) ^ f64 +abs(i32) not in array +abs(i64 % 1) +abs(i64 % i32) +abs(i64 * 1) +abs(i64 * f32) +abs(i64 * i) +abs(i64 * i32) +abs(i64 * i64) +abs(i64 ** 0.5) +abs(i64 ** 1) +abs(i64 ** i64) +abs(i64 + 0.5) +abs(i64 + 1) +abs(i64 + i) +abs(i64 + i32) +abs(i64 + i64) +abs(i64 - 1) +abs(i64 - f64) +abs(i64 - i32) +abs(i64 / i32) +abs(i64 ^ i64) +abs(i64) +abs(i64) != f64 +abs(i64) - f64 +abs(i64) - i64 +abs(i64) .. i64 +abs(i64) == f32 +abs(i64) == i +abs(i64) == i32 +abs(i64) == nil ? i : f64 +abs(i64) > i64 +abs(i64) >= f64 +abs(i64) in array +abs(int(0.5)) +abs(int(1)) +abs(int(f32)) +abs(int(f64)) +abs(int(i)) +abs(int(i32)) +abs(int(i64)) +abs(last(array)) +abs(len("bar")) +abs(len("foo")) +abs(len(array)) +abs(len(list)) +abs(max(0.5)) +abs(max(1)) +abs(max(1, 1)) +abs(max(1, i64, f64)) +abs(max(f32)) +abs(max(f64)) +abs(max(i)) +abs(max(i32)) +abs(max(i64)) +abs(min(0.5)) +abs(min(0.5, 1)) +abs(min(1)) +abs(min(1, f32)) +abs(min(f32)) +abs(min(f64)) +abs(min(i)) +abs(min(i32)) +abs(min(i64)) +abs(ok ? 1 : "foo") +abs(ok ? f32 : 1) +abs(ok ? i : "bar") +abs(score(1)) +abs(score(i)) +abs(true ? f32 : "bar") +abs(true ? f64 : i32) +add +add != add +add != div +add != div ? foo : i64 +add != div and ok +add != foo.Qux +add != foo.String +add != foo?.Qux +add != foo?.String +add != greet +add != greet ? score : f32 +add != half +add != half == nil +add != half ? 0.5 : ok +add != nil == nil +add != nil ? "bar" : f32 +add != nil ? half : f32 +add != score +add == add +add == add == ok +add == div +add == div ? i32 : f64 +add == div or ok +add == foo.Qux +add == foo.String +add == foo?.Qux +add == foo?.String +add == greet +add == greet ? 1 : 1 +add == half +add == nil && ok +add == nil ? "foo" : list +add == nil ? add : half +add == nil ? add : score +add == nil ? i32 : div +add == nil ? score : i64 +add == nil || ok +add == score +add == score != true +add == score and i32 >= 1 +add == score or 0.5 < 1 +add in [div] +add not in [f64] +add not in sort(array) +add(1, 1) ** i +add(1, 1) ^ i +add(1, i) .. i64 +add(i, 1 - i32) +add(i, abs(i)) +add(i, i) +add(i, i64 % 1) +add(i, min(i)) +add(min(1, 1), i32 * 1) +add(score(i, i), i) +all(1 .. i32, ok) +all(array, !(# <= #)) +all(array, !false) +all(array, !ok) +all(array, !true or 0.5 < #) +all(array, "bar" in foo) +all(array, "bar" matches "bar") +all(array, # != #) +all(array, # != 1) +all(array, # != f32) +all(array, # != f64) +all(array, # != i64) +all(array, # != nil) +all(array, # + # >= 0.5 + i) +all(array, # < #) +all(array, # < 0.5) +all(array, # < 1) +all(array, # <= #) +all(array, # <= 0.5) +all(array, # <= f64) +all(array, # <= i) +all(array, # == #) +all(array, # == 0.5) +all(array, # == i32) +all(array, # == i64) +all(array, # == nil) +all(array, # > #) +all(array, # > 0.5) +all(array, # > 1) +all(array, # > f32) +all(array, # > f64) +all(array, # > i) +all(array, # > i64) +all(array, # >= #) +all(array, # >= 0.5) +all(array, # >= f64) +all(array, # >= i) +all(array, # ^ # == i64) +all(array, # in array) +all(array, # not in array) +all(array, 0.5 != #) +all(array, 0.5 != f32) +all(array, 0.5 + 0.5 >= #) +all(array, 0.5 < #) +all(array, 0.5 < 1) +all(array, 0.5 < i64) +all(array, 0.5 <= #) +all(array, 0.5 == #) +all(array, 0.5 == f32) +all(array, 0.5 > #) +all(array, 0.5 > 1) +all(array, 0.5 >= #) +all(array, 1 != #) +all(array, 1 != i) +all(array, 1 != i64) +all(array, 1 != nil) +all(array, 1 < #) +all(array, 1 <= #) +all(array, 1 == #) +all(array, 1 > #) +all(array, 1 in array) +all(array, all(array, add != score)) +all(array, all(array, false)) +all(array, all(list, false)) +all(array, f32 >= #) +all(array, f64 != #) +all(array, f64 != i32) +all(array, f64 < #) +all(array, f64 <= #) +all(array, f64 == #) +all(array, f64 > #) +all(array, false or ok) +all(array, i != f32) +all(array, i == #) +all(array, i > #) +all(array, i >= #) +all(array, i32 != i64) +all(array, i32 < #) +all(array, i32 <= #) +all(array, i32 <= i32) +all(array, i32 > #) +all(array, i32 >= 1 % #) +all(array, i64 < #) +all(array, i64 < 1) +all(array, i64 < i64) +all(array, i64 == #) +all(array, i64 == 0.5) +all(array, i64 > #) +all(array, list != list) +all(array, nil != #) +all(array, nil != i) +all(array, nil == "foo") +all(array, nil == div) +all(array, nil in list) +all(array, not (nil in array)) +all(array, not false) +all(array, not true) +all(array, ok) +all(array, one(array, ok)) +all(array, score == add) +all(array, score(#) > f32) +all(array, true || false) +all(array, true) or ok +all(false ? greet : "foo", # == i32) +all(filter(array, ok), # < #) +all(filter(array, true), ok) +all(i32 .. 1, 0.5 < i32) +all(i64 .. i64, # != #) +all(list, !any(array, false)) +all(list, !false) +all(list, !ok) +all(list, "bar" not in #) +all(list, "foo" >= "foo") +all(list, # != #) +all(list, # != foo) +all(list, # == #) +all(list, # == foo) +all(list, 0.5 != f64) +all(list, 0.5 != nil) +all(list, 0.5 <= f64) +all(list, 0.5 > 1) +all(list, 1 != 0.5) +all(list, 1 != i) +all(list, 1 < f32) +all(list, 1 < i) +all(list, 1 <= 0.5) +all(list, 1 == 1) +all(list, 1 > f32) +all(list, 1 >= i64) +all(list, all(array, true)) +all(list, array != nil) +all(list, div != div) +all(list, f32 != 0.5) +all(list, f32 == f64) +all(list, f64 < 1) +all(list, f64 <= 1) +all(list, f64 <= i) +all(list, f64 <= i32) +all(list, f64 >= 1) +all(list, false) or 0.5 <= 1 +all(list, foo != #) +all(list, greet != half) +all(list, greet == score) +all(list, i <= i64) +all(list, i32 != i64) +all(list, i32 < i64) +all(list, i32 <= 0.5) +all(list, i32 <= f64) +all(list, int(i32) != i32) +all(list, list != nil) +all(list, nil != 1) +all(list, nil != foo) +all(list, nil == #) +all(list, nil == greet) +all(list, nil in list) +all(list, none(array, ok)) +all(list, not false) +all(list, not ok) +all(list, not true) +all(list, ok and false) +all(list, ok) +all(list, ok) or ok +all(list, true != false) +all(list, true != true) +all(list, true ? true : 1) +all(list[i64:i32], !false) +all(map(array, #), # != #) +all(map(array, #), # != 0.5) +all(map(array, #), # >= #) +all(map(array, #), i64 == #) +all(map(array, #), true or false) +all(map(array, 1), ok) +all(map(array, i), f64 > #) +all(map(array, ok), #) +all(map(list, "bar"), ok) +all(map(list, #), "bar" not in #) +all(map(list, #), f32 > 1) +all(map(list, 1), ok) +all(map(list, false), #) +all(map(list, i64), # <= #) +all(map(list, ok), #) +all(map(list, true), # == #) +all(map(list, true), #) +all(map(list, true), ok) +any([0.5, add, 0.5], # == #) +any([1], i64 >= #) +any(array, !false) +any(array, "foo" <= "foo") +any(array, # != #) +any(array, # != 0.5) +any(array, # != 1) +any(array, # != i) +any(array, # != i32) +any(array, # != i64) +any(array, # != nil) +any(array, # < #) +any(array, # < 0.5) +any(array, # < 1) +any(array, # < f32) +any(array, # < f64) +any(array, # < i) +any(array, # < i32) +any(array, # <= #) +any(array, # <= 0.5) +any(array, # <= 1 ^ #) +any(array, # <= 1) +any(array, # <= i) +any(array, # <= i32) +any(array, # == #) +any(array, # == 1) +any(array, # == f64) +any(array, # == i) +any(array, # == i32) +any(array, # == i64) +any(array, # == nil) +any(array, # > #) +any(array, # > 1) +any(array, # > i32) +any(array, # > i64) +any(array, # >= #) +any(array, # >= 0.5) +any(array, # >= 1) +any(array, # >= f64) +any(array, # >= i) +any(array, # >= i32) +any(array, # in array) +any(array, # not in array) +any(array, 0.5 != #) +any(array, 0.5 != f64) +any(array, 0.5 != i) +any(array, 0.5 < 0.5) +any(array, 0.5 <= #) +any(array, 0.5 == #) +any(array, 0.5 == 0.5) +any(array, 0.5 > #) +any(array, 0.5 > f32) +any(array, 1 < #) +any(array, 1 <= i64) +any(array, 1 == #) +any(array, 1 > f64) +any(array, 1 >= i) +any(array, 1 >= i32) +any(array, all(list, true)) +any(array, array == array) +any(array, div != nil) +any(array, f32 < #) +any(array, f32 > #) +any(array, f64 != #) +any(array, f64 != 1) +any(array, f64 < #) +any(array, f64 <= 0.5) +any(array, f64 <= f32) +any(array, f64 == #) +any(array, f64 > #) +any(array, f64 > 0.5) +any(array, f64 >= i64) +any(array, false != nil) +any(array, false) and f32 != f32 +any(array, greet != half) +any(array, half != div) +any(array, half != nil) +any(array, i != 1) +any(array, i < # ** #) +any(array, i <= #) +any(array, i == #) +any(array, i == i) +any(array, i > #) +any(array, i >= #) +any(array, i32 != #) +any(array, i32 != i64) +any(array, i32 <= #) +any(array, i32 == #) +any(array, i32 > #) +any(array, i32 >= i64) +any(array, i64 != #) +any(array, i64 != i64) +any(array, i64 <= 0.5) +any(array, i64 == #) +any(array, i64 > #) +any(array, i64 > 1) +any(array, i64 > f32) +any(array, i64 >= i) +any(array, nil != #) +any(array, nil != f64) +any(array, nil != greet) +any(array, nil == #) +any(array, nil == 1) +any(array, not ok) +any(array, not true) +any(array, ok) +any(array, one(list, false)) +any(array, true ? ok : f32) +any(array, true) and ok +any(filter(array, ok), ok) +any(filter(list, false), ok) +any(filter(list, true), # == #) +any(list, !true) +any(list, "bar" contains "foo") +any(list, "bar" matches "foo") +any(list, "bar" not in #) +any(list, "bar" not startsWith "foo") +any(list, # != #) +any(list, # != foo) +any(list, # != nil) +any(list, # == #) +any(list, # == nil) +any(list, # in list) +any(list, # not in list) +any(list, 0.5 < 1) +any(list, 0.5 <= f32) +any(list, 0.5 == 0.5) +any(list, 0.5 >= 0.5) +any(list, 0.5 >= f32) +any(list, 0.5 >= i64) +any(list, 1 <= 0.5) +any(list, 1 == f32) +any(list, f32 != i) +any(list, f32 == nil) +any(list, f32 >= i) +any(list, f64 <= 1) +any(list, f64 > 0.5) +any(list, false ? nil : false) +any(list, foo == foo) +any(list, greet == div) +any(list, half != nil) +any(list, i != 1) +any(list, i < f32) +any(list, i < f64) +any(list, i > i64) +any(list, i32 != i32) +any(list, i32 < 0.5) +any(list, i32 == f64) +any(list, i64 < 1) +any(list, i64 < f64) +any(list, i64 < i64) +any(list, i64 <= i32) +any(list, i64 >= 1) +any(list, i64 >= f32) +any(list, list != nil) +any(list, nil != #) +any(list, nil != #?.String()) +any(list, nil != nil) +any(list, nil == #) +any(list, nil == 1) +any(list, nil == i64) +any(list, nil == nil) +any(list, not false) +any(list, not ok) +any(list, ok and foo != #) +any(list, ok) +any(list, ok) && i <= 1 +any(list, ok) ? array : foo +any(list, true or ok) +any(list, true) ? f64 : foo.Bar +any(map(array, #), # == #) +any(map(array, #), ok) +any(map(array, 0.5), # <= #) +any(map(array, f64), # < #) +any(map(array, false), #) +any(map(array, ok), #) +any(map(list, #), i == f64) +any(map(list, #), ok) +any(map(list, 1), # != #) +any(map(list, array), ok) +any(map(list, foo), # != #) +any(map(list, greet), # == #) +any(ok ? "bar" : half, ok) +any(splitAfter("bar", "foo"), # not startsWith #) +array +array != [array] +array != array +array != filter(list, true) +array != list +array != map(array, i) +array != nil != ok +array != nil ? 0.5 : i32 +array != nil ? true : nil +array != nil or nil == f32 +array != nil || ok +array != sort(array) +array != {"bar": f32, "foo": 1}.ok +array == array +array == array ? "foo" : 0.5 +array == list +array == list ? i : half +array == map(array, #) +array == map(array, add) +array == nil != nil +array == nil != true ? 0.5 : 0.5 +array == nil && (false || ok) +array in [i] +array[-1] +array[-i32] +array[-i64] +array[-i] +array[1 % 1] +array[1 % i:i64] +array[1] != f32 +array[1] != score(i) +array[1] <= f64 +array[1] == f32 +array[1] == i64 +array[1] ^ 0.5 ^ f64 +array[1] ^ i32 +array[false ? half : 0.5] +array[false ? i : i32] +array[i - i64] +array[i32:i32] +array[i32] +array[i32] - f64 +array[i32] .. i32 +array[i64 % 1] +array[i64:i32] +array[i64:i] +array[i64] +array[i64] ** f32 +array[i64] / i +array[i64] < i +array[i64] == f64 +array[i64] > f32 +array[i64] >= -i64 +array[i:i64] +array[i:i] +array[i] +array[i] ** i64 +array[i] + f32 +array[i] < i +array[i] == min(i32, i) +array[i] > i32 +array[int(1)] +array[int(i32)] +array[max(i64)] +array[min(1)] +array[min(i32)] +array[min(i64)] +array[score(1)] +array[score(i)] +count([list], false or ok) +count(array, !ok) +count(array, "bar" != "bar") +count(array, "bar" not endsWith "bar") +count(array, # != #) +count(array, # != f32) +count(array, # != i32) +count(array, # < #) +count(array, # < 0.5) +count(array, # < 1) +count(array, # < f32) +count(array, # < f64) +count(array, # < i) +count(array, # < i64) +count(array, # <= #) +count(array, # <= 0.5) +count(array, # <= f32) +count(array, # <= f64) +count(array, # <= i) +count(array, # <= i32) +count(array, # == #) +count(array, # == 1) +count(array, # == f32) +count(array, # == i) +count(array, # == i64) +count(array, # == nil) +count(array, # > #) +count(array, # > 0.5) +count(array, # > i) +count(array, # > i64) +count(array, # >= # / #) +count(array, # >= #) +count(array, # >= 0.5) +count(array, # >= 1) +count(array, # >= f64) +count(array, # >= i) +count(array, # >= i64) +count(array, 0.5 != #) +count(array, 0.5 <= #) +count(array, 0.5 == #) +count(array, 0.5 > #) +count(array, 0.5 > 1) +count(array, 0.5 >= #) +count(array, 0.5 >= 0.5) +count(array, 0.5 >= i) +count(array, 1 != #) +count(array, 1 < #) +count(array, 1 < 0.5) +count(array, 1 < 1) +count(array, 1 <= #) +count(array, 1 > #) +count(array, 1 >= #) +count(array, add == half) +count(array, f32 != i) +count(array, f32 < # ? true : half) +count(array, f32 < #) +count(array, f32 < 0.5) +count(array, f32 <= #) +count(array, f32 <= 1) +count(array, f32 <= i) +count(array, f32 == #) +count(array, f32 == 1) +count(array, f64 != #) +count(array, f64 < #) +count(array, f64 <= #) +count(array, f64 == #) +count(array, f64 > #) +count(array, false == true) +count(array, false) != f64 +count(array, false) / i +count(array, false) >= f32 +count(array, foo not in list) +count(array, greet != greet) +count(array, greet == score) +count(array, i != f32) +count(array, i == nil) +count(array, i > #) +count(array, i >= #) +count(array, i32 != 1) +count(array, i32 < #) +count(array, i32 < 0.5) +count(array, i32 == #) +count(array, i32 > i) +count(array, i32 >= #) +count(array, i32 >= 1) +count(array, i64 != #) +count(array, i64 < #) +count(array, i64 <= 1) +count(array, i64 <= f64) +count(array, i64 == #) +count(array, i64 == i64) +count(array, i64 > 1) +count(array, i64 > f32) +count(array, nil != #) +count(array, nil == #) +count(array, nil == foo) +count(array, not ok) +count(array, ok) +count(array, ok) + i64 +count(array, ok) - i64 +count(array, ok) .. i64 +count(array, one(array, false)) +count(array, true ? false : 0.5) +count(array, true) != 1 ^ f32 +count(array, true) ** f32 +count(array, true) / int(0.5) +count(array, true) >= f64 / 0.5 +count(filter(list, false), ok) +count(i .. 1, # > #) +count(i .. i32, # > #) +count(i32 .. 1, # == #) +count(i64 .. i, div == nil) +count(i64 .. i, ok) +count(list, !false) +count(list, !ok) +count(list, "bar" == "bar") +count(list, "bar" in #) +count(list, "bar" matches "foo") +count(list, "bar" not in #) +count(list, "foo" in #) +count(list, "foo" not in #) +count(list, # != #) +count(list, # != nil) +count(list, # == #) +count(list, # == nil) +count(list, 0.5 == f32) +count(list, 0.5 > 0.5) +count(list, 0.5 >= i32) +count(list, 1 != 1) +count(list, 1 != f32) +count(list, 1 < 0.5) +count(list, 1 <= i) +count(list, 1 >= f32) +count(list, 1 >= i32) +count(list, all(list, true)) +count(list, f32 <= i32) +count(list, f64 != i) +count(list, false ? # : ok) +count(list, false or ok) +count(list, false || false) +count(list, false) .. i32 +count(list, false) > i64 +count(list, foo != #) +count(list, half == div) +count(list, i == i64) +count(list, i32 == i) +count(list, i32 == i32) +count(list, list == array) +count(list, nil != #) +count(list, nil != score) +count(list, nil == #) +count(list, nil == add) +count(list, nil == true) +count(list, none(list, ok)) +count(list, not false) +count(list, not ok) +count(list, not true) +count(list, ok == nil) +count(list, ok) +count(list, ok) - i32 +count(list, ok) < f64 +count(list, ok) > -0.5 +count(list, ok) >= i +count(list, true and ok) +count(list, true) ** i64 +count(list, true) == f64 +count(list, true) ^ i64 +count(map(array, #), # != #) +count(map(array, #), # > #) +count(map(array, #), i == #) +count(map(array, #), ok) +count(map(array, add), ok) +count(map(array, div), ok) +count(map(array, foo), ok) +count(map(array, i32), 0.5 == f32) +count(map(array, i32), 1 != #) +count(map(array, i64), # == 0.5) +count(map(array, true), #) +count(map(list, #), "bar" in #) +count(map(list, #), # == #) +count(map(list, #), # == nil) +count(map(list, 0.5), # != nil) +count(map(list, f32), # <= #) +count(map(list, true), #) +count(sort(array), foo == #) +count(sort(array), ok) +date("bar", "bar")?.String +div +div != add +div != add != ok +div != div +div != div ? score : 0.5 +div != div or half != greet +div != foo.Qux +div != foo.String +div != foo?.Qux +div != greet +div != half +div != half ? f32 : ok +div != half and !ok +div != nil != ok +div != nil ? array : add +div != nil ? i : i64 +div != score +div == add +div == div +div == div ? 0.5 : half +div == div ? nil : i +div == div || true ? f32 : add +div == foo.Qux +div == foo.String +div == foo?.Qux +div == foo?.String +div == greet +div == greet != ok +div == greet || !false +div == half +div == nil ? greet : foo +div == nil ? half : half +div == nil ? score : i64 +div == nil || ok +div == score +div == score == ok +div == score ? true : "bar" +div in map(list, add) +div not in [add] +div not in [half, f32, false] +div not in map(array, div) +div(-1, i) +div(1, 1) > i64 +div(1, i) >= i64 +div(i, 1) / f32 +div(i, 1) == i +div(i, i) +f32 +f32 != --f64 +f32 != -1 +f32 != 0.5 * f32 +f32 != 0.5 + i64 +f32 != 0.5 / i64 +f32 != 0.5 == ok +f32 != 0.5 ? array : ok +f32 != 0.5 ? list : 1 +f32 != 0.5 ^ i32 +f32 != 1 % i32 +f32 != 1 * 1 +f32 != 1 * i64 +f32 != 1 ** 0.5 +f32 != 1 - i +f32 != 1 ? "foo" : foo +f32 != 1 ^ f32 +f32 != abs(i64) +f32 != f32 +f32 != f32 + f64 +f32 != f32 - f64 +f32 != f64 +f32 != f64 ** i32 +f32 != f64 + i32 +f32 != f64 - f32 +f32 != f64 ^ i32 +f32 != findIndex(list, ok) +f32 != float(i) +f32 != i +f32 != i * i64 +f32 != i - f64 +f32 != i32 +f32 != i64 +f32 != i64 * 1 +f32 != i64 ? f64 : f32 +f32 != len(array) +f32 != max(i) +f32 != min(1) +f32 != min(f64) +f32 != nil ? half : greet +f32 != score(1) +f32 * (1 - f32) +f32 * (i + 1) +f32 * (i32 + f32) +f32 * (i64 + f32) +f32 * (i64 - i64) +f32 * -0.5 +f32 * -f32 +f32 * -f64 +f32 * -i32 +f32 * 0.5 != f32 +f32 * 0.5 ** f32 +f32 * 0.5 - f32 +f32 * 0.5 < f64 +f32 * 0.5 < i32 +f32 * 0.5 <= f32 +f32 * 0.5 <= f32 ? "bar" : array +f32 * 0.5 <= i64 +f32 * 1 != f32 +f32 * 1 * 1 +f32 * 1 ** f64 +f32 * 1 + i +f32 * 1 - i +f32 * 1 / i64 +f32 * 1 < f64 +f32 * 1 <= f32 +f32 * 1 >= i32 +f32 * array[i64] +f32 * count(array, ok) +f32 * f32 +f32 * f32 * i +f32 * f32 ^ i64 +f32 * f64 +f32 * f64 * i64 +f32 * f64 + f32 +f32 * f64 - i +f32 * f64 ^ f32 +f32 * findIndex(list, true) +f32 * float(0.5) +f32 * i +f32 * i < f64 +f32 * i <= -i64 +f32 * i <= min(0.5, f64) +f32 * i32 +f32 * i32 ** 1 +f32 * i32 - i64 +f32 * i64 +f32 * i64 ** 0.5 +f32 * i64 ** i64 +f32 * i64 < f64 +f32 * i64 < half(f64) +f32 * i64 ^ i +f32 * i64 ^ i64 +f32 * int(f64) +f32 * max(f32) +f32 * min(0.5) +f32 * min(f64) +f32 * score(1) +f32 ** (0.5 + i) +f32 ** (0.5 - 0.5) +f32 ** (1 - i64) +f32 ** (1 / 0.5) +f32 ** (f32 * i) +f32 ** (f32 + 0.5) +f32 ** (f32 + i64) +f32 ** (f32 - 1) +f32 ** (f64 - i32) +f32 ** (i32 * 1) +f32 ** (i32 * i) +f32 ** -0.5 +f32 ** -1 +f32 ** -f64 +f32 ** -i +f32 ** -i32 +f32 ** -i64 +f32 ** 0.5 >= i64 +f32 ** 0.5 ^ i64 +f32 ** 1 * f32 +f32 ** 1 ** 0.5 +f32 ** 1 / i32 +f32 ** 1 <= i +f32 ** array[i64] +f32 ** f32 +f32 ** f32 * i ^ f64 +f32 ** f32 + f32 +f32 ** f32 - 0.5 + 1 +f32 ** f32 ^ 1 +f32 ** f32 ^ i +f32 ** f64 +f32 ** f64 + i64 +f32 ** f64 <= f64 +f32 ** f64 >= f32 +f32 ** float(i64) +f32 ** half(f64) +f32 ** i +f32 ** i * f64 +f32 ** i / f64 +f32 ** i == score(i) +f32 ** i32 +f32 ** i32 ** i32 +f32 ** i32 >= i32 +f32 ** i64 +f32 ** i64 * i32 +f32 ** i64 + i64 +f32 ** i64 / i64 +f32 ** int(0.5) +f32 ** int(1) +f32 ** len("foo") +f32 ** len(list) +f32 ** max(f32) +f32 ** max(f64) +f32 ** max(i64) +f32 + -0.5 +f32 + -1 +f32 + -f32 +f32 + -i +f32 + -i64 +f32 + 0.5 + 1 +f32 + 0.5 + f32 +f32 + 1 * 0.5 +f32 + 1 * i32 +f32 + 1 ** f64 +f32 + 1 - f32 +f32 + 1 - i64 +f32 + 1 < i32 +f32 + abs(0.5) +f32 + abs(f32) +f32 + count(array, true) +f32 + f32 +f32 + f32 + i32 +f32 + f32 == 0.5 ^ i +f32 + f64 +f32 + f64 - 0.5 +f32 + f64 - f32 +f32 + f64 / f64 +f32 + f64 < f32 +f32 + f64 ^ f32 +f32 + find(array, ok) +f32 + float(f64) +f32 + half(0.5) +f32 + i +f32 + i != i +f32 + i - i +f32 + i ^ f64 +f32 + i32 +f32 + i32 * 0.5 +f32 + i32 + 0.5 +f32 + i32 >= f32 +f32 + i64 +f32 + i64 % 1 +f32 + i64 - 1 +f32 + i64 - f32 +f32 + int(1) +f32 + int(f64) +f32 + int(i32) +f32 + len(array) +f32 + max(0.5) +f32 + max(f64) +f32 + max(i64) +f32 + min(1) +f32 + min(f32) +f32 + min(i32) +f32 + min(i64, 1, 1) +f32 + score(1) +f32 + score(i) +f32 - -0.5 +f32 - -1 +f32 - -f64 +f32 - -i +f32 - -i32 +f32 - 0.5 + f64 +f32 - 0.5 - i32 +f32 - 0.5 - i64 +f32 - 0.5 <= f64 +f32 - 0.5 <= i64 +f32 - 0.5 >= i64 +f32 - 0.5 ^ f64 +f32 - 0.5 ^ i32 +f32 - 1 != i64 +f32 - 1 % 1 +f32 - 1 % i64 +f32 - 1 + 1 +f32 - 1 + i32 % i +f32 - 1 - f32 +f32 - abs(i32) +f32 - array[i] +f32 - f32 +f32 - f32 - f64 +f32 - f32 - i32 +f32 - f32 == i +f32 - f32 == min(1) +f32 - f32 >= i +f32 - f64 +f32 - f64 * 1 +f32 - f64 ** i32 +f32 - f64 + f32 +f32 - f64 + i64 +f32 - f64 - f32 +f32 - f64 - i +f32 - f64 <= f32 +f32 - f64 ^ 1 +f32 - float(0.5) +f32 - float(1) +f32 - float(i32) +f32 - half(0.5) +f32 - i +f32 - i % 1 +f32 - i * f32 +f32 - i + i32 % 1 +f32 - i + i32 ** 0.5 +f32 - i - 0.5 +f32 - i32 +f32 - i32 * 1 +f32 - i32 ** f32 +f32 - i32 ** i32 +f32 - i32 + 1 +f32 - i32 >= i +f32 - i32 ^ i +f32 - i64 +f32 - i64 - 1 +f32 - i64 <= i32 +f32 - i64 ^ 1 +f32 - int(0.5) +f32 - int(i64) +f32 - len("bar") +f32 - len(list) +f32 - max(i32) +f32 - min(1) +f32 - min(i64) +f32 - score(i) +f32 / (0.5 + i64) +f32 / (1 - i) +f32 / (i64 - f64) +f32 / -0.5 +f32 / -f32 +f32 / -f64 +f32 / -i +f32 / -i32 +f32 / 0.5 * 0.5 +f32 / 0.5 * i +f32 / 0.5 - f64 +f32 / 0.5 - i +f32 / 0.5 - i64 +f32 / 0.5 > f64 +f32 / 1 != f64 +f32 / 1 * i64 +f32 / 1 ** f32 +f32 / 1 - f64 - i64 +f32 / 1 >= f32 +f32 / 1 ^ 0.5 +f32 / 1 ^ i +f32 / abs(1) +f32 / abs(f32) +f32 / f32 +f32 / f32 / f32 +f32 / f32 < f32 +f32 / f64 +f32 / f64 ^ 0.5 +f32 / float(i64) +f32 / get(array, 1) +f32 / half(0.5) +f32 / i +f32 / i <= i64 +f32 / i32 +f32 / i32 != i +f32 / i32 ** i +f32 / i32 / f64 +f32 / i32 >= i +f32 / i64 +f32 / i64 * i64 +f32 / i64 > i32 +f32 / i64 ^ 1 +f32 / i64 ^ i +f32 / int(f32) +f32 / int(f64) +f32 / int(i) +f32 / int(i32) +f32 / last(array) +f32 / max(0.5) +f32 / max(1) +f32 / min(f32) +f32 < -0.5 +f32 < -f32 +f32 < -f64 +f32 < -i32 +f32 < -i64 +f32 < 0.5 != true +f32 < 0.5 ? array : array +f32 < 0.5 ? false : score +f32 < 0.5 ? i64 : i32 +f32 < 0.5 ? ok : f32 +f32 < 0.5 ^ f32 +f32 < 1 != ok +f32 < 1 * f32 +f32 < 1 ** 1 +f32 < 1 ** i +f32 < 1 - i +f32 < 1 / 0.5 +f32 < 1 ? f32 : i64 +f32 < 1 ? foo : i +f32 < 1 ? i64 : foo +f32 < 1 || not ok +f32 < abs(1) +f32 < abs(i) +f32 < array[i64] +f32 < array[i] +f32 < div(1, 1) +f32 < f32 +f32 < f32 ** 1 +f32 < f32 ^ 0.5 +f32 < f64 +f32 < f64 != ok +f32 < f64 / f64 +f32 < f64 == nil +f32 < f64 == true +f32 < f64 ? "foo" : half +f32 < float(f32) +f32 < float(i64) +f32 < half(f64) +f32 < i +f32 < i * 1 +f32 < i - i32 +f32 < i ? greet : "foo" +f32 < i32 +f32 < i32 ** 0.5 +f32 < i32 or ok +f32 < i32 || ok +f32 < i64 +f32 < i64 != nil +f32 < i64 && ok +f32 < i64 * i32 +f32 < i64 - f32 +f32 < int(f64) +f32 < max(1) +f32 < score(1) +f32 < score(i) +f32 <= -0.5 +f32 <= -1 +f32 <= -f32 +f32 <= -f64 +f32 <= -i +f32 <= -i64 +f32 <= -min(i64) +f32 <= 0.5 * 0.5 +f32 <= 0.5 ** i32 +f32 <= 0.5 - 1 +f32 <= 0.5 / 0.5 +f32 <= 0.5 == ok +f32 <= 0.5 == true +f32 <= 1 != nil +f32 <= 1 % i +f32 <= 1 * 0.5 +f32 <= 1 * i32 +f32 <= 1 == ok +f32 <= abs(1) +f32 <= f32 +f32 <= f32 ** i64 +f32 <= f32 ? 0.5 : foo +f32 <= f64 +f32 <= f64 ? ok : f64 +f32 <= f64 ^ f32 +f32 <= f64 and ok +f32 <= findIndex(list, ok) +f32 <= first(array) +f32 <= half(0.5) +f32 <= i +f32 <= i != nil +f32 <= i % i64 +f32 <= i ** i32 +f32 <= i - 0.5 +f32 <= i / f32 +f32 <= i == ok +f32 <= i32 +f32 <= i32 * i64 +f32 <= i32 ** i32 +f32 <= i32 + i32 +f32 <= i32 - 1 +f32 <= i32 / 1 +f32 <= i32 ? 0.5 : i32 +f32 <= i32 and ok +f32 <= i64 +f32 <= i64 * i +f32 <= i64 ? true : array +f32 <= i64 or ok +f32 <= int(0.5) +f32 <= int(i) +f32 <= len("foo") +f32 <= max(f32) +f32 <= max(i64) +f32 <= min(i64, i32) +f32 <= score(1) +f32 <= score(i) +f32 == --f64 +f32 == -0.5 +f32 == -1 +f32 == -f32 +f32 == -i32 +f32 == -i64 +f32 == 0.5 && i32 == i32 +f32 == 0.5 * i32 +f32 == 0.5 ** 1 +f32 == 0.5 and ok +f32 == 1 && ok ? add : f32 +f32 == 1 ^ i +f32 == abs(1) +f32 == array[1] +f32 == count(array, ok) +f32 == f32 +f32 == f32 ** f32 +f32 == f32 - i32 +f32 == f32 ? 1 : greet +f32 == f32 ? list : "bar" +f32 == f64 +f32 == f64 - 1 +f32 == f64 - f64 +f32 == f64 ? ok : i64 +f32 == find(array, ok) +f32 == findLast(array, ok) +f32 == findLastIndex(list, true) +f32 == get(array, 1) +f32 == i +f32 == i * i64 +f32 == i + f64 + 0.5 +f32 == i - f64 +f32 == i - i32 +f32 == i / 0.5 +f32 == i ? "foo" : i64 +f32 == i ? i : 0.5 +f32 == i32 +f32 == i32 % 1 +f32 == i32 - 0.5 +f32 == i64 +f32 == i64 % i +f32 == i64 * 0.5 +f32 == int(1) +f32 == max(0.5, 1) +f32 == max(i) +f32 == min(0.5) +f32 == min(i64) +f32 == nil ? "foo" : div +f32 == nil ? i32 : greet +f32 == score(1) +f32 > -0.5 +f32 > -f64 +f32 > -i +f32 > -i32 +f32 > -i64 +f32 > 0.5 != false +f32 > 0.5 != ok +f32 > 0.5 - 0.5 +f32 > 0.5 / 0.5 +f32 > 0.5 ? foo : f64 +f32 > 0.5 ? greet : half +f32 > 1 % 1 +f32 > 1 ** 0.5 +f32 > 1 + f32 +f32 > 1 / i64 +f32 > 1 == true +f32 > 1 ? nil : half +f32 > 1 ^ i32 +f32 > array[i32] +f32 > f32 +f32 > f32 ** f32 +f32 > f32 - i +f32 > f32 == true +f32 > f64 +f32 > f64 - i32 +f32 > f64 / i64 +f32 > f64 ? array : false +f32 > f64 ? true : array +f32 > f64 or ok +f32 > i +f32 > i * 0.5 +f32 > i + f32 +f32 > i32 +f32 > i32 != ok +f32 > i32 * i +f32 > i64 +f32 > i64 ? 1 : f64 +f32 > i64 ? ok : greet +f32 > int(0.5) +f32 > int(f64) +f32 > max(i32) +f32 > max(i32, 1) +f32 > min(f64) +f32 > score(1) +f32 > score(i) +f32 >= -f64 +f32 >= -i +f32 >= -i32 +f32 >= -i64 +f32 >= 0.5 ** f64 +f32 >= 0.5 - 0.5 +f32 >= 0.5 == ok +f32 >= 1 != ok +f32 >= 1 != true +f32 >= 1 % 1 +f32 >= 1 % i +f32 >= 1 - 1 +f32 >= 1 - i +f32 >= 1 - i64 +f32 >= 1 ? "foo" endsWith "foo" : f64 +f32 >= abs(1) +f32 >= f32 +f32 >= f32 ** 1 +f32 >= f32 ** f32 +f32 >= f32 + i32 +f32 >= f64 +f32 >= f64 + i32 +f32 >= first(array) +f32 >= float(i32) +f32 >= float(i64) +f32 >= half(f64) +f32 >= i +f32 >= i != true +f32 >= i * 0.5 +f32 >= i ** 0.5 +f32 >= i ** i32 +f32 >= i + f64 +f32 >= i ? "bar" : nil +f32 >= i ? ok : i +f32 >= i32 +f32 >= i32 * 0.5 +f32 >= i32 ? array : foo +f32 >= i32 ^ i32 +f32 >= i64 +f32 >= i64 % i64 +f32 >= i64 ** 0.5 +f32 >= i64 ? 1 : i32 +f32 >= i64 ? i64 : add +f32 >= i64 || ok +f32 >= len("foo") +f32 >= max(i) +f32 >= min(i) +f32 >= score(1) +f32 ^ (1 * f32) +f32 ^ (1 + 1) +f32 ^ (1 - 0.5) +f32 ^ (f32 * 0.5) +f32 ^ (f32 / 1) +f32 ^ (i + i) +f32 ^ (i32 % 1) +f32 ^ (i32 % i64) +f32 ^ (i32 / 1) +f32 ^ (i32 / f64) +f32 ^ (i64 - f32) +f32 ^ -0.5 +f32 ^ -1 +f32 ^ -f32 +f32 ^ -i +f32 ^ -i32 +f32 ^ -i64 +f32 ^ 0.5 != i64 +f32 ^ 0.5 + f32 +f32 ^ 0.5 + i64 +f32 ^ 0.5 - f64 +f32 ^ 0.5 <= 0.5 ^ 0.5 +f32 ^ 0.5 ^ f32 +f32 ^ 1 - i +f32 ^ 1 - i32 +f32 ^ 1 <= 1 * 1 +f32 ^ 1 <= i32 +f32 ^ 1 ^ 0.5 +f32 ^ f32 +f32 ^ f32 ** i +f32 ^ f32 + f32 +f32 ^ f32 / f32 +f32 ^ f64 +f32 ^ f64 < f64 +f32 ^ f64 < i64 +f32 ^ f64 <= f64 +f32 ^ f64 == f64 +f32 ^ f64 > i +f32 ^ half(f64) +f32 ^ i +f32 ^ i ** i32 +f32 ^ i32 +f32 ^ i32 + f32 +f32 ^ i64 +f32 ^ last(array) +f32 ^ max(0.5) +f32 ^ max(f32) +f32 ^ max(i64) +f32 ^ min(1) +f32 ^ min(1, 1) +f32 ^ score(i) +f32 in [false, list] +f32 in [nil] +f32 not in sort(array) +f64 +f64 != -(0.5 ** 0.5) +f64 != -1 +f64 != -f64 +f64 != -i +f64 != -i32 +f64 != 0.5 && ok +f64 != 0.5 + 1 +f64 != 0.5 + f64 +f64 != 0.5 == nil +f64 != 0.5 == true +f64 != 0.5 ? false : array +f64 != 0.5 and ok +f64 != 1 ? list : false +f64 != 1 ^ i64 +f64 != abs(f32) +f64 != array[i64] +f64 != f32 +f64 != f32 * i32 +f64 != f64 +f64 != f64 * f32 +f64 != f64 ^ 1 +f64 != findLastIndex(list, ok) +f64 != first(array) +f64 != get(array, i32) +f64 != half(0.5) +f64 != half(f64) +f64 != i +f64 != i && ok +f64 != i + 1 +f64 != i32 +f64 != i32 + f64 +f64 != i32 ? "bar" : nil +f64 != i32 ? add : 1 +f64 != i32 ^ 0.5 +f64 != i64 +f64 != i64 ** 0.5 +f64 != int(i64) +f64 != max(i64) +f64 != min(1) +f64 != min(i32) +f64 != nil == ok +f64 != score(1) +f64 != score(i) +f64 * (0.5 - f32) +f64 * (0.5 - i64) +f64 * (f32 + i32) +f64 * (i32 - 0.5) +f64 * (i64 - f64) +f64 * -1 +f64 * -f32 +f64 * -f64 +f64 * -i32 +f64 * -i64 +f64 * 0.5 * 0.5 ^ i64 +f64 * 0.5 / i32 +f64 * 0.5 ^ 1 +f64 * 1 ** 0.5 +f64 * 1 + i64 +f64 * 1 / i32 +f64 * 1 < 0.5 * 0.5 +f64 * abs(i) +f64 * f32 +f64 * f32 * f32 +f64 * f32 - f32 +f64 * f32 - f64 +f64 * f32 / f64 +f64 * f32 >= f64 +f64 * f64 +f64 * f64 / i +f64 * f64 < f64 +f64 * f64 >= score(1) +f64 * float(i) +f64 * i +f64 * i != i +f64 * i * 0.5 +f64 * i * i +f64 * i * i64 +f64 * i - f64 +f64 * i32 +f64 * i32 * 1 +f64 * i32 > f64 +f64 * i64 +f64 * i64 + f32 +f64 * i64 + i +f64 * i64 - f32 +f64 * i64 ^ i32 +f64 * int(0.5) +f64 * int(f32) +f64 * int(f64) +f64 * last(array) +f64 * len(list) +f64 * max(i64) +f64 * min(i32) +f64 * score(1) +f64 * score(i) +f64 ** (0.5 * i32) +f64 ** (0.5 + 1) +f64 ** (0.5 + i) +f64 ** (1 + 1) +f64 ** (1 + f64) +f64 ** (1 - 1) +f64 ** (1 / i64) +f64 ** (f32 * i) +f64 ** (f64 + 0.5) +f64 ** (f64 + f64) +f64 ** (f64 + i) +f64 ** (i % 1) +f64 ** (i % i32) +f64 ** (i32 * 1) +f64 ** (i32 + 0.5) +f64 ** (i32 - f32) +f64 ** (i64 * 1) +f64 ** (i64 + 0.5) +f64 ** (i64 / i) +f64 ** -0.5 +f64 ** -1 +f64 ** -f32 +f64 ** -f64 +f64 ** -i +f64 ** -i32 +f64 ** -i64 +f64 ** 0.5 ** i64 +f64 ** 0.5 <= 1 - 1 +f64 ** 1 ** 0.5 ** 0.5 +f64 ** 1 < 1 - i64 +f64 ** 1 == f64 + f32 +f64 ** 1 ^ i +f64 ** 1 ^ i64 +f64 ** abs(1) +f64 ** abs(f64) +f64 ** f32 +f64 ** f32 ** 0.5 +f64 ** f32 == i64 +f64 ** f64 +f64 ** f64 != f32 +f64 ** f64 ** 0.5 +f64 ** f64 / f32 +f64 ** f64 < f64 +f64 ** f64 <= f64 +f64 ** f64 ^ f64 +f64 ** f64 ^ i32 +f64 ** float(i32) +f64 ** get(array, i64) +f64 ** half(0.5) +f64 ** i +f64 ** i != i +f64 ** i - i32 +f64 ** i / f32 +f64 ** i >= i32 +f64 ** i ^ i32 +f64 ** i32 +f64 ** i32 != max(f64, 0.5) +f64 ** i32 ** 1 +f64 ** i32 ^ 1 +f64 ** i64 +f64 ** i64 ** i64 +f64 ** i64 / f64 +f64 ** i64 ^ i +f64 ** int(0.5) +f64 ** int(1) +f64 ** max(i32) +f64 ** min(1) +f64 ** min(f32) +f64 ** score(1, 1) +f64 + -0.5 +f64 + -f64 +f64 + -i +f64 + -i32 +f64 + -i64 +f64 + 0.5 * 1 +f64 + 0.5 * i32 +f64 + 0.5 / f32 +f64 + 0.5 == i64 +f64 + 1 != f64 +f64 + 1 + f64 +f64 + 1 - 0.5 +f64 + 1 < i64 +f64 + 1 > 0.5 ? 1 : 0.5 +f64 + 1 > i64 +f64 + 1 >= f32 +f64 + abs(i) +f64 + abs(i64) +f64 + array[1] +f64 + array[i64] +f64 + count(array, ok) +f64 + f32 +f64 + f32 * i32 +f64 + f32 - i64 +f64 + f64 +f64 + f64 + i64 +f64 + f64 == i32 +f64 + f64 > i32 +f64 + f64 ^ 0.5 +f64 + float(i64) +f64 + half(0.5) +f64 + half(f64) +f64 + i +f64 + i ** 0.5 +f64 + i + 1 +f64 + i / 0.5 +f64 + i32 +f64 + i32 ** i64 +f64 + i32 + i32 +f64 + i32 / 1 +f64 + i32 <= i +f64 + i32 >= i64 +f64 + i64 +f64 + i64 - f64 +f64 + i64 ^ f32 +f64 + int(0.5) +f64 + int(i32) +f64 + len(array) +f64 + min(0.5, 0.5) +f64 + min(f32) +f64 + score(i) +f64 - -0.5 +f64 - -1 +f64 - -f64 +f64 - -i +f64 - -i32 +f64 - -i64 +f64 - 0.5 != f64 +f64 - 0.5 * 0.5 +f64 - 0.5 ** i +f64 - 0.5 + f32 +f64 - 0.5 + i +f64 - 0.5 + i32 +f64 - 0.5 >= -0.5 +f64 - 1 * f32 +f64 - 1 ** f32 +f64 - 1 ** i32 +f64 - 1 + 1 +f64 - 1 - f64 +f64 - 1 / 0.5 +f64 - 1 < f32 +f64 - 1 ^ 0.5 +f64 - 1 ^ 1 +f64 - abs(0.5) +f64 - abs(i) +f64 - array[i64] +f64 - f32 +f64 - f32 * f64 +f64 - f32 + 1 + 0.5 +f64 - f32 - f64 +f64 - f32 < f64 +f64 - f32 >= i32 +f64 - f64 +f64 - f64 - 0.5 +f64 - f64 - i32 +f64 - f64 <= i +f64 - f64 == f64 +f64 - f64 > f32 +f64 - f64 >= get(array, i64) +f64 - get(array, i) +f64 - half(0.5) +f64 - i +f64 - i % i32 +f64 - i + 1 +f64 - i / 1 +f64 - i < i32 +f64 - i < i64 +f64 - i == i +f64 - i == i64 +f64 - i > f64 +f64 - i32 +f64 - i32 + i +f64 - i32 - i64 +f64 - i32 >= i32 +f64 - i64 +f64 - i64 * 0.5 +f64 - i64 * 1 +f64 - i64 - f32 +f64 - int(0.5) +f64 - int(i32) +f64 - max(1) +f64 - min(1) +f64 - min(i32, i64) +f64 - score(i) +f64 / (0.5 + f32) +f64 / (0.5 - 0.5) +f64 / (0.5 - f64) +f64 / (0.5 - i32) +f64 / (1 + i32) +f64 / (1 - 1) +f64 / (i32 + f64) +f64 / (i32 - 1) +f64 / (i64 - i64) +f64 / -0.5 +f64 / -1 +f64 / -f32 +f64 / -i +f64 / -i32 +f64 / 0.5 * i +f64 / 0.5 ** 0.5 +f64 / 0.5 ** f64 +f64 / 0.5 / f64 +f64 / 0.5 / i64 +f64 / 0.5 > f64 +f64 / 0.5 ^ i +f64 / 1 != i +f64 / 1 * abs(i64) +f64 / 1 * i +f64 / 1 ** 0.5 +f64 / 1 ^ i64 +f64 / array[i32] +f64 / array[i] +f64 / f32 +f64 / f32 != f64 +f64 / f32 * i +f64 / f32 > f64 +f64 / f32 ^ i32 +f64 / f32 in [f32] +f64 / f64 +f64 / f64 != f32 +f64 / f64 * f32 +f64 / f64 - f32 +f64 / f64 - f64 +f64 / get(array, i64) +f64 / half(0.5) +f64 / i +f64 / i * i32 +f64 / i ** 0.5 +f64 / i ** i32 +f64 / i + i64 +f64 / i < f64 +f64 / i > 1 ** 1 +f64 / i > f64 +f64 / i >= f64 +f64 / i32 +f64 / i32 / i32 +f64 / i32 < f64 +f64 / i64 +f64 / i64 * i64 ^ i +f64 / i64 - f32 +f64 / i64 / 0.5 +f64 / i64 / i64 +f64 / i64 <= f64 +f64 / i64 > i +f64 / int(f32) +f64 / int(i64) +f64 / max(i) +f64 / min(0.5) +f64 / score(i) +f64 < -0.5 +f64 < -1 +f64 < -i32 +f64 < -i64 +f64 < 0.5 ** f32 +f64 < 0.5 == true +f64 < 0.5 ? 0.5 : foo +f64 < 0.5 ? 1 : array +f64 < 0.5 ? greet : false +f64 < 0.5 ^ 1 +f64 < 0.5 or ok +f64 < 1 == not ok +f64 < 1 ? 1 : half +f64 < 1 ? 1 : i +f64 < 1 ? ok : i +f64 < 1 and nil == i32 +f64 < abs(1) +f64 < abs(i32) +f64 < array[i32] +f64 < count(list, true) +f64 < f32 +f64 < f32 * 0.5 +f64 < f32 * f64 +f64 < f32 ** i32 +f64 < f32 - 1 +f64 < f32 ? array : 0.5 +f64 < f64 +f64 < f64 * f32 +f64 < get(array, i) +f64 < half(0.5) +f64 < i +f64 < i - f64 +f64 < i == ok +f64 < i ? false : nil +f64 < i32 +f64 < i32 % i32 +f64 < i32 % i64 +f64 < i32 == ok +f64 < i32 and ok +f64 < i64 +f64 < i64 * i +f64 < int(0.5) +f64 < max(1, i64) +f64 < min(1) +f64 < min(f64) +f64 < min(i64) +f64 <= -0.5 +f64 <= -1 +f64 <= -f32 +f64 <= -i +f64 <= -i32 +f64 <= 0.5 != ok +f64 <= 0.5 - 1 +f64 <= 0.5 / 0.5 +f64 <= 0.5 == true +f64 <= 0.5 ? foo : list +f64 <= 0.5 ? nil : add +f64 <= 1 != true +f64 <= 1 ** 0.5 +f64 <= 1 + 0.5 +f64 <= 1 == false +f64 <= 1 ? array : foo +f64 <= 1 ^ i64 +f64 <= abs(f32) +f64 <= abs(i) +f64 <= array[i] +f64 <= f32 +f64 <= f32 + f64 +f64 <= f32 - 0.5 +f64 <= f32 ? false : "foo" +f64 <= f32 ? false : i +f64 <= f32 ? i64 : false +f64 <= f64 +f64 <= f64 + f64 +f64 <= f64 - 0.5 +f64 <= f64 - f64 +f64 <= f64 ^ 0.5 +f64 <= find(array, true) +f64 <= float(f64) +f64 <= half(0.5) +f64 <= i +f64 <= i * i32 +f64 <= i ? false : false +f64 <= i ? foo : false +f64 <= i32 +f64 <= i32 == true +f64 <= i32 ? "bar" : nil +f64 <= i32 ? add : ok +f64 <= i32 ? i32 : false +f64 <= i64 +f64 <= i64 % 1 +f64 <= i64 - f32 +f64 <= i64 - i64 +f64 <= i64 ^ 1 +f64 <= i64 and ok +f64 <= int(1) +f64 <= int(f64) +f64 <= int(i) +f64 <= max(f32) +f64 <= min(0.5) +f64 <= score(1) +f64 == -0.5 +f64 == -1 +f64 == -f32 +f64 == -f64 +f64 == -i +f64 == -i32 +f64 == 0.5 != ok +f64 == 0.5 ** 0.5 +f64 == 0.5 ** i32 +f64 == 0.5 / i +f64 == 0.5 / i32 +f64 == 0.5 ? i64 : div +f64 == 1 * f64 +f64 == 1 == nil +f64 == 1 ? false : "foo" +f64 == abs(1) +f64 == abs(i32) +f64 == array[i32] +f64 == array[i64] +f64 == f32 +f64 == f32 + i64 +f64 == f32 - 1 +f64 == f32 / 0.5 +f64 == f64 +f64 == f64 ** i32 +f64 == f64 - 1 +f64 == f64 / 1 +f64 == float(0.5) +f64 == float(i) +f64 == get(array, i64) +f64 == half(f64) +f64 == i +f64 == i ** f32 +f64 == i + 0.5 +f64 == i / i32 +f64 == i ? false : f32 +f64 == i ^ f32 +f64 == i32 +f64 == i32 * 1 +f64 == i32 + f64 +f64 == i32 / 1 +f64 == i32 ? greet : array +f64 == i64 +f64 == i64 - f32 +f64 == i64 == true +f64 == int(0.5) +f64 == int(f32) +f64 == min(0.5) +f64 == min(i64) +f64 == nil == ok +f64 == nil ? i32 : div +f64 == nil ? nil : 0.5 +f64 == score(1) +f64 > -0.5 +f64 > -1 +f64 > -f32 +f64 > -f64 +f64 > -i +f64 > -i32 +f64 > 0.5 - f64 +f64 > 0.5 / 0.5 +f64 > 0.5 ? 0.5 : nil +f64 > 0.5 ? score(1, 1) : nil == nil +f64 > 0.5 ^ 1 +f64 > 0.5 || ok +f64 > 1 != ok +f64 > 1 != true +f64 > 1 % i +f64 > 1 * 0.5 +f64 > 1 - 0.5 +f64 > 1 - i32 +f64 > 1 / 0.5 +f64 > 1 / f64 +f64 > 1 ? 0.5 : ok +f64 > 1 ? false : true +f64 > 1 ^ 1 +f64 > abs(0.5) +f64 > abs(1) +f64 > abs(i) +f64 > abs(i32) +f64 > count(array, true) +f64 > f32 +f64 > f32 - 0.5 +f64 > f64 +f64 > f64 ** 0.5 +f64 > f64 ? f64 : list +f64 > f64 ^ 0.5 +f64 > findIndex(array, ok) +f64 > float(1) +f64 > float(f32) +f64 > half(0.5) +f64 > i +f64 > i != ok +f64 > i ** i32 +f64 > i - i32 +f64 > i32 +f64 > i32 ** f32 +f64 > i32 - f32 +f64 > i32 == ok +f64 > i32 ? i : 0.5 +f64 > i64 +f64 > i64 ** i64 +f64 > int(0.5) +f64 > int(i64) +f64 > max(0.5) +f64 > max(i64) +f64 > min(1) +f64 > min(f64) +f64 > min(i) +f64 > min(i32) +f64 > score(i) +f64 >= -0.5 +f64 >= -1 +f64 >= -f64 +f64 >= -i32 +f64 >= -i64 +f64 >= 0.5 * 1 +f64 >= 0.5 ** 0.5 +f64 >= 0.5 ** i32 +f64 >= 0.5 + 0.5 +f64 >= 0.5 + i +f64 >= 0.5 - i +f64 >= 0.5 - i32 +f64 >= 0.5 ? nil : 0.5 +f64 >= 0.5 ^ 0.5 +f64 >= 1 * i +f64 >= 1 - 0.5 +f64 >= 1 / i64 +f64 >= 1 == ok +f64 >= 1 ^ 1 +f64 >= 1 || ok +f64 >= abs(1) +f64 >= abs(f32) +f64 >= abs(f64) +f64 >= count(list, true) +f64 >= f32 +f64 >= f32 != true +f64 >= f32 - f32 +f64 >= f32 ? true : nil +f64 >= f64 +f64 >= f64 * 0.5 +f64 >= f64 ? nil : f64 +f64 >= f64 ? score : f32 +f64 >= half(f64) +f64 >= i +f64 >= i - 1 +f64 >= i32 +f64 >= i32 != nil +f64 >= i32 ** 0.5 +f64 >= i32 + f32 +f64 >= i32 + i64 +f64 >= i32 ^ f32 +f64 >= i64 +f64 >= i64 * 0.5 +f64 >= i64 * f64 +f64 >= i64 * i64 +f64 >= i64 ? list : i >= f32 +f64 >= i64 ? ok : true +f64 >= i64 || ok +f64 >= max(f64) +f64 >= min(0.5) +f64 >= score(1) +f64 >= score(i) +f64 ^ (0.5 * 1) +f64 ^ (0.5 * f32) +f64 ^ (0.5 / i) +f64 ^ (1 + i) +f64 ^ (1 - f32) +f64 ^ (1 / 0.5) +f64 ^ (1 / i64) +f64 ^ -1 +f64 ^ 0.5 != f32 +f64 ^ 0.5 * i64 +f64 ^ 0.5 + f64 +f64 ^ 0.5 < 0.5 ^ 0.5 +f64 ^ 0.5 <= i64 +f64 ^ 0.5 > i == nil +f64 ^ 0.5 >= i32 / i64 +f64 ^ 1 != i +f64 ^ 1 ** i +f64 ^ 1 + i +f64 ^ 1 / f32 +f64 ^ 1 / i64 +f64 ^ 1 <= i32 +f64 ^ 1 ^ i +f64 ^ abs(i32) +f64 ^ count(array, true) +f64 ^ f32 +f64 ^ f32 != i32 +f64 ^ f32 * f32 +f64 ^ f32 ** i +f64 ^ f32 + f64 +f64 ^ f32 / i64 +f64 ^ f32 < i +f64 ^ f32 >= i64 +f64 ^ f32 ^ i64 +f64 ^ f64 +f64 ^ f64 != f32 +f64 ^ f64 * i +f64 ^ f64 + int(0.5) +f64 ^ float(i64) +f64 ^ half(0.5) +f64 ^ half(f64) +f64 ^ i +f64 ^ i ** i32 +f64 ^ i / i +f64 ^ i <= f32 +f64 ^ i32 +f64 ^ i32 ** i +f64 ^ i32 + f64 +f64 ^ i32 >= i +f64 ^ i32 ^ f64 +f64 ^ i64 +f64 ^ i64 + i64 +f64 ^ i64 - i +f64 ^ i64 < i +f64 ^ i64 >= i32 +f64 ^ int(f64) +f64 ^ last(array) +f64 ^ len(list) +f64 ^ max(0.5) +f64 ^ score(1) +false != true || 1 > f64 +false && ok or ok +false ? "bar" : 0.5 == f32 +false ? "bar" : 1 != i +false ? "bar" : foo.Qux +false ? 0.5 : foo.Qux +false ? 1 : half != div +false ? 1 : true != ok +false ? add : foo?.Bar +false ? f32 : foo.Bar +false ? f32 : foo?.String() +false ? f32 : i .. i32 +false ? f64 : 0.5 >= f64 +false ? f64 : f32 / f32 +false ? false : 0.5 + i32 +false ? false : i64 >= i +false ? foo : foo.Qux +false ? greet : i64 != i +false ? half : 0.5 > 1 + i64 +false ? half : f32 > min(0.5) +false ? i : 1 != i +false ? i32 : 1 >= f64 +false ? i64 : "foo" < toJSON(f64) +false ? i64 : foo?.Qux +false ? list : 1 < f32 +false ? list : f32 ** i32 +false ? list : foo.Bar +false ? nil : 1 >= get(array, 1) +false ? nil : foo?.Qux +false ? ok : foo.String +false ? score : 0.5 == i +false ? score : 1 / i64 +false ? score : f64 - -f32 +false ? true : 0.5 == f32 +false or ok ? string(1) : f64 == f32 +filter(1 .. 1, # == 0.5) +filter(1 .. i64, ok) +filter([div], any(array, true)) +filter([i32, i], # <= f64) +filter(array, !false) +filter(array, !ok) +filter(array, "bar" == "bar") +filter(array, "bar" matches "bar") +filter(array, "foo" not matches "bar") +filter(array, # != #) +filter(array, # != f64) +filter(array, # != i) +filter(array, # != i32) +filter(array, # != i64) +filter(array, # < #) +filter(array, # < 1) +filter(array, # < f32) +filter(array, # < f64) +filter(array, # < i) +filter(array, # < i32) +filter(array, # <= #) +filter(array, # <= 0.5) +filter(array, # <= 1) +filter(array, # <= f64) +filter(array, # <= i) +filter(array, # <= i32) +filter(array, # == #) +filter(array, # == 1) +filter(array, # == f32) +filter(array, # == f64) +filter(array, # == i) +filter(array, # == nil) +filter(array, # > #) +filter(array, # > 1) +filter(array, # > i) +filter(array, # >= #) +filter(array, # >= 1) +filter(array, # >= f32) +filter(array, # >= f64) +filter(array, # >= i32) +filter(array, # in array) +filter(array, # not in array) +filter(array, 0.5 != #) +filter(array, 0.5 < #) +filter(array, 0.5 < f32) +filter(array, 0.5 < f64) +filter(array, 0.5 == #) +filter(array, 0.5 > 0.5) +filter(array, 0.5 >= #) +filter(array, 1 != #) +filter(array, 1 != f32) +filter(array, 1 < #) +filter(array, 1 < f64) +filter(array, 1 <= #) +filter(array, 1 == #) +filter(array, 1 > #) +filter(array, 1 > 0.5) +filter(array, add == div) +filter(array, all(list, ok)) +filter(array, f32 != #) +filter(array, f32 < i32) +filter(array, f32 <= f32) +filter(array, f32 == #) +filter(array, f32 > 1) +filter(array, f32 >= #) +filter(array, f64 != #) +filter(array, f64 != 0.5) +filter(array, f64 <= #) +filter(array, f64 == #) +filter(array, f64 > #) +filter(array, f64 >= 1) +filter(array, foo == nil) +filter(array, greet == add) +filter(array, greet == half) +filter(array, i <= 1) +filter(array, i <= f64) +filter(array, i == f32) +filter(array, i >= 1) +filter(array, i >= f64 != false) +filter(array, i32 != #) +filter(array, i32 <= #) +filter(array, i32 == #) +filter(array, i32 == 1) +filter(array, i32 > # % #) +filter(array, i32 > #) +filter(array, i32 > 0.5) +filter(array, i32 >= #) +filter(array, i64 != #) +filter(array, i64 < #) +filter(array, i64 < 1) +filter(array, i64 < i64) +filter(array, i64 <= #) +filter(array, i64 == 1) +filter(array, nil != #) +filter(array, nil != greet) +filter(array, nil == #) +filter(array, nil == f32) +filter(array, nil in list) +filter(array, none(array, ok)) +filter(array, ok) +filter(array, score(#) != #) +filter(array, true && ok) +filter(array, true or false) +filter(array, true)[i:i32] +filter(filter(array, true), i >= f32) +filter(filter(list, false), "bar" in #) +filter(filter(list, ok), ok) +filter(i .. 1, not ok) +filter(i32 .. i32, nil == true) +filter(i32 .. i64, ok) +filter(list, !false) +filter(list, !ok) +filter(list, !true) +filter(list, "bar" not in #) +filter(list, "bar" not matches "foo") +filter(list, "bar" startsWith "bar") +filter(list, "foo" in #) +filter(list, "foo" not in #) +filter(list, # != #) +filter(list, # != foo) +filter(list, # != nil) +filter(list, # == #) +filter(list, # == foo) +filter(list, # == nil) +filter(list, 0.5 != f64) +filter(list, 0.5 != i) +filter(list, 0.5 > f32) +filter(list, 1 != 0.5) +filter(list, 1 != i32) +filter(list, 1 != nil) +filter(list, 1 < 0.5) +filter(list, 1 < 1) +filter(list, all(array, false)) +filter(list, all(array, true)) +filter(list, div == half) +filter(list, f32 < 0.5) +filter(list, f32 <= f32) +filter(list, f32 == i64) +filter(list, f32 >= 1) +filter(list, f64 >= 0.5) +filter(list, false == ok) +filter(list, foo != #) +filter(list, foo == #) +filter(list, foo == foo) +filter(list, foo in list) +filter(list, greet != nil) +filter(list, half != half) +filter(list, i <= 0.5) +filter(list, i <= i) +filter(list, i == f32) +filter(list, i == i32) +filter(list, i == i64) +filter(list, i >= i32) +filter(list, i32 != 1) +filter(list, i32 != nil) +filter(list, i32 < i64) +filter(list, i32 <= i32) +filter(list, i32 == i) +filter(list, i64 > f32) +filter(list, nil != f64) +filter(list, nil != score) +filter(list, nil != true) +filter(list, nil == #) +filter(list, not ok) +filter(list, ok or true) +filter(list, ok || true) +filter(list, ok) +filter(list, true == nil) +filter(map(array, "bar"), # >= #) +filter(map(array, "foo"), ok) +filter(map(array, #), # != 0.5) +filter(map(array, #), ok) +filter(map(array, 0.5 >= #), ok) +filter(map(list, "bar"), i >= i) +filter(map(list, "foo"), "bar" not matches #) +filter(map(list, #), # != #) +filter(map(list, #), ok) +filter(map(list, 1), f32 != #) +filter(map(list, false), #) +filter(sort(array), ok) +filter(split("foo", "bar"), ok) +find(1 .. 1, # <= #) +find([nil], 0.5 == 0.5) +find([ok], #) +find(array, !ok) +find(array, !true) +find(array, "bar" startsWith "foo") +find(array, # != #) +find(array, # != 0.5) +find(array, # != f32) +find(array, # != i32) +find(array, # - # != #) +find(array, # < #) +find(array, # < 0.5) +find(array, # < 1) +find(array, # < f32) +find(array, # < f64) +find(array, # < i32) +find(array, # <= #) +find(array, # <= 0.5) +find(array, # <= 1) +find(array, # <= f32) +find(array, # <= i) +find(array, # == #) +find(array, # == 0.5) +find(array, # == 1) +find(array, # == f32) +find(array, # == f64) +find(array, # == i) +find(array, # == i32) +find(array, # == nil) +find(array, # > #) +find(array, # > 0.5) +find(array, # > i) +find(array, # > i64) +find(array, # >= #) +find(array, # >= 1) +find(array, # >= i) +find(array, # >= i32) +find(array, 0.5 < i64) +find(array, 0.5 <= #) +find(array, 0.5 == #) +find(array, 0.5 > #) +find(array, 0.5 > 1) +find(array, 1 <= #) +find(array, 1 <= 0.5) +find(array, 1 == f32) +find(array, 1 == i64) +find(array, 1 > #) +find(array, 1 > 0.5) +find(array, 1 > i32) +find(array, 1 > i64) +find(array, 1 >= #) +find(array, 1 >= i) +find(array, add != div) +find(array, add != nil) +find(array, any(array, true)) +find(array, array == list) +find(array, div == half) +find(array, f32 <= #) +find(array, f32 > #) +find(array, f32 > 0.5) +find(array, f32 >= #) +find(array, f32 >= 1) +find(array, f64 != #) +find(array, f64 != i32) +find(array, f64 != nil) +find(array, f64 < #) +find(array, f64 == nil) +find(array, f64 >= 0.5) +find(array, false == false) +find(array, false) != i32 +find(array, i < #) +find(array, i <= #) +find(array, i == #) +find(array, i > #) +find(array, i >= #) +find(array, i >= i64) +find(array, i32 != #) +find(array, i32 != 1) +find(array, i32 < #) +find(array, i32 <= #) +find(array, i32 <= f32) +find(array, i32 <= f64) +find(array, i32 == #) +find(array, i32 == 1) +find(array, i32 == f64) +find(array, i32 > #) +find(array, i64 != #) +find(array, i64 < #) +find(array, nil != "bar") +find(array, nil != #) +find(array, nil == #) +find(array, nil not in array) +find(array, not false) +find(array, not true) +find(array, ok && ok) +find(array, ok == nil) +find(array, ok) +find(array, ok) * f64 +find(array, ok) ** i64 +find(array, ok) ^ i32 +find(array, score(#) >= #) +find(array, true) / get(array, i64) +find(array, true) > i +find(array, true) ^ i32 +find(filter(array, ok), # >= #) +find(filter(array, true), # != #) +find(i32 .. 1, # > 0.5) +find(i64 .. 1, ok) +find(list, !true) +find(list, "bar" startsWith "foo") +find(list, "foo" < "foo") +find(list, "foo" in #) +find(list, "foo" not in #) +find(list, # != #) +find(list, # == #) +find(list, # == nil) +find(list, # not in list) +find(list, 0.5 < f64) +find(list, 0.5 <= i64) +find(list, 0.5 > i) +find(list, 1 < 0.5) +find(list, 1 <= 0.5) +find(list, 1 > i) +find(list, add == add) +find(list, f32 != f32) +find(list, f32 < f64) +find(list, f32 <= f32) +find(list, f32 <= i32) +find(list, f32 == f32) +find(list, f64 != f32) +find(list, f64 <= i64) +find(list, f64 >= f32) +find(list, false)?.Bar +find(list, foo != #) +find(list, foo == #) +find(list, i < 1) +find(list, i >= f64) +find(list, i32 <= f32) +find(list, i64 != f64) +find(list, i64 >= 0.5) +find(list, list != array) +find(list, nil != #) +find(list, nil != greet) +find(list, nil != half) +find(list, nil != ok) +find(list, nil == #) +find(list, nil == half) +find(list, nil == score) +find(list, nil not in array) +find(list, nil not in list) +find(list, not ok) +find(list, ok or ok) +find(list, ok) +find(list, ok).Bar +find(list, ok).Qux +find(list, ok).String +find(list, ok)?.Qux +find(list, ok)?.String +find(list, score != add) +find(list, score != greet) +find(list, true).Bar +find(list, true).Qux +find(list, true).String +find(list, true)?.Bar +find(list, true)?.Qux +find(list, true)?.String +find(list, true)?.String() +find(map(array, #), # == #) +find(map(array, #), ok) +find(map(array, i), ok) +find(map(array, true), #) +find(map(list, "foo"), ok) +find(map(list, #), # != #) +find(map(list, 0.5), # >= #) +find(map(list, ok), ok) +find(map(list, true), #) +find(ok ? "bar" : 0.5, # != i32) +find(sort(array), ok) +find(true ? array : false, 0.5 > #)?.list +findIndex(["bar"], ok) +findIndex(["foo"], 0.5 > i64) +findIndex(["foo"], ok) +findIndex([1], # < #) +findIndex([f64, greet], 1 > f64) +findIndex([false], #) +findIndex(array, !(# != #)) +findIndex(array, !(# == 1)) +findIndex(array, !false) +findIndex(array, !ok) +findIndex(array, !true) +findIndex(array, "bar" not endsWith "bar") +findIndex(array, "bar" not startsWith "foo") +findIndex(array, # != #) +findIndex(array, # != 0.5) +findIndex(array, # != f32) +findIndex(array, # != f64) +findIndex(array, # != i32) +findIndex(array, # != i64) +findIndex(array, # != nil) +findIndex(array, # ** # > #) +findIndex(array, # < #) +findIndex(array, # < 1) +findIndex(array, # < f64) +findIndex(array, # < i) +findIndex(array, # < i32) +findIndex(array, # < i64) +findIndex(array, # <= #) +findIndex(array, # <= 1) +findIndex(array, # <= i) +findIndex(array, # <= i32) +findIndex(array, # == #) +findIndex(array, # == 1) +findIndex(array, # == f64) +findIndex(array, # == i32) +findIndex(array, # > #) +findIndex(array, # > 0.5) +findIndex(array, # > 1) +findIndex(array, # > f32) +findIndex(array, # > f64) +findIndex(array, # > i64 - i) +findIndex(array, # > i64) +findIndex(array, # >= #) +findIndex(array, # >= 1) +findIndex(array, # >= f32) +findIndex(array, # >= i) +findIndex(array, # >= i32) +findIndex(array, # in array) +findIndex(array, # not in array) +findIndex(array, 0.5 < #) +findIndex(array, 0.5 <= 1) +findIndex(array, 0.5 <= f32) +findIndex(array, 0.5 == #) +findIndex(array, 0.5 > i64) +findIndex(array, 0.5 >= #) +findIndex(array, 0.5 >= i) +findIndex(array, 1 != #) +findIndex(array, 1 < #) +findIndex(array, 1 < f32) +findIndex(array, 1 < i64) +findIndex(array, 1 <= #) +findIndex(array, 1 == #) +findIndex(array, 1 > #) +findIndex(array, 1 >= #) +findIndex(array, add != half) +findIndex(array, any(array, f32 < #)) +findIndex(array, f32 <= #) +findIndex(array, f32 == #) +findIndex(array, f32 == nil) +findIndex(array, f32 > #) +findIndex(array, f32 >= #) +findIndex(array, f64 <= #) +findIndex(array, f64 <= i64) +findIndex(array, f64 == #) +findIndex(array, f64 > #) +findIndex(array, f64 >= #) +findIndex(array, f64 >= 1) +findIndex(array, half != greet) +findIndex(array, i != #) +findIndex(array, i < 0.5) +findIndex(array, i <= #) +findIndex(array, i <= i32) +findIndex(array, i == #) +findIndex(array, i == i) +findIndex(array, i > #) +findIndex(array, i >= i) +findIndex(array, i32 != #) +findIndex(array, i32 < #) +findIndex(array, i32 < f64) +findIndex(array, i32 < i) +findIndex(array, i32 <= #) +findIndex(array, i32 == #) +findIndex(array, i32 == nil) +findIndex(array, i32 > #) +findIndex(array, i64 != #) +findIndex(array, i64 == #) +findIndex(array, i64 > #) +findIndex(array, i64 >= #) +findIndex(array, nil != #) +findIndex(array, nil != 1) +findIndex(array, nil != list) +findIndex(array, nil == foo) +findIndex(array, nil == i) +findIndex(array, not ok) +findIndex(array, ok) +findIndex(array, ok) * f64 +findIndex(array, ok) - i32 +findIndex(array, ok) / f64 +findIndex(array, ok) >= f64 +findIndex(array, score == greet) +findIndex(array, true or false) +findIndex(false ? div : list, ok) +findIndex(list, !false) +findIndex(list, !true) +findIndex(list, "bar" == "bar") +findIndex(list, "foo" != "bar") +findIndex(list, "foo" contains "bar") +findIndex(list, "foo" matches "bar") +findIndex(list, # != #) +findIndex(list, # != foo) +findIndex(list, # != nil) +findIndex(list, # == #) +findIndex(list, # == nil) +findIndex(list, # in list) +findIndex(list, 0.5 < i) +findIndex(list, 0.5 <= f64) +findIndex(list, 0.5 <= i64) +findIndex(list, 0.5 > f64) +findIndex(list, 0.5 >= f32) +findIndex(list, 1 == nil) +findIndex(list, array != list) +findIndex(list, f32 < f64) +findIndex(list, f64 <= f32) +findIndex(list, f64 <= f64) +findIndex(list, f64 == nil) +findIndex(list, f64 > f64) +findIndex(list, false && true) +findIndex(list, foo != #) +findIndex(list, foo == #) +findIndex(list, greet != half) +findIndex(list, half == add) +findIndex(list, i32 == i) +findIndex(list, i32 > f64) +findIndex(list, i32 >= i32) +findIndex(list, i64 < 0.5) +findIndex(list, i64 > f64) +findIndex(list, nil != #) +findIndex(list, nil != f64) +findIndex(list, nil != false) +findIndex(list, nil == #) +findIndex(list, nil == 0.5) +findIndex(list, nil == ok) +findIndex(list, nil in list) +findIndex(list, not false) +findIndex(list, not ok) +findIndex(list, ok != ok) +findIndex(list, ok or ok) +findIndex(list, ok) +findIndex(list, ok) + f32 +findIndex(list, ok) / i +findIndex(list, ok) > i32 +findIndex(list, one(list, ok)) +findIndex(list, true ? true : true) +findIndex(list, true) .. i +findIndex(list, true) == 0.5 ^ i32 +findIndex(list, true) > i32 ** f32 +findIndex(list, true) not in array +findIndex(map(array, #), # > #) +findIndex(map(array, #), # >= f32) +findIndex(map(array, 1), # != #) +findIndex(map(array, add), i64 >= i64) +findIndex(map(array, div), # == #) +findIndex(map(array, false), #) +findIndex(map(array, i64), ok) +findIndex(map(list, #), !ok) +findIndex(map(list, #), div == div) +findIndex(map(list, #), ok) +findIndex(map(list, f32), i32 == f64) +findIndex(map(list, list), ok) +findIndex(map(list, ok), # == ok) +findIndex(sort(array), # < #) +findIndex(true ? "bar" : i32, # < #) +findIndex(true ? "bar" : true, ok) +findLast([0.5], i64 != 0.5) +findLast(array, !false) +findLast(array, !true) +findLast(array, "bar" > "bar") +findLast(array, "foo" startsWith "foo") +findLast(array, # != #) +findLast(array, # != f64) +findLast(array, # != nil) +findLast(array, # < #) +findLast(array, # < 0.5) +findLast(array, # < 1) +findLast(array, # < f32) +findLast(array, # < f64) +findLast(array, # < i) +findLast(array, # <= #) +findLast(array, # <= 0.5) +findLast(array, # <= 1) +findLast(array, # <= f32) +findLast(array, # <= f64) +findLast(array, # <= i) +findLast(array, # <= i64) +findLast(array, # == #) +findLast(array, # == 0.5) +findLast(array, # == f64) +findLast(array, # == i64) +findLast(array, # > #) +findLast(array, # > 0.5) +findLast(array, # > i) +findLast(array, # > i32) +findLast(array, # > i64) +findLast(array, # >= #) +findLast(array, # >= 0.5) +findLast(array, # >= f64) +findLast(array, # >= i) +findLast(array, # >= i32) +findLast(array, # not in array) +findLast(array, 0.5 != #) +findLast(array, 0.5 != 0.5) +findLast(array, 0.5 != i) +findLast(array, 0.5 < #) +findLast(array, 0.5 < i64) +findLast(array, 0.5 <= #) +findLast(array, 0.5 == #) +findLast(array, 0.5 > 0.5) +findLast(array, 0.5 >= 1) +findLast(array, 0.5 >= f64) +findLast(array, 1 != #) +findLast(array, 1 != i64) +findLast(array, 1 < #) +findLast(array, 1 <= #) +findLast(array, 1 <= 0.5) +findLast(array, 1 <= f32) +findLast(array, 1 == #) +findLast(array, 1 == nil) +findLast(array, 1 > #) +findLast(array, 1 >= #) +findLast(array, 1 >= 1) +findLast(array, add != greet) +findLast(array, array == array) +findLast(array, div != score) +findLast(array, f32 != nil) +findLast(array, f32 < #) +findLast(array, f32 >= #) +findLast(array, f32 >= 1) +findLast(array, f64 != i) +findLast(array, f64 < i64) +findLast(array, f64 >= #) +findLast(array, foo != nil) +findLast(array, half == nil) +findLast(array, i != i32) +findLast(array, i < #) +findLast(array, i <= #) +findLast(array, i >= #) +findLast(array, i32 != #) +findLast(array, i32 <= f32) +findLast(array, i32 == 1) +findLast(array, i32 > #) +findLast(array, i32 >= #) +findLast(array, i32 >= 0.5) +findLast(array, i64 != #) +findLast(array, i64 != 1) +findLast(array, i64 < #) +findLast(array, i64 <= #) +findLast(array, i64 <= 0.5) +findLast(array, i64 == #) +findLast(array, i64 == nil) +findLast(array, i64 >= #) +findLast(array, i64 >= i32) +findLast(array, nil != #) +findLast(array, nil != nil) +findLast(array, nil == #) +findLast(array, nil == nil) +findLast(array, not false) +findLast(array, not true) +findLast(array, ok) +findLast(array, ok) < f64 +findLast(array, true) + i +findLast(array, true) + i32 +findLast(array, true) <= f64 +findLast(array, true) > i +findLast(i .. 1, # > f32) +findLast(i32 .. 1, # >= #) +findLast(i32 .. i32, ok) +findLast(i64 .. 1, f32 <= #) +findLast(list, !true) +findLast(list, "bar" in #) +findLast(list, "bar" not contains "bar") +findLast(list, "bar" not in #) +findLast(list, "bar" not matches "bar") +findLast(list, "foo" == "foo") +findLast(list, "foo" > "foo") +findLast(list, "foo" in #) +findLast(list, "foo" not in #) +findLast(list, # != #) +findLast(list, # == #) +findLast(list, # == foo) +findLast(list, # == nil) +findLast(list, # not in list) +findLast(list, 0.5 == nil) +findLast(list, 0.5 > f32) +findLast(list, 1 != 0.5) +findLast(list, 1 != 1) +findLast(list, 1 <= i) +findLast(list, 1 > 1) +findLast(list, 1 > i) +findLast(list, 1 >= 0.5) +findLast(list, 1 >= 1) +findLast(list, add == nil) +findLast(list, all(list, false)) +findLast(list, f32 < f64) +findLast(list, false)?.Bar +findLast(list, foo != #)?.Bar +findLast(list, foo == #) +findLast(list, greet == half) +findLast(list, i != 1) +findLast(list, i != i64) +findLast(list, i >= f32) +findLast(list, i32 == 1) +findLast(list, i64 <= 0.5) +findLast(list, i64 <= i) +findLast(list, i64 == i32) +findLast(list, i64 > 0.5) +findLast(list, i64 > i) +findLast(list, i64 >= i32) +findLast(list, nil != "bar") +findLast(list, nil != #) +findLast(list, nil != add) +findLast(list, nil != false) +findLast(list, nil != foo) +findLast(list, nil != nil) +findLast(list, nil != ok) +findLast(list, nil == #) +findLast(list, nil == i32) +findLast(list, nil == i64) +findLast(list, nil == list) +findLast(list, nil == nil) +findLast(list, not ok) +findLast(list, ok ? ok : nil) +findLast(list, ok) +findLast(list, ok).Bar +findLast(list, ok).Qux +findLast(list, ok).String +findLast(list, ok).String() +findLast(list, ok)?.Bar +findLast(list, ok)?.Qux +findLast(list, ok)?.String +findLast(list, one(list, true)) +findLast(list, true != nil) +findLast(list, true).Bar +findLast(list, true).Qux +findLast(list, true).String +findLast(list, true)?.Bar +findLast(list, true)?.Qux +findLast(list, true)?.String +findLast(map(array, #), # > f32) +findLast(map(array, #), # >= #) +findLast(map(array, #), i32 == #) +findLast(map(array, #), ok) +findLast(map(array, f64), # <= #) +findLast(map(array, i), # <= #) +findLast(map(array, ok), #) +findLast(map(array, ok), not #) +findLast(map(array, true), #) +findLast(map(list, #), # != #) +findLast(map(list, array), # == #) +findLast(map(list, i), # >= #) +findLast(map(list, list), ok) +findLast(map(list, score), 0.5 > f32) +findLast(ok ? array : div, # >= #) +findLast(sort(array), # && false) +findLastIndex([i32], # >= 0.5) +findLastIndex(array, !false) +findLastIndex(array, !ok) +findLastIndex(array, !true) +findLastIndex(array, "bar" != "bar") +findLastIndex(array, # != #) +findLastIndex(array, # != 0.5) +findLastIndex(array, # != i64) +findLastIndex(array, # != nil) +findLastIndex(array, # / f32 == #) +findLastIndex(array, # < # ** i32) +findLastIndex(array, # < #) +findLastIndex(array, # < 0.5) +findLastIndex(array, # < 1) +findLastIndex(array, # < f32) +findLastIndex(array, # < f64) +findLastIndex(array, # < i) +findLastIndex(array, # < i64) +findLastIndex(array, # <= #) +findLastIndex(array, # <= 0.5) +findLastIndex(array, # <= 1) +findLastIndex(array, # <= f32) +findLastIndex(array, # <= f64) +findLastIndex(array, # <= i) +findLastIndex(array, # <= i32) +findLastIndex(array, # <= i64) +findLastIndex(array, # == #) +findLastIndex(array, # == 0.5) +findLastIndex(array, # == 1) +findLastIndex(array, # == i32) +findLastIndex(array, # == nil) +findLastIndex(array, # > #) +findLastIndex(array, # > 0.5) +findLastIndex(array, # > 1) +findLastIndex(array, # > i) +findLastIndex(array, # > i64) +findLastIndex(array, # >= #) +findLastIndex(array, # >= 1) +findLastIndex(array, # >= f64) +findLastIndex(array, # in array) +findLastIndex(array, # not in array) +findLastIndex(array, 0.5 != #) +findLastIndex(array, 0.5 != 0.5) +findLastIndex(array, 0.5 < #) +findLastIndex(array, 0.5 < i) +findLastIndex(array, 0.5 <= #) +findLastIndex(array, 0.5 <= 0.5) +findLastIndex(array, 0.5 == #) +findLastIndex(array, 0.5 > #) +findLastIndex(array, 0.5 > i) +findLastIndex(array, 0.5 >= #) +findLastIndex(array, 0.5 >= f32) +findLastIndex(array, 1 != #) +findLastIndex(array, 1 < #) +findLastIndex(array, 1 <= #) +findLastIndex(array, 1 <= i) +findLastIndex(array, 1 <= i64) +findLastIndex(array, 1 == #) +findLastIndex(array, 1 > #) +findLastIndex(array, 1 > 1) +findLastIndex(array, 1 >= #) +findLastIndex(array, 1 in array) +findLastIndex(array, add != add) +findLastIndex(array, any(list, false)) +findLastIndex(array, f32 != #) +findLastIndex(array, f32 < #) +findLastIndex(array, f32 <= f64) +findLastIndex(array, f32 == f64) +findLastIndex(array, f32 > #) +findLastIndex(array, f32 >= f64) +findLastIndex(array, f64 != #) +findLastIndex(array, f64 < #) +findLastIndex(array, f64 == #) +findLastIndex(array, f64 > i) +findLastIndex(array, f64 >= #) +findLastIndex(array, i == #) +findLastIndex(array, i > #) +findLastIndex(array, i > 1) +findLastIndex(array, i >= #) +findLastIndex(array, i32 != #) +findLastIndex(array, i32 < #) +findLastIndex(array, i32 <= 0.5) +findLastIndex(array, i32 == #) +findLastIndex(array, i32 == i32) +findLastIndex(array, i32 > #) +findLastIndex(array, i64 != #) +findLastIndex(array, i64 != f32) +findLastIndex(array, i64 >= #) +findLastIndex(array, list != nil) +findLastIndex(array, nil != "foo") +findLastIndex(array, nil != #) +findLastIndex(array, nil != 0.5) +findLastIndex(array, nil != foo) +findLastIndex(array, nil != nil) +findLastIndex(array, nil == #) +findLastIndex(array, nil == i) +findLastIndex(array, nil not in list) +findLastIndex(array, none(array, true)) +findLastIndex(array, not (# != #)) +findLastIndex(array, not false) +findLastIndex(array, ok) +findLastIndex(array, ok) * f64 +findLastIndex(array, ok) / i64 +findLastIndex(array, ok) <= i64 +findLastIndex(array, ok) ^ f32 +findLastIndex(array, true ? ok : 1) +findLastIndex(array, true) / f32 +findLastIndex(array, true) <= i64 +findLastIndex(array, true) > f64 +findLastIndex(false ? i : "bar", ok) +findLastIndex(filter(list, true), ok) +findLastIndex(i .. i32, # == 1) +findLastIndex(i32 .. i, ok) +findLastIndex(i32 .. i64, f64 == nil) +findLastIndex(i64 .. 1, # != nil) +findLastIndex(i64 .. 1, add == nil) +findLastIndex(list, !ok) +findLastIndex(list, !true) +findLastIndex(list, "bar" in #) +findLastIndex(list, "foo" matches "bar") +findLastIndex(list, # != #) +findLastIndex(list, # != foo) +findLastIndex(list, # != nil) +findLastIndex(list, # == #) +findLastIndex(list, # == nil) +findLastIndex(list, # in list) +findLastIndex(list, 0.5 != i) +findLastIndex(list, 0.5 <= 0.5) +findLastIndex(list, 0.5 <= f32) +findLastIndex(list, 1 != 0.5) +findLastIndex(list, 1 != f64) +findLastIndex(list, 1 != i64) +findLastIndex(list, 1 < i32) +findLastIndex(list, 1 <= f32) +findLastIndex(list, 1 <= i) +findLastIndex(list, array != list) +findLastIndex(list, array != nil) +findLastIndex(list, array == list) +findLastIndex(list, div == add) +findLastIndex(list, div == score) +findLastIndex(list, f32 != 0.5) +findLastIndex(list, f32 < f64) +findLastIndex(list, f32 < i32) +findLastIndex(list, f32 <= i64) +findLastIndex(list, f32 == i32) +findLastIndex(list, f32 > f32) +findLastIndex(list, f64 <= 1) +findLastIndex(list, f64 == f64) +findLastIndex(list, false == false) +findLastIndex(list, false and false) +findLastIndex(list, false and ok) +findLastIndex(list, false) != i +findLastIndex(list, foo != #) +findLastIndex(list, foo == foo) +findLastIndex(list, greet != half) +findLastIndex(list, greet == nil) +findLastIndex(list, half != nil) +findLastIndex(list, i < i64) +findLastIndex(list, i <= i) +findLastIndex(list, i32 != nil) +findLastIndex(list, i32 < f64) +findLastIndex(list, i32 <= i32) +findLastIndex(list, i32 >= 0.5) +findLastIndex(list, i32 >= i) +findLastIndex(list, i64 < f64) +findLastIndex(list, i64 == f32) +findLastIndex(list, i64 >= i) +findLastIndex(list, i64 not in array) +findLastIndex(list, nil != #) +findLastIndex(list, nil == #) +findLastIndex(list, none(array, ok)) +findLastIndex(list, not ok) +findLastIndex(list, not true) +findLastIndex(list, ok != nil) +findLastIndex(list, ok) +findLastIndex(list, ok) ** f32 +findLastIndex(list, ok) ** f64 +findLastIndex(list, ok) - i +findLastIndex(list, ok) >= i64 +findLastIndex(list, true == nil) +findLastIndex(list, true) ** i64 +findLastIndex(list, true) + i +findLastIndex(list, true) .. i64 +findLastIndex(list, true) < i +findLastIndex(list, true) > f32 +findLastIndex(list, true) >= f32 +findLastIndex(list, true) in array +findLastIndex(map(array, "foo"), # == #) +findLastIndex(map(array, #), i < #) +findLastIndex(map(array, #), nil != half) +findLastIndex(map(array, #), ok) +findLastIndex(map(array, 0.5), ok) +findLastIndex(map(array, array), 1 != i) +findLastIndex(map(array, false), #) +findLastIndex(map(array, true), #) +findLastIndex(map(list, #), !ok) +findLastIndex(map(list, #), 0.5 < f32) +findLastIndex(map(list, 0.5), # <= #) +findLastIndex(map(list, f32), # == #) +findLastIndex(map(list, f32), # >= #) +findLastIndex(map(list, f32), ok) +findLastIndex(map(list, false), #) +findLastIndex(map(list, half), ok) +findLastIndex(map(list, ok), # or #) +findLastIndex(map(list, ok), #) +findLastIndex(sort(array), ok) +first(1 .. i) +first(1 .. i32) +first([f32]) +first([f64]) +first([false, list]) +first([i64, nil]) +first([list, i32]) +first([not false]) +first(array) +first(array) * i +first(array) ** i32 +first(array) ** i64 +first(array) + i32 +first(array) / 1 * 0.5 +first(array) <= i32 +first(array) <= i64 +first(array) == i64 +first(array) > i32 +first(array) > i64 +first(array) in array +first(false ? f64 : true) +first(false ? greet : i) +first(filter(array, false)) +first(filter(list, ok)) +first(i .. 1) +first(i .. i) +first(i .. i32) +first(i32 .. 1) +first(i32 .. i) +first(i32 .. i64) +first(i64 .. i32) +first(list) +first(list) not in list +first(list).Bar +first(list).Qux +first(list).String +first(list).String() +first(list)?.Bar +first(list)?.Qux +first(list)?.String +first(list)?.String() +first(map(array, "bar")) +first(map(array, #)) +first(map(array, 0.5)) +first(map(array, 1)) +first(map(array, add)) +first(map(array, f32)) +first(map(array, f64)) +first(map(array, foo)) +first(map(array, greet)) +first(map(array, half)) +first(map(array, i)) +first(map(array, list)) +first(map(array, ok)) +first(map(array, score)) +first(map(list, #)) +first(map(list, 0.5)) +first(map(list, add)) +first(map(list, array)) +first(map(list, div)) +first(map(list, f32)) +first(map(list, f64)) +first(map(list, i32)) +first(map(list, list)) +first(map(list, score)) +first(ok ? "bar" : 0.5) +first(ok ? 1 : "foo") +first(ok ? add : f32) +first(ok ? array : "bar") +first(ok ? list : nil) +first(ok ? ok : array) +first(ok ? ok : foo) +first(ok ? ok : score) +first(sort(array)) +first(true ? 0.5 : i64) +first(true ? add : ok) +first(true ? array : false) +first(true ? ok : div) +float(-(1 / i32)) +float(-0.5) +float(-1) +float(-f32) +float(-f64) +float(-i) +float(-i32) +float(-i64) +float(0.5 * 0.5) +float(0.5 * f32) +float(0.5 * i) +float(0.5 * i32) +float(0.5 * i64) +float(0.5 ** 0.5) +float(0.5 ** 1) +float(0.5 ** f32) +float(0.5 ** i32) +float(0.5 + 1) +float(0.5 + f32) +float(0.5 + i) +float(0.5 + i64) +float(0.5 - 0.5) +float(0.5 - 1) +float(0.5 - f32) +float(0.5 - i) +float(0.5 - i32) +float(0.5 - i64) +float(0.5 / 0.5) +float(0.5 / 1) +float(0.5 / f32) +float(0.5 / f64) +float(0.5 / i) +float(0.5 ^ 0.5) +float(0.5 ^ 1) +float(0.5 ^ f64) +float(0.5 ^ i32) +float(0.5 ^ i64) +float(0.5) != i32 +float(0.5) ** (1 % 1) +float(0.5) + 0.5 - f64 +float(0.5) + f32 +float(0.5) + i32 +float(0.5) - -f32 +float(0.5) - f32 +float(0.5) / f32 +float(0.5) < i32 +float(0.5) >= i32 +float(1 % 1) +float(1 % i) +float(1 % i32) +float(1 % i64) +float(1 * 0.5) +float(1 * 1) +float(1 * i) +float(1 * i32) +float(1 * i64) +float(1 ** 0.5) +float(1 ** i) +float(1 + 0.5) +float(1 + 1) +float(1 + f32) +float(1 + f64) +float(1 + i) +float(1 - 0.5) +float(1 - 1) +float(1 - f32) +float(1 - i) +float(1 / 0.5) +float(1 / 1) +float(1 / f64) +float(1 / i) +float(1 ^ 1) +float(1 ^ f32) +float(1 ^ f64) +float(1 ^ i) +float(1 ^ i32) +float(1 ^ i64) +float(1) != abs(f32) +float(1) != {"foo": i32}?.add +float(1) ** i64 +float(1) - i64 +float(1) / i +float(1) / i64 +float(1) < i32 +float(1) <= i64 +float(1) == int(0.5) +float(1) > i +float(1) >= f32 +float(1) >= i - i +float(abs(0.5)) +float(abs(1)) +float(abs(f32)) +float(abs(i)) +float(abs(i32)) +float(abs(i64)) +float(add(i, 1)) +float(array[1]) +float(array[i32]) +float(array[i64]) +float(array[i]) +float(count(array, true)) +float(count(list, false) * (i - 1)) +float(count(list, false)) +float(div(1, i)) +float(div(i, 1)) +float(f32 * 0.5) +float(f32 * f32) +float(f32 * i32) +float(f32 * i64) +float(f32 ** 0.5) +float(f32 ** 1) +float(f32 ** i) +float(f32 ** i64) +float(f32 + 0.5) +float(f32 + 1) +float(f32 + f32) +float(f32 + i32) +float(f32 - 0.5) +float(f32 - 1) +float(f32 - f64) +float(f32 - i) +float(f32 / 0.5) +float(f32 / 1) +float(f32 / f32) +float(f32 / i) +float(f32 / i64) +float(f32 ^ 0.5) +float(f32 ^ f32) +float(f32 ^ f64) +float(f32 ^ i64) +float(f32) +float(f32) * f32 +float(f32) + f32 +float(f32) - f32 +float(f32) - f64 +float(f32) - i64 +float(f32) / f64 +float(f32) < i32 +float(f32) <= f32 +float(f32) >= f32 +float(f32) >= f32 ** f32 +float(f32) ^ f64 +float(f32) ^ i32 +float(f64 * 0.5) +float(f64 * f32) +float(f64 * i) +float(f64 * i32) +float(f64 ** 1) +float(f64 ** f32) +float(f64 + 0.5) +float(f64 + 1) +float(f64 + i) +float(f64 - 0.5) +float(f64 - i) +float(f64 - i32) +float(f64 - i32) / i +float(f64 / -i32) +float(f64 / 1) +float(f64 / f32) +float(f64 / i32) +float(f64 ^ 0.5) +float(f64 ^ 1) +float(f64 ^ f32) +float(f64 ^ f64) +float(f64) +float(f64) != int(i32) +float(f64) * i32 +float(f64) / f32 +float(f64) / f64 +float(f64) / i64 +float(f64) < i +float(f64) < i32 +float(f64) <= f32 +float(f64) <= i64 +float(f64) == i32 +float(f64) > i32 +float(f64) >= f64 +float(f64) >= i +float(f64) >= i32 +float(f64) ^ i +float(false ? div : i32) +float(false ? f32 : 0.5) +float(find(array, ok)) +float(find(array, true)) +float(findIndex(list, true)) +float(findLast(array, ok)) +float(findLast(array, true)) +float(first(array)) +float(float(0.5)) +float(float(1)) +float(float(f32)) +float(float(f64)) +float(float(i)) +float(float(i32)) +float(float(i64)) +float(get(array, 1)) +float(get(array, i)) +float(get(array, i64)) +float(half(-f64)) +float(half(0.5)) +float(half(f64)) +float(i % 1) +float(i * 0.5) +float(i * 1) +float(i * f64) +float(i * i) +float(i * i32 * i32) +float(i * i32) +float(i * i64) +float(i ** 1) +float(i ** f64) +float(i ** i32) +float(i + 0.5) +float(i + f64) +float(i + i64) +float(i - 0.5) +float(i - 1) +float(i - findIndex(array, true)) +float(i / 1) +float(i / f64) +float(i / i64) +float(i ^ f32) +float(i ^ f64) +float(i ^ i64) +float(i) +float(i) != f32 +float(i) != i32 +float(i) != i64 +float(i) ** f32 +float(i) / i32 +float(i) < f32 +float(i) < i64 +float(i) <= f32 +float(i) == i32 +float(i) > f64 +float(i) ^ f64 +float(i) ^ i64 +float(i32 % 1) +float(i32 % i) +float(i32 * 1) +float(i32 * f32) +float(i32 ** 0.5) +float(i32 ** f64) +float(i32 ** i32) +float(i32 ** i64) +float(i32 + 1) +float(i32 + f32) +float(i32 - 0.5) +float(i32 - f64) +float(i32 - i) +float(i32 - i32) +float(i32 / 0.5) +float(i32 / 1) +float(i32 / 1) > f64 +float(i32 / i) +float(i32 ^ 1) +float(i32 ^ f64) +float(i32 ^ i) +float(i32) +float(i32) != f64 +float(i32) * i64 +float(i32) + i +float(i32) + i64 +float(i32) - i64 +float(i32) / i +float(i32) / i32 +float(i32) < -0.5 +float(i32) == f32 +float(i32) == i32 +float(i32) > f32 +float(i32) > i32 +float(i32) >= f32 +float(i32) >= f64 +float(i32) ^ f32 +float(i32) ^ f64 +float(i32) ^ i32 +float(i64 % i) +float(i64 % i32) +float(i64 * 0.5) +float(i64 * 1) +float(i64 ** f64) +float(i64 ** i64) +float(i64 + 0.5) +float(i64 + f64) +float(i64 - 1) +float(i64 - f32) +float(i64 - f64) +float(i64 - i32) +float(i64 - i64) +float(i64 / 0.5) +float(i64 / 1) +float(i64 / f32) +float(i64 ^ f64) +float(i64) +float(i64) ** i +float(i64) / i32 +float(i64) > f64 ^ f32 +float(i64) >= i +float(i64) >= i64 +float(int(0.5)) +float(int(1)) +float(int(f32)) +float(int(f64)) +float(int(i)) +float(int(i32)) +float(int(i64)) +float(len("bar")) +float(len("foo")) +float(len(array)) +float(len(list)) +float(max(0.5)) +float(max(0.5, i32)) +float(max(1)) +float(max(1, i)) +float(max(1, i64)) +float(max(f64)) +float(max(i)) +float(max(i32)) +float(max(i64)) +float(min(0.5)) +float(min(1)) +float(min(f32)) +float(min(f64)) +float(min(i)) +float(min(i32)) +float(min(i64)) +float(ok ? f64 : half) +float(ok ? i : greet) +float(score(1)) +float(score(i)) +float(score(i, i)) <= f32 +float(score(score(i))) +float(string(0.5)) +float(string(1)) +float(string(f32)) +float(string(f64)) +float(string(i)) +float(string(i64)) +float(toJSON(0.5)) +float(toJSON(1)) +float(toJSON(f32)) +float(toJSON(f64)) +float(toJSON(i)) +float(toJSON(i32)) +float(true ? 1 : div) +float(true ? 1 : i64) +float(true ? f64 : div) +foo +foo != first(list) +foo != foo +foo != foo ? 1 : 1 +foo != get(list, i) +foo != last(list) +foo != nil ? half : nil +foo == foo +foo == foo ? i : score +foo == last(list) +foo == nil == nil +foo == nil || ok +foo in [half] +foo in filter(list, false) +foo in list +foo in list ? nil : i32 +foo in map(list, #) +foo not in list +foo.Bar +foo.Bar != string(i64) +foo.Bar + type(greet) +foo.Bar < toJSON(0.5) +foo.Bar == type(0.5) +foo.Bar not matches string(half) +foo.Bar not startsWith foo.String() +foo.Qux +foo.Qux != add +foo.Qux != half +foo.Qux != score +foo.Qux == div +foo.Qux == foo?.Qux +foo.Qux(foo?.String()) +foo.Qux(greet("bar")) +foo.Qux(toJSON(0.5)) +foo.Qux(toJSON(i)) +foo.Qux(toJSON(nil)) +foo.Qux(trimSuffix("foo")) +foo.Qux(type("bar")) +foo.Qux(type(i)) +foo.String +foo.String != div +foo.String == add +foo.String == greet +foo.String == half +foo.String == score +foo.String() +foo?.Bar +foo?.Bar + type(score) +foo?.Bar in foo +foo?.Bar not endsWith "bar" ? score : array +foo?.Qux +foo?.Qux != div +foo?.Qux != greet +foo?.Qux != half +foo?.Qux != score +foo?.Qux == add +foo?.Qux == greet +foo?.Qux == half +foo?.Qux == score +foo?.Qux(foo?.Bar) +foo?.Qux(string(0.5)) +foo?.Qux(type(0.5)) +foo?.Qux(upper("bar")) +foo?.String +foo?.String != div +foo?.String != greet +foo?.String != half +foo?.String != nil ? half : list +foo?.String != score +foo?.String == add +foo?.String == half +foo?.String() +foo?.String() + type(list) +foo?.String() < string(i32) +foo?.String() < toJSON(nil) +foo?.String() matches toBase64("bar") +fromBase64(string(ok)) +fromBase64(string(true)) +fromBase64(toBase64("foo")) +fromBase64(toBase64(toJSON(nil))) +fromBase64(toJSON(nil)) +fromBase64(toJSON(ok)) +fromBase64(toJSON(true)) +fromBase64(type(add)) +fromBase64(type(div)) +fromBase64(type(false)) +fromBase64(type(greet)) +fromBase64(type(half)) +fromBase64(type(nil == score)) +fromBase64(type(ok)) +fromBase64(type(score)) +fromBase64(type(true)) +fromJSON("foo") not in list && false +fromJSON(string(0.5)) +fromJSON(string(1)) +fromJSON(string(f32)) +fromJSON(string(f64)) +fromJSON(string(false)) +fromJSON(string(i)) +fromJSON(string(i32)) +fromJSON(string(i64)) +fromJSON(string(i64)) ** f64 +fromJSON(string(ok)) +fromJSON(string(true)) +fromJSON(toJSON("foo")) +fromJSON(toJSON(0.5 ** 0.5)) +fromJSON(toJSON(1)) +fromJSON(toJSON(abs(1))) +fromJSON(toJSON(array)) +fromJSON(toJSON(f32)) +fromJSON(toJSON(f64)) +fromJSON(toJSON(i)) +fromJSON(toJSON(i32)) +fromJSON(toJSON(i64)) +fromJSON(toJSON(list)) +fromJSON(toJSON(nil)) +fromJSON(toJSON(ok)) +fromJSON(toJSON(true)) +get(1 .. i32, i) +get(1 .. i64, abs(1)) +get(1 .. i64, i) +get(1 .. i64, i32) +get(["bar"], i64) +get([array], i) +get([greet], i) +get([nil, half], i) +get([score, 0.5, score], i64) +get(array, -1) +get(array, -i) +get(array, -i32) +get(array, 1 % 1) +get(array, 1 % i64) +get(array, 1 - 1) +get(array, 1 - i) +get(array, 1) * f64 +get(array, 1) < f32 +get(array, 1) <= i32 +get(array, 1) > i +get(array, 1) ^ f64 +get(array, 1) ^ i +get(array, array[1]) +get(array, count(list, true)) +get(array, false ? div : false) +get(array, first(array)) +get(array, i % i64) +get(array, i * 1) +get(array, i) +get(array, i) + i +get(array, i) > i32 +get(array, i) ^ f32 +get(array, i32 * i64) +get(array, i32) +get(array, i32) ** f32 +get(array, i32) == i32 +get(array, i32) > f64 +get(array, i64) +get(array, i64) ** i +get(array, i64) ** i64 +get(array, i64) .. i32 +get(array, i64) <= -i32 +get(array, i64) <= f64 / f32 +get(array, i64) <= i +get(array, i64) == i64 +get(array, int(1)) +get(array, int(f32)) +get(array, int(f64)) +get(array, int(i32)) +get(array, len(array)) +get(array, max(1)) +get(array, min(i)) +get(array, min(i32)) +get(array, score(1)) +get(array, true ? i : 1) +get(false ? "bar" : f64, list) +get(false ? "bar" : i32, greet) +get(false ? "foo" : i, ok) +get(false ? 0.5 : i64, true not in String) +get(false ? 1 : greet, ok) +get(false ? div : true, min("foo")) +get(false ? greet : score, score) +get(false ? half : list, i32) +get(false ? list : 1, i32) +get(false ? list : i64, i >= f64) +get(false ? score : 0.5, add) +get(false ? score : 0.5, half) +get(false ? score : f64, half) +get(filter(list, ok), i32) +get(filter(list, ok), i64) +get(i .. i, i) +get(i32 .. 1, i) +get(i64 .. 1, i32) +get(list, -i) +get(list, -i32) +get(list, -i64) +get(list, 1 * i) +get(list, 1).Bar +get(list, 1).Qux +get(list, 1).String +get(list, 1).String() +get(list, 1)?.Bar +get(list, 1)?.Qux +get(list, 1)?.String +get(list, 1)?.String() +get(list, abs(i)) +get(list, abs(i32)) +get(list, i) +get(list, i) != foo +get(list, i) == foo +get(list, i).Bar +get(list, i).Qux +get(list, i).String +get(list, i)?.Bar +get(list, i)?.Qux +get(list, i)?.String +get(list, i)?.String() +get(list, i32) +get(list, i32).Bar +get(list, i32).Qux +get(list, i32).String +get(list, i32).String() +get(list, i32)?.Bar +get(list, i32)?.Qux +get(list, i32)?.String +get(list, i32)?.String() +get(list, i64 * i32) +get(list, i64) +get(list, i64).Bar +get(list, i64).Qux +get(list, i64).String +get(list, i64).String() +get(list, i64)?.Bar +get(list, i64)?.Qux +get(list, i64)?.String +get(list, i64)?.String() +get(list, int(1) > 0.5 ? div : 0.5) +get(list, int(i)) +get(list, int(i32)) +get(list, int(i64)) +get(list, last(array)) +get(list, max(1, i64, i64)) +get(list, min(i32)) +get(list, min(i64)) +get(list, score(1)) +get(list[i32:i], i64) +get(map(array, #), i) +get(map(array, #), i64) +get(map(array, #), last(array)) +get(map(array, 0.5), i) +get(map(array, 1), i) +get(map(array, i32), i64) +get(map(array, ok), i) +get(map(array, ok), i64) +get(map(list, #), i) +get(map(list, #), i32) +get(map(list, #), i64) +get(map(list, 0.5), i64) +get(map(list, array), i) +get(map(list, div), i32) +get(map(list, i32), i64) +get(map(list, ok), i32) +get(map(list, true), i64) +get(ok ? 0.5 : add, f32) +get(ok ? add : 0.5, ok) +get(ok ? add : false, div) +get(ok ? array : 0.5, Bar) +get(ok ? array : i, add) +get(ok ? div : foo, filter("bar", ok)) +get(ok ? greet : 0.5, foo in String) +get(ok ? greet : f32, Bar) +get(ok ? i : f64, greet)?.f64 +get(ok ? i32 : "foo", score) +get(ok ? i32 : add, div) +get(ok ? list : "foo", f32) +get(ok ? ok : half, array) +get(ok ? true : i32, f32) +get(sort(array), i32) +get(true ? 0.5 : score, foo) +get(true ? 1 : f64, foo) +get(true ? 1 : greet, greet)?.foo +get(true ? 1 : score, String?.Qux()) +get(true ? add : score, i) +get(true ? array : 1, half) +get(true ? array : i64, ok) +get(true ? div : foo, list) +get(true ? f32 : 1, greet) +get(true ? f64 : greet, String) +get(true ? f64 : ok, Bar?.ok) +get(true ? i : f64, add) +get(true ? i64 : score, i) +get(true ? list : ok, ok) +get({"bar": i32}.i32, ok) +greet +greet != add +greet != div +greet != div != nil +greet != foo.Qux +greet != foo.String +greet != foo?.Qux +greet != foo?.String +greet != greet +greet != greet != nil +greet != greet or 0.5 == i +greet != half +greet != half ? 1 : ok +greet != half ? array : 0.5 +greet != half ? false : f64 +greet != half ? greet : greet +greet != nil ? i64 : 0.5 +greet != score +greet == add +greet == add == ok +greet == add ? div == greet : i64 +greet == div +greet == div ? add : i32 +greet == foo.Qux +greet == foo.String +greet == foo?.Qux +greet == foo?.String +greet == greet +greet == half +greet == nil != nil +greet == nil && ok +greet == nil == ok +greet == score +greet in [nil] +greet("bar" + "bar") +greet("bar" + "foo") +greet("bar") != foo.String() +greet("bar") != nil != false +greet("bar") in foo +greet("foo" + "bar") +greet("foo" + "foo") +greet("foo") >= string(foo) +greet("foo") not contains "bar" ? array : half +greet("foo") startsWith greet("bar") +greet(false ? f32 : "foo") +greet(false ? i : "bar") +greet(foo.Bar) +greet(foo.String()) +greet(foo?.Bar) +greet(foo?.String()) +greet(greet("bar")) +greet(greet("foo")) +greet(lower("bar")) +greet(lower("foo")) +greet(ok ? "bar" : div) +greet(string("bar")) +greet(string("foo")) +greet(string(-i64)) +greet(string(0.5 == 1)) +greet(string(0.5)) +greet(string(1)) +greet(string([0.5])) +greet(string(add)) +greet(string(array)) +greet(string(div)) +greet(string(f32)) +greet(string(f64)) +greet(string(false)) +greet(string(foo)) +greet(string(foo?.Qux)) +greet(string(greet)) +greet(string(half)) +greet(string(i)) +greet(string(i32)) +greet(string(i64)) +greet(string(list)) +greet(string(nil != false)) +greet(string(nil)) +greet(string(ok)) +greet(string(score)) +greet(string(true)) +greet(toBase64("bar")) +greet(toBase64("foo")) +greet(toJSON("bar")) +greet(toJSON("foo")) +greet(toJSON(0.5)) +greet(toJSON(1)) +greet(toJSON(array)) +greet(toJSON(f32)) +greet(toJSON(f64)) +greet(toJSON(false)) +greet(toJSON(foo)) +greet(toJSON(i)) +greet(toJSON(i32)) +greet(toJSON(i64)) +greet(toJSON(list)) +greet(toJSON(nil)) +greet(toJSON(ok)) +greet(toJSON(string(array))) +greet(toJSON(true)) +greet(trim("bar")) +greet(trim("foo")) +greet(trim(string(array))) +greet(trimPrefix("bar")) +greet(trimPrefix("foo")) +greet(trimSuffix("bar")) +greet(trimSuffix("foo")) +greet(trimSuffix("foo", "foo")) +greet(true ? "foo" : 0.5) +greet(type("bar")) +greet(type("foo")) +greet(type(0.5)) +greet(type(1)) +greet(type(abs(f32))) +greet(type(add)) +greet(type(array)) +greet(type(div)) +greet(type(f32)) +greet(type(f64 / i)) +greet(type(f64)) +greet(type(false)) +greet(type(foo)) +greet(type(greet)) +greet(type(half)) +greet(type(i)) +greet(type(i32)) +greet(type(i64)) +greet(type(list)) +greet(type(nil)) +greet(type(ok)) +greet(type(score)) +greet(type(true)) +greet(upper("bar")) +greet(upper("foo")) +half +half != add +half != add ? ok : half +half != div +half != div == true +half != foo.Qux +half != foo.String +half != foo?.Qux +half != foo?.String +half != greet +half != half +half != score +half == add +half == add ? "bar" : half +half == div +half == div ? add : 0.5 +half == div and 1 >= 1 +half == foo.Qux +half == foo.String +half == foo?.Qux +half == foo?.String +half == greet +half == greet == nil +half == greet ? ok : foo +half == greet || ok +half == half +half == half && i >= 0.5 +half == half ? score : "bar" +half == half and ok +half == nil == true +half == nil ? 1 : 0.5 +half == nil ? 1 : score +half == score +half not in [list, i64, ok] +half not in {"bar": list, "foo": 0.5}.ok +half(-(f32 - 0.5)) +half(--1) +half(-0.5) +half(-1) +half(-f32 ^ i) +half(-f64) +half(0.5 * 0.5) +half(0.5 * 1) +half(0.5 * f64) +half(0.5 * i) +half(0.5 * i32) +half(0.5 * i64) +half(0.5 ** 0.5) +half(0.5 ** 1) +half(0.5 ** f32) +half(0.5 ** f64) +half(0.5 ** i) +half(0.5 ** i32) +half(0.5 ** i64) +half(0.5 + 0.5) +half(0.5 + 1) +half(0.5 + f32) +half(0.5 + f64) +half(0.5 + i32) +half(0.5 + i64) +half(0.5 - 0.5) +half(0.5 - 1) +half(0.5 - f32) +half(0.5 - f64) +half(0.5 - i) +half(0.5 - i32) +half(0.5 - i64) +half(0.5 / 0.5) +half(0.5 / 1) +half(0.5 / f32) +half(0.5 / f64) +half(0.5 / i) +half(0.5 / i32) +half(0.5 / i64) +half(0.5 ^ 0.5) +half(0.5 ^ 1) +half(0.5 ^ f32) +half(0.5 ^ f64) +half(0.5 ^ i) +half(0.5 ^ i32) +half(0.5 ^ i64) +half(0.5) != f32 +half(0.5) != i64 +half(0.5) * f32 +half(0.5) ** f32 +half(0.5) ** f64 +half(0.5) + 1 * f64 +half(0.5) + f64 +half(0.5) + i32 +half(0.5) + i64 +half(0.5) - f32 +half(0.5) - f64 +half(0.5) - i +half(0.5) - i32 +half(0.5) / i +half(0.5) / i32 +half(0.5) / i64 +half(0.5) < i32 +half(0.5) <= i +half(0.5) == f32 != true +half(0.5) == i +half(0.5) == i32 +half(0.5) == i64 +half(0.5) > i +half(0.5) > i32 +half(0.5) > i64 +half(0.5) >= f32 +half(0.5) >= f64 +half(0.5) >= i +half(0.5) >= i32 +half(0.5) >= i64 +half(0.5) ^ (i32 - 1) +half(0.5) ^ i32 +half(1 * 0.5) +half(1 * 1) +half(1 * f32) +half(1 * f64) +half(1 * i) +half(1 * i32) +half(1 * i64) +half(1 ** 0.5) +half(1 ** 1) +half(1 ** f32) +half(1 ** f64) +half(1 ** i) +half(1 ** i32) +half(1 ** i64) +half(1 + 0.5) +half(1 + 1) +half(1 + f32) +half(1 + f64) +half(1 + i) +half(1 + i32) +half(1 + i64) +half(1 - 0.5) +half(1 - 1) +half(1 - f32) +half(1 - f64) +half(1 - i) +half(1 - i32) +half(1 - i64) +half(1 / 0.5) +half(1 / 1) +half(1 / f32) +half(1 / f64) +half(1 / i) +half(1 / i32) +half(1 / i64) +half(1 ^ 0.5) +half(1 ^ 1) +half(1 ^ f32) +half(1 ^ f64) +half(1 ^ i) +half(1 ^ i32) +half(abs(0.5)) +half(abs(f64)) +half(abs(f64)) - i +half(f32 * 0.5) +half(f32 * 1) +half(f32 * f64) +half(f32 * i) +half(f32 * i32) +half(f32 * i64) +half(f32 ** 0.5) +half(f32 ** f32) +half(f32 ** f64) +half(f32 + 0.5) +half(f32 + 1) +half(f32 + f32) +half(f32 + f64) +half(f32 + i) +half(f32 + i32) +half(f32 + i64) +half(f32 - 0.5) +half(f32 - 1) +half(f32 - f64) +half(f32 - i) +half(f32 - i32) +half(f32 - i64) +half(f32 / 0.5) +half(f32 / 1) +half(f32 / f32) +half(f32 / f64) +half(f32 / i32) +half(f32 / i64) +half(f32 ^ 0.5) +half(f32 ^ f32) +half(f32 ^ f64) +half(f32 ^ i32) +half(f32 ^ i64) +half(f64 * 0.5) +half(f64 * 1) +half(f64 * f32) +half(f64 * i) +half(f64 * i32) +half(f64 ** 0.5) +half(f64 ** 1) +half(f64 ** f32) +half(f64 ** f64) +half(f64 ** i) +half(f64 ** i32) +half(f64 + 1) +half(f64 + f32) +half(f64 + i) +half(f64 + i32) +half(f64 - 0.5) +half(f64 - 1) +half(f64 - f32) +half(f64 - f64) +half(f64 - i) +half(f64 - i32) +half(f64 - i64) +half(f64 / 1) +half(f64 / f32) +half(f64 / f64) +half(f64 / i32) +half(f64 / i64) +half(f64 ^ 0.5) +half(f64 ^ 1) +half(f64 ^ f32) +half(f64 ^ i) +half(f64 ^ i32) +half(f64 ^ i64) +half(f64) +half(f64) != f32 +half(f64) != f64 +half(f64) != i64 +half(f64) * f32 +half(f64) * i64 +half(f64) ** (i32 * 0.5) +half(f64) ** 0.5 ** i +half(f64) ** f64 +half(f64) ** i64 +half(f64) + 1 + f64 +half(f64) + f64 +half(f64) + i +half(f64) + i32 +half(f64) + i64 +half(f64) - f64 +half(f64) - i32 +half(f64) / f32 +half(f64) / f64 +half(f64) / i32 +half(f64) / i64 +half(f64) < f64 +half(f64) < i +half(f64) < i32 +half(f64) < i64 +half(f64) <= 0.5 + f64 +half(f64) <= f64 +half(f64) <= i64 +half(f64) == i64 +half(f64) > abs(i) +half(f64) > f32 * 0.5 +half(f64) > max(i64) +half(f64) >= f32 +half(f64) >= i +half(f64) >= i64 +half(f64) ^ f32 +half(false ? 0.5 : 0.5) +half(float(-f64)) +half(float(0.5)) +half(float(1)) +half(float(f32)) +half(float(f64)) +half(float(i)) +half(float(i32)) +half(float(i64)) +half(greet == div ? "bar" : 0.5) +half(half(0.5)) +half(half(f64)) +half(half(i - 0.5)) +half(i * 0.5) +half(i * 1) +half(i * f32) +half(i * f64) +half(i ** 0.5) +half(i ** 1) +half(i ** f32) +half(i ** f64) +half(i ** i) +half(i ** i64) +half(i + 0.5) +half(i + 1) +half(i + f32) +half(i + f64) +half(i - 0.5) +half(i - 1) +half(i - f64) +half(i / 0.5) +half(i / 1) +half(i / f32) +half(i / f64) +half(i / i) +half(i / i32) +half(i / i64) +half(i ^ 0.5) +half(i ^ 1) +half(i ^ f32) +half(i ^ i32) +half(i ^ i64) +half(i32 * 0.5) +half(i32 * 1) +half(i32 * f32) +half(i32 * f64) +half(i32 ** 0.5) +half(i32 ** 1) +half(i32 ** f32) +half(i32 ** f64) +half(i32 ** i) +half(i32 ** i32) +half(i32 ** i64) +half(i32 + 0.5) +half(i32 + 1) +half(i32 + f64) +half(i32 - 0.5) +half(i32 - 1) +half(i32 - f32) +half(i32 - f64) +half(i32 / 0.5) +half(i32 / 1) +half(i32 / f32) +half(i32 / f64) +half(i32 / i) +half(i32 / i32) +half(i32 / i64) +half(i32 ^ 0.5) +half(i32 ^ 1) +half(i32 ^ f32) +half(i32 ^ i) +half(i32 ^ i32) +half(i32 ^ i64) +half(i64 * 0.5) +half(i64 * 1) +half(i64 * f64) +half(i64 ** 0.5) +half(i64 ** 1) +half(i64 ** f32) +half(i64 ** f64) +half(i64 ** i64) +half(i64 + 0.5) +half(i64 + 1) +half(i64 + f32) +half(i64 + f64) +half(i64 - 0.5) +half(i64 - 1) +half(i64 - f32) +half(i64 / 0.5) +half(i64 / 1) +half(i64 / f32) +half(i64 / f64) +half(i64 / i) +half(i64 / i32) +half(i64 / i64) +half(i64 ^ 0.5) +half(i64 ^ 1) +half(i64 ^ f32) +half(i64 ^ f64) +half(i64 ^ i32) +half(i64 ^ i64) +half(max(0.5)) +half(max(0.5, f32)) +half(max(f64)) +half(min(0.5)) +half(min(0.5, 0.5)) +half(min(1, 0.5, 1)) +half(min(f64)) +half(ok ? 0.5 : f32) +half(ok ? 0.5 : false) +half(ok ? 0.5 : foo) +half(true ? 0.5 : 0.5) +hasPrefix("bar", "foo") != ok +hasSuffix("foo", "foo") or 0.5 <= i +i +i != -0.5 +i != -1 +i != -f32 +i != -f64 +i != -i +i != -i64 +i != 0.5 / 0.5 +i != 0.5 == ok +i != 0.5 ? 1 : array +i != 0.5 ? i32 : 0.5 +i != 0.5 ? score : score +i != 1 % i64 +i != 1 * i +i != 1 + 1 +i != 1 - 0.5 +i != 1 - 1 +i != 1 - i64 +i != 1 == ok +i != 1 ? ok : i64 +i != 1 or i64 != 1 +i != f32 +i != f32 + i +i != f32 / 1 +i != f32 ? div : list +i != f64 +i != f64 * 0.5 +i != f64 + 1 +i != f64 / 0.5 +i != f64 ? 0.5 : nil +i != f64 ? array : div +i != f64 ? half : 1 +i != f64 || ok +i != first(array) +i != float(1) +i != float(f32) +i != float(f64) +i != half(0.5) +i != i +i != i != nil +i != i ^ f64 +i != i32 +i != i32 % i32 +i != i32 * f64 +i != i32 - i64 +i != i32 / i64 +i != i32 ? 1 : i +i != i32 ? list : i +i != i32 || half != nil +i != i64 +i != i64 - f32 +i != i64 ? true : "foo" +i != i64 ^ f64 +i != int(1) +i != max(i32) +i != min(1) +i != nil != true +i != nil ? ok : "bar" +i != score(i) +i % -1 +i % -i +i % -i32 +i % -i64 +i % 1 != i64 +i % 1 .. i32 +i % 1 / i +i % 1 >= i +i % 1 >= i32 +i % array[i] +i % first(array) +i % get(array, i64) +i % i +i % i % i32 +i % i + i32 +i % i == i +i % i in array +i % i32 +i % i32 / i32 +i % i32 <= f32 +i % i64 +i % i64 != i +i % int(i64) +i % len(array) +i % score(1) +i % score(i) +i * (0.5 + 0.5) +i * (f32 + f32) +i * (i32 + 0.5) +i * (i32 - f64) +i * (i64 + 1) +i * -1 +i * -f32 +i * -i +i * -i64 +i * 0.5 * f64 +i * 0.5 + i +i * 0.5 - i +i * 0.5 < i +i * 0.5 <= i64 ** f64 +i * 1 % i +i * 1 ** i32 +i * 1 / f64 +i * 1 / i64 +i * 1 <= f32 +i * abs(0.5) +i * add(1, 1) +i * array[i32] +i * f32 +i * f32 != f32 +i * f32 ** 0.5 +i * f32 >= f32 +i * f32 ^ f32 +i * f64 +i * f64 * 1 +i * float(f64) +i * half(f64) +i * i +i * i != i64 +i * i / f32 +i * i / f64 +i * i / i32 +i * i / i64 +i * i32 +i * i32 ** f64 +i * i32 ** i32 +i * i32 - i +i * i32 / i32 +i * i32 <= i32 +i * i64 +i * i64 % i32 +i * i64 * 0.5 +i * i64 + f32 +i * i64 >= i32 +i * i64 ^ i64 +i * int(f64) +i * int(i) +i * int(i64) +i * max(0.5) +i * min(i64) +i * score(1) +i ** (0.5 + f64) +i ** (0.5 + i64) +i ** (1 * 1) +i ** (1 - 0.5) +i ** (i32 % i64) +i ** (i32 - 1) +i ** -0.5 +i ** -i +i ** -i32 +i ** -i64 +i ** 0.5 ** 0.5 +i ** 0.5 ** 1 +i ** 0.5 < f32 +i ** 0.5 <= i64 ^ i32 +i ** 1 != f64 +i ** 1 ** 1 +i ** 1 ** f64 +i ** 1 ** i +i ** 1 == f32 +i ** f32 +i ** f32 ** 0.5 +i ** f32 ** f64 +i ** f32 + f64 +i ** f32 <= f32 +i ** f32 <= i32 ? 1 : f32 +i ** f32 >= float(i64) +i ** f64 +i ** f64 != f64 +i ** f64 < 1 / 0.5 +i ** float(0.5) +i ** float(f32) +i ** float(i32) +i ** half(f64) +i ** i +i ** i + f64 +i ** i <= i +i ** i ^ i +i ** i32 +i ** i32 != i +i ** i32 != i32 +i ** i32 + i32 +i ** i64 +i ** i64 ** 1 +i ** i64 ** f64 +i ** i64 ** i64 +i ** i64 - f64 +i ** i64 >= i +i ** i64 >= i32 +i ** i64 ^ 1 +i ** int(1) +i ** max(f32) +i ** min(0.5, 1) +i ** min(f32) +i ** min(i) +i ** min(i32) +i ** score(1) +i + -1 +i + -f32 +i + -f64 +i + -i +i + 0.5 != i +i + 0.5 ** i32 +i + 0.5 - i +i + 0.5 < 1 + f32 +i + 0.5 <= i32 +i + 0.5 > f32 +i + 1 / array[i32] +i + 1 / f32 +i + 1 <= f32 +i + 1 > i64 +i + 1 >= f64 +i + array[i32] +i + count(list, false) +i + f32 +i + f32 != f64 +i + f32 * i +i + f32 ** i +i + f64 +i + f64 <= i64 +i + f64 == f64 +i + float(0.5) +i + float(f32) +i + get(array, i64) +i + half(0.5) +i + half(f64) +i + i +i + i + f32 +i + i - i32 +i + i32 +i + i32 != i64 +i + i32 - 0.5 +i + i32 .. i +i + i32 > f32 +i + i64 +i + i64 + f64 +i + i64 ^ 1 +i + int(f32) +i + int(i64) +i + last(array) +i + len("bar") +i + max(0.5) +i + max(f32) +i - -1 +i - -f32 +i - -i +i - -i64 +i - 0.5 * 0.5 +i - 0.5 * 1 +i - 0.5 / 1 +i - 1 * 1 +i - 1 * i32 +i - 1 - i +i - 1 ^ 0.5 +i - 1 ^ i32 +i - abs(0.5) +i - abs(f32) +i - abs(i32) +i - f32 +i - f32 * i32 +i - f32 ** 1 +i - f32 + f64 +i - f32 - 1 +i - f32 / 0.5 +i - f32 / f32 +i - f32 / i32 +i - f32 ^ i64 +i - f64 +i - findIndex(list, ok) +i - half(0.5) +i - i +i - i * 1 +i - i < i + f64 +i - i <= i +i - i <= i32 +i - i >= f32 +i - i not in array +i - i32 +i - i32 > len(array) +i - i32 ^ 0.5 +i - i64 +i - i64 ** 1 +i - i64 + i32 +i - i64 - 1 / 1 +i - i64 - f64 +i - int(1) +i - int(f32) +i - int(i) +i - last(array) +i - max(0.5) +i - max(i64) +i - min(f32) +i - score(1) +i - score(i) +i .. -i32 +i .. 1 % i32 +i .. 1 == array +i .. abs(1) +i .. abs(i32) +i .. i +i .. i % 1 +i .. i32 +i .. i32 == array +i .. i64 +i .. i64 + i +i .. i64 == list +i .. int(i64) +i .. last(array) +i .. len(list) +i .. min(1) +i .. score(i) +i / (f32 + f64) +i / (f64 + f32) +i / (i32 + f32) +i / -0.5 +i / -1 +i / -i32 +i / -i64 +i / 0.5 * f32 +i / 0.5 * f64 +i / 0.5 ** f32 +i / 0.5 / i32 +i / 0.5 < i64 +i / 0.5 <= i64 +i / 0.5 == 0.5 - f64 +i / 0.5 >= i64 +i / 1 ** 1 +i / 1 / i64 +i / 1 == f64 +i / 1 ^ 1 +i / 1 ^ i64 +i / abs(i64) +i / f32 +i / f32 != f32 +i / f32 ** i64 +i / f32 / i +i / f64 +i / f64 * f32 +i / f64 - f32 +i / float(i32) +i / half(0.5) +i / half(f64) +i / i +i / i != i64 +i / i > i32 +i / i > i64 +i / i32 +i / i32 - i +i / i32 / i +i / i32 / i64 +i / i32 ^ f32 +i / i64 +i / i64 != i +i / i64 ** f32 +i / i64 < i % 1 +i / i64 >= i32 ? div : div +i / len("bar") +i / len(list) +i / max(1 / i) +i / min(0.5) +i / min(f64) +i / min(i32) +i / score(1) +i / score(i) +i < -(f32 - 1) +i < -1 +i < -f32 +i < -i +i < -i32 +i < 0.5 != false +i < 0.5 != ok +i < 0.5 * i +i < 0.5 + 0.5 +i < 0.5 == ok +i < 0.5 ? "bar" : "bar" +i < 0.5 ? f32 : array +i < 0.5 ? f32 : half +i < 1 * 1 +i < 1 ** f32 +i < 1 == ok +i < 1 ? false : nil +i < abs(f64) +i < f32 +i < f32 * i +i < f32 ^ f32 +i < f64 +i < f64 * f64 +i < findIndex(list, ok) +i < half(f32 ^ i64) +i < half(f64) +i < i +i < i % 1 +i < i / 1 +i < i ? i32 : add +i < i ^ 0.5 +i < i ^ i32 +i < i32 +i < i32 ** 0.5 +i < i32 - f32 +i < i32 == nil +i < i64 +i < i64 && ok +i < i64 - f64 +i < i64 - i32 +i < i64 ? nil : "foo" +i < i64 ^ 0.5 +i < int(0.5) +i < int(i64) +i < len(array) +i < len(list) +i < min(i64) +i < score(1) +i < score(i) +i <= -f32 +i <= -i +i <= -i64 +i <= 0.5 ** 0.5 +i <= 0.5 ** f32 +i <= 0.5 == nil +i <= 0.5 ? score : array +i <= 1 != all(array, true) +i <= 1 != nil +i <= 1 % i +i <= 1 + 1 +i <= 1 - f64 +i <= 1 ? ok : 1 +i <= abs(1) +i <= abs(i32) +i <= add(1, 1) +i <= f32 +i <= f32 != nil +i <= f32 * 0.5 +i <= f32 / f32 +i <= f32 ? ok : 1 +i <= f32 or ok +i <= f64 +i <= f64 * 1 +i <= f64 == nil +i <= f64 ? foo : div +i <= f64 or add == greet +i <= float(f64) +i <= float(i) +i <= float(i32) +i <= half(-1) +i <= half(0.5) +i <= i +i <= i ** 1 +i <= i == true +i <= i32 +i <= i32 - f32 +i <= i32 - i64 +i <= i64 +i <= i64 % i32 +i <= i64 / 1 +i <= i64 ? ok : 1 +i <= int(1) +i <= int(i32) +i <= len("bar") +i <= len(array) +i <= max(i) +i <= min(f32) +i <= min(f64) +i <= min(i) +i <= min(i64) +i == -0.5 +i == -1 +i == -f32 +i == -f64 +i == -i +i == -i32 +i == -i64 +i == 0.5 + f32 +i == 0.5 - i32 +i == 0.5 == ok +i == 0.5 ? false : true +i == 0.5 ? list : i32 +i == 0.5 ^ 0.5 +i == 1 != true +i == 1 % i +i == 1 * f32 +i == 1 ** 1 +i == 1 ? foo : list +i == 1 || ok +i == abs(0.5) +i == abs(1) +i == div(1, i) +i == f32 +i == f32 * i64 +i == f64 +i == f64 != nil +i == f64 + i64 +i == f64 == ok +i == i +i == i - f64 +i == i / i32 +i == i ? ok : score +i == i ^ i +i == i32 +i == i32 ** f32 +i == i32 ** i +i == i32 ? list : foo +i == i64 +i == i64 != ok +i == i64 + i32 +i == i64 ? array : 0.5 +i == i64 ? score : 1 +i == i64 ^ f64 +i == int(f64) +i == len(array) +i == max(0.5) +i == max(i64) +i == min(i) +i == nil ? false : 1 +i == score(1) +i > -i64 +i > 0.5 * f64 +i > 0.5 ** 0.5 +i > 0.5 / 0.5 +i > 0.5 / 1 +i > 0.5 == nil +i > 0.5 ^ 0.5 +i > 1 ? greet : "bar" +i > 1 ? greet : f64 +i > abs(i64) +i > array[i] +i > f32 +i > f64 +i > f64 + 0.5 +i > float(1) +i > half(f64) +i > i +i > i ** i32 +i > i ** i64 +i > i / i +i > i or ok +i > i32 +i > i32 ? 1 : true +i > i32 ? foo : score +i > i32 ^ i +i > i64 +i > int(0.5) +i > int(i) +i > int(i32) +i > max(f32) +i > max(i) +i > min(0.5) +i > score(i) +i > score(len(array)) +i >= -0.5 +i >= -1 +i >= -i32 +i >= -i64 +i >= 0.5 ** f64 +i >= 0.5 + i32 +i >= 0.5 - 1 +i >= 0.5 == nil +i >= 0.5 ? div : i +i >= 0.5 ? score : f64 +i >= 1 / i +i >= 1 ? nil : 0.5 +i >= abs(0.5) +i >= abs(i64) +i >= f32 +i >= f32 ** f64 +i >= f32 - i +i >= f32 ? "bar" : array +i >= f32 ? score : half +i >= f64 +i >= f64 * i32 +i >= f64 + i32 +i >= f64 - i +i >= i +i >= i ** 0.5 +i >= i / 1 +i >= i / i +i >= i == nil +i >= i == ok +i >= i32 +i >= i32 ** 0.5 +i >= i32 - f64 +i >= i32 ? f64 : div +i >= i64 +i >= i64 * i +i >= i64 ^ 0.5 +i >= int(i32) +i >= len("foo") +i >= min(f32 ^ i64) +i >= score(i) +i ^ (0.5 * 1) +i ^ (0.5 - 0.5) +i ^ (f32 * 1) +i ^ (f32 * f32) +i ^ (f32 * f64) +i ^ (f32 / f64) +i ^ (i * 1) +i ^ (i - i64) +i ^ (i32 % 1) +i ^ (i32 + i) +i ^ (i32 / 0.5) +i ^ (i64 / 0.5) +i ^ (i64 / 1) +i ^ --f32 +i ^ -1 +i ^ -i +i ^ -i32 +i ^ -i64 +i ^ 0.5 != 1 + i +i ^ 0.5 * f32 +i ^ 0.5 - i +i ^ 0.5 / f64 +i ^ 0.5 <= f32 +i ^ 0.5 > i64 +i ^ 0.5 ^ f32 +i ^ 1 != f32 +i ^ 1 * f32 +i ^ 1 ** i +i ^ 1 - f32 +i ^ 1 / i32 +i ^ 1 ^ i64 +i ^ abs(1) +i ^ abs(f32) +i ^ abs(i64) +i ^ add(1, 1) +i ^ array[i] +i ^ f32 +i ^ f32 != 1 - i +i ^ f32 != i64 ? list : i32 +i ^ f32 + f64 +i ^ f32 / i +i ^ f32 < i +i ^ f32 >= i32 +i ^ f64 +i ^ f64 * i +i ^ f64 >= f64 +i ^ find(array, true) +i ^ float(f64) +i ^ i +i ^ i ** f64 +i ^ i + i32 +i ^ i >= f64 +i ^ i32 +i ^ i32 - f32 +i ^ i32 == i64 * i +i ^ i32 >= f64 +i ^ i32 >= max(i64) +i ^ i64 +i ^ i64 * i64 +i ^ i64 ** i +i ^ i64 == f32 +i ^ i64 >= i64 ^ f32 +i ^ i64 ^ f64 +i ^ int(f32) +i ^ max(1) +i ^ min(i32) +i ^ score(1) +i in array +i in array == ok +i in array ? f32 : greet +i in array ? foo : false +i in array || ok +i not in array +i not in array ? foo : list +i not in array and true +i not in i64 .. 1 +i not in map(array, #) +i not in {"foo": 1}.div +i32 +i32 != -0.5 +i32 != -1 +i32 != -f32 +i32 != -i +i32 != 0.5 && nil == i64 +i32 != 1 && ok +i32 != 1 * i64 +i32 != 1 + 1 +i32 != 1 / 1 +i32 != 1 ? 0.5 : greet +i32 != 1 ? false : i64 +i32 != 1 ? greet : half +i32 != 1 ? greet : ok +i32 != abs(i64) +i32 != array[i] +i32 != count(array, ok) +i32 != f32 +i32 != f32 && ok +i32 != f32 / f64 +i32 != f32 ? f64 : i32 +i32 != f32 and ok +i32 != f64 +i32 != f64 == true +i32 != findIndex(list, false) +i32 != first(array) +i32 != float(i) +i32 != get(array, i64) +i32 != half(f64) +i32 != i +i32 != i ** 1 +i32 != i ** f64 +i32 != i32 +i32 != i32 * 1 +i32 != i32 - 0.5 +i32 != i32 ? array : add +i32 != i64 +i32 != i64 % i32 +i32 != i64 * 0.5 +i32 != i64 ? div : nil +i32 != i64 ? true : nil +i32 != int(f32) +i32 != max(1) +i32 != max(f64, 0.5) +i32 != min(1, 0.5, f64) +i32 != min(i) +i32 != nil ? half : 1 +i32 != nil ? list : half(nil) +i32 % -i +i32 % -i32 +i32 % 1 != i64 +i32 % 1 % (i64 + i64) +i32 % 1 % i64 +i32 % 1 * f64 +i32 % 1 + f64 +i32 % 1 > i +i32 % add(1, 1) +i32 % count(list, ok) +i32 % i +i32 % i != f32 +i32 % i32 +i32 % i32 != i +i32 % i32 * f32 +i32 % i32 * i +i32 % i64 +i32 % i64 != f32 +i32 % i64 / i32 +i32 % i64 == i +i32 % i64 >= i64 +i32 % min(1, i64) +i32 % min(i) +i32 * (f32 + 1) +i32 * (f32 + f32) +i32 * (f32 + i) +i32 * (f64 - f32) +i32 * (i32 - 0.5) +i32 * (i32 - f64) +i32 * (i32 - i64) +i32 * -f32 +i32 * -f64 +i32 * -i +i32 * 0.5 ** 0.5 +i32 * 0.5 + f64 +i32 * 0.5 <= f32 +i32 * 1 % i64 +i32 * 1 * f32 +i32 * 1 * i32 +i32 * 1 < i +i32 * array[i32] +i32 * count(array, true) +i32 * f32 +i32 * f32 != i +i32 * f64 +i32 * f64 * i +i32 * f64 + f32 +i32 * f64 / i +i32 * f64 > i32 +i32 * i +i32 * i != i32 +i32 * i * 0.5 +i32 * i .. i +i32 * i / array[i32] +i32 * i / i32 +i32 * i / i64 +i32 * i32 +i32 * i32 % i32 +i32 * i32 * 0.5 +i32 * i32 ** 1 +i32 * i32 - f32 +i32 * i32 == i32 +i32 * i64 +i32 * i64 % 1 +i32 * i64 .. i +i32 * i64 / 1 +i32 * i64 / i32 +i32 * int(f32) +i32 * max(f64) +i32 * max(i64) +i32 * min(1) +i32 ** (0.5 * 0.5) +i32 ** (0.5 + 0.5) +i32 ** (0.5 + i32) +i32 ** (0.5 / f64) +i32 ** (f32 / i) +i32 ** (f64 + 0.5) +i32 ** (i + 1) +i32 ** (i64 - i) +i32 ** -1 ^ i32 +i32 ** -f32 +i32 ** -i32 +i32 ** -i64 +i32 ** 0.5 / f32 +i32 ** 0.5 <= i32 +i32 ** 0.5 ^ i +i32 ** 1 ** i64 +i32 ** 1 + f64 +i32 ** 1 + i64 +i32 ** 1 - f32 +i32 ** 1 >= i64 * 0.5 +i32 ** 1 ^ f64 +i32 ** array[i] +i32 ** f32 +i32 ** f32 ** i +i32 ** f32 == i64 +i32 ** f64 +i32 ** f64 != i64 ? i : half +i32 ** f64 + f64 +i32 ** f64 >= i +i32 ** f64 ^ f32 +i32 ** float(1) +i32 ** float(f64) +i32 ** half(0.5) +i32 ** i +i32 ** i ** 0.5 +i32 ** i ^ 0.5 +i32 ** i32 +i32 ** i64 +i32 ** i64 != 0.5 == true +i32 ** i64 - f64 +i32 ** i64 / f64 +i32 ** i64 / i +i32 ** i64 > i +i32 ** i64 ^ 1 +i32 ** i64 ^ i +i32 ** int(0.5) +i32 ** int(f64) +i32 ** len(array) +i32 ** min(f64) +i32 ** min(i32) +i32 ** score(1) +i32 ** score(i) +i32 + -0.5 +i32 + -1 +i32 + -f32 +i32 + -f64 +i32 + -i +i32 + -i32 +i32 + 0.5 * 0.5 +i32 + 0.5 * i32 +i32 + 0.5 + 1 +i32 + 0.5 + i64 +i32 + 0.5 - 0.5 +i32 + 0.5 - f32 +i32 + 0.5 <= i +i32 + 0.5 > i % 1 +i32 + 0.5 >= i +i32 + 1 / f64 +i32 + 1 < i32 +i32 + 1 ^ i +i32 + 1 ^ i32 +i32 + abs(i32) +i32 + count(array, false) +i32 + f32 +i32 + f64 +i32 + f64 * 1 +i32 + f64 * f64 +i32 + f64 ** 0.5 +i32 + f64 - f32 * 0.5 +i32 + f64 == i32 +i32 + f64 >= i +i32 + f64 ^ i32 +i32 + find(array, ok) +i32 + i +i32 + i * 1 +i32 + i - f32 +i32 + i > half(f64) +i32 + i >= -1 +i32 + i32 +i32 + i32 ** 0.5 +i32 + i32 >= f32 +i32 + i32 ^ i64 +i32 + i64 +i32 + i64 + i64 +i32 + i64 / f64 +i32 + i64 <= f32 +i32 + i64 ^ f32 +i32 + i64 not in array +i32 + int(f64) +i32 + last(array) +i32 + len("foo") +i32 + len(list) +i32 + min(0.5, i32) +i32 + min(1, i) +i32 + min(i) +i32 + min(i, i32) +i32 + score(i) +i32 - -0.5 +i32 - -1 +i32 - -f32 +i32 - -i32 +i32 - -i64 +i32 - 0.5 * 0.5 +i32 - 0.5 * i64 +i32 - 0.5 + i +i32 - 0.5 + i32 +i32 - 0.5 - f32 +i32 - 0.5 < i32 +i32 - 0.5 <= f64 +i32 - 1 != f32 +i32 - 1 * f32 +i32 - 1 ** i32 +i32 - 1 / 0.5 +i32 - 1 <= i64 +i32 - 1 not in array +i32 - array[1] +i32 - f32 +i32 - f32 * f32 +i32 - f32 ** f64 +i32 - f32 + 0.5 +i32 - f32 / f64 +i32 - f64 +i32 - f64 ** f64 +i32 - f64 + 0.5 +i32 - f64 - i64 +i32 - f64 / i64 +i32 - f64 < i64 +i32 - first(array) +i32 - float(i) +i32 - get(array, i64) +i32 - i +i32 - i % i +i32 - i + f32 +i32 - i - 1 +i32 - i / i +i32 - i <= i64 +i32 - i == i +i32 - i > f64 +i32 - i >= f64 +i32 - i32 +i32 - i32 ** 0.5 +i32 - i32 <= i32 + i64 +i32 - i32 ^ 1 +i32 - i64 +i32 - i64 % i +i32 - i64 % i64 +i32 - i64 .. i +i32 - i64 <= i +i32 - i64 ^ 0.5 +i32 - i64 ^ f64 +i32 - int(1) +i32 - int(f64) +i32 - max(i64) +i32 - max(i64, i) +i32 - min(0.5) +i32 - score(i) +i32 .. -1 +i32 .. -i +i32 .. -i32 +i32 .. -i64 +i32 .. 1 - 1 +i32 .. abs(i) +i32 .. array[i32] +i32 .. count(array, ok) +i32 .. i +i32 .. i - 1 +i32 .. i32 +i32 .. i32 != list +i32 .. i64 +i32 .. i64 - i32 +i32 .. int(0.5) +i32 .. len(list) +i32 .. min(1) +i32 .. min(1, 0.5) +i32 .. min(i32) +i32 .. min(i64) +i32 .. score(i) +i32 / (0.5 + i32) +i32 / (1 + f32) +i32 / (1 - f32) +i32 / (1 - i) +i32 / (f32 + i) +i32 / (f32 - f64) +i32 / (f64 + 0.5) +i32 / (f64 - 1) +i32 / (i32 - 1) +i32 / -0.5 +i32 / -1 +i32 / -f32 +i32 / -i +i32 / -i32 +i32 / 0.5 * i +i32 / 0.5 / i64 +i32 / 0.5 >= f64 +i32 / 1 != f64 +i32 / 1 < i32 +i32 / abs(0.5) +i32 / f32 +i32 / f64 +i32 / f64 * i32 +i32 / f64 >= f32 +i32 / half(f64) +i32 / i +i32 / i <= i +i32 / i32 +i32 / i32 * 1 +i32 / i32 / f32 / f64 +i32 / i32 / i64 +i32 / i64 +i32 / i64 != i64 +i32 / i64 * i +i32 / i64 / i +i32 / i64 == f32 +i32 / i64 == f64 +i32 / int(i) +i32 / len("bar") +i32 / len("foo") +i32 / max(i32) +i32 / min(f32) +i32 / min(f64) +i32 / min(i) +i32 / min(i32) +i32 < -(i - f32) +i32 < -0.5 +i32 < -f32 +i32 < -i32 +i32 < 0.5 ** i32 +i32 < 0.5 - f32 +i32 < 0.5 ^ 1 +i32 < 1 % 1 +i32 < 1 ** 1 +i32 < 1 + 0.5 +i32 < 1 + 1 +i32 < 1 ? "foo" : i32 +i32 < 1 ? 1 : 0.5 +i32 < 1 ^ i32 +i32 < abs(i64) +i32 < div(1, 1) +i32 < f32 +i32 < f32 == nil +i32 < f32 ? div : true +i32 < f32 || i64 != f32 +i32 < f64 +i32 < f64 != nil +i32 < f64 != true +i32 < f64 * f32 +i32 < f64 == nil +i32 < f64 ? f32 : half +i32 < f64 ? greet : false +i32 < f64 ? list : i32 +i32 < f64 ^ f32 +i32 < f64 || 1 < 1 +i32 < float(i) +i32 < float(i32) +i32 < half(0.5) +i32 < i +i32 < i != true +i32 < i ^ 0.5 +i32 < i32 +i32 < i32 != ok +i32 < i32 * f32 +i32 < i32 / i32 +i32 < i32 ? ok : 1 +i32 < i64 +i32 < i64 - 0.5 +i32 < i64 ^ f64 +i32 < int(0.5) +i32 < int(i32) +i32 < int(i64) +i32 < max(0.5) +i32 < max(1) +i32 < min(1, i32) +i32 < min(f64) +i32 < min(i) +i32 < min(i64) +i32 < score(1) +i32 <= -0.5 +i32 <= -f32 +i32 <= -i +i32 <= -i32 +i32 <= 0.5 != nil +i32 <= 0.5 != ok +i32 <= 0.5 * 0.5 +i32 <= 0.5 * i +i32 <= 0.5 + i64 +i32 <= 1 ? i : f32 +i32 <= 1 ? true : true +i32 <= 1 or 0.5 == 0.5 +i32 <= abs(i32) +i32 <= count(list, ok) +i32 <= f32 +i32 <= f32 * i64 +i32 <= f32 / 0.5 +i32 <= f32 ^ i64 +i32 <= f64 +i32 <= f64 * i +i32 <= f64 ^ 1 +i32 <= float(i) +i32 <= half(0.5) +i32 <= i +i32 <= i % i64 +i32 <= i32 +i32 <= i32 != nil +i32 <= i32 % 1 +i32 <= i32 ** f64 +i32 <= i64 +i32 <= i64 != false +i32 <= i64 != ok +i32 <= i64 + f32 +i32 <= i64 ? div : nil +i32 <= last(array) +i32 <= len(array) +i32 <= len(list) +i32 <= max(f64) +i32 <= min(i) +i32 <= score(1) +i32 <= score(i) +i32 == -0.5 +i32 == -1 +i32 == -f64 +i32 == -i +i32 == -i64 +i32 == 0.5 / f64 +i32 == 0.5 ? half : array +i32 == 0.5 ^ i +i32 == 0.5 ^ i64 +i32 == 1 ** 1 +i32 == 1 ** i +i32 == 1 || f32 < f64 +i32 == f32 +i32 == f32 ? f32 : nil +i32 == f32 ? half : "bar" +i32 == f32 ? score : false +i32 == f32 or ok +i32 == f64 +i32 == f64 != ok +i32 == f64 * 0.5 +i32 == f64 ** f32 +i32 == f64 ** i64 +i32 == f64 ? add : half +i32 == findLastIndex(array, ok) +i32 == float(i) +i32 == half(0.5) +i32 == i +i32 == i % i64 +i32 == i ? "foo" : greet +i32 == i ? type(false) : array +i32 == i ^ f64 +i32 == i and ok +i32 == i || ok +i32 == i32 +i32 == i32 ? add : add +i32 == i32 ? f32 : f64 +i32 == i32 ^ 1 +i32 == i64 +i32 == i64 + f32 +i32 == i64 ? foo : list +i32 == len(list) +i32 == max(0.5) +i32 == min(f32) +i32 == min(i32) +i32 == nil ? f32 : add +i32 == nil and ok +i32 == {"foo": f32, "foo": list}?.String?.Qux +i32 > -0.5 +i32 > -1 +i32 > -f32 +i32 > -f64 +i32 > -i +i32 > -i32 +i32 > -i64 +i32 > 0.5 != ok +i32 > 0.5 != true +i32 > 0.5 * f64 +i32 > 0.5 ** f32 +i32 > 0.5 ** i +i32 > 0.5 + 0.5 +i32 > 0.5 + 1 +i32 > 0.5 - 1 +i32 > 0.5 / i64 +i32 > 0.5 == nil +i32 > 0.5 ? greet : f32 +i32 > 0.5 ? ok : false +i32 > 0.5 ^ f32 +i32 > 1 ** f64 +i32 > 1 - i +i32 > 1 / 1 +i32 > 1 ? i : add +i32 > 1 || ok +i32 > abs(1) +i32 > abs(f64) +i32 > array[1] +i32 > array[i32] +i32 > f32 +i32 > f32 != ok +i32 > f32 && "bar" == nil +i32 > f32 * i64 +i32 > f32 ? "bar" : half +i32 > f64 +i32 > f64 * 0.5 +i32 > f64 - 1 +i32 > f64 / 1 +i32 > f64 / i32 +i32 > f64 == nil +i32 > f64 == ok +i32 > f64 == true +i32 > f64 ? 0.5 : add +i32 > f64 ^ i64 +i32 > float(i) +i32 > float(i32) +i32 > half(0.5) +i32 > half(f64) +i32 > i +i32 > i + f32 +i32 > i / f32 +i32 > i ^ i32 +i32 > i32 +i32 > i32 - 0.5 +i32 > i32 ? "bar" : div +i32 > i32 ? array : 0.5 +i32 > i32 ? foo : 1 +i32 > i64 +i32 > i64 ** f32 +i32 > i64 + f64 +i32 > i64 - i +i32 > i64 ? list : list +i32 > int(i) +i32 > int(i64) +i32 > max(i) +i32 > min(0.5) +i32 > score(1) +i32 >= -0.5 +i32 >= -1 +i32 >= -i +i32 >= 0.5 ** 0.5 +i32 >= 0.5 ^ f32 +i32 >= 0.5 || ok +i32 >= 1 && ok +i32 >= abs(i) +i32 >= abs(i64) +i32 >= array[i] +i32 >= f32 +i32 >= f32 != true +i32 >= f32 - 0.5 +i32 >= f32 ^ 0.5 +i32 >= f64 +i32 >= f64 && nil == 0.5 +i32 >= f64 - f64 +i32 >= f64 / 1 +i32 >= f64 ? f32 : list +i32 >= f64 ^ 1 +i32 >= float(1) +i32 >= half(0.5) +i32 >= half(f64) +i32 >= i +i32 >= i % i64 +i32 >= i ** i32 +i32 >= i / i +i32 >= i ? div : list +i32 >= i ? foo : 0.5 +i32 >= i32 +i32 >= i64 +i32 >= i64 != ok +i32 >= i64 ** i64 +i32 >= i64 / i64 +i32 >= i64 ? list : greet +i32 >= i64 ^ i32 +i32 >= int(i64) +i32 >= last(array) +i32 >= len(array) +i32 >= min(i32) +i32 >= score(1) +i32 >= score(i) +i32 ^ (f32 + i64) +i32 ^ (f64 + 0.5) +i32 ^ (i - f64) +i32 ^ (i32 + f32) +i32 ^ (i64 % i) +i32 ^ (i64 * 0.5) +i32 ^ (i64 + f32) +i32 ^ (i64 - f64) +i32 ^ --0.5 +i32 ^ -0.5 +i32 ^ -f64 +i32 ^ -i32 +i32 ^ 0.5 ** i +i32 ^ 0.5 + i32 +i32 ^ 0.5 - i +i32 ^ 0.5 < i +i32 ^ 0.5 == i64 +i32 ^ abs(1) +i32 ^ f32 +i32 ^ f32 * i64 +i32 ^ f32 ** 0.5 +i32 ^ f32 ** i +i32 ^ f32 < 0.5 * i +i32 ^ f32 ^ i +i32 ^ f64 +i32 ^ f64 ^ 1 +i32 ^ float(f32) +i32 ^ half(0.5) +i32 ^ half(f64) +i32 ^ i +i32 ^ i + i32 +i32 ^ i - f32 +i32 ^ i <= f32 +i32 ^ i ^ 1 +i32 ^ i32 +i32 ^ i32 ** f32 +i32 ^ i32 ** f64 +i32 ^ i32 + i32 +i32 ^ i32 + i64 +i32 ^ i32 <= i64 +i32 ^ i64 +i32 ^ i64 - f32 +i32 ^ max(0.5) +i32 ^ max(1) +i32 ^ max(i) +i32 ^ min(f32) +i32 ^ score(1) +i32 in array +i32 in map(array, #) +i32 not in array +i32 not in array ? score : score +i32 not in map(array, #) +i32 not in map(array, 1) +i64 +i64 != -0.5 +i64 != -1 +i64 != -f32 +i64 != -f64 +i64 != -i +i64 != 0.5 != nil +i64 != 0.5 != ok +i64 != 0.5 != true +i64 != 0.5 * 1 +i64 != 0.5 ? false : i64 +i64 != 0.5 ^ 1 +i64 != 0.5 and f64 == 1 +i64 != 1 || f64 < i +i64 != 1 || ok +i64 != abs(f64) +i64 != f32 +i64 != f32 + f32 +i64 != f32 / f32 +i64 != f32 ? div : 1 +i64 != f32 ? f64 : i64 +i64 != f32 ^ i +i64 != f64 +i64 != f64 != false +i64 != f64 - i32 +i64 != f64 / i32 +i64 != f64 / i64 +i64 != f64 ? 0.5 : score +i64 != f64 ? i64 : true +i64 != findLast(array, false) +i64 != first(array) +i64 != float(i32) +i64 != get(array, i64) +i64 != half(0.5) +i64 != half(f64) +i64 != i +i64 != i == nil +i64 != i ? array : f32 +i64 != i and ok +i64 != i32 +i64 != i32 ? 1 : f32 +i64 != i64 +i64 != i64 ? true : score +i64 != last(array) +i64 != len("foo") +i64 != min(0.5) +i64 != min(f32) +i64 != min(f64) +i64 != min(i64) +i64 != nil && ok +i64 != score(1) +i64 % -1 +i64 % -i +i64 % -i32 +i64 % 1 * i32 +i64 % 1 .. i +i64 % 1 / 0.5 +i64 % 1 / f64 +i64 % 1 < i32 +i64 % 1 <= -i32 +i64 % 1 == 0.5 + 0.5 +i64 % 1 not in array +i64 % abs(i64) +i64 % array[1] +i64 % find(array, true) +i64 % first(array) +i64 % i +i64 % i .. i32 +i64 % i not in array +i64 % i32 +i64 % i32 != f64 +i64 % i32 * f32 +i64 % i32 == i +i64 % i32 > f64 ^ i32 +i64 % i64 +i64 % i64 * 1 +i64 % i64 * f32 +i64 % i64 + -i64 +i64 % max(i32) +i64 % min(i) +i64 % score(1) +i64 * (0.5 + i64) +i64 * (0.5 - 1) +i64 * (1 + 1) +i64 * (f64 + f32) +i64 * (f64 - i) +i64 * (i - 1) +i64 * (i64 + 0.5) +i64 * --f64 +i64 * -0.5 +i64 * -1 +i64 * -f32 +i64 * -f64 +i64 * 0.5 != f64 +i64 * 0.5 * i32 +i64 * 0.5 - f32 +i64 * 0.5 < f32 +i64 * 0.5 == min(i64) +i64 * 0.5 >= f32 +i64 * 0.5 ^ i +i64 * 1 * 1 +i64 * 1 .. i32 +i64 * 1 <= i64 +i64 * 1 == i32 +i64 * 1 >= i32 +i64 * array[i32] +i64 * f32 +i64 * f32 - f32 +i64 * f32 / f64 +i64 * f32 >= i64 +i64 * f32 ^ i +i64 * f32 ^ i32 +i64 * f64 +i64 * f64 * i32 +i64 * f64 ^ f64 +i64 * float(i64) +i64 * get(array, i64) +i64 * half(f64) +i64 * i +i64 * i * i64 +i64 * i == i32 +i64 * i ^ i64 +i64 * i32 +i64 * i32 ** f32 +i64 * i32 >= f64 +i64 * i32 >= i64 +i64 * i32 ^ 1 +i64 * i64 +i64 * i64 ** 1 +i64 * i64 ** f32 +i64 * i64 - f64 +i64 * i64 in array +i64 * int(1) +i64 * min(f32, 0.5) +i64 * score(1) +i64 ** (0.5 * i64) +i64 ** (0.5 + 1) +i64 ** (1 % i) +i64 ** (f64 / i) +i64 ** (i * 0.5) +i64 ** (i - i) +i64 ** (i32 + i) +i64 ** -1 +i64 ** -i +i64 ** -i32 +i64 ** 0.5 * f64 +i64 ** 0.5 + f32 +i64 ** 0.5 + f32 - 1 +i64 ** 0.5 - i +i64 ** 0.5 ^ 1 +i64 ** 0.5 ^ f32 +i64 ** 1 != i +i64 ** 1 ** f32 +i64 ** 1 ** float(1) +i64 ** 1 / f64 +i64 ** 1 / i +i64 ** 1 == i64 +i64 ** 1 ^ i64 +i64 ** abs(f32) +i64 ** abs(i64) +i64 ** f32 +i64 ** f32 != f64 +i64 ** f32 != i64 +i64 ** f32 ** i32 +i64 ** f32 / i64 / 1 +i64 ** f32 <= i64 +i64 ** f32 > f32 +i64 ** f64 +i64 ** f64 / i +i64 ** f64 <= f32 +i64 ** f64 > f64 +i64 ** f64 >= f64 +i64 ** f64 >= i32 +i64 ** float(1) +i64 ** half(0.5) +i64 ** i +i64 ** i32 +i64 ** i32 != f32 +i64 ** i32 <= f64 +i64 ** i32 <= min(0.5) +i64 ** i64 +i64 ** i64 / f64 +i64 ** i64 >= f64 +i64 ** int(0.5) +i64 ** int(f64) +i64 ** len("foo") +i64 ** min(0.5) +i64 ** score(1) +i64 + -(f32 / i) +i64 + -0.5 +i64 + -f32 +i64 + -f64 +i64 + -i +i64 + -i64 +i64 + 0.5 * i +i64 + 0.5 ** 1 +i64 + 0.5 + 1 +i64 + 0.5 + i32 +i64 + 1 % i +i64 + 1 ** i +i64 + 1 + i32 +i64 + 1 - f64 +i64 + 1 - i32 +i64 + 1 .. i +i64 + 1 < i32 +i64 + 1 < i64 +i64 + 1 <= i +i64 + 1 == i +i64 + abs(1) +i64 + f32 +i64 + f32 ** 1 +i64 + f32 >= f64 +i64 + f64 +i64 + f64 != f32 +i64 + f64 + i +i64 + f64 <= f32 +i64 + f64 == i32 +i64 + findIndex(list, ok) +i64 + first(array) +i64 + get(array, i32) +i64 + half(0.5) +i64 + half(f64) +i64 + i +i64 + i + i +i64 + i - f64 +i64 + i / 1 +i64 + i32 +i64 + i32 * 1 +i64 + i32 * i +i64 + i32 < f64 +i64 + i32 >= f32 +i64 + i32 in array +i64 + i64 +i64 + i64 % i64 +i64 + i64 ** f32 +i64 + i64 + 0.5 +i64 + i64 - int(f64) +i64 + i64 ^ i +i64 + max(f32) +i64 + min(0.5) +i64 + min(1) +i64 + min(f32) +i64 + min(i32) +i64 + score(i) +i64 - -1 +i64 - -f32 +i64 - -i32 +i64 - -i64 +i64 - 0.5 != i32 +i64 - 0.5 * 1 +i64 - 0.5 + f32 +i64 - 0.5 + f64 +i64 - 0.5 / f64 +i64 - 0.5 == -0.5 +i64 - 0.5 ^ i32 +i64 - 1 - 0.5 +i64 - 1 - f32 +i64 - 1 - i32 +i64 - 1 == i32 +i64 - 1 >= f64 +i64 - 1 >= i +i64 - abs(1) +i64 - abs(i32) +i64 - array[i64] +i64 - f32 +i64 - f32 != score(i) +i64 - f32 * i32 +i64 - f32 - 1 +i64 - f32 <= f64 +i64 - f32 ^ f32 +i64 - f64 +i64 - f64 ** 0.5 +i64 - float(0.5) +i64 - float(f32) +i64 - float(i) +i64 - i +i64 - i != i32 +i64 - i * i64 +i64 - i + i32 +i64 - i - i64 +i64 - i > f64 - 0.5 +i64 - i >= i +i64 - i ^ i64 +i64 - i32 +i64 - i32 % i32 +i64 - i32 + i32 +i64 - i32 <= i +i64 - i64 +i64 - i64 + i32 +i64 - i64 .. i64 +i64 - i64 / i32 +i64 - max(f64) +i64 - min(1, 0.5) +i64 - score(1) +i64 .. -1 +i64 .. -i64 +i64 .. 1 == list +i64 .. findIndex(list, ok) +i64 .. get(array, 1) +i64 .. i +i64 .. i32 +i64 .. i32 * i +i64 .. i64 +i64 .. i64 + 1 +i64 .. int(f32) +i64 .. int(i32) +i64 .. last(array) +i64 .. len(list) +i64 .. score(1) +i64 / (0.5 + f64) +i64 / (1 - 0.5) +i64 / (i32 - 1) +i64 / -0.5 +i64 / -1 +i64 / -f32 +i64 / -f64 +i64 / -i +i64 / -i64 +i64 / 0.5 < f64 +i64 / 0.5 == f32 +i64 / 0.5 ^ f64 +i64 / 1 ** 1 +i64 / 1 - f32 +i64 / 1 - min(0.5) +i64 / 1 / 0.5 +i64 / abs(i64) +i64 / array[i] +i64 / f32 +i64 / f32 ** i +i64 / f32 <= i +i64 / f64 +i64 / f64 * 1 +i64 / f64 ** 0.5 +i64 / f64 ** f64 +i64 / f64 + i32 +i64 / f64 <= f32 +i64 / f64 <= i64 +i64 / float(f32) +i64 / float(f64) +i64 / float(i) +i64 / float(i64) +i64 / half(0.5) +i64 / half(f64) +i64 / i +i64 / i != i64 +i64 / i * 0.5 +i64 / i * f32 +i64 / i - i32 +i64 / i ^ i64 +i64 / i32 +i64 / i32 * i +i64 / i64 +i64 / i64 ** f32 +i64 / i64 - f64 +i64 / i64 / i64 +i64 / i64 < f32 +i64 / int(0.5) +i64 / min(f32) +i64 / score(1) +i64 < -1 +i64 < -i32 +i64 < -i64 +i64 < 1 != true +i64 < 1 * f64 +i64 < 1 + i64 +i64 < 1 / i32 +i64 < 1 ? half : ok +i64 < 1 ^ f64 +i64 < abs(f32) +i64 < array[1] +i64 < f32 +i64 < f32 * i32 +i64 < f32 ? "bar" : ok +i64 < f32 ^ 0.5 +i64 < f64 +i64 < f64 + f64 +i64 < f64 - f32 +i64 < f64 - i +i64 < f64 ? i64 : score +i64 < f64 or ok +i64 < float(f64) +i64 < half(0.5) +i64 < i +i64 < i != false +i64 < i32 +i64 < i32 * 1 +i64 < i32 + i64 +i64 < i32 - 0.5 +i64 < i32 - f32 +i64 < i32 ? greet : 1 +i64 < i32 ? nil : array +i64 < i32 ? true : "bar" +i64 < i64 +i64 < i64 + 1 +i64 < i64 ? f32 : foo +i64 < i64 ? half : i +i64 < int(i64) +i64 < max(0.5) +i64 < min(0.5) +i64 < min(i) +i64 < score(1) +i64 < score(1) * i64 +i64 <= -1 +i64 <= -f32 +i64 <= -i +i64 <= -i32 +i64 <= -i64 +i64 <= 0.5 != true +i64 <= 0.5 + i +i64 <= 0.5 - 1 +i64 <= 0.5 == nil +i64 <= 0.5 ? 0.5 : "foo" +i64 <= 1 != true +i64 <= 1 ** f64 +i64 <= 1 == ok +i64 <= 1 ? array : ok +i64 <= 1 and ok +i64 <= array[i32] +i64 <= f32 +i64 <= f32 && ok +i64 <= f32 + 1 +i64 <= f32 / f32 +i64 <= f32 ^ i32 +i64 <= f64 +i64 <= f64 + 1 +i64 <= f64 - f32 +i64 <= half(0.5) +i64 <= i +i64 <= i != true +i64 <= i * 1 +i64 <= i + 1 +i64 <= i / i64 +i64 <= i ? i32 : list +i64 <= i ^ 0.5 +i64 <= i32 +i64 <= i32 && ok +i64 <= i32 ? f64 : i < 1 +i64 <= i64 +i64 <= i64 - 0.5 +i64 <= i64 ? greet : div +i64 <= int(i64) +i64 <= last(array) +i64 <= min(0.5) +i64 <= min(f64) +i64 <= score(1) +i64 <= score(i) +i64 == -0.5 +i64 == -1 +i64 == -f64 +i64 == -i +i64 == 0.5 == ok +i64 == 0.5 ? 1 : list +i64 == 0.5 ? div : i64 +i64 == 0.5 ? foo : f32 +i64 == 0.5 ^ 0.5 +i64 == 0.5 ^ i +i64 == 1 % i64 +i64 == 1 && ok +i64 == 1 ** f64 +i64 == 1 + f32 +i64 == 1 - f64 +i64 == abs(0.5) +i64 == abs(i32) +i64 == count(array, true) +i64 == count(list, true) +i64 == f32 +i64 == f64 +i64 == f64 != ok +i64 == f64 != true +i64 == f64 - i +i64 == f64 ? f64 : add +i64 == findIndex(array, false) +i64 == i +i64 == i * f32 +i64 == i == false +i64 == i == ok +i64 == i ^ 1 +i64 == i32 +i64 == i32 ** 0.5 +i64 == i32 / f64 +i64 == i64 +i64 == i64 ^ 0.5 +i64 == int(1) +i64 == int(f32) +i64 == last(array) +i64 == max(0.5) +i64 == nil ? true : ok +i64 == score(1) +i64 == score(i) +i64 > -0.5 +i64 > -1 +i64 > -f32 +i64 > -f64 +i64 > -i +i64 > -i32 +i64 > -i64 +i64 > 0.5 * 1 +i64 > 0.5 ** 0.5 +i64 > 0.5 == true +i64 > 0.5 ? f64 : greet +i64 > 0.5 ? foo : add +i64 > 1 ** 0.5 +i64 > 1 - 0.5 +i64 > 1 ? false : array +i64 > 1 ? half : i64 +i64 > abs(1) +i64 > abs(f64) +i64 > array[i64] +i64 > f32 +i64 > f32 - 1 +i64 > f32 ? div : false +i64 > f64 +i64 > f64 == nil +i64 > f64 and 1 > i64 +i64 > first(array) +i64 > float(f32) +i64 > half(f64) +i64 > i +i64 > i % i32 +i64 > i * f64 +i64 > i ** 1 +i64 > i + i +i64 > i + i32 +i64 > i ^ i32 +i64 > i32 +i64 > i32 && ok +i64 > i32 ** 0.5 +i64 > i32 ** i +i64 > i64 +i64 > i64 % i32 +i64 > i64 - i64 +i64 > int(f32) +i64 > int(i32) +i64 > int(i64) +i64 > score(i) +i64 >= -0.5 +i64 >= -1 +i64 >= -f64 +i64 >= -i +i64 >= 0.5 * f64 +i64 >= 0.5 ** f32 +i64 >= 0.5 + f32 +i64 >= 0.5 == nil +i64 >= 0.5 == true +i64 >= 0.5 ? array : array +i64 >= 0.5 ? i32 : nil +i64 >= 0.5 ^ 0.5 +i64 >= 0.5 and f32 != nil +i64 >= 1 + f64 +i64 >= 1 + i32 +i64 >= 1 ? i : false +i64 >= 1 ? i : string(array) +i64 >= 1 ? true : i +i64 >= f32 +i64 >= f32 * f32 +i64 >= f32 ** f64 +i64 >= f32 ** i32 +i64 >= f32 / f64 +i64 >= f64 +i64 >= f64 + i +i64 >= f64 / i64 +i64 >= f64 == ok +i64 >= f64 and ok +i64 >= find(array, ok) +i64 >= float(f32) +i64 >= float(i) +i64 >= float(i32) +i64 >= half(0.5) +i64 >= i +i64 >= i and ok +i64 >= i32 +i64 >= i32 % i64 +i64 >= i64 +i64 >= i64 % i +i64 >= i64 && i64 > f32 +i64 >= i64 / i32 +i64 >= i64 == nil +i64 >= i64 in {"foo": f64}.half +i64 >= max(f64) +i64 >= max(i64) +i64 >= min(f32) +i64 >= score(1) +i64 ^ (0.5 + 1) +i64 ^ (0.5 / i32) +i64 ^ (1 * f32) +i64 ^ (1 / i) +i64 ^ (1 / i64) +i64 ^ (f32 + f32) +i64 ^ (f32 - f32) +i64 ^ (f64 * f32) +i64 ^ (i % i32) +i64 ^ (i - 0.5) +i64 ^ (i32 - f32) +i64 ^ (i64 + i32) +i64 ^ (i64 / f64) +i64 ^ -0.5 +i64 ^ -i32 +i64 ^ 0.5 ** f32 +i64 ^ 0.5 <= i +i64 ^ 0.5 >= f32 +i64 ^ 0.5 >= f64 +i64 ^ 0.5 >= i64 +i64 ^ 0.5 ^ 0.5 +i64 ^ 1 != i +i64 ^ 1 != i32 +i64 ^ 1 ** i32 +i64 ^ 1 + f32 +i64 ^ 1 < f32 +i64 ^ 1 <= i +i64 ^ abs(1) +i64 ^ abs(i) +i64 ^ array[i64] +i64 ^ f32 +i64 ^ f32 - f32 +i64 ^ f64 +i64 ^ f64 * i32 +i64 ^ f64 ** i +i64 ^ f64 + f32 +i64 ^ f64 < f32 +i64 ^ f64 == i64 +i64 ^ f64 > 1 + i64 +i64 ^ f64 ^ f32 +i64 ^ get(array, i) +i64 ^ half(f64) +i64 ^ i +i64 ^ i ** f32 +i64 ^ i ** i64 +i64 ^ i32 +i64 ^ i32 != f32 +i64 ^ i32 != i32 +i64 ^ i32 ** i +i64 ^ i32 + f32 +i64 ^ i32 + f64 +i64 ^ i32 / f32 +i64 ^ i64 +i64 ^ i64 * f64 +i64 ^ i64 * i64 +i64 ^ i64 ** f64 +i64 ^ i64 ^ f32 +i64 ^ i64 ^ f64 +i64 ^ i64 ^ i +i64 ^ int(i64) +i64 ^ last(array) +i64 ^ len(array) +i64 ^ max(0.5) +i64 ^ max(1) +i64 ^ max(f32) +i64 ^ score(1) +i64 ^ score(1, 1) +i64 ^ score(i) +i64 in array +i64 in array == nil +i64 in array ? false : greet +i64 in map(array, #) +i64 not in array +indexOf("bar", "bar") + i64 +indexOf(foo.Bar, string(i32)) +int(-(i * 0.5)) +int(-0.5) +int(-1) +int(-abs(f64)) +int(-f32) +int(-f64) +int(-i) +int(-i32) +int(-i32) != i +int(-i64) +int(0.5 * 0.5) +int(0.5 * 1) +int(0.5 * f32) +int(0.5 * i) +int(0.5 * i32) +int(0.5 * i64) +int(0.5 ** 0.5) +int(0.5 ** 1) +int(0.5 ** f32) +int(0.5 ** f64) +int(0.5 ** i64) +int(0.5 + f32) +int(0.5 + f64) +int(0.5 + i) +int(0.5 + i32) +int(0.5 - 0.5) +int(0.5 - f32) +int(0.5 - i32) +int(0.5 / 0.5) +int(0.5 / 1) +int(0.5 / f32) +int(0.5 / f64) +int(0.5 / i32) +int(0.5 / i64) +int(0.5 ^ 0.5) +int(0.5 ^ 1) +int(0.5 ^ f32) +int(0.5 ^ i) +int(0.5) ** i64 +int(0.5) ** int(i64) +int(0.5) + f32 +int(0.5) + f64 +int(0.5) + i64 +int(0.5) - i +int(0.5) - i64 +int(0.5) .. i32 +int(0.5) < int(f64) +int(0.5) == f32 +int(0.5) == i +int(0.5) > -1 +int(0.5) >= i - i64 +int(0.5) ^ i32 +int(0.5) ^ i64 +int(0.5) in array +int(0.5) not in array +int(1 % 1) +int(1 % i) +int(1 % i32) +int(1 * 0.5) +int(1 * f32) +int(1 * f64) +int(1 * i) +int(1 * i64) +int(1 ** 0.5) +int(1 ** 1) +int(1 ** f32) +int(1 ** i32) +int(1 ** i64) +int(1 + 0.5) +int(1 + 1) +int(1 + f64) +int(1 + i) +int(1 - 0.5) +int(1 - 1) +int(1 - i64) +int(1 / 1) +int(1 / f64) +int(1 / i32) +int(1 / i64) +int(1 ^ 0.5) +int(1 ^ 1) +int(1 ^ i32) +int(1 ^ i64) +int(1) * f64 +int(1) * i +int(1) ** f32 +int(1) ** i64 +int(1) + 0.5 + 1 +int(1) + i64 +int(1) - f64 +int(1) - i64 +int(1) .. i +int(1) / f32 +int(1) / i +int(1) < f64 +int(1) <= f32 +int(1) <= f64 +int(1) == i +int(1) == i64 +int(1) > f64 +int(1) > float(1) +int(1) > i32 +int(1) >= f32 +int(1) >= f64 +int(1) >= half(0.5) +int(1) ^ f32 +int(1) ^ f64 +int(1) ^ i +int(1) ^ i32 +int(1) in array +int(abs(0.5)) +int(abs(f32)) +int(abs(f64)) +int(abs(i)) +int(abs(i32)) +int(abs(i64)) +int(array[1]) +int(array[i32]) +int(array[i64]) +int(count(list, ok)) +int(div(1, i)) +int(f32 * f32) +int(f32 * i64) +int(f32 ** 0.5) +int(f32 ** f64) +int(f32 ** i32) +int(f32 + f32) +int(f32 + i64) +int(f32 - 0.5) +int(f32 - f32) +int(f32 - i) +int(f32 / f64) +int(f32 ^ 1) +int(f32 ^ f32) +int(f32 ^ i) +int(f32 ^ i64) +int(f32) +int(f32) != f32 +int(f32) % i +int(f32) * f64 +int(f32) .. i32 +int(f32) / f32 +int(f32) / i +int(f32) == 0.5 != nil +int(f32) == i +int(f32) > i +int(f32) >= i32 +int(f32) ^ i64 +int(f32) in array +int(f64 * 0.5) +int(f64 * 1) +int(f64 * f32) +int(f64 * f64) +int(f64 * i32) +int(f64 * i64) +int(f64 ** 0.5) +int(f64 ** 1) +int(f64 ** f32) +int(f64 ** i) +int(f64 ** i32) +int(f64 ** i64) +int(f64 + f32) +int(f64 + i64) +int(f64 - 0.5) +int(f64 - 1) +int(f64 - f64) +int(f64 / 1) +int(f64 / i) +int(f64 ^ 0.5) +int(f64 ^ 1) +int(f64 ^ f32) +int(f64) +int(f64) != i32 +int(f64) * i32 +int(f64) ** i64 +int(f64) - i +int(f64) < i32 +int(f64) <= i32 +int(f64) == float(i32) +int(f64) ^ i32 +int(f64) ^ i64 +int(f64) not in array +int(false ? add : 0.5) +int(false ? f32 : 0.5) +int(false ? f64 : i32) +int(find(array, true)) +int(findIndex(array, ok)) +int(findIndex(array, true)) +int(findIndex(list, # == foo)) +int(findIndex(list, ok)) +int(findLastIndex(array, ok)) +int(findLastIndex(array, true)) +int(findLastIndex(list, true)) +int(first(array)) +int(float(0.5)) +int(float(1)) +int(float(f32)) +int(float(f64) ** i64) +int(float(f64)) +int(float(i)) +int(float(i32)) +int(float(i64)) +int(get(array, 1)) +int(get(array, i64)) +int(half(0.5)) +int(half(1 / f32)) +int(half(f64)) +int(i % 1) +int(i % i64) +int(i * 0.5) +int(i * 1) +int(i * f32) +int(i * f64) +int(i ** 0.5) +int(i ** f32) +int(i ** f64) +int(i ** i64) +int(i + 0.5) +int(i + f32) +int(i + i32) +int(i + i64) +int(i - f64) +int(i - i64) +int(i / 1) <= i32 +int(i / f64) +int(i / i) +int(i ^ f32) +int(i ^ f64) +int(i ^ i) +int(i ^ i32) +int(i) +int(i) != i +int(i) + f32 +int(i) + i32 +int(i) - i32 +int(i) .. i64 +int(i) / i +int(i) < f32 +int(i) < f64 +int(i) <= f64 +int(i) == f32 +int(i) > i32 +int(i) > i64 +int(i) > int(i) +int(i) >= i +int(i) ^ i64 +int(i32 % i64) +int(i32 * 0.5) +int(i32 * 1) +int(i32 * f64) +int(i32 ** i) +int(i32 + 0.5) +int(i32 + 1) +int(i32 + f32) +int(i32 - 0.5) +int(i32 - 1) +int(i32 - f64) +int(i32 - i) +int(i32 - i64) +int(i32 / 0.5) +int(i32 / f64) +int(i32 ^ 0.5) +int(i32 ^ f32) +int(i32 ^ f64) +int(i32 ^ i) +int(i32 ^ i64) +int(i32) +int(i32) != f32 +int(i32) % i64 +int(i32) ** -0.5 +int(i32) + i +int(i32) - f32 +int(i32) .. i32 +int(i32) / i +int(i32) / i32 +int(i32) < i64 +int(i32) <= f32 +int(i32) == -i32 +int(i32) == f64 +int(i32) > f64 +int(i64 % i32) +int(i64 * f32) +int(i64 * f64) +int(i64 * i) +int(i64 ** i) +int(i64 + 1) +int(i64 + i) +int(i64 + i64) +int(i64 - f32) +int(i64 - f64) +int(i64 - i32) +int(i64 / f32) +int(i64 / f64) +int(i64 / i) +int(i64 / i64) +int(i64 ^ 0.5) +int(i64 ^ f64) +int(i64 ^ i32) +int(i64 ^ i64) +int(i64) +int(i64) != f64 +int(i64) != i +int(i64) != nil ? 1 : half +int(i64) % i +int(i64) % i32 +int(i64) ** f64 +int(i64) - i32 +int(i64) .. i32 +int(i64) <= i +int(i64) <= i64 +int(i64) == min(i) +int(i64) > f64 +int(i64) > i32 +int(i64) >= f64 +int(i64) ^ f32 +int(i64) ^ i32 +int(i64) in array +int(i64) not in array +int(int(0.5)) +int(int(1)) +int(int(f32)) +int(int(f64)) +int(int(i32)) +int(int(i64)) +int(last(array)) +int(len("bar")) +int(len(array)) +int(len(list)) +int(max(0.5)) +int(max(1)) +int(max(f64)) +int(max(i)) +int(max(i64)) +int(min(0.5)) +int(min(1)) +int(min(f32)) +int(min(f32, i32)) +int(min(f64)) +int(min(f64, 1)) +int(min(i)) +int(min(i32)) +int(min(i64)) +int(min(i64, 1)) +int(ok ? 0.5 : i64) +int(ok ? 1 : div) +int(ok ? i32 : add) +int(score(1)) +int(score(i)) +int(string(1)) +int(string(i)) +int(string(i32)) +int(string(i64)) +int(toJSON(1)) +int(toJSON(i)) +int(toJSON(i32)) +int(toJSON(i64)) +int(true ? f64 : 0.5) +int(true ? f64 : 1) +join(["bar"]) +join(map(array, "bar")) +join(map(array, "foo")) +join(map(list, "bar")) +keys({"bar": i64}) +keys({"foo": 0.5}) +keys({"foo": f32}) +keys({"foo": i}) +last(1 .. i32) +last([0.5]) +last([array]) +last([f64]) +last([half, i32]) +last(array) +last(array) != f32 +last(array) != i32 +last(array) % i32 +last(array) * i32 +last(array) + f32 +last(array) + i +last(array) - f32 +last(array) - i64 +last(array) - score(i) +last(array) .. max(i) +last(array) / f64 +last(array) > f64 +last(array) > max(1) +last(array) >= f32 +last(array) >= f64 +last(false ? 0.5 : greet) +last(false ? div : 1) +last(false ? f32 : 1) +last(false ? list : 1)?.add +last(false ? list : add) +last(filter(array, false)) +last(filter(array, ok)) +last(filter(list, true)) +last(i .. i32) +last(i32 .. i32) +last(i32 .. i64) +last(i64 .. i) +last(list) +last(list) == foo +last(list) not in list +last(list).Bar +last(list).Qux +last(list).String +last(list).String() +last(list)?.Bar +last(list)?.Qux +last(list)?.String +last(list)?.String() +last(map(array, "bar")) +last(map(array, #)) +last(map(array, array)) +last(map(array, i64)) +last(map(list, "bar")) +last(map(list, "foo")) +last(map(list, #)) +last(map(list, 0.5)) +last(map(list, add)) +last(map(list, f32)) +last(map(list, foo)) +last(map(list, i)) +last(map(list, i32)) +last(map(list, true)) +last(ok ? 0.5 : score) +last(ok ? array : false) +last(ok ? foo : add != half) +last(ok ? nil : list) +last(ok ? ok : i32) +last(true ? 1 : list)?.String +last(true ? foo : half) +last(true ? half : 1) +last(true ? i32 : ok) +last(true ? i64 : 1) +last(true ? ok : f64) +lastIndexOf("bar", "foo") < f32 ^ f64 +len("bar" + "foo") +len("bar") != f32 +len("bar") % score(i) +len("bar") * i32 +len("bar") ** f64 +len("bar") ** i32 +len("bar") <= i64 +len("bar") > i32 +len("bar") >= 0.5 ^ 0.5 +len("bar") >= f32 +len("bar") >= f64 +len("foo" + foo.Bar) +len("foo") * i32 +len("foo") * i64 +len("foo") - i +len("foo") .. i +len("foo") < f32 +len("foo") <= f32 +len("foo") <= f64 +len("foo") == i +len("foo") == i32 +len("foo") == i64 +len("foo") > f64 +len("foo") not in array +len([f64]) +len([false, add, half]) +len([false, foo, false]) +len([false]) +len(array) +len(array) != i +len(array) != i32 +len(array) * i +len(array) ** i +len(array) .. 1 - 1 +len(array) / f32 +len(array) < f32 +len(array) <= i +len(array) >= f32 +len(array) >= f64 +len(array) >= i64 +len(false ? 1 : list) +len(false ? nil : "foo") +len(foo.Bar) +len(foo.String()) +len(foo?.Bar) +len(foo?.String()) +len(greet("bar")) +len(greet("foo")) +len(i .. 1) +len(i32 .. 1) +len(i32 .. i) +len(i32 .. i32) +len(i32 .. i64) +len(i64 .. 1) +len(i64 .. i) +len(list) +len(list) != i64 +len(list) * f32 +len(list) ** i +len(list) / f64 +len(list) <= f64 +len(list) == f32 +len(list) == i +len(list) > i +len(list) > i64 - i +len(list) >= i +len(list) not in map(array, #) +len(lower("foo")) +len(lower(toBase64("foo"))) +len(lower(type(list))) +len(map(array, "bar")) +len(map(array, #)) +len(map(array, 0.5)) +len(map(array, array)) +len(map(array, f64)) +len(map(array, foo)) +len(map(array, half)) +len(map(array, i)) +len(map(array, i64)) +len(map(array, list)) +len(map(array, ok)) +len(map(array, score)) +len(map(list, "bar")) +len(map(list, "foo")) +len(map(list, #)) +len(map(list, 0.5)) +len(map(list, 1)) +len(map(list, f64)) +len(map(list, false)) +len(map(list, greet)) +len(map(list, half)) +len(map(list, i)) +len(map(list, score)) +len(map(list, true)) +len(sort(array)) +len(string("bar")) +len(string("foo")) +len(string(0.5)) +len(string(1)) +len(string(add)) +len(string(array)) +len(string(div)) +len(string(f32)) +len(string(f64)) +len(string(foo)) +len(string(greet)) +len(string(half)) +len(string(i32)) +len(string(i64)) +len(string(list)) +len(string(nil)) +len(string(ok)) +len(string(score)) +len(string(true)) +len(toJSON("bar")) +len(toJSON("foo")) +len(toJSON(0.5)) +len(toJSON(1 <= i32)) +len(toJSON(1)) +len(toJSON(array)) +len(toJSON(f32)) +len(toJSON(f64)) +len(toJSON(false)) +len(toJSON(foo)) +len(toJSON(foo.Bar)) +len(toJSON(i)) +len(toJSON(i32)) +len(toJSON(i64)) +len(toJSON(list)) +len(toJSON(nil)) +len(toJSON(ok)) +len(toJSON(true)) +len(trim("bar")) +len(trim("foo")) +len(trimPrefix("bar")) +len(trimPrefix("foo")) +len(trimSuffix("bar")) +len(trimSuffix("foo")) +len(type(0.5)) +len(type(1)) +len(type(array)) +len(type(div)) +len(type(f32)) +len(type(f64)) +len(type(false)) +len(type(foo)) +len(type(greet)) +len(type(half)) +len(type(half)) > f32 +len(type(i)) +len(type(i32)) +len(type(i64)) +len(type(list)) +len(type(nil)) +len(type(ok)) +len(type(score)) +len(upper("bar")) +len(upper("foo")) +len({"bar": 1}) +len({"bar": add}) +len({"bar": f64, "bar": i}) +len({"bar": greet, "bar": greet}) +len({"foo": "foo"}) +list +list != array +list != array == ok +list != array ? 0.5 : "bar" +list != filter(list, true) +list != list +list != map(array, #) +list != map(array, 1) +list != map(array, div) +list != map(list, #) +list != map(list, div) +list != map(list, list) +list == [add] +list == array +list == array ? div : i +list == list +list == list == nil +list == list ? f64 : array +list == list or add != nil +list == map(list, f32) +list == map(list, i64) +list == nil == nil +list == nil == ok +list == nil or i == 0.5 +list == sort(array) +list == {"bar": half, "foo": "foo"}?.i32 +list[-1] +list[-i32] +list[-i64] +list[-i64].String +list[-i] +list[-i].String +list[1 % i32] +list[1 * i64] +list[1:i] == list +list[1].Bar +list[1].Qux +list[1].String +list[1].String() +list[1]?.Bar +list[1]?.Qux +list[1]?.String +list[1]?.String() +list[false ? add : 1] +list[false ? nil : i] +list[false ? true : f64] +list[findIndex(list, ok)] +list[i * i32] +list[i32:i32] +list[i32:i64] +list[i32:i] +list[i32] +list[i32].Bar +list[i32].Qux +list[i32].String +list[i32].String() +list[i32]?.Bar +list[i32]?.Qux +list[i32]?.String +list[i64 % 1] +list[i64:i32] +list[i64:i64] +list[i64:i] +list[i64] +list[i64].Bar +list[i64].Qux +list[i64].String +list[i64].String() +list[i64]?.Bar +list[i64]?.Qux +list[i64]?.String +list[i:false ? false : i64] +list[i:i] +list[i] +list[i].Bar +list[i].Qux +list[i].String +list[i].String() +list[i]?.Bar +list[i]?.Qux +list[i]?.String() +list[int(0.5)] +list[int(f64)] +list[int(i)] +list[max(i)] +list[min(i)] +list[ok ? f32 : add] +list[score(1)] +list[score(i)] +list[true ? f64 : true] +lower("bar" + "bar") +lower(foo.Bar) +lower(foo.String()) +lower(foo?.Bar) +lower(foo?.String()) +lower(greet("bar")) +lower(greet("foo")) +lower(lower("bar")) +lower(lower(trimSuffix("bar"))) +lower(string("bar")) +lower(string("foo")) +lower(string(0.5)) +lower(string(add)) +lower(string(array)) +lower(string(div)) +lower(string(f32)) +lower(string(f64)) +lower(string(false)) +lower(string(foo)) +lower(string(greet)) +lower(string(half)) +lower(string(i)) +lower(string(i32)) +lower(string(i64)) +lower(string(list)) +lower(string(nil)) +lower(string(ok)) +lower(string(score)) +lower(string(true)) +lower(toBase64("bar" + "bar")) +lower(toBase64("bar")) +lower(toBase64("foo")) +lower(toJSON("bar")) +lower(toJSON("foo")) +lower(toJSON(0.5)) +lower(toJSON(1)) +lower(toJSON(array)) +lower(toJSON(f32)) +lower(toJSON(f64)) +lower(toJSON(false)) +lower(toJSON(foo)) +lower(toJSON(i)) +lower(toJSON(i32)) +lower(toJSON(i64)) +lower(toJSON(list)) +lower(toJSON(nil)) +lower(toJSON(ok)) +lower(toJSON(true)) +lower(trim("foo")) +lower(trimPrefix("bar")) +lower(trimSuffix("bar")) +lower(trimSuffix("foo")) +lower(trimSuffix(foo?.String())) +lower(type("bar")) +lower(type("foo")) +lower(type(0.5 * i64)) +lower(type(0.5)) +lower(type(1)) +lower(type(array)) +lower(type(div)) +lower(type(f32)) +lower(type(f64)) +lower(type(false)) +lower(type(foo)) +lower(type(greet)) +lower(type(half)) +lower(type(i)) +lower(type(i64)) +lower(type(nil)) +lower(type(ok)) +lower(type(score)) +lower(type(true)) +lower(upper("bar")) +lower(upper("foo")) +map(1 .. 1, # .. #) +map(1 .. 1, # == f64) +map(1 .. i, #) +map(1 .. i, foo) +map(1 .. i, greet) +map(1 .. i32, #) +map(1 .. i32, ok) +map(1 .. i64, f64 ^ 1) +map(1 .. i64, foo) +map(1 .. i64, list) +map(["bar"], # == #) +map(["foo"], #) +map([1, i], #) +map([add], foo) +map([f32], f64) +map([false], score) +map([greet, i32], #) +map([greet], #) +map([half], #) +map([i32], foo) +map([i64], #) +map([i], max(#)) +map([list, nil], i64) +map([list], #) +map([nil], #?.div(#)) +map([score, "bar"], #) +map([score], #) +map([score], array) +map(array, !false) +map(array, !true) +map(array, "bar" != "foo") +map(array, "bar" contains "foo") +map(array, "bar")[i64] +map(array, # != # ? # : array) +map(array, # != #) +map(array, # != 1) +map(array, # != f64) +map(array, # != i32) +map(array, # != nil) +map(array, # % #) +map(array, # % 1) +map(array, # % i) +map(array, # % i32) +map(array, # % i64) +map(array, # * #) +map(array, # * 0.5) +map(array, # * f64) +map(array, # * i32) +map(array, # * i64) +map(array, # ** #) +map(array, # ** 0.5) +map(array, # ** i) +map(array, # ** i32) +map(array, # ** i64) +map(array, # + #) +map(array, # + 0.5) +map(array, # + 1) +map(array, # + f64) +map(array, # + i) +map(array, # + i32) +map(array, # + i64) +map(array, # - #) +map(array, # - 0.5) +map(array, # - 1) +map(array, # - f32) +map(array, # - i) +map(array, # - i32) +map(array, # .. #) +map(array, # .. 1) +map(array, # .. i) +map(array, # .. i32) +map(array, # .. i64) +map(array, # / #) +map(array, # / 0.5) +map(array, # / f64) +map(array, # / i) +map(array, # / i32) +map(array, # / i64) +map(array, # < #) +map(array, # < 0.5) +map(array, # < 1) +map(array, # < f32) +map(array, # < f64) +map(array, # <= #) +map(array, # <= 1) +map(array, # <= i64) +map(array, # == #) +map(array, # == 1) +map(array, # == i64) +map(array, # > #) +map(array, # > 1) +map(array, # > f32) +map(array, # > i32) +map(array, # > i64) +map(array, # >= #) +map(array, # >= 0.5) +map(array, # >= 1) +map(array, # >= f64) +map(array, # >= i) +map(array, # >= i32) +map(array, # ^ #) +map(array, # ^ 0.5) +map(array, # ^ i) +map(array, # ^ i32) +map(array, # ^ i64) +map(array, # in array) +map(array, #) +map(array, #) != array +map(array, #) != list +map(array, #) != nil == nil +map(array, #)[i64] +map(array, #)[i] +map(array, -#) +map(array, -(# ** f64)) +map(array, -0.5) +map(array, -1) +map(array, -f64) +map(array, -i) +map(array, -i64) +map(array, 0.5 != #) +map(array, 0.5 != 0.5) +map(array, 0.5 != i32) +map(array, 0.5 * #) +map(array, 0.5 ** #) +map(array, 0.5 + #) +map(array, 0.5 - #) +map(array, 0.5 / #) +map(array, 0.5 < #) +map(array, 0.5 < 1) +map(array, 0.5 <= f32) +map(array, 0.5 == #) +map(array, 0.5 == i32) +map(array, 0.5 > #) +map(array, 0.5 ^ #) +map(array, 1 != #) +map(array, 1 != 1) +map(array, 1 != f32) +map(array, 1 % #) +map(array, 1 % i) +map(array, 1 * #) +map(array, 1 * f32) +map(array, 1 ** #) +map(array, 1 ** 1) +map(array, 1 ** i32) +map(array, 1 + #) +map(array, 1 .. #) +map(array, 1 / #) +map(array, 1 / 1) +map(array, 1 < 0.5) +map(array, 1 <= #) +map(array, 1 == #) +map(array, 1 == nil) +map(array, 1 >= #) +map(array, 1 >= f64) +map(array, 1 ^ #) +map(array, 1 ^ 1) +map(array, 1 in array) +map(array, 1)[i64] +map(array, 1)[i] +map(array, [array]) +map(array, [i32, foo]) +map(array, abs(#)) +map(array, abs(0.5)) +map(array, add(#, #)) +map(array, add(#, i)) +map(array, add(1, #)) +map(array, add) +map(array, add) != list +map(array, all(array, true)) +map(array, array != nil) +map(array, array) +map(array, array) == array +map(array, array[#:#]) +map(array, array[1]) +map(array, div(#, #)) +map(array, div) +map(array, f32 ** #) +map(array, f32 ** f64) +map(array, f32 + #) +map(array, f32 - f64) +map(array, f32 / #) +map(array, f32 < #) +map(array, f32 <= #) +map(array, f32 <= 1) +map(array, f32 == #) +map(array, f32 > #) +map(array, f32) +map(array, f64 != #) +map(array, f64 != 0.5) +map(array, f64 * 1) +map(array, f64 ** #) +map(array, f64 - #) +map(array, f64 / 1) +map(array, f64 <= f64) +map(array, f64 > #) +map(array, f64) +map(array, f64) != list +map(array, f64) == i .. 1 +map(array, false ? "foo" : #) +map(array, false ? 0.5 : #) +map(array, false)[i] +map(array, findLast(array, true)) +map(array, float(# * f64)) +map(array, float(#)) +map(array, float(1)) +map(array, float(i64)) +map(array, foo) +map(array, foo.Bar) +map(array, foo.Qux) +map(array, foo.String()) +map(array, foo.String) +map(array, foo?.Qux) +map(array, foo?.String) +map(array, get(array, #)) +map(array, get(list, #)) +map(array, greet != half) +map(array, greet("bar")) +map(array, greet("foo")) +map(array, greet) +map(array, greet) == list +map(array, half(0.5)) +map(array, half) +map(array, i != #) +map(array, i != f64) +map(array, i % i) +map(array, i * 0.5) +map(array, i ** #) +map(array, i ** 0.5) +map(array, i .. #) +map(array, i / #) +map(array, i == #) +map(array, i > #) +map(array, i >= f64) +map(array, i ^ #) +map(array, i) +map(array, i)[i64] +map(array, i32 % #) +map(array, i32 % i) +map(array, i32 * #) +map(array, i32 + 0.5) +map(array, i32 + i64) +map(array, i32 - #) +map(array, i32 / #) +map(array, i32 < 0.5) +map(array, i32 == #) +map(array, i32 == 0.5) +map(array, i32 == nil) +map(array, i32 > #) +map(array, i32 >= f32) +map(array, i32 ^ #) +map(array, i32) +map(array, i64 != #) +map(array, i64 * #) +map(array, i64 ** #) +map(array, i64 + #) +map(array, i64 - #) +map(array, i64 .. #) +map(array, i64 / #) +map(array, i64 <= 1) +map(array, i64 == #) +map(array, i64 == f64) +map(array, i64 > #) +map(array, i64 >= i64) +map(array, i64 ^ #) +map(array, i64 ^ i32) +map(array, i64) +map(array, i64)[i32] +map(array, int(#)) +map(array, int(0.5)) +map(array, int(f64)) +map(array, last(array)) +map(array, len(array)) +map(array, list) +map(array, map(array, #)) +map(array, map(array, true)) +map(array, map(list, #)) +map(array, map(list, f64)) +map(array, max(#)) +map(array, max(#, #, #)) +map(array, max(0.5)) +map(array, max(0.5, #)) +map(array, max(i64, #, i)) +map(array, min(# ^ #)) +map(array, min(#)) +map(array, min(#, #, #, #)) +map(array, min(#, 1)) +map(array, min(#, 1, #)) +map(array, min(#, 1, f64)) +map(array, min(#, f32)) +map(array, min(#, f64)) +map(array, nil != #) +map(array, nil == #) +map(array, nil == half) +map(array, not (# < 1)) +map(array, not false) +map(array, not true) +map(array, ok ? # : i64) +map(array, ok ? f32 : div) +map(array, ok || ok) +map(array, ok) +map(array, one(array, ok)) +map(array, one(array, true)) +map(array, score != nil) +map(array, score(#)) +map(array, score(#, #)) +map(array, score(#, #, 1)) +map(array, score(1)) +map(array, score) +map(array, sort(array)) +map(array, string("bar")) +map(array, string(# ** f64)) +map(array, string(#)) +map(array, string(array)) +map(array, string(foo)) +map(array, string(list)) +map(array, string(score)) +map(array, toJSON(#)) +map(array, toJSON(array)) +map(array, toJSON(ok)) +map(array, true ? # : #) +map(array, true ? f32 : i) +map(array, true ? nil : #) +map(array, true)[i] +map(array, type(#)) +map(array, type(half)) +map(array, type(i)) +map(array, upper("foo")) +map(array[i64:1], array) +map(array[i64:i64], #) +map(array[i:1], i > #) +map(false ? 0.5 : "bar", greet) +map(false ? 1 : list, half) +map(false ? array : "foo", i64 / 1) +map(false ? true : array, #) +map(filter(array, false), foo) +map(filter(array, ok), # <= #) +map(filter(array, ok), #) +map(filter(array, ok), i32 + #) +map(filter(array, ok), score) +map(filter(array, true), f64) +map(filter(array, true), i) +map(filter(list, false), #) +map(filter(list, true), score) +map(i .. 1, # > #) +map(i .. 1, -i64) +map(i .. 1, f64) +map(i .. i32, #) +map(i .. i32, score) +map(i .. i64, #) +map(i .. i64, f64) +map(i .. i64, score) +map(i32 .. 1, #) +map(i32 .. 1, list) +map(i32 .. i, add) +map(i32 .. i, half) +map(i32 .. i32, #) +map(i32 .. i32, greet) +map(i32 .. i64, abs(#)) +map(i32 .. i64, f64) +map(i64 .. i, #) +map(i64 .. i, i) +map(i64 .. i32, #) +map(list, !false) +map(list, !true) +map(list, "bar" in #) +map(list, "bar" not in #) +map(list, "bar") != list +map(list, "foo" + "foo") +map(list, "foo" in #) +map(list, "foo" not matches "bar") +map(list, "foo") == list +map(list, # != #) +map(list, # != foo) +map(list, # != nil) +map(list, # == #) +map(list, # == foo) +map(list, # not in list) +map(list, #) +map(list, #) == array +map(list, #) == list +map(list, #)[i32] +map(list, #)[i64] +map(list, #)[i] +map(list, #?.Bar) +map(list, #?.Qux("bar")) +map(list, #?.Qux) +map(list, #?.String()) +map(list, #?.String) +map(list, -0.5) +map(list, -1) +map(list, -f64) +map(list, -i) +map(list, .Bar not in # != true) +map(list, .Bar) +map(list, .Qux) +map(list, .String()) +map(list, .String) +map(list, 0.5 - i64) +map(list, 0.5 < f32) +map(list, 0.5 <= f32) +map(list, 0.5 <= i64) +map(list, 0.5 >= 1) +map(list, 0.5 ^ 1) +map(list, 1 + i) +map(list, 1 - f64) +map(list, 1 .. 1) +map(list, 1 .. i64) +map(list, 1 / 1) +map(list, 1 / f32) +map(list, 1 < i32) +map(list, 1 > i32) +map(list, 1 >= f64) +map(list, [1]) +map(list, [false]) +map(list, abs(0.5)) +map(list, abs(1)) +map(list, add) +map(list, array) +map(list, div != greet) +map(list, div == div) +map(list, div) +map(list, div) != list +map(list, f32 != f32) +map(list, f32 ** f32) +map(list, f32 / i32) +map(list, f32 < 0.5) +map(list, f32 <= 1) +map(list, f32) +map(list, f64 * 0.5) +map(list, f64 * f32) +map(list, f64 ** i32) +map(list, f64 + 1) +map(list, f64 + i32) +map(list, f64 - 0.5) +map(list, f64 < f64) +map(list, f64 ^ i64) +map(list, f64) +map(list, f64) != list +map(list, false ? # : nil) +map(list, false ? f32 : #) +map(list, false ? f32 : foo) +map(list, false and true) +map(list, filter(list, false)) +map(list, first(list)) +map(list, float(0.5)) +map(list, float(1)) +map(list, float(f32)) +map(list, float(i64)) +map(list, foo == #) +map(list, foo) +map(list, foo.Bar) +map(list, foo.String) +map(list, foo?.String()) +map(list, foo?.String) +map(list, greet == greet) +map(list, greet("foo")) +map(list, greet) +map(list, greet) != array ? 0.5 : 1 +map(list, half != score) +map(list, half(0.5)) +map(list, half) +map(list, i * 1) +map(list, i * i64) +map(list, i + i) +map(list, i >= f64) +map(list, i >= i64) +map(list, i ^ f32) +map(list, i ^ i64) +map(list, i) +map(list, i32 * f32) +map(list, i32 == i64) +map(list, i32 == nil) +map(list, i32 > i) +map(list, i32 ^ 0.5) +map(list, i32) +map(list, i64 == 1) +map(list, i64 == f32) +map(list, i64 ^ (i + i32)) +map(list, i64) +map(list, int(1)) +map(list, len(array)) +map(list, list) +map(list, map(array, score)) +map(list, map(list, #)) +map(list, min(i64)) +map(list, nil != #) +map(list, nil != 1) +map(list, nil != array) +map(list, nil != i) +map(list, nil != nil) +map(list, nil == #) +map(list, nil == div) +map(list, nil == foo) +map(list, nil == i32) +map(list, nil not in array) +map(list, not false) +map(list, not ok) +map(list, not true) +map(list, ok ? i64 : i64) +map(list, ok) +map(list, ok) != array +map(list, score != greet) +map(list, score(i)) +map(list, score) +map(list, string(#)) +map(list, string(foo)) +map(list, string(nil)) +map(list, toBase64("foo")) +map(list, toJSON(#)) +map(list, toJSON(1)) +map(list, toJSON(foo)) +map(list, toJSON(i)) +map(list, trimPrefix("bar")) +map(list, trimSuffix("foo")) +map(list, true ? false : score) +map(list, true ? nil : #) +map(list, true)[i32] +map(list, type(#)) +map(list, type(greet)) +map(list, type(half)) +map(list, type(i)) +map(list, type(i64)) +map(list[i:i], i) +map(map(array, "bar"), #) +map(map(array, # >= #), add) +map(map(array, #), # < #) +map(map(array, #), # ^ i32) +map(map(array, #), #) +map(map(array, #), add) +map(map(array, #), div) +map(map(array, #), f32) +map(map(array, #), f64) +map(map(array, #), foo) +map(map(array, #), foo.Qux) +map(map(array, #), greet) +map(map(array, #), half) +map(map(array, #), i) +map(map(array, #), i64) +map(map(array, #), int(#)) +map(map(array, #), nil != half) +map(map(array, #), score(i)) +map(map(array, #), score) +map(map(array, 0.5), # != #) +map(map(array, 0.5), #) +map(map(array, 0.5), -1) +map(map(array, 0.5), list) +map(map(array, 1), #) +map(map(array, 1), ok) +map(map(array, 1), score) +map(map(array, add), #) +map(map(array, add), list) +map(map(array, array), add) +map(map(array, array), f64) +map(map(array, f32), #) +map(map(array, f64), add) +map(map(array, f64), nil == nil) +map(map(array, foo), #) +map(map(array, foo), f64) +map(map(array, foo), greet) +map(map(array, half), div) +map(map(array, i64), f64) +map(map(array, list), #) +map(map(array, true), #) +map(map(array, true), div) +map(map(array, true), foo) +map(map(list, "foo"), add) +map(map(list, "foo"), div) +map(map(list, "foo"), i32) +map(map(list, #), "bar" + "foo") +map(map(list, #), # != #) +map(map(list, #), #) +map(map(list, #), array) +map(map(list, #), div) +map(map(list, #), f32) +map(map(list, #), f64) +map(map(list, #), greet) +map(map(list, #), i) +map(map(list, #), i32) +map(map(list, #), i64 < i32) +map(map(list, #), i64) +map(map(list, #), nil != i) +map(map(list, #), ok) +map(map(list, #), score) +map(map(list, 0.5), # / #) +map(map(list, 0.5), #) +map(map(list, 0.5), greet) +map(map(list, 0.5), list) +map(map(list, 0.5), score) +map(map(list, 1), # <= #) +map(map(list, 1), foo) +map(map(list, add), [#, #]) +map(map(list, add), f64) +map(map(list, f32), #) +map(map(list, f32), greet) +map(map(list, f32), true ? "foo" : "foo") +map(map(list, f64), #) +map(map(list, false), array) +map(map(list, false), f64) +map(map(list, false), i32) +map(map(list, false), list) +map(map(list, foo), #) +map(map(list, foo), ok) +map(map(list, greet), "bar" != "foo") +map(map(list, greet), # == #) +map(map(list, greet), #) +map(map(list, greet), ["foo", 1]) +map(map(list, greet), half) +map(map(list, half), #) +map(map(list, i), i32) +map(map(list, i32), half) +map(map(list, i32), list) +map(map(list, i64), #) +map(map(list, i64), array) +map(map(list, i64), div) +map(map(list, i64), f64) +map(map(list, i64), list) +map(map(list, list), #) +map(map(list, list), div) +map(map(list, list), i) +map(map(list, ok), #) +map(map(list, score), #) +map(map(list, score), ok) +map(map(list, true), #) +map(ok ? "foo" : 0.5, #) +map(ok ? "foo" : greet, f32) +map(ok ? array : "bar", ok) +map(ok ? array : foo, # / 1) +map(sort(array), # > #) +map(sort(array), i32 > #) +map(true ? "bar" : true, #) +map(true ? "foo" : add, i64) +map(true ? array : f64, #) +map(true ? array : true, #) +max(--1) +max(-0.5) +max(-1) +max(-1, i) +max(-count(list, false), i64) +max(-f32) +max(-f64) +max(-i) +max(-i, i32, i) +max(-i32) +max(-i64) +max(-i64, 0.5 / f64) +max(0.5 * 0.5) +max(0.5 * f64) +max(0.5 * i) +max(0.5 * i, i32) +max(0.5 * i32) +max(0.5 ** 0.5) +max(0.5 ** 1) +max(0.5 ** f32) +max(0.5 ** f64) +max(0.5 ** i) +max(0.5 ** i64) +max(0.5 + 0.5) +max(0.5 + 1) +max(0.5 + i) +max(0.5 + i32) +max(0.5 + i64) +max(0.5 - 0.5) +max(0.5 - 1) +max(0.5 - i) +max(0.5 - i32) +max(0.5 - i64) +max(0.5 / 0.5) +max(0.5 / f32) +max(0.5 / f64) +max(0.5 / f64, f64) +max(0.5 / i) +max(0.5 / i64) +max(0.5 ^ 0.5) +max(0.5 ^ 1) +max(0.5 ^ f32) +max(0.5 ^ i) +max(0.5 ^ i32) +max(0.5 ^ i64) +max(0.5) != i == ok +max(0.5) * f32 +max(0.5) * f64 +max(0.5) + i +max(0.5) - f32 +max(0.5) - f64 +max(0.5) < f64 +max(0.5) <= 0.5 - 0.5 +max(0.5) <= f64 +max(0.5) == f32 +max(0.5) == i64 +max(0.5) > f32 +max(0.5) >= i32 +max(0.5) ^ i32 +max(0.5, 1) <= i32 +max(1 % 1) +max(1 % i) +max(1 % i32) +max(1 % i64) +max(1 * 0.5) +max(1 * 1) +max(1 ** 0.5) +max(1 ** 1) +max(1 ** f64) +max(1 ** i64) +max(1 + f32, f64) +max(1 + i64) +max(1 - 1) +max(1 - i32) +max(1 - i64) +max(1 / 0.5) +max(1 / 1) +max(1 / f32) +max(1 / f64) +max(1 ^ 1) +max(1 ^ i32) +max(1) != i +max(1) * i +max(1) - f64 +max(1) - i64 +max(1) .. i32 +max(1) / i +max(1) / i64 +max(1) <= f32 +max(1) <= i +max(1) <= i32 +max(1) <= i64 +max(1) == f32 +max(1) > f32 +max(1) > f64 +max(1) > i +max(1) > i64 +max(1, i32, f32) != i64 +max(abs(0.5)) +max(abs(1)) +max(abs(f32)) +max(abs(f64)) +max(abs(i)) +max(abs(i32)) +max(abs(i64)) +max(array[1]) +max(array[i64]) +max(array[i]) +max(count(array, false)) +max(count(list, false)) +max(div(1, 1)) +max(f32 * 0.5) +max(f32 * 1) +max(f32 * f32) +max(f32 * i32) +max(f32 ** 0.5) +max(f32 ** 1) +max(f32 ** i32) +max(f32 ** i64) +max(f32 + 1) +max(f32 + f64) +max(f32 + i64) +max(f32 - f64) +max(f32 - i) +max(f32 - i32) +max(f32 / 0.5) +max(f32 / f32) +max(f32 ^ 0.5) +max(f32 ^ 1) +max(f32 ^ f32) +max(f32 ^ i32) +max(f32 ^ i64) +max(f32) +max(f32) != -i32 +max(f32) != i32 +max(f32) + i64 +max(f32) - f32 +max(f32) <= i +max(f32) <= max(f64) +max(f32) >= i64 +max(f32) ^ f32 +max(f32) ^ i32 +max(f32, -f32) +max(f32, 1) > i32 +max(f32, f32) +max(f32, f64) +max(f32, i) +max(f32, i32) +max(f32, i64) +max(f32, min(i)) +max(f64 * 0.5) +max(f64 * f64) +max(f64 * i, f32) +max(f64 * i32) +max(f64 ** 1) +max(f64 ** i) +max(f64 ** i64) +max(f64 + 0.5) +max(f64 - i32) +max(f64 - i64) +max(f64 / 0.5) +max(f64 / f32) +max(f64 / i32) +max(f64 ^ 0.5) +max(f64 ^ i32) +max(f64 ^ i64) +max(f64) +max(f64) != i +max(f64) + f32 +max(f64) + i64 +max(f64) - f32 +max(f64) / f32 +max(f64) / i32 +max(f64) == f64 +max(f64) == i32 +max(f64) > f32 +max(f64) > f64 +max(f64) > i64 +max(f64) ^ 1 ^ i64 +max(f64) ^ i +max(f64) ^ min(i32, 1) +max(f64, -1) +max(f64, 0.5 ** i64) +max(f64, 1) <= f64 +max(f64, 1) == i32 +max(f64, f32) +max(f64, f32, i32) +max(f64, f32, i64) +max(f64, f64) +max(f64, f64, score(1)) +max(f64, float(i)) +max(f64, half(f64)) +max(f64, i) +max(f64, i32) +max(f64, i64) +max(false ? 1 : 0.5) +max(false ? 1 : nil) +max(false ? add : ok) +max(false ? half : list) +max(false ? i : nil) +max(false ? i32 : score) +max(false ? true : 1) +max(find(array, ok)) +max(find(array, true)) +max(findIndex(array, ok)) +max(findIndex(array, true)) +max(findIndex(list, ok)) +max(findIndex(list, true)) +max(findLast(array, false)) +max(findLast(array, true)) +max(findLastIndex(array, false)) +max(findLastIndex(list, true)) +max(first(array)) +max(float(0.5)) +max(float(1)) +max(float(f32)) +max(float(f64)) +max(float(i)) +max(float(i64)) +max(float(i64), f64) +max(get(array, 1)) +max(get(array, i)) +max(get(array, i32)) +max(get(array, i64)) +max(half(-0.5)) +max(half(0.5)) +max(half(f64)) +max(i % i) +max(i % i32) +max(i % i64) +max(i * 0.5) +max(i * 1) +max(i * f32) +max(i * i32) +max(i ** 0.5) +max(i ** 1) +max(i ** f64) +max(i ** i) +max(i ** i64) +max(i + 0.5) +max(i + 1) +max(i + f32) +max(i + f64) +max(i + i) +max(i - 1) +max(i - i32) +max(i - i32, f32) +max(i - i64) +max(i / 0.5) +max(i / f32) +max(i / i32, f64) +max(i ^ 0.5) +max(i ^ 1) +max(i ^ f32) +max(i ^ f64) +max(i) +max(i) != f64 +max(i) ** f64 +max(i) + f32 +max(i) + i64 +max(i) - f32 +max(i) - f64 +max(i) - i32 +max(i) - i64 +max(i) / f64 +max(i) >= i64 +max(i) ^ (i * i) +max(i) ^ f32 +max(i, -f32) +max(i, f32) +max(i, f32, f32) +max(i, f64) +max(i, i) +max(i, i32) +max(i, i64) +max(i, i64, i64) +max(i32 % 1) +max(i32 % i32) +max(i32 * 0.5) +max(i32 * 1) +max(i32 * f32) +max(i32 * i64) +max(i32 + 0.5, f64) +max(i32 + f64) +max(i32 + i) +max(i32 + i32) +max(i32 - i) +max(i32 - i64) +max(i32 / f32) +max(i32 / f64) +max(i32 / i64) +max(i32 ^ 0.5) +max(i32 ^ 1) +max(i32 ^ f32) +max(i32 ^ i) +max(i32 ^ i32) +max(i32) +max(i32) != min(i64) +max(i32) - f32 +max(i32) - i64 +max(i32) / f32 +max(i32) >= i32 +max(i32) ^ i64 +max(i32, 1) == i32 +max(i32, abs(f64)) +max(i32, f32) +max(i32, f32) != i32 +max(i32, f64) +max(i32, f64) - f32 +max(i32, i) +max(i32, i, i) +max(i32, i32) +max(i32, i32, i) +max(i32, i64) +max(i64 % i) +max(i64 % i32) +max(i64 * 0.5) +max(i64 * 1) +max(i64 * f32) +max(i64 * i32) +max(i64 ** 1) +max(i64 ** i64) +max(i64 + 0.5) +max(i64 + f32) +max(i64 + i32) +max(i64 - 0.5) +max(i64 - 1) +max(i64 - f32) +max(i64 - f64) +max(i64 - i) +max(i64 / 1) +max(i64 / f64) +max(i64 / i) +max(i64 / i64) +max(i64 ^ 0.5) +max(i64 ^ 1) +max(i64 ^ i) +max(i64 ^ i64) +max(i64) +max(i64) != f32 +max(i64) != i32 +max(i64) * i32 +max(i64) * i64 +max(i64) ** i64 +max(i64) + f32 +max(i64) + i64 +max(i64) / f32 +max(i64) / i +max(i64) / i64 +max(i64) < f32 +max(i64) < i64 +max(i64) <= i +max(i64) == f32 +max(i64) == f64 +max(i64) >= i32 +max(i64) ^ (i64 / f32) +max(i64) in array +max(i64, 1) * i32 +max(i64, f32) +max(i64, f64) +max(i64, i) +max(i64, i32) +max(i64, i64) +max(int(0.5)) +max(int(1)) +max(int(f32)) +max(int(f64)) +max(int(i)) +max(int(i32)) +max(int(i64)) +max(last(array)) +max(len("bar")) +max(len("foo")) +max(len(array)) +max(len(list)) +max(len(list), 0.5 - i) +max(max(0.5)) +max(max(0.5, 0.5)) +max(max(1)) +max(max(f32)) +max(max(f64)) +max(max(i)) +max(max(i32)) +max(max(i64)) +max(min(0.5)) +max(min(0.5, i)) +max(min(1)) +max(min(1, i64, 1)) +max(min(f32)) +max(min(f64)) +max(min(f64, i64)) +max(min(i)) +max(min(i32)) +max(min(i32, i)) +max(ok ? 1 : foo) +max(ok ? 1 : i) +max(ok ? 1 : i32) +max(ok ? div : foo) +max(ok ? div : i64) +max(ok ? i : true) +max(ok ? ok : i64) +max(ok ? true : 0.5) +max(score(1)) +max(score(1), i64) +max(score(i)) +max(score(i, i)) +max(true ? 0.5 : half) +max(true ? 1 : i64) +max(true ? add : list) +max(true ? foo : add) +max(true ? foo : f32) +max(true ? i : ok) +max(true ? i64 : "bar") +min(-(0.5 + i)) +min(-(f32 + i64)) +min(-0.5) +min(-0.5, i) +min(-1) +min(-1, i) +min(-1, i64) +min(-f32) +min(-f32, i64) +min(-f64) +min(-f64, i32) +min(-i) +min(-i32) +min(-i64) +min(0.5 * 0.5) +min(0.5 * 1) +min(0.5 * f64) +min(0.5 * i32) +min(0.5 ** 0.5) +min(0.5 ** f64) +min(0.5 ** i64) +min(0.5 + 1) +min(0.5 + f32) +min(0.5 + f64) +min(0.5 + i) +min(0.5 - 0.5) +min(0.5 - 1) +min(0.5 - f64) +min(0.5 - i) +min(0.5 / 0.5) +min(0.5 / f64) +min(0.5 ^ 1) +min(0.5 ^ f32) +min(0.5 ^ i) +min(0.5) != i32 +min(0.5) * 0.5 ** i64 +min(0.5) ** i +min(0.5) + i +min(0.5) + i32 +min(0.5) + i64 +min(0.5) < f32 +min(0.5) <= i ? f32 : 1 +min(0.5) <= i64 +min(0.5) == i - 0.5 +min(0.5) > i64 +min(0.5) >= i +min(0.5, 0.5) == f32 +min(0.5, 1) >= i64 +min(0.5, i) == i64 +min(0.5, i32, f32) + f32 +min(1 % i32) +min(1 % i64) +min(1 * 0.5) +min(1 * 1) +min(1 * i) +min(1 * i32) +min(1 * i64) +min(1 ** 0.5) +min(1 ** f32) +min(1 ** f64) +min(1 ** i32) +min(1 + 0.5) +min(1 + 1) +min(1 + f32) +min(1 + i32) +min(1 + i64) +min(1 - 1) +min(1 - f64) +min(1 - i) +min(1 - i32) +min(1 / 1) +min(1 / i) +min(1 / i32) +min(1 / i32, f64) +min(1 / i64) +min(1 ^ 1) +min(1 ^ f32) +min(1 ^ f64) +min(1) != 1 ? list : f64 +min(1) != i +min(1) % i64 +min(1) * -0.5 +min(1) * 1 ** 1 +min(1) - i64 ^ 0.5 +min(1) .. i +min(1) .. i64 +min(1) / f64 +min(1) / i +min(1) < i +min(1) == f64 +min(1) == i32 +min(1) >= i64 +min(1) ^ f32 +min(abs(0.5)) +min(abs(1)) +min(abs(f32)) +min(abs(f64)) +min(abs(i * 1)) +min(abs(i)) +min(abs(i32)) +min(abs(i64)) +min(abs(i64), f64) +min(add(1, i)) +min(add(i, i)) +min(array[1]) +min(array[i]) +min(count(array, false)) +min(count(array, ok)) +min(count(array, true)) +min(count(list, ok)) +min(f32 * 1) +min(f32 * f32) +min(f32 * i32) +min(f32 ** i32) +min(f32 ** i64) +min(f32 ** i64, f32) +min(f32 + f64) +min(f32 + i) +min(f32 + i32) +min(f32 + i64) +min(f32 - f32) +min(f32 - i) +min(f32 - i32) +min(f32 - i64) +min(f32 / 0.5) +min(f32 / f64) +min(f32 / i) +min(f32 / i32) +min(f32 / i64) +min(f32 ^ 1) +min(f32 ^ f32) +min(f32 ^ i) +min(f32 ^ i32) +min(f32) +min(f32) * f32 +min(f32) * f64 +min(f32) + i +min(f32) + i32 +min(f32) + i64 +min(f32) - f32 +min(f32) < i64 +min(f32) == i +min(f32) == i32 * i32 +min(f32) == i64 +min(f32) > i32 +min(f32) ^ f64 +min(f32, 0.5 ^ 0.5) +min(f32, 0.5) <= i64 +min(f32, f32) +min(f32, f64) +min(f32, f64) >= i +min(f32, get(array, i64)) +min(f32, i) +min(f32, i32) +min(f32, i64) +min(f32, len(array)) +min(f32, len(list)) +min(f64 * 0.5) +min(f64 * 1) +min(f64 * f64) +min(f64 * i) +min(f64 * i32) +min(f64 ** 1) +min(f64 ** f64) +min(f64 ** i) +min(f64 ** i32) +min(f64 ** i64) +min(f64 + 1) +min(f64 + i) +min(f64 + i64) +min(f64 - 0.5) +min(f64 - i) +min(f64 - i32) +min(f64 - i64) +min(f64 / 1) +min(f64 / f32) +min(f64 / i) +min(f64 / i32) +min(f64 / i64) +min(f64 ^ 0.5) +min(f64 ^ f64) +min(f64 ^ i32) +min(f64) +min(f64) + f64 +min(f64) + i32 +min(f64) + i64 +min(f64) / f32 +min(f64) ^ 1 ^ 1 +min(f64) ^ i32 +min(f64) ^ i64 +min(f64, 0.5 ** 1) +min(f64, 0.5, i) <= f64 +min(f64, 1 ** i) +min(f64, 1) < i64 +min(f64, f32) +min(f64, f64) +min(f64, f64, i64) +min(f64, i) +min(f64, i32) +min(f64, i64) +min(false ? 1 : add) +min(false ? f64 : false) +min(false ? f64 : score) +min(false ? foo : 1) +min(false ? greet : i) +min(false ? i32 : "foo") +min(false ? i32 : i64) +min(false ? true : 0.5) +min(find(array, false)) +min(find(array, ok)) +min(findIndex(list, ok)) +min(findLast(array, true)) +min(findLastIndex(array, false)) +min(findLastIndex(array, ok)) +min(findLastIndex(array, true)) +min(findLastIndex(list, ok)) +min(first(array)) +min(float(0.5)) +min(float(1)) +min(float(f32)) +min(float(f64)) +min(float(i)) +min(float(i32)) +min(float(i64)) +min(get(array, i)) +min(get(array, i64)) +min(half(0.5 ^ i32)) +min(half(0.5)) +min(half(0.5), f32) +min(half(f64)) +min(i % 1) +min(i % i32) +min(i % i64) +min(i * 0.5) +min(i * 1) +min(i * i) +min(i * i64) +min(i ** 0.5) +min(i ** f32) +min(i ** f64) +min(i ** i) +min(i ** i64) +min(i + 0.5) +min(i + f32) +min(i + f64) +min(i + i) +min(i - 0.5) +min(i - 1) +min(i - i) +min(i / 0.5) +min(i / i64) +min(i / i64, i) +min(i ^ 0.5) +min(i ^ i, i32) +min(i) +min(i) != i32 +min(i) % i +min(i) * f32 +min(i) ** i +min(i) .. i +min(i) / f64 +min(i) < f32 +min(i) <= i64 +min(i, f32) +min(i, f64) +min(i, i) +min(i, i32 - i) +min(i, i32) +min(i, i64 * f32) +min(i, i64) +min(i32 % i) +min(i32 * 1) +min(i32 * f64) +min(i32 * i32) +min(i32 ** 1 ^ i64) +min(i32 ** f32) +min(i32 ** i) +min(i32 ** i64) +min(i32 + 0.5) +min(i32 + 1) +min(i32 + f32) +min(i32 - 0.5) +min(i32 - 1) +min(i32 - i32) +min(i32 / 1) +min(i32 / i) +min(i32 / i64) +min(i32 / i64, score(1)) +min(i32 ^ 1) +min(i32 ^ f64) +min(i32 ^ i) +min(i32 ^ i64) +min(i32) +min(i32) != i64 +min(i32) + f32 +min(i32) - i64 +min(i32) / f32 +min(i32) < i32 +min(i32) == f32 +min(i32) == i32 +min(i32) >= i32 +min(i32) ^ f64 +min(i32, 0.5) .. i32 +min(i32, f32) +min(i32, f64) +min(i32, i) +min(i32, i32) +min(i32, i32, i) +min(i32, i64) +min(i32, i64) .. i +min(i32, i64) <= f64 +min(i32, min(i)) +min(i64 % i32) +min(i64 * 1, f32) +min(i64 * f64) +min(i64 * i32) +min(i64 ** 0.5) +min(i64 ** 1) +min(i64 ** i) +min(i64 + 0.5) +min(i64 + 1) +min(i64 + f32) +min(i64 + i) +min(i64 + i32) +min(i64 - 0.5) +min(i64 - f32) +min(i64 - f64) +min(i64 - i) +min(i64 - i64) +min(i64 / 0.5) +min(i64 / f64) +min(i64 / i) +min(i64 / i64) +min(i64 ^ 1) +min(i64 ^ i32) +min(i64 ^ i64) +min(i64) +min(i64) != i64 +min(i64) % i32 +min(i64) ** -1 +min(i64) ** -f64 +min(i64) ** i +min(i64) + i32 +min(i64) .. i +min(i64) .. i64 +min(i64) <= f32 +min(i64) == i +min(i64) ^ f32 +min(i64) ^ f64 +min(i64) in array +min(i64, 1 ** 0.5) +min(i64, 1) <= f64 +min(i64, f32) +min(i64, f64) +min(i64, f64) != f64 +min(i64, f64) * i32 +min(i64, f64, i32) +min(i64, i) +min(i64, i32) +min(i64, i32, i) +min(i64, i64) +min(i64, i64, f32) +min(int(0.5)) +min(int(1)) +min(int(f32)) +min(int(f64)) +min(int(i)) +min(int(i64)) +min(last(array)) +min(len("bar")) +min(len("foo")) +min(len(array)) +min(len(list)) +min(len(list), f64) +min(max(0.5)) +min(max(1)) +min(max(1, 0.5)) +min(max(1, f32)) +min(max(1, i32)) +min(max(f32)) +min(max(f64)) +min(max(i), i64) +min(max(i32)) +min(min(0.5)) +min(min(0.5, 1)) +min(min(1)) +min(min(f32)) +min(min(f32, i, i32)) +min(min(f64)) +min(min(i)) +min(min(i32)) +min(min(i64)) +min(ok ? add : 0.5) +min(ok ? f32 : "foo") +min(ok ? f64 : true) +min(ok ? foo : 1) +min(ok ? true : 1) +min(score(1)) +min(score(i)) +min(true ? 0.5 : ok) +min(true ? 1 : greet) +min(true ? add : greet) +min(true ? f32 : i) +min(true ? foo : 0.5) +min(true ? foo : half) +min(true ? i : 1) +min(true ? i32 : score) +nil != "bar" ? i64 : 0.5 - i +nil != 0.5 && 0.5 != f32 +nil != 1 && ok +nil != 1 or any(list, false) +nil != 1 || ok +nil != f32 || ok +nil != f64 && ok +nil != f64 or ok +nil != f64 || array != array +nil != false and not true +nil != false and ok +nil != false || ok +nil != foo == ok +nil != foo || ok +nil != foo.Bar +nil != foo.Qux +nil != foo.String +nil != foo?.Bar +nil != foo?.Qux +nil != foo?.String +nil != greet ? half : half +nil != greet or f32 < i +nil != i32 or f32 >= 1 +nil != i64 or i >= 1 +nil != ok == not true +nil != true == ok +nil == 1 != nil ? "bar" : i32 +nil == add == ("bar" not endsWith "foo") +nil == f32 && i64 < f64 +nil == foo.Bar +nil == foo.Qux +nil == foo.String +nil == foo.String() +nil == foo?.Bar +nil == foo?.Qux +nil == foo?.String +nil == foo?.String() +nil == i64 ? add : add +nil == nil == ok +nil == true ? i64 ^ f32 : foo +nil == true || ok +nil in array || ok +nil in array[i32:i64] +nil in list and ok +none(array, !ok) +none(array, !true) +none(array, "bar" == "bar") +none(array, # != #) +none(array, # != 1) +none(array, # != f32) +none(array, # != f64) +none(array, # != i32) +none(array, # != i64) +none(array, # < #) +none(array, # < 0.5) +none(array, # < 1) +none(array, # < f32) +none(array, # < i) +none(array, # < i32) +none(array, # < i64) +none(array, # <= #) +none(array, # <= 0.5) +none(array, # <= 1) +none(array, # <= f32) +none(array, # <= i) +none(array, # <= i32) +none(array, # == #) +none(array, # == 0.5) +none(array, # == 1) +none(array, # == i) +none(array, # == nil) +none(array, # > #) +none(array, # > 0.5) +none(array, # > f32) +none(array, # > f64) +none(array, # > i) +none(array, # > i32) +none(array, # >= #) +none(array, # >= 0.5) +none(array, # >= 1) +none(array, # >= f32) +none(array, # >= f64) +none(array, # in array) +none(array, # not in array) +none(array, 0.5 != #) +none(array, 0.5 != f32) +none(array, 0.5 < #) +none(array, 0.5 <= 0.5) +none(array, 0.5 <= 1) +none(array, 0.5 <= i) +none(array, 0.5 > #) +none(array, 0.5 >= #) +none(array, 1 != #) +none(array, 1 < #) +none(array, 1 < 0.5) +none(array, 1 < i) +none(array, 1 < i64) +none(array, 1 <= 1) +none(array, 1 == #) +none(array, 1 == f64) +none(array, 1 > #) +none(array, 1 > f64) +none(array, 1 >= i) +none(array, add != greet) +none(array, all(array, true)) +none(array, div == greet) +none(array, f32 != #) +none(array, f32 != nil) +none(array, f32 <= #) +none(array, f32 >= #) +none(array, f64 != #) +none(array, f64 == #) +none(array, f64 >= 0.5) +none(array, half != nil) +none(array, i < #) +none(array, i < 1) +none(array, i <= #) +none(array, i == i64) +none(array, i not in array) +none(array, i32 != #) +none(array, i32 != f64) +none(array, i32 != nil) +none(array, i32 < #) +none(array, i32 > #) +none(array, i32 >= #) +none(array, i64 < #) +none(array, i64 < f64) +none(array, i64 >= #) +none(array, nil != 0.5) +none(array, nil != div) +none(array, nil == #) +none(array, nil == 1) +none(array, nil == div) +none(array, none(array, !true)) +none(array, not ok) +none(array, ok == nil) +none(array, ok) +none(array, ok) != ok +none(array, ok) ? f32 : !ok +none(array, score == nil) +none(array, score == score) +none(array, true ? ok : f64) +none(array, true or true) +none(i64 .. i32, # > #) +none(list, "bar" not in #) +none(list, # != #) +none(list, # != foo) +none(list, # != nil) +none(list, # == #) +none(list, # == nil) +none(list, 0.5 != i) +none(list, 0.5 <= 1) +none(list, 0.5 <= f64) +none(list, 0.5 == nil) +none(list, 1 < i32) +none(list, 1 == f32) +none(list, any(list, ok)) +none(list, array == nil) +none(list, f32 > i) +none(list, f64 == i32) +none(list, false && false) +none(list, false) or f64 >= i64 +none(list, foo != #) +none(list, foo == #) +none(list, greet != add) +none(list, greet != half) +none(list, i <= i64) +none(list, i >= 1) +none(list, i >= f64) +none(list, i not in array) +none(list, i32 != nil) +none(list, i32 == f64) +none(list, i32 == nil) +none(list, i32 >= 1) +none(list, i32 >= f32) +none(list, i64 < f64) +none(list, i64 <= f64) +none(list, i64 > f64) +none(list, i64 > i64) +none(list, nil != array) +none(list, nil != true) +none(list, nil == foo) +none(list, not false) +none(list, not ok) +none(list, ok) +none(list, one(array, false)) +none(list, score != nil) +none(list, score == add) +none(list, true && ok) +none(list, true == ok) +none(list, true) ? div : array +none(map(array, "bar"), # not endsWith #) +none(map(array, "foo"), # not endsWith #) +none(map(array, #), ok) +none(map(array, 0.5), # == #) +none(map(array, 1), # >= #) +none(map(array, half), # == #) +none(map(array, ok), #) +none(map(list, "bar"), # not startsWith #) +none(map(list, "bar"), # startsWith #) +none(map(list, #), # != #) +none(map(list, #), ok) +none(map(list, i32), f64 > #) +none(map(list, true), # != #) +none(ok ? "bar" : ok, # >= f64) +not !("foo" not matches "foo") +not !(0.5 > 1) +not !(f64 >= i32) +not !(false && ok) +not !(i >= i32) +not !false +not !ok +not !true +not ("bar" != "foo") +not ("bar" != nil) +not ("bar" < "foo") +not ("bar" <= "bar") +not ("bar" <= "foo") +not ("bar" == "bar") +not ("bar" == "foo") +not ("bar" == nil) +not ("bar" > "bar") +not ("bar" > "foo") +not ("bar" >= "bar") +not ("bar" >= "foo") +not ("bar" contains "bar") +not ("bar" contains "foo") +not ("bar" endsWith "bar") +not ("bar" endsWith "foo") +not ("bar" in foo) +not ("bar" matches "bar") +not ("bar" not contains "bar") +not ("bar" not contains "foo") +not ("bar" not endsWith "bar") +not ("bar" not endsWith "foo") +not ("bar" not in foo) +not ("bar" not matches "bar") +not ("bar" not matches "foo") +not ("bar" startsWith "bar") +not ("bar" startsWith "foo") +not ("foo" != "bar") +not ("foo" != "foo") +not ("foo" != nil) +not ("foo" < "bar") +not ("foo" < "foo") +not ("foo" <= "bar") +not ("foo" <= "foo") +not ("foo" == "bar") +not ("foo" == "foo") +not ("foo" == nil) +not ("foo" > "bar") +not ("foo" > "foo") +not ("foo" >= "foo") +not ("foo" contains "foo") +not ("foo" endsWith "bar") +not ("foo" endsWith "foo") +not ("foo" in foo) +not ("foo" matches "bar") +not ("foo" matches "foo") +not ("foo" not contains "bar") +not ("foo" not contains "foo") +not ("foo" not endsWith "bar") +not ("foo" not endsWith "foo") +not ("foo" not in foo) +not ("foo" not matches "bar") +not ("foo" not matches "foo") +not ("foo" not startsWith "bar") +not ("foo" not startsWith "foo") +not ("foo" startsWith "foo") +not (0.5 != 0.5) +not (0.5 != 1) +not (0.5 != f64) +not (0.5 != i) +not (0.5 != i32) +not (0.5 != i64) +not (0.5 != nil) +not (0.5 < 0.5) +not (0.5 < 1) +not (0.5 < f32) +not (0.5 < f64) +not (0.5 < i) +not (0.5 < i32) +not (0.5 < i64) +not (0.5 <= 0.5) +not (0.5 <= 1) +not (0.5 <= f32) +not (0.5 <= f64) +not (0.5 <= i) +not (0.5 <= i32) +not (0.5 <= i64) +not (0.5 == 0.5) +not (0.5 == 1) +not (0.5 == f32) +not (0.5 == f64) +not (0.5 == i) +not (0.5 == i32) +not (0.5 == i64) +not (0.5 == nil) +not (0.5 > 0.5) +not (0.5 > 1) +not (0.5 > f32) +not (0.5 > f64) +not (0.5 > i) +not (0.5 > i32) +not (0.5 > i64) +not (0.5 >= 0.5) +not (0.5 >= 1) +not (0.5 >= f32) +not (0.5 >= f64) +not (0.5 >= i) +not (0.5 >= i32) +not (0.5 >= i64) +not (1 != 0.5) +not (1 != 1) +not (1 != f32) +not (1 != f64) +not (1 != i) +not (1 != i32) +not (1 != i64) +not (1 != nil) +not (1 + i > 0.5 ** i32) +not (1 < 0.5) +not (1 < 1) +not (1 < f32) +not (1 < f64) +not (1 < i) +not (1 < i32) +not (1 < i64) +not (1 <= 0.5) +not (1 <= 1) +not (1 <= f32) +not (1 <= f64) +not (1 <= i) +not (1 <= i32) +not (1 <= i64) +not (1 == 0.5) +not (1 == 1) +not (1 == f32) +not (1 == f64) +not (1 == i) +not (1 == i64) +not (1 == nil) +not (1 > 0.5) +not (1 > 1) +not (1 > f32) +not (1 > f64) +not (1 > i) +not (1 > i32) +not (1 > i64) +not (1 >= 0.5) +not (1 >= 1) +not (1 >= f32) +not (1 >= f64) +not (1 >= i) +not (1 >= i32) +not (1 >= i64) +not (1 ^ f32 != i64) +not (1 in array) +not (1 not in array) +not (abs(i) <= i) +not (add != add) +not (add != div) +not (add != greet) +not (add != half) +not (add != nil) +not (add != score) +not (add == add) +not (add == div) +not (add == greet) +not (add == half) +not (add == nil) +not (add == score) +not (array != array) +not (array != list) +not (array != nil) +not (array == array) +not (array == list) +not (array == nil) +not (div != add) +not (div != div) +not (div != greet) +not (div != half) +not (div != nil) +not (div != score) +not (div == add) +not (div == div) +not (div == greet) +not (div == half) +not (div == nil) +not (div == score) +not (f32 != 0.5) +not (f32 != 1) +not (f32 != f32) +not (f32 != f64) +not (f32 != i) +not (f32 != i32) +not (f32 != i64) +not (f32 != nil) +not (f32 < 0.5) +not (f32 < 1) +not (f32 < abs(0.5)) +not (f32 < f32) +not (f32 < f64) +not (f32 < i) +not (f32 < i32) +not (f32 < i64) +not (f32 <= 0.5) +not (f32 <= 1) +not (f32 <= f32) +not (f32 <= f64) +not (f32 <= i) +not (f32 <= i32) +not (f32 <= i64) +not (f32 == 0.5) +not (f32 == 1) +not (f32 == f32) +not (f32 == f64) +not (f32 == i32) +not (f32 == i64) +not (f32 == nil) +not (f32 > 0.5) +not (f32 > 1) +not (f32 > f32) +not (f32 > f64) +not (f32 > i32) +not (f32 >= 0.5) +not (f32 >= 1) +not (f32 >= f32) +not (f32 >= f64) +not (f32 >= i) +not (f32 >= i64) +not (f64 != 0.5) +not (f64 != 1 * 0.5) +not (f64 != 1) +not (f64 != f32) +not (f64 != f64) +not (f64 != i) +not (f64 != i32) +not (f64 != i64) +not (f64 != nil) +not (f64 < 0.5) +not (f64 < 1) +not (f64 < f32) +not (f64 < f64) +not (f64 < i) +not (f64 < i32) +not (f64 < i64) +not (f64 <= 0.5) +not (f64 <= 1) +not (f64 <= f32) +not (f64 <= f64) +not (f64 <= i32) +not (f64 <= i64) +not (f64 == 0.5) +not (f64 == 1) +not (f64 == f32) +not (f64 == f64) +not (f64 == i) +not (f64 == i32) +not (f64 == i64 - f32) +not (f64 == nil) +not (f64 > 0.5) +not (f64 > 1) +not (f64 > f32) +not (f64 > f64) +not (f64 > i) +not (f64 > i64) +not (f64 >= 0.5) +not (f64 >= 1) +not (f64 >= f32) +not (f64 >= f64) +not (f64 >= i) +not (f64 >= i32) +not (f64 >= i64) +not (false != false) +not (false != nil) +not (false != ok) +not (false != true) +not (false && ok) +not (false && true) +not (false == false) +not (false == nil) +not (false == true) +not (false and false) +not (false and true) +not (false or false) +not (false or ok) +not (false or true) +not (false || false) +not (false || ok) +not (false || true) +not (foo != foo) +not (foo != nil) +not (foo == foo) +not (foo == nil) +not (foo in list) +not (foo not in list) +not (greet != add) +not (greet != div) +not (greet != greet) +not (greet != half) +not (greet != nil) +not (greet != score) +not (greet == add) +not (greet == div) +not (greet == greet) +not (greet == half) +not (greet == nil) +not (greet == score) +not (half != add) +not (half != div) +not (half != greet) +not (half != nil) +not (half != score) +not (half == add) +not (half == div) +not (half == greet) +not (half == half) +not (half == nil) +not (half == score) +not (i != 0.5) +not (i != 1) +not (i != f32) +not (i != f64) +not (i != i) +not (i != i32) +not (i != i64) +not (i != nil) +not (i < 0.5) +not (i < 1) +not (i < f32) +not (i < f64) +not (i < i) +not (i < i32) +not (i < i64) +not (i <= 0.5) +not (i <= 1) +not (i <= f32) +not (i <= f64) +not (i <= i32) +not (i <= i64) +not (i == 0.5) +not (i == 1) +not (i == f32) +not (i == f64) +not (i == i) +not (i == i32) +not (i == nil) +not (i > 0.5) +not (i > 1) +not (i > f32) +not (i > f64) +not (i > i) +not (i > i64) +not (i >= 0.5) +not (i >= 1) +not (i >= div(1, 1)) +not (i >= f32) +not (i >= f64) +not (i >= i) +not (i >= i64) +not (i in array) +not (i not in array) +not (i32 != 0.5) +not (i32 != 1) +not (i32 != f32) +not (i32 != f64) +not (i32 != i) +not (i32 != i64) +not (i32 != nil) +not (i32 < 0.5) +not (i32 < 1) +not (i32 < f64) +not (i32 < i) +not (i32 < i32) +not (i32 < i64) +not (i32 <= 0.5) +not (i32 <= 1) +not (i32 <= f32) +not (i32 <= f64) +not (i32 <= i) +not (i32 <= i32) +not (i32 <= i64) +not (i32 == 0.5) +not (i32 == 1) +not (i32 == f32) +not (i32 == f64) +not (i32 == i) +not (i32 == i32) +not (i32 == i64) +not (i32 == nil) +not (i32 > 0.5) +not (i32 > 1) +not (i32 > f32) +not (i32 > f64) +not (i32 > i) +not (i32 > i32) +not (i32 > i64) +not (i32 >= 0.5) +not (i32 >= 1) +not (i32 >= f32) +not (i32 >= f64) +not (i32 >= i) +not (i32 >= i32) +not (i32 >= i64) +not (i32 in array) +not (i64 != 0.5) +not (i64 != 1) +not (i64 != f32) +not (i64 != f64) +not (i64 != i) +not (i64 != i32) +not (i64 != i64) +not (i64 != nil) +not (i64 < 0.5) +not (i64 < 1) +not (i64 < f32) +not (i64 < f64) +not (i64 < i) +not (i64 < i32) +not (i64 < i64) +not (i64 < int(f64)) +not (i64 <= 0.5) +not (i64 <= 1) +not (i64 <= f32) +not (i64 <= f64) +not (i64 <= i) +not (i64 <= i64) +not (i64 == 0.5) +not (i64 == 1) +not (i64 == f32) +not (i64 == f64) +not (i64 == i) +not (i64 == i32) +not (i64 == i64) +not (i64 == nil) +not (i64 > 0.5) +not (i64 > 1) +not (i64 > f64) +not (i64 > i) +not (i64 > i32) +not (i64 > i64) +not (i64 >= 0.5) +not (i64 >= 1) +not (i64 >= f32) +not (i64 >= f64) +not (i64 >= i) +not (i64 >= i32) +not (i64 >= max(i)) +not (i64 in array) +not (i64 not in array) +not (list != array) +not (list != list) +not (list != nil) +not (list == array) +not (list == list) +not (list == nil) +not (nil != "bar") +not (nil != "foo") +not (nil != 0.5) +not (nil != 1) +not (nil != add) +not (nil != array) +not (nil != div) +not (nil != f32) +not (nil != f64) +not (nil != false) +not (nil != foo) +not (nil != greet) +not (nil != half) +not (nil != i) +not (nil != i32) +not (nil != i64) +not (nil != list) +not (nil != nil) +not (nil != ok) +not (nil != score) +not (nil != true) +not (nil == "bar") +not (nil == "foo") +not (nil == 0.5) +not (nil == 1) +not (nil == add) +not (nil == array) +not (nil == div) +not (nil == f32) +not (nil == f64) +not (nil == false) +not (nil == foo) +not (nil == greet) +not (nil == half) +not (nil == i) +not (nil == i32) +not (nil == i64) +not (nil == list) +not (nil == nil) +not (nil == ok) +not (nil == score) +not (nil == true) +not (nil in array) +not (nil in list) +not (nil not in array) +not (nil not in list) +not (ok != false) +not (ok != nil) +not (ok != ok) +not (ok != true) +not (ok && false) +not (ok && ok) +not (ok && true) +not (ok == false) +not (ok == nil) +not (ok == ok) +not (ok == true) +not (ok and false) +not (ok and ok) +not (ok and true) +not (ok or false) +not (ok or ok) +not (ok or true) +not (ok || ok) +not (ok || true) +not (score != add) +not (score != div) +not (score != greet) +not (score != half) +not (score != nil) +not (score != score) +not (score == add) +not (score == div) +not (score == greet) +not (score == half) +not (score == nil) +not (score == score) +not (true != false) +not (true != nil) +not (true != ok) +not (true != true) +not (true && ok) +not (true && true) +not (true == nil) +not (true == ok) +not (true == true) +not (true and false) +not (true and ok) +not (true and true) +not (true or false) +not (true or ok) +not (true || false) +not all(array, ok) +not all(array, true) +not all(list, false) +not all(list, ok) +not all(list, true) +not any(array, false) +not any(array, ok) +not any(array, true) +not any(list, # != #) +not any(list, false) +not any(list, ok) +not any(list, true) +not false && ok +not false && ok ? list : array +not false ? "bar" : 0.5 +not false ? "bar" : foo +not false ? "foo" : 0.5 +not false ? 0.5 : greet +not false ? 1 : div +not false ? 1 : i32 +not false ? add : i +not false ? array : "foo" +not false ? array : array +not false ? array : greet +not false ? array : ok +not false ? div : greet +not false ? foo : 1 +not false ? foo : array +not false ? greet : ok +not false ? half : 0.5 +not false ? half : i32 +not false ? i : i64 +not false ? i : score +not false ? i32 : 0.5 +not false ? i32 : add +not false ? i32 : f32 +not false ? i32 : true +not false ? i64 : list +not false ? list : i32 +not false ? nil : greet +not false ? nil : i32 +not false ? nil : nil +not false ? ok : "bar" +not false ? ok : 1 +not false ? ok : list +not false ? score : "foo" +not false ? score : array +not false ? score : score +not false ? score : true +not false ? true : 0.5 +not false ? true : 1 +not false ? true : nil +not false or "foo" > "bar" +not none(array, # == #) +not none(array, false) +not none(array, ok) +not none(array, true) +not none(list, false) +not none(list, ok) +not none(list, true) +not not ("bar" >= "foo") +not not (1 < i) +not not (add == nil) +not not (half == nil) +not not false +not not ok +not not true +not ok +not ok && ok +not ok == ok +not ok ? "bar" : 1 +not ok ? "bar" : f32 +not ok ? 0.5 + f64 : half +not ok ? 0.5 : "foo" +not ok ? 0.5 : 0.5 +not ok ? 0.5 : div +not ok ? 0.5 : f32 +not ok ? 0.5 : greet +not ok ? 1 : 1 +not ok ? add : 0.5 +not ok ? array : f64 +not ok ? array : true +not ok ? div : 1 +not ok ? div : add +not ok ? f32 : div +not ok ? f64 : 1 +not ok ? f64 : half +not ok ? false : f32 +not ok ? false : i +not ok ? false : true +not ok ? foo : add +not ok ? foo : false +not ok ? foo : i64 +not ok ? greet : add +not ok ? half : true +not ok ? i : div +not ok ? i : true +not ok ? i32 : nil +not ok ? i64 : add +not ok ? nil : 0.5 +not ok ? nil : div +not ok ? nil : foo +not ok ? nil : half +not ok ? nil : i +not ok ? score : div +not ok ? score : i +not ok ? score : true +not ok ? true : f32 +not ok ? true : false +not ok ? true : score +not ok and not ok +not ok or ok +not ok or one(array, true) +not ok || ok +not ok || true ? 0.5 : 1 +not one(array, # > f32) +not one(array, false) +not one(array, ok) +not one(array, true) +not one(list, false) +not one(list, ok) +not one(list, true) +not true && i32 <= i32 +not true ? "foo" : i +not true ? 1 : i64 +not true ? add : add +not true ? add : foo +not true ? array : 1 +not true ? array : add +not true ? array : array +not true ? array : i32 +not true ? array : i64 +not true ? div : nil +not true ? f64 : i64 +not true ? foo : foo +not true ? greet : "bar" +not true ? greet : add +not true ? greet : foo +not true ? greet : i32 +not true ? half : half +not true ? i : 1 +not true ? i : i +not true ? i32 : 0.5 +not true ? i64 : 1 +not true ? list : "bar" +not true ? list : 0.5 +not true ? list : 1 +not true ? list : array +not true ? list : type(add) +not true ? nil : list +not true ? score : 1 +not true ? score : list +not true ? score : true +not true || ok +ok +ok != !ok +ok != !true +ok != false != ok +ok != false ? 1 : i +ok != nil == nil +ok != none(list, ok) +ok != not !ok +ok != not ok +ok != ok +ok != ok || ok +ok && !ok ? f32 : 0.5 +ok && !true +ok && "bar" >= "bar" +ok && "foo" <= "bar" +ok && 0.5 != nil +ok && 0.5 == 0.5 +ok && 0.5 >= f32 +ok && 1 != f64 +ok && 1 != i32 +ok && 1 < 1 +ok && 1 <= 0.5 +ok && 1 == f64 +ok && 1 >= f32 +ok && div == half +ok && f32 != 0.5 +ok && f32 < 0.5 +ok && f32 == f32 +ok && f32 == i64 +ok && f64 < 1 +ok && f64 < i32 +ok && f64 == i32 +ok && f64 >= i32 +ok && false == false +ok && i != i +ok && i32 != 0.5 +ok && i32 < f32 +ok && i32 <= i64 +ok && i32 == 1 +ok && i32 >= 1 +ok && i64 < i32 +ok && i64 <= i32 +ok && i64 > 1 +ok && list != array +ok && nil != f64 +ok && nil == add +ok && nil == i32 +ok && nil == true +ok && ok +ok && score != add +ok && true != ok +ok && true == nil +ok == !false +ok == !ok +ok == (false or true) +ok == (ok and ok) +ok == any(list, ok) +ok == false == nil +ok == nil ? false : add +ok == nil ? score : array +ok == not false +ok == not true +ok == ok +ok ? "bar" : i == f32 +ok ? "bar" : i32 < i32 +ok ? "foo" : foo.String +ok ? -0.5 : foo +ok ? -f32 : i64 + 1 +ok ? -f64 : score +ok ? -i64 : ok +ok ? 0.5 * array[i64] : greet +ok ? 0.5 : f64 < i64 +ok ? 0.5 : half != add +ok ? 0.5 : i .. i +ok ? 0.5 < i32 : score +ok ? 0.5 == 0.5 : half +ok ? 1 : 1 + i64 + i32 +ok ? 1 : foo.Bar +ok ? 1 : foo.String +ok ? add : add +ok ? add : array +ok ? add : div +ok ? add : f32 +ok ? add : greet +ok ? add : i +ok ? add : i32 +ok ? add : i64 +ok ? add : list +ok ? add : ok +ok ? array : div +ok ? array : f64 +ok ? array : float(i32) +ok ? array : foo +ok ? array : foo?.Bar +ok ? array : i32 +ok ? array : i64 +ok ? array : list +ok ? array : ok in map(array, ok) +ok ? div : div +ok ? div : f32 +ok ? div : f64 +ok ? div : foo?.String +ok ? div : greet +ok ? div : half +ok ? div : half(1) +ok ? div : i32 +ok ? div : i64 +ok ? div : list +ok ? div : list == array +ok ? div : score +ok ? div : score(i) +ok ? f32 : add +ok ? f32 : array +ok ? f32 : div +ok ? f32 : f32 +ok ? f32 : f64 +ok ? f32 : foo +ok ? f32 : foo?.Bar +ok ? f32 : half +ok ? f32 : i != i64 +ok ? f32 : i32 +ok ? f64 : array +ok ? f64 : greet +ok ? f64 : half +ok ? f64 : i64 +ok ? f64 : score +ok ? false : foo?.String() +ok ? foo : add +ok ? foo : foo +ok ? foo : foo?.Bar +ok ? foo : greet +ok ? foo : i +ok ? foo : i == i32 +ok ? foo : i32 +ok ? foo : i64 +ok ? foo : i64 ^ f32 +ok ? foo : list +ok ? get(array, i32) : ok +ok ? greet : add +ok ? greet : div +ok ? greet : f64 == i64 +ok ? greet : greet +ok ? greet : half +ok ? greet : i / i32 +ok ? greet : i32 +ok ? greet : i64 % i64 +ok ? greet : list +ok ? greet : type(f64) +ok ? half : 0.5 ^ i32 +ok ? half : add +ok ? half : array +ok ? half : div +ok ? half : f32 == f64 +ok ? half : f64 +ok ? half : f64 <= i +ok ? half : foo +ok ? half : foo?.Bar +ok ? half : greet +ok ? half : half +ok ? half : i +ok ? half : i32 +ok ? half : list +ok ? half : ok +ok ? half : type(add) +ok ? i : -i32 +ok ? i : 0.5 * i64 +ok ? i : 1 ** f64 +ok ? i : array +ok ? i : div +ok ? i : f32 +ok ? i : f64 +ok ? i : foo.Bar +ok ? i : i +ok ? i : i32 +ok ? i : ok +ok ? i : score +ok ? i32 + f32 : half +ok ? i32 : -i32 +ok ? i32 : 1 not in array +ok ? i32 : add +ok ? i32 : array +ok ? i32 : f32 +ok ? i32 : foo.Qux +ok ? i32 : foo?.Qux +ok ? i32 : half +ok ? i32 : i +ok ? i32 : i32 +ok ? i32 : list +ok ? i32 : ok +ok ? i32 >= f64 : f32 +ok ? i64 : array +ok ? i64 : div +ok ? i64 : f32 +ok ? i64 : f64 +ok ? i64 : half +ok ? i64 : i32 +ok ? i64 : i64 +ok ? i64 : ok +ok ? int(1) : div +ok ? list : -1 +ok ? list : add +ok ? list : array +ok ? list : div +ok ? list : f32 +ok ? list : i32 +ok ? list : i64 +ok ? list : list +ok ? list : nil in array +ok ? list : ok +ok ? list : score +ok ? lower("foo") : f32 +ok ? map(array, #) : duration("foo") +ok ? map(list, #) : score +ok ? min(f32) : score +ok ? min(i) : score +ok ? nil : foo?.Bar +ok ? ok : -f32 +ok ? ok : 0.5 + i +ok ? ok : array +ok ? ok : f64 +ok ? ok : foo +ok ? ok : greet +ok ? ok : i64 +ok ? ok : list +ok ? ok : score +ok ? score : add +ok ? score : array +ok ? score : f32 +ok ? score : foo.String +ok ? score : foo?.String +ok ? score : greet +ok ? score : half +ok ? score : half("bar") +ok ? score : i +ok ? score : i32 +ok ? score : list +ok ? score : nil != div +ok ? score : ok +ok ? score : score +ok ? string(half) : array +ok ? toJSON("foo") : i32 +ok ? true : foo?.Qux +ok and !ok +ok and "bar" not endsWith foo?.Bar +ok and "foo" endsWith "foo" +ok and 0.5 <= f32 +ok and 0.5 > f64 +ok and 0.5 >= f64 +ok and 1 != 1 +ok and 1 != nil +ok and 1 < i64 +ok and 1 == 1 +ok and add == add +ok and any(list, false) +ok and f32 >= 1 +ok and f64 != i +ok and f64 != nil +ok and f64 > 1 +ok and false != true +ok and i > i32 +ok and i >= f64 +ok and i >= i64 +ok and i32 != nil +ok and i32 == 0.5 +ok and i32 >= f64 +ok and i64 != nil +ok and i64 <= i +ok and i64 > 1 +ok and list == list +ok and nil != i +ok and nil != true +ok and none(list, ok) +ok and not ok +ok and not true +ok and ok +ok not in sort(array) +ok or !false +ok or !ok +ok or !true +ok or "bar" < "bar" +ok or "foo" != nil +ok or 0.5 != i32 +ok or 0.5 != i64 +ok or 0.5 <= 0.5 +ok or 0.5 == 1 +ok or 0.5 >= i +ok or 1 != i32 +ok or 1 >= 0.5 +ok or f64 < f32 +ok or f64 < i64 +ok or fromJSON("bar") +ok or greet != add +ok or half == nil +ok or half == score +ok or i != 0.5 +ok or i < 1 +ok or i32 < 0.5 +ok or i32 == f64 +ok or i32 > 0.5 +ok or i64 != f32 +ok or i64 == 1 +ok or list == array +ok or nil != 0.5 +ok or not false +ok or not ok +ok or not true +ok or ok +ok or ok || false +ok or one(array, true) +ok || "bar" not contains string(true) +ok || 0.5 < i32 +ok || 0.5 <= 0.5 +ok || 0.5 == i64 +ok || 1 != 0.5 +ok || 1 != 1 +ok || 1 != nil +ok || 1 < 0.5 +ok || 1 <= 1 +ok || add != score +ok || all(array, ok) +ok || div == nil +ok || f32 <= 0.5 +ok || f32 <= 1 +ok || f32 > i64 +ok || f32 >= f64 +ok || false && ok +ok || i != f64 +ok || i <= 0.5 +ok || i32 != 0.5 +ok || i32 < 0.5 +ok || i32 > 1 +ok || i64 > 0.5 +ok || ok +ok || score != score +ok || toJSON(f64) > trimSuffix("bar") +one([1], ok) +one([i32], i32 >= #) +one([score, greet], # == #) +one([score], ok) +one(array, "bar" matches "foo") +one(array, "bar" not in foo) +one(array, "foo" != "foo") +one(array, "foo" > "foo") +one(array, # != #) +one(array, # != 0.5) +one(array, # != f64) +one(array, # != i32) +one(array, # != nil) +one(array, # % # <= #) +one(array, # < #) +one(array, # < 0.5) +one(array, # < 1) +one(array, # < f32) +one(array, # < f64) +one(array, # < i) +one(array, # < i32) +one(array, # <= #) +one(array, # <= f32) +one(array, # <= f64) +one(array, # <= i) +one(array, # <= i32) +one(array, # == #) +one(array, # == 0.5) +one(array, # == 1) +one(array, # == f64) +one(array, # == i) +one(array, # == i32) +one(array, # == i64) +one(array, # > #) +one(array, # > f64) +one(array, # > i32) +one(array, # > i64) +one(array, # >= #) +one(array, # >= 0.5) +one(array, # >= 1) +one(array, # >= f32) +one(array, # >= i) +one(array, # >= i32) +one(array, # in array) +one(array, 0.5 != #) +one(array, 0.5 < #) +one(array, 0.5 <= #) +one(array, 0.5 == #) +one(array, 0.5 > #) +one(array, 0.5 > f32) +one(array, 0.5 >= #) +one(array, 1 != #) +one(array, 1 < 0.5) +one(array, 1 < i) +one(array, 1 <= #) +one(array, 1 <= 0.5) +one(array, 1 == #) +one(array, 1 == i32) +one(array, 1 > #) +one(array, 1 >= #) +one(array, 1 >= f32) +one(array, f32 < 1) +one(array, f32 <= #) +one(array, f32 <= i64) +one(array, f32 == #) +one(array, f32 == 0.5) +one(array, f32 == 1) +one(array, f32 >= #) +one(array, f64 != #) +one(array, f64 != 1) +one(array, f64 != i) +one(array, f64 != nil) +one(array, f64 == #) +one(array, f64 > #) +one(array, false == nil) +one(array, greet == score) +one(array, i != 0.5) +one(array, i < i32) +one(array, i <= #) +one(array, i == #) +one(array, i > f64) +one(array, i >= #) +one(array, i >= f32) +one(array, i32 != #) +one(array, i32 <= #) +one(array, i32 == #) +one(array, i32 == i) +one(array, i32 > #) +one(array, i64 <= #) +one(array, i64 == #) +one(array, i64 > #) +one(array, i64 > 1) +one(array, nil != #) +one(array, nil != foo) +one(array, nil == i64) +one(array, not ok) +one(array, not true) +one(array, ok && true) +one(array, ok) +one(array, one(array, false)) +one(array, score != greet) +one(array, score == div) +one(array, true || ok) +one(array, true || true) +one(filter(list, true), ok) +one(i32 .. i32, ok) +one(i32 .. i64, # >= #) +one(list, !ok) +one(list, !true) +one(list, "bar" not in #) +one(list, "foo" != "bar") +one(list, "foo" < "foo") +one(list, "foo" not in #) +one(list, # != #) +one(list, # != nil) +one(list, # == #) +one(list, # == foo) +one(list, # == nil) +one(list, # in list) +one(list, 0.5 != f32) +one(list, 0.5 > 0.5) +one(list, 1 < 1) +one(list, any(array, true)) +one(list, any(list, ok)) +one(list, any(list, true)) +one(list, f32 == 0.5) +one(list, f32 == f64) +one(list, f32 > f32) +one(list, f64 != nil) +one(list, f64 == f32) +one(list, f64 >= 0.5) +one(list, f64 >= 1) +one(list, foo == #) +one(list, greet != nil) +one(list, greet == score) +one(list, half != add) +one(list, i != nil) +one(list, i == i64) +one(list, i64 != f32) +one(list, i64 < 1) +one(list, i64 <= 0.5) +one(list, i64 > 0.5) +one(list, i64 > 1) +one(list, list != nil) +one(list, nil != nil) +one(list, nil != score) +one(list, nil == #) +one(list, none(array, ok)) +one(list, none(list, ok)) +one(list, not false) +one(list, not ok) +one(list, not true) +one(list, ok) +one(list, ok) and ok +one(list, one(list, ok)) +one(list, score == half) +one(list, true) && ok ? i : i64 +one(map(array, "foo"), # matches #) +one(map(array, #), # != #) +one(map(array, #), # < #) +one(map(array, #), # <= #) +one(map(array, #), # > #) +one(map(array, #), # > 1) +one(map(array, #), f64 <= 0.5) +one(map(array, #), ok) +one(map(array, div), # == nil) +one(map(array, i64), ok) +one(map(array, true), #) +one(map(list, "bar"), ok) +one(map(list, #), nil != #) +one(map(list, 1), # < 0.5) +one(map(list, f64), # <= #) +one(map(list, false), #) +one(map(list, i), ok) +one(map(list, list), ok) +one(map(list, ok), #) +repeat(toJSON(nil), i) +score +score != add +score != add != true +score != add ? i64 : "foo" +score != div +score != div ? i : f32 +score != div and ok +score != foo.Qux +score != foo.String +score != foo?.Qux +score != foo?.String +score != greet +score != greet ? score : array +score != half +score != score +score != score ? 1 : i +score == add +score == add == false +score == add ? f64 : not false +score == div +score == div || foo == foo +score == foo.Qux +score == foo.String +score == foo?.Qux +score == foo?.String +score == greet +score == greet ? half : f64 +score == greet and ok +score == half +score == score +score == score ? 0.5 : foo +score == score ? nil : i32 +score == score or ok +score == {"bar": 0.5}.f32 +score(-1) +score(-i) +score(-i, i) +score(1 % 1) +score(1 % i) +score(1 % i32) +score(1 % i64) +score(1 * 1) +score(1 * 1, i) +score(1 * i) +score(1 * i32) +score(1 * i64) +score(1 + 1) +score(1 + i) +score(1 + i32) +score(1 + i64) +score(1 - 1) +score(1 - i) +score(1 - i32) +score(1 - i64) +score(1) != -0.5 +score(1) != f32 +score(1) != float(f64) +score(1) != i +score(1) % i32 +score(1) * f32 +score(1) * f64 +score(1) * i64 +score(1) ** -1 +score(1) ** f32 +score(1) ** i64 +score(1) + f32 +score(1) + f64 +score(1) - f32 +score(1) - i +score(1) .. i64 +score(1) / f64 +score(1) / i +score(1) / i32 +score(1) / i64 +score(1) < i32 +score(1) < i64 +score(1) <= i32 +score(1) <= i64 +score(1) == 1 ^ 1 +score(1) == f64 +score(1) == i ** f64 +score(1) == i32 +score(1) == i64 +score(1) > i64 +score(1) >= f32 +score(1) >= f64 +score(1) >= i +score(1) >= i32 +score(1) >= i64 +score(1) ^ f32 +score(1) ^ f64 +score(1) ^ i +score(1) in array +score(1, i) > f32 +score(abs(1)) +score(abs(i)) +score(add(1, 1)) +score(add(1, i)) +score(array[1]) +score(array[i32]) +score(array[i64]) +score(array[i]) +score(count(array, f64 < 1)) +score(count(array, false)) +score(count(array, ok)) +score(count(array, true)) +score(count(list, false)) +score(count(list, ok)) +score(count(list, true)) +score(div(1, 1)) +score(div(i, 1)) +score(false ? true : i) +score(find(array, ok)) +score(findIndex(array, ok)) +score(findIndex(array, true)) +score(findIndex(list, ok)) +score(findIndex(list, true)) +score(findLast(array, 0.5 != #)) +score(findLast(array, ok)) +score(findLastIndex(array, ok)) +score(findLastIndex(array, true)) +score(findLastIndex(list, ok)) +score(findLastIndex(list, true)) +score(first(array)) +score(get(array, 1)) +score(get(array, i)) +score(get(array, i32)) +score(get(array, i64)) +score(i % i) +score(i % i32) +score(i * 1) +score(i * i32) +score(i * i64) +score(i + 1) +score(i + i) +score(i + i32) +score(i + i64) +score(i - 1) +score(i - i) +score(i - i32) +score(i - i64) +score(i) +score(i) != 1 == true +score(i) != float(i32) +score(i) != i +score(i) != i32 +score(i) % i32 % i64 +score(i) % i64 +score(i) * f64 +score(i) * i32 +score(i) * i64 +score(i) ** f64 +score(i) ** i32 +score(i) + f32 +score(i) + i +score(i) + i32 +score(i) + i64 +score(i) - f32 +score(i) - i +score(i) - i32 +score(i) / f32 +score(i) / i +score(i) < f32 +score(i) < i32 +score(i) <= f32 - f32 +score(i) == f32 +score(i) == i32 +score(i) == i64 +score(i) >= f32 +score(i) ^ f64 +score(i) ^ i +score(i, i + i) +score(i, i) +score(i, i) >= i +score(i, int(i64)) +score(i, score(i)) - i32 +score(i32 % i) +score(i32 % i64) +score(i32 * 1) +score(i32 * i) +score(i32 + i) +score(i32 + i64) +score(i32 - 1) +score(i32 - i) +score(i64 % 1) +score(i64 % i) +score(i64 * 1) +score(i64 * i) +score(i64 * i32) +score(i64 + 1) +score(i64 - 1) +score(i64 - i) +score(i64 - i32) +score(int(0.5)) +score(int(1)) +score(int(f32 * i)) +score(int(f32)) +score(int(f64)) +score(int(i)) +score(int(i32)) +score(int(i64)) +score(last(array)) +score(len("bar")) +score(len("foo")) +score(len(array)) +score(len(i32 .. i64)) +score(len(list)) +score(max(1)) +score(max(1, 1)) +score(max(i)) +score(max(i, 1)) +score(min(1)) +score(min(1, i64)) +score(min(i)) +score(score(1)) +score(score(1, 1)) +score(score(i)) +score(score(i32 % 1)) +score(true ? 1 : true) +score(true ? i : i64) +sort(1 .. 1) +sort(1 .. i64) +sort([0.5]) +sort([1]) +sort([i32]) +sort([i64]) +sort([nil]) +sort(array) +sort(array) != list +sort(false ? i64 : array) +sort(filter(array, false)) +sort(filter(array, true)) +sort(filter(list, false)) +sort(i .. 1) +sort(i .. i64) +sort(i32 .. 1) +sort(i32 .. i32) +sort(map(array, "bar")) +sort(map(array, "foo")) +sort(map(array, #)) +sort(map(array, 1)) +sort(map(array, i32)) +sort(map(list, "foo")) != list +sort(map(list, i)) +sort(sort(array)) +string(!(i <= f32)) +string(!false) +string(!ok) +string(!true) +string("bar" != "bar") +string("bar" < "bar") +string("bar" == "bar") +string("bar" > "bar") +string("bar" contains "foo") +string("bar" endsWith "bar") +string("bar" not endsWith "bar") +string("bar" not matches "foo") +string("bar" not startsWith "foo") +string("bar" startsWith "bar") +string("bar") >= type(score) +string("bar") endsWith "foo" + "foo" +string("bar") in foo +string("foo" != nil) +string("foo" <= "foo") +string("foo" >= "bar") +string("foo" matches "foo") +string("foo" not endsWith "foo") +string("foo" not in foo) +string("foo" not matches "foo") +string("foo" startsWith "bar") +string(-(0.5 + f64)) +string(-0.5) +string(-1) +string(-f32) +string(-f64) +string(-i) +string(-i32) +string(-i64) +string(0.5 != 0.5) +string(0.5 != 1) +string(0.5 != f32) +string(0.5 != f64) +string(0.5 != i) +string(0.5 != nil) +string(0.5 * 0.5) +string(0.5 * f32) +string(0.5 * i) +string(0.5 * i32) +string(0.5 ** 0.5) +string(0.5 ** 1) +string(0.5 ** i32) +string(0.5 ** i64) +string(0.5 + 0.5) +string(0.5 + 1) +string(0.5 + f32) +string(0.5 + f64) +string(0.5 + i64) +string(0.5 - 0.5) +string(0.5 - 1) +string(0.5 / 0.5) +string(0.5 / f64) +string(0.5 / i) +string(0.5 < 1) +string(0.5 < f32) +string(0.5 < i) +string(0.5 < i32) +string(0.5 <= f64) +string(0.5 <= i) +string(0.5 <= i64) +string(0.5 == 0.5) +string(0.5 == 1) +string(0.5 == f32) +string(0.5 == f64) +string(0.5 == i) +string(0.5 == i32) +string(0.5 == i64) +string(0.5 == nil) +string(0.5 > 0.5) +string(0.5 > 1) +string(0.5 > i64) +string(0.5 >= 0.5) +string(0.5 >= 1) +string(0.5 >= f32) +string(0.5 >= f64) +string(0.5 >= i) +string(0.5 >= i32) +string(0.5 ^ 0.5) +string(0.5 ^ 1) +string(0.5 ^ f32) +string(0.5 ^ i) +string(0.5 ^ i32) +string(0.5) not endsWith type(1) +string(1 != 1) +string(1 != f32) +string(1 != f64) +string(1 != i) +string(1 != i32) +string(1 != nil) +string(1 % 1) +string(1 % i) +string(1 % i32) +string(1 % i64) +string(1 * 1) +string(1 * i) +string(1 * i64) +string(1 ** 0.5) +string(1 ** 1) +string(1 ** f64) +string(1 ** i) +string(1 ** i32) +string(1 + 0.5) +string(1 + f32) +string(1 + f64) +string(1 + i64) +string(1 - f32) +string(1 - i) +string(1 - i64) +string(1 .. 1) +string(1 .. i) +string(1 .. i32) +string(1 / 0.5) +string(1 / 1) +string(1 / f32) +string(1 / i) +string(1 < i) +string(1 < i32) +string(1 < i64) +string(1 <= 0.5) +string(1 <= 1) +string(1 <= f32) +string(1 <= f64) +string(1 <= i32) +string(1 == 0.5) +string(1 == 1) +string(1 == f64) +string(1 == i) +string(1 == i64) +string(1 == nil) +string(1 > 1) +string(1 > f32) +string(1 >= 0.5) +string(1 >= 1) +string(1 >= f32) +string(1 >= f64) +string(1 >= i) +string(1 >= i32) +string(1 >= i64) +string(1 ^ 1) +string(1 ^ f32) +string(1 ^ f64) +string(1 ^ i) +string(1 ^ i32) +string(1 ^ i64) +string(1 in array) +string(1 not in array) +string(1)[i64:i64] +string([0.5, f32]) +string([add]) +string([f32]) +string([greet]) +string([i32, half]) +string([i32]) +string([i]) +string([ok]) +string([score]) +string(abs(0.5)) +string(abs(1)) +string(abs(f32)) +string(abs(f64)) +string(abs(half(0.5))) +string(abs(i)) +string(abs(i64)) +string(add != add) +string(add != half) +string(add != nil) +string(add != score) +string(add == greet) +string(add) +string(add) contains type(list) +string(add) not in foo +string(all(array, false)) +string(all(array, true)) +string(any(array, false)) +string(any(list, true)) +string(array != array) +string(array == nil) +string(array) +string(array) not in foo +string(array[1:i]) +string(array[1]) +string(array[i64]) +string(count(array, # <= #)) +string(count(array, ok)) +string(div != greet) +string(div != nil) +string(div == nil) +string(div == score) +string(div) +string(f32 != 0.5) +string(f32 != 1) +string(f32 != f32) +string(f32 != f64) +string(f32 != nil) +string(f32 * 0.5) +string(f32 * f64) +string(f32 * i) +string(f32 * i32) +string(f32 ** 1) +string(f32 ** i64) +string(f32 + 1) +string(f32 + f32) +string(f32 - i) +string(f32 / 1) +string(f32 / i) +string(f32 / i64) +string(f32 < 0.5) +string(f32 < f64) +string(f32 < i32) +string(f32 <= 0.5) +string(f32 <= 1) +string(f32 <= f32) +string(f32 <= i) +string(f32 <= i32) +string(f32 == 0.5) +string(f32 == 1) +string(f32 == i64) +string(f32 == nil) +string(f32 > 1) +string(f32 > f32) +string(f32 > f64) +string(f32 > i) +string(f32 > i32) +string(f32 >= 0.5) +string(f32 >= f32) +string(f32 >= f64) +string(f32 >= i32) +string(f32 ^ 1) +string(f32 ^ f32) +string(f32 ^ f64) +string(f32 ^ i) +string(f32 ^ i64) +string(f32) +string(f32) matches trim("bar") +string(f64 != 1) +string(f64 != f32) +string(f64 * 0.5) +string(f64 * 1) +string(f64 * f32) +string(f64 * f64) +string(f64 * i) +string(f64 ** 0.5) +string(f64 ** 1) +string(f64 ** f64) +string(f64 ** i32) +string(f64 + 0.5) +string(f64 + 1) +string(f64 + f32) +string(f64 + i) +string(f64 + i32) +string(f64 + i64) +string(f64 - 0.5) +string(f64 - f64) +string(f64 - i32) +string(f64 / 0.5) +string(f64 / f64) +string(f64 / i64) +string(f64 < 1) +string(f64 < f64) +string(f64 < i32) +string(f64 <= f64) +string(f64 <= i) +string(f64 == 0.5) +string(f64 == 1) +string(f64 == f32) +string(f64 == f64) +string(f64 == i) +string(f64 == i32) +string(f64 == i64) +string(f64 > 0.5) +string(f64 > 1) +string(f64 > f32) +string(f64 > f64) +string(f64 > i64) +string(f64 >= 1) +string(f64 >= f32) +string(f64 >= i) +string(f64 >= i64) +string(f64 ^ 0.5) +string(f64 ^ i) +string(f64 ^ i32) +string(f64 ^ i64) +string(f64) +string(false && false) +string(false ? 0.5 : i32) +string(false ? 1 : "bar") +string(false ? 1 : f32) +string(false ? 1 : score) +string(false ? div : "foo") +string(false ? f32 : foo) +string(false and true) +string(false) <= foo.Bar +string(false) > string(add) +string(filter(list, ok)) +string(find(array, ok)) +string(findIndex(array, true)) +string(findIndex(list, ok)) +string(findLast(array, # >= #)) +string(findLast(array, false)) +string(findLast(array, ok)) +string(findLast(list, ok)) +string(findLastIndex(array, not false)) +string(findLastIndex(array, ok)) +string(findLastIndex(array, true)) +string(findLastIndex(list, false)) +string(findLastIndex(list, ok)) +string(findLastIndex(list, true)) +string(first(array)) +string(first(list)) +string(float(0.5)) +string(float(1)) +string(float(f32)) +string(float(f64)) +string(float(i)) +string(float(i64)) +string(foo != nil) +string(foo not in list) +string(foo) +string(foo.Bar) +string(foo.Qux) +string(foo.String()) +string(foo.String) +string(foo?.Bar) +string(foo?.Qux) +string(foo?.String()) +string(foo?.String) +string(get(array, 1)) +string(get(array, i)) +string(get(list, i)) +string(get(list, i64)) +string(greet != add) +string(greet != greet) +string(greet != nil) +string(greet != score) +string(greet == add) +string(greet == greet) +string(greet == half) +string(greet == nil) +string(greet == score) +string(greet("bar")) +string(greet("foo")) +string(greet) +string(greet)[i64:i] +string(half != add) +string(half != div) +string(half != half) +string(half == greet) +string(half == nil) +string(half == score) +string(half(-1)) +string(half(0.5)) +string(half(f64)) +string(half) +string(half) > toJSON(nil) +string(half) not endsWith type("foo") +string(i != 0.5) +string(i != f32) +string(i != f64) +string(i % 1) +string(i % i32) +string(i * i32) +string(i * i64) +string(i ** 1) +string(i ** f32) +string(i + 1) +string(i + i) +string(i + i32) +string(i + i64) +string(i - f32) +string(i - i64) +string(i .. 1) +string(i .. i) +string(i .. i64) +string(i / 1) +string(i / f32) +string(i / i) +string(i / i32) +string(i / i64) +string(i < 1) +string(i < f32) +string(i < i32) +string(i <= 0.5) +string(i <= 1) +string(i == 0.5) +string(i == f32) +string(i == i32) +string(i > 0.5) +string(i > 1) +string(i > f64) +string(i > i64) +string(i >= 1) +string(i >= f64) +string(i ^ 0.5) +string(i ^ 1) +string(i ^ i) +string(i in array) +string(i not in array) string(i) -trim(" a ") -trim("_a_", "_") -trimPrefix(" a", " ") -trimSuffix("a ") -upper("a") -lower("A") -split("a,b,c", ",") -replace("a,b,c", ",", "_") -repeat("a", 3) -join(["a", "b", "c"], ",") -indexOf("abc", "b") -max(1,2,3) -min(1,2,3) -toJSON(a) -fromJSON("[1,2,3]") -now() -duration("1s") -first(a) -last(a) -get(m, "a") -1..9 | filter(i > 5) | map(i * 2) -s startsWith "a" -s endsWith "c" -s contains "a" -s matches "a" -s matches "a+" -true ? 1 : 2 -false ? 1 : 2 -b ?? true -head(1) -{a: 1, b: 2} -[1, 2, 3] -type(1) -type("a") -type([1, 2, 3]) -type({a: 1, b: 2}) -type(head) -keys(m) -values(m) -foo.bar.a -foo.bar.b +string(i32 != f64) +string(i32 != i) +string(i32 != nil) +string(i32 * 0.5) +string(i32 * 1) +string(i32 * f32) +string(i32 * f64) +string(i32 * i64) +string(i32 ** 0.5) +string(i32 ** f64) +string(i32 ** i) +string(i32 + f64) +string(i32 + i32) +string(i32 - f32) +string(i32 - f64) +string(i32 .. 1) +string(i32 .. i32) +string(i32 .. i64) +string(i32 / 0.5) +string(i32 / i64) +string(i32 < 0.5) +string(i32 < f32) +string(i32 < i) +string(i32 < i32) +string(i32 < i64) +string(i32 <= f64) +string(i32 <= i64) +string(i32 == 1) +string(i32 == f32) +string(i32 == f64) +string(i32 == i) +string(i32 == nil) +string(i32 > 1) +string(i32 > f64) +string(i32 >= 0.5) +string(i32 >= 1) +string(i32 >= f64) +string(i32 >= i) +string(i32 >= i64) +string(i32 ^ 1) +string(i32 ^ f64) +string(i32 ^ i32) +string(i32 ^ i64) +string(i32 in array) +string(i32 not in array) +string(i32) +string(i32) == type("bar") +string(i64 != 0.5) +string(i64 != 1) +string(i64 != i) +string(i64 != i32) +string(i64 != i64) +string(i64 != nil) +string(i64 % 1) +string(i64 % i64) +string(i64 * 1) +string(i64 * f32) +string(i64 * i32) +string(i64 * i64) +string(i64 ** 0.5) +string(i64 ** f32) +string(i64 ** i) +string(i64 ** i32) +string(i64 + 0.5) +string(i64 + f32) +string(i64 + f64) +string(i64 + i) +string(i64 + i32) +string(i64 - f32) +string(i64 - i) +string(i64 / 0.5) +string(i64 / 1) +string(i64 / f32) +string(i64 / f64) +string(i64 / i) +string(i64 / i64) +string(i64 < 1) +string(i64 <= 0.5) +string(i64 <= f32) +string(i64 <= i) +string(i64 <= i32) +string(i64 <= i64) +string(i64 == 1) +string(i64 == i) +string(i64 == i32) +string(i64 == nil) +string(i64 > 1) +string(i64 > f32) +string(i64 > f64) +string(i64 > i) +string(i64 > i32) +string(i64 > i64) +string(i64 >= f64) +string(i64 >= i64) +string(i64 ^ 0.5) +string(i64 ^ f64) +string(i64 ^ i) +string(i64 in array) +string(i64) +string(i64) >= foo.Bar +string(i64) not in foo +string(int(0.5)) +string(int(1)) +string(int(f32 - i)) +string(int(f32)) +string(int(f64)) +string(int(i)) +string(int(i32)) +string(int(i64)) +string(last(array)) +string(last(list)) +string(len(array)) +string(len(list)) +string(len(string("foo"))) +string(list == array) +string(list == list) +string(list == nil) +string(list) +string(list) != toJSON(i64) +string(list[1]) +string(list[i64]) +string(list[i64].String) +string(lower("bar")) +string(lower("foo")) +string(map(array, "bar")) +string(map(array, #)) +string(map(array, 0.5)) +string(map(array, 1)) +string(map(array, array)) +string(map(array, div)) +string(map(array, greet)) +string(map(array, i)) +string(map(array, i32)) +string(map(array, ok)) +string(map(array, true)) +string(map(list, "bar")) +string(map(list, "foo")) +string(map(list, #)) +string(map(list, 0.5)) +string(map(list, 1)) +string(map(list, add)) +string(map(list, f32)) +string(map(list, f64)) +string(map(list, false)) +string(map(list, greet)) +string(map(list, i64)) +string(map(list, list)) +string(max(0.5)) +string(max(1)) +string(max(1, 0.5)) +string(max(1, f32)) +string(max(f32)) +string(max(f64)) +string(max(i)) +string(max(i32)) +string(max(i32, 1, i64)) +string(max(i64)) +string(min(0.5)) +string(min(0.5, f64, f32)) +string(min(1)) +string(min(f32)) +string(min(f64)) +string(min(i)) +string(min(i32)) +string(min(i32, i64)) +string(min(i64)) +string(nil != "foo") +string(nil != 0.5) +string(nil != 1) +string(nil != array) +string(nil != div) +string(nil != f64) +string(nil != false) +string(nil != greet) +string(nil != i) +string(nil != i64) +string(nil != nil) +string(nil != score) +string(nil == "foo") +string(nil == 1) +string(nil == add) +string(nil == f32) +string(nil == f64) +string(nil == false) +string(nil == list) +string(nil == ok) +string(nil == true) +string(nil in array) +string(nil in list) +string(nil) > string(1) +string(nil) >= string(greet) +string(nil) in foo +string(none(array, ok)) +string(none(list, true)) +string(not false) +string(not ok) +string(not true) +string(ok && false) +string(ok && ok) +string(ok == nil) +string(ok == true) +string(ok ? 0.5 : "foo") +string(ok ? 0.5 : true) +string(ok ? true : i32) +string(ok or false) +string(ok or ok) +string(ok || ok) +string(ok) +string(one(array, false)) +string(one(array, ok)) +string(one(array, true)) +string(one(list, true)) +string(score != nil) +string(score == div) +string(score == nil) +string(score(1)) +string(score(i)) +string(score(score(i))) +string(score) +string(score) < string(ok) +string(score) not in foo +string(sort(array)) +string(string("bar")) +string(string("foo")) +string(string(0.5)) +string(string(1)) +string(string(add)) +string(string(array)) +string(string(div)) +string(string(f64)) +string(string(false)) +string(string(foo)) +string(string(greet)) +string(string(half)) +string(string(i)) +string(string(i32)) +string(string(i64)) +string(string(list)) +string(string(nil)) +string(string(ok)) +string(string(score)) +string(string(true)) +string(toJSON("bar")) +string(toJSON("foo")) +string(toJSON(0.5)) +string(toJSON(1)) +string(toJSON(array)) +string(toJSON(f32)) +string(toJSON(f64)) +string(toJSON(false)) +string(toJSON(foo)) +string(toJSON(i)) +string(toJSON(i64)) +string(toJSON(list)) +string(toJSON(nil)) +string(toJSON(ok)) +string(toJSON(true)) +string(trim("foo")) +string(trim(toJSON(0.5))) +string(trimPrefix("bar")) +string(trimPrefix("foo")) +string(trimPrefix(type(f32))) +string(trimSuffix("bar")) +string(true != true) +string(true == nil) +string(true == ok) +string(true ? 1 : true) +string(true ? array : f32) +string(true ? div : i64) +string(true ? i32 : "foo") +string(true ? i32 : greet) +string(true ? score : 0.5) +string(true ? true : i32) +string(true and false) +string(true or true) +string(true || false) +string(true) endsWith string(i64) +string(true) not in foo +string(type("foo")) +string(type(0.5)) +string(type(1 < f64)) +string(type(1)) +string(type(add)) +string(type(array)) +string(type(div)) +string(type(f32)) +string(type(f64)) +string(type(false)) +string(type(foo)) +string(type(half)) +string(type(i)) +string(type(i32)) +string(type(i64)) +string(type(list)) +string(type(nil)) +string(type(ok)) +string(type(score(1))) +string(type(score)) +string(type(true)) +string(type(type(false))) +string(upper("bar")) +string(upper("foo")) +string({"bar": 0.5}) +string({"bar": i32, "foo": i64}) +string({"foo": f64}) +string({"foo": true}) +toBase64(foo.Bar) +toBase64(foo.String()) +toBase64(foo?.Bar) +toBase64(foo?.String()) +toBase64(greet("bar")) +toBase64(greet("foo")) +toBase64(greet(string(array))) +toBase64(lower("bar")) +toBase64(lower("foo")) +toBase64(lower(type(i32))) +toBase64(ok ? "foo" : 1) +toBase64(ok ? "foo" : foo) +toBase64(string("bar")) +toBase64(string("foo")) +toBase64(string(0.5)) +toBase64(string(1)) +toBase64(string(array)) +toBase64(string(f32 <= i32)) +toBase64(string(f32)) +toBase64(string(f64)) +toBase64(string(false)) +toBase64(string(foo)) +toBase64(string(greet)) +toBase64(string(half)) +toBase64(string(i)) +toBase64(string(i32)) +toBase64(string(i64)) +toBase64(string(list)) +toBase64(string(nil)) +toBase64(string(ok)) +toBase64(string(score)) +toBase64(string(true)) +toBase64(toBase64("bar")) +toBase64(toBase64("foo")) +toBase64(toJSON("bar")) +toBase64(toJSON("foo")) +toBase64(toJSON(0.5)) +toBase64(toJSON(1)) +toBase64(toJSON(array)) +toBase64(toJSON(f32)) +toBase64(toJSON(f64)) +toBase64(toJSON(false)) +toBase64(toJSON(foo)) +toBase64(toJSON(i)) +toBase64(toJSON(i32)) +toBase64(toJSON(i64)) +toBase64(toJSON(list)) +toBase64(toJSON(nil)) +toBase64(toJSON(ok)) +toBase64(toJSON(true)) +toBase64(trim("bar")) +toBase64(trim("foo")) +toBase64(trimPrefix("foo")) +toBase64(trimSuffix("bar")) +toBase64(trimSuffix("foo")) +toBase64(true ? "bar" : ok) +toBase64(type("bar")) +toBase64(type("foo")) +toBase64(type(0.5)) +toBase64(type(1)) +toBase64(type(add)) +toBase64(type(array)) +toBase64(type(div)) +toBase64(type(f32)) +toBase64(type(f64)) +toBase64(type(false)) +toBase64(type(foo)) +toBase64(type(get(array, i))) +toBase64(type(greet)) +toBase64(type(i)) +toBase64(type(i32)) +toBase64(type(i64)) +toBase64(type(list)) +toBase64(type(ok)) +toBase64(type(true)) +toBase64(upper("bar")) +toBase64(upper("foo")) +toBase64(upper(foo.Bar)) +toJSON(!false) +toJSON(!ok) +toJSON(!true) +toJSON("bar" != "foo") +toJSON("bar" + "bar") +toJSON("bar" + "foo") +toJSON("bar" <= "foo") +toJSON("bar" >= "foo") +toJSON("bar" contains "bar") +toJSON("bar" matches "bar") +toJSON("bar" not matches "bar") +toJSON("bar" not matches "foo") +toJSON("foo" != "bar") +toJSON("foo" + "bar") +toJSON("foo" <= "bar") +toJSON("foo" == nil) +toJSON("foo" contains "bar") +toJSON("foo" matches "foo") +toJSON("foo" not in foo) +toJSON("foo" not matches "bar") +toJSON("foo") > foo?.Bar +toJSON("foo") not in foo +toJSON(-0.5) +toJSON(-1) +toJSON(-f32) +toJSON(-f64) +toJSON(-i) +toJSON(-i32) +toJSON(-i64) +toJSON(0.5 != 0.5) +toJSON(0.5 != 1) +toJSON(0.5 != f32) +toJSON(0.5 != f64) +toJSON(0.5 != i) +toJSON(0.5 != i32) +toJSON(0.5 * 0.5) +toJSON(0.5 * i) +toJSON(0.5 * i32) +toJSON(0.5 ** f64) +toJSON(0.5 ** i) +toJSON(0.5 ** i64) +toJSON(0.5 + 0.5) +toJSON(0.5 + f32) +toJSON(0.5 - 0.5) +toJSON(0.5 - 1) +toJSON(0.5 - f32) +toJSON(0.5 - f64) +toJSON(0.5 / 0.5) +toJSON(0.5 / 1) +toJSON(0.5 / f32) +toJSON(0.5 / f64) +toJSON(0.5 / i) +toJSON(0.5 / i32) +toJSON(0.5 / i64) +toJSON(0.5 < 0.5) +toJSON(0.5 < 1) +toJSON(0.5 < f32) +toJSON(0.5 < i) +toJSON(0.5 <= 1) +toJSON(0.5 <= f32) +toJSON(0.5 <= f64) +toJSON(0.5 <= i) +toJSON(0.5 == 0.5) +toJSON(0.5 == 1) +toJSON(0.5 == f32) +toJSON(0.5 == i) +toJSON(0.5 == i64) +toJSON(0.5 > 1) +toJSON(0.5 > f32) +toJSON(0.5 > f64) +toJSON(0.5 > i32) +toJSON(0.5 >= 0.5) +toJSON(0.5 >= 1) +toJSON(0.5 >= f32) +toJSON(0.5 >= f64) +toJSON(0.5 >= i) +toJSON(0.5 >= i32) +toJSON(0.5 >= i64) +toJSON(0.5 ^ 0.5) +toJSON(0.5 ^ 1) +toJSON(0.5 ^ f32) +toJSON(0.5 ^ f64) +toJSON(0.5 ^ i) +toJSON(0.5 ^ i32) +toJSON(0.5 ^ i64) +toJSON(0.5) contains "bar" ? "bar" : array +toJSON(1 != 0.5) +toJSON(1 != f32) +toJSON(1 != nil) +toJSON(1 % 1) +toJSON(1 % i32) +toJSON(1 * 0.5) +toJSON(1 * f32) +toJSON(1 * f64) +toJSON(1 * i32) +toJSON(1 * i64) +toJSON(1 ** 0.5) +toJSON(1 ** 1) +toJSON(1 ** f32) +toJSON(1 ** f64) +toJSON(1 ** i >= f64) +toJSON(1 ** i32) +toJSON(1 + 0.5) +toJSON(1 + f32) +toJSON(1 + f64) +toJSON(1 + i64) +toJSON(1 - 0.5) +toJSON(1 - 1) +toJSON(1 - f32) +toJSON(1 - f64) +toJSON(1 - i32) +toJSON(1 .. 1) +toJSON(1 .. i) +toJSON(1 .. i64) +toJSON(1 / 0.5) +toJSON(1 / 1) +toJSON(1 / f32) +toJSON(1 / i32) +toJSON(1 < 0.5) +toJSON(1 < 1) +toJSON(1 < f32) +toJSON(1 < f64) +toJSON(1 < i) +toJSON(1 <= 0.5) +toJSON(1 <= 1) +toJSON(1 <= i) +toJSON(1 <= i32) +toJSON(1 <= i64) +toJSON(1 == 0.5) +toJSON(1 == f32) +toJSON(1 == i) +toJSON(1 == i32) +toJSON(1 == i64) +toJSON(1 == nil) +toJSON(1 > 0.5) +toJSON(1 > f64) +toJSON(1 > i) +toJSON(1 > i32) +toJSON(1 > i64) +toJSON(1 >= 0.5) +toJSON(1 >= 1) +toJSON(1 >= f32) +toJSON(1 >= i32) +toJSON(1 ^ 0.5) +toJSON(1 ^ 1) +toJSON(1 ^ f32) +toJSON(1 ^ f64) +toJSON(1 ^ i32) +toJSON(1 ^ i64) +toJSON(1 in array) +toJSON(1) == nil == true +toJSON(1) in foo +toJSON(1) not in foo +toJSON(1) startsWith foo.String() +toJSON([1]) +toJSON([i64]) +toJSON(abs(0.5)) +toJSON(abs(1)) +toJSON(abs(f32)) +toJSON(abs(f64)) +toJSON(abs(i)) +toJSON(abs(i32)) +toJSON(abs(i64)) +toJSON(add != nil) +toJSON(add != score) +toJSON(add == div) +toJSON(add == half) +toJSON(add == nil) +toJSON(add == score) +toJSON(all(list, false)) +toJSON(all(list, ok)) +toJSON(all(list, true)) +toJSON(any(array, false)) +toJSON(any(array, true)) +toJSON(array != array) +toJSON(array != nil) +toJSON(array) +toJSON(array) != toJSON(ok) +toJSON(array) > "bar" != false +toJSON(array) endsWith greet("foo") +toJSON(array) endsWith string(i32) +toJSON(array) in foo +toJSON(array) not startsWith greet("foo") +toJSON(array[1:1]) +toJSON(array[i32]) +toJSON(array[i]) +toJSON(count(array, false)) +toJSON(count(array, ok)) +toJSON(div != div) +toJSON(div != greet) +toJSON(div != score) +toJSON(div == div) +toJSON(div == half) +toJSON(div == nil) +toJSON(div == score) +toJSON(f32 != 1) +toJSON(f32 * 0.5) +toJSON(f32 * 1) +toJSON(f32 * f32) +toJSON(f32 * f64) +toJSON(f32 * i32) +toJSON(f32 ** f32) +toJSON(f32 ** i32) +toJSON(f32 ** i64) +toJSON(f32 + 1) +toJSON(f32 + i) +toJSON(f32 + i32) +toJSON(f32 - f64) +toJSON(f32 - i32) +toJSON(f32 / 0.5) +toJSON(f32 / 1) +toJSON(f32 < 0.5) +toJSON(f32 < f32) +toJSON(f32 < f64) +toJSON(f32 <= f32) +toJSON(f32 == 1) +toJSON(f32 == f64) +toJSON(f32 == i) +toJSON(f32 == nil) +toJSON(f32 > 0.5) +toJSON(f32 > f64) +toJSON(f32 > i) +toJSON(f32 >= 1) +toJSON(f32 >= f32) +toJSON(f32 ^ 0.5) +toJSON(f32 ^ 1) +toJSON(f32 ^ f64) +toJSON(f32 ^ i) +toJSON(f32 ^ i64) +toJSON(f32) +toJSON(f64 != 1) +toJSON(f64 != f32) +toJSON(f64 != f64) +toJSON(f64 != i) +toJSON(f64 != i32 / i32) +toJSON(f64 != i32) +toJSON(f64 != nil) +toJSON(f64 * 0.5) +toJSON(f64 * f64) +toJSON(f64 * i) +toJSON(f64 * i64) +toJSON(f64 ** 0.5) +toJSON(f64 ** f32) +toJSON(f64 ** i) +toJSON(f64 ** i64) +toJSON(f64 + 1) +toJSON(f64 + f32) +toJSON(f64 + i) +toJSON(f64 + i32) +toJSON(f64 - 1) +toJSON(f64 - f64) +toJSON(f64 - i) +toJSON(f64 - i32) +toJSON(f64 / 0.5) +toJSON(f64 / f32) +toJSON(f64 / i32) +toJSON(f64 < 1) +toJSON(f64 < f32) +toJSON(f64 < i32) +toJSON(f64 < i64) +toJSON(f64 <= 0.5) +toJSON(f64 <= 1) +toJSON(f64 <= i32) +toJSON(f64 == 1) +toJSON(f64 == i64) +toJSON(f64 == nil) +toJSON(f64 > 1) +toJSON(f64 > f64) +toJSON(f64 >= 0.5) +toJSON(f64 >= i64) +toJSON(f64 ^ 1) +toJSON(f64 ^ f64) +toJSON(f64 ^ i) +toJSON(f64) +toJSON(false != nil) +toJSON(false && false) +toJSON(false == false) +toJSON(false ? 0.5 : nil) +toJSON(false ? 1 : f32) +toJSON(false ? f32 : list) +toJSON(false ? false : i32) +toJSON(false ? greet : 1) +toJSON(false ? greet : i32) +toJSON(false ? nil : f64) +toJSON(false and ok) +toJSON(false and true) +toJSON(filter(array, ok)) +toJSON(filter(list, false)) +toJSON(filter(list, true)) +toJSON(find(array, false)) +toJSON(find(array, ok)) +toJSON(findIndex(array, ok)) +toJSON(findIndex(array, true)) +toJSON(findIndex(list, ok)) +toJSON(findIndex(list, true)) +toJSON(findLast(array, false)) +toJSON(findLast(list, true)) +toJSON(findLastIndex(array, true)) +toJSON(findLastIndex(list, false)) +toJSON(findLastIndex(list, ok)) +toJSON(first(array)) +toJSON(first(list)) +toJSON(float(0.5)) +toJSON(float(1)) +toJSON(float(f32)) +toJSON(float(f64)) +toJSON(float(i)) +toJSON(float(i32)) +toJSON(float(i64)) +toJSON(foo != foo) +toJSON(foo != nil) +toJSON(foo == foo) +toJSON(foo == nil) +toJSON(foo in list) +toJSON(foo) +toJSON(foo.Bar) +toJSON(foo.String()) +toJSON(foo?.Bar) +toJSON(foo?.String()) +toJSON(get(array, 1)) +toJSON(get(array, i64)) +toJSON(get(list, 1)) +toJSON(get(list, i)) +toJSON(get(list, i64)) +toJSON(greet != div) +toJSON(greet != greet) +toJSON(greet != half) +toJSON(greet == add) +toJSON(greet == div) +toJSON(greet == greet) +toJSON(greet == half) +toJSON(greet("bar")) +toJSON(greet("foo")) +toJSON(half != greet) +toJSON(half != nil) +toJSON(half != score) +toJSON(half == add) +toJSON(half == div) +toJSON(half == greet) +toJSON(half == nil) +toJSON(half == score) +toJSON(half(0.5)) +toJSON(half(f64)) +toJSON(i != 1) +toJSON(i != f32) +toJSON(i != i) +toJSON(i != i32) +toJSON(i % 1) +toJSON(i % i64) +toJSON(i * 0.5) +toJSON(i * 1) +toJSON(i * f32) +toJSON(i * i32) +toJSON(i ** 0.5) +toJSON(i ** f32) +toJSON(i ** i32) +toJSON(i + 0.5) +toJSON(i + 1) +toJSON(i + f32) +toJSON(i + f64) +toJSON(i + i) +toJSON(i - 1) +toJSON(i .. 1) +toJSON(i .. i) +toJSON(i / f32) +toJSON(i < i32) +toJSON(i < i64) +toJSON(i <= 1) +toJSON(i <= f32) +toJSON(i <= f64) +toJSON(i <= i) +toJSON(i <= i32) +toJSON(i == i32) +toJSON(i == i64) +toJSON(i == nil) +toJSON(i > 0.5) +toJSON(i > 1) +toJSON(i > f32) +toJSON(i >= 0.5) +toJSON(i >= 1) +toJSON(i >= f32) +toJSON(i >= i) +toJSON(i ^ 1) +toJSON(i ^ f64) +toJSON(i) +toJSON(i) != string(1) +toJSON(i32 != f32) +toJSON(i32 != i) +toJSON(i32 % 1) +toJSON(i32 % i64) +toJSON(i32 * i) +toJSON(i32 * i64) +toJSON(i32 ** i64) +toJSON(i32 + f64) +toJSON(i32 + i) +toJSON(i32 + i32) +toJSON(i32 + i64) +toJSON(i32 - 0.5) +toJSON(i32 - 1) +toJSON(i32 - f32) +toJSON(i32 - f64) +toJSON(i32 - i) +toJSON(i32 .. i) +toJSON(i32 .. i64) +toJSON(i32 / 0.5) +toJSON(i32 / f32) +toJSON(i32 / i) +toJSON(i32 / i64) +toJSON(i32 < 0.5) +toJSON(i32 < f32) +toJSON(i32 <= 0.5) +toJSON(i32 <= i32) +toJSON(i32 == 1) +toJSON(i32 == f32) +toJSON(i32 == i) +toJSON(i32 == nil ? i32 : i32) +toJSON(i32 == nil) +toJSON(i32 > 0.5) +toJSON(i32 > f64) +toJSON(i32 > i) +toJSON(i32 >= 0.5) +toJSON(i32 >= 1) +toJSON(i32 >= f32) +toJSON(i32 >= f64) +toJSON(i32 >= i) +toJSON(i32 ^ 1) +toJSON(i32 ^ f64) +toJSON(i32 ^ i) +toJSON(i32 in array) +toJSON(i32 not in array) +toJSON(i32) +toJSON(i32) < string(i64) +toJSON(i64 != 0.5) +toJSON(i64 != 1) +toJSON(i64 != f32) +toJSON(i64 != i) +toJSON(i64 != i32) +toJSON(i64 != nil) +toJSON(i64 % 1) +toJSON(i64 % i) +toJSON(i64 % i32) +toJSON(i64 % i64) +toJSON(i64 * i) +toJSON(i64 + 0.5) +toJSON(i64 + i) +toJSON(i64 + i64) +toJSON(i64 - 0.5) +toJSON(i64 - 1) +toJSON(i64 - i64) +toJSON(i64 .. 1) +toJSON(i64 / 1) +toJSON(i64 / f32) +toJSON(i64 / i) +toJSON(i64 / i64) +toJSON(i64 < 0.5) +toJSON(i64 < i32) +toJSON(i64 <= 0.5) +toJSON(i64 <= 1) +toJSON(i64 <= f32) +toJSON(i64 <= i64) +toJSON(i64 == 0.5) +toJSON(i64 == 1) +toJSON(i64 == i32) +toJSON(i64 == nil) +toJSON(i64 > f32) +toJSON(i64 > i) +toJSON(i64 >= 0.5) +toJSON(i64 >= 1) +toJSON(i64 >= i64) +toJSON(i64 ^ i) +toJSON(i64) +toJSON(int(0.5)) +toJSON(int(1)) +toJSON(int(f32)) +toJSON(int(f64)) +toJSON(int(i)) +toJSON(int(i32)) +toJSON(last(list)) +toJSON(len("bar")) +toJSON(len("foo")) +toJSON(len(array)) +toJSON(len(list)) +toJSON(list != list) +toJSON(list == nil) +toJSON(list) +toJSON(list) <= foo?.Bar +toJSON(list[1]) +toJSON(list[i32]) +toJSON(list[i64:1]) +toJSON(list[i64]) +toJSON(list[i]) +toJSON(lower("bar")) +toJSON(lower("foo")) +toJSON(map(array, #)) +toJSON(map(array, 0.5)) +toJSON(map(array, 1)) +toJSON(map(array, false)) +toJSON(map(array, i)) +toJSON(map(array, i32)) +toJSON(map(array, list)) +toJSON(map(array, true)) +toJSON(map(list, "foo")) +toJSON(map(list, #)) +toJSON(map(list, 1)) +toJSON(map(list, f32)) +toJSON(map(list, f64)) +toJSON(map(list, list)) +toJSON(max(0.5)) +toJSON(max(1)) +toJSON(max(f32)) +toJSON(max(f64)) +toJSON(max(i)) +toJSON(max(i32)) +toJSON(max(i64)) +toJSON(min(0.5)) +toJSON(min(0.5, f32)) +toJSON(min(1)) +toJSON(min(1, 1)) +toJSON(min(f32)) +toJSON(min(f64)) +toJSON(min(i)) +toJSON(min(i32) / f32) +toJSON(min(i32)) +toJSON(min(i64)) +toJSON(nil != "bar") +toJSON(nil != "foo") +toJSON(nil != 0.5) +toJSON(nil != add) +toJSON(nil != f32) +toJSON(nil != f64) +toJSON(nil != foo) +toJSON(nil != i32) +toJSON(nil != list) +toJSON(nil != nil) +toJSON(nil != score) +toJSON(nil != true) +toJSON(nil == 0.5) +toJSON(nil == 1) +toJSON(nil == add) +toJSON(nil == div) +toJSON(nil == f32) +toJSON(nil == f64) +toJSON(nil == false) +toJSON(nil == foo) +toJSON(nil == i) +toJSON(nil == i64) +toJSON(nil == list) +toJSON(nil == ok) +toJSON(nil == score) +toJSON(nil == true) +toJSON(nil in array) +toJSON(nil not in array) +toJSON(nil not in list) +toJSON(nil) + string("bar") +toJSON(nil) == toJSON(1) +toJSON(nil) == type(nil) +toJSON(nil) in foo +toJSON(none(array, true)) +toJSON(none(list, true)) +toJSON(not ("foo" not in foo)) +toJSON(not false) +toJSON(not ok) +toJSON(not true) +toJSON(ok != false) +toJSON(ok != nil) +toJSON(ok != ok) +toJSON(ok && true) +toJSON(ok == nil) +toJSON(ok == ok) +toJSON(ok ? 1 : half) +toJSON(ok ? f32 : div) +toJSON(ok ? false : i32) +toJSON(ok ? nil : f32) +toJSON(ok or true) +toJSON(ok || ok) +toJSON(ok) +toJSON(one(array, i32 < #)) +toJSON(score != div) +toJSON(score != greet) +toJSON(score != nil) +toJSON(score != score) +toJSON(score == add) +toJSON(score == div) +toJSON(score == nil) +toJSON(score(1)) +toJSON(score(i)) +toJSON(score(i, i)) +toJSON(string("bar")) +toJSON(string("foo")) +toJSON(string(0.5)) +toJSON(string(1)) +toJSON(string(array)) +toJSON(string(div)) +toJSON(string(f32)) +toJSON(string(f64)) +toJSON(string(false)) +toJSON(string(foo)) +toJSON(string(greet)) +toJSON(string(half)) +toJSON(string(i)) +toJSON(string(i32)) +toJSON(string(i64)) +toJSON(string(list)) +toJSON(string(nil)) +toJSON(string(ok)) +toJSON(string(score)) +toJSON(toBase64("bar")) +toJSON(toBase64("foo")) +toJSON(toJSON("bar")) +toJSON(toJSON("foo")) +toJSON(toJSON(1)) +toJSON(toJSON(array)) +toJSON(toJSON(f32)) +toJSON(toJSON(f64)) +toJSON(toJSON(false)) +toJSON(toJSON(foo)) +toJSON(toJSON(i)) +toJSON(toJSON(i32)) +toJSON(toJSON(i64)) +toJSON(toJSON(list)) +toJSON(toJSON(nil)) +toJSON(toJSON(ok)) +toJSON(toJSON(true)) +toJSON(trim("bar")) +toJSON(trim("foo")) +toJSON(trimPrefix("foo")) +toJSON(trimSuffix("foo")) +toJSON(true && true) +toJSON(true ? array : nil) +toJSON(true ? i32 : div) +toJSON(true ? list : true) +toJSON(true ? nil : array) +toJSON(true ? ok : list) +toJSON(true ? true : f64) +toJSON(true and ok) +toJSON(true) in foo +toJSON(type("bar")) +toJSON(type("foo")) +toJSON(type(0.5)) +toJSON(type(1)) +toJSON(type(add)) +toJSON(type(array)) +toJSON(type(f32)) +toJSON(type(f64)) +toJSON(type(false)) +toJSON(type(foo)) +toJSON(type(greet)) +toJSON(type(half)) +toJSON(type(i)) +toJSON(type(i32)) +toJSON(type(i64)) +toJSON(type(list)) +toJSON(type(nil)) +toJSON(type(ok)) +toJSON(type(score)) +toJSON(type(true)) +toJSON(upper("bar")) +toJSON(upper("foo")) +toJSON({"bar": 0.5, "bar": array}) +toJSON({"foo": "foo"}) +toJSON({"foo": 0.5}) +toJSON({"foo": nil}) +toJSON({"foo": ok, "bar": 0.5}) +trim("bar") in foo +trim("foo" + "foo") +trim(false ? greet : "bar") +trim(foo.Bar) +trim(foo.String()) +trim(foo?.Bar) +trim(foo?.String()) +trim(greet("bar")) +trim(greet("foo")) +trim(lower("bar")) +trim(lower(toJSON(0.5))) +trim(ok ? "bar" : i32) +trim(string("foo")) +trim(string(0.5)) +trim(string(1)) +trim(string(add)) +trim(string(div)) +trim(string(f32)) +trim(string(f64)) +trim(string(false)) +trim(string(foo)) +trim(string(greet)) +trim(string(half)) +trim(string(i)) +trim(string(i32)) +trim(string(i64)) +trim(string(list)) +trim(string(nil)) +trim(string(ok)) +trim(string(score)) +trim(string(true)) +trim(toBase64("bar")) +trim(toBase64("foo")) +trim(toJSON("foo")) +trim(toJSON(0.5)) +trim(toJSON(1)) +trim(toJSON(array)) +trim(toJSON(f32)) +trim(toJSON(f64)) +trim(toJSON(false)) +trim(toJSON(foo)) +trim(toJSON(i)) +trim(toJSON(i32)) +trim(toJSON(i64)) +trim(toJSON(list)) +trim(toJSON(nil)) +trim(toJSON(ok)) +trim(toJSON(true)) +trim(trim("bar")) +trim(trimPrefix("bar")) +trim(trimPrefix("foo")) +trim(trimPrefix(string(i))) +trim(trimSuffix("bar")) +trim(trimSuffix("foo")) +trim(type("foo")) +trim(type(0.5)) +trim(type(1)) +trim(type(add)) +trim(type(array)) +trim(type(div)) +trim(type(f32)) +trim(type(f64)) +trim(type(false)) +trim(type(foo)) +trim(type(greet)) +trim(type(half)) +trim(type(i)) +trim(type(i32)) +trim(type(i64)) +trim(type(list)) +trim(type(nil != list)) +trim(type(nil)) +trim(type(ok)) +trim(type(score)) +trim(type(toJSON(1))) +trim(type(true)) +trim(upper("bar")) +trimPrefix("foo" + "foo") +trimPrefix(foo.Bar) +trimPrefix(foo.String()) +trimPrefix(foo?.Bar) +trimPrefix(foo?.String()) +trimPrefix(greet("bar")) +trimPrefix(greet("foo")) +trimPrefix(greet(foo.String())) +trimPrefix(lower("bar")) +trimPrefix(lower("foo")) +trimPrefix(ok ? "bar" : i64) +trimPrefix(string("foo")) +trimPrefix(string(0.5)) +trimPrefix(string(1)) +trimPrefix(string(add)) +trimPrefix(string(array)) +trimPrefix(string(div)) +trimPrefix(string(f32)) +trimPrefix(string(foo)) +trimPrefix(string(greet)) +trimPrefix(string(half)) +trimPrefix(string(i)) +trimPrefix(string(i32)) +trimPrefix(string(i64)) +trimPrefix(string(list)) +trimPrefix(string(nil)) +trimPrefix(string(ok)) +trimPrefix(string(score)) +trimPrefix(toBase64("bar")) +trimPrefix(toBase64("foo")) +trimPrefix(toJSON("bar")) +trimPrefix(toJSON("foo")) +trimPrefix(toJSON(0.5)) +trimPrefix(toJSON(1)) +trimPrefix(toJSON(array)) +trimPrefix(toJSON(f32)) +trimPrefix(toJSON(f64)) +trimPrefix(toJSON(false)) +trimPrefix(toJSON(foo)) +trimPrefix(toJSON(i)) +trimPrefix(toJSON(i32)) +trimPrefix(toJSON(i64)) +trimPrefix(toJSON(nil)) +trimPrefix(toJSON(true)) +trimPrefix(trim("bar")) +trimPrefix(trim("foo")) +trimPrefix(trimPrefix("bar")) +trimPrefix(trimPrefix("foo")) +trimPrefix(trimSuffix("bar")) +trimPrefix(trimSuffix("foo")) +trimPrefix(type("bar")) +trimPrefix(type(0.5 == 0.5)) +trimPrefix(type(0.5)) +trimPrefix(type(1 == f64)) +trimPrefix(type(1)) +trimPrefix(type(add)) +trimPrefix(type(array)) +trimPrefix(type(div)) +trimPrefix(type(f32)) +trimPrefix(type(f64)) +trimPrefix(type(false)) +trimPrefix(type(foo)) +trimPrefix(type(greet)) +trimPrefix(type(half)) +trimPrefix(type(i)) +trimPrefix(type(i32)) +trimPrefix(type(i64)) +trimPrefix(type(list)) +trimPrefix(type(nil)) +trimPrefix(type(ok)) +trimPrefix(type(score)) +trimPrefix(upper("foo")) +trimSuffix("bar" + "bar") +trimSuffix("foo") <= trimPrefix("foo") +trimSuffix(foo.Bar) +trimSuffix(foo.String()) +trimSuffix(foo?.Bar) +trimSuffix(foo?.Qux("bar")) +trimSuffix(foo?.String()) +trimSuffix(greet("bar")) +trimSuffix(greet("foo")) +trimSuffix(greet(toJSON(i64))) +trimSuffix(lower("bar")) +trimSuffix(lower("foo")) +trimSuffix(repeat("foo", i)) +trimSuffix(string("bar")) +trimSuffix(string(0.5)) +trimSuffix(string(1)) +trimSuffix(string(add)) +trimSuffix(string(array)) +trimSuffix(string(f32)) +trimSuffix(string(f64)) +trimSuffix(string(false)) +trimSuffix(string(foo)) +trimSuffix(string(greet)) +trimSuffix(string(half)) +trimSuffix(string(i)) +trimSuffix(string(i32)) +trimSuffix(string(i64)) +trimSuffix(string(list)) +trimSuffix(string(nil)) +trimSuffix(string(score)) +trimSuffix(string(type("foo"))) +trimSuffix(toBase64("bar")) +trimSuffix(toJSON("bar")) +trimSuffix(toJSON(0.5)) +trimSuffix(toJSON(1)) +trimSuffix(toJSON(array)) +trimSuffix(toJSON(f64)) +trimSuffix(toJSON(false)) +trimSuffix(toJSON(first(array))) +trimSuffix(toJSON(foo)) +trimSuffix(toJSON(i)) +trimSuffix(toJSON(i32)) +trimSuffix(toJSON(i64)) +trimSuffix(toJSON(list)) +trimSuffix(toJSON(nil)) +trimSuffix(toJSON(ok)) +trimSuffix(trim("bar")) +trimSuffix(trim("foo")) +trimSuffix(trimPrefix("bar")) +trimSuffix(trimPrefix("foo")) +trimSuffix(trimSuffix("foo")) +trimSuffix(type("bar")) +trimSuffix(type("foo")) +trimSuffix(type(0.5)) +trimSuffix(type(1)) +trimSuffix(type(add)) +trimSuffix(type(array)) +trimSuffix(type(div)) +trimSuffix(type(f32)) +trimSuffix(type(f64)) +trimSuffix(type(false)) +trimSuffix(type(foo)) +trimSuffix(type(half)) +trimSuffix(type(i)) +trimSuffix(type(i32)) +trimSuffix(type(i64)) +trimSuffix(type(list)) +trimSuffix(type(nil)) +trimSuffix(type(ok)) +trimSuffix(type(true)) +trimSuffix(upper("bar")) +trimSuffix(upper("foo")) +true != nil || true != nil +true == nil && ok +true ? "bar" : 0.5 ^ i +true ? "bar" : 1 <= 1 / 1 +true ? "bar" : i != i32 +true ? "foo" : foo?.Bar +true ? 0.5 : foo.Qux +true ? 1 : f64 + f32 +true ? 1 : nil == array +true ? array : foo.Qux +true ? array : foo.String +true ? array : i32 / i32 +true ? array : nil != map(list, #) +true ? array : nil != ok +true ? f32 : f64 == i32 +true ? f64 : foo?.String +true ? greet : 0.5 == i +true ? i : 0.5 + i64 +true ? i : 0.5 >= i64 +true ? i32 : foo.Bar +true ? i64 : foo.Bar +true ? list : f64 / f64 +true ? nil : 0.5 != i32 +true ? nil : foo.Qux +true ? nil : foo.String +true ? nil : i32 .. i +true ? nil : i64 ** -i +true ? ok : f32 / f32 +true ? ok : f64 + f64 +true ? score : foo.Qux +true ? true : f32 >= i64 +true ? true : foo?.String +true and ok and ok +true || 1 not in array +type(!false) +type(!ok) +type(!true) +type("bar" != nil) +type("bar" + "foo") +type("bar" < "bar") +type("bar" <= "bar") +type("bar" <= "foo") +type("bar" == nil) +type("bar" > "foo") +type("bar" endsWith "foo") +type("bar" matches "bar") +type("bar" matches "foo") +type("bar" not contains "bar") +type("bar" not endsWith "bar") +type("bar" not endsWith "foo") +type("bar" startsWith "foo") +type("bar") == string(array) +type("foo" != "bar") +type("foo" == "foo") +type("foo" > "bar") +type("foo" contains "foo") +type("foo" endsWith "foo") +type("foo" in foo) +type("foo" not endsWith "bar") +type("foo" not endsWith "foo") +type("foo" startsWith "foo") +type("foo" startsWith foo.Bar) +type(-0.5) +type(-1) +type(-f32) +type(-f64) +type(-i) +type(-i32) +type(-i64) +type(0.5 != 0.5) +type(0.5 != 1) +type(0.5 != i) +type(0.5 != i32) +type(0.5 != nil) +type(0.5 * 0.5) +type(0.5 * 1) +type(0.5 * i) +type(0.5 * i32) +type(0.5 * i64) +type(0.5 ** 0.5) +type(0.5 ** 1) +type(0.5 ** f32) +type(0.5 ** i) +type(0.5 ** i32) +type(0.5 ** i64) +type(0.5 + f32) +type(0.5 + i32) +type(0.5 + i64) +type(0.5 - 0.5) +type(0.5 - i) +type(0.5 / 0.5) +type(0.5 / 1) +type(0.5 / f64) +type(0.5 / i) +type(0.5 < 1) +type(0.5 < f64) +type(0.5 < i) +type(0.5 < i64) +type(0.5 <= 1) +type(0.5 <= f32) +type(0.5 <= i) +type(0.5 <= i64) +type(0.5 == 1) +type(0.5 == i) +type(0.5 == nil) +type(0.5 > 0.5) +type(0.5 > 1) +type(0.5 > f64) +type(0.5 > i) +type(0.5 >= 0.5) +type(0.5 >= 1) +type(0.5 >= f64) +type(0.5 >= i) +type(0.5 >= i32) +type(0.5 ^ 0.5) +type(0.5 ^ 1) +type(0.5 ^ f32) +type(0.5 ^ f64) +type(0.5 ^ i) +type(0.5) not contains trimPrefix("bar") +type(0.5) not in foo +type(0.5) startsWith "bar" == nil +type(0.5)[i32:i64] +type(1 != 0.5) +type(1 != 1) +type(1 != f32) +type(1 != i32) +type(1 != nil) +type(1 % 1) +type(1 % i) +type(1 % i32) +type(1 % i64) +type(1 * 1) +type(1 * f32) +type(1 * i) +type(1 * i64) +type(1 ** 0.5) +type(1 ** 1) +type(1 ** f64) +type(1 ** i32) +type(1 ** i64) +type(1 + 0.5) +type(1 + f32) +type(1 + f64) +type(1 + i64) +type(1 - 0.5) +type(1 - 1) +type(1 - f64) +type(1 - i32) +type(1 .. 1) +type(1 .. i) +type(1 .. i64) +type(1 / 1) +type(1 / f32) +type(1 / f64) +type(1 < 1) +type(1 < f32) +type(1 < i) +type(1 <= f32) +type(1 <= f64) +type(1 <= i32) +type(1 <= i64) +type(1 == 1) +type(1 == i) +type(1 == i64) +type(1 == nil) +type(1 > 0.5) +type(1 > 1) +type(1 > f32) +type(1 > f64) +type(1 >= 0.5) +type(1 >= 1) +type(1 >= f64) +type(1 >= i) +type(1 >= i32) +type(1 >= i64) +type(1 ^ 0.5) +type(1 ^ f32) +type(1 ^ i64) +type(1 in array) +type(1 not in array) +type(1) != toJSON(0.5) +type(1) == nil ? 1 : f64 +type(1) endsWith greet("foo") +type(1) in foo +type(1) in foo != true +type(1) not contains type(nil) +type(1) not endsWith toJSON(ok) +type([half, 1]) +type([nil]) +type(abs(0.5)) +type(abs(1)) +type(abs(f64)) +type(abs(i)) +type(abs(i32)) +type(abs(i64)) +type(add != add) +type(add != greet) +type(add != half) +type(add == half) +type(add == nil) +type(add(1, 1)) +type(add) +type(add) in foo +type(all(array, true)) +type(all(list, false)) +type(any(array, false)) +type(any(list, true)) +type(array == array) +type(array == list) +type(array) +type(array) in foo +type(array) not in foo +type(array[1]) +type(array[i32]) +type(array[i]) +type(count(list, ok)) +type(count(list, true)) +type(div != div) +type(div != half) +type(div != nil) +type(div == add) +type(div == greet) +type(div == half) +type(div) +type(div) not in foo +type(f32 != 0.5) +type(f32 != 1) +type(f32 != f32) +type(f32 != i32) +type(f32 * 0.5) +type(f32 * 1) +type(f32 * f32) +type(f32 * f64) +type(f32 * i) +type(f32 * i64) +type(f32 ** 0.5) +type(f32 ** 1) +type(f32 ** f32) +type(f32 ** i) +type(f32 ** i32) +type(f32 + 0.5) +type(f32 + 1) +type(f32 + f64) +type(f32 + i) +type(f32 + i64) +type(f32 - 0.5) +type(f32 - 1) +type(f32 - f32) +type(f32 - i) +type(f32 - i32) +type(f32 - i64) +type(f32 < 1) +type(f32 < f64) +type(f32 < i32) +type(f32 <= 0.5) +type(f32 <= 1) +type(f32 <= i64) +type(f32 == 0.5) +type(f32 == 1) +type(f32 == i32) +type(f32 > 1) +type(f32 > f32) +type(f32 > f64) +type(f32 >= 0.5) +type(f32 ^ 0.5) +type(f32 ^ f32) +type(f32 ^ f64) +type(f32 ^ i32) +type(f32 ^ i64) +type(f32) +type(f64 != f64) +type(f64 != i64) +type(f64 * 0.5) +type(f64 * 1) +type(f64 * i32) +type(f64 * i64) +type(f64 ** 0.5) +type(f64 ** 1) +type(f64 ** f32) +type(f64 ** i) +type(f64 ** i32) +type(f64 + 0.5) +type(f64 + f64) +type(f64 + i) +type(f64 - 0.5) +type(f64 - f32) +type(f64 - f64) +type(f64 - i) +type(f64 / 1) +type(f64 / i) +type(f64 < 0.5) +type(f64 < 1) +type(f64 < f64) +type(f64 < i64) +type(f64 <= 0.5) +type(f64 <= i) +type(f64 <= i32) +type(f64 == 1) +type(f64 == f64) +type(f64 == nil) +type(f64 > 1) +type(f64 > f64) +type(f64 > i) +type(f64 > i32) +type(f64 >= 0.5) +type(f64 >= 1) +type(f64 ^ 1) +type(f64 ^ f64) +type(f64 ^ i) +type(f64 ^ i32) +type(f64 ^ i64) +type(f64) +type(false != nil) +type(false && true) +type(false == ok) +type(false ? add : div) +type(false ? half : i) +type(false ? half : i32) +type(false ? i32 : 1) +type(false ? i32 : true) +type(false ? list : "foo") +type(false || ok) +type(false) not contains toJSON(i) +type(filter(array, true)) +type(filter(list, false)) +type(find([f64], "foo" == nil)) +type(find(array, false)) +type(find(list, false)) +type(findIndex(array, false)) +type(findIndex(list, ok)) +type(findIndex(list, true)) +type(findLast(array, false)) +type(findLast(array, ok)) +type(findLast(list, false)) +type(findLastIndex(array, ok)) +type(findLastIndex(array, true)) +type(findLastIndex(list, ok)) +type(first(array)) +type(first(list)) +type(float(0.5)) +type(float(1)) +type(float(f32)) +type(float(f64)) +type(float(i)) +type(float(i32)) +type(float(i64)) +type(foo != foo) +type(foo in list) +type(foo) +type(foo) in foo +type(foo.Bar) +type(foo.Qux) +type(foo.String()) +type(foo.String) +type(foo?.Bar) +type(foo?.Qux) +type(foo?.String()) +type(foo?.String) +type(get(array, 1)) +type(get(array, i)) +type(get(array, i32)) +type(get(list, 1)) +type(get(list, i32)) +type(greet != div) +type(greet != half) +type(greet != score) +type(greet == div) +type(greet == greet) +type(greet == half) +type(greet("bar")) +type(greet("foo")) +type(greet(lower("foo"))) +type(greet) +type(greet) not in foo +type(half != add) +type(half != nil) +type(half == add) +type(half == div) +type(half(0.5)) +type(half(f64)) +type(half) +type(half) endsWith toJSON(1) +type(i != 0.5) +type(i != 1) +type(i != f32) +type(i != i64) +type(i % 1) +type(i * 0.5) +type(i * i64) +type(i ** 0.5) +type(i ** 1) +type(i ** f32) +type(i ** f64) +type(i ** i) +type(i ** i32) +type(i + 1) +type(i + i) +type(i + i32) +type(i .. i64) +type(i / 0.5) +type(i / 1) +type(i < f32) +type(i < i64) +type(i == f32) +type(i == i32) +type(i == i64) +type(i > f64) +type(i >= 1) +type(i >= f32) +type(i >= f64) +type(i ^ 0.5) +type(i ^ 1) +type(i ^ f32) +type(i ^ f64) +type(i ^ i64) +type(i not in array) +type(i) +type(i) not endsWith greet("foo") +type(i32 != 0.5) +type(i32 != 1) +type(i32 != nil) +type(i32 % 1) +type(i32 % i64) +type(i32 * 0.5) +type(i32 * 1) +type(i32 * i32) +type(i32 * i64) +type(i32 ** f32) +type(i32 ** f64) +type(i32 ** i) +type(i32 + 1) +type(i32 + f32) +type(i32 + f64) +type(i32 + i) +type(i32 + i32) +type(i32 + i64) +type(i32 - f32) +type(i32 - i32) +type(i32 .. 1) +type(i32 .. i) +type(i32 / f64) +type(i32 / i32) +type(i32 < 1) +type(i32 < f32) +type(i32 < i) +type(i32 < i64) +type(i32 <= f64) +type(i32 <= i32) +type(i32 <= i64) +type(i32 == 0.5) +type(i32 == 1) +type(i32 == f32) +type(i32 == f64) +type(i32 == i) +type(i32 == i64) +type(i32 > 0.5) +type(i32 > 1) +type(i32 > f64) +type(i32 > i32) +type(i32 >= 1) +type(i32 >= f32) +type(i32 >= i) +type(i32 >= i32) +type(i32 ^ 0.5) +type(i32 ^ i) +type(i32 ^ i32) +type(i32 ^ i64) +type(i32 in array) +type(i32) +type(i32) startsWith greet("foo") +type(i64 != 1) +type(i64 != array[i32]) +type(i64 != f32) +type(i64 != i) +type(i64 != nil) +type(i64 % i) +type(i64 % i64) +type(i64 * 0.5) +type(i64 * f32) +type(i64 * f64) +type(i64 * i64) +type(i64 ** 1) +type(i64 + 0.5) +type(i64 + f64) +type(i64 + i) +type(i64 + i64) +type(i64 - 0.5) +type(i64 .. 1) +type(i64 .. i32) +type(i64 .. i64) +type(i64 / 0.5) +type(i64 / 1) +type(i64 / i) +type(i64 / i64) +type(i64 < 1) +type(i64 < f64) +type(i64 < i) +type(i64 < i64) +type(i64 <= 1) +type(i64 <= f32) +type(i64 <= i64) +type(i64 == i32) +type(i64 == nil) +type(i64 > f64) +type(i64 >= 0.5) +type(i64 >= f32) +type(i64 >= i) +type(i64 >= i64) +type(i64 ^ 0.5) +type(i64 ^ 1) +type(i64 ^ f32) +type(i64 ^ f64) +type(i64 ^ i) +type(i64 ^ i32) +type(i64 in array) +type(i64 not in array) +type(i64) +type(i64) != foo?.Bar +type(i64) contains string(foo) ? i : array +type(i64) not in foo +type(i64) not startsWith lower("foo") +type(int(0.5)) +type(int(1)) +type(int(f32)) +type(int(f64)) +type(int(i)) +type(int(i32)) +type(int(i64) <= f32) +type(int(i64)) +type(last(array)) +type(last(list)) +type(len("bar")) +type(len("foo")) +type(len(array)) +type(len(list)) +type(list == array) +type(list == nil) +type(list) +type(list[1]) +type(list[i32]) +type(list[i64]) +type(list[i]) +type(lower("bar")) +type(lower("foo")) +type(lower(string(nil))) +type(map(array, "foo")) +type(map(array, #)) +type(map(array, 0.5)) +type(map(array, add)) +type(map(array, array)) +type(map(array, false)) +type(map(array, foo)) +type(map(array, half)) +type(map(array, i)) +type(map(array, i64)) +type(map(array, ok)) +type(map(i .. i32, i64)) +type(map(list, #)) +type(map(list, 0.5)) +type(map(list, 1)) +type(map(list, array)) +type(map(list, f32)) +type(map(list, f64)) +type(map(list, foo)) +type(map(list, greet)) +type(map(list, i)) +type(map(list, list)) +type(map(list, ok)) +type(max(0.5)) +type(max(1)) +type(max(f32)) +type(max(f32, i32)) +type(max(f64)) +type(max(f64, 0.5)) +type(max(i)) +type(max(i32)) +type(max(i32, i64)) +type(max(i64)) +type(min(0.5)) +type(min(1)) +type(min(1, 0.5)) +type(min(1, 1, f32)) +type(min(f32)) +type(min(f64)) +type(min(i)) +type(min(i, 1)) +type(min(i32)) +type(min(i32, 0.5)) +type(min(i64)) +type(nil != "bar") +type(nil != 0.5) +type(nil != 1) +type(nil != div) +type(nil != f64) +type(nil != false) +type(nil != foo) +type(nil != greet) +type(nil != i32) +type(nil != nil) +type(nil != ok) +type(nil == "bar") +type(nil == "foo") +type(nil == 0.5) +type(nil == 1) +type(nil == add) +type(nil == array) +type(nil == f32) +type(nil == f64) +type(nil == i) +type(nil == i32) +type(nil == nil) +type(nil == ok) +type(nil == score) +type(nil == true) +type(nil in array) +type(nil not in array) +type(nil) != type(1) +type(none(array, ok)) +type(none(array, true)) +type(none(list, ok)) +type(none(list, true)) +type(not false) +type(not ok) +type(not true) +type(ok != nil) +type(ok == false) +type(ok ? 0.5 : i32) +type(ok ? 0.5 : list) +type(ok ? 1 : f32) +type(ok ? add : "bar") +type(ok ? false : i64) +type(ok ? foo : false) +type(ok ? half : half) +type(ok ? i32 : f64) +type(ok ? i64 : "bar") +type(ok ? list : "foo") +type(ok ? ok : half) +type(ok ? true : false) +type(ok and ok) +type(ok and true) +type(ok or false) +type(ok or true) +type(ok || true) +type(ok) +type(ok) in foo +type(ok) not matches string(i64) +type(ok) not startsWith lower("bar") +type(score != div) +type(score != greet) +type(score != half) +type(score != nil) +type(score == add) +type(score == foo.String) +type(score == greet) +type(score == half) +type(score == nil) +type(score == score) +type(score(1)) +type(score(i)) +type(score(i, 1)) +type(score) +type(score) < foo?.Bar +type(score) > string(score) +type(score) in foo +type(score) not contains type(1) +type(sort(array)) +type(string("bar")) +type(string("foo")) +type(string(0.5)) +type(string(1)) +type(string(add)) +type(string(array)) +type(string(div)) +type(string(f64)) +type(string(false)) +type(string(foo)) +type(string(greet)) +type(string(half)) +type(string(i <= i32)) +type(string(i)) +type(string(i64)) +type(string(list)) +type(string(nil)) +type(string(ok)) +type(string(score)) +type(toBase64("foo")) +type(toJSON("bar")) +type(toJSON("foo")) +type(toJSON(0.5 < i)) +type(toJSON(0.5)) +type(toJSON(1)) +type(toJSON(array)) +type(toJSON(f32)) +type(toJSON(f64)) +type(toJSON(false)) +type(toJSON(foo)) +type(toJSON(i32)) +type(toJSON(i64)) +type(toJSON(list)) +type(toJSON(nil)) +type(toJSON(ok)) +type(toJSON(true)) +type(trim("bar")) +type(trim("foo")) +type(trimPrefix("foo")) +type(trimPrefix(toJSON(true))) +type(trimSuffix("bar")) +type(true == false) +type(true == nil) +type(true ? "bar" : 0.5) +type(true ? div : 0.5) +type(true ? f64 : array) +type(true ? foo : foo) +type(true ? foo : true) +type(true ? greet : "foo") +type(true ? list : ok) +type(true ? nil : list) +type(true ? nil : ok) +type(true ? true : 1) +type(true and true) +type(true) endsWith toBase64("foo") +type(type("bar")) +type(type("foo")) +type(type(0.5)) +type(type(1)) +type(type(add)) +type(type(array)) +type(type(div)) +type(type(f32)) +type(type(f64)) +type(type(false)) +type(type(foo)) +type(type(half)) +type(type(i)) +type(type(i32)) +type(type(i64)) +type(type(list)) +type(type(nil)) +type(type(ok)) +type(type(score)) +type(type(true)) +type(upper("bar")) +type(upper("foo")) +type({"bar": 0.5}) +type({"bar": 1}) +type({"bar": greet}) +type({"foo": 0.5, "bar": foo}) +type({"foo": div}) +type({"foo": i64}) +type({"foo": nil}) +upper("bar" + "foo") +upper("bar") <= type(nil) +upper("bar") contains lower("foo") +upper("foo" + "bar") +upper(false ? 0.5 : "foo") +upper(foo.Bar) +upper(foo.String()) +upper(foo?.Bar) +upper(foo?.String()) +upper(greet("foo")) +upper(greet(string(ok))) +upper(lower("bar")) +upper(ok ? "bar" : i) +upper(string("bar")) +upper(string("foo")) +upper(string(0.5)) +upper(string(1)) +upper(string(array)) +upper(string(div)) +upper(string(f32)) +upper(string(f64)) +upper(string(foo)) +upper(string(greet)) +upper(string(half)) +upper(string(i)) +upper(string(i32)) +upper(string(i64)) +upper(string(list)) +upper(string(nil)) +upper(string(ok)) +upper(string(score)) +upper(string(string(0.5))) +upper(string(true)) +upper(toBase64("foo")) +upper(toJSON("foo")) +upper(toJSON(0.5)) +upper(toJSON(1)) +upper(toJSON(array)) +upper(toJSON(f32)) +upper(toJSON(f64)) +upper(toJSON(false)) +upper(toJSON(foo)) +upper(toJSON(i)) +upper(toJSON(i32)) +upper(toJSON(i64)) +upper(toJSON(list)) +upper(toJSON(nil)) +upper(toJSON(ok)) +upper(toJSON(true)) +upper(trim("bar")) +upper(trim("bar", "bar")) +upper(trim("foo")) +upper(trimPrefix("bar")) +upper(trimPrefix("foo")) +upper(trimSuffix("bar")) +upper(trimSuffix("foo")) +upper(true ? "bar" : f32) +upper(true ? "foo" : i32) +upper(type("bar")) +upper(type("foo")) +upper(type(0.5)) +upper(type(1)) +upper(type(add)) +upper(type(div)) +upper(type(f32)) +upper(type(f64)) +upper(type(false)) +upper(type(foo)) +upper(type(greet)) +upper(type(half)) +upper(type(i)) +upper(type(i64)) +upper(type(list)) +upper(type(nil)) +upper(type(score)) +upper(type(true)) +upper(upper("bar")) +values({"bar": f32}) +values({"bar": greet}) +values({"bar": i64}) +values({"foo": 1}) +values({"foo": div}) +values({"foo": false}) +values({"foo": foo, "foo": ok}) +values({"foo": list, "bar": 1}) +{"bar": !false} +{"bar": !true} +{"bar": "bar", "foo": nil}?.String +{"bar": "bar", "foo": score}.i +{"bar": "bar", "foo": true}?.i?.foo +{"bar": "bar"}.add +{"bar": "bar"}.array +{"bar": "bar"}.f32 +{"bar": "bar"}.f64 +{"bar": "bar"}.list +{"bar": "bar"}.ok +{"bar": "bar"}?.Bar +{"bar": "bar"}?.greet +{"bar": "bar"}?.half +{"bar": "bar"}?.i +{"bar": "foo", "foo": 0.5}.add +{"bar": "foo", "foo": 1}.String?.ok +{"bar": "foo", "foo": greet}.half +{"bar": "foo", "foo": ok, "bar": f64}?.Bar +{"bar": "foo", "foo": ok}.Qux +{"bar": "foo", "foo": true}.ok +{"bar": "foo"}.Qux +{"bar": "foo"}.String +{"bar": "foo"}.add +{"bar": "foo"}.array +{"bar": "foo"}.div +{"bar": "foo"}.f32 +{"bar": "foo"}.i +{"bar": "foo"}.i64 +{"bar": "foo"}.score +{"bar": "foo"}?.Qux +{"bar": "foo"}?.Qux?.score +{"bar": "foo"}?.String +{"bar": "foo"}?.div +{"bar": "foo"}?.foo +{"bar": "foo"}?.i32 +{"bar": "foo"}?.i64 +{"bar": -0.5} +{"bar": -1} +{"bar": -1}?.array +{"bar": -f32} +{"bar": 0.5 * f64} +{"bar": 0.5 + 1} +{"bar": 0.5 - i32} +{"bar": 0.5 - i64} +{"bar": 0.5 < i64} +{"bar": 0.5 == nil} +{"bar": 0.5 > 1}.Qux +{"bar": 0.5, "bar": "bar"}.ok +{"bar": 0.5, "bar": 0.5}.f32 +{"bar": 0.5, "bar": 1}?.half +{"bar": 0.5, "foo": array}?.ok +{"bar": 0.5, "foo": i32, "bar": add}?.Bar +{"bar": 0.5}.Bar +{"bar": 0.5}.Qux +{"bar": 0.5}.String +{"bar": 0.5}.add +{"bar": 0.5}.div +{"bar": 0.5}.div?.array.foo +{"bar": 0.5}.f32 +{"bar": 0.5}.f64 +{"bar": 0.5}.foo +{"bar": 0.5}.greet +{"bar": 0.5}.i32 +{"bar": 0.5}.ok +{"bar": 0.5}.score +{"bar": 0.5}?.Bar +{"bar": 0.5}?.String +{"bar": 0.5}?.add +{"bar": 0.5}?.array +{"bar": 0.5}?.div +{"bar": 0.5}?.f32 +{"bar": 0.5}?.foo +{"bar": 0.5}?.greet?.i32 +{"bar": 0.5}?.half +{"bar": 0.5}?.i +{"bar": 0.5}?.i32 +{"bar": 0.5}?.i32?.i32 +{"bar": 0.5}?.i64 +{"bar": 1 * i32} +{"bar": 1 * i} +{"bar": 1 + i32} +{"bar": 1 - f32} +{"bar": 1 / 0.5} +{"bar": 1 < f32} +{"bar": 1 <= 1} +{"bar": 1, "bar": "bar"}.i32 +{"bar": 1, "bar": array}?.f32 +{"bar": 1, "bar": false}.array +{"bar": 1, "bar": greet, "foo": "bar"}?.i64 +{"bar": 1, "bar": i64}?.array +{"bar": 1, "foo": 0.5}?.String +{"bar": 1, "foo": add, "foo": f32}?.i +{"bar": 1, "foo": foo}.div +{"bar": 1, "foo": i64}.i64 +{"bar": 1}.Bar +{"bar": 1}.Qux +{"bar": 1}.String +{"bar": 1}.add +{"bar": 1}.div +{"bar": 1}.f64 +{"bar": 1}.greet +{"bar": 1}.half +{"bar": 1}.i +{"bar": 1}.ok +{"bar": 1}?.Bar +{"bar": 1}?.add +{"bar": 1}?.add?.i32 +{"bar": 1}?.div?.list +{"bar": 1}?.f32 +{"bar": 1}?.f64 +{"bar": 1}?.i +{"bar": 1}?.i32 +{"bar": 1}?.ok +{"bar": ["bar", score]} +{"bar": add, "bar": "foo"}.String?.array +{"bar": add, "bar": 1}?.i64 +{"bar": add, "bar": div}?.f32 +{"bar": add, "bar": foo} +{"bar": add, "bar": list}.Bar +{"bar": add, "bar": score}.f64?.f64 +{"bar": add, "foo": "foo"}.i64 +{"bar": add, "foo": f64}?.score +{"bar": add, "foo": i32}?.half +{"bar": add, "foo": ok} +{"bar": add, "foo": score} +{"bar": add} +{"bar": add}.Qux +{"bar": add}.String +{"bar": add}.f64 +{"bar": add}.foo +{"bar": add}.greet +{"bar": add}.i32 +{"bar": add}.list +{"bar": add}?.String +{"bar": add}?.add +{"bar": add}?.div +{"bar": add}?.i +{"bar": add}?.i64 +{"bar": add}?.score +{"bar": any(array, false)} +{"bar": any(list, ok)} +{"bar": array, "bar": f64} +{"bar": array, "bar": false, "bar": i}?.Qux +{"bar": array, "bar": false}.Qux +{"bar": array, "bar": half}.i32 +{"bar": array, "bar": i64}.i64 +{"bar": array, "bar": score} +{"bar": array, "foo": "foo"}?.array +{"bar": array, "foo": add == add} +{"bar": array, "foo": count(list, true)}.add +{"bar": array} +{"bar": array}.Bar +{"bar": array}.Qux +{"bar": array}.String +{"bar": array}.add +{"bar": array}.f32 +{"bar": array}.half?.foo +{"bar": array}.i +{"bar": array}.i64 +{"bar": array}?.Bar +{"bar": array}?.div +{"bar": array}?.greet +{"bar": array}?.half +{"bar": array}?.i32 +{"bar": array}?.i64 +{"bar": array}?.ok +{"bar": div != greet} +{"bar": div, "bar": "bar", "bar": foo}.greet +{"bar": div, "bar": "bar", "foo": 1}?.div +{"bar": div, "bar": greet}?.i32 +{"bar": div, "bar": i32}?.array +{"bar": div, "foo": div}?.list +{"bar": div, "foo": greet, "foo": 1}?.score?.Qux +{"bar": div, "foo": i}?.i +{"bar": div, "foo": list}.f64 +{"bar": div, "foo": ok}?.i64 +{"bar": div, "foo": score} +{"bar": div} +{"bar": div}.add +{"bar": div}.div +{"bar": div}.f32 +{"bar": div}.f32?.score +{"bar": div}.half +{"bar": div}.i32 +{"bar": div}.i64 +{"bar": div}.score +{"bar": div}?.div +{"bar": div}?.div?.f32 +{"bar": div}?.foo +{"bar": div}?.half +{"bar": div}?.i +{"bar": div}?.i64 +{"bar": div}?.list +{"bar": div}?.ok +{"bar": f32 ** 1} +{"bar": f32 - i32} +{"bar": f32, "bar": true, "bar": list}?.Bar +{"bar": f32, "foo": i32} +{"bar": f32, "foo": ok, "foo": f32}.half +{"bar": f32, "foo": score}?.greet +{"bar": f32} +{"bar": f32}.Bar +{"bar": f32}.Qux?.i64 +{"bar": f32}.String +{"bar": f32}.add +{"bar": f32}.half +{"bar": f32}.list +{"bar": f32}?.String?.score +{"bar": f32}?.f64 +{"bar": f32}?.foo +{"bar": f32}?.i32 +{"bar": f32}?.i64 +{"bar": f32}?.list +{"bar": f32}?.score +{"bar": f64, "bar": 0.5}.div +{"bar": f64, "bar": i} +{"bar": f64, "bar": nil}?.f64 +{"bar": f64, "foo": "foo"}?.half +{"bar": f64, "foo": 0.5, "bar": foo}?.half +{"bar": f64, "foo": f64}.foo +{"bar": f64, "foo": i32} +{"bar": f64} +{"bar": f64}.String +{"bar": f64}.div?.String() +{"bar": f64}.f32 +{"bar": f64}.f64 +{"bar": f64}.f64?.list +{"bar": f64}.greet +{"bar": f64}.half +{"bar": f64}.i +{"bar": f64}.ok +{"bar": f64}?.Bar +{"bar": f64}?.Qux +{"bar": f64}?.f64 +{"bar": f64}?.half +{"bar": f64}?.i32 +{"bar": f64}?.i64 +{"bar": f64}?.score +{"bar": false, "bar": 0.5, "bar": foo}.add +{"bar": false, "foo": greet, "foo": i64}.div +{"bar": false}.add +{"bar": false}.div +{"bar": false}.f64 +{"bar": false}.foo +{"bar": false}.greet +{"bar": false}.half +{"bar": false}.i32 +{"bar": false}.list +{"bar": false}.ok +{"bar": false}.score +{"bar": false}?.array +{"bar": false}?.greet +{"bar": false}?.i32 +{"bar": false}?.ok?.Qux?.score() +{"bar": false}?.score +{"bar": first(list)} +{"bar": float(f32)} +{"bar": foo, "bar": 0.5}.div +{"bar": foo, "bar": div}.array +{"bar": foo, "bar": half} +{"bar": foo, "bar": list}.f32 +{"bar": foo, "foo": greet}?.div +{"bar": foo, "foo": i32}.score +{"bar": foo, "foo": true}?.f32 +{"bar": foo.Bar} +{"bar": foo.String()} +{"bar": foo?.Qux}?.foo +{"bar": foo?.String} +{"bar": foo} +{"bar": foo}.Qux +{"bar": foo}.String +{"bar": foo}.array +{"bar": foo}.div +{"bar": foo}.f64 +{"bar": foo}.half +{"bar": foo}.half?.list(i32).array +{"bar": foo}.i +{"bar": foo}.list +{"bar": foo}.ok +{"bar": foo}?.div +{"bar": foo}?.f64 +{"bar": foo}?.greet +{"bar": foo}?.i +{"bar": foo}?.i64 +{"bar": foo}?.list +{"bar": greet, "bar": foo} +{"bar": greet, "bar": nil}.f64 +{"bar": greet, "foo": foo} +{"bar": greet} +{"bar": greet}.Qux +{"bar": greet}.add +{"bar": greet}.array +{"bar": greet}.div +{"bar": greet}.foo +{"bar": greet}.i +{"bar": greet}.i32 +{"bar": greet}.ok +{"bar": greet}.score +{"bar": greet}?.Bar +{"bar": greet}?.String +{"bar": greet}?.add +{"bar": greet}?.f32 +{"bar": greet}?.foo?.foo +{"bar": greet}?.half +{"bar": greet}?.i +{"bar": greet}?.list +{"bar": greet}?.ok +{"bar": half(0.5), "bar": ok} +{"bar": half(0.5)} +{"bar": half(0.5)}?.array +{"bar": half, "bar": "foo", "bar": ok}?.String +{"bar": half, "bar": array}?.div?.i32 +{"bar": half, "bar": div} +{"bar": half, "bar": f32} +{"bar": half, "bar": greet}?.i64 +{"bar": half, "bar": list} +{"bar": half, "bar": score, "bar": i == f32} +{"bar": half, "bar": score} +{"bar": half, "foo": array} +{"bar": half, "foo": f64 == i64} +{"bar": half, "foo": greet} +{"bar": half, "foo": i64}.array +{"bar": half, "foo": list}?.list?.ok +{"bar": half} +{"bar": half}.String +{"bar": half}.String?.score +{"bar": half}.half +{"bar": half}.i32 +{"bar": half}.i64 +{"bar": half}.ok +{"bar": half}.score +{"bar": half}?.Qux +{"bar": half}?.Qux?.f32 +{"bar": half}?.div +{"bar": half}?.f32 +{"bar": half}?.foo?.f32() +{"bar": half}?.half +{"bar": half}?.half?.f32 +{"bar": half}?.i +{"bar": i ** 0.5} +{"bar": i + i64} +{"bar": i .. i32} +{"bar": i .. i} +{"bar": i > i32} +{"bar": i >= 0.5, "bar": array} +{"bar": i >= i} +{"bar": i, "bar": 0.5}?.Qux +{"bar": i, "bar": foo}.foo +{"bar": i, "bar": nil}?.f32 +{"bar": i, "foo": 1 >= f64} +{"bar": i, "foo": array}.array +{"bar": i, "foo": f64}.i64 +{"bar": i, "foo": greet}?.foo +{"bar": i32 + 0.5} +{"bar": i32 < i32} +{"bar": i32 <= f64} +{"bar": i32, "bar": "foo"}?.half +{"bar": i32, "foo": f64}?.foo +{"bar": i32, "foo": foo, "foo": i32}?.i32?.String() +{"bar": i32, "foo": i64, "bar": true}?.i64 +{"bar": i32, "foo": i64}.half +{"bar": i32, "foo": list} +{"bar": i32, "foo": score, "foo": 1}.array +{"bar": i32, "foo": score, "foo": greet}.add +{"bar": i32, "foo": score, "foo": ok}.foo +{"bar": i32} +{"bar": i32}.Bar +{"bar": i32}.i +{"bar": i32}.i64 +{"bar": i32}.list +{"bar": i32}.score?.f32 +{"bar": i32}?.String +{"bar": i32}?.div +{"bar": i32}?.f32 +{"bar": i32}?.foo +{"bar": i32}?.greet +{"bar": i32}?.half +{"bar": i32}?.i +{"bar": i32}?.list?.list +{"bar": i32}?.ok +{"bar": i32}?.score +{"bar": i64 != f32, "bar": score} +{"bar": i64 ** f64} +{"bar": i64 / f64} +{"bar": i64, "bar": "bar", "foo": i64}.array +{"bar": i64, "bar": foo}.list +{"bar": i64, "bar": greet, "foo": score}.array +{"bar": i64, "bar": half}?.f64 +{"bar": i64, "bar": i64}?.Qux?.array() +{"bar": i64, "bar": list} +{"bar": i64, "foo": "foo"}.Bar +{"bar": i64, "foo": 0.5, "foo": list}.i64 +{"bar": i64, "foo": f32, "foo": nil}.i32 +{"bar": i64, "foo": f32}?.half +{"bar": i64, "foo": i, "foo": greet}.array +{"bar": i64, "foo": nil}.add +{"bar": i64, "foo": nil}?.Qux +{"bar": i64} +{"bar": i64}.add +{"bar": i64}.array +{"bar": i64}.div +{"bar": i64}.div?.i64 +{"bar": i64}.f32 +{"bar": i64}.foo +{"bar": i64}.greet +{"bar": i64}.i64 +{"bar": i64}.list +{"bar": i64}.ok +{"bar": i64}?.Qux +{"bar": i64}?.String +{"bar": i64}?.array +{"bar": i64}?.array?.foo +{"bar": i64}?.div +{"bar": i64}?.f32 +{"bar": i64}?.i64 +{"bar": i64}?.list +{"bar": i64}?.ok +{"bar": i64}?.score +{"bar": i} +{"bar": i}.Bar +{"bar": i}.String +{"bar": i}.array +{"bar": i}.div +{"bar": i}.f64 +{"bar": i}.foo +{"bar": i}.greet +{"bar": i}.half +{"bar": i}.i +{"bar": i}.i32 +{"bar": i}.i64 +{"bar": i}.list?.list +{"bar": i}?.Qux +{"bar": i}?.String +{"bar": i}?.add +{"bar": i}?.foo +{"bar": i}?.greet +{"bar": i}?.list +{"bar": list, "bar": 1}?.f64 +{"bar": list, "bar": div} +{"bar": list, "bar": f32, "bar": i64}.Bar +{"bar": list, "bar": f32, "bar": ok}.add +{"bar": list, "bar": f64}.foo +{"bar": list, "bar": false, "bar": 1}?.f32 +{"bar": list, "bar": i32}.half +{"bar": list, "bar": ok} +{"bar": list, "foo": div, "foo": ok}?.i64 +{"bar": list, "foo": f64, "foo": list}.half +{"bar": list, "foo": half}?.Qux +{"bar": list, "foo": i} +{"bar": list, "foo": list} +{"bar": list, "foo": ok, "foo": f64}?.half +{"bar": list} +{"bar": list}.Bar +{"bar": list}.add +{"bar": list}.f32 +{"bar": list}.f64 +{"bar": list}.greet +{"bar": list}.score +{"bar": list}?.add +{"bar": list}?.add?.array +{"bar": list}?.div +{"bar": list}?.half +{"bar": list}?.i32 +{"bar": list}?.list +{"bar": list}?.score +{"bar": map(list, i32)} +{"bar": min(0.5)} +{"bar": min(f32)} +{"bar": nil != "bar"} +{"bar": nil != false} +{"bar": nil == "foo"} +{"bar": nil == 1} +{"bar": nil == f64} +{"bar": nil, "bar": div}.f32 +{"bar": nil, "bar": greet, "foo": "bar"}?.i64 +{"bar": nil, "bar": greet}.score +{"bar": nil, "bar": i}.f64 +{"bar": nil, "foo": 0.5}?.array +{"bar": nil, "foo": f64}?.add +{"bar": nil, "foo": half}?.foo +{"bar": nil}.String +{"bar": nil}.add +{"bar": nil}.array +{"bar": nil}.f32 +{"bar": nil}.foo +{"bar": nil}.half +{"bar": nil}?.Bar +{"bar": nil}?.add +{"bar": nil}?.array +{"bar": nil}?.f32 +{"bar": nil}?.f64 +{"bar": nil}?.foo +{"bar": nil}?.foo?.i32 +{"bar": nil}?.greet +{"bar": nil}?.half +{"bar": nil}?.i32 +{"bar": nil}?.i64 +{"bar": nil}?.list +{"bar": nil}?.ok +{"bar": ok or ok} +{"bar": ok || ok} +{"bar": ok, "bar": list} +{"bar": ok, "bar": nil == half}.f64 +{"bar": ok, "foo": div, "bar": "bar"}.Qux +{"bar": ok, "foo": i32, "bar": 1}.score +{"bar": ok} +{"bar": ok}.String +{"bar": ok}.add +{"bar": ok}.array +{"bar": ok}.i +{"bar": ok}.i64 +{"bar": ok}.ok +{"bar": ok}?.Qux +{"bar": ok}?.array +{"bar": ok}?.f64 +{"bar": ok}?.foo +{"bar": ok}?.greet +{"bar": ok}?.i +{"bar": ok}?.i32 +{"bar": ok}?.i64 +{"bar": score != score} +{"bar": score, "bar": 0.5}?.Bar +{"bar": score, "bar": div} +{"bar": score, "bar": foo} +{"bar": score, "bar": i64}.div +{"bar": score, "bar": i} +{"bar": score, "foo": greet} +{"bar": score} +{"bar": score}.Bar +{"bar": score}.add +{"bar": score}.array +{"bar": score}.div +{"bar": score}.f64 +{"bar": score}.i32 +{"bar": score}.i64 +{"bar": score}.list +{"bar": score}.ok +{"bar": score}.score +{"bar": score}?.f32 +{"bar": score}?.f64 +{"bar": score}?.i32 +{"bar": score}?.list +{"bar": score}?.score +{"bar": string(array)} +{"bar": toJSON(array)} +{"bar": toJSON(i)}.i64?.i64 +{"bar": toJSON(i32)} +{"bar": true, "bar": false}.Bar +{"bar": true, "bar": foo}?.String +{"bar": true, "foo": 0.5}?.i +{"bar": true, "foo": div}.score +{"bar": true, "foo": foo}.div +{"bar": true}.Bar +{"bar": true}.Qux?.greet() +{"bar": true}.f32 +{"bar": true}.f64 +{"bar": true}.half +{"bar": true}.i +{"bar": true}.list?.String() +{"bar": true}.score +{"bar": true}?.Bar +{"bar": true}?.i64 +{"bar": true}?.list +{"bar": type(f64)} +{"bar": type(greet)} +{"bar": {"foo": "bar", "bar": "bar", "bar": nil}} +{"foo": "bar", "bar": i32}.half +{"foo": "bar", "bar": nil}?.add?.i64 +{"foo": "bar"}.Bar +{"foo": "bar"}.Qux +{"foo": "bar"}.String +{"foo": "bar"}.array +{"foo": "bar"}.f64 +{"foo": "bar"}.half +{"foo": "bar"}.i +{"foo": "bar"}.i64 +{"foo": "bar"}.list +{"foo": "bar"}.ok +{"foo": "bar"}?.add +{"foo": "bar"}?.div?.ok +{"foo": "bar"}?.f64 +{"foo": "bar"}?.foo +{"foo": "bar"}?.half +{"foo": "foo" != "bar"} +{"foo": "foo", "bar": nil}?.String +{"foo": "foo", "foo": add, "foo": "foo"}?.i +{"foo": "foo", "foo": div}.i64 +{"foo": "foo", "foo": greet}.array +{"foo": "foo", "foo": i, "bar": greet}?.score +{"foo": "foo", "foo": i32, "bar": f32}.greet +{"foo": "foo", "foo": i}?.foo +{"foo": "foo", "foo": list}.f32 +{"foo": "foo"}.Bar +{"foo": "foo"}.array +{"foo": "foo"}.f32 +{"foo": "foo"}.foo +{"foo": "foo"}.greet +{"foo": "foo"}.i64 +{"foo": "foo"}?.Bar +{"foo": "foo"}?.add +{"foo": "foo"}?.div +{"foo": "foo"}?.greet +{"foo": "foo"}?.half +{"foo": "foo"}?.score +{"foo": -1} +{"foo": -i64} +{"foo": -i} +{"foo": 0.5 ** i64} +{"foo": 0.5 - 0.5} +{"foo": 0.5 <= 0.5} +{"foo": 0.5 > i64} +{"foo": 0.5, "bar": 1}.half +{"foo": 0.5, "bar": add}.Bar +{"foo": 0.5, "bar": div}.array +{"foo": 0.5, "bar": i32}?.String +{"foo": 0.5, "bar": score, "foo": score}.half +{"foo": 0.5, "foo": 1, "foo": list}.div +{"foo": 0.5, "foo": nil}?.div +{"foo": 0.5, "foo": nil}?.i64 +{"foo": 0.5}.Bar +{"foo": 0.5}.Qux +{"foo": 0.5}.array +{"foo": 0.5}.f32 +{"foo": 0.5}.f64 +{"foo": 0.5}.greet +{"foo": 0.5}.half +{"foo": 0.5}.i +{"foo": 0.5}.i64 +{"foo": 0.5}.list +{"foo": 0.5}.ok +{"foo": 0.5}?.Bar?.i +{"foo": 0.5}?.String +{"foo": 0.5}?.add +{"foo": 0.5}?.array +{"foo": 0.5}?.array?.score +{"foo": 0.5}?.foo +{"foo": 0.5}?.greet +{"foo": 0.5}?.half +{"foo": 0.5}?.i64 +{"foo": 0.5}?.ok +{"foo": 1 + 0.5} +{"foo": 1 / 0.5} +{"foo": 1 / i64} +{"foo": 1 < i32}?.i64 +{"foo": 1 not in array} +{"foo": 1, "bar": 0.5}.array +{"foo": 1, "bar": div}.f32 +{"foo": 1, "bar": f32}.Qux?.half?.list +{"foo": 1, "bar": i64, "foo": 0.5}.list +{"foo": 1, "bar": i64}?.ok +{"foo": 1, "bar": score}.foo +{"foo": 1, "foo": 0.5}.f32 +{"foo": 1, "foo": array}?.array +{"foo": 1, "foo": ok}.add +{"foo": 1, "foo": true}?.Qux +{"foo": 1}.add +{"foo": 1}.f32 +{"foo": 1}.foo +{"foo": 1}.greet +{"foo": 1}.half +{"foo": 1}.i64 +{"foo": 1}.list +{"foo": 1}.ok +{"foo": 1}?.Bar +{"foo": 1}?.add +{"foo": 1}?.div +{"foo": 1}?.f32 +{"foo": 1}?.foo +{"foo": 1}?.greet +{"foo": 1}?.half +{"foo": 1}?.i +{"foo": 1}?.i32 +{"foo": 1}?.score +{"foo": abs(0.5)} +{"foo": add, "bar": 0.5}.i +{"foo": add, "bar": nil}.score +{"foo": add, "bar": ok} +{"foo": add, "bar": score}.half +{"foo": add, "foo": "bar"}?.String +{"foo": add, "foo": half, "foo": div}?.greet +{"foo": add, "foo": i32}.foo +{"foo": add, "foo": nil}?.list +{"foo": add} +{"foo": add}.Bar +{"foo": add}.div +{"foo": add}.foo +{"foo": add}.half +{"foo": add}.i +{"foo": add}.i64 +{"foo": add}.list +{"foo": add}.ok +{"foo": add}?.String +{"foo": add}?.array +{"foo": add}?.div +{"foo": add}?.greet +{"foo": add}?.half +{"foo": add}?.i32 +{"foo": add}?.ok +{"foo": array, "bar": "foo"}?.f32 +{"foo": array, "bar": f64} +{"foo": array, "bar": greet} +{"foo": array, "bar": list}?.f32 +{"foo": array, "bar": ok} +{"foo": array, "foo": add} +{"foo": array, "foo": greet} +{"foo": array, "foo": true}?.i +{"foo": array} +{"foo": array}.Qux +{"foo": array}.Qux?.String +{"foo": array}.String +{"foo": array}.f64 +{"foo": array}.greet +{"foo": array}.i32 +{"foo": array}.ok +{"foo": array}?.Bar +{"foo": array}?.String +{"foo": array}?.add +{"foo": array}?.array +{"foo": array}?.div +{"foo": array}?.f64 +{"foo": array}?.half +{"foo": array}?.ok +{"foo": div, "bar": 1}?.add +{"foo": div, "bar": add} +{"foo": div, "bar": div} +{"foo": div, "bar": half}.half +{"foo": div, "bar": list, "bar": 0.5}?.Qux +{"foo": div, "foo": array}.Bar +{"foo": div, "foo": true}?.Qux +{"foo": div} +{"foo": div}.Qux +{"foo": div}.array +{"foo": div}.div +{"foo": div}.foo +{"foo": div}.greet +{"foo": div}?.Bar +{"foo": div}?.Qux +{"foo": div}?.String +{"foo": div}?.add +{"foo": div}?.f64 +{"foo": div}?.half +{"foo": div}?.i +{"foo": div}?.i64 +{"foo": div}?.list +{"foo": div}?.ok +{"foo": f32 != i} +{"foo": f32 - f32} +{"foo": f32 == 0.5} +{"foo": f32, "bar": "bar"}?.String +{"foo": f32, "bar": 0.5}.f32 +{"foo": f32, "bar": i32} +{"foo": f32, "bar": list} +{"foo": f32, "foo": 1, "foo": i32}?.i32 +{"foo": f32, "foo": div} +{"foo": f32, "foo": i} +{"foo": f32, "foo": ok}?.i +{"foo": f32, "foo": type("bar")} +{"foo": f32} +{"foo": f32}.String +{"foo": f32}.add +{"foo": f32}.array +{"foo": f32}.f32 +{"foo": f32}.foo +{"foo": f32}.greet +{"foo": f32}.half +{"foo": f32}.i +{"foo": f32}.i32 +{"foo": f32}.list +{"foo": f32}?.Bar +{"foo": f32}?.Qux +{"foo": f32}?.add +{"foo": f32}?.f32 +{"foo": f32}?.f64 +{"foo": f32}?.half +{"foo": f32}?.i32 +{"foo": f32}?.score +{"foo": f64 * i} +{"foo": f64 / 1} +{"foo": f64 == 0.5} +{"foo": f64 >= 1} +{"foo": f64 ^ f32} +{"foo": f64, "bar": "foo"}.Qux +{"foo": f64, "bar": "foo"}.add +{"foo": f64, "bar": 0.5}.div +{"foo": f64, "bar": div} +{"foo": f64, "bar": greet} +{"foo": f64, "bar": half}?.list +{"foo": f64, "bar": ok}.half +{"foo": f64, "foo": foo, "bar": greet}.String +{"foo": f64, "foo": foo, "foo": "foo"}.Bar +{"foo": f64, "foo": greet} +{"foo": f64, "foo": ok, "foo": i64}?.f64 +{"foo": f64} +{"foo": f64}.Qux +{"foo": f64}.String?.f32 +{"foo": f64}.String?.i64 +{"foo": f64}.add +{"foo": f64}.array +{"foo": f64}.f64 +{"foo": f64}.foo +{"foo": f64}.greet +{"foo": f64}.i +{"foo": f64}.list +{"foo": f64}?.Bar +{"foo": f64}?.String +{"foo": f64}?.div +{"foo": f64}?.f32 +{"foo": f64}?.f64 +{"foo": f64}?.foo +{"foo": f64}?.greet +{"foo": f64}?.i +{"foo": f64}?.ok +{"foo": false, "foo": greet}?.add +{"foo": false, "foo": ok}.score +{"foo": false}.Bar +{"foo": false}.array +{"foo": false}.div +{"foo": false}.half +{"foo": false}.i +{"foo": false}?.array +{"foo": false}?.f32 +{"foo": false}?.f64 +{"foo": false}?.foo +{"foo": false}?.i64 +{"foo": false}?.list +{"foo": foo, "bar": add, "foo": foo}.Bar +{"foo": foo, "bar": ok, "foo": array}.String +{"foo": foo, "foo": foo} +{"foo": foo, "foo": list, "foo": greet}.i +{"foo": foo, "foo": nil}?.f32 +{"foo": foo, "foo": true}?.array +{"foo": foo?.Qux} +{"foo": foo} +{"foo": foo}.div +{"foo": foo}.f64 +{"foo": foo}.greet +{"foo": foo}.list +{"foo": foo}.ok +{"foo": foo}.score +{"foo": foo}?.String +{"foo": foo}?.array +{"foo": foo}?.div +{"foo": foo}?.f32 +{"foo": foo}?.foo +{"foo": foo}?.greet +{"foo": foo}?.half +{"foo": foo}?.list +{"foo": foo}?.ok +{"foo": get(array, i32)}?.i64 +{"foo": greet, "bar": 0.5, "bar": "foo"}?.half +{"foo": greet, "bar": 0.5}.Bar +{"foo": greet, "bar": f64} +{"foo": greet, "bar": f64}.list +{"foo": greet, "bar": i, "foo": foo}?.f32 +{"foo": greet, "foo": "bar", "foo": score}.i +{"foo": greet, "foo": f32} +{"foo": greet} +{"foo": greet}.Qux +{"foo": greet}.String +{"foo": greet}.add +{"foo": greet}.array +{"foo": greet}.f32?.greet +{"foo": greet}.half?.greet +{"foo": greet}.i64 +{"foo": greet}.list +{"foo": greet}.ok +{"foo": greet}?.add +{"foo": greet}?.array +{"foo": greet}?.f32 +{"foo": greet}?.half +{"foo": greet}?.i32 +{"foo": greet}?.i64 +{"foo": greet}?.list +{"foo": greet}?.score +{"foo": half(0.5)} +{"foo": half(f64)} +{"foo": half, "bar": 1}?.half +{"foo": half, "bar": add}?.foo +{"foo": half, "bar": f32}.i32 +{"foo": half, "bar": foo} +{"foo": half, "bar": half} +{"foo": half, "bar": i64, "bar": i32}.foo +{"foo": half, "bar": i64} +{"foo": half, "bar": nil}?.ok +{"foo": half, "foo": 1}?.ok +{"foo": half, "foo": div} +{"foo": half, "foo": greet, "bar": f32}?.add +{"foo": half, "foo": true}.f64 +{"foo": half} +{"foo": half}.Bar +{"foo": half}.String +{"foo": half}.div +{"foo": half}.f64 +{"foo": half}.greet +{"foo": half}.half +{"foo": half}.i +{"foo": half}.i32 +{"foo": half}.ok +{"foo": half}?.Bar +{"foo": half}?.Qux +{"foo": half}?.add +{"foo": half}?.f64 +{"foo": half}?.foo +{"foo": half}?.greet +{"foo": half}?.half +{"foo": half}?.list +{"foo": half}?.score +{"foo": hasPrefix("bar", "foo")} +{"foo": i < f64} +{"foo": i > 0.5} +{"foo": i, "bar": score} +{"foo": i, "foo": i}.i64 +{"foo": i, "foo": ok} +{"foo": i, "foo": ok}?.ok +{"foo": i32, "bar": 0.5, "foo": array}.Bar +{"foo": i32, "bar": i32}.i64 +{"foo": i32, "bar": nil}?.i64 +{"foo": i32, "foo": 0.5}.i +{"foo": i32, "foo": add} +{"foo": i32, "foo": div, "foo": nil}.Bar +{"foo": i32, "foo": foo} +{"foo": i32, "foo": greet}?.foo +{"foo": i32, "foo": i32}?.score +{"foo": i32, "foo": ok, "bar": true}.f32 +{"foo": i32, "foo": ok}?.i32 +{"foo": i32} +{"foo": i32}.Bar +{"foo": i32}.Qux +{"foo": i32}.i64 +{"foo": i32}.list +{"foo": i32}.ok +{"foo": i32}.score +{"foo": i32}?.Bar +{"foo": i32}?.Qux +{"foo": i32}?.add +{"foo": i32}?.div +{"foo": i32}?.f32 +{"foo": i32}?.greet +{"foo": i32}?.half +{"foo": i32}?.i +{"foo": i32}?.i64 +{"foo": i32}?.score +{"foo": i64 * f64, "foo": i64} +{"foo": i64 <= 0.5} +{"foo": i64 ^ i32} +{"foo": i64, "bar": "bar"}.Qux +{"foo": i64, "bar": array}.add +{"foo": i64, "bar": div} +{"foo": i64, "bar": f64, "bar": greet}.f32 +{"foo": i64, "bar": list} +{"foo": i64, "foo": 0.5, "bar": 0.5}.half +{"foo": i64, "foo": div} +{"foo": i64, "foo": i32} +{"foo": i64} +{"foo": i64}.Qux +{"foo": i64}.add +{"foo": i64}.array +{"foo": i64}?.Qux +{"foo": i64}?.String +{"foo": i64}?.f32 +{"foo": i64}?.foo +{"foo": i64}?.greet +{"foo": i64}?.i32 +{"foo": i64}?.list +{"foo": i64}?.score +{"foo": i} +{"foo": i}.Bar +{"foo": i}.String +{"foo": i}.div +{"foo": i}.foo +{"foo": i}.greet +{"foo": i}.i32?.add +{"foo": i}.ok +{"foo": i}.score +{"foo": i}?.Bar +{"foo": i}?.array +{"foo": i}?.div +{"foo": i}?.f64 +{"foo": i}?.foo +{"foo": i}?.half +{"foo": i}?.i64 +{"foo": i}?.score +{"foo": list == list}.f32 +{"foo": list, "bar": f32, "foo": i32}.i32 +{"foo": list, "bar": foo}?.list +{"foo": list, "bar": i64} +{"foo": list, "bar": score} +{"foo": list, "foo": score} +{"foo": list} +{"foo": list}.Bar +{"foo": list}.String +{"foo": list}.add +{"foo": list}.div +{"foo": list}.foo +{"foo": list}.half +{"foo": list}.i32 +{"foo": list}.score +{"foo": list}?.add +{"foo": list}?.div +{"foo": list}?.i +{"foo": list}?.i64 +{"foo": list}?.ok +{"foo": map(array, #)} +{"foo": map(array, 0.5)} +{"foo": map(array, foo)} +{"foo": map(array, ok), "bar": i32} +{"foo": map(list, 0.5)} +{"foo": map(list, score)} +{"foo": min(0.5)} +{"foo": min(1)}?.f32 +{"foo": nil == 0.5} +{"foo": nil, "bar": 0.5}.score +{"foo": nil, "bar": add}?.array +{"foo": nil, "bar": div}.Bar +{"foo": nil, "bar": f64, "foo": div}.i32 +{"foo": nil, "bar": greet}?.add +{"foo": nil, "bar": i64}?.i64 +{"foo": nil, "bar": list}?.i32 +{"foo": nil, "foo": "foo"}.add +{"foo": nil, "foo": 1}.score +{"foo": nil, "foo": false}?.add +{"foo": nil, "foo": i64}.add +{"foo": nil}.Bar +{"foo": nil}.Qux +{"foo": nil}.String +{"foo": nil}.array +{"foo": nil}.div +{"foo": nil}.f32 +{"foo": nil}.f64 +{"foo": nil}.greet?.i() +{"foo": nil}.greet?.i32 +{"foo": nil}.half +{"foo": nil}.i +{"foo": nil}.i64 +{"foo": nil}.list +{"foo": nil}?.Bar +{"foo": nil}?.Qux +{"foo": nil}?.String +{"foo": nil}?.array +{"foo": nil}?.div +{"foo": nil}?.f32?.ok +{"foo": nil}?.greet +{"foo": nil}?.i32 +{"foo": nil}?.i?.half +{"foo": nil}?.list +{"foo": nil}?.list?.greet() +{"foo": nil}?.score +{"foo": not false} +{"foo": not ok} +{"foo": ok && ok} +{"foo": ok == nil} +{"foo": ok ? true : div} +{"foo": ok, "bar": f32} +{"foo": ok, "bar": i, "foo": greet}.i32 +{"foo": ok, "bar": i32} +{"foo": ok, "foo": 0.5}?.array +{"foo": ok, "foo": 1}.Qux +{"foo": ok, "foo": half, "bar": div}.score +{"foo": ok, "foo": i64} +{"foo": ok, "foo": i64}.i +{"foo": ok, "foo": nil}?.add +{"foo": ok} +{"foo": ok}.Bar +{"foo": ok}.add +{"foo": ok}.div +{"foo": ok}.f64 +{"foo": ok}.greet +{"foo": ok}.i +{"foo": ok}.score +{"foo": ok}?.Qux +{"foo": ok}?.String +{"foo": ok}?.div +{"foo": ok}?.f32 +{"foo": ok}?.greet +{"foo": ok}?.half?.half +{"foo": ok}?.i32 +{"foo": ok}?.i64 +{"foo": ok}?.list +{"foo": score(1)} +{"foo": score, "bar": 0.5}.list +{"foo": score, "bar": 1 ^ 1} +{"foo": score, "bar": i32} +{"foo": score, "bar": i64} +{"foo": score, "foo": 0.5}.add +{"foo": score, "foo": 1}?.div +{"foo": score, "foo": add, "bar": ok} +{"foo": score, "foo": f32, "bar": false}.div +{"foo": score, "foo": f32}?.i32 +{"foo": score, "foo": i}?.f32 +{"foo": score} +{"foo": score}.Bar +{"foo": score}.array +{"foo": score}.list +{"foo": score}?.Bar +{"foo": score}?.String +{"foo": score}?.add +{"foo": score}?.f32 +{"foo": score}?.greet +{"foo": score}?.half +{"foo": score}?.i +{"foo": score}?.list +{"foo": score}?.score +{"foo": string(i32)} +{"foo": string(list)} +{"foo": toBase64("bar")} +{"foo": toJSON(f32)} +{"foo": toJSON(i64)}?.i32 +{"foo": toJSON(nil)} +{"foo": true, "bar": false}?.array +{"foo": true, "bar": nil}?.div +{"foo": true, "bar": true}.f64 +{"foo": true, "foo": array, "bar": i32}?.ok +{"foo": true, "foo": i32}.i64 +{"foo": true, "foo": ok, "foo": add}.foo +{"foo": true}.String +{"foo": true}.f32 +{"foo": true}.foo +{"foo": true}.i +{"foo": true}.i64 +{"foo": true}?.String +{"foo": true}?.greet +{"foo": true}?.i32 +{"foo": type(1)} +{"foo": type(list)} +{"foo": type(nil)} +{"foo": type(ok)} diff --git a/test/fuzz/fuzz_expr.dict b/test/fuzz/fuzz_expr.dict index 9a22cae47..48bdb059c 100644 --- a/test/fuzz/fuzz_expr.dict +++ b/test/fuzz/fuzz_expr.dict @@ -24,24 +24,43 @@ "-3" "-4" "0x" + "true" "false" -"map" -"filter" +"not" +"nil" + +"String" + +"ok" +"f64" +"f32" +"i" +"i64" +"i32" +"array" +"list" +"foo" +"add" +"div" +"half" +"score" +"greet" +"Foo" +"Bar" +"Qux" + "all" -"any" "none" +"any" "one" -"and" -"or" -"in" -"not" -"in" -"contains" -"matches" -"startsWith" -"endsWith" -"nil" +"filter" +"map" +"count" +"find" +"findIndex" +"findLast" +"findLastIndex" "len" "type" "abs" @@ -76,3 +95,5 @@ "get" "keys" "values" +"sort" +"sortBy" diff --git a/test/fuzz/fuzz_expr_seed_corpus.zip b/test/fuzz/fuzz_expr_seed_corpus.zip index 5dfe76d50f2ef2cb0343ea613647f1a8d4396c46..6f529cbbb50f62c1bc6620238be31de49ee0a9c8 100644 GIT binary patch literal 2827388 zcmbSU2Y6LQ(+*9LCLQUaClDYvJ&06MxV&HNd!VsEQlgSK|pK>A_&rvA|Q%1 zY0^806a^6#l%{@S{ddl}=kA`fZ|=_h|L4i~efs>*d*{r~J2Sico;mGX=gOTwjQ($W zyNX?#FW)sYpZMSOmp`n0SpW1PX}x`Qv&Lj~?sRWhuExLp(yxj58#$&xSdQGk

MQ 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

  • *Wt@fz(MK(}fhm*E|u=hd1l= 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

    L6~b=a@FYtkUzW9c~m2hcsf==RUc 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

    nBX#4%K5Ix_4K?uHcudy6=Ru1tqU9YXn!9yw)q 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 z⁢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¨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 Z7uLxsDqogEmcy@{w`z>Y`498u`yUP&!8iZ_ diff --git a/testdata/examples.txt b/testdata/examples.txt index f427f787d..3d3491ad4 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -2711,7 +2711,6 @@ add == score != true add == score and i32 >= 1 add == score or 0.5 < 1 add in [div] -add not in [f64] add not in sort(array) add(1, 1) ** i add(1, 1) ^ i @@ -3113,7 +3112,6 @@ array == map(array, add) array == nil != nil array == nil != true ? 0.5 : 0.5 array == nil && (false || ok) -array in [i] array[-1] array[-i32] array[-i64] @@ -6102,7 +6100,6 @@ foo == foo ? i : score foo == last(list) foo == nil == nil foo == nil || ok -foo in [half] foo in filter(list, false) foo in list foo in list ? nil : i32 diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index b03714e0f..98c34f5d8 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -237,11 +237,7 @@ func In(needle any, array any) bool { if needle == nil { value = v.MapIndex(reflect.Zero(v.Type().Key())) } else { - n := reflect.ValueOf(needle) - if !n.IsValid() { - panic(fmt.Sprintf("cannot use %T as index to %T", needle, array)) - } - value = v.MapIndex(n) + value = v.MapIndex(reflect.ValueOf(needle)) } if value.IsValid() { return true From e3c2d0e4cefd3885b00caaeee02084d80748f2f3 Mon Sep 17 00:00:00 2001 From: Anton Gilgur <4970083+agilgur5@users.noreply.github.com> Date: Wed, 4 Oct 2023 17:34:04 -0400 Subject: [PATCH 168/506] docs: categorize Language Definition functions (#452) * docs: categorize Language Definition functions - multi-type / misc functions - Type Conversion functions - String functions - Date functions - Number functions - Array functions - Map functions - also consistently use `str`, `array`, `n`, `v` for the variable name when referring to a specific type - `array` was used consistently for older functions, but not some newer ones - `str` added to match `array` - `n` was sometimes used for numbers or ints, but not always - `v` is for multi-type "values" Signed-off-by: Anton Gilgur * review feedback -- categories to h2 - categories to h2, individual functions to h3 per review feedback - rename "Built-in Functions" -> "Miscellaneous Functions" as this is now only around the uncategorized functions - move this to the bottom of the function list as well so that "miscellaneous" is not first - combine "Date Manipulation" with "Date Functions" Signed-off-by: Anton Gilgur * move type functions to second-to-last before misc functions, per code review Signed-off-by: Anton Gilgur * move number to after string per code review Signed-off-by: Anton Gilgur --------- Signed-off-by: Anton Gilgur --- docs/Language-Definition.md | 432 ++++++++++++++++++------------------ 1 file changed, 221 insertions(+), 211 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 026d1fe26..352b2ec79 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -193,302 +193,315 @@ For example, expression `split(lower(user.Name), " ")` can be written as: user.Name | lower() | split(" ") ``` -### Date Manipulation +## String Functions -The following operators can be used to manipulate dates: +### trim(str[, chars]) + +Removes white spaces from both ends of a string `str`. +If the optional `chars` argument is given, it is a string specifying the set of characters to be removed. ```expr -date("2023-08-14") + duration("1h") -date("2023-08-14") - duration("1h") -date("2023-08-14") - date("2023-08-13") == duration("24h") +trim(" Hello ") == "Hello" +trim("__Hello__", "_") == "Hello" ``` -## Built-in Functions +### trimPrefix(str, prefix) -### all(array, predicate) - -Returns **true** if all elements satisfies the [predicate](#predicate). -If the array is empty, returns **true**. +Removes the specified prefix from the string `str` if it starts with that prefix. ```expr -all(tweets, {.Size < 280}) +trimPrefix("HelloWorld", "Hello") == "World" ``` -### any(array, predicate) +### trimSuffix(str, suffix) -Returns **true** if any elements satisfies the [predicate](#predicate). -If the array is empty, returns **false**. - -### one(array, predicate) - -Returns **true** if _exactly one_ element satisfies the [predicate](#predicate). -If the array is empty, returns **false**. +Removes the specified suffix from the string `str` if it ends with that suffix. ```expr -one(participants, {.Winner}) +trimSuffix("HelloWorld", "World") == "Hello" ``` -### none(array, predicate) +### upper(str) -Returns **true** if _all elements does not_ satisfy the [predicate](#predicate). -If the array is empty, returns **true**. - -### map(array, predicate) - -Returns new array by applying the [predicate](#predicate) to each element of -the array. +Converts all the characters in string `str` to uppercase. ```expr -map(tweets, {.Size}) +upper("hello") == "HELLO" ``` -### filter(array, predicate) +### lower(str) -Returns new array by filtering elements of the array by [predicate](#predicate). +Converts all the characters in string `str` to lowercase. ```expr -filter(users, .Name startsWith "J") +lower("HELLO") == "hello" ``` -### find(array, predicate) +### split(str, delimiter[, n]) -Finds the first element in an array that satisfies the [predicate](#predicate). +Splits the string `str` at each instance of the delimiter and returns an array of substrings. ```expr -find([1, 2, 3, 4], # > 2) == 3 +split("apple,orange,grape", ",") == ["apple", "orange", "grape"] +split("apple,orange,grape", ",", 2) == ["apple", "orange,grape"] ``` -### findIndex(array, predicate) +### splitAfter(str, delimiter[, n]) -Finds the index of the first element in an array that satisfies the [predicate](#predicate). +Splits the string `str` after each instance of the delimiter. ```expr -findIndex([1, 2, 3, 4], # > 2) == 2 +splitAfter("apple,orange,grape", ",") == ["apple,", "orange,", "grape"] +splitAfter("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"] ``` -### findLast(array, predicate) +### replace(str, old, new) -Finds the last element in an array that satisfies the [predicate](#predicate). +Replaces all occurrences of `old` in string `str` with `new`. ```expr -findLast([1, 2, 3, 4], # > 2) == 4 +replace("Hello World", "World", "Universe") == "Hello Universe" ``` -### findLastIndex(array, predicate) +### repeat(str, n) -Finds the index of the last element in an array that satisfies the [predicate](#predicate). +Repeats the string `str` `n` times. ```expr -findLastIndex([1, 2, 3, 4], # > 2) == 3 +repeat("Hi", 3) == "HiHiHi" ``` -### groupBy(array, predicate) +### indexOf(str, substring) -Groups the elements of an array by the result of the [predicate](#predicate). +Returns the index of the first occurrence of the substring in string `str` or -1 if not found. ```expr -groupBy(users, .Age) +indexOf("apple pie", "pie") == 6 ``` -### count(array, predicate) +### lastIndexOf(str, substring) -Returns the number of elements what satisfies the [predicate](#predicate). - -Equivalent to: +Returns the index of the last occurrence of the substring in string `str` or -1 if not found. ```expr -len(filter(array, predicate)) +lastIndexOf("apple pie apple", "apple") == 10 ``` -### reduce(array, predicate[, initialValue]) +### hasPrefix(str, prefix) -Applies a predicate to each element in the array, reducing the array to a single value. -Optional `initialValue` argument can be used to specify the initial value of the accumulator. -If `initialValue` is not given, the first element of the array is used as the initial value. +Returns `true` if string `str` starts with the given prefix. -Following variables are available in the predicate: +```expr +hasPrefix("HelloWorld", "Hello") == true +``` -- `#` - the current element -- `#acc` - the accumulator -- `#index` - the index of the current element +### hasSuffix(str, suffix) + +Returns `true` if string `str` ends with the given suffix. ```expr -reduce(1..9, #acc + #) -reduce(1..9, #acc + #, 0) +hasSuffix("HelloWorld", "World") == true ``` -### len(v) +## Date Functions -Returns the length of an array, a map or a string. +The following operators can be used to manipulate dates: -### type(v) +```expr +date("2023-08-14") + duration("1h") +date("2023-08-14") - duration("1h") +date("2023-08-14") - date("2023-08-13") == duration("24h") +``` -Returns the type of the given value `v`. -Returns on of the following types: `nil`, `bool`, `int`, `uint`, `float`, `string`, `array`, `map`. -For named types and structs, the type name is returned. +### now() + +Returns the current date and time. ```expr -type(42) == "int" -type("hello") == "string" -type(now()) == "time.Time" +createdAt > now() - duration(1h) ``` -### abs(v) +### duration(str) -Returns the absolute value of a number. +Returns [time.Duration](https://pkg.go.dev/time#Duration) value of the given string `str`. -### int(v) - -Returns the integer value of a number or a string. +Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". ```expr -int("123") == 123 +duration("1h").Seconds() == 3600 ``` -### float(v) - -Returns the float value of a number or a string. +### date(str[, format[, timezone]]) -### string(v) +Converts the given string `str` into a date representation. -Converts the given value `v` into a string representation. +If the optional `format` argument is given, it is a string specifying the format of the date. +The format string uses the same formatting rules as the standard +Go [time package](https://pkg.go.dev/time#pkg-constants). -```expr -string(123) == "123" -``` +If the optional `timezone` argument is given, it is a string specifying the timezone of the date. -### trim(v[, chars]) +If the `format` argument is not given, the `v` argument must be in one of the following formats: -Removes white spaces from both ends of a string `v`. -If the optional `chars` argument is given, it is a string specifying the set of characters to be removed. +- 2006-01-02 +- 15:04:05 +- 2006-01-02 15:04:05 +- RFC3339 +- RFC822, +- RFC850, +- RFC1123, ```expr -trim(" Hello ") == "Hello" -trim("__Hello__", "_") == "Hello" +date("2023-08-14") +date("15:04:05") +date("2023-08-14T00:00:00Z") +date("2023-08-14 00:00:00", "2006-01-02 15:04:05", "Europe/Zurich") ``` -### trimPrefix(v, prefix) +## Number Functions -Removes the specified prefix from the string `v` if it starts with that prefix. +### max(n1, n2) + +Returns the maximum of the two numbers `n1` and `n2`. ```expr -trimPrefix("HelloWorld", "Hello") == "World" +max(5, 7) == 7 ``` -### trimSuffix(v, suffix) +### min(n1, n2) -Removes the specified suffix from the string `v` if it ends with that suffix. +Returns the minimum of the two numbers `n1` and `n2`. ```expr -trimSuffix("HelloWorld", "World") == "Hello" +min(5, 7) == 5 ``` -### upper(v) +### abs(n) -Converts all the characters in string `v` to uppercase. +Returns the absolute value of a number. -```expr -upper("hello") == "HELLO" -``` +## Array Functions -### lower(v) +### all(array, predicate) -Converts all the characters in string `v` to lowercase. +Returns **true** if all elements satisfies the [predicate](#predicate). +If the array is empty, returns **true**. ```expr -lower("HELLO") == "hello" +all(tweets, {.Size < 280}) ``` -### split(v, delimiter[, n]) +### any(array, predicate) + +Returns **true** if any elements satisfies the [predicate](#predicate). +If the array is empty, returns **false**. -Splits the string `v` at each instance of the delimiter and returns an array of substrings. +### one(array, predicate) + +Returns **true** if _exactly one_ element satisfies the [predicate](#predicate). +If the array is empty, returns **false**. ```expr -split("apple,orange,grape", ",") == ["apple", "orange", "grape"] -split("apple,orange,grape", ",", 2) == ["apple", "orange,grape"] +one(participants, {.Winner}) ``` -### splitAfter(v, delimiter[, n]) +### none(array, predicate) -Splits the string `v` after each instance of the delimiter. +Returns **true** if _all elements does not_ satisfy the [predicate](#predicate). +If the array is empty, returns **true**. + +### map(array, predicate) + +Returns new array by applying the [predicate](#predicate) to each element of +the array. ```expr -splitAfter("apple,orange,grape", ",") == ["apple,", "orange,", "grape"] -splitAfter("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"] +map(tweets, {.Size}) ``` -### replace(v, old, new) +### filter(array, predicate) -Replaces all occurrences of `old` in string `v` with `new`. +Returns new array by filtering elements of the array by [predicate](#predicate). ```expr -replace("Hello World", "World", "Universe") == "Hello Universe" +filter(users, .Name startsWith "J") ``` -### repeat(v, n) +### find(array, predicate) -Repeats the string `v` `n` times. +Finds the first element in an array that satisfies the [predicate](#predicate). ```expr -repeat("Hi", 3) == "HiHiHi" +find([1, 2, 3, 4], # > 2) == 3 ``` -### join(v[, delimiter]) +### findIndex(array, predicate) -Joins an array of strings `v` into a single string with the given delimiter. -If no delimiter is given, an empty string is used. +Finds the index of the first element in an array that satisfies the [predicate](#predicate). ```expr -join(["apple", "orange", "grape"], ",") == "apple,orange,grape" -join(["apple", "orange", "grape"]) == "appleorangegrape" +findIndex([1, 2, 3, 4], # > 2) == 2 ``` -### indexOf(v, substring) +### findLast(array, predicate) -Returns the index of the first occurrence of the substring in string `v` or -1 if not found. +Finds the last element in an array that satisfies the [predicate](#predicate). ```expr -indexOf("apple pie", "pie") == 6 +findLast([1, 2, 3, 4], # > 2) == 4 ``` -### lastIndexOf(v, substring) +### findLastIndex(array, predicate) -Returns the index of the last occurrence of the substring in string `v` or -1 if not found. +Finds the index of the last element in an array that satisfies the [predicate](#predicate). ```expr -lastIndexOf("apple pie apple", "apple") == 10 +findLastIndex([1, 2, 3, 4], # > 2) == 3 ``` -### hasPrefix(v, prefix) +### groupBy(array, predicate) -Returns `true` if string `v` starts with the given prefix. +Groups the elements of an array by the result of the [predicate](#predicate). ```expr -hasPrefix("HelloWorld", "Hello") == true +groupBy(users, .Age) ``` -### hasSuffix(v, suffix) +### count(array, predicate) -Returns `true` if string `v` ends with the given suffix. +Returns the number of elements what satisfies the [predicate](#predicate). + +Equivalent to: ```expr -hasSuffix("HelloWorld", "World") == true +len(filter(array, predicate)) ``` -### max(v1, v2) +### join(array[, delimiter]) -Returns the maximum of the two values `v1` and `v2`. +Joins an array of strings into a single string with the given delimiter. +If no delimiter is given, an empty string is used. ```expr -max(5, 7) == 7 +join(["apple", "orange", "grape"], ",") == "apple,orange,grape" +join(["apple", "orange", "grape"]) == "appleorangegrape" ``` -### min(v1, v2) +### reduce(array, predicate[, initialValue]) + +Applies a predicate to each element in the array, reducing the array to a single value. +Optional `initialValue` argument can be used to specify the initial value of the accumulator. +If `initialValue` is not given, the first element of the array is used as the initial value. -Returns the minimum of the two values `v1` and `v2`. +Following variables are available in the predicate: + +- `#` - the current element +- `#acc` - the accumulator +- `#index` - the index of the current element ```expr -min(5, 7) == 5 +reduce(1..9, #acc + #) +reduce(1..9, #acc + #, 0) ``` ### sum(array) @@ -515,131 +528,132 @@ Returns the median of all numbers in the array. median([1, 2, 3]) == 2.0 ``` -### toJSON(v) +### first(array) -Converts the given value `v` to its JSON string representation. +Returns the first element from an array. If the array is empty, returns `nil`. ```expr -toJSON({"name": "John", "age": 30}) +first([1, 2, 3]) == 1 ``` -### fromJSON(v) +### last(array) -Parses the given JSON string `v` and returns the corresponding value. +Returns the last element from an array. If the array is empty, returns `nil`. ```expr -fromJSON('{"name": "John", "age": 30}') +last([1, 2, 3]) == 3 ``` -### toBase64(v) +### take(array, n) -Encodes the string `v` into Base64 format. +Returns the first `n` elements from an array. If the array has fewer than `n` elements, returns the whole array. ```expr -toBase64("Hello World") == "SGVsbG8gV29ybGQ=" +take([1, 2, 3, 4], 2) == [1, 2] ``` -### fromBase64(v) +### sort(array[, order]) -Decodes the Base64 encoded string `v` back to its original form. +Sorts an array in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc` +or `desc`. ```expr -fromBase64("SGVsbG8gV29ybGQ=") == "Hello World" +sort([3, 1, 4]) == [1, 3, 4] +sort([3, 1, 4], "desc") == [4, 3, 1] ``` -### now() +### sortBy(array, key[, order]) -Returns the current date and time. +Sorts an array of maps by a specific key in ascending order. Optional `order` argument can be used to specify the order +of sorting: `asc` or `desc`. ```expr -createdAt > now() - duration(1h) +sortBy(users, "Age") +sortBy(users, "Age", "desc") ``` -### duration(v) +## Map Functions -Returns [time.Duration](https://pkg.go.dev/time#Duration) value of the given string `v`. +### keys(map) -Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". +Returns an array containing the keys of the map. ```expr -duration("1h").Seconds() == 3600 +keys({"name": "John", "age": 30}) == ["name", "age"] ``` -### date(v[, format[, timezone]]) +### values(map) -Converts the given value `v` into a date representation. +Returns an array containing the values of the map. -If the optional `format` argument is given, it is a string specifying the format of the date. -The format string uses the same formatting rules as the standard -Go [time package](https://pkg.go.dev/time#pkg-constants). +```expr +values({"name": "John", "age": 30}) == ["John", 30] +``` -If the optional `timezone` argument is given, it is a string specifying the timezone of the date. +## Type Conversion Functions -If the `format` argument is not given, the `v` argument must be in one of the following formats: +### type(v) -- 2006-01-02 -- 15:04:05 -- 2006-01-02 15:04:05 -- RFC3339 -- RFC822, -- RFC850, -- RFC1123, +Returns the type of the given value `v`. +Returns on of the following types: `nil`, `bool`, `int`, `uint`, `float`, `string`, `array`, `map`. +For named types and structs, the type name is returned. ```expr -date("2023-08-14") -date("15:04:05") -date("2023-08-14T00:00:00Z") -date("2023-08-14 00:00:00", "2006-01-02 15:04:05", "Europe/Zurich") +type(42) == "int" +type("hello") == "string" +type(now()) == "time.Time" ``` -### first(v) +### int(v) -Returns the first element from an array `v`. If the array is empty, returns `nil`. +Returns the integer value of a number or a string. ```expr -first([1, 2, 3]) == 1 +int("123") == 123 ``` -### last(v) +### float(v) -Returns the last element from an array `v`. If the array is empty, returns `nil`. +Returns the float value of a number or a string. + +### string(v) + +Converts the given value `v` into a string representation. ```expr -last([1, 2, 3]) == 3 +string(123) == "123" ``` -### get(v, index) +### toJSON(v) -Retrieves the element at the specified index from an array or map `v`. If the index is out of range, returns `nil`. -Or the key does not exist, returns `nil`. +Converts the given value `v` to its JSON string representation. ```expr -get([1, 2, 3], 1) == 2 -get({"name": "John", "age": 30}, "name") == "John" +toJSON({"name": "John", "age": 30}) ``` -### take(array, n) +### fromJSON(v) -Returns the first `n` elements from an array. If the array has fewer than `n` elements, returns the whole array. +Parses the given JSON string `v` and returns the corresponding value. ```expr -take([1, 2, 3, 4], 2) == [1, 2] +fromJSON('{"name": "John", "age": 30}') ``` -### keys(map) +### toBase64(v) -Returns an array containing the keys of the map. +Encodes the string `v` into Base64 format. ```expr -keys({"name": "John", "age": 30}) == ["name", "age"] +toBase64("Hello World") == "SGVsbG8gV29ybGQ=" ``` -### values(map) +### fromBase64(v) -Returns an array containing the values of the map. +Decodes the Base64 encoded string `v` back to its original form. ```expr -values({"name": "John", "age": 30}) == ["John", 30] +fromBase64("SGVsbG8gV29ybGQ=") == "Hello World" ``` ### toPairs(map) @@ -658,30 +672,26 @@ Converts an array of key-value pairs to a map. fromPairs([["name", "John"], ["age", 30]]) == {"name": "John", "age": 30} ``` -### sort(array[, order]) +## Miscellaneous Functions -Sorts an array in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc` -or `desc`. +### len(v) -```expr -sort([3, 1, 4]) == [1, 3, 4] -sort([3, 1, 4], "desc") == [4, 3, 1] -``` +Returns the length of an array, a map or a string. -### sortBy(array, key[, order]) +### get(v, index) -Sorts an array of maps by a specific key in ascending order. Optional `order` argument can be used to specify the order -of sorting: `asc` or `desc`. +Retrieves the element at the specified index from an array or map `v`. If the index is out of range, returns `nil`. +Or the key does not exist, returns `nil`. ```expr -sortBy(users, "Age") -sortBy(users, "Age", "desc") +get([1, 2, 3], 1) == 2 +get({"name": "John", "age": 30}, "name") == "John" ``` ## Predicate The predicate is an expression. It takes one or more arguments and returns a boolean value. -To access the arguments, the `#` symbol is used. +To access the arguments, the `#` symbol is used. ```expr map(0..9, {# / 2}) From 7f0746399c3812a3a3dc6381f0c5805882f74bbc Mon Sep 17 00:00:00 2001 From: Augustin Peyrard Date: Thu, 16 Nov 2023 03:40:28 -0800 Subject: [PATCH 169/506] Fix Fetch and OpDeref (#467) * Fix OpDeref allowing to deref pointer of interfaces Loop over `Ptr` and `Interface` kind and get `Elem`. Also return directly the `nil` otherwise we might are returning the pointer nil value and not the base nil. * Fix deref interface in Fetch We were only de-referencing pointers, but we can have pointer of interface or interface obfuscating pointers... So before trying to fetch anything, just deference fully the variable. --- expr_test.go | 15 ++++++++++ test/deref/deref_test.go | 63 ++++++++++++++++++++++++++++++++++++++++ vm/runtime/runtime.go | 32 ++++++++------------ 3 files changed, 90 insertions(+), 20 deletions(-) diff --git a/expr_test.go b/expr_test.go index 4cb1902a5..507729947 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1204,6 +1204,21 @@ func TestExpr_fetch_from_func(t *testing.T) { assert.Contains(t, err.Error(), "cannot fetch Value from func()") } +func TestExpr_fetch_from_interface(t *testing.T) { + type FooBar struct { + Value string + } + foobar := &FooBar{"waldo"} + var foobarAny any = foobar + var foobarPtrAny any = &foobarAny + + res, err := expr.Eval("foo.Value", map[string]any{ + "foo": foobarPtrAny, + }) + assert.NoError(t, err) + assert.Equal(t, "waldo", res) +} + func TestExpr_map_default_values(t *testing.T) { env := map[string]any{ "foo": map[string]string{}, diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index 4af128bde..283631c0d 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -137,3 +137,66 @@ func TestDeref_multiple_pointers(t *testing.T) { require.Equal(t, 44, output) }) } + +func TestDeref_pointer_of_interface(t *testing.T) { + v := 42 + a := &v + b := any(a) + c := any(&b) + t.Run("returned as is", func(t *testing.T) { + output, err := expr.Eval(`c`, map[string]any{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, c, output) + require.IsType(t, (*interface{})(nil), output) + }) + t.Run("+ works", func(t *testing.T) { + output, err := expr.Eval(`c+2`, map[string]any{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, 44, output) + }) +} + +func TestDeref_nil(t *testing.T) { + var b *int = nil + c := &b + t.Run("returned as is", func(t *testing.T) { + output, err := expr.Eval(`c`, map[string]any{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, c, output) + require.IsType(t, (**int)(nil), output) + }) + t.Run("== nil works", func(t *testing.T) { + output, err := expr.Eval(`c == nil`, map[string]any{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, true, output) + }) +} + +func TestDeref_nil_in_pointer_of_interface(t *testing.T) { + var a *int32 = nil + b := any(a) + c := any(&b) + t.Run("returned as is", func(t *testing.T) { + output, err := expr.Eval(`c`, map[string]any{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, c, output) + require.IsType(t, (*interface{})(nil), output) + }) + t.Run("== nil works", func(t *testing.T) { + output, err := expr.Eval(`c == nil`, map[string]any{ + "c": c, + }) + require.NoError(t, err) + require.Equal(t, true, output) + }) +} diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 98c34f5d8..406f85096 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -8,6 +8,14 @@ import ( "reflect" ) +func deref(kind reflect.Kind, value reflect.Value) (reflect.Kind, reflect.Value) { + for kind == reflect.Ptr || kind == reflect.Interface { + value = value.Elem() + kind = value.Kind() + } + return kind, value +} + func Fetch(from, i any) any { v := reflect.ValueOf(from) kind := v.Kind() @@ -28,10 +36,8 @@ func Fetch(from, i any) any { // Structs, maps, and slices can be access through a pointer or through // a value, when they are accessed through a pointer we don't want to // copy them to a value. - if kind == reflect.Ptr { - v = reflect.Indirect(v) - kind = v.Kind() - } + // De-reference everything if necessary (interface and pointers) + kind, v = deref(kind, v) // TODO: We can create separate opcodes for each of the cases below to make // the little bit faster. @@ -145,27 +151,13 @@ func Deref(i any) any { v := reflect.ValueOf(i) - if v.Kind() == reflect.Interface { + for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { if v.IsNil() { - return i + return nil } v = v.Elem() } -loop: - for v.Kind() == reflect.Ptr { - if v.IsNil() { - return i - } - indirect := reflect.Indirect(v) - switch indirect.Kind() { - case reflect.Struct, reflect.Map, reflect.Array, reflect.Slice: - break loop - default: - v = v.Elem() - } - } - if v.IsValid() { return v.Interface() } From fcf2b55decfdb74892e3f30e28c73f45cd24ec15 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 15:41:43 +0100 Subject: [PATCH 170/506] Do not copy node type in ast.Patch Fixes #468 --- ast/node.go | 1 - checker/checker.go | 8 ++++ test/patch/set_type/set_type_test.go | 56 ++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 test/patch/set_type/set_type_test.go diff --git a/ast/node.go b/ast/node.go index d037926c1..ea2ddfd30 100644 --- a/ast/node.go +++ b/ast/node.go @@ -17,7 +17,6 @@ type Node interface { } func Patch(node *Node, newNode Node) { - newNode.SetType((*node).Type()) newNode.SetLocation((*node).Location()) *node = newNode } diff --git a/checker/checker.go b/checker/checker.go index da46b6f9f..0f6f34b5b 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -536,6 +536,14 @@ func (v *checker) SliceNode(node *ast.SliceNode) (reflect.Type, info) { } func (v *checker) CallNode(node *ast.CallNode) (reflect.Type, info) { + t, i := v.functionReturnType(node) + if node.Type() != nil { + return node.Type(), i + } + return t, i +} + +func (v *checker) functionReturnType(node *ast.CallNode) (reflect.Type, info) { fn, fnInfo := v.visit(node.Callee) if fnInfo.fn != nil { diff --git a/test/patch/set_type/set_type_test.go b/test/patch/set_type/set_type_test.go new file mode 100644 index 000000000..bdeee7d68 --- /dev/null +++ b/test/patch/set_type/set_type_test.go @@ -0,0 +1,56 @@ +package set_type_test + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/ast" +) + +func TestPatch_SetType(t *testing.T) { + _, err := expr.Compile( + `Value + "string"`, + expr.Env(Env{}), + expr.Function( + "getValue", + func(params ...any) (any, error) { + return params[0].(Value).Int, nil + }, + // We can set function type right here, + // but we want to check what SetType in + // getValuePatcher will take an effect. + ), + expr.Patch(getValuePatcher{}), + ) + require.Error(t, err) +} + +type Value struct { + Int int +} + +type Env struct { + Value Value +} + +var valueType = reflect.TypeOf((*Value)(nil)).Elem() + +type getValuePatcher struct{} + +func (getValuePatcher) Visit(node *ast.Node) { + id, ok := (*node).(*ast.IdentifierNode) + if !ok { + return + } + if id.Type() == valueType { + newNode := &ast.CallNode{ + Callee: &ast.IdentifierNode{Value: "getValue"}, + Arguments: []ast.Node{id}, + } + newNode.SetType(reflect.TypeOf(0)) + ast.Patch(node, newNode) + } +} From dbbec977b30469c99b7f9d586423d4e7bcbd0bb2 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 15:49:53 +0100 Subject: [PATCH 171/506] Fix checker panic Fixes #453 --- checker/checker.go | 5 +++++ expr_test.go | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/checker/checker.go b/checker/checker.go index 0f6f34b5b..fdf474bc3 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -560,6 +560,11 @@ func (v *checker) functionReturnType(node *ast.CallNode) (reflect.Type, info) { fnName = name.Value } } + + if fn == nil { + return v.error(node, "%v is nil; cannot call nil as function", fnName) + } + switch fn.Kind() { case reflect.Interface: return anyType, info{} diff --git a/expr_test.go b/expr_test.go index 507729947..ec3fa1e29 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2014,3 +2014,11 @@ func TestIssue432(t *testing.T) { assert.NoError(t, err) assert.Equal(t, float64(10), out) } + +func TestIssue453(t *testing.T) { + env := map[string]any{ + "foo": nil, + } + _, err := expr.Compile(`foo()`, expr.Env(env)) + require.Error(t, err) +} From 507d734cb9c76a4850112181533208b5911dfb46 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 16:22:34 +0100 Subject: [PATCH 172/506] Fix ast printing for ?? operator Fixes #442 --- ast/print.go | 21 +++++++++++++-------- ast/print_test.go | 6 ++++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/ast/print.go b/ast/print.go index dd9e0db0f..b4fb4f367 100644 --- a/ast/print.go +++ b/ast/print.go @@ -58,18 +58,23 @@ func (n *UnaryNode) String() string { } func (n *BinaryNode) String() string { - var left, right string - if b, ok := n.Left.(*BinaryNode); ok && operator.Less(b.Operator, n.Operator) { - left = fmt.Sprintf("(%s)", n.Left.String()) + var lhs, rhs string + + lb, ok := n.Left.(*BinaryNode) + if ok && (operator.Less(lb.Operator, n.Operator) || lb.Operator == "??") { + lhs = fmt.Sprintf("(%s)", n.Left.String()) } else { - left = n.Left.String() + lhs = n.Left.String() } - if b, ok := n.Right.(*BinaryNode); ok && operator.Less(b.Operator, n.Operator) { - right = fmt.Sprintf("(%s)", n.Right.String()) + + rb, ok := n.Right.(*BinaryNode) + if ok && operator.Less(rb.Operator, n.Operator) { + rhs = fmt.Sprintf("(%s)", n.Right.String()) } else { - right = n.Right.String() + rhs = n.Right.String() } - return fmt.Sprintf("%s %s %s", left, n.Operator, right) + + return fmt.Sprintf("%s %s %s", lhs, n.Operator, rhs) } func (n *ChainNode) String() string { diff --git a/ast/print_test.go b/ast/print_test.go index 7bb5c85b2..077e85582 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -3,10 +3,11 @@ package ast_test import ( "testing" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/antonmedv/expr/ast" + "github.com/antonmedv/expr/parser" ) func TestPrint(t *testing.T) { @@ -67,6 +68,7 @@ func TestPrint(t *testing.T) { {`a[1:]`, `a[1:]`}, {`a[1:]`, `a[1:]`}, {`a[:]`, `a[:]`}, + {`(nil ?? 1) > 0`, `(nil ?? 1) > 0`}, } for _, tt := range tests { From d27e5a322e71bd7e8fa0d970883d525c3ff1413b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 16:29:52 +0100 Subject: [PATCH 173/506] Add support for float in sort() builtin Fixes #448 --- builtin/builtin_test.go | 7 +++++-- builtin/sort.go | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 62bd12562..533f59a88 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -7,14 +7,15 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/antonmedv/expr" "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" "github.com/antonmedv/expr/test/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestBuiltin(t *testing.T) { @@ -403,6 +404,7 @@ func TestBuiltin_sort(t *testing.T) { env := map[string]any{ "ArrayOfString": []string{"foo", "bar", "baz"}, "ArrayOfInt": []int{3, 2, 1}, + "ArrayOfFloat": []float64{3.0, 2.0, 1.0}, "ArrayOfFoo": []mock.Foo{{Value: "c"}, {Value: "a"}, {Value: "b"}}, } tests := []struct { @@ -411,6 +413,7 @@ func TestBuiltin_sort(t *testing.T) { }{ {`sort([])`, []any{}}, {`sort(ArrayOfInt)`, []any{1, 2, 3}}, + {`sort(ArrayOfFloat)`, []any{1.0, 2.0, 3.0}}, {`sort(ArrayOfInt, 'desc')`, []any{3, 2, 1}}, {`sortBy(ArrayOfFoo, 'Value')`, []any{mock.Foo{Value: "a"}, mock.Foo{Value: "b"}, mock.Foo{Value: "c"}}}, {`sortBy([{id: "a"}, {id: "b"}], "id", "desc")`, []any{map[string]any{"id": "b"}, map[string]any{"id": "a"}}}, diff --git a/builtin/sort.go b/builtin/sort.go index 31e302c72..9b9ddc165 100644 --- a/builtin/sort.go +++ b/builtin/sort.go @@ -33,6 +33,11 @@ func (s *Sortable) Less(i, j int) bool { return a.Int() > b.Int() } return a.Int() < b.Int() + case reflect.Float64, reflect.Float32: + if s.Desc { + return a.Float() > b.Float() + } + return a.Float() < b.Float() case reflect.String: if s.Desc { return a.String() > b.String() From 0354d1b2aae9b78a2b7baeaa37537f1871f1647e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 21:39:50 +0100 Subject: [PATCH 174/506] Only emit OpEqual{Int,String} for simple types Fixes #461 --- compiler/compiler.go | 19 +++++++++-- expr_test.go | 80 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 8e26d8788..eada2ad04 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -360,6 +360,10 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { l := kind(node.Left) r := kind(node.Right) + leftIsSimple := isSimpleType(node.Left) + rightIsSimple := isSimpleType(node.Right) + leftAndRightAreSimple := leftIsSimple && rightIsSimple + switch node.Operator { case "==": c.compile(node.Left) @@ -367,9 +371,9 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { c.compile(node.Right) c.derefInNeeded(node.Left) - if l == r && l == reflect.Int { + if l == r && l == reflect.Int && leftAndRightAreSimple { c.emit(OpEqualInt) - } else if l == r && l == reflect.String { + } else if l == r && l == reflect.String && leftAndRightAreSimple { c.emit(OpEqualString) } else { c.emit(OpEqual) @@ -534,6 +538,17 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { } } +func isSimpleType(node ast.Node) bool { + if node == nil { + return false + } + t := node.Type() + if t == nil { + return false + } + return t.PkgPath() == "" +} + func (c *compiler) ChainNode(node *ast.ChainNode) { c.chains = append(c.chains, []int{}) c.compile(node.Node) diff --git a/expr_test.go b/expr_test.go index ec3fa1e29..9338bd72d 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2022,3 +2022,83 @@ func TestIssue453(t *testing.T) { _, err := expr.Compile(`foo()`, expr.Env(env)) require.Error(t, err) } + +func TestIssue461(t *testing.T) { + type EnvStr string + type EnvField struct { + S EnvStr + Str string + } + type Env struct { + S EnvStr + Str string + EnvField EnvField + } + var tests = []struct { + input string + env Env + want bool + }{ + { + input: "Str == S", + env: Env{S: "string", Str: "string"}, + want: false, + }, + { + input: "Str == Str", + env: Env{Str: "string"}, + want: true, + }, + { + input: "S == S", + env: Env{Str: "string"}, + want: true, + }, + { + input: `Str == "string"`, + env: Env{Str: "string"}, + want: true, + }, + { + input: `S == "string"`, + env: Env{Str: "string"}, + want: false, + }, + { + input: "EnvField.Str == EnvField.S", + env: Env{EnvField: EnvField{S: "string", Str: "string"}}, + want: false, + }, + { + input: "EnvField.Str == EnvField.Str", + env: Env{EnvField: EnvField{Str: "string"}}, + want: true, + }, + { + input: "EnvField.S == EnvField.S", + env: Env{EnvField: EnvField{Str: "string"}}, + want: true, + }, + { + input: `EnvField.Str == "string"`, + env: Env{EnvField: EnvField{Str: "string"}}, + want: true, + }, + { + input: `EnvField.S == "string"`, + env: Env{EnvField: EnvField{Str: "string"}}, + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + program, err := expr.Compile(tt.input, expr.Env(tt.env), expr.AsBool()) + + out, err := expr.Run(program, tt.env) + require.NoError(t, err) + + require.Equal(t, tt.want, out) + }) + } +} From e9607c76a2c19a0c3548b1be8781830c22bd133f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 22:12:50 +0100 Subject: [PATCH 175/506] Improve type checking for $env Fixes #462 --- ast/node.go | 18 ++++++++++++++++++ checker/checker.go | 46 ++++++++++++++++++++++++++++++---------------- expr_test.go | 12 +++++++++++- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/ast/node.go b/ast/node.go index ea2ddfd30..d9c0d73da 100644 --- a/ast/node.go +++ b/ast/node.go @@ -54,6 +54,15 @@ type IdentifierNode struct { MethodIndex int // index of method, set only if Method is true } +func (n *IdentifierNode) SetFieldIndex(field []int) { + n.FieldIndex = field +} + +func (n *IdentifierNode) SetMethodIndex(methodIndex int) { + n.Method = true + n.MethodIndex = methodIndex +} + type IntegerNode struct { base Value int @@ -111,6 +120,15 @@ type MemberNode struct { MethodIndex int } +func (n *MemberNode) SetFieldIndex(field []int) { + n.FieldIndex = field +} + +func (n *MemberNode) SetMethodIndex(methodIndex int) { + n.Method = true + n.MethodIndex = methodIndex +} + type SliceNode struct { base Node Node diff --git a/checker/checker.go b/checker/checker.go index fdf474bc3..8e536518c 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -157,23 +157,34 @@ func (v *checker) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) if node.Value == "$env" { return mapType, info{} } - if fn, ok := v.config.Builtins[node.Value]; ok { + return v.env(node, node.Value, true) +} + +type NodeWithIndexes interface { + ast.Node + SetFieldIndex(field []int) + SetMethodIndex(methodIndex int) +} + +func (v *checker) env(node NodeWithIndexes, name string, strict bool) (reflect.Type, info) { + if fn, ok := v.config.Builtins[name]; ok { return functionType, info{fn: fn} } - if fn, ok := v.config.Functions[node.Value]; ok { + if fn, ok := v.config.Functions[name]; ok { return functionType, info{fn: fn} } - if t, ok := v.config.Types[node.Value]; ok { + if t, ok := v.config.Types[name]; ok { if t.Ambiguous { - return v.error(node, "ambiguous identifier %v", node.Value) + return v.error(node, "ambiguous identifier %v", name) + } + node.SetFieldIndex(t.FieldIndex) + if t.Method { + node.SetMethodIndex(t.MethodIndex) } - node.Method = t.Method - node.MethodIndex = t.MethodIndex - node.FieldIndex = t.FieldIndex return t.Type, info{method: t.Method} } - if v.config.Strict { - return v.error(node, "unknown name %v", node.Value) + if v.config.Strict && strict { + return v.error(node, "unknown name %v", name) } if v.config.DefaultType != nil { return v.config.DefaultType, info{} @@ -433,12 +444,16 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { prop, _ := v.visit(node.Property) if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "$env" { - // If the index is a constant string, can save some - // cycles later by finding the type of its referent if name, ok := node.Property.(*ast.StringNode); ok { - if t, ok := v.config.Types[name.Value]; ok { - return t.Type, info{method: t.Method} - } // No error if no type found; it may be added to env between compile and run + strict := v.config.Strict + if node.Optional { + // If user explicitly set optional flag, then we should not + // throw error if field is not found (as user trying to handle + // this case). But if user did not set optional flag, then we + // should throw error if field is not found & v.config.Strict. + strict = false + } + return v.env(node, name.Value, strict) } return anyType, info{} } @@ -460,8 +475,7 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { // the same interface. return m.Type, info{} } else { - node.Method = true - node.MethodIndex = m.Index + node.SetMethodIndex(m.Index) node.Name = name.Value return m.Type, info{method: true} } diff --git a/expr_test.go b/expr_test.go index 9338bd72d..903336d10 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1884,7 +1884,7 @@ func TestEnv_keyword(t *testing.T) { {"$env[red + irect]", 10}, {"$env['String Map']?.five", ""}, {"$env.red", "n"}, - {"$env?.blue", nil}, + {"$env?.unknown", nil}, {"$env.mylist[1]", 2}, {"$env?.OtherMap?.a", "b"}, {"$env?.OtherMap?.d", ""}, @@ -2102,3 +2102,13 @@ func TestIssue461(t *testing.T) { }) } } + +func TestIssue462(t *testing.T) { + env := map[string]any{ + "foo": func() (string, error) { + return "bar", nil + }, + } + _, err := expr.Compile(`$env.unknown(int())`, expr.Env(env)) + require.Error(t, err) +} From 5de348e65c8bf02fc73bc1bbd91fbea0713a3c00 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 22:16:12 +0100 Subject: [PATCH 176/506] fuzz: skip too long code --- test/fuzz/fuzz_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index e69aaec7b..64467a65e 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -53,6 +53,10 @@ func FuzzExpr(f *testing.F) { env := NewEnv() f.Fuzz(func(t *testing.T, code string) { + if len(code) > 1000 { + t.Skip("too long code") + } + program, err := expr.Compile(code, expr.Env(env)) if err != nil { t.Skipf("compile error: %s", err) From 939aca18e66514ca0727c309f8df8c510a0e2fc1 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 16 Nov 2023 22:31:25 +0100 Subject: [PATCH 177/506] fuzz: ignore sun(any) runtime errors Fixes #464 --- test/fuzz/fuzz_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 64467a65e..03d29e3b8 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -48,6 +48,7 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`invalid date .*`), regexp.MustCompile(`cannot parse .* as .*`), regexp.MustCompile(`operator "in" not defined on .*`), + regexp.MustCompile(`cannot sum bool`), } env := NewEnv() From c7038e8ff272f38d9d720dc87cb7e32c8ad1ee2c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 24 Nov 2023 16:50:09 +0100 Subject: [PATCH 178/506] Fix type checker for float arguments Fixes #474 --- checker/checker.go | 2 +- expr_test.go | 54 ++++++++++++++++++++++++++++ test/fuzz/fuzz_corpus.txt | 2 -- test/fuzz/fuzz_expr_seed_corpus.zip | Bin 2827401 -> 2827397 bytes testdata/examples.txt | 2 -- 5 files changed, 55 insertions(+), 5 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 8e536518c..0d10e0bf3 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -959,7 +959,7 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu in = fn.In(i + fnInOffset) } - if isFloat(in) { + if isFloat(in) && isInteger(t) { traverseAndReplaceIntegerNodesWithFloatNodes(&arguments[i], in) continue } diff --git a/expr_test.go b/expr_test.go index 903336d10..638ae3b84 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2112,3 +2112,57 @@ func TestIssue462(t *testing.T) { _, err := expr.Compile(`$env.unknown(int())`, expr.Env(env)) require.Error(t, err) } + +func TestIssue(t *testing.T) { + testCases := []struct { + code string + fail bool + }{ + { + code: `func("invalid")`, + fail: true, + }, + { + code: `func(true)`, + fail: true, + }, + { + code: `func([])`, + fail: true, + }, + { + code: `func({})`, + fail: true, + }, + { + code: `func(1)`, + fail: false, + }, + { + code: `func(1.5)`, + fail: false, + }, + } + + for _, tc := range testCases { + ltc := tc + t.Run(ltc.code, func(t *testing.T) { + t.Parallel() + function := expr.Function("func", func(params ...any) (any, error) { + return true, nil + }, new(func(float64) bool)) + _, err := expr.Compile(ltc.code, function) + if ltc.fail { + if err == nil { + t.Error("expected an error, but it was nil") + t.FailNow() + } + } else { + if err != nil { + t.Errorf("expected nil, but it was %v", err) + t.FailNow() + } + } + }) + } +} diff --git a/test/fuzz/fuzz_corpus.txt b/test/fuzz/fuzz_corpus.txt index 3d3491ad4..2bb8ab7fb 100644 --- a/test/fuzz/fuzz_corpus.txt +++ b/test/fuzz/fuzz_corpus.txt @@ -6680,7 +6680,6 @@ half(f32 ** f32) half(f32 ** f64) half(f32 + 0.5) half(f32 + 1) -half(f32 + f32) half(f32 + f64) half(f32 + i) half(f32 + i32) @@ -12213,7 +12212,6 @@ ok ? score : foo.String ok ? score : foo?.String ok ? score : greet ok ? score : half -ok ? score : half("bar") ok ? score : i ok ? score : i32 ok ? score : list diff --git a/test/fuzz/fuzz_expr_seed_corpus.zip b/test/fuzz/fuzz_expr_seed_corpus.zip index aef08934d397fd9ae4b11a9756151e45892a8366..0fd46ab3a7ed432a2219e2d07e064dd839d54010 100644 GIT binary patch literal 2827397 zcmbSU2Y6M*whm2@-g`-?351Z7lL|-`g-|4fD$PIwgpx=IO;8a*ih_VBMG!%djsc`f zmlAp}B1M{rfKe|YS?Bg{H&&H3N(bwfbpw+1o5EvqsinM1wkw7jMkZ z4u8#=t&dByGva@4pAtrC*Pow(-5j@N2&_?)*#R#kt1%w_%qNhyg#Iwhy~!$;b4@tL8P8M=9` zx59wHehCBn@W|FTEh#D8ex`kUmw3icf&aPB)T!mRWhh*1Y%I;nes-51DE||{WP)>G zuLe`1#glOr7I2Uz~f;{p095Afa7`~@tF5l29A0z3yYk|CZI*~7uq z30FQ;oUBvp2Ds3Nk9W!6u4S`z{Os|;@fT@&K2|yYa0-EqgJL;` zI4AM^RYP+fQL>?M?LoPpA7w*VLYDuim{d5KsXWC%qTcO3s=InrWTs}obSSN z2`4jEL{TL1tD&bZmt+L+NQ%O>jJ1?2Qh*^5_R{dokSc$va+7H*g0qlY_=GRQn>SF% zt3SVhz|;Z$scHVaJhqefn%|?h6;(u#$=m#BOIK)9RdKTZ!o~{QBD55?*oFgs{ugp~ zRIkDOcL#f+UctGTq32GNU}oWwc}8fNY?(!7>);m0n%C~=_e5zJgw4E` zO-b7#v~0Fi!GpYai_U%9IYCKmBebUB7G0Ov&Ro1_q51%x9QUGj{s73dh3*%gFI+=? z04?7=9>8sjATw{&^GPxOYy8ihr9@~cFP{K5$j9CDuTwJ62r}V4GEiZZg7a^mJv~op zhIuL;HpBWP3>;!_h8+mG63&xAk8C-TOm?2lx{drpH4_}XEp>^K%0`k2Z%<`~HiVhH ze0+NqB_EH}(qA?ck91be$FKjkur=3_N3tBLbpn>5$hkOrfb;W*99DAiNUbNZ9>7C* z^#o?De<#}N%DAmOQtJi+0z*S0cqY#N%U-&LjLzLQKhp>Q6OeiXv>+XJzy^hj1gbJ> zneLX6HIVF(JLWYhr$Q3Q?Rso?H%id1dX8mb>SGgV?Sf3U%h+|o?X?!5JMs2>YUDrz zI4cB~g@6wxG+v=RbCf5S5ukN0$*LMt^A(+=LK66EJ+sx+6H>mv>B&VEQp;EOVS{|T z#2btADEW4jCqc7(@H+nNxmo{FIiC5yy`DQ4GjaasJ|4XV1*8tJHSy;j?9?+i1L1#e zAidp)y9=SbY|%TX7ho{_FF)%knfD-}#4~0OsUGo&X}zynkOd@2PfQR{Y8!S_+aIuR z-qO=+tk7Ce#uT9ZJiwU@N_aDHVDgakVE-!I`+&p#;&SKtR>|UlEv%A&%?h_Fc0O(k znmYqZEsT?f%&IsOTSTb~6}qhAMF4m79#RV{%>w&y>);ca2ZKXS#E(3GhD;P!T=|phk}%EiGZB?H+Dkm2UO9f_Q%I zfi5CR7U+^n&b7~Ab^Tg<&9!gZtwPX9gnP{bTUJL`Mwjk3GB+!~u|7l=o`HlM8E!{z ze(FSCt2pw|hj0}nWIOJ&@}c)E(~t=+_>#r-shi-c6K~!6!ZxG@hc5(g7}6vm&2DpT z>wl8UNn$68Lx`)_Lc@@_p(D(8XpsE}vfWB=0Y&$P<;D-#ksr@1_mfqK$_MDsa$GXH zh9U9kX~`*l0~NuuZ=ZFDbH&aVhc6Vj;O(+EeY-&&WPA=Es9qc7id%Q?X<|it51nX9 zE_6~`Nf=YxWzP?#^?}~CL5jC-*C2l=tqTDpYQvJtV||G-A$zLaCjDv>T? z^|*}Vb~AqW^N=ElBhpo@9ycojwn*O

    c!8|2%~Df!{86+vWbJ!2LB)ZXdYKQ|{XS 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

    Zn~bhc~CfFp=UH2s?m&tg0U^FM8p6pZ4L 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%0A;ROD?WLU~I&j+6 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 Ds+h#fUI);RNv~g(sLEdsdF{A+> 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%0Diy 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 Up&W-ChrIlEp7`hghlL9LA9!SSMgRZ+ literal 2827401 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 z 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≫@~;yXNMy0lk4H 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 z%0A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

    13GMs=2}2L$KX%h>MW$P}rWro{c{ww-z7 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
    aD?>s)ekh#luPjgIlN224 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

    =XshJ<_^IBw*1;E*CD(YJ2xdsA)pOrDaY;Uw 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%0AT@;cYNNq_qFF^Z7T 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 Date: Fri, 24 Nov 2023 16:54:23 +0100 Subject: [PATCH 179/506] fuzz: extend "cannot sum" error to all types --- test/fuzz/fuzz_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 03d29e3b8..d8184e2f0 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -48,7 +48,7 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`invalid date .*`), regexp.MustCompile(`cannot parse .* as .*`), regexp.MustCompile(`operator "in" not defined on .*`), - regexp.MustCompile(`cannot sum bool`), + regexp.MustCompile(`cannot sum .*`), } env := NewEnv() From ad0e8779ecc8c2c747c68a2ebb6e6daa6894caeb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 24 Nov 2023 17:26:54 +0100 Subject: [PATCH 180/506] Add ceil(), floor() and round() function Fixes #476 --- builtin/builtin.go | 42 +++++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 7 +++++++ builtin/func.go | 37 ++++++++++++++++++++++++++++++++ docs/Language-Definition.md | 24 +++++++++++++++++++++ 4 files changed, 110 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index d7248a867..1c3d919cc 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -126,6 +126,48 @@ var Builtins = []*ast.Function{ return anyType, fmt.Errorf("invalid argument for abs (type %s)", args[0]) }, }, + { + Name: "ceil", + Fast: Ceil, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: + return floatType, nil + } + return anyType, fmt.Errorf("invalid argument for ceil (type %s)", args[0]) + }, + }, + { + Name: "floor", + Fast: Floor, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: + return floatType, nil + } + return anyType, fmt.Errorf("invalid argument for floor (type %s)", args[0]) + }, + }, + { + Name: "round", + Fast: Round, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: + return floatType, nil + } + return anyType, fmt.Errorf("invalid argument for floor (type %s)", args[0]) + }, + }, { Name: "int", Fast: Int, diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 533f59a88..45582d00a 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -36,6 +36,13 @@ func TestBuiltin(t *testing.T) { {`abs(-5)`, 5}, {`abs(.5)`, .5}, {`abs(-.5)`, .5}, + {`ceil(5.5)`, 6.0}, + {`ceil(5)`, 5.0}, + {`floor(5.5)`, 5.0}, + {`floor(5)`, 5.0}, + {`round(5.5)`, 6.0}, + {`round(5)`, 5.0}, + {`round(5.49)`, 5.0}, {`int(5.5)`, 5}, {`int(5)`, 5}, {`int("5")`, 5}, diff --git a/builtin/func.go b/builtin/func.go index 7c042c6d2..d9ec4ff42 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -2,6 +2,7 @@ package builtin import ( "fmt" + "math" "reflect" "strconv" @@ -138,6 +139,42 @@ func Abs(x any) any { panic(fmt.Sprintf("invalid argument for abs (type %T)", x)) } +func Ceil(x any) any { + switch x := x.(type) { + case float32: + return math.Ceil(float64(x)) + case float64: + return math.Ceil(x) + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return Float(x) + } + panic(fmt.Sprintf("invalid argument for ceil (type %T)", x)) +} + +func Floor(x any) any { + switch x := x.(type) { + case float32: + return math.Floor(float64(x)) + case float64: + return math.Floor(x) + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return Float(x) + } + panic(fmt.Sprintf("invalid argument for floor (type %T)", x)) +} + +func Round(x any) any { + switch x := x.(type) { + case float32: + return math.Round(float64(x)) + case float64: + return math.Round(x) + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return Float(x) + } + panic(fmt.Sprintf("invalid argument for round (type %T)", x)) +} + func Int(x any) any { switch x := x.(type) { case float32: diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 352b2ec79..46bad9322 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -380,6 +380,30 @@ min(5, 7) == 5 Returns the absolute value of a number. +### ceil(n) + +Returns the least integer value greater than or equal to x. + +```expr +ceil(1.5) == 2.0 +``` + +### floor(n) + +Returns the greatest integer value less than or equal to x. + +```expr +floor(1.5) == 1.0 +``` + +### round(n) + +Returns the nearest integer, rounding half away from zero. + +```expr +round(1.5) == 2.0 +``` + ## Array Functions ### all(array, predicate) From 72442663b6f2862023736e4514f34fab549c1daf Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 27 Nov 2023 13:52:56 +0100 Subject: [PATCH 181/506] Hide fields in vm.Program --- compiler/compiler.go | 25 ++++++++++++------------- file/source.go | 3 +++ vm/program.go | 39 ++++++++++++++++++++++++++++++--------- vm/vm.go | 22 +++++++++++++--------- vm/vm_test.go | 5 ++--- 5 files changed, 60 insertions(+), 34 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index eada2ad04..04f0ff5eb 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -47,17 +47,16 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro c.emit(OpCast, 2) } - program = &Program{ - Node: tree.Node, - Source: tree.Source, - Locations: c.locations, - Variables: c.variables, - Constants: c.constants, - Bytecode: c.bytecode, - Arguments: c.arguments, - Functions: c.functions, - DebugInfo: c.debugInfo, - } + program = NewProgram( + tree.Source, + c.locations, + c.variables, + c.constants, + c.bytecode, + c.arguments, + c.functions, + c.debugInfo, + ) return } @@ -145,7 +144,7 @@ func (c *compiler) addVariable(name string) int { return p } -// emitFunction adds builtin.Function.Func to the program.Functions and emits call opcode. +// emitFunction adds builtin.Function.Func to the program.functions and emits call opcode. func (c *compiler) emitFunction(fn *ast.Function, argsLen int) { switch argsLen { case 0: @@ -162,7 +161,7 @@ func (c *compiler) emitFunction(fn *ast.Function, argsLen int) { } } -// addFunction adds builtin.Function.Func to the program.Functions and returns its index. +// addFunction adds builtin.Function.Func to the program.functions and returns its index. func (c *compiler) addFunction(fn *ast.Function) int { if fn == nil { panic("function is nil") diff --git a/file/source.go b/file/source.go index 9ee297b58..d86a546b1 100644 --- a/file/source.go +++ b/file/source.go @@ -40,6 +40,9 @@ func (s *Source) Content() string { } func (s *Source) Snippet(line int) (string, bool) { + if s == nil { + return "", false + } charStart, found := s.findLineOffset(line) if !found || len(s.contents) == 0 { return "", false diff --git a/vm/program.go b/vm/program.go index c45a2bff2..1664da24b 100644 --- a/vm/program.go +++ b/vm/program.go @@ -9,22 +9,43 @@ import ( "strings" "text/tabwriter" - "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/builtin" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/vm/runtime" ) type Program struct { - Node ast.Node - Source *file.Source - Locations []file.Location - Variables []any - Constants []any Bytecode []Opcode Arguments []int - Functions []Function - DebugInfo map[string]string + Constants []any + + source *file.Source + locations []file.Location + variables []any + functions []Function + debugInfo map[string]string +} + +func NewProgram( + source *file.Source, + locations []file.Location, + variables []any, + constants []any, + bytecode []Opcode, + arguments []int, + functions []Function, + debugInfo map[string]string, +) *Program { + return &Program{ + source: source, + locations: locations, + variables: variables, + Constants: constants, + Bytecode: bytecode, + Arguments: arguments, + functions: functions, + debugInfo: debugInfo, + } } func (program *Program) Disassemble() string { @@ -56,7 +77,7 @@ func (program *Program) Opcodes(w io.Writer) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\n", pp, label, arg) } argumentWithInfo := func(label string, prefix string) { - _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, program.DebugInfo[fmt.Sprintf("%s_%d", prefix, arg)]) + _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, program.debugInfo[fmt.Sprintf("%s_%d", prefix, arg)]) } constant := func(label string) { var c any diff --git a/vm/vm.go b/vm/vm.go index d020a31a8..70edb29a8 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -59,14 +59,18 @@ func Debug() *VM { func (vm *VM) Run(program *Program, env any) (_ any, err error) { defer func() { if r := recover(); r != nil { + var location file.Location + if vm.ip-1 < len(program.locations) { + location = program.locations[vm.ip-1] + } f := &file.Error{ - Location: program.Locations[vm.ip-1], + Location: location, Message: fmt.Sprintf("%v", r), } if err, ok := r.(error); ok { f.Wrap(err) } - err = f.Bind(program.Source) + err = f.Bind(program.source) } }() @@ -108,10 +112,10 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.pop() case OpStore: - program.Variables[arg] = vm.pop() + program.variables[arg] = vm.pop() case OpLoadVar: - vm.push(program.Variables[arg]) + vm.push(program.variables[arg]) case OpLoadConst: vm.push(runtime.Fetch(env, program.Constants[arg])) @@ -126,7 +130,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.push(runtime.FetchMethod(env, program.Constants[arg].(*runtime.Method))) case OpLoadFunc: - vm.push(program.Functions[arg]) + vm.push(program.functions[arg]) case OpFetch: b := vm.pop() @@ -332,7 +336,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.push(out[0].Interface()) case OpCall0: - out, err := program.Functions[arg]() + out, err := program.functions[arg]() if err != nil { panic(err) } @@ -340,7 +344,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpCall1: a := vm.pop() - out, err := program.Functions[arg](a) + out, err := program.functions[arg](a) if err != nil { panic(err) } @@ -349,7 +353,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpCall2: b := vm.pop() a := vm.pop() - out, err := program.Functions[arg](a, b) + out, err := program.functions[arg](a, b) if err != nil { panic(err) } @@ -359,7 +363,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { c := vm.pop() b := vm.pop() a := vm.pop() - out, err := program.Functions[arg](a, b, c) + out, err := program.functions[arg](a, b, c) if err != nil { panic(err) } diff --git a/vm/vm_test.go b/vm/vm_test.go index dfbd17869..c343e1aae 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -6,14 +6,14 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/require" + "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/compiler" "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/parser" "github.com/antonmedv/expr/vm" - "github.com/stretchr/testify/require" ) func TestRun_NilProgram(t *testing.T) { @@ -282,7 +282,6 @@ func TestRun_TaggedFieldName(t *testing.T) { func TestRun_OpInvalid(t *testing.T) { program := &vm.Program{ - Locations: []file.Location{{0, 0}}, Bytecode: []vm.Opcode{vm.OpInvalid}, Arguments: []int{0}, } From 0531ea58bbd1e7aa05ac17ae9f31d8263983d24a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 27 Nov 2023 19:15:20 +0100 Subject: [PATCH 182/506] Add ast comments Rename program.Opcodes() to program.DisassembleWriter() --- ast/node.go | 151 ++++++++++++++++++++++++++++++++-------------- debug/debugger.go | 2 +- vm/program.go | 8 ++- 3 files changed, 112 insertions(+), 49 deletions(-) diff --git a/ast/node.go b/ast/node.go index d9c0d73da..9e4c7a5e6 100644 --- a/ast/node.go +++ b/ast/node.go @@ -16,179 +16,238 @@ type Node interface { String() string } +// Patch replaces the node with a new one. +// Location information is preserved. +// Type information is lost. func Patch(node *Node, newNode Node) { newNode.SetLocation((*node).Location()) *node = newNode } +// base is a base struct for all nodes. type base struct { loc file.Location nodeType reflect.Type } +// Location returns the location of the node in the source code. func (n *base) Location() file.Location { return n.loc } +// SetLocation sets the location of the node in the source code. func (n *base) SetLocation(loc file.Location) { n.loc = loc } +// Type returns the type of the node. func (n *base) Type() reflect.Type { return n.nodeType } +// SetType sets the type of the node. func (n *base) SetType(t reflect.Type) { n.nodeType = t } +// NilNode represents nil. type NilNode struct { base } +// IdentifierNode represents an identifier. type IdentifierNode struct { base - Value string - FieldIndex []int - Method bool // true if method, false if field - MethodIndex int // index of method, set only if Method is true + Value string // Name of the identifier. Like "foo" in "foo.bar". + FieldIndex []int // Index of the field in the list of fields. + Method bool // If true then the identifier is a method call. + MethodIndex int // Index of the method in the list of methods. } +// SetFieldIndex sets the field index of the identifier. func (n *IdentifierNode) SetFieldIndex(field []int) { n.FieldIndex = field } +// SetMethodIndex sets the method index of the identifier. func (n *IdentifierNode) SetMethodIndex(methodIndex int) { n.Method = true n.MethodIndex = methodIndex } +// IntegerNode represents an integer. type IntegerNode struct { base - Value int + Value int // Value of the integer. } +// FloatNode represents a float. type FloatNode struct { base - Value float64 + Value float64 // Value of the float. } +// BoolNode represents a boolean. type BoolNode struct { base - Value bool + Value bool // Value of the boolean. } +// StringNode represents a string. type StringNode struct { base - Value string + Value string // Value of the string. } +// ConstantNode represents a constant. +// Constants are predefined values like nil, true, false, array, map, etc. +// The parser.Parse will never generate ConstantNode, it is only generated +// by the optimizer. type ConstantNode struct { base - Value any + Value any // Value of the constant. } +// UnaryNode represents a unary operator. type UnaryNode struct { base - Operator string - Node Node + Operator string // Operator of the unary operator. Like "!" in "!foo" or "not" in "not foo". + Node Node // Node of the unary operator. Like "foo" in "!foo". } +// BinaryNode represents a binary operator. type BinaryNode struct { base - Regexp *regexp.Regexp - Operator string - Left Node - Right Node + Regexp *regexp.Regexp // Regexp of the "matches" operator. Like "f.+" in `foo matches "f.+"`. + Operator string // Operator of the binary operator. Like "+" in "foo + bar" or "matches" in "foo matches bar". + Left Node // Left node of the binary operator. + Right Node // Right node of the binary operator. } +// ChainNode represents an optional chaining group. +// A few MemberNode nodes can be chained together, +// and will be wrapped in a ChainNode. Example: +// ``` +// foo.bar?.baz?.qux +// ``` +// The whole chain will be wrapped in a ChainNode. type ChainNode struct { base - Node Node + Node Node // Node of the chain. } +// MemberNode represents a member access. +// It can be a field access, a method call, +// or an array element access. +// Example: +// ``` +// foo.bar or foo["bar"] +// foo.bar() +// array[0] +// ``` type MemberNode struct { base - Node Node - Property Node + Node Node // Node of the member access. Like "foo" in "foo.bar". + Property Node // Property of the member access. For property access it is a StringNode. Name string // Name of the filed or method. Used for error reporting. - Optional bool - FieldIndex []int + Optional bool // If true then the member access is optional. Like "foo?.bar". + FieldIndex []int // Index sequence of fields. Generated by type checker. // TODO: Combine Method and MethodIndex into a single MethodIndex field of &int type. - Method bool - MethodIndex int + Method bool // If true then the member access is a method call. + MethodIndex int // Index of the method in the list of methods. Generated by type checker. } +// SetFieldIndex sets the field index of the member access. func (n *MemberNode) SetFieldIndex(field []int) { n.FieldIndex = field } +// SetMethodIndex sets the method index of the member access. func (n *MemberNode) SetMethodIndex(methodIndex int) { n.Method = true n.MethodIndex = methodIndex } +// SliceNode represents access to a slice of an array. +// Example: +// ``` +// array[1:4] +// ``` type SliceNode struct { base - Node Node - From Node - To Node + Node Node // Node of the slice. Like "array" in "array[1:4]". + From Node // From an index of the array. Like "1" in "array[1:4]". + To Node // To an index of the array. Like "4" in "array[1:4]". } +// CallNode represents a function or a method call. type CallNode struct { base - Callee Node - Arguments []Node - Typed int - Fast bool - Func *Function + Callee Node // Node of the call. Like "foo" in "foo()". + Arguments []Node // Arguments of the call. + Typed int // If more than 0 then the call is one of the types from vm.FuncTypes. + Fast bool // If true then the call type is "func(...any) any". + Func *Function // If not nil then the func is provider via expr.Function. } +// BuiltinNode represents a builtin function call. type BuiltinNode struct { base - Name string - Arguments []Node - Throws bool - Map Node + Name string // Name of the builtin function. Like "len" in "len(foo)". + Arguments []Node // Arguments of the builtin function. + Throws bool // If true then accessing a field or array index can throw an error. Used by optimizer. + Map Node // Used by optimizer to fold filter() and map() builtins. } +// ClosureNode represents a predicate. +// Example: +// ``` +// filter(foo, .bar == 1) +// ``` +// The predicate is `.bar == 1`. type ClosureNode struct { base - Node Node + Node Node // Node of the predicate body. } +// PointerNode represents a pointer to a current value in predicate. type PointerNode struct { base - Name string + Name string // Name of the pointer. Like "index" in "#index". } +// ConditionalNode represents a ternary operator. type ConditionalNode struct { base - Cond Node - Exp1 Node - Exp2 Node + Cond Node // Condition of the ternary operator. Like "foo" in "foo ? bar : baz". + Exp1 Node // Expression 1 of the ternary operator. Like "bar" in "foo ? bar : baz". + Exp2 Node // Expression 2 of the ternary operator. Like "baz" in "foo ? bar : baz". } +// VariableDeclaratorNode represents a variable declaration. type VariableDeclaratorNode struct { base - Name string - Value Node - Expr Node + Name string // Name of the variable. Like "foo" in "let foo = 1; foo + 1". + Value Node // Value of the variable. Like "1" in "let foo = 1; foo + 1". + Expr Node // Expression of the variable. Like "foo + 1" in "let foo = 1; foo + 1". } +// ArrayNode represents an array. type ArrayNode struct { base - Nodes []Node + Nodes []Node // Nodes of the array. } +// MapNode represents a map. type MapNode struct { base - Pairs []Node + Pairs []Node // PairNode nodes. } +// PairNode represents a key-value pair of a map. type PairNode struct { base - Key Node - Value Node + Key Node // Key of the pair. + Value Node // Value of the pair. } diff --git a/debug/debugger.go b/debug/debugger.go index 1dfe4c162..895e70589 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -59,7 +59,7 @@ func StartDebugger(program *Program, env any) { index := make(map[int]int) var buf strings.Builder - program.Opcodes(&buf) + program.DisassembleWriter(&buf) for row, line := range strings.Split(buf.String(), "\n") { if line == "" { diff --git a/vm/program.go b/vm/program.go index 1664da24b..ae5b64108 100644 --- a/vm/program.go +++ b/vm/program.go @@ -14,6 +14,7 @@ import ( "github.com/antonmedv/expr/vm/runtime" ) +// Program represents a compiled expression. type Program struct { Bytecode []Opcode Arguments []int @@ -26,6 +27,7 @@ type Program struct { debugInfo map[string]string } +// NewProgram returns a new Program. It's used by the compiler. func NewProgram( source *file.Source, locations []file.Location, @@ -48,15 +50,17 @@ func NewProgram( } } +// Disassemble returns opcodes as a string. func (program *Program) Disassemble() string { var buf bytes.Buffer w := tabwriter.NewWriter(&buf, 0, 0, 2, ' ', 0) - program.Opcodes(w) + program.DisassembleWriter(w) _ = w.Flush() return buf.String() } -func (program *Program) Opcodes(w io.Writer) { +// DisassembleWriter takes a writer and writes opcodes to it. +func (program *Program) DisassembleWriter(w io.Writer) { ip := 0 for ip < len(program.Bytecode) { pp := ip From 9a60147693e87c5271d43fd70d78ee0673e0f7d0 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 27 Nov 2023 20:36:08 +0100 Subject: [PATCH 183/506] Update ast comments --- ast/node.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ast/node.go b/ast/node.go index 9e4c7a5e6..bd7805bd5 100644 --- a/ast/node.go +++ b/ast/node.go @@ -59,9 +59,9 @@ type NilNode struct { type IdentifierNode struct { base Value string // Name of the identifier. Like "foo" in "foo.bar". - FieldIndex []int // Index of the field in the list of fields. - Method bool // If true then the identifier is a method call. - MethodIndex int // Index of the method in the list of methods. + FieldIndex []int // Internal. Index of the field in the list of fields. + Method bool // Internal. If true then the identifier is a method call. + MethodIndex int // Internal. Index of the method in the list of methods. } // SetFieldIndex sets the field index of the identifier. @@ -118,10 +118,10 @@ type UnaryNode struct { // BinaryNode represents a binary operator. type BinaryNode struct { base - Regexp *regexp.Regexp // Regexp of the "matches" operator. Like "f.+" in `foo matches "f.+"`. Operator string // Operator of the binary operator. Like "+" in "foo + bar" or "matches" in "foo matches bar". Left Node // Left node of the binary operator. Right Node // Right node of the binary operator. + Regexp *regexp.Regexp // Internal. Regexp of the "matches" operator. Like "f.+" in `foo matches "f.+"`. } // ChainNode represents an optional chaining group. @@ -149,13 +149,13 @@ type MemberNode struct { base Node Node // Node of the member access. Like "foo" in "foo.bar". Property Node // Property of the member access. For property access it is a StringNode. - Name string // Name of the filed or method. Used for error reporting. Optional bool // If true then the member access is optional. Like "foo?.bar". - FieldIndex []int // Index sequence of fields. Generated by type checker. + Name string // Internal. Name of the filed or method. Used for error reporting. + FieldIndex []int // Internal. Index sequence of fields. Generated by type checker. // TODO: Combine Method and MethodIndex into a single MethodIndex field of &int type. - Method bool // If true then the member access is a method call. - MethodIndex int // Index of the method in the list of methods. Generated by type checker. + Method bool // Internal. If true then the member access is a method call. + MethodIndex int // Internal. Index of the method in the list of methods. Generated by type checker. } // SetFieldIndex sets the field index of the member access. @@ -186,9 +186,9 @@ type CallNode struct { base Callee Node // Node of the call. Like "foo" in "foo()". Arguments []Node // Arguments of the call. - Typed int // If more than 0 then the call is one of the types from vm.FuncTypes. - Fast bool // If true then the call type is "func(...any) any". - Func *Function // If not nil then the func is provider via expr.Function. + Typed int // Internal. Used to indicate compiler what type is one of vm.FuncTypes. + Fast bool // Internal. Used to indicate compiler what this call is a fast call. + Func *Function // Internal. Used to pass function information from type checker to compiler. } // BuiltinNode represents a builtin function call. @@ -196,8 +196,8 @@ type BuiltinNode struct { base Name string // Name of the builtin function. Like "len" in "len(foo)". Arguments []Node // Arguments of the builtin function. - Throws bool // If true then accessing a field or array index can throw an error. Used by optimizer. - Map Node // Used by optimizer to fold filter() and map() builtins. + Throws bool // Internal. If true then accessing a field or array index can throw an error. Used by optimizer. + Map Node // Internal. Used by optimizer to fold filter() and map() builtins. } // ClosureNode represents a predicate. From 8249ea06d67ece557999d520b821b4f13354c4f9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 27 Nov 2023 21:52:44 +0100 Subject: [PATCH 184/506] Add expr.WithContext() --- expr.go | 8 +++++++ expr_test.go | 42 ++++++++++++++++++++++++++++++++++++ patcher/with_context.go | 36 +++++++++++++++++++++++++++++++ patcher/with_context_test.go | 32 +++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 patcher/with_context.go create mode 100644 patcher/with_context_test.go diff --git a/expr.go b/expr.go index eb9eb7683..bc5dfc31c 100644 --- a/expr.go +++ b/expr.go @@ -11,6 +11,7 @@ import ( "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/optimizer" "github.com/antonmedv/expr/parser" + "github.com/antonmedv/expr/patcher" "github.com/antonmedv/expr/vm" ) @@ -152,6 +153,13 @@ func EnableBuiltin(name string) Option { } } +// WithContext passes context to all functions calls with a context.Context argument. +func WithContext(name string) Option { + return Patch(patcher.WithContext{ + Name: name, + }) +} + // Compile parses and compiles given input expression to bytecode program. func Compile(input string, ops ...Option) (*vm.Program, error) { config := conf.CreateNew() diff --git a/expr_test.go b/expr_test.go index 638ae3b84..e05fbd54f 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1,6 +1,7 @@ package expr_test import ( + "context" "encoding/json" "fmt" "reflect" @@ -488,6 +489,47 @@ func ExamplePatch() { // Output : Hello, you, world! } +func ExampleWithContext() { + env := map[string]any{ + "fn": func(ctx context.Context, _, _ int) int { + // An infinite loop that can be canceled by context. + for { + select { + case <-ctx.Done(): + return 42 + } + } + }, + "ctx": context.TODO(), // Context should be passed as a variable. + } + + program, err := expr.Compile(`fn(1, 2)`, + expr.Env(env), + expr.WithContext("ctx"), // Pass context variable name. + ) + if err != nil { + fmt.Printf("%v", err) + return + } + + // Cancel context after 100 milliseconds. + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100) + defer cancel() + + // After program is compiled, context can be passed to Run. + env["ctx"] = ctx + + // Run will return 42 after 100 milliseconds. + output, err := expr.Run(program, env) + if err != nil { + fmt.Printf("%v", err) + return + } + + fmt.Printf("%v", output) + // Output: 42 +} + func TestExpr_readme_example(t *testing.T) { env := map[string]any{ "greet": "Hello, %v!", diff --git a/patcher/with_context.go b/patcher/with_context.go new file mode 100644 index 000000000..35765474f --- /dev/null +++ b/patcher/with_context.go @@ -0,0 +1,36 @@ +package patcher + +import ( + "reflect" + + "github.com/antonmedv/expr/ast" +) + +// WithContext adds WithContext.Name argument to all functions calls with a context.Context argument. +type WithContext struct { + Name string +} + +// Visit adds WithContext.Name argument to all functions calls with a context.Context argument. +func (w WithContext) Visit(node *ast.Node) { + switch (*node).(type) { + case *ast.CallNode: + call := (*node).(*ast.CallNode) + fn := call.Callee.Type() + if fn.Kind() != reflect.Func { + return + } + if fn.NumIn() == 0 { + return + } + if fn.In(0).String() != "context.Context" { + return + } + ast.Patch(node, &ast.CallNode{ + Callee: call.Callee, + Arguments: append([]ast.Node{ + &ast.IdentifierNode{Value: w.Name}, + }, call.Arguments...), + }) + } +} diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go new file mode 100644 index 000000000..311cb3922 --- /dev/null +++ b/patcher/with_context_test.go @@ -0,0 +1,32 @@ +package patcher_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/patcher" +) + +func TestWithContext(t *testing.T) { + env := map[string]any{ + "fn": func(ctx context.Context, a int) int { + return ctx.Value("value").(int) + a + }, + "ctx": context.TODO(), + } + + withContext := patcher.WithContext{Name: "ctx"} + + program, err := expr.Compile(`fn(40)`, expr.Env(env), expr.Patch(withContext)) + require.NoError(t, err) + + ctx := context.WithValue(context.Background(), "value", 2) + env["ctx"] = ctx + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 42, output) +} From f92bb7949de064a05d5b3a61d1b07abef0c521bb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 27 Nov 2023 21:54:11 +0100 Subject: [PATCH 185/506] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0e11943d3..4419be468 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Expr [![test](https://github.com/antonmedv/expr/actions/workflows/test.yml/badge.svg)](https://github.com/antonmedv/expr/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/antonmedv/expr)](https://goreportcard.com/report/github.com/antonmedv/expr) -[![GoDoc](https://godoc.org/github.com/antonmedv/expr?status.svg)](https://godoc.org/github.com/antonmedv/expr) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/expr.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:expr) +[![GoDoc](https://godoc.org/github.com/antonmedv/expr?status.svg)](https://godoc.org/github.com/antonmedv/expr) **Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. From 5455cf894630551e08c0077051933425b6538a5b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 27 Nov 2023 22:03:15 +0100 Subject: [PATCH 186/506] fuzz: skip string index out of range --- test/fuzz/fuzz_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index d8184e2f0..126a3a7ad 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -42,6 +42,7 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`reflect: call of reflect.Value.Call on .* Value`), regexp.MustCompile(`reflect: call of reflect.Value.Index on map Value`), regexp.MustCompile(`reflect: call of reflect.Value.Len on .* Value`), + regexp.MustCompile(`reflect: string index out of range`), regexp.MustCompile(`strings: negative Repeat count`), regexp.MustCompile(`strings: illegal bytes to escape`), regexp.MustCompile(`operator "in" not defined on int`), From c89be6a175bfc5e77160274fbbfa6a1d90416d09 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Dec 2023 21:53:01 +0100 Subject: [PATCH 187/506] Use expr-lang/expr --- .github/scripts/coverage.mjs | 2 +- README.md | 16 ++++++++-------- ast/node.go | 2 +- ast/print.go | 4 ++-- ast/print_test.go | 4 ++-- ast/visitor_test.go | 2 +- bench_test.go | 4 ++-- builtin/builtin.go | 4 ++-- builtin/builtin_test.go | 14 +++++++------- builtin/func.go | 2 +- checker/checker.go | 12 ++++++------ checker/checker_test.go | 12 ++++++------ checker/types.go | 2 +- compiler/compiler.go | 14 +++++++------- compiler/compiler_test.go | 8 ++++---- conf/config.go | 6 +++--- conf/operators.go | 2 +- debug/debugger.go | 2 +- debug/go.mod | 6 +++--- docgen/README.md | 4 ++-- docgen/docgen.go | 2 +- docgen/docgen_test.go | 6 +++--- docs/Configuration.md | 2 +- docs/Operator-Overloading.md | 2 +- docs/Tips.md | 4 ++-- docs/Visitor-and-Patch.md | 10 +++++----- expr.go | 18 +++++++++--------- expr_test.go | 8 ++++---- go.mod | 2 +- optimizer/const_expr.go | 4 ++-- optimizer/const_range.go | 2 +- optimizer/filter_first.go | 2 +- optimizer/filter_last.go | 2 +- optimizer/filter_len.go | 2 +- optimizer/filter_map.go | 2 +- optimizer/fold.go | 4 ++-- optimizer/in_array.go | 2 +- optimizer/in_range.go | 2 +- optimizer/optimizer.go | 4 ++-- optimizer/optimizer_test.go | 12 ++++++------ parser/lexer/lexer.go | 2 +- parser/lexer/lexer_test.go | 4 ++-- parser/lexer/state.go | 2 +- parser/lexer/token.go | 2 +- parser/parser.go | 14 +++++++------- parser/parser_test.go | 4 ++-- patcher/with_context.go | 2 +- patcher/with_context_test.go | 4 ++-- repl/go.mod | 10 +++++----- repl/repl.go | 11 ++++++----- test/coredns/coredns_test.go | 4 ++-- test/crowdsec/crowdsec_test.go | 4 ++-- test/deref/deref_test.go | 2 +- test/fuzz/fuzz_test.go | 2 +- test/gen/gen.go | 6 +++--- test/gen/gen_test.go | 2 +- test/gen/utils.go | 2 +- test/interface_method/interface_method_test.go | 2 +- test/mock/mock.go | 2 +- test/operator/operator_test.go | 4 ++-- test/patch/patch_test.go | 6 +++--- test/patch/set_type/set_type_test.go | 4 ++-- test/pipes/pipes_test.go | 2 +- test/real_world/real_docs/generate.go | 4 ++-- test/time/time_test.go | 12 ++++++------ vm/program.go | 6 +++--- vm/program_test.go | 2 +- vm/vm.go | 6 +++--- vm/vm_test.go | 12 ++++++------ 69 files changed, 177 insertions(+), 176 deletions(-) diff --git a/.github/scripts/coverage.mjs b/.github/scripts/coverage.mjs index 1fb96c498..330d8d873 100755 --- a/.github/scripts/coverage.mjs +++ b/.github/scripts/coverage.mjs @@ -11,7 +11,7 @@ const exclude = [ cd(path.resolve(__dirname, '..', '..')) await spinner('Running tests', async () => { - await $`go test -coverprofile=coverage.out -coverpkg=github.com/antonmedv/expr/... ./...` + await $`go test -coverprofile=coverage.out -coverpkg=github.com/expr-lang/expr/... ./...` const coverage = fs.readFileSync('coverage.out').toString() .split('\n') .filter(line => { diff --git a/README.md b/README.md index 4419be468..36362314e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Expr -[![test](https://github.com/antonmedv/expr/actions/workflows/test.yml/badge.svg)](https://github.com/antonmedv/expr/actions/workflows/test.yml) -[![Go Report Card](https://goreportcard.com/badge/github.com/antonmedv/expr)](https://goreportcard.com/report/github.com/antonmedv/expr) +[![test](https://github.com/expr-lang/expr/actions/workflows/test.yml/badge.svg)](https://github.com/expr-lang/expr/actions/workflows/test.yml) +[![Go Report Card](https://goreportcard.com/badge/github.com/expr-lang/expr)](https://goreportcard.com/report/github.com/expr-lang/expr) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/expr.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:expr) -[![GoDoc](https://godoc.org/github.com/antonmedv/expr?status.svg)](https://godoc.org/github.com/antonmedv/expr) +[![GoDoc](https://godoc.org/github.com/expr-lang/expr?status.svg)](https://godoc.org/github.com/expr-lang/expr) **Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. @@ -53,7 +53,7 @@ Here are its standout features: ## Install ``` -go get github.com/antonmedv/expr +go get github.com/expr-lang/expr ``` ## Documentation @@ -80,7 +80,7 @@ package main import ( "fmt" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" ) func main() { @@ -113,7 +113,7 @@ package main import ( "fmt" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" ) type Tweet struct { @@ -165,8 +165,8 @@ func main() { * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. -[Add your company too](https://github.com/antonmedv/expr/edit/master/README.md) +[Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) ## License -[MIT](https://github.com/antonmedv/expr/blob/master/LICENSE) +[MIT](https://github.com/expr-lang/expr/blob/master/LICENSE) diff --git a/ast/node.go b/ast/node.go index bd7805bd5..7aabf064c 100644 --- a/ast/node.go +++ b/ast/node.go @@ -4,7 +4,7 @@ import ( "reflect" "regexp" - "github.com/antonmedv/expr/file" + "github.com/expr-lang/expr/file" ) // Node represents items of abstract syntax tree. diff --git a/ast/print.go b/ast/print.go index b4fb4f367..9a7d12391 100644 --- a/ast/print.go +++ b/ast/print.go @@ -5,8 +5,8 @@ import ( "fmt" "strings" - "github.com/antonmedv/expr/parser/operator" - "github.com/antonmedv/expr/parser/utils" + "github.com/expr-lang/expr/parser/operator" + "github.com/expr-lang/expr/parser/utils" ) func (n *NilNode) String() string { diff --git a/ast/print_test.go b/ast/print_test.go index 077e85582..12ae6f741 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/parser" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser" ) func TestPrint(t *testing.T) { diff --git a/ast/visitor_test.go b/ast/visitor_test.go index f207d33e5..af0a17b22 100644 --- a/ast/visitor_test.go +++ b/ast/visitor_test.go @@ -3,7 +3,7 @@ package ast_test import ( "testing" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr/ast" "github.com/stretchr/testify/assert" ) diff --git a/bench_test.go b/bench_test.go index 8d1a272c3..6eb450812 100644 --- a/bench_test.go +++ b/bench_test.go @@ -3,8 +3,8 @@ package expr_test import ( "testing" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/vm" "github.com/stretchr/testify/require" ) diff --git a/builtin/builtin.go b/builtin/builtin.go index 1c3d919cc..8576160a6 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -9,8 +9,8 @@ import ( "strings" "time" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/vm/runtime" ) var ( diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 45582d00a..40f6e32ee 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -10,12 +10,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/checker" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/parser" - "github.com/antonmedv/expr/test/mock" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/test/mock" ) func TestBuiltin(t *testing.T) { @@ -388,7 +388,7 @@ func TestBuiltin_type(t *testing.T) { {func() {}, "func"}, {time.Now(), "time.Time"}, {time.Second, "time.Duration"}, - {Foo{}, "github.com/antonmedv/expr/builtin_test.Foo"}, + {Foo{}, "github.com/expr-lang/expr/builtin_test.Foo"}, {struct{}{}, "struct"}, {a, "int"}, } diff --git a/builtin/func.go b/builtin/func.go index d9ec4ff42..9bcd7827b 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -6,7 +6,7 @@ import ( "reflect" "strconv" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr/vm/runtime" ) func Len(x any) any { diff --git a/checker/checker.go b/checker/checker.go index 0d10e0bf3..e4e2b50d8 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -5,12 +5,12 @@ import ( "reflect" "regexp" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/file" - "github.com/antonmedv/expr/parser" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/vm" ) func Check(tree *parser.Tree, config *conf.Config) (t reflect.Type, err error) { diff --git a/checker/checker_test.go b/checker/checker_test.go index f6b109bc2..d3b636f5b 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -10,12 +10,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/checker" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/parser" - "github.com/antonmedv/expr/test/mock" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/test/mock" ) func TestCheck(t *testing.T) { diff --git a/checker/types.go b/checker/types.go index 890d74a5f..1978fde0b 100644 --- a/checker/types.go +++ b/checker/types.go @@ -4,7 +4,7 @@ import ( "reflect" "time" - "github.com/antonmedv/expr/conf" + "github.com/expr-lang/expr/conf" ) var ( diff --git a/compiler/compiler.go b/compiler/compiler.go index 04f0ff5eb..6f0713b4d 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -4,13 +4,13 @@ import ( "fmt" "reflect" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/file" - "github.com/antonmedv/expr/parser" - . "github.com/antonmedv/expr/vm" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/parser" + . "github.com/expr-lang/expr/vm" + "github.com/expr-lang/expr/vm/runtime" ) const ( diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index c2e9c8f3c..083fc688e 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -4,10 +4,10 @@ import ( "math" "testing" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/test/playground" - "github.com/antonmedv/expr/vm" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/test/playground" + "github.com/expr-lang/expr/vm" + "github.com/expr-lang/expr/vm/runtime" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/conf/config.go b/conf/config.go index 5fb5e1194..4de8ca448 100644 --- a/conf/config.go +++ b/conf/config.go @@ -4,9 +4,9 @@ import ( "fmt" "reflect" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/vm/runtime" ) type Config struct { diff --git a/conf/operators.go b/conf/operators.go index 13e069d76..ca6606274 100644 --- a/conf/operators.go +++ b/conf/operators.go @@ -3,7 +3,7 @@ package conf import ( "reflect" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr/ast" ) // OperatorsTable maps binary operators to corresponding list of functions. diff --git a/debug/debugger.go b/debug/debugger.go index 895e70589..a870973ca 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -7,7 +7,7 @@ import ( "strings" "time" - . "github.com/antonmedv/expr/vm" + . "github.com/expr-lang/expr/vm" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) diff --git a/debug/go.mod b/debug/go.mod index f8d73c9fb..d329d516f 100644 --- a/debug/go.mod +++ b/debug/go.mod @@ -1,9 +1,9 @@ -module github.com/antonmedv/expr/debug +module github.com/expr-lang/expr/debug go 1.18 require ( - github.com/antonmedv/expr v0.0.0 + github.com/expr-lang/expr v0.0.0 github.com/gdamore/tcell/v2 v2.6.0 github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 ) @@ -18,4 +18,4 @@ require ( golang.org/x/text v0.12.0 // indirect ) -replace github.com/antonmedv/expr => ../ +replace github.com/expr-lang/expr => ../ diff --git a/docgen/README.md b/docgen/README.md index 8f059d66a..e933c2f4c 100644 --- a/docgen/README.md +++ b/docgen/README.md @@ -13,7 +13,7 @@ import ( "encoding/json" "fmt" - "github.com/antonmedv/expr/docgen" + "github.com/expr-lang/expr/docgen" ) func main() { @@ -37,7 +37,7 @@ To generate markdown documentation: ```go package main -import "github.com/antonmedv/expr/docgen" +import "github.com/expr-lang/expr/docgen" func main() { // TODO: Replace env with your own types. diff --git a/docgen/docgen.go b/docgen/docgen.go index a1145586f..e9a542b8c 100644 --- a/docgen/docgen.go +++ b/docgen/docgen.go @@ -5,7 +5,7 @@ import ( "regexp" "strings" - "github.com/antonmedv/expr/conf" + "github.com/expr-lang/expr/conf" ) // Kind can be any of array, map, struct, func, string, int, float, bool or any. diff --git a/docgen/docgen_test.go b/docgen/docgen_test.go index e2b58b874..3ffb64ff8 100644 --- a/docgen/docgen_test.go +++ b/docgen/docgen_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - . "github.com/antonmedv/expr/docgen" + . "github.com/expr-lang/expr/docgen" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -127,7 +127,7 @@ func TestCreateDoc(t *testing.T) { }, }, }, - PkgPath: "github.com/antonmedv/expr/docgen_test", + PkgPath: "github.com/expr-lang/expr/docgen_test", } assert.EqualValues(t, expected, doc) @@ -194,7 +194,7 @@ func TestCreateDoc_Ambiguous(t *testing.T) { }, }, }, - PkgPath: "github.com/antonmedv/expr/docgen_test", + PkgPath: "github.com/expr-lang/expr/docgen_test", } assert.EqualValues(t, expected, doc) diff --git a/docs/Configuration.md b/docs/Configuration.md index 7dd9d5a18..0e8e56c2e 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -73,7 +73,7 @@ during the compile step. program, err := expr.Compile(`fib(42)`, expr.ConstExpr("fib")) ``` -[ConstExpr Example](https://pkg.go.dev/github.com/antonmedv/expr?tab=doc#ConstExpr) +[ConstExpr Example](https://pkg.go.dev/github.com/expr-lang/expr?tab=doc#ConstExpr) ## Env() diff --git a/docs/Operator-Overloading.md b/docs/Operator-Overloading.md index 83884103c..2565f820a 100644 --- a/docs/Operator-Overloading.md +++ b/docs/Operator-Overloading.md @@ -12,7 +12,7 @@ To use `-` operator: Now() - CreatedAt ``` -To overload the operator use [Operator](https://pkg.go.dev/github.com/antonmedv/expr?tab=doc#Operator) option: +To overload the operator use [Operator](https://pkg.go.dev/github.com/expr-lang/expr?tab=doc#Operator) option: ```go func main() { diff --git a/docs/Tips.md b/docs/Tips.md index 3c5180842..415b78a8b 100644 --- a/docs/Tips.md +++ b/docs/Tips.md @@ -10,8 +10,8 @@ package main import ( "fmt" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/vm" ) func main() { diff --git a/docs/Visitor-and-Patch.md b/docs/Visitor-and-Patch.md index 05838dab1..fc4334f34 100644 --- a/docs/Visitor-and-Patch.md +++ b/docs/Visitor-and-Patch.md @@ -1,6 +1,6 @@ # Visitor and Patch -The [ast](https://pkg.go.dev/github.com/antonmedv/expr/ast?tab=doc) package +The [ast](https://pkg.go.dev/github.com/expr-lang/expr/ast?tab=doc) package provides the `ast.Visitor` interface and the `ast.Walk` function. It can be used to customize the AST before compiling. @@ -12,8 +12,8 @@ package main import ( "fmt" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/parser" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser" ) type visitor struct { @@ -57,8 +57,8 @@ import ( "fmt" "reflect" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" ) func main() { diff --git a/expr.go b/expr.go index bc5dfc31c..90f1273a1 100644 --- a/expr.go +++ b/expr.go @@ -4,15 +4,15 @@ import ( "fmt" "reflect" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/checker" - "github.com/antonmedv/expr/compiler" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/file" - "github.com/antonmedv/expr/optimizer" - "github.com/antonmedv/expr/parser" - "github.com/antonmedv/expr/patcher" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/compiler" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/optimizer" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/patcher" + "github.com/expr-lang/expr/vm" ) // Option for configuring config. diff --git a/expr_test.go b/expr_test.go index e05fbd54f..873d726fa 100644 --- a/expr_test.go +++ b/expr_test.go @@ -11,10 +11,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/file" - "github.com/antonmedv/expr/test/mock" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/test/mock" ) func ExampleEval() { diff --git a/go.mod b/go.mod index 03d6b62df..0d2d47190 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/antonmedv/expr +module github.com/expr-lang/expr go 1.18 diff --git a/optimizer/const_expr.go b/optimizer/const_expr.go index 694c88bcf..501ea3c58 100644 --- a/optimizer/const_expr.go +++ b/optimizer/const_expr.go @@ -5,8 +5,8 @@ import ( "reflect" "strings" - . "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/file" + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/file" ) var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/optimizer/const_range.go b/optimizer/const_range.go index 26d6d6f57..506b1c423 100644 --- a/optimizer/const_range.go +++ b/optimizer/const_range.go @@ -1,7 +1,7 @@ package optimizer import ( - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type constRange struct{} diff --git a/optimizer/filter_first.go b/optimizer/filter_first.go index 852e2c268..7ea8f6fa4 100644 --- a/optimizer/filter_first.go +++ b/optimizer/filter_first.go @@ -1,7 +1,7 @@ package optimizer import ( - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type filterFirst struct{} diff --git a/optimizer/filter_last.go b/optimizer/filter_last.go index 0a072004b..9a1cc5e29 100644 --- a/optimizer/filter_last.go +++ b/optimizer/filter_last.go @@ -1,7 +1,7 @@ package optimizer import ( - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type filterLast struct{} diff --git a/optimizer/filter_len.go b/optimizer/filter_len.go index 2293de81d..6577163ec 100644 --- a/optimizer/filter_len.go +++ b/optimizer/filter_len.go @@ -1,7 +1,7 @@ package optimizer import ( - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type filterLen struct{} diff --git a/optimizer/filter_map.go b/optimizer/filter_map.go index 9044ac34d..d988dc692 100644 --- a/optimizer/filter_map.go +++ b/optimizer/filter_map.go @@ -1,7 +1,7 @@ package optimizer import ( - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type filterMap struct{} diff --git a/optimizer/fold.go b/optimizer/fold.go index 670ebec09..910c92402 100644 --- a/optimizer/fold.go +++ b/optimizer/fold.go @@ -5,8 +5,8 @@ import ( "math" "reflect" - . "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/file" + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/file" ) var ( diff --git a/optimizer/in_array.go b/optimizer/in_array.go index a51957631..8933d9b91 100644 --- a/optimizer/in_array.go +++ b/optimizer/in_array.go @@ -3,7 +3,7 @@ package optimizer import ( "reflect" - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type inArray struct{} diff --git a/optimizer/in_range.go b/optimizer/in_range.go index b361c6c39..01faabbdf 100644 --- a/optimizer/in_range.go +++ b/optimizer/in_range.go @@ -3,7 +3,7 @@ package optimizer import ( "reflect" - . "github.com/antonmedv/expr/ast" + . "github.com/expr-lang/expr/ast" ) type inRange struct{} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index 15f50fd73..ee9dedeec 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -1,8 +1,8 @@ package optimizer import ( - . "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/conf" + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/conf" ) func Optimize(node *Node, config *conf.Config) error { diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 7ecbefa29..41bd800b7 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -5,12 +5,12 @@ import ( "strings" "testing" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/checker" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/optimizer" - "github.com/antonmedv/expr/parser" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/optimizer" + "github.com/expr-lang/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/parser/lexer/lexer.go b/parser/lexer/lexer.go index 5db2dcbb5..d17e19932 100644 --- a/parser/lexer/lexer.go +++ b/parser/lexer/lexer.go @@ -5,7 +5,7 @@ import ( "strings" "unicode/utf8" - "github.com/antonmedv/expr/file" + "github.com/expr-lang/expr/file" ) func Lex(source *file.Source) ([]Token, error) { diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index 031966108..426507579 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/antonmedv/expr/file" - . "github.com/antonmedv/expr/parser/lexer" + "github.com/expr-lang/expr/file" + . "github.com/expr-lang/expr/parser/lexer" ) func TestLex(t *testing.T) { diff --git a/parser/lexer/state.go b/parser/lexer/state.go index bb150878a..5d82329eb 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -3,7 +3,7 @@ package lexer import ( "strings" - "github.com/antonmedv/expr/parser/utils" + "github.com/expr-lang/expr/parser/utils" ) type stateFn func(*lexer) stateFn diff --git a/parser/lexer/token.go b/parser/lexer/token.go index 8917b26dc..459fa6905 100644 --- a/parser/lexer/token.go +++ b/parser/lexer/token.go @@ -3,7 +3,7 @@ package lexer import ( "fmt" - "github.com/antonmedv/expr/file" + "github.com/expr-lang/expr/file" ) type Kind string diff --git a/parser/parser.go b/parser/parser.go index d4a870f71..9b2d909c1 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -6,13 +6,13 @@ import ( "strconv" "strings" - . "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/file" - . "github.com/antonmedv/expr/parser/lexer" - "github.com/antonmedv/expr/parser/operator" - "github.com/antonmedv/expr/parser/utils" + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/file" + . "github.com/expr-lang/expr/parser/lexer" + "github.com/expr-lang/expr/parser/operator" + "github.com/expr-lang/expr/parser/utils" ) var predicates = map[string]struct { diff --git a/parser/parser_test.go b/parser/parser_test.go index 07cbef22a..5781340be 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -5,8 +5,8 @@ import ( "strings" "testing" - . "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/parser" + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/patcher/with_context.go b/patcher/with_context.go index 35765474f..85f095d5d 100644 --- a/patcher/with_context.go +++ b/patcher/with_context.go @@ -3,7 +3,7 @@ package patcher import ( "reflect" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr/ast" ) // WithContext adds WithContext.Name argument to all functions calls with a context.Context argument. diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index 311cb3922..0d0917afe 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/patcher" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/patcher" ) func TestWithContext(t *testing.T) { diff --git a/repl/go.mod b/repl/go.mod index ea7e9c9b2..b96e6a3be 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -1,10 +1,10 @@ -module github.com/antonmedv/expr/repl +module github.com/expr-lang/expr/repl go 1.20 require ( - github.com/antonmedv/expr v1.13.0 - github.com/antonmedv/expr/debug v0.0.0 + github.com/expr-lang/expr v1.13.0 + github.com/expr-lang/expr/debug v0.0.0 github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf ) @@ -21,6 +21,6 @@ require ( golang.org/x/text v0.12.0 // indirect ) -replace github.com/antonmedv/expr => ../ +replace github.com/expr-lang/expr => ../ -replace github.com/antonmedv/expr/debug => ../debug +replace github.com/expr-lang/expr/debug => ../debug diff --git a/repl/repl.go b/repl/repl.go index 078aa4f10..1bbe43c24 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -2,16 +2,17 @@ package main import ( "fmt" - "github.com/antonmedv/expr/test/fuzz" "os" "runtime" "strings" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/debug" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr/test/fuzz" + "github.com/bettercap/readline" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/debug" + "github.com/expr-lang/expr/vm" ) var keywords = []string{ diff --git a/test/coredns/coredns_test.go b/test/coredns/coredns_test.go index 702b66c17..97eb3768f 100644 --- a/test/coredns/coredns_test.go +++ b/test/coredns/coredns_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/test/coredns" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/test/coredns" "github.com/stretchr/testify/assert" ) diff --git a/test/crowdsec/crowdsec_test.go b/test/crowdsec/crowdsec_test.go index e38190a38..2ac25871c 100644 --- a/test/crowdsec/crowdsec_test.go +++ b/test/crowdsec/crowdsec_test.go @@ -5,8 +5,8 @@ import ( "os" "testing" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/test/crowdsec" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/test/crowdsec" "github.com/stretchr/testify/require" ) diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index 283631c0d..e3bfb7945 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" "github.com/stretchr/testify/require" ) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 126a3a7ad..e8f3bd8cd 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" ) //go:embed fuzz_corpus.txt diff --git a/test/gen/gen.go b/test/gen/gen.go index a96a5f334..1eb36c9bf 100644 --- a/test/gen/gen.go +++ b/test/gen/gen.go @@ -6,9 +6,9 @@ import ( "reflect" "runtime/debug" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/builtin" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" ) var env = map[string]any{ diff --git a/test/gen/gen_test.go b/test/gen/gen_test.go index fdb061dc8..424974de8 100644 --- a/test/gen/gen_test.go +++ b/test/gen/gen_test.go @@ -5,7 +5,7 @@ import ( "strings" "testing" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" "github.com/stretchr/testify/require" ) diff --git a/test/gen/utils.go b/test/gen/utils.go index 0a1b5cc9c..b485fd1a1 100644 --- a/test/gen/utils.go +++ b/test/gen/utils.go @@ -3,7 +3,7 @@ package main import ( "math/rand" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr/ast" ) func maybe() bool { diff --git a/test/interface_method/interface_method_test.go b/test/interface_method/interface_method_test.go index ab49d5356..23d9862d6 100644 --- a/test/interface_method/interface_method_test.go +++ b/test/interface_method/interface_method_test.go @@ -3,7 +3,7 @@ package interface_method_test import ( "testing" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/test/mock/mock.go b/test/mock/mock.go index ad4a91563..6d62f3145 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr/ast" ) type Env struct { diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index 13ef19128..fc5c3b525 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -4,8 +4,8 @@ import ( "testing" "time" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/test/mock" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/test/mock" "github.com/stretchr/testify/require" ) diff --git a/test/patch/patch_test.go b/test/patch/patch_test.go index cc7b3fd5d..612a63e84 100644 --- a/test/patch/patch_test.go +++ b/test/patch/patch_test.go @@ -3,9 +3,9 @@ package patch_test import ( "testing" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/test/mock" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/test/mock" "github.com/stretchr/testify/require" ) diff --git a/test/patch/set_type/set_type_test.go b/test/patch/set_type/set_type_test.go index bdeee7d68..673698afb 100644 --- a/test/patch/set_type/set_type_test.go +++ b/test/patch/set_type/set_type_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/ast" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" ) func TestPatch_SetType(t *testing.T) { diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index 98c55f5fc..da894d507 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/antonmedv/expr" + "github.com/expr-lang/expr" "github.com/stretchr/testify/require" ) diff --git a/test/real_world/real_docs/generate.go b/test/real_world/real_docs/generate.go index 88a14099f..51030e2c5 100644 --- a/test/real_world/real_docs/generate.go +++ b/test/real_world/real_docs/generate.go @@ -3,8 +3,8 @@ package main import ( "fmt" - "github.com/antonmedv/expr/docgen" - "github.com/antonmedv/expr/test/real_world" + "github.com/expr-lang/expr/docgen" + "github.com/expr-lang/expr/test/real_world" ) func main() { diff --git a/test/time/time_test.go b/test/time/time_test.go index 7012a24cf..3eeef4a0d 100644 --- a/test/time/time_test.go +++ b/test/time/time_test.go @@ -5,12 +5,12 @@ import ( "testing" "time" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/checker" - "github.com/antonmedv/expr/compiler" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/parser" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/compiler" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/vm" "github.com/stretchr/testify/require" ) diff --git a/vm/program.go b/vm/program.go index ae5b64108..d634efc62 100644 --- a/vm/program.go +++ b/vm/program.go @@ -9,9 +9,9 @@ import ( "strings" "text/tabwriter" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/file" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/vm/runtime" ) // Program represents a compiled expression. diff --git a/vm/program_test.go b/vm/program_test.go index 4408a565d..d131e775c 100644 --- a/vm/program_test.go +++ b/vm/program_test.go @@ -4,7 +4,7 @@ import ( "strings" "testing" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr/vm" ) func TestProgram_Disassemble(t *testing.T) { diff --git a/vm/vm.go b/vm/vm.go index 70edb29a8..20e1594fd 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -8,9 +8,9 @@ import ( "regexp" "strings" - "github.com/antonmedv/expr/builtin" - "github.com/antonmedv/expr/file" - "github.com/antonmedv/expr/vm/runtime" + "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/vm/runtime" ) var MemoryBudget uint = 1e6 diff --git a/vm/vm_test.go b/vm/vm_test.go index c343e1aae..70a0ae057 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -8,12 +8,12 @@ import ( "github.com/stretchr/testify/require" - "github.com/antonmedv/expr/ast" - "github.com/antonmedv/expr/checker" - "github.com/antonmedv/expr/compiler" - "github.com/antonmedv/expr/conf" - "github.com/antonmedv/expr/parser" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/compiler" + "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/vm" ) func TestRun_NilProgram(t *testing.T) { From 96377f26d9fc75c28e375ceb5da63ca9d6aeae19 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Dec 2023 21:54:16 +0100 Subject: [PATCH 188/506] Fix Expr Code Editor url --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 36362314e..758b87773 100644 --- a/README.md +++ b/README.md @@ -64,12 +64,12 @@ go get github.com/expr-lang/expr ## Expr Code Editor - Expr Code Editor + Expr Code Editor Also, I have an embeddable code editor written in JavaScript which allows editing expressions with syntax highlighting and autocomplete based on your types declaration. -[Learn more →](https://antonmedv.github.io/expr/) +[Learn more →](https://expr-lang.github.io/expr/) ## Examples From 4391851a621e2c1b7e9995fcb4f79337f2545b3e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Dec 2023 21:56:26 +0100 Subject: [PATCH 189/506] Transfer antonmedv/expr to expr-lang/expr --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 758b87773..1fb477b28 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ -# Expr +# Expr + +> [!IMPORTANT] +> The repository [github.com/antonmedv/expr](https://github.com/antonmedv/expr) moved to [github.com/**expr-lang**/expr](https://github.com/expr-lang/expr). + [![test](https://github.com/expr-lang/expr/actions/workflows/test.yml/badge.svg)](https://github.com/expr-lang/expr/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/expr-lang/expr)](https://goreportcard.com/report/github.com/expr-lang/expr) [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/expr.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:expr) From e2b510d17d2889519eadba41ad7877e2cd498fa7 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Dec 2023 22:24:55 +0100 Subject: [PATCH 190/506] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..bc2800951 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: antonmedv From 128b62106561041ddb31c62d060a30305d0ab473 Mon Sep 17 00:00:00 2001 From: 100vlx Date: Wed, 6 Dec 2023 18:02:19 +0800 Subject: [PATCH 191/506] Get source from *vm.Program (#491) --- vm/program.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vm/program.go b/vm/program.go index d634efc62..27b8f6098 100644 --- a/vm/program.go +++ b/vm/program.go @@ -343,3 +343,8 @@ func (program *Program) DisassembleWriter(w io.Writer) { } } } + +// Source returns origin file.Source. +func (program *Program) Source() *file.Source { + return program.source +} From 87c6a94e7089dab4771a0f904af801837f84c0f8 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Fri, 8 Dec 2023 23:03:50 +0530 Subject: [PATCH 192/506] Enhance the number parser to include support for parsing hexadecimal, binary, and octal literals. (#483) * Enhance the number parser to include support for parsing hexadecimal, binary, and octal literals. * added invalid literal test cases * Refactoring code as per comment --------- Co-authored-by: Ganesan Karuppasamy --- parser/lexer/lexer_test.go | 4 ++- parser/parser.go | 60 +++++++++++++++++++++++++------------- parser/parser_test.go | 60 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 21 deletions(-) diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index 426507579..d4bed139e 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -18,7 +18,7 @@ func TestLex(t *testing.T) { tokens []Token }{ { - ".5 0.025 1 02 1e3 0xFF 1.2e-4 1_000_000 _42 -.5", + ".5 0.025 1 02 1e3 0xFF 0b0101 0o600 1.2e-4 1_000_000 _42 -.5", []Token{ {Kind: Number, Value: ".5"}, {Kind: Number, Value: "0.025"}, @@ -26,6 +26,8 @@ func TestLex(t *testing.T) { {Kind: Number, Value: "02"}, {Kind: Number, Value: "1e3"}, {Kind: Number, Value: "0xFF"}, + {Kind: Number, Value: "0b0101"}, + {Kind: Number, Value: "0o600"}, {Kind: Number, Value: "1.2e-4"}, {Kind: Number, Value: "1_000_000"}, {Kind: Identifier, Value: "_42"}, diff --git a/parser/parser.go b/parser/parser.go index 9b2d909c1..5f29279bc 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -306,40 +306,44 @@ func (p *parser) parseSecondary() Node { case Number: p.next() value := strings.Replace(token.Value, "_", "", -1) - if strings.Contains(value, "x") { + var node Node + valueLower := strings.ToLower(value) + switch { + case strings.HasPrefix(valueLower, "0x"): number, err := strconv.ParseInt(value, 0, 64) if err != nil { p.error("invalid hex literal: %v", err) } - if number > math.MaxInt { - p.error("integer literal is too large") - return nil - } - node := &IntegerNode{Value: int(number)} - node.SetLocation(token.Location) - return node - } else if strings.ContainsAny(value, ".eE") { + node = p.toIntegerNode(number) + case strings.ContainsAny(valueLower, ".e"): number, err := strconv.ParseFloat(value, 64) if err != nil { p.error("invalid float literal: %v", err) } - node := &FloatNode{Value: number} - node.SetLocation(token.Location) - return node - } else { + node = p.toFloatNode(number) + case strings.HasPrefix(valueLower, "0b"): + number, err := strconv.ParseInt(value, 0, 64) + if err != nil { + p.error("invalid binary literal: %v", err) + } + node = p.toIntegerNode(number) + case strings.HasPrefix(valueLower, "0o"): + number, err := strconv.ParseInt(value, 0, 64) + if err != nil { + p.error("invalid octal literal: %v", err) + } + node = p.toIntegerNode(number) + default: number, err := strconv.ParseInt(value, 10, 64) if err != nil { p.error("invalid integer literal: %v", err) } - if number > math.MaxInt { - p.error("integer literal is too large") - return nil - } - node := &IntegerNode{Value: int(number)} + node = p.toIntegerNode(number) + } + if node != nil { node.SetLocation(token.Location) - return node } - + return node case String: p.next() node := &StringNode{Value: token.Value} @@ -359,6 +363,22 @@ func (p *parser) parseSecondary() Node { return p.parsePostfixExpression(node) } +func (p *parser) toIntegerNode(number int64) Node { + if number > math.MaxInt { + p.error("integer literal is too large") + return nil + } + return &IntegerNode{Value: int(number)} +} + +func (p *parser) toFloatNode(number float64) Node { + if number > math.MaxFloat64 { + p.error("float literal is too large") + return nil + } + return &FloatNode{Value: number} +} + func (p *parser) parseCall(token Token) Node { var node Node if p.current.Is(Bracket, "(") { diff --git a/parser/parser_test.go b/parser/parser_test.go index 5781340be..2af7635ed 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -36,6 +36,26 @@ func TestParse(t *testing.T) { "0x6E", &IntegerNode{Value: 110}, }, + { + "0X63", + &IntegerNode{Value: 99}, + }, + { + "0o600", + &IntegerNode{Value: 384}, + }, + { + "0O45", + &IntegerNode{Value: 37}, + }, + { + "0b10", + &IntegerNode{Value: 2}, + }, + { + "0B101011", + &IntegerNode{Value: 43}, + }, { "10_000_000", &IntegerNode{Value: 10_000_000}, @@ -549,6 +569,46 @@ foo ?? bar || baz Operator (||) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses. (1:12) | foo ?? bar || baz | ...........^ + +0b15 +bad number syntax: "0b15" (1:5) + | 0b15 + | ....^ + +0X10G +bad number syntax: "0X10G" (1:6) + | 0X10G + | .....^ + +0o1E +invalid float literal: strconv.ParseFloat: parsing "0o1E": invalid syntax (1:4) + | 0o1E + | ...^ + +0b1E +invalid float literal: strconv.ParseFloat: parsing "0b1E": invalid syntax (1:4) + | 0b1E + | ...^ + +0b1E+6 +bad number syntax: "0b1E+6" (1:7) + | 0b1E+6 + | ......^ + +0b1E+1 +invalid float literal: strconv.ParseFloat: parsing "0b1E+1": invalid syntax (1:6) + | 0b1E+1 + | .....^ + +0o1E+1 +invalid float literal: strconv.ParseFloat: parsing "0o1E+1": invalid syntax (1:6) + | 0o1E+1 + | .....^ + +1E +invalid float literal: strconv.ParseFloat: parsing "1E": invalid syntax (1:2) + | 1E + | .^ ` func TestParse_error(t *testing.T) { From 87fda6772d265db28f82d0501b3de7114515ff9a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 8 Dec 2023 18:42:45 +0100 Subject: [PATCH 193/506] fuzz: exclude error unknown time zone --- test/fuzz/fuzz_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index e8f3bd8cd..131c3e98b 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -32,6 +32,7 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`invalid duration`), regexp.MustCompile(`time: missing unit in duration`), regexp.MustCompile(`time: unknown unit .* in duration`), + regexp.MustCompile(`unknown time zone`), regexp.MustCompile(`json: unsupported value`), regexp.MustCompile(`unexpected end of JSON input`), regexp.MustCompile(`memory budget exceeded`), From d7fe04be6483d5a9b7076295fdb96905e3ad9dea Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 10 Dec 2023 10:44:43 +0100 Subject: [PATCH 194/506] checker: forbid accessing custom functions from $env --- checker/checker.go | 14 ++++++++------ expr_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index e4e2b50d8..c214acf3b 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -157,6 +157,12 @@ func (v *checker) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) if node.Value == "$env" { return mapType, info{} } + if fn, ok := v.config.Builtins[node.Value]; ok { + return functionType, info{fn: fn} + } + if fn, ok := v.config.Functions[node.Value]; ok { + return functionType, info{fn: fn} + } return v.env(node, node.Value, true) } @@ -166,13 +172,9 @@ type NodeWithIndexes interface { SetMethodIndex(methodIndex int) } +// env method returns type of environment variable. env only lookups for +// environment variables, no builtins, no custom functions. func (v *checker) env(node NodeWithIndexes, name string, strict bool) (reflect.Type, info) { - if fn, ok := v.config.Builtins[name]; ok { - return functionType, info{fn: fn} - } - if fn, ok := v.config.Functions[name]; ok { - return functionType, info{fn: fn} - } if t, ok := v.config.Types[name]; ok { if t.Ambiguous { return v.error(node, "ambiguous identifier %v", name) diff --git a/expr_test.go b/expr_test.go index 873d726fa..eb77408b1 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1971,7 +1971,32 @@ func TestEnv_keyword(t *testing.T) { }) } +} + +func TestEnv_keyword_with_custom_functions(t *testing.T) { + fn := expr.Function("fn", func(params ...any) (any, error) { + return "ok", nil + }) + + var tests = []struct { + code string + error bool + }{ + {`fn()`, false}, + {`$env.fn()`, true}, + {`$env["fn"]`, true}, + } + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + _, err := expr.Compile(tt.code, expr.Env(mock.Env{}), fn) + if tt.error { + require.Error(t, err) + } else { + require.NoError(t, err) + } + }) + } } func TestIssue401(t *testing.T) { From 9ba50946c14428bb17a891f81924c7a6d4b31297 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 10 Dec 2023 10:44:58 +0100 Subject: [PATCH 195/506] fuzz: add custom function to fuzzer --- repl/repl.go | 5 ++++- test/fuzz/fuzz_env.go | 12 ++++++++++++ test/fuzz/fuzz_test.go | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/repl/repl.go b/repl/repl.go index 1bbe43c24..7fddc0ea3 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -9,6 +9,7 @@ import ( "github.com/expr-lang/expr/test/fuzz" "github.com/bettercap/readline" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/debug" @@ -29,6 +30,8 @@ func main() { for name := range env { keywords = append(keywords, name) } + fn := fuzz.Func() + keywords = append(keywords, "fn") home, err := os.UserHomeDir() if err != nil { panic(err) @@ -81,7 +84,7 @@ func main() { continue } - program, err = expr.Compile(line, expr.Env(env)) + program, err = expr.Compile(line, expr.Env(env), fn) if err != nil { fmt.Printf("compile error: %s\n", err) continue diff --git a/test/fuzz/fuzz_env.go b/test/fuzz/fuzz_env.go index f761148de..d646ee92d 100644 --- a/test/fuzz/fuzz_env.go +++ b/test/fuzz/fuzz_env.go @@ -1,5 +1,11 @@ package fuzz +import ( + "fmt" + + "github.com/expr-lang/expr" +) + func NewEnv() map[string]any { return map[string]any{ "ok": true, @@ -25,6 +31,12 @@ func NewEnv() map[string]any { } } +func Func() expr.Option { + return expr.Function("fn", func(params ...any) (any, error) { + return fmt.Sprintf("fn(%v)", params), nil + }) +} + type Foo struct { Bar string } diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 131c3e98b..f1844b2f7 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -54,13 +54,14 @@ func FuzzExpr(f *testing.F) { } env := NewEnv() + fn := Func() f.Fuzz(func(t *testing.T, code string) { if len(code) > 1000 { t.Skip("too long code") } - program, err := expr.Compile(code, expr.Env(env)) + program, err := expr.Compile(code, expr.Env(env), fn) if err != nil { t.Skipf("compile error: %s", err) } From 515f38b3dbfb85171c6becf2009bb2d39d4c2bb8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 10 Dec 2023 11:02:12 +0100 Subject: [PATCH 196/506] fix: make deref commutative Fixes #490 --- compiler/compiler.go | 4 ++-- test/deref/deref_test.go | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 6f0713b4d..4831a3103 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -368,7 +368,7 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { c.compile(node.Left) c.derefInNeeded(node.Left) c.compile(node.Right) - c.derefInNeeded(node.Left) + c.derefInNeeded(node.Right) if l == r && l == reflect.Int && leftAndRightAreSimple { c.emit(OpEqualInt) @@ -382,7 +382,7 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { c.compile(node.Left) c.derefInNeeded(node.Left) c.compile(node.Right) - c.derefInNeeded(node.Left) + c.derefInNeeded(node.Right) c.emit(OpEqual) c.emit(OpNot) diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index e3bfb7945..684794a01 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -4,8 +4,9 @@ import ( "context" "testing" - "github.com/expr-lang/expr" "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" ) func TestDeref_binary(t *testing.T) { @@ -200,3 +201,39 @@ func TestDeref_nil_in_pointer_of_interface(t *testing.T) { require.Equal(t, true, output) }) } + +func TestDeref_сommutative(t *testing.T) { + a := "ok" + b := "ok" + + type Env struct { + A string + B *string + } + + env := Env{ + A: a, + B: &b, + } + + tests := []struct { + code string + want bool + }{ + {`A == B`, true}, + {`B == A`, true}, + {`A != B`, false}, + {`B != A`, false}, + } + + for _, test := range tests { + t.Run(test.code, func(t *testing.T) { + program, err := expr.Compile(test.code, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, test.want, out) + }) + } +} From bc65b9bce8ae52c67dced8c43ecf24bd3d3eb96c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 10 Dec 2023 11:11:21 +0100 Subject: [PATCH 197/506] MIT License --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 7d058f841..ec46ce324 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Anton Medvedev +Copyright (c) 2018 Anton Medvedev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From e09a605bd1fe493f331996357734a0afcde52a90 Mon Sep 17 00:00:00 2001 From: Sergey Grebenshchikov Date: Mon, 18 Dec 2023 21:46:31 +0100 Subject: [PATCH 198/506] Fix: checker panic on embedded pointer to struct field (#500) * add failing test case: embedded pointer to struct * fix(dereference embedded pointers to structs) * add evaluation test for field access and method call on embedded pointer struct --- checker/checker_test.go | 1 + checker/types.go | 6 +++- expr_test.go | 62 +++++++++++++++++++++++++++++++++++++++++ test/mock/mock.go | 13 +++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/checker/checker_test.go b/checker/checker_test.go index d3b636f5b..42301261d 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -131,6 +131,7 @@ func TestCheck(t *testing.T) { {"(Any.Bool ?? Bool) > 0"}, {"Bool ?? Bool"}, {"let foo = 1; foo == 1"}, + {"(Embed).EmbedPointerEmbedInt > 0"}, } for _, tt := range tests { diff --git a/checker/types.go b/checker/types.go index 1978fde0b..c7a75278b 100644 --- a/checker/types.go +++ b/checker/types.go @@ -192,7 +192,11 @@ func fetchField(t reflect.Type, name string) (reflect.StructField, bool) { for i := 0; i < t.NumField(); i++ { anon := t.Field(i) if anon.Anonymous { - if field, ok := fetchField(anon.Type, name); ok { + anonType := anon.Type + for anonType.Kind() == reflect.Pointer { + anonType = anonType.Elem() + } + if field, ok := fetchField(anonType, name); ok { field.Index = append(anon.Index, field.Index...) return field, true } diff --git a/expr_test.go b/expr_test.go index eb77408b1..d0f5b198b 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2180,6 +2180,68 @@ func TestIssue462(t *testing.T) { require.Error(t, err) } +func TestIssue_embedded_pointer_struct(t *testing.T) { + var tests = []struct { + input string + env mock.Env + want any + }{ + { + input: "(Embed).EmbedPointerEmbedInt > 0", + env: mock.Env{ + Embed: mock.Embed{ + EmbedPointerEmbed: &mock.EmbedPointerEmbed{ + EmbedPointerEmbedInt: 123, + }, + }, + }, + want: true, + }, + { + input: "(Embed).EmbedPointerEmbedInt > 0", + env: mock.Env{ + Embed: mock.Embed{ + EmbedPointerEmbed: &mock.EmbedPointerEmbed{ + EmbedPointerEmbedInt: 0, + }, + }, + }, + want: false, + }, + { + input: "(Embed).EmbedPointerEmbedMethod(0)", + env: mock.Env{ + Embed: mock.Embed{ + EmbedPointerEmbed: &mock.EmbedPointerEmbed{ + EmbedPointerEmbedInt: 0, + }, + }, + }, + want: "", + }, + { + input: "(Embed).EmbedPointerEmbedPointerReceiverMethod(0)", + env: mock.Env{ + Embed: mock.Embed{ + EmbedPointerEmbed: nil, + }, + }, + want: "", + }, + } + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + program, err := expr.Compile(tt.input, expr.Env(tt.env)) + require.NoError(t, err) + + out, err := expr.Run(program, tt.env) + require.NoError(t, err) + + require.Equal(t, tt.want, out) + }) + } +} + func TestIssue(t *testing.T) { testCases := []struct { code string diff --git a/test/mock/mock.go b/test/mock/mock.go index 6d62f3145..5c0fa9e3f 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -103,6 +103,7 @@ func (Env) NotStringerStringerEqual(f fmt.Stringer, g fmt.Stringer) bool { type Embed struct { EmbedEmbed + *EmbedPointerEmbed EmbedString string } @@ -110,6 +111,18 @@ func (p Embed) EmbedMethod(_ int) string { return "" } +type EmbedPointerEmbed struct { + EmbedPointerEmbedInt int +} + +func (p EmbedPointerEmbed) EmbedPointerEmbedMethod(_ int) string { + return "" +} + +func (p *EmbedPointerEmbed) EmbedPointerEmbedPointerReceiverMethod(_ int) string { + return "" +} + type EmbedEmbed struct { EmbedEmbedString string } From cd16e732543a766a0d31735dcc4003e39ae9da25 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 19 Dec 2023 08:40:13 +0100 Subject: [PATCH 199/506] Add additional ember test --- expr_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/expr_test.go b/expr_test.go index d0f5b198b..ff5eea3f0 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2186,6 +2186,17 @@ func TestIssue_embedded_pointer_struct(t *testing.T) { env mock.Env want any }{ + { + input: "EmbedPointerEmbedInt > 0", + env: mock.Env{ + Embed: mock.Embed{ + EmbedPointerEmbed: &mock.EmbedPointerEmbed{ + EmbedPointerEmbedInt: 123, + }, + }, + }, + want: true, + }, { input: "(Embed).EmbedPointerEmbedInt > 0", env: mock.Env{ From 632e43778e6e4594ce804e46f3cd104a3ae900ef Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 19 Dec 2023 17:12:18 +0100 Subject: [PATCH 200/506] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 1fb477b28..73ef1616b 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,6 @@ func main() { * [Philips Labs](https://github.com/philips-labs/tabia) employs Expr in Tabia, a tool designed to collect insights on their code bases. * [CoreDNS](https://coredns.io) uses Expr in CoreDNS, which is a DNS server. * [Chaos Mesh](https://chaos-mesh.org) incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform. -* [Milvus](https://milvus.io) integrates Expr into Milvus, an open-source vector database. * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. From f0a00de565c26fecf218395e840b7efdc2ee7545 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 19 Dec 2023 18:03:12 +0100 Subject: [PATCH 201/506] Update README.md --- README.md | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 73ef1616b..09a9a6335 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Expr +

    Zx logo Expr

    > [!IMPORTANT] > The repository [github.com/antonmedv/expr](https://github.com/antonmedv/expr) moved to [github.com/**expr-lang**/expr](https://github.com/expr-lang/expr). @@ -10,16 +10,21 @@ **Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. -expr logo +**Expr** offers a simple [syntax](https://expr-lang.org/docs/Language-Definition) with powerful features, ensuring ease of use: ```js // Allow only admins and moderators to moderate comments. user.Group in ["admin", "moderator"] || user.Id == comment.UserId ``` +```js +// Determine whether the request is in the permitted time window. +request.Time - resource.Age < duration("24h") +``` + ```js // Ensure all tweets are less than 240 characters. -all(Tweets, .Size <= 240) +all(tweets, len(.Content) <= 240) ``` ## Features @@ -62,18 +67,8 @@ go get github.com/expr-lang/expr ## Documentation -* See [Getting Started](https://expr.medv.io/docs/Getting-Started) page for developer documentation. -* See [Language Definition](https://expr.medv.io/docs/Language-Definition) page to learn the syntax. - -## Expr Code Editor - - - Expr Code Editor - - -Also, I have an embeddable code editor written in JavaScript which allows editing expressions with syntax highlighting and autocomplete based on your types declaration. - -[Learn more →](https://expr-lang.github.io/expr/) +* See [Getting Started](https://expr-lang.org/docs/Getting-Started) page for developer documentation. +* See [Language Definition](https://expr-lang.org/docs/Language-Definition) page to learn the syntax. ## Examples From 5117651774c6df8b959d8584aa78c0dee6f8c889 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 19 Dec 2023 18:09:15 +0100 Subject: [PATCH 202/506] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09a9a6335..d8b16ce77 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ **Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. -**Expr** offers a simple [syntax](https://expr-lang.org/docs/Language-Definition) with powerful features, ensuring ease of use: +**Expr** combines simple [syntax](https://expr-lang.org/docs/Language-Definition) with powerful features for ease of use: ```js // Allow only admins and moderators to moderate comments. From de39ee0b8c98424808483a3929b205794b16c6b3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 19 Dec 2023 18:10:39 +0100 Subject: [PATCH 203/506] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index d8b16ce77..74e3afda3 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,7 @@ [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/expr.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:expr) [![GoDoc](https://godoc.org/github.com/expr-lang/expr?status.svg)](https://godoc.org/github.com/expr-lang/expr) -**Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. - +**Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. **Expr** combines simple [syntax](https://expr-lang.org/docs/Language-Definition) with powerful features for ease of use: ```js From 9b18a23fdb09c2023f931847fa9e44bbadaf8306 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 19 Dec 2023 20:45:06 +0100 Subject: [PATCH 204/506] Rename test case --- expr_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/expr_test.go b/expr_test.go index ff5eea3f0..9e0d3a762 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2253,7 +2253,7 @@ func TestIssue_embedded_pointer_struct(t *testing.T) { } } -func TestIssue(t *testing.T) { +func TestIssue474(t *testing.T) { testCases := []struct { code string fail bool From e7ab66afbb79c3728d7ba6fc80b909d8bacca4f2 Mon Sep 17 00:00:00 2001 From: Sergey Grebenshchikov Date: Fri, 22 Dec 2023 10:14:08 +0100 Subject: [PATCH 205/506] remove unnecessary loop (#501) --- checker/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checker/types.go b/checker/types.go index c7a75278b..662139c37 100644 --- a/checker/types.go +++ b/checker/types.go @@ -193,7 +193,7 @@ func fetchField(t reflect.Type, name string) (reflect.StructField, bool) { anon := t.Field(i) if anon.Anonymous { anonType := anon.Type - for anonType.Kind() == reflect.Pointer { + if anonType.Kind() == reflect.Pointer { anonType = anonType.Elem() } if field, ok := fetchField(anonType, name); ok { From aea29169cc232ab7079f42b70e996823c25d190a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 22 Dec 2023 22:48:59 +0100 Subject: [PATCH 206/506] Add custom tests --- .gitignore | 1 + expr_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/.gitignore b/.gitignore index b0df3eb44..b089dce8a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ *.test *.out *.html +custom_tests.json diff --git a/expr_test.go b/expr_test.go index 9e0d3a762..836702249 100644 --- a/expr_test.go +++ b/expr_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "os" "reflect" "testing" "time" @@ -2053,6 +2054,35 @@ func TestMemoryBudget(t *testing.T) { } } +func TestExpr_custom_tests(t *testing.T) { + f, err := os.Open("custom_tests.json") + if os.IsNotExist(err) { + t.Skip("no custom tests") + return + } + + require.NoError(t, err, "open file error") + defer f.Close() + + var tests []string + err = json.NewDecoder(f).Decode(&tests) + require.NoError(t, err, "decode json error") + + for id, tt := range tests { + t.Run(fmt.Sprintf("line %v", id+2), func(t *testing.T) { + program, err := expr.Compile(tt) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + + // Make sure out is used. + _ = fmt.Sprintf("%v", out) + + assert.Error(t, err) + }) + } +} + func TestIssue432(t *testing.T) { env := map[string]any{ "func": func( From e4a455598673b33386db37686a314ec29da6d255 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 22 Dec 2023 22:49:31 +0100 Subject: [PATCH 207/506] Remove const range optimization --- optimizer/const_range.go | 40 ------------------------------------- optimizer/optimizer.go | 1 - optimizer/optimizer_test.go | 19 +++--------------- 3 files changed, 3 insertions(+), 57 deletions(-) delete mode 100644 optimizer/const_range.go diff --git a/optimizer/const_range.go b/optimizer/const_range.go deleted file mode 100644 index 506b1c423..000000000 --- a/optimizer/const_range.go +++ /dev/null @@ -1,40 +0,0 @@ -package optimizer - -import ( - . "github.com/expr-lang/expr/ast" -) - -type constRange struct{} - -func (*constRange) Visit(node *Node) { - switch n := (*node).(type) { - case *BinaryNode: - if n.Operator == ".." { - if min, ok := n.Left.(*IntegerNode); ok { - if max, ok := n.Right.(*IntegerNode); ok { - size := max.Value - min.Value + 1 - // In case the max < min, patch empty slice - // as max must be greater than equal to min. - if size < 1 { - Patch(node, &ConstantNode{ - Value: make([]int, 0), - }) - return - } - // In this case array is too big. Skip generation, - // and wait for memory budget detection on runtime. - if size > 1e6 { - return - } - value := make([]int, size) - for i := range value { - value[i] = min.Value + i - } - Patch(node, &ConstantNode{ - Value: value, - }) - } - } - } - } -} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index ee9dedeec..a9c0fa3d3 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -32,7 +32,6 @@ func Optimize(node *Node, config *conf.Config) error { } } Walk(node, &inRange{}) - Walk(node, &constRange{}) Walk(node, &filterMap{}) Walk(node, &filterLen{}) Walk(node, &filterLast{}) diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 41bd800b7..e45de763b 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -5,14 +5,15 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/conf" "github.com/expr-lang/expr/optimizer" "github.com/expr-lang/expr/parser" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestOptimize_constant_folding(t *testing.T) { @@ -116,20 +117,6 @@ func TestOptimize_in_range_with_floats(t *testing.T) { assert.Equal(t, false, out) } -func TestOptimize_const_range(t *testing.T) { - tree, err := parser.Parse(`-1..1`) - require.NoError(t, err) - - err = optimizer.Optimize(&tree.Node, nil) - require.NoError(t, err) - - expected := &ast.ConstantNode{ - Value: []int{-1, 0, 1}, - } - - assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) -} - func TestOptimize_const_expr(t *testing.T) { tree, err := parser.Parse(`toUpper("hello")`) require.NoError(t, err) From cf9f6e864ca3a20b70832f532f59ad3cee6bb6b8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 22 Dec 2023 22:49:43 +0100 Subject: [PATCH 208/506] Update ast comments --- ast/node.go | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/ast/node.go b/ast/node.go index 7aabf064c..f9d27fc6a 100644 --- a/ast/node.go +++ b/ast/node.go @@ -121,15 +121,15 @@ type BinaryNode struct { Operator string // Operator of the binary operator. Like "+" in "foo + bar" or "matches" in "foo matches bar". Left Node // Left node of the binary operator. Right Node // Right node of the binary operator. - Regexp *regexp.Regexp // Internal. Regexp of the "matches" operator. Like "f.+" in `foo matches "f.+"`. + Regexp *regexp.Regexp // Internal. Regexp of the "matches" operator. Like "f.+". } // ChainNode represents an optional chaining group. // A few MemberNode nodes can be chained together, // and will be wrapped in a ChainNode. Example: -// ``` -// foo.bar?.baz?.qux -// ``` +// +// foo.bar?.baz?.qux +// // The whole chain will be wrapped in a ChainNode. type ChainNode struct { base @@ -140,11 +140,10 @@ type ChainNode struct { // It can be a field access, a method call, // or an array element access. // Example: -// ``` -// foo.bar or foo["bar"] -// foo.bar() -// array[0] -// ``` +// +// foo.bar or foo["bar"] +// foo.bar() +// array[0] type MemberNode struct { base Node Node // Node of the member access. Like "foo" in "foo.bar". @@ -171,9 +170,8 @@ func (n *MemberNode) SetMethodIndex(methodIndex int) { // SliceNode represents access to a slice of an array. // Example: -// ``` -// array[1:4] -// ``` +// +// array[1:4] type SliceNode struct { base Node Node // Node of the slice. Like "array" in "array[1:4]". @@ -202,10 +200,10 @@ type BuiltinNode struct { // ClosureNode represents a predicate. // Example: -// ``` -// filter(foo, .bar == 1) -// ``` -// The predicate is `.bar == 1`. +// +// filter(foo, .bar == 1) +// +// The predicate is ".bar == 1". type ClosureNode struct { base Node Node // Node of the predicate body. From 7f738559ed6cd76014686f7dea3d7f6809956ba9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 22 Dec 2023 23:09:31 +0100 Subject: [PATCH 209/506] Add timeout to test --- expr_test.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/expr_test.go b/expr_test.go index 836702249..4992ca2c3 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2073,12 +2073,27 @@ func TestExpr_custom_tests(t *testing.T) { program, err := expr.Compile(tt) require.NoError(t, err) - out, err := expr.Run(program, nil) - - // Make sure out is used. - _ = fmt.Sprintf("%v", out) - - assert.Error(t, err) + timeout := make(chan bool, 1) + go func() { + time.Sleep(time.Second) + timeout <- true + }() + + done := make(chan bool, 1) + go func() { + out, err := expr.Run(program, nil) + // Make sure out is used. + _ = fmt.Sprintf("%v", out) + assert.Error(t, err) + done <- true + }() + + select { + case <-done: + // Success. + case <-timeout: + t.Fatal("timeout") + } }) } } From 202e62236c9113b691b3ff0522d93c2eeee66bbd Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 23 Dec 2023 10:33:54 +0100 Subject: [PATCH 210/506] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 74e3afda3..7c08fc672 100644 --- a/README.md +++ b/README.md @@ -151,13 +151,13 @@ func main() { * [Aviasales](https://aviasales.ru) utilizes Expr as a business rule engine for its flight search engine. * [Wish.com](https://www.wish.com) employs Expr in its decision-making rule engine for the Wish Assistant. * [Argo](https://argoproj.github.io) integrates Expr into Argo Rollouts and Argo Workflows for Kubernetes. -* [Crowdsec](https://crowdsec.net) incorporates Expr into its security automation tool. -* [FACEIT](https://www.faceit.com) uses Expr to enhance customization of its eSports matchmaking algorithm. -* [qiniu](https://www.qiniu.com) implements Expr in its trade systems. -* [Junglee Games](https://www.jungleegames.com/) uses Expr for its in-house marketing retention tool, Project Audience. * [OpenTelemetry](https://opentelemetry.io) integrates Expr into the OpenTelemetry Collector. * [Philips Labs](https://github.com/philips-labs/tabia) employs Expr in Tabia, a tool designed to collect insights on their code bases. +* [CrowdSec](https://crowdsec.net) incorporates Expr into its security automation tool. * [CoreDNS](https://coredns.io) uses Expr in CoreDNS, which is a DNS server. +* [qiniu](https://www.qiniu.com) implements Expr in its trade systems. +* [Junglee Games](https://www.jungleegames.com/) uses Expr for its in-house marketing retention tool, Project Audience. +* [Faceit](https://www.faceit.com) uses Expr to enhance customization of its eSports matchmaking algorithm. * [Chaos Mesh](https://chaos-mesh.org) incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform. * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. @@ -167,3 +167,5 @@ func main() { ## License [MIT](https://github.com/expr-lang/expr/blob/master/LICENSE) + +

    From 07f130d0384204fb1d1214e0e33b02bc805b5dd8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 23 Dec 2023 10:35:16 +0100 Subject: [PATCH 211/506] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7c08fc672..f68b786cd 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ go get github.com/expr-lang/expr ## Examples -[Play Online](https://play.golang.org/p/z7T8ytJ1T1d) +[Play Online](https://go.dev/play/p/XCoNXEjm3TS) ```go package main @@ -104,7 +104,7 @@ func main() { } ``` -[Play Online](https://play.golang.org/p/4S4brsIvU4i) +[Play Online](https://go.dev/play/p/tz-ZneBfSuw) ```go package main From 8cb1a4c3250acb48f26c876dbe6ca370d00d8c86 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 23 Dec 2023 10:49:02 +0100 Subject: [PATCH 212/506] Use lowercase filenames in docs --- docs/{Internals.md => internals.md} | 0 docs/{Tips.md => tips.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/{Internals.md => internals.md} (100%) rename docs/{Tips.md => tips.md} (100%) diff --git a/docs/Internals.md b/docs/internals.md similarity index 100% rename from docs/Internals.md rename to docs/internals.md diff --git a/docs/Tips.md b/docs/tips.md similarity index 100% rename from docs/Tips.md rename to docs/tips.md From 18c44ea59cd1c480829ddc6e2a9befd83b3fec77 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 25 Dec 2023 09:19:44 +0100 Subject: [PATCH 213/506] Rename md docs to lowercase --- docs/{Configuration.md => configuration.md} | 4 ++-- docs/{Getting-Started.md => getting-started.md} | 2 +- docs/{Language-Definition.md => language-definition.md} | 0 docs/{Operator-Overloading.md => operator-overloading.md} | 0 docs/{Visitor-and-Patch.md => visitor-and-patch.md} | 0 5 files changed, 3 insertions(+), 3 deletions(-) rename docs/{Configuration.md => configuration.md} (95%) rename docs/{Getting-Started.md => getting-started.md} (99%) rename docs/{Language-Definition.md => language-definition.md} (100%) rename docs/{Operator-Overloading.md => operator-overloading.md} (100%) rename docs/{Visitor-and-Patch.md => visitor-and-patch.md} (100%) diff --git a/docs/Configuration.md b/docs/configuration.md similarity index 95% rename from docs/Configuration.md rename to docs/configuration.md index 0e8e56c2e..5693ce7f0 100644 --- a/docs/Configuration.md +++ b/docs/configuration.md @@ -145,7 +145,7 @@ Here is another example with a few function signatures: ## Operator() -This options defines an [operator overloading](Operator-Overloading.md). +This options defines an [operator overloading](operator-overloading). ## Optimize() @@ -153,4 +153,4 @@ This option enables [optimizations](Internals.md). By default, Expr will optimiz ## Patch() -This option allows you to [patch the expression](Visitor-and-Patch.md) before compilation. +This option allows you to [patch the expression](visitor-and-patch) before compilation. diff --git a/docs/Getting-Started.md b/docs/getting-started.md similarity index 99% rename from docs/Getting-Started.md rename to docs/getting-started.md index 87653946a..b6b0e4da9 100644 --- a/docs/Getting-Started.md +++ b/docs/getting-started.md @@ -73,7 +73,7 @@ if err != nil { Expr can work with any Go types. Here is an example: ```go -env := map[string]interface{}{ +env := map[string]any{ "greet": "Hello, %v!", "names": []string{"world", "you"}, "sprintf": fmt.Sprintf, diff --git a/docs/Language-Definition.md b/docs/language-definition.md similarity index 100% rename from docs/Language-Definition.md rename to docs/language-definition.md diff --git a/docs/Operator-Overloading.md b/docs/operator-overloading.md similarity index 100% rename from docs/Operator-Overloading.md rename to docs/operator-overloading.md diff --git a/docs/Visitor-and-Patch.md b/docs/visitor-and-patch.md similarity index 100% rename from docs/Visitor-and-Patch.md rename to docs/visitor-and-patch.md From 529ee7a003c2d1020b8aedc96e230ad375465de3 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Mon, 25 Dec 2023 22:35:25 +0530 Subject: [PATCH 214/506] Incorporate support for raw string literals (#485) --- parser/lexer/lexer.go | 14 ++++++++++++++ parser/lexer/lexer_test.go | 13 +++++++++++++ parser/lexer/state.go | 2 ++ parser/parser_test.go | 5 +++++ 4 files changed, 34 insertions(+) diff --git a/parser/lexer/lexer.go b/parser/lexer/lexer.go index d17e19932..c32658637 100644 --- a/parser/lexer/lexer.go +++ b/parser/lexer/lexer.go @@ -219,3 +219,17 @@ func (l *lexer) scanString(quote rune) (n int) { } return } + +func (l *lexer) scanRawString(quote rune) (n int) { + ch := l.next() // read character after back tick + for ch != quote { + if ch == eof { + l.error("literal not terminated") + return + } + ch = l.next() + n++ + } + l.emitValue(String, l.input[l.start+1:l.end-1]) + return +} diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index d4bed139e..feecf045d 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -49,6 +49,19 @@ func TestLex(t *testing.T) { {Kind: EOF}, }, }, + { + "`backtick` `hello\u263Aworld` `hello\n\tworld` `hello\"world'` `\xC3\xBF\u263A\U000003A8` `❤️`", + []Token{ + {Kind: String, Value: `backtick`}, + {Kind: String, Value: `hello☺world`}, + {Kind: String, Value: `hello + world`}, + {Kind: String, Value: `hello"world'`}, + {Kind: String, Value: `ÿ☺Ψ`}, + {Kind: String, Value: "❤️"}, + {Kind: EOF}, + }, + }, { "a and orb().val #.", []Token{ diff --git a/parser/lexer/state.go b/parser/lexer/state.go index 5d82329eb..9999fd3c5 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -23,6 +23,8 @@ func root(l *lexer) stateFn { l.error("%v", err) } l.emitValue(String, str) + case r == '`': + l.scanRawString(r) case '0' <= r && r <= '9': l.backup() return number diff --git a/parser/parser_test.go b/parser/parser_test.go index 2af7635ed..fbeb24696 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -24,6 +24,11 @@ func TestParse(t *testing.T) { `"str"`, &StringNode{Value: "str"}, }, + { + "`hello\nworld`", + &StringNode{Value: `hello +world`}, + }, { "3", &IntegerNode{Value: 3}, From 9b95d249013334adaabec5a121f1eada2e4cc53f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 25 Dec 2023 18:24:05 +0100 Subject: [PATCH 215/506] Rename back --- docs/{language-definition.md => Language-Definition.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{language-definition.md => Language-Definition.md} (100%) diff --git a/docs/language-definition.md b/docs/Language-Definition.md similarity index 100% rename from docs/language-definition.md rename to docs/Language-Definition.md From 9b8d74166566e64506144ff27f832170308728d5 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Mon, 25 Dec 2023 22:55:26 +0530 Subject: [PATCH 216/506] feat: Implement Bitwise and Shift Operator Support (#496) Co-authored-by: Ganesan Karuppasamy --- builtin/builtin.go | 44 ++++++++++++++++++++++++ builtin/builtin_test.go | 35 +++++++++++++++++++ builtin/func.go | 22 ++++++++++++ builtin/utils.go | 27 +++++++++++++++ compiler/compiler_test.go | 5 +-- docs/Language-Definition.md | 68 +++++++++++++++++++++++++++++++++++++ expr_test.go | 32 +++++++++++++++++ parser/parser_test.go | 5 +-- vm/runtime/generated.go | 2 +- 9 files changed, 235 insertions(+), 5 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 8576160a6..d76cc9d06 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -972,4 +972,48 @@ var Builtins = []*ast.Function{ return arrayType, nil }, }, + bitFunc("bitand", func(x, y int) (any, error) { + return x & y, nil + }), + bitFunc("bitor", func(x, y int) (any, error) { + return x | y, nil + }), + bitFunc("bitxor", func(x, y int) (any, error) { + return x ^ y, nil + }), + bitFunc("bitnand", func(x, y int) (any, error) { + return x &^ y, nil + }), + bitFunc("bitshl", func(x, y int) (any, error) { + if y < 0 { + return nil, fmt.Errorf("invalid operation: negative shift count %d (type int)", y) + } + return x << y, nil + }), + bitFunc("bitshr", func(x, y int) (any, error) { + if y < 0 { + return nil, fmt.Errorf("invalid operation: negative shift count %d (type int)", y) + } + return x >> y, nil + }), + bitFunc("bitushr", func(x, y int) (any, error) { + if y < 0 { + return nil, fmt.Errorf("invalid operation: negative shift count %d (type int)", y) + } + return int(uint(x) >> y), nil + }), + { + Name: "bitnot", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments for bitnot (expected 1, got %d)", len(args)) + } + x, err := toInt(args[0]) + if err != nil { + return nil, fmt.Errorf("%v to call bitnot", err) + } + return ^x, nil + }, + Types: types(new(func(int) int)), + }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 40f6e32ee..a861d0faa 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -199,6 +199,13 @@ func TestBuiltin_errors(t *testing.T) { {`date("error")`, `invalid date`}, {`get()`, `invalid number of arguments (expected 2, got 0)`}, {`get(1, 2)`, `type int does not support indexing`}, + {`bitnot("1")`, "cannot use string as argument (type int) to call bitnot (1:8)"}, + {`bitand("1", 1)`, "cannot use string as argument (type int) to call bitand (1:8)"}, + {`"10" | bitor(1)`, "cannot use string as argument (type int) to call bitor (1:1)"}, + {`bitshr("5", 1)`, "cannot use string as argument (type int) to call bitshr (1:8)"}, + {`bitshr(-5, -2)`, "invalid operation: negative shift count -2 (type int) (1:1)"}, + {`bitshl(1, -1)`, "invalid operation: negative shift count -1 (type int) (1:1)"}, + {`bitushr(-5, -2)`, "invalid operation: negative shift count -2 (type int) (1:1)"}, } for _, test := range errorTests { t.Run(test.input, func(t *testing.T) { @@ -437,3 +444,31 @@ func TestBuiltin_sort(t *testing.T) { }) } } + +func TestBuiltin_bitOpsFunc(t *testing.T) { + tests := []struct { + input string + want int + }{ + {`bitnot(156)`, -157}, + {`bitand(bitnot(156), 255)`, 99}, + {`bitor(987, -123)`, -33}, + {`bitxor(15, 32)`, 47}, + {`bitshl(39, 3)`, 312}, + {`bitshr(5, 1)`, 2}, + {`bitushr(-5, 2)`, 4611686018427387902}, + {`bitnand(35, 9)`, 34}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + program, err := expr.Compile(test.input, expr.Env(nil)) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + fmt.Printf("%v : %v", test.input, out) + require.NoError(t, err) + assert.Equal(t, test.want, out) + }) + } +} diff --git a/builtin/func.go b/builtin/func.go index 9bcd7827b..1c2546a2d 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -6,6 +6,7 @@ import ( "reflect" "strconv" + "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/vm/runtime" ) @@ -272,3 +273,24 @@ func Min(args ...any) (any, error) { } return min, nil } + +func bitFunc(name string, fn func(x, y int) (any, error)) *ast.Function { + return &ast.Function{ + Name: name, + Func: func(args ...any) (any, error) { + if len(args) != 2 { + return nil, fmt.Errorf("invalid number of arguments for %s (expected 2, got %d)", name, len(args)) + } + x, err := toInt(args[0]) + if err != nil { + return nil, fmt.Errorf("%v to call %s", err, name) + } + y, err := toInt(args[1]) + if err != nil { + return nil, fmt.Errorf("%v to call %s", err, name) + } + return fn(x, y) + }, + Types: types(new(func(int, int) int)), + } +} diff --git a/builtin/utils.go b/builtin/utils.go index eff8fdcd1..f831e95b6 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -63,3 +63,30 @@ loop: panic(fmt.Sprintf("cannot deref %s", v)) } + +func toInt(val any) (int, error) { + switch v := val.(type) { + case int: + return v, nil + case int8: + return int(v), nil + case int16: + return int(v), nil + case int32: + return int(v), nil + case int64: + return int(v), nil + case uint: + return int(v), nil + case uint8: + return int(v), nil + case uint16: + return int(v), nil + case uint32: + return int(v), nil + case uint64: + return int(v), nil + default: + return 0, fmt.Errorf("cannot use %T as argument (type int)", val) + } +} diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 083fc688e..c3b460aa0 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -4,12 +4,13 @@ import ( "math" "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/test/playground" "github.com/expr-lang/expr/vm" "github.com/expr-lang/expr/vm/runtime" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) type B struct { diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 46bad9322..5ba643587 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -696,6 +696,74 @@ Converts an array of key-value pairs to a map. fromPairs([["name", "John"], ["age", 30]]) == {"name": "John", "age": 30} ``` +## Bitwise Functions + +### bitand(int, int) + +Returns the values resulting from the bitwise AND operation. + +```expr +bitand(10, 12) == 8 +``` + +### bitor(int, int) + +Returns the values resulting from the bitwise OR operation. + +```expr +bitor(10, 12) == 14 +``` + +### bitxor(int, int) + +Returns the values resulting from the bitwise XOR operation. + +```expr +bitxor(10, 12) == 6 +``` + +### bitnand(int, int) + +Returns the values resulting from the bitwise AND NOT operation. + +```expr +bitnand(10, 12) == 2 +``` + +### bitnot(int) + +Returns the values resulting from the bitwise NOT operation. + +```expr +bitnot(10) == -11 +``` + +## Shift Functions + +### bitshl(int, int) + +Returns the values resulting from the Left Shift operation. + +```expr +bitshl(45, 2) == 180 +``` + +### bitshr(int, int) + +Returns the values resulting from the Right Shift operation. + +```expr +bitshr(45, 2) == 11 +``` + +### bitushr(int, int) + +Returns the values resulting from the unsigned Right Shift operation. + +```expr +bitushr(-5, 2) == 4611686018427387902 +``` + ## Miscellaneous Functions ### len(v) diff --git a/expr_test.go b/expr_test.go index 4992ca2c3..9d588f122 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1136,6 +1136,38 @@ func TestExpr(t *testing.T) { `.5 in ArrayOfInt`, false, }, + { + `bitnot(10)`, + -11, + }, + { + `bitxor(15, 32)`, + 47, + }, + { + `bitand(90, 34)`, + 2, + }, + { + `bitnand(35, 9)`, + 34, + }, + { + `bitor(10, 5)`, + 15, + }, + { + `bitshr(7, 2)`, + 1, + }, + { + `bitshl(7, 2)`, + 28, + }, + { + `bitushr(-100, 5)`, + 576460752303423484, + }, } for _, tt := range tests { diff --git a/parser/parser_test.go b/parser/parser_test.go index fbeb24696..ba8e29acc 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -5,10 +5,11 @@ import ( "strings" "testing" - . "github.com/expr-lang/expr/ast" - "github.com/expr-lang/expr/parser" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser" ) func TestParse(t *testing.T) { diff --git a/vm/runtime/generated.go b/vm/runtime/generated.go index 720feb455..a5b92f477 100644 --- a/vm/runtime/generated.go +++ b/vm/runtime/generated.go @@ -3372,4 +3372,4 @@ func Modulo(a, b interface{}) int { } } panic(fmt.Sprintf("invalid operation: %T %% %T", a, b)) -} +} \ No newline at end of file From 6fa487b3aaa970b1f3ed89f36184c7873a5d436d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 25 Dec 2023 18:36:50 +0100 Subject: [PATCH 217/506] Update Language-Definition.md --- docs/Language-Definition.md | 344 ++++++++++++++++++++---------------- 1 file changed, 196 insertions(+), 148 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 5ba643587..ba0dce1df 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -1,152 +1,167 @@ # Language Definition +**Expr** is a simple expression language that can be used to evaluate expressions. + ## Literals - + - + - + - + - + - + - + - +
    CommentComment /* */ or //
    BooleanBoolean true, false
    IntegerInteger - 42, 0x2A + 42, 0x2A, 0o52, 0b101010
    FloatFloat 0.5, .5
    StringString "foo", 'bar'
    ArrayArray [1, 2, 3]
    MapMap {a: 1, b: 2, c: 3}
    NilNil nil
    +### Strings + +Strings can be enclosed in single quotes or double quotes. Strings can contain escape sequences, like `\n` for newline, +`\t` for tab, `\uXXXX` for Unicode code points. + +```expr +"Hello\nWorld" +``` + +For multiline strings, use backticks: + +```expr +`Hello +World` +``` + +Backticks strings are raw strings, they do not support escape sequences. + ## Operators - + - + - + - + - + - + - + - + - + - +
    ArithmeticArithmetic +, -, *, /, % (modulus), ^ or ** (exponent)
    ComparisonComparison ==, !=, <, >, <=, >=
    LogicalLogical not or !, and or &&, or or ||
    ConditionalConditional ?: (ternary), ?? (nil coalescing)
    MembershipMembership [], ., ?., in
    StringString + (concatenation), contains, startsWith, endsWith
    RegexRegex matches
    RangeRange ..
    SliceSlice [:]
    PipePipe |
    -Examples: +### Membership Operator -```expr -user.Age in 18..45 and user.Name not in ["admin", "root"] -``` +Fields of structs and items of maps can be accessed with `.` operator +or `[]` operator. Next two expressions are equivalent: ```expr -foo matches "^[A-Z].*" -``` +user.Name +user["Name"] +``` -```expr -tweets | filter(.Size < 280) | map(.Content) | join(" -- ") -``` +Elements of arrays and slices can be accessed with +`[]` operator. Negative indices are supported with `-1` being +the last element. ```expr -filter(posts, {now() - .CreatedAt >= 7 * duration("24h")}) +array[0] // first element +array[-1] // last element ``` -### Membership Operator - -Fields of structs and items of maps can be accessed with `.` operator -or `[]` operator. Elements of arrays and slices can be accessed with -`[]` operator. Negative indices are supported with `-1` being -the last element. - The `in` operator can be used to check if an item is in an array or a map. ```expr -user.Name in list["available-names"] +"John" in ["John", "Jane"] +"name" in {"name": "John", "age": 30} ``` #### Optional chaining @@ -156,7 +171,13 @@ without checking if the struct or the map is `nil`. If the struct or the map is `nil`, the result of the expression is `nil`. ```expr -author?.User?.Name +author.User?.Name +``` + +Is equivalent to: + +```expr +author.User != nil ? author.User.Name : nil ``` #### Nil coalescing @@ -165,14 +186,20 @@ The `??` operator can be used to return the left-hand side if it is not `nil`, otherwise the right-hand side is returned. ```expr -author?.User?.Name ?? "Anonymous" +author.User?.Name ?? "Anonymous" +``` + +Is equivalent to: + +```expr +author.User != nil ? author.User.Name : "Anonymous" ``` ### Slice Operator The slice operator `[:]` can be used to access a slice of an array. -For example, variable `array` is `[1, 2, 3, 4, 5]`: +For example, variable **array** is `[1, 2, 3, 4, 5]`: ```expr array[1:4] == [2, 3, 4] @@ -187,12 +214,88 @@ array[:] == array The pipe operator `|` can be used to pass the result of the left-hand side expression as the first argument of the right-hand side expression. -For example, expression `split(lower(user.Name), " ")` can be written as: - ```expr user.Name | lower() | split(" ") ``` +Is equivalent to: + +```expr +split(lower(user.Name), " ") +``` + +### Range Operator + +The range operator `..` can be used to create a range of integers. + +```expr +1..3 == [1, 2, 3] +``` + +## Variables + +Variables can be declared with the `let` keyword. The variable name must start with a letter or an underscore. +The variable name can contain letters, digits and underscores. After the variable is declared, it can be used in the +expression. + +```expr +let x = 42; x * 2 +``` + +A few variables can be declared by a few `let` statements separated by a semicolon. + +```expr +let x = 42; +let y = 2; +x * y +``` + +Here is an example of variable with pipe operator: + +```expr +let name = user.Name | lower() | split(" "); +"Hello, " + name[0] + "!" +``` + +### $env + +The `$env` variable is a map of all variables passed to the expression. + +```expr +foo.Name == $env["foo"].Name +$env["var with spaces"] +``` + +Think of `$env` as a global variable that contains all variables. + +The `$env` can be used to check if a variable is defined: + +```expr +'foo' in $env +``` + +## Predicate + +The predicate is an expression. Predicates can be used in functions like `filter`, `all`, `any`, `one`, `none`, etc. +For example, next expression creates a new array from 0 to 9 and then filters it by even numbers: + +```expr +filter(0..9, {# % 2 == 0}) +``` + +If items of the array is a struct or a map, it is possible to access fields with +omitted `#` symbol (`#.Value` becomes `.Value`). + +```expr +filter(tweets, {len(.Content) > 240}) +``` + +Braces `{` `}` can be omitted: + +```expr +filter(tweets, len(.Content) > 240) +``` + ## String Functions ### trim(str[, chars]) @@ -305,20 +408,31 @@ hasSuffix("HelloWorld", "World") == true ## Date Functions -The following operators can be used to manipulate dates: +Expr has a built-in support for Go's [time package](https://pkg.go.dev/time). +It is possible to subtract two dates and get the duration between them: + +```expr +createdAt - now() +``` + +It is possible to add a duration to a date: + +```expr +createdAt + duration("1h") +``` + +And it is possible to compare dates: ```expr -date("2023-08-14") + duration("1h") -date("2023-08-14") - duration("1h") -date("2023-08-14") - date("2023-08-13") == duration("24h") +createdAt > now() - duration("1h") ``` ### now() -Returns the current date and time. +Returns the current date as a [time.Time](https://pkg.go.dev/time#Time) value. ```expr -createdAt > now() - duration(1h) +now().Year() == 2024 ``` ### duration(str) @@ -380,6 +494,10 @@ min(5, 7) == 5 Returns the absolute value of a number. +```expr +abs(-5) == 5 +``` + ### ceil(n) Returns the least integer value greater than or equal to x. @@ -420,6 +538,10 @@ all(tweets, {.Size < 280}) Returns **true** if any elements satisfies the [predicate](#predicate). If the array is empty, returns **false**. +```expr +any(tweets, {.Size > 280}) +``` + ### one(array, predicate) Returns **true** if _exactly one_ element satisfies the [predicate](#predicate). @@ -434,6 +556,10 @@ one(participants, {.Winner}) Returns **true** if _all elements does not_ satisfy the [predicate](#predicate). If the array is empty, returns **true**. +```expr +none(tweets, {.Size > 280}) +``` + ### map(array, predicate) Returns new array by applying the [predicate](#predicate) to each element of @@ -619,7 +745,18 @@ values({"name": "John", "age": 30}) == ["John", 30] ### type(v) Returns the type of the given value `v`. -Returns on of the following types: `nil`, `bool`, `int`, `uint`, `float`, `string`, `array`, `map`. + +Returns on of the following types: + +- `nil` +- `bool` +- `int` +- `uint` +- `float` +- `string` +- `array` +- `map`. + For named types and structs, the type name is returned. ```expr @@ -640,6 +777,10 @@ int("123") == 123 Returns the float value of a number or a string. +```expr +float("123.45") == 123.45 +``` + ### string(v) Converts the given value `v` into a string representation. @@ -696,80 +837,18 @@ Converts an array of key-value pairs to a map. fromPairs([["name", "John"], ["age", 30]]) == {"name": "John", "age": 30} ``` -## Bitwise Functions - -### bitand(int, int) - -Returns the values resulting from the bitwise AND operation. - -```expr -bitand(10, 12) == 8 -``` - -### bitor(int, int) - -Returns the values resulting from the bitwise OR operation. - -```expr -bitor(10, 12) == 14 -``` - -### bitxor(int, int) - -Returns the values resulting from the bitwise XOR operation. - -```expr -bitxor(10, 12) == 6 -``` - -### bitnand(int, int) - -Returns the values resulting from the bitwise AND NOT operation. - -```expr -bitnand(10, 12) == 2 -``` - -### bitnot(int) - -Returns the values resulting from the bitwise NOT operation. - -```expr -bitnot(10) == -11 -``` - -## Shift Functions - -### bitshl(int, int) - -Returns the values resulting from the Left Shift operation. - -```expr -bitshl(45, 2) == 180 -``` - -### bitshr(int, int) - -Returns the values resulting from the Right Shift operation. - -```expr -bitshr(45, 2) == 11 -``` - -### bitushr(int, int) - -Returns the values resulting from the unsigned Right Shift operation. - -```expr -bitushr(-5, 2) == 4611686018427387902 -``` - ## Miscellaneous Functions ### len(v) Returns the length of an array, a map or a string. +```expr +len([1, 2, 3]) == 3 +len({"name": "John", "age": 30}) == 2 +len("Hello") == 5 +``` + ### get(v, index) Retrieves the element at the specified index from an array or map `v`. If the index is out of range, returns `nil`. @@ -779,34 +858,3 @@ Or the key does not exist, returns `nil`. get([1, 2, 3], 1) == 2 get({"name": "John", "age": 30}, "name") == "John" ``` - -## Predicate - -The predicate is an expression. It takes one or more arguments and returns a boolean value. -To access the arguments, the `#` symbol is used. - -```expr -map(0..9, {# / 2}) -``` - -If items of the array is a struct or a map, it is possible to access fields with -omitted `#` symbol (`#.Value` becomes `.Value`). - -```expr -filter(tweets, {len(.Value) > 280}) -``` - -Braces `{` `}` can be omitted: - -```expr -filter(tweets, len(.Value) > 280) -``` - -## `$env` variable - -The `$env` variable is a map of all variables passed to the expression. - -```expr -foo.Name == $env["foo"].Name -$env["var with spaces"] -``` From 5eec5b82c1cb7fa8d49f3c36894a891c86475ae9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 25 Dec 2023 18:55:37 +0100 Subject: [PATCH 218/506] Add bitwise --- docs/Language-Definition.md | 66 +++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index ba0dce1df..eae8c1782 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -858,3 +858,69 @@ Or the key does not exist, returns `nil`. get([1, 2, 3], 1) == 2 get({"name": "John", "age": 30}, "name") == "John" ``` + +## Bitwise Functions + +### bitand(int, int) + +Returns the values resulting from the bitwise AND operation. + +```expr +bitand(10, 12) == 8 +``` + +### bitor(int, int) + +Returns the values resulting from the bitwise OR operation. + +```expr +bitor(10, 12) == 14 +``` + +### bitxor(int, int) + +Returns the values resulting from the bitwise XOR operation. + +```expr +bitxor(10, 12) == 6 +``` + +### bitnand(int, int) + +Returns the values resulting from the bitwise AND NOT operation. + +```expr +bitnand(10, 12) == 2 +``` + +### bitnot(int) + +Returns the values resulting from the bitwise NOT operation. + +```expr +bitnot(10) == -11 +``` + +### bitshl(int, int) + +Returns the values resulting from the Left Shift operation. + +```expr +bitshl(45, 2) == 180 +``` + +### bitshr(int, int) + +Returns the values resulting from the Right Shift operation. + +```expr +bitshr(45, 2) == 11 +``` + +### bitushr(int, int) + +Returns the values resulting from the unsigned Right Shift operation. + +```expr +bitushr(-5, 2) == 4611686018427387902 +``` From 48df1fd3f5ae570cc0eb1853d8587026dd6bcb0f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 25 Dec 2023 18:56:06 +0100 Subject: [PATCH 219/506] Rename language-definition.md --- docs/{Language-Definition.md => language-definition.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{Language-Definition.md => language-definition.md} (100%) diff --git a/docs/Language-Definition.md b/docs/language-definition.md similarity index 100% rename from docs/Language-Definition.md rename to docs/language-definition.md From 686742c4034f7ae9ea6c058df05c28dfb0e163ca Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 09:09:19 +0100 Subject: [PATCH 220/506] Update bit* examples to use 0bxxxx integers --- docs/language-definition.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/language-definition.md b/docs/language-definition.md index eae8c1782..d205edc6e 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -866,7 +866,7 @@ get({"name": "John", "age": 30}, "name") == "John" Returns the values resulting from the bitwise AND operation. ```expr -bitand(10, 12) == 8 +bitand(0b1010, 0b1100) == 0b1000 ``` ### bitor(int, int) @@ -874,7 +874,7 @@ bitand(10, 12) == 8 Returns the values resulting from the bitwise OR operation. ```expr -bitor(10, 12) == 14 +bitor(0b1010, 0b1100) == 0b1110 ``` ### bitxor(int, int) @@ -882,7 +882,7 @@ bitor(10, 12) == 14 Returns the values resulting from the bitwise XOR operation. ```expr -bitxor(10, 12) == 6 +bitxor(0b1010, 0b1100) == 0b110 ``` ### bitnand(int, int) @@ -890,7 +890,7 @@ bitxor(10, 12) == 6 Returns the values resulting from the bitwise AND NOT operation. ```expr -bitnand(10, 12) == 2 +bitnand(0b1010, 0b1100) == 0b10 ``` ### bitnot(int) @@ -898,7 +898,7 @@ bitnand(10, 12) == 2 Returns the values resulting from the bitwise NOT operation. ```expr -bitnot(10) == -11 +bitnot(0b1010) == -0b1011 ``` ### bitshl(int, int) @@ -906,7 +906,7 @@ bitnot(10) == -11 Returns the values resulting from the Left Shift operation. ```expr -bitshl(45, 2) == 180 +bitshl(0b101101, 2) == 0b10110100 ``` ### bitshr(int, int) @@ -914,7 +914,7 @@ bitshl(45, 2) == 180 Returns the values resulting from the Right Shift operation. ```expr -bitshr(45, 2) == 11 +bitshr(0b101101, 2) == 0b1011 ``` ### bitushr(int, int) @@ -922,5 +922,5 @@ bitshr(45, 2) == 11 Returns the values resulting from the unsigned Right Shift operation. ```expr -bitushr(-5, 2) == 4611686018427387902 +bitushr(-0b101, 2) == 4611686018427387902 ``` From c46996e54d93d1bd075899d52c141a648b99d0c4 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 09:13:43 +0100 Subject: [PATCH 221/506] Update docs --- docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 5693ce7f0..a427515e9 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -149,7 +149,7 @@ This options defines an [operator overloading](operator-overloading). ## Optimize() -This option enables [optimizations](Internals.md). By default, Expr will optimize the expression. +This option enables [optimizations](internals.md). By default, Expr will optimize the expression. ## Patch() From 8774c44ef60676534d6865068dd7d29092af336f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 09:15:10 +0100 Subject: [PATCH 222/506] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f68b786cd..b393d9380 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![GoDoc](https://godoc.org/github.com/expr-lang/expr?status.svg)](https://godoc.org/github.com/expr-lang/expr) **Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. -**Expr** combines simple [syntax](https://expr-lang.org/docs/Language-Definition) with powerful features for ease of use: +**Expr** combines simple [syntax](https://expr-lang.org/docs/language-definition) with powerful features for ease of use: ```js // Allow only admins and moderators to moderate comments. @@ -67,7 +67,7 @@ go get github.com/expr-lang/expr ## Documentation * See [Getting Started](https://expr-lang.org/docs/Getting-Started) page for developer documentation. -* See [Language Definition](https://expr-lang.org/docs/Language-Definition) page to learn the syntax. +* See [Language Definition](https://expr-lang.org/docs/language-definition) page to learn the syntax. ## Examples From 500553e0dfefa516d25ae9a36cbfbe324a928f29 Mon Sep 17 00:00:00 2001 From: Ryan Bullock Date: Tue, 26 Dec 2023 07:01:55 -0800 Subject: [PATCH 223/506] Patcher and interfaces for custom types to be used in expressions as standard go types (#487) * A bultin patcher providing interfaces for custom types that can be represented as standard go types for expressions. * Move node creation inside of loop. * Reorder imports. Fix some formatting. * Rename expr function from 'getExprValue' to '$patcher_value_getter'. * Move to expr-lang * Rename Patcher to ValueGetter * Remove use of Expr in naming * Rename interface functions to use 'AsType()' convention * Document motivation and an example use case * Add example usage to AsAny() * Move under patcher directory * Fix reference to old import path --- patcher/value/bench_test.go | 73 +++++++++ patcher/value/value.go | 227 ++++++++++++++++++++++++++++ patcher/value/value_example_test.go | 42 +++++ patcher/value/value_test.go | 172 +++++++++++++++++++++ 4 files changed, 514 insertions(+) create mode 100644 patcher/value/bench_test.go create mode 100644 patcher/value/value.go create mode 100644 patcher/value/value_example_test.go create mode 100644 patcher/value/value_test.go diff --git a/patcher/value/bench_test.go b/patcher/value/bench_test.go new file mode 100644 index 000000000..d6a1aae89 --- /dev/null +++ b/patcher/value/bench_test.go @@ -0,0 +1,73 @@ +package value + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/vm" +) + +func Benchmark_valueAdd(b *testing.B) { + env := make(map[string]any) + env["ValueOne"] = &customInt{1} + env["ValueTwo"] = &customInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(b, err) + + var out any + v := vm.VM{} + + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = v.Run(program, env) + } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 3, out.(int)) +} + +func Benchmark_valueUntypedAdd(b *testing.B) { + env := make(map[string]any) + env["ValueOne"] = &customUntypedInt{1} + env["ValueTwo"] = &customUntypedInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(b, err) + + var out any + v := vm.VM{} + + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = v.Run(program, env) + } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 3, out.(int)) +} + +func Benchmark_valueTypedAdd(b *testing.B) { + env := make(map[string]any) + env["ValueOne"] = &customTypedInt{1} + env["ValueTwo"] = &customTypedInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(b, err) + + var out any + v := vm.VM{} + + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = v.Run(program, env) + } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 3, out.(int)) +} diff --git a/patcher/value/value.go b/patcher/value/value.go new file mode 100644 index 000000000..b7e4a767c --- /dev/null +++ b/patcher/value/value.go @@ -0,0 +1,227 @@ +// Package value provides a Patcher that uses interfaces to allow custom types that can be represented as standard go values to be used more easily in expressions. +package value + +import ( + "reflect" + "time" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/conf" +) + +// ValueGetter is a Patcher that allows custom types to be represented as standard go values for use with expr. +// It also adds the `$patcher_value_getter` function to the program for efficiently calling matching interfaces. +// +// The purpose of this Patcher is to make it seemless to use custom types in expressions without the need to +// first convert them to standard go values. It may also facilitate using already existing structs or maps as +// environments when they contain compatabile types. +// +// An example usage may be modeling a database record with columns that have varying data types and constraints. +// In such an example you may have custom types that, beyond storing a simple value, such as an integer, may +// contain metadata such as column type and if a value is specifically a NULL value. +// +// Use it directly as an Option to expr.Compile() +var ValueGetter = func() expr.Option { + vPatcher := patcher{} + return func(c *conf.Config) { + c.Visitors = append(c.Visitors, vPatcher) + vPatcher.ApplyOptions(c) + } +}() + +// A AnyValuer provides a generic function for a custom type to return standard go values. +// It allows for returning a `nil` value but does not provide any type checking at expression compile. +// +// A custom type may implement both AnyValuer and a type specific interface to enable both +// compile time checking and the ability to return a `nil` value. +type AnyValuer interface { + AsAny() any +} + +type IntValuer interface { + AsInt() int +} + +type BoolValuer interface { + AsBool() bool +} + +type Int8Valuer interface { + AsInt8() int8 +} + +type Int16Valuer interface { + AsInt16() int16 +} + +type Int32Valuer interface { + AsInt32() int32 +} + +type Int64Valuer interface { + AsInt64() int64 +} + +type UintValuer interface { + AsUint() uint +} + +type Uint8Valuer interface { + AsUint8() uint8 +} + +type Uint16Valuer interface { + AsUint16() uint16 +} + +type Uint32Valuer interface { + AsUint32() uint32 +} + +type Uint64Valuer interface { + AsUint64() uint64 +} + +type Float32Valuer interface { + AsFloat32() float32 +} + +type Float64Valuer interface { + AsFloat64() float64 +} + +type StringValuer interface { + AsString() string +} + +type TimeValuer interface { + AsTime() time.Time +} + +type DurationValuer interface { + AsDuration() time.Duration +} + +type ArrayValuer interface { + AsArray() []any +} + +type MapValuer interface { + AsMap() map[string]any +} + +var supportedInterfaces = []reflect.Type{ + reflect.TypeOf((*AnyValuer)(nil)).Elem(), + reflect.TypeOf((*BoolValuer)(nil)).Elem(), + reflect.TypeOf((*IntValuer)(nil)).Elem(), + reflect.TypeOf((*Int8Valuer)(nil)).Elem(), + reflect.TypeOf((*Int16Valuer)(nil)).Elem(), + reflect.TypeOf((*Int32Valuer)(nil)).Elem(), + reflect.TypeOf((*Int64Valuer)(nil)).Elem(), + reflect.TypeOf((*UintValuer)(nil)).Elem(), + reflect.TypeOf((*Uint8Valuer)(nil)).Elem(), + reflect.TypeOf((*Uint16Valuer)(nil)).Elem(), + reflect.TypeOf((*Uint32Valuer)(nil)).Elem(), + reflect.TypeOf((*Uint64Valuer)(nil)).Elem(), + reflect.TypeOf((*Float32Valuer)(nil)).Elem(), + reflect.TypeOf((*Float64Valuer)(nil)).Elem(), + reflect.TypeOf((*StringValuer)(nil)).Elem(), + reflect.TypeOf((*TimeValuer)(nil)).Elem(), + reflect.TypeOf((*DurationValuer)(nil)).Elem(), + reflect.TypeOf((*ArrayValuer)(nil)).Elem(), + reflect.TypeOf((*MapValuer)(nil)).Elem(), +} + +type patcher struct{} + +func (patcher) Visit(node *ast.Node) { + id, ok := (*node).(*ast.IdentifierNode) + if !ok { + return + } + + nodeType := id.Type() + + for _, t := range supportedInterfaces { + if nodeType.Implements(t) { + callnode := &ast.CallNode{ + Callee: &ast.IdentifierNode{Value: "$patcher_value_getter"}, + Arguments: []ast.Node{id}, + } + + ast.Patch(node, callnode) + } + } +} + +func (patcher) ApplyOptions(c *conf.Config) { + getValueFunc(c) +} + +func getValue(params ...any) (any, error) { + switch v := params[0].(type) { + case AnyValuer: + return v.AsAny(), nil + case BoolValuer: + return v.AsBool(), nil + case IntValuer: + return v.AsInt(), nil + case Int8Valuer: + return v.AsInt8(), nil + case Int16Valuer: + return v.AsInt16(), nil + case Int32Valuer: + return v.AsInt32(), nil + case Int64Valuer: + return v.AsInt64(), nil + case UintValuer: + return v.AsUint(), nil + case Uint8Valuer: + return v.AsUint8(), nil + case Uint16Valuer: + return v.AsUint16(), nil + case Uint32Valuer: + return v.AsUint32(), nil + case Uint64Valuer: + return v.AsUint64(), nil + case Float32Valuer: + return v.AsFloat32(), nil + case Float64Valuer: + return v.AsFloat64(), nil + case StringValuer: + return v.AsString(), nil + case TimeValuer: + return v.AsTime(), nil + case DurationValuer: + return v.AsDuration(), nil + case ArrayValuer: + return v.AsArray(), nil + case MapValuer: + return v.AsMap(), nil + } + + return params[0], nil +} + +var getValueFunc = expr.Function("$patcher_value_getter", getValue, + new(func(BoolValuer) bool), + new(func(IntValuer) int), + new(func(Int8Valuer) int8), + new(func(Int16Valuer) int16), + new(func(Int32Valuer) int32), + new(func(Int64Valuer) int64), + new(func(UintValuer) uint), + new(func(Uint8Valuer) uint8), + new(func(Uint16Valuer) uint16), + new(func(Uint32Valuer) uint32), + new(func(Uint64Valuer) uint64), + new(func(Float32Valuer) float32), + new(func(Float64Valuer) float64), + new(func(StringValuer) string), + new(func(TimeValuer) time.Time), + new(func(DurationValuer) time.Duration), + new(func(ArrayValuer) []any), + new(func(MapValuer) map[string]any), + new(func(any) any), +) diff --git a/patcher/value/value_example_test.go b/patcher/value/value_example_test.go new file mode 100644 index 000000000..2da1739b7 --- /dev/null +++ b/patcher/value/value_example_test.go @@ -0,0 +1,42 @@ +package value_test + +import ( + "fmt" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/patcher/value" + "github.com/expr-lang/expr/vm" +) + +type myInt struct { + Int int +} + +func (v *myInt) AsInt() int { + return v.Int +} + +func (v *myInt) AsAny() any { + return v.Int +} + +func ExampleAnyValuer() { + env := make(map[string]any) + env["ValueOne"] = &myInt{1} + env["ValueTwo"] = &myInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), value.ValueGetter) + + if err != nil { + panic(err) + } + + out, err := vm.Run(program, env) + + if err != nil { + panic(err) + } + + fmt.Println(out) + // Output: 3 +} diff --git a/patcher/value/value_test.go b/patcher/value/value_test.go new file mode 100644 index 000000000..1b6c5527a --- /dev/null +++ b/patcher/value/value_test.go @@ -0,0 +1,172 @@ +package value + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/vm" +) + +type customInt struct { + Int int +} + +func (v *customInt) AsInt() int { + return v.Int +} + +func (v *customInt) AsAny() any { + return v.Int +} + +type customTypedInt struct { + Int int +} + +func (v *customTypedInt) AsInt() int { + return v.Int +} + +type customUntypedInt struct { + Int int +} + +func (v *customUntypedInt) AsAny() any { + return v.Int +} + +type customString struct { + String string +} + +func (v *customString) AsString() string { + return v.String +} + +func (v *customString) AsAny() any { + return v.String +} + +type customTypedString struct { + String string +} + +func (v *customTypedString) AsString() string { + return v.String +} + +type customUntypedString struct { + String string +} + +func (v *customUntypedString) AsAny() any { + return v.String +} + +type customTypedArray struct { + Array []any +} + +func (v *customTypedArray) AsArray() []any { + return v.Array +} + +type customTypedMap struct { + Map map[string]any +} + +func (v *customTypedMap) AsMap() map[string]any { + return v.Map +} + +func Test_valueAddInt(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customInt{1} + env["ValueTwo"] = &customInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(t, err) + + out, err := vm.Run(program, env) + + require.NoError(t, err) + require.Equal(t, 3, out.(int)) +} + +func Test_valueUntypedAddInt(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customUntypedInt{1} + env["ValueTwo"] = &customUntypedInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(t, err) + + out, err := vm.Run(program, env) + + require.NoError(t, err) + require.Equal(t, 3, out.(int)) +} + +func Test_valueTypedAddInt(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customTypedInt{1} + env["ValueTwo"] = &customTypedInt{2} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(t, err) + + out, err := vm.Run(program, env) + + require.NoError(t, err) + require.Equal(t, 3, out.(int)) +} + +func Test_valueTypedAddMismatch(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customTypedInt{1} + env["ValueTwo"] = &customTypedString{"test"} + + _, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.Error(t, err) +} + +func Test_valueUntypedAddMismatch(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customUntypedInt{1} + env["ValueTwo"] = &customUntypedString{"test"} + + program, err := expr.Compile("ValueOne + ValueTwo", expr.Env(env), ValueGetter) + require.NoError(t, err) + + _, err = vm.Run(program, env) + + require.Error(t, err) +} + +func Test_valueTypedArray(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customTypedArray{[]any{1, 2}} + + program, err := expr.Compile("ValueOne[0] + ValueOne[1]", expr.Env(env), ValueGetter) + require.NoError(t, err) + + out, err := vm.Run(program, env) + + require.NoError(t, err) + require.Equal(t, 3, out.(int)) +} + +func Test_valueTypedMap(t *testing.T) { + env := make(map[string]any) + env["ValueOne"] = &customTypedMap{map[string]any{"one": 1, "two": 2}} + + program, err := expr.Compile("ValueOne.one + ValueOne.two", expr.Env(env), ValueGetter) + require.NoError(t, err) + + out, err := vm.Run(program, env) + + require.NoError(t, err) + require.Equal(t, 3, out.(int)) +} From e14c7e5cf90d6d68a3c7cc11497b0f6e5894f420 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 16:06:16 +0100 Subject: [PATCH 224/506] Remove redundant func --- patcher/value/value.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/patcher/value/value.go b/patcher/value/value.go index b7e4a767c..5af784844 100644 --- a/patcher/value/value.go +++ b/patcher/value/value.go @@ -26,7 +26,7 @@ var ValueGetter = func() expr.Option { vPatcher := patcher{} return func(c *conf.Config) { c.Visitors = append(c.Visitors, vPatcher) - vPatcher.ApplyOptions(c) + getValueFunc(c) } }() @@ -155,10 +155,6 @@ func (patcher) Visit(node *ast.Node) { } } -func (patcher) ApplyOptions(c *conf.Config) { - getValueFunc(c) -} - func getValue(params ...any) (any, error) { switch v := params[0].(type) { case AnyValuer: From c87f8f2d86297bc56290a40eaa421dd0b6a00b23 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 16:24:00 +0100 Subject: [PATCH 225/506] Add change ident patcher test --- test/patch/change_ident_test.go | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 test/patch/change_ident_test.go diff --git a/test/patch/change_ident_test.go b/test/patch/change_ident_test.go new file mode 100644 index 000000000..4d23b134a --- /dev/null +++ b/test/patch/change_ident_test.go @@ -0,0 +1,61 @@ +package patch_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/vm" + "github.com/expr-lang/expr/vm/runtime" +) + +func TestPatch_change_ident(t *testing.T) { + program, err := expr.Compile( + `foo`, + expr.Env(Env{}), + expr.Patch(changeIdent{}), + ) + require.NoError(t, err) + + expected := &vm.Program{ + Bytecode: []vm.Opcode{ + vm.OpLoadField, + }, + Arguments: []int{ + 0, + }, + Constants: []any{ + &runtime.Field{ + Path: []string{"bar"}, + Index: []int{1}, + }, + }, + } + + require.Equal(t, expected.Disassemble(), program.Disassemble()) +} + +type Env struct { + Foo int `expr:"foo"` + Bar int `expr:"bar"` +} + +type changeIdent struct{} + +func (changeIdent) Visit(node *ast.Node) { + id, ok := (*node).(*ast.IdentifierNode) + if !ok { + return + } + if id.Value == "foo" { + // A correct way to patch the node: + // + // newNode := &ast.IdentifierNode{Value: "bar"} + // ast.Patch(node, newNode) + // + // But we can do it in a wrong way: + id.Value = "bar" + } +} From 280d28dc9f60ab18b81d0631124593c0d744751b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 23:11:40 +0100 Subject: [PATCH 226/506] Use errors.As --- expr.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/expr.go b/expr.go index 90f1273a1..07ef4b7b3 100644 --- a/expr.go +++ b/expr.go @@ -1,6 +1,7 @@ package expr import ( + "errors" "fmt" "reflect" @@ -199,7 +200,8 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { if config.Optimize { err = optimizer.Optimize(&tree.Node, config) if err != nil { - if fileError, ok := err.(*file.Error); ok { + var fileError *file.Error + if errors.As(err, &fileError) { return nil, fileError.Bind(tree.Source) } return nil, err From d3b30e2739c32c7f77e51f57e7ba99d0352926e8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 23:11:55 +0100 Subject: [PATCH 227/506] Sort imports --- bench_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bench_test.go b/bench_test.go index 6eb450812..601be77a2 100644 --- a/bench_test.go +++ b/bench_test.go @@ -3,9 +3,10 @@ package expr_test import ( "testing" + "github.com/stretchr/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/vm" - "github.com/stretchr/testify/require" ) func Benchmark_expr(b *testing.B) { From caa7d52602ad36838fd7f77ee2116e71afd0c4a3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 26 Dec 2023 23:14:20 +0100 Subject: [PATCH 228/506] Simplify ast nodes (#503) * Move FiendIndex and MethodIndex out of ast nodes * Remove println statement * Add method compiler tests --- ast/node.go | 39 ++--------- checker/checker.go | 16 +---- checker/info.go | 50 ++++++++++++++ compiler/compiler.go | 62 ++++++++++------- compiler/compiler_test.go | 68 ++++++++++++++++--- .../interface_method/interface_method_test.go | 4 +- test/operator/operator_test.go | 3 +- 7 files changed, 155 insertions(+), 87 deletions(-) create mode 100644 checker/info.go diff --git a/ast/node.go b/ast/node.go index f9d27fc6a..f70c49cc7 100644 --- a/ast/node.go +++ b/ast/node.go @@ -58,21 +58,7 @@ type NilNode struct { // IdentifierNode represents an identifier. type IdentifierNode struct { base - Value string // Name of the identifier. Like "foo" in "foo.bar". - FieldIndex []int // Internal. Index of the field in the list of fields. - Method bool // Internal. If true then the identifier is a method call. - MethodIndex int // Internal. Index of the method in the list of methods. -} - -// SetFieldIndex sets the field index of the identifier. -func (n *IdentifierNode) SetFieldIndex(field []int) { - n.FieldIndex = field -} - -// SetMethodIndex sets the method index of the identifier. -func (n *IdentifierNode) SetMethodIndex(methodIndex int) { - n.Method = true - n.MethodIndex = methodIndex + Value string // Name of the identifier. Like "foo" in "foo.bar". } // IntegerNode represents an integer. @@ -146,26 +132,9 @@ type ChainNode struct { // array[0] type MemberNode struct { base - Node Node // Node of the member access. Like "foo" in "foo.bar". - Property Node // Property of the member access. For property access it is a StringNode. - Optional bool // If true then the member access is optional. Like "foo?.bar". - Name string // Internal. Name of the filed or method. Used for error reporting. - FieldIndex []int // Internal. Index sequence of fields. Generated by type checker. - - // TODO: Combine Method and MethodIndex into a single MethodIndex field of &int type. - Method bool // Internal. If true then the member access is a method call. - MethodIndex int // Internal. Index of the method in the list of methods. Generated by type checker. -} - -// SetFieldIndex sets the field index of the member access. -func (n *MemberNode) SetFieldIndex(field []int) { - n.FieldIndex = field -} - -// SetMethodIndex sets the method index of the member access. -func (n *MemberNode) SetMethodIndex(methodIndex int) { - n.Method = true - n.MethodIndex = methodIndex + Node Node // Node of the member access. Like "foo" in "foo.bar". + Property Node // Property of the member access. For property access it is a StringNode. + Optional bool // If true then the member access is optional. Like "foo?.bar". } // SliceNode represents access to a slice of an array. diff --git a/checker/checker.go b/checker/checker.go index c214acf3b..38490bacf 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -166,23 +166,13 @@ func (v *checker) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) return v.env(node, node.Value, true) } -type NodeWithIndexes interface { - ast.Node - SetFieldIndex(field []int) - SetMethodIndex(methodIndex int) -} - // env method returns type of environment variable. env only lookups for // environment variables, no builtins, no custom functions. -func (v *checker) env(node NodeWithIndexes, name string, strict bool) (reflect.Type, info) { +func (v *checker) env(node ast.Node, name string, strict bool) (reflect.Type, info) { if t, ok := v.config.Types[name]; ok { if t.Ambiguous { return v.error(node, "ambiguous identifier %v", name) } - node.SetFieldIndex(t.FieldIndex) - if t.Method { - node.SetMethodIndex(t.MethodIndex) - } return t.Type, info{method: t.Method} } if v.config.Strict && strict { @@ -477,8 +467,6 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { // the same interface. return m.Type, info{} } else { - node.SetMethodIndex(m.Index) - node.Name = name.Value return m.Type, info{method: true} } } @@ -508,8 +496,6 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { if name, ok := node.Property.(*ast.StringNode); ok { propertyName := name.Value if field, ok := fetchField(base, propertyName); ok { - node.FieldIndex = field.Index - node.Name = propertyName return field.Type, info{} } if len(v.parents) > 1 { diff --git a/checker/info.go b/checker/info.go new file mode 100644 index 000000000..3245253a3 --- /dev/null +++ b/checker/info.go @@ -0,0 +1,50 @@ +package checker + +import ( + "reflect" + + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/conf" +) + +func FieldIndex(types conf.TypesTable, node ast.Node) (bool, []int, string) { + switch n := node.(type) { + case *ast.IdentifierNode: + if t, ok := types[n.Value]; ok && len(t.FieldIndex) > 0 { + return true, t.FieldIndex, n.Value + } + case *ast.MemberNode: + base := n.Node.Type() + if kind(base) == reflect.Ptr { + base = base.Elem() + } + if kind(base) == reflect.Struct { + if prop, ok := n.Property.(*ast.StringNode); ok { + name := prop.Value + if field, ok := fetchField(base, name); ok { + return true, field.Index, name + } + } + } + } + return false, nil, "" +} + +func MethodIndex(types conf.TypesTable, node ast.Node) (bool, int, string) { + switch n := node.(type) { + case *ast.IdentifierNode: + if t, ok := types[n.Value]; ok { + return t.Method, t.MethodIndex, n.Value + } + case *ast.MemberNode: + if name, ok := n.Property.(*ast.StringNode); ok { + base := n.Node.Type() + if base != nil && base.Kind() != reflect.Interface { + if m, ok := base.MethodByName(name.Value); ok { + return true, m.Index, name.Value + } + } + } + } + return false, 0, "" +} diff --git a/compiler/compiler.go b/compiler/compiler.go index 4831a3103..2b03e5afa 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -6,6 +6,7 @@ import ( "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/builtin" + "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/conf" "github.com/expr-lang/expr/file" "github.com/expr-lang/expr/parser" @@ -34,6 +35,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro if config != nil { c.mapEnv = config.MapEnv c.cast = config.Expect + c.types = config.Types } c.compile(tree.Node) @@ -75,6 +77,7 @@ type compiler struct { nodes []ast.Node chains [][]int arguments []int + types conf.TypesTable } type scope struct { @@ -254,15 +257,15 @@ func (c *compiler) IdentifierNode(node *ast.IdentifierNode) { } if c.mapEnv { c.emit(OpLoadFast, c.addConstant(node.Value)) - } else if len(node.FieldIndex) > 0 { + } else if ok, index, name := checker.FieldIndex(c.types, node); ok { c.emit(OpLoadField, c.addConstant(&runtime.Field{ - Index: node.FieldIndex, - Path: []string{node.Value}, + Index: index, + Path: []string{name}, })) - } else if node.Method { + } else if ok, index, name := checker.MethodIndex(c.types, node); ok { c.emit(OpLoadMethod, c.addConstant(&runtime.Method{ - Name: node.Value, - Index: node.MethodIndex, + Name: name, + Index: index, })) } else { c.emit(OpLoadConst, c.addConstant(node.Value)) @@ -559,36 +562,43 @@ func (c *compiler) ChainNode(node *ast.ChainNode) { } func (c *compiler) MemberNode(node *ast.MemberNode) { - if node.Method { + if ok, index, name := checker.MethodIndex(c.types, node); ok { c.compile(node.Node) c.emit(OpMethod, c.addConstant(&runtime.Method{ - Name: node.Name, - Index: node.MethodIndex, + Name: name, + Index: index, })) return } op := OpFetch - index := node.FieldIndex - path := []string{node.Name} base := node.Node - if len(node.FieldIndex) > 0 { + + ok, index, nodeName := checker.FieldIndex(c.types, node) + path := []string{nodeName} + + if ok { op = OpFetchField for !node.Optional { - ident, ok := base.(*ast.IdentifierNode) - if ok && len(ident.FieldIndex) > 0 { - index = append(ident.FieldIndex, index...) - path = append([]string{ident.Value}, path...) - c.emitLocation(ident.Location(), OpLoadField, c.addConstant( - &runtime.Field{Index: index, Path: path}, - )) - return + if ident, isIdent := base.(*ast.IdentifierNode); isIdent { + if ok, identIndex, name := checker.FieldIndex(c.types, ident); ok { + index = append(identIndex, index...) + path = append([]string{name}, path...) + c.emitLocation(ident.Location(), OpLoadField, c.addConstant( + &runtime.Field{Index: index, Path: path}, + )) + return + } } - member, ok := base.(*ast.MemberNode) - if ok && len(member.FieldIndex) > 0 { - index = append(member.FieldIndex, index...) - path = append([]string{member.Name}, path...) - node = member - base = member.Node + + if member, isMember := base.(*ast.MemberNode); isMember { + if ok, memberIndex, name := checker.FieldIndex(c.types, member); ok { + index = append(memberIndex, index...) + path = append([]string{name}, path...) + node = member + base = member.Node + } else { + break + } } else { break } diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index c3b460aa0..8068f5e69 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -24,6 +24,10 @@ type B struct { } } +func (B) FuncInB() int { + return 0 +} + type Env struct { A struct { _ byte @@ -33,12 +37,20 @@ type Env struct { } } +// AFunc is a method what goes before Func in the alphabet. +func (e Env) AFunc() int { + return 0 +} + +func (e Env) Func() B { + return B{} +} + func TestCompile(t *testing.T) { - type test struct { - input string - program vm.Program - } - var tests = []test{ + var tests = []struct { + code string + want vm.Program + }{ { `65535`, vm.Program{ @@ -271,13 +283,53 @@ func TestCompile(t *testing.T) { Arguments: []int{0, 0, 1, 0}, }, }, + { + `Func()`, + vm.Program{ + Constants: []any{ + &runtime.Method{ + Index: 1, + Name: "Func", + }, + }, + Bytecode: []vm.Opcode{ + vm.OpLoadMethod, + vm.OpCall, + }, + Arguments: []int{0, 0}, + }, + }, + { + `Func().FuncInB()`, + vm.Program{ + Constants: []any{ + &runtime.Method{ + Index: 1, + Name: "Func", + }, + &runtime.Method{ + Index: 0, + Name: "FuncInB", + }, + }, + Bytecode: []vm.Opcode{ + vm.OpLoadMethod, + vm.OpCall, + vm.OpMethod, + vm.OpCallTyped, + }, + Arguments: []int{0, 0, 1, 10}, + }, + }, } for _, test := range tests { - program, err := expr.Compile(test.input, expr.Env(Env{}), expr.Optimize(false)) - require.NoError(t, err, test.input) + t.Run(test.code, func(t *testing.T) { + program, err := expr.Compile(test.code, expr.Env(Env{}), expr.Optimize(false)) + require.NoError(t, err) - assert.Equal(t, test.program.Disassemble(), program.Disassemble(), test.input) + assert.Equal(t, test.want.Disassemble(), program.Disassemble()) + }) } } diff --git a/test/interface_method/interface_method_test.go b/test/interface_method/interface_method_test.go index 23d9862d6..51057f7a8 100644 --- a/test/interface_method/interface_method_test.go +++ b/test/interface_method/interface_method_test.go @@ -3,9 +3,10 @@ package interface_method_test import ( "testing" - "github.com/expr-lang/expr" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" ) type Bar interface { @@ -39,7 +40,6 @@ func TestInterfaceMethod(t *testing.T) { "var": FooImpl{}, } p, err := expr.Compile(`var.Foo().Bar()`, expr.Env(env)) - assert.NoError(t, err) out, err := expr.Run(p, env) diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index fc5c3b525..af50a24eb 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -4,9 +4,10 @@ import ( "testing" "time" + "github.com/stretchr/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/test/mock" - "github.com/stretchr/testify/require" ) func TestOperator_struct(t *testing.T) { From 95ec882069b2e6a7b427b6731f0207758ce0f089 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 28 Dec 2023 16:17:10 +0100 Subject: [PATCH 229/506] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b393d9380..bd34c7d24 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ func main() { * [Chaos Mesh](https://chaos-mesh.org) incorporates Expr into Chaos Mesh, a cloud-native Chaos Engineering platform. * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. +* [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling. [Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) From f6a3d06cde04472b1d3eb6004290662ba4bda2ea Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 29 Dec 2023 19:50:08 +0100 Subject: [PATCH 230/506] Remove redundant fields from CallNode and BinaryNode (#504) --- ast/node.go | 19 ++++----- checker/checker.go | 74 ++++------------------------------- checker/checker_test.go | 54 ++++---------------------- checker/info.go | 78 +++++++++++++++++++++++++++++++++++++ checker/info_test.go | 27 +++++++++++++ compiler/compiler.go | 81 ++++++++++++++++++++++++--------------- compiler/compiler_test.go | 37 ++++++++++++++++++ parser/parser_test.go | 2 - vm/vm_test.go | 26 ------------- 9 files changed, 214 insertions(+), 184 deletions(-) create mode 100644 checker/info_test.go diff --git a/ast/node.go b/ast/node.go index f70c49cc7..68c9e7bef 100644 --- a/ast/node.go +++ b/ast/node.go @@ -2,7 +2,6 @@ package ast import ( "reflect" - "regexp" "github.com/expr-lang/expr/file" ) @@ -104,10 +103,9 @@ type UnaryNode struct { // BinaryNode represents a binary operator. type BinaryNode struct { base - Operator string // Operator of the binary operator. Like "+" in "foo + bar" or "matches" in "foo matches bar". - Left Node // Left node of the binary operator. - Right Node // Right node of the binary operator. - Regexp *regexp.Regexp // Internal. Regexp of the "matches" operator. Like "f.+". + Operator string // Operator of the binary operator. Like "+" in "foo + bar" or "matches" in "foo matches bar". + Left Node // Left node of the binary operator. + Right Node // Right node of the binary operator. } // ChainNode represents an optional chaining group. @@ -151,11 +149,8 @@ type SliceNode struct { // CallNode represents a function or a method call. type CallNode struct { base - Callee Node // Node of the call. Like "foo" in "foo()". - Arguments []Node // Arguments of the call. - Typed int // Internal. Used to indicate compiler what type is one of vm.FuncTypes. - Fast bool // Internal. Used to indicate compiler what this call is a fast call. - Func *Function // Internal. Used to pass function information from type checker to compiler. + Callee Node // Node of the call. Like "foo" in "foo()". + Arguments []Node // Arguments of the call. } // BuiltinNode represents a builtin function call. @@ -163,8 +158,8 @@ type BuiltinNode struct { base Name string // Name of the builtin function. Like "len" in "len(foo)". Arguments []Node // Arguments of the builtin function. - Throws bool // Internal. If true then accessing a field or array index can throw an error. Used by optimizer. - Map Node // Internal. Used by optimizer to fold filter() and map() builtins. + Throws bool // If true then accessing a field or array index can throw an error. Used by optimizer. + Map Node // Used by optimizer to fold filter() and map() builtins. } // ClosureNode represents a predicate. diff --git a/checker/checker.go b/checker/checker.go index 38490bacf..5afe18283 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -10,7 +10,6 @@ import ( "github.com/expr-lang/expr/conf" "github.com/expr-lang/expr/file" "github.com/expr-lang/expr/parser" - "github.com/expr-lang/expr/vm" ) func Check(tree *parser.Tree, config *conf.Config) (t reflect.Type, err error) { @@ -374,11 +373,10 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { case "matches": if s, ok := node.Right.(*ast.StringNode); ok { - r, err := regexp.Compile(s.Value) + _, err := regexp.Compile(s.Value) if err != nil { return v.error(node, err.Error()) } - node.Regexp = r } if isString(l) && isString(r) { return boolType, info{} @@ -549,7 +547,6 @@ func (v *checker) functionReturnType(node *ast.CallNode) (reflect.Type, info) { fn, fnInfo := v.visit(node.Callee) if fnInfo.fn != nil { - node.Func = fnInfo.fn return v.checkFunction(fnInfo.fn, node, node.Arguments) } @@ -571,23 +568,6 @@ func (v *checker) functionReturnType(node *ast.CallNode) (reflect.Type, info) { case reflect.Interface: return anyType, info{} case reflect.Func: - inputParamsCount := 1 // for functions - if fnInfo.method { - inputParamsCount = 2 // for methods - } - // TODO: Deprecate OpCallFast and move fn(...any) any to TypedFunc list. - // To do this we need add support for variadic arguments in OpCallTyped. - if !isAny(fn) && - fn.IsVariadic() && - fn.NumIn() == inputParamsCount && - fn.NumOut() == 1 && - fn.Out(0).Kind() == reflect.Interface { - rest := fn.In(fn.NumIn() - 1) // function has only one param for functions and two for methods - if kind(rest) == reflect.Slice && rest.Elem().Kind() == reflect.Interface { - node.Fast = true - } - } - outType, err := v.checkArguments(fnName, fn, fnInfo.method, node.Arguments, node) if err != nil { if v.err == nil { @@ -595,9 +575,6 @@ func (v *checker) functionReturnType(node *ast.CallNode) (reflect.Type, info) { } return anyType, info{} } - - v.findTypedFunc(node, fn, fnInfo.method) - return outType, info{} } return v.error(node, "%v is not callable", fn) @@ -883,7 +860,13 @@ func (v *checker) checkFunction(f *ast.Function, node ast.Node, arguments []ast. return v.error(node, "no matching overload for %v", f.Name) } -func (v *checker) checkArguments(name string, fn reflect.Type, method bool, arguments []ast.Node, node ast.Node) (reflect.Type, *file.Error) { +func (v *checker) checkArguments( + name string, + fn reflect.Type, + method bool, + arguments []ast.Node, + node ast.Node, +) (reflect.Type, *file.Error) { if isAny(fn) { return anyType, nil } @@ -1122,44 +1105,3 @@ func (v *checker) PairNode(node *ast.PairNode) (reflect.Type, info) { v.visit(node.Value) return nilType, info{} } - -func (v *checker) findTypedFunc(node *ast.CallNode, fn reflect.Type, method bool) { - // OnCallTyped doesn't work for functions with variadic arguments, - // and doesn't work named function, like `type MyFunc func() int`. - // In PkgPath() is an empty string, it's unnamed function. - if !fn.IsVariadic() && fn.PkgPath() == "" { - fnNumIn := fn.NumIn() - fnInOffset := 0 - if method { - fnNumIn-- - fnInOffset = 1 - } - funcTypes: - for i := range vm.FuncTypes { - if i == 0 { - continue - } - typed := reflect.ValueOf(vm.FuncTypes[i]).Elem().Type() - if typed.Kind() != reflect.Func { - continue - } - if typed.NumOut() != fn.NumOut() { - continue - } - for j := 0; j < typed.NumOut(); j++ { - if typed.Out(j) != fn.Out(j) { - continue funcTypes - } - } - if typed.NumIn() != fnNumIn { - continue - } - for j := 0; j < typed.NumIn(); j++ { - if typed.In(j) != fn.In(j+fnInOffset) { - continue funcTypes - } - } - node.Typed = i - } - } -} diff --git a/checker/checker_test.go b/checker/checker_test.go index 42301261d..d03e3a8ee 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -554,6 +554,11 @@ unknown pointer #unknown (1:11) cannot use int as type string in array (1:4) | 42 in ["a", "b", "c"] | ...^ + +"foo" matches "[+" +error parsing regexp: missing closing ]: ` + "`[+`" + ` (1:7) + | "foo" matches "[+" + | ......^ ` func TestCheck_error(t *testing.T) { @@ -777,49 +782,6 @@ func TestCheck_TypeWeights(t *testing.T) { } } -func TestCheck_CallFastTyped(t *testing.T) { - env := map[string]any{ - "fn": func([]any, string) string { - return "foo" - }, - } - - tree, err := parser.Parse("fn([1, 2], 'bar')") - require.NoError(t, err) - - _, err = checker.Check(tree, conf.New(env)) - require.NoError(t, err) - - require.False(t, tree.Node.(*ast.CallNode).Fast) - require.Equal(t, 22, tree.Node.(*ast.CallNode).Typed) -} - -func TestCheck_CallFastTyped_Method(t *testing.T) { - env := mock.Env{} - - tree, err := parser.Parse("FuncTyped('bar')") - require.NoError(t, err) - - _, err = checker.Check(tree, conf.New(env)) - require.NoError(t, err) - - require.False(t, tree.Node.(*ast.CallNode).Fast) - require.Equal(t, 42, tree.Node.(*ast.CallNode).Typed) -} - -func TestCheck_CallTyped_excludes_named_functions(t *testing.T) { - env := mock.Env{} - - tree, err := parser.Parse("FuncNamed('bar')") - require.NoError(t, err) - - _, err = checker.Check(tree, conf.New(env)) - require.NoError(t, err) - - require.False(t, tree.Node.(*ast.CallNode).Fast) - require.Equal(t, 0, tree.Node.(*ast.CallNode).Typed) -} - func TestCheck_works_with_nil_types(t *testing.T) { env := map[string]any{ "null": nil, @@ -908,8 +870,7 @@ func TestCheck_Function_types_are_checked(t *testing.T) { _, err = checker.Check(tree, config) require.NoError(t, err) - require.NotNil(t, tree.Node.(*ast.CallNode).Func) - require.Equal(t, "add", tree.Node.(*ast.CallNode).Func.Name) + require.Equal(t, reflect.Int, tree.Node.Type().Kind()) }) } @@ -943,8 +904,7 @@ func TestCheck_Function_without_types(t *testing.T) { _, err = checker.Check(tree, config) require.NoError(t, err) - require.NotNil(t, tree.Node.(*ast.CallNode).Func) - require.Equal(t, "add", tree.Node.(*ast.CallNode).Func.Name) + require.Equal(t, reflect.Interface, tree.Node.Type().Kind()) } func TestCheck_dont_panic_on_nil_arguments_for_builtins(t *testing.T) { diff --git a/checker/info.go b/checker/info.go index 3245253a3..112bfab31 100644 --- a/checker/info.go +++ b/checker/info.go @@ -5,6 +5,7 @@ import ( "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/vm" ) func FieldIndex(types conf.TypesTable, node ast.Node) (bool, []int, string) { @@ -48,3 +49,80 @@ func MethodIndex(types conf.TypesTable, node ast.Node) (bool, int, string) { } return false, 0, "" } + +func TypedFuncIndex(fn reflect.Type, method bool) (int, bool) { + if fn == nil { + return 0, false + } + if fn.Kind() != reflect.Func { + return 0, false + } + // OnCallTyped doesn't work for functions with variadic arguments. + if fn.IsVariadic() { + return 0, false + } + // OnCallTyped doesn't work named function, like `type MyFunc func() int`. + if fn.PkgPath() != "" { // If PkgPath() is not empty, it means that function is named. + return 0, false + } + + fnNumIn := fn.NumIn() + fnInOffset := 0 + if method { + fnNumIn-- + fnInOffset = 1 + } + +funcTypes: + for i := range vm.FuncTypes { + if i == 0 { + continue + } + typed := reflect.ValueOf(vm.FuncTypes[i]).Elem().Type() + if typed.Kind() != reflect.Func { + continue + } + if typed.NumOut() != fn.NumOut() { + continue + } + for j := 0; j < typed.NumOut(); j++ { + if typed.Out(j) != fn.Out(j) { + continue funcTypes + } + } + if typed.NumIn() != fnNumIn { + continue + } + for j := 0; j < typed.NumIn(); j++ { + if typed.In(j) != fn.In(j+fnInOffset) { + continue funcTypes + } + } + return i, true + } + return 0, false +} + +func IsFastFunc(fn reflect.Type, method bool) bool { + if fn == nil { + return false + } + if fn.Kind() != reflect.Func { + return false + } + numIn := 1 + if method { + numIn = 2 + } + if !isAny(fn) && + fn.IsVariadic() && + fn.NumIn() == numIn && + fn.NumOut() == 1 && + fn.Out(0).Kind() == reflect.Interface { + rest := fn.In(fn.NumIn() - 1) // function has only one param for functions and two for methods + if kind(rest) == reflect.Slice && rest.Elem().Kind() == reflect.Interface { + return true + } + } + return false +} diff --git a/checker/info_test.go b/checker/info_test.go new file mode 100644 index 000000000..c91a55ad6 --- /dev/null +++ b/checker/info_test.go @@ -0,0 +1,27 @@ +package checker_test + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr/checker" + "github.com/expr-lang/expr/test/mock" +) + +func TestTypedFuncIndex(t *testing.T) { + fn := func([]any, string) string { + return "foo" + } + index, ok := checker.TypedFuncIndex(reflect.TypeOf(fn), false) + require.True(t, ok) + require.Equal(t, 22, index) +} + +func TestTypedFuncIndex_excludes_named_functions(t *testing.T) { + var fn mock.MyFunc + + _, ok := checker.TypedFuncIndex(reflect.TypeOf(fn), false) + require.False(t, ok) +} diff --git a/compiler/compiler.go b/compiler/compiler.go index 2b03e5afa..50c4816b2 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -3,6 +3,7 @@ package compiler import ( "fmt" "reflect" + "regexp" "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/builtin" @@ -26,27 +27,24 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro }() c := &compiler{ + config: config, locations: make([]file.Location, 0), constantsIndex: make(map[any]int), functionsIndex: make(map[string]int), debugInfo: make(map[string]string), } - if config != nil { - c.mapEnv = config.MapEnv - c.cast = config.Expect - c.types = config.Types - } - c.compile(tree.Node) - switch c.cast { - case reflect.Int: - c.emit(OpCast, 0) - case reflect.Int64: - c.emit(OpCast, 1) - case reflect.Float64: - c.emit(OpCast, 2) + if c.config != nil { + switch c.config.Expect { + case reflect.Int: + c.emit(OpCast, 0) + case reflect.Int64: + c.emit(OpCast, 1) + case reflect.Float64: + c.emit(OpCast, 2) + } } program = NewProgram( @@ -63,6 +61,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro } type compiler struct { + config *conf.Config locations []file.Location bytecode []Opcode variables []any @@ -72,12 +71,9 @@ type compiler struct { functions []Function functionsIndex map[string]int debugInfo map[string]string - mapEnv bool - cast reflect.Kind nodes []ast.Node chains [][]int arguments []int - types conf.TypesTable } type scope struct { @@ -255,14 +251,22 @@ func (c *compiler) IdentifierNode(node *ast.IdentifierNode) { c.emit(OpLoadEnv) return } - if c.mapEnv { + + var mapEnv bool + var types conf.TypesTable + if c.config != nil { + mapEnv = c.config.MapEnv + types = c.config.Types + } + + if mapEnv { c.emit(OpLoadFast, c.addConstant(node.Value)) - } else if ok, index, name := checker.FieldIndex(c.types, node); ok { + } else if ok, index, name := checker.FieldIndex(types, node); ok { c.emit(OpLoadField, c.addConstant(&runtime.Field{ Index: index, Path: []string{name}, })) - } else if ok, index, name := checker.MethodIndex(c.types, node); ok { + } else if ok, index, name := checker.MethodIndex(types, node); ok { c.emit(OpLoadMethod, c.addConstant(&runtime.Method{ Name: name, Index: index, @@ -485,10 +489,14 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { c.emit(OpIn) case "matches": - if node.Regexp != nil { + if str, ok := node.Right.(*ast.StringNode); ok { + re, err := regexp.Compile(str.Value) + if err != nil { + panic(err) + } c.compile(node.Left) c.derefInNeeded(node.Left) - c.emit(OpMatchesConst, c.addConstant(node.Regexp)) + c.emit(OpMatchesConst, c.addConstant(re)) } else { c.compile(node.Left) c.derefInNeeded(node.Left) @@ -562,7 +570,12 @@ func (c *compiler) ChainNode(node *ast.ChainNode) { } func (c *compiler) MemberNode(node *ast.MemberNode) { - if ok, index, name := checker.MethodIndex(c.types, node); ok { + var types conf.TypesTable + if c.config != nil { + types = c.config.Types + } + + if ok, index, name := checker.MethodIndex(types, node); ok { c.compile(node.Node) c.emit(OpMethod, c.addConstant(&runtime.Method{ Name: name, @@ -573,14 +586,14 @@ func (c *compiler) MemberNode(node *ast.MemberNode) { op := OpFetch base := node.Node - ok, index, nodeName := checker.FieldIndex(c.types, node) + ok, index, nodeName := checker.FieldIndex(types, node) path := []string{nodeName} if ok { op = OpFetchField for !node.Optional { if ident, isIdent := base.(*ast.IdentifierNode); isIdent { - if ok, identIndex, name := checker.FieldIndex(c.types, ident); ok { + if ok, identIndex, name := checker.FieldIndex(types, ident); ok { index = append(identIndex, index...) path = append([]string{name}, path...) c.emitLocation(ident.Location(), OpLoadField, c.addConstant( @@ -591,7 +604,7 @@ func (c *compiler) MemberNode(node *ast.MemberNode) { } if member, isMember := base.(*ast.MemberNode); isMember { - if ok, memberIndex, name := checker.FieldIndex(c.types, member); ok { + if ok, memberIndex, name := checker.FieldIndex(types, member); ok { index = append(memberIndex, index...) path = append([]string{name}, path...) node = member @@ -640,15 +653,21 @@ func (c *compiler) CallNode(node *ast.CallNode) { for _, arg := range node.Arguments { c.compile(arg) } - if node.Func != nil { - c.emitFunction(node.Func, len(node.Arguments)) - return + if ident, ok := node.Callee.(*ast.IdentifierNode); ok { + if c.config != nil { + if fn, ok := c.config.Functions[ident.Value]; ok { + c.emitFunction(fn, len(node.Arguments)) + return + } + } } c.compile(node.Callee) - if node.Typed > 0 { - c.emit(OpCallTyped, node.Typed) + + isMethod, _, _ := checker.MethodIndex(c.config.Types, node.Callee) + if index, ok := checker.TypedFuncIndex(node.Callee.Type(), isMethod); ok { + c.emit(OpCallTyped, index) return - } else if node.Fast { + } else if checker.IsFastFunc(node.Callee.Type(), isMethod) { c.emit(OpCallFast, len(node.Arguments)) } else { c.emit(OpCall, len(node.Arguments)) diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 8068f5e69..ed11a9dd7 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" "github.com/expr-lang/expr" + "github.com/expr-lang/expr/test/mock" "github.com/expr-lang/expr/test/playground" "github.com/expr-lang/expr/vm" "github.com/expr-lang/expr/vm/runtime" @@ -347,3 +348,39 @@ func TestCompile_panic(t *testing.T) { }) } } + +func TestCompile_FuncTypes(t *testing.T) { + env := map[string]any{ + "fn": func([]any, string) string { + return "foo" + }, + } + program, err := expr.Compile("fn([1, 2], 'bar')", expr.Env(env)) + require.NoError(t, err) + require.Equal(t, vm.OpCallTyped, program.Bytecode[3]) + require.Equal(t, 22, program.Arguments[3]) +} + +func TestCompile_FuncTypes_with_Method(t *testing.T) { + env := mock.Env{} + program, err := expr.Compile("FuncTyped('bar')", expr.Env(env)) + require.NoError(t, err) + require.Equal(t, vm.OpCallTyped, program.Bytecode[2]) + require.Equal(t, 42, program.Arguments[2]) +} + +func TestCompile_FuncTypes_excludes_named_functions(t *testing.T) { + env := mock.Env{} + program, err := expr.Compile("FuncNamed('bar')", expr.Env(env)) + require.NoError(t, err) + require.Equal(t, vm.OpCall, program.Bytecode[2]) + require.Equal(t, 1, program.Arguments[2]) +} + +func TestCompile_OpCallFast(t *testing.T) { + env := mock.Env{} + program, err := expr.Compile("Fast(3, 2, 1)", expr.Env(env)) + require.NoError(t, err) + require.Equal(t, vm.OpCallFast, program.Bytecode[4]) + require.Equal(t, 3, program.Arguments[4]) +} diff --git a/parser/parser_test.go b/parser/parser_test.go index ba8e29acc..453fe91ac 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -222,14 +222,12 @@ world`}, }, }, Arguments: []Node{}, - Fast: false, }, Property: &StringNode{ Value: "c", }, }, Arguments: []Node{}, - Fast: false, }, Property: &StringNode{ Value: "d", diff --git a/vm/vm_test.go b/vm/vm_test.go index 70a0ae057..0cbbb8998 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -8,7 +8,6 @@ import ( "github.com/stretchr/testify/require" - "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/compiler" "github.com/expr-lang/expr/conf" @@ -145,10 +144,6 @@ func (ErrorEnv) WillError(param string) (bool, error) { return true, nil } -func (ErrorEnv) FastError(...any) any { - return true -} - func (InnerEnv) WillError(param string) (bool, error) { if param == "yes" { return false, errors.New("inner error") @@ -202,27 +197,6 @@ func TestRun_FastMethods(t *testing.T) { require.Equal(t, "hello world", out) } -func TestRun_FastMethodWithError(t *testing.T) { - input := `FastError()` - - tree, err := parser.Parse(input) - require.NoError(t, err) - - env := ErrorEnv{} - funcConf := conf.New(env) - _, err = checker.Check(tree, funcConf) - require.NoError(t, err) - require.True(t, tree.Node.(*ast.CallNode).Fast, "method must be fast") - - program, err := compiler.Compile(tree, funcConf) - require.NoError(t, err) - - out, err := vm.Run(program, env) - require.NoError(t, err) - - require.Equal(t, true, out) -} - func TestRun_InnerMethodWithError(t *testing.T) { input := `InnerEnv.WillError("yes")` From ed688360999a89ddbc50752a3524d08c6d490a9c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 29 Dec 2023 21:00:43 +0100 Subject: [PATCH 231/506] Rename func.go to lib.go --- builtin/{func.go => lib.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename builtin/{func.go => lib.go} (100%) diff --git a/builtin/func.go b/builtin/lib.go similarity index 100% rename from builtin/func.go rename to builtin/lib.go From 5dcb233566c0c28a5059b968e013b602ffc29696 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 29 Dec 2023 21:04:25 +0100 Subject: [PATCH 232/506] Move ast.Function to builtin.Function --- ast/func.go | 12 ------------ builtin/builtin.go | 12 ++++++++++-- builtin/lib.go | 5 ++--- checker/checker.go | 4 ++-- compiler/compiler.go | 4 ++-- conf/config.go | 8 ++++---- expr.go | 3 ++- 7 files changed, 22 insertions(+), 26 deletions(-) delete mode 100644 ast/func.go diff --git a/ast/func.go b/ast/func.go deleted file mode 100644 index a873c35e9..000000000 --- a/ast/func.go +++ /dev/null @@ -1,12 +0,0 @@ -package ast - -import "reflect" - -type Function struct { - Name string - Func func(args ...any) (any, error) - Fast func(arg any) any - Types []reflect.Type - Validate func(args []reflect.Type) (reflect.Type, error) - Predicate bool -} diff --git a/builtin/builtin.go b/builtin/builtin.go index d76cc9d06..2417446da 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -9,10 +9,18 @@ import ( "strings" "time" - "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/vm/runtime" ) +type Function struct { + Name string + Func func(args ...any) (any, error) + Fast func(arg any) any + Types []reflect.Type + Validate func(args []reflect.Type) (reflect.Type, error) + Predicate bool +} + var ( Index map[string]int Names []string @@ -27,7 +35,7 @@ func init() { } } -var Builtins = []*ast.Function{ +var Builtins = []*Function{ { Name: "all", Predicate: true, diff --git a/builtin/lib.go b/builtin/lib.go index 1c2546a2d..1deca3f99 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -6,7 +6,6 @@ import ( "reflect" "strconv" - "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/vm/runtime" ) @@ -274,8 +273,8 @@ func Min(args ...any) (any, error) { return min, nil } -func bitFunc(name string, fn func(x, y int) (any, error)) *ast.Function { - return &ast.Function{ +func bitFunc(name string, fn func(x, y int) (any, error)) *Function { + return &Function{ Name: name, Func: func(args ...any) (any, error) { if len(args) != 2 { diff --git a/checker/checker.go b/checker/checker.go index 5afe18283..4dced34ea 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -71,7 +71,7 @@ type varScope struct { type info struct { method bool - fn *ast.Function + fn *builtin.Function // elem is element type of array or map. // Arrays created with type []any, but @@ -819,7 +819,7 @@ func (v *checker) checkBuiltinGet(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(val, "type %v does not support indexing", t) } -func (v *checker) checkFunction(f *ast.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { +func (v *checker) checkFunction(f *builtin.Function, node ast.Node, arguments []ast.Node) (reflect.Type, info) { if f.Validate != nil { args := make([]reflect.Type, len(arguments)) for i, arg := range arguments { diff --git a/compiler/compiler.go b/compiler/compiler.go index 50c4816b2..f4bb3bd5d 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -144,7 +144,7 @@ func (c *compiler) addVariable(name string) int { } // emitFunction adds builtin.Function.Func to the program.functions and emits call opcode. -func (c *compiler) emitFunction(fn *ast.Function, argsLen int) { +func (c *compiler) emitFunction(fn *builtin.Function, argsLen int) { switch argsLen { case 0: c.emit(OpCall0, c.addFunction(fn)) @@ -161,7 +161,7 @@ func (c *compiler) emitFunction(fn *ast.Function, argsLen int) { } // addFunction adds builtin.Function.Func to the program.functions and returns its index. -func (c *compiler) addFunction(fn *ast.Function) int { +func (c *compiler) addFunction(fn *builtin.Function) int { if fn == nil { panic("function is nil") } diff --git a/conf/config.go b/conf/config.go index 4de8ca448..48d491a96 100644 --- a/conf/config.go +++ b/conf/config.go @@ -21,8 +21,8 @@ type Config struct { Strict bool ConstFns map[string]reflect.Value Visitors []ast.Visitor - Functions map[string]*ast.Function - Builtins map[string]*ast.Function + Functions map[string]*builtin.Function + Builtins map[string]*builtin.Function Disabled map[string]bool // disabled builtins } @@ -32,8 +32,8 @@ func CreateNew() *Config { Optimize: true, Operators: make(map[string][]string), ConstFns: make(map[string]reflect.Value), - Functions: make(map[string]*ast.Function), - Builtins: make(map[string]*ast.Function), + Functions: make(map[string]*builtin.Function), + Builtins: make(map[string]*builtin.Function), Disabled: make(map[string]bool), } for _, f := range builtin.Builtins { diff --git a/expr.go b/expr.go index 07ef4b7b3..8569de8fb 100644 --- a/expr.go +++ b/expr.go @@ -6,6 +6,7 @@ import ( "reflect" "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/compiler" "github.com/expr-lang/expr/conf" @@ -123,7 +124,7 @@ func Function(name string, fn func(params ...any) (any, error), types ...any) Op } ts[i] = t } - c.Functions[name] = &ast.Function{ + c.Functions[name] = &builtin.Function{ Name: name, Func: fn, Types: ts, From 7b890a13cc708ce5962a139edc4cca0000cacc87 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 29 Dec 2023 23:01:52 +0100 Subject: [PATCH 233/506] Update examples.txt --- testdata/examples.txt | 23365 +++++++++++++++++++++++----------------- 1 file changed, 13497 insertions(+), 9868 deletions(-) diff --git a/testdata/examples.txt b/testdata/examples.txt index 2bb8ab7fb..9abe85327 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -1,18 +1,15 @@ -!!!true -!!(f32 > f64) -!!(half != greet) -!!(nil == add) -!!(ok or true) +!!!false +!!(1 <= f64) +!!(1 > 0.5) +!!(i64 != f64) +!!all(array, ok) !!false -!!not false !!ok !!true !("bar" != "bar") !("bar" != "foo") !("bar" != nil) -!("bar" < "bar") !("bar" < "foo") -!("bar" <= "bar") !("bar" <= "foo") !("bar" == "bar") !("bar" == "foo") @@ -21,32 +18,32 @@ !("bar" > "foo") !("bar" >= "bar") !("bar" >= "foo") +!("bar" contains "bar") !("bar" contains "foo") +!("bar" endsWith "bar") +!("bar" endsWith "foo") !("bar" in foo) !("bar" matches "foo") !("bar" not contains "bar") -!("bar" not contains "foo") +!("bar" not endsWith "bar") !("bar" not endsWith "foo") !("bar" not in foo) -!("bar" not matches "foo") +!("bar" not matches "bar") !("bar" not startsWith "bar") !("bar" not startsWith "foo") !("bar" startsWith "bar") !("foo" != "bar") -!("foo" != "foo") !("foo" != nil) -!("foo" < "bar") +!("foo" < "foo") !("foo" <= "bar") !("foo" <= "foo") -!("foo" == "foo") +!("foo" == "bar") !("foo" == nil) !("foo" > "bar") !("foo" > "foo") !("foo" >= "bar") -!("foo" >= "foo") !("foo" contains "bar") !("foo" contains "foo") -!("foo" endsWith "bar") !("foo" endsWith "foo") !("foo" in foo) !("foo" matches "bar") @@ -54,14 +51,15 @@ !("foo" not contains "bar") !("foo" not contains "foo") !("foo" not endsWith "bar") -!("foo" not endsWith "foo") -!("foo" not in foo) !("foo" not matches "bar") !("foo" not matches "foo") !("foo" not startsWith "bar") !("foo" not startsWith "foo") !("foo" startsWith "bar") !("foo" startsWith "foo") +!(-f32 < f32) +!(-i < i32) +!(-i32 >= i) !(0.5 != 0.5) !(0.5 != 1) !(0.5 != f32) @@ -70,7 +68,6 @@ !(0.5 != i32) !(0.5 != i64) !(0.5 != nil) -!(0.5 / i32 > i) !(0.5 < 0.5) !(0.5 < 1) !(0.5 < f32) @@ -81,6 +78,7 @@ !(0.5 <= 0.5) !(0.5 <= 1) !(0.5 <= f32) +!(0.5 <= f64) !(0.5 <= i) !(0.5 <= i32) !(0.5 <= i64) @@ -106,7 +104,8 @@ !(0.5 >= i) !(0.5 >= i32) !(0.5 >= i64) -!(0.5 ^ i64 < i64) +!(0.5 in array) +!(0.5 not in array) !(1 != 0.5) !(1 != 1) !(1 != f32) @@ -115,6 +114,7 @@ !(1 != i32) !(1 != i64) !(1 != nil) +!(1 / i64 == i64) !(1 < 0.5) !(1 < 1) !(1 < f32) @@ -139,6 +139,7 @@ !(1 == nil) !(1 > 0.5) !(1 > 1) +!(1 > f32) !(1 > f64) !(1 > i) !(1 > i32) @@ -160,10 +161,12 @@ !(add != score) !(add == add) !(add == div) +!(add == greet) !(add == half) !(add == nil) !(add == score) !(array != array) +!(array != list) !(array != nil) !(array == array) !(array == list) @@ -178,15 +181,15 @@ !(div == div) !(div == greet) !(div == half) -!(div == nil) !(div == score) !(f32 != 0.5) !(f32 != 1) !(f32 != f32) +!(f32 != f64) +!(f32 != i) !(f32 != i32) !(f32 != i64) !(f32 != nil) -!(f32 + i == 0.5 * i) !(f32 < 0.5) !(f32 < 1) !(f32 < f32) @@ -198,7 +201,6 @@ !(f32 <= 1) !(f32 <= f32) !(f32 <= f64) -!(f32 <= i) !(f32 <= i32) !(f32 <= i64) !(f32 == 0.5) @@ -219,39 +221,44 @@ !(f32 >= 0.5) !(f32 >= 1) !(f32 >= f32) -!(f32 >= f64) !(f32 >= i) +!(f32 >= i32) !(f32 >= i64) +!(f32 in array) +!(f32 not in array) !(f64 != 0.5) !(f64 != 1) !(f64 != f32) !(f64 != f64) +!(f64 != i) !(f64 != i32) !(f64 != i64) !(f64 != nil) +!(f64 < 0.5 + 1) !(f64 < 0.5) !(f64 < 1) -!(f64 < f32) !(f64 < f64) !(f64 < i) !(f64 < i32) !(f64 < i64) +!(f64 < max(1)) !(f64 <= 0.5) !(f64 <= 1) -!(f64 <= f32) -!(f64 <= f64) -!(f64 <= i) !(f64 <= i32) !(f64 <= i64) !(f64 == 0.5) !(f64 == 1) !(f64 == f32) +!(f64 == f64) +!(f64 == i) !(f64 == i32) !(f64 == i64) !(f64 == nil) !(f64 > 0.5) !(f64 > 1) +!(f64 > f32) !(f64 > f64) +!(f64 > i) !(f64 > i32) !(f64 > i64) !(f64 >= 0.5) @@ -261,18 +268,24 @@ !(f64 >= i) !(f64 >= i32) !(f64 >= i64) +!(f64 in array) +!(f64 not in array) !(false != false) !(false != nil) !(false != ok) !(false != true) !(false && false) !(false && ok) +!(false && true) !(false == false) !(false == nil) !(false == ok) +!(false == true) +!(false and false) !(false and ok) +!(false and true) +!(false or false) !(false or ok) -!(false or true) !(false || false) !(false || ok) !(false || true) @@ -280,15 +293,16 @@ !(foo != nil) !(foo == foo) !(foo == nil) +!(foo == reduce(list, #)) !(foo in list) !(foo not in list) +!(greet != add) !(greet != div) !(greet != greet) !(greet != half) !(greet != nil) !(greet != score) !(greet == add) -!(greet == div) !(greet == greet) !(greet == half) !(greet == nil) @@ -315,7 +329,6 @@ !(i != nil) !(i < 0.5) !(i < 1) -!(i < f32) !(i < f64) !(i < i) !(i < i32) @@ -324,9 +337,7 @@ !(i <= 1) !(i <= f32) !(i <= f64) -!(i <= i) !(i <= i32) -!(i <= i64) !(i == 0.5) !(i == 1) !(i == f32) @@ -343,20 +354,23 @@ !(i > i32) !(i > i64) !(i >= 0.5) +!(i >= 1 * i64) !(i >= 1) !(i >= f32) !(i >= f64) +!(i >= i) !(i >= i32) !(i >= i64) !(i in array) +!(i not in array) !(i32 != 0.5) !(i32 != 1) +!(i32 != f32) !(i32 != f64) !(i32 != i) !(i32 != i32) !(i32 != i64) !(i32 != nil) -!(i32 * 0.5 != i32) !(i32 < 0.5) !(i32 < 1) !(i32 < f32) @@ -373,6 +387,7 @@ !(i32 <= i64) !(i32 == 0.5) !(i32 == 1) +!(i32 == f32) !(i32 == f64) !(i32 == i) !(i32 == i32) @@ -380,10 +395,10 @@ !(i32 == nil) !(i32 > 0.5) !(i32 > 1) +!(i32 > f32) !(i32 > f64) !(i32 > i) !(i32 > i32) -!(i32 > i64) !(i32 >= 0.5) !(i32 >= 1) !(i32 >= f32) @@ -399,12 +414,14 @@ !(i64 != f64) !(i64 != i) !(i64 != i32) +!(i64 != i64) !(i64 != nil) !(i64 < 0.5) !(i64 < 1) !(i64 < f32) !(i64 < f64) !(i64 < i) +!(i64 < i32 + i64) !(i64 < i32) !(i64 < i64) !(i64 <= 0.5) @@ -418,8 +435,8 @@ !(i64 == 1) !(i64 == f32) !(i64 == f64) -!(i64 == i) !(i64 == i32) +!(i64 == i64) !(i64 == nil) !(i64 > 0.5) !(i64 > 1) @@ -434,8 +451,9 @@ !(i64 >= f64) !(i64 >= i) !(i64 >= i32) +!(i64 >= i64) !(i64 in array) -!(i64 not in array) +!(len("bar") <= i) !(list != array) !(list != list) !(list != nil) @@ -467,10 +485,12 @@ !(nil == "foo") !(nil == 0.5) !(nil == 1) +!(nil == add) !(nil == array) !(nil == div) !(nil == f32) !(nil == f64) +!(nil == false) !(nil == foo) !(nil == greet) !(nil == half) @@ -493,14 +513,17 @@ !(ok && false) !(ok && ok) !(ok && true) -!(ok == false) !(ok == nil) !(ok == ok) +!(ok == true) !(ok and ok) !(ok and true) +!(ok or false) !(ok or ok) +!(ok or true) !(ok || false) !(ok || ok) +!(ok || true) !(score != add) !(score != div) !(score != greet) @@ -512,6 +535,7 @@ !(score == greet) !(score == half) !(score == nil) +!(score == score) !(true != false) !(true != nil) !(true != ok) @@ -523,10 +547,11 @@ !(true == nil) !(true == ok) !(true == true) -!(true and false) !(true and ok) !(true and true) +!(true or ok) !(true or true) +!(true || false) !(true || ok) !(true || true) !all(array, false) @@ -535,445 +560,498 @@ !all(list, false) !all(list, ok) !all(list, true) -!any(array, false) +!any(array, i == #) !any(array, ok) !any(array, true) -!any(list, # != #) +!any(list, false) !any(list, ok) -!false && ok -!false ? "bar" : i -!false ? "foo" : false -!false ? 0.5 : "bar" -!false ? 0.5 : 1 -!false ? 0.5 : div -!false ? 0.5 : i64 -!false ? 1 : add -!false ? 1 : true -!false ? add : array -!false ? add : nil -!false ? array : array -!false ? div : 0.5 -!false ? div : foo -!false ? div : map(list, #) -!false ? div : nil -!false ? f32 : 0.5 -!false ? f32 : greet -!false ? f64 : 1 -!false ? f64 : half -!false ? false : f32 -!false ? false : false -!false ? foo : 1 -!false ? foo : i64 -!false ? greet : array -!false ? greet : i32 -!false ? half : nil -!false ? half : ok -!false ? i : foo -!false ? i32 : "foo" -!false ? i64 : f32 -!false ? i64 : nil -!false ? list : list -!false ? nil : 1 +!any(list, true) +!false != not true +!false != ok +!false && 0.5 == 1 +!false == ok +!false ? "foo" : 0.5 +!false ? "foo" : f32 +!false ? 0.5 : "foo" +!false ? 0.5 : f32 +!false ? 1 : half +!false ? 1 : i +!false ? add : f32 +!false ? add : i64 +!false ? array : add +!false ? array : ok +!false ? div != half : map(list, i32) +!false ? div : array +!false ? div : greet +!false ? div : half +!false ? f32 : add +!false ? f32 : false +!false ? f64 : "foo" +!false ? foo : "bar" +!false ? half : 1 +!false ? half : add +!false ? half : list +!false ? half : true +!false ? i : nil +!false ? i32 : list +!false ? i64 : foo +!false ? i64 : i64 !false ? nil : add !false ? nil : f64 !false ? nil : foo -!false ? ok : ok -!false ? true : array -!false and (true or false) -!false and ok -!false or 0.5 != 1 -!false || not false -!hasSuffix("bar", "bar") +!false ? nil : half +!false ? ok : 1 +!false ? score : "bar" +!false ? score : foo +!false ? score : ok +!false ? true : "foo" +!false or 0.5 > i32 +!false or ok +!false || ok +!hasPrefix("foo", "foo") +!none(array, # > #) +!none(array, # >= #) !none(array, false) -!none(array, true) -!none(list, false) +!none(array, ok) !none(list, ok) !none(list, true) -!not (1 != i) -!not (i64 != 0.5) -!not any(list, ok) +!not ("bar" == nil) +!not (1 <= 1) +!not (1 > 0.5) +!not (greet != score) +!not (greet == div) +!not (greet == nil) +!not (i32 == f64) !not false +!not none(list, true) !not ok !not true -!not true ? i64 : true !ok +!ok != !true !ok != ok -!ok && (ok || ok) -!ok == !ok +!ok && ok !ok == ok -!ok ? "bar" : 0.5 -!ok ? "foo" : nil -!ok ? 0.5 : "foo" -!ok ? 1 : 0.5 -!ok ? 1 : 1 +!ok ? "bar" : "foo" +!ok ? "bar" : foo +!ok ? "foo" : 0.5 +!ok ? "foo" : list +!ok ? 0.5 : 1 +!ok ? 0.5 : i +!ok ? 1 : array !ok ? 1 : div -!ok ? 1 : foo -!ok ? 1 : greet +!ok ? 1 : f64 +!ok ? 1 : list !ok ? 1 : ok -!ok ? add : f32 -!ok ? add : false -!ok ? add : i -!ok ? add : score -!ok ? f32 : "foo" -!ok ? f32 : 1 -!ok ? f64 : i -!ok ? false : "foo" -!ok ? false : half -!ok ? greet : "bar" -!ok ? greet : add -!ok ? greet : false -!ok ? half : array +!ok ? add : 0.5 +!ok ? array : div +!ok ? array : f32 +!ok ? array : foo +!ok ? array : i +!ok ? array : i32 +!ok ? div : "foo" +!ok ? div : 1 +!ok ? div : i +!ok ? f32 : "bar" +!ok ? f32 : add +!ok ? f32 : false +!ok ? f32 : greet +!ok ? f64 : "bar" +!ok ? f64 : "foo" +!ok ? f64 : 0.5 +!ok ? f64 : half +!ok ? f64 : score +!ok ? false : ok +!ok ? foo : "foo" +!ok ? foo : f32 +!ok ? foo : false +!ok ? foo : i32 +!ok ? greet : div +!ok ? greet : list +!ok ? greet : nil +!ok ? half : f64 +!ok ? i : "bar" +!ok ? i : array +!ok ? i : div !ok ? i : foo -!ok ? i : greet -!ok ? i : true -!ok ? i64 : list -!ok ? list : "foo" -!ok ? list : true -!ok ? nil : i -!ok ? nil : true -!ok ? ok : 1 -!ok ? ok : i64 -!ok ? ok : score -!ok ? score : array -!ok ? score : i -!ok ? true : greet -!ok and i != f32 +!ok ? i32 : 0.5 +!ok ? i32 : f32 +!ok ? i32 : greet +!ok ? i32 : nil +!ok ? i64 : 0.5 +!ok ? i64 : 1 +!ok ? i64 : f32 +!ok ? i64 : true +!ok ? list : f32 +!ok ? list : i +!ok ? nil : 1 +!ok ? nil : array +!ok ? ok : f32 +!ok ? ok : list !ok and ok -!ok or none(array, ok) +!ok or f32 < i64 +!ok or false or false +!ok or ok +!ok || ok +!one(array, false) !one(array, ok) !one(array, true) !one(list, false) !one(list, ok) !one(list, true) -!true != false ? ok : 0.5 -!true != nil == nil -!true != ok -!true && ok -!true == ok -!true ? "bar" : false -!true ? "bar" : i -!true ? "foo" : ok -!true ? 0.5 : 1 -!true ? 0.5 : div -!true ? 0.5 : i -!true ? add : div -!true ? add : greet -!true ? array : foo -!true ? array : i -!true ? array : i64 -!true ? array : score -!true ? div : f32 -!true ? div : ok -!true ? f32 : 0.5 -!true ? f32 : add -!true ? f32 : foo -!true ? f32 : i32 -!true ? f64 : "bar" +!reduce(array, false) +!reduce(array, ok) +!reduce(array, true) +!reduce(list, # != #) +!reduce(list, false) +!reduce(list, ok) +!reduce(list, true) +!true != all(array, ok) +!true ? "bar" : "foo" +!true ? "bar" : true +!true ? "foo" : "foo" +!true ? "foo" : 0.5 +!true ? "foo" : i +!true ? 1 : "foo" +!true ? 1 : i64 +!true ? add : 0.5 +!true ? add : score +!true ? array : f64 +!true ? array : list +!true ? div : add +!true ? f32 : false !true ? f64 : f64 -!true ? f64 : i32 !true ? foo : 1 -!true ? greet : array -!true ? greet : list -!true ? half : add -!true ? half : greet -!true ? i32 : i64 -!true ? i64 : score -!true ? list : div +!true ? foo : array +!true ? greet : ok +!true ? greet : score +!true ? greet : true +!true ? half : f64 +!true ? i : 1 +!true ? i : add +!true ? i : ok +!true ? i32 : 1 +!true ? i64 : false +!true ? i64 : i64 +!true ? i64 : list +!true ? list : 0.5 +!true ? list : nil !true ? list : score !true ? nil : 0.5 -!true ? nil : f32 -!true ? nil : f64 -!true ? nil : foo -!true ? nil : half -!true ? nil : i -!true ? ok : list -!true ? score : array -!true ? score : nil -!true and ok -!true or !false -!true or nil != ok +!true ? nil : false +!true ? nil : ok +!true ? ok : add +!true ? ok : div +!true ? score : false +!true ? true : f32 +!true ? true : half +!true and foo != nil !true || ok +"bar" != "bar" || ok "bar" != foo.Bar "bar" != foo?.Bar -"bar" != foo?.String() -"bar" != nil and true ? i64 : 0.5 -"bar" + "foo" not endsWith greet("bar") +"bar" + "bar" not in foo "bar" + foo.Bar "bar" + foo?.Bar -"bar" + foo?.String() "bar" < foo.Bar "bar" < foo?.Bar +"bar" < foo?.String() "bar" <= foo.Bar "bar" <= foo.String() "bar" <= foo?.Bar "bar" == foo.Bar "bar" == foo?.Bar +"bar" == foo?.String() +"bar" > "bar" or ok ? f32 : i64 "bar" > foo.Bar -"bar" > foo.String() -"bar" > foo?.Bar -"bar" contains "bar" == ok -"bar" contains "foo" ? array : f64 +"bar" > foo?.String() +"bar" >= foo.Bar +"bar" >= foo.String() +"bar" >= foo?.Bar "bar" contains foo.Bar +"bar" contains foo.String() "bar" contains foo?.Bar -"bar" contains foo?.String() "bar" endsWith foo.Bar "bar" endsWith foo?.Bar "bar" endsWith foo?.String() -"bar" in foo || ok -"bar" matches "bar" != ok +"bar" matches "bar" and ok "bar" matches foo.Bar +"bar" matches foo.String() "bar" matches foo?.Bar +"bar" matches foo?.String() "bar" not contains foo.Bar -"bar" not contains foo.String() "bar" not contains foo?.Bar "bar" not endsWith foo.Bar "bar" not endsWith foo?.Bar "bar" not endsWith foo?.String() -"bar" not in list[i] -"bar" not matches "foo" ? i32 < 0.5 : ok "bar" not matches foo.Bar "bar" not matches foo.String() "bar" not matches foo?.Bar -"bar" not startsWith "foo" ? add : ok +"bar" not matches foo?.String() "bar" not startsWith foo.Bar "bar" not startsWith foo?.Bar +"bar" not startsWith foo?.String() +"bar" startsWith "foo" or list == array "bar" startsWith foo.Bar -"bar" startsWith foo?.Bar -"foo" != "bar" != ok +"bar" startsWith foo.String() +"foo" != "foo" ? f64 : array +"foo" != "foo" or ok "foo" != foo.Bar +"foo" != foo.String() "foo" != foo?.Bar "foo" != foo?.String() -"foo" + "foo" not in foo +"foo" + "bar" not in foo "foo" + foo.Bar -"foo" + foo.String() "foo" + foo?.Bar "foo" + foo?.String() -"foo" < "bar" and i32 != 0.5 -"foo" < "foo" ? list : f32 +"foo" < "bar" and ok "foo" < foo.Bar "foo" < foo?.Bar +"foo" < foo?.String() "foo" <= foo.Bar "foo" <= foo?.Bar -"foo" == "foo" && i32 > 1 +"foo" == "bar" != ok +"foo" == "bar" and ok "foo" == foo.Bar -"foo" == foo.String() +"foo" == foo?.Bar "foo" == foo?.String() -"foo" == nil ? foo : f64 -"foo" > "bar" && ok -"foo" > "foo" == not false +"foo" > foo.Bar +"foo" > foo.String() "foo" > foo?.Bar -"foo" > foo?.String() "foo" >= foo.Bar +"foo" >= foo.String() "foo" >= foo?.Bar -"foo" contains foo.Bar +"foo" >= foo?.String() +"foo" contains "bar" == ok "foo" contains foo?.Bar "foo" endsWith foo.Bar -"foo" endsWith foo.String() "foo" endsWith foo?.Bar -"foo" endsWith foo?.String() -"foo" in foo && nil == 1 -"foo" matches "bar" ? f64 > f64 : half +"foo" matches "bar" ? add : div +"foo" matches "foo" || true ? greet : "bar" "foo" matches foo.Bar "foo" matches foo.String() "foo" matches foo?.Bar "foo" not contains foo.Bar "foo" not contains foo?.Bar +"foo" not contains foo?.String() "foo" not endsWith foo.Bar "foo" not endsWith foo?.Bar -"foo" not endsWith foo?.String() "foo" not matches foo.Bar -"foo" not matches foo.String() "foo" not matches foo?.Bar +"foo" not matches foo?.String() "foo" not startsWith foo.Bar +"foo" not startsWith foo?.Bar "foo" not startsWith foo?.String() "foo" startsWith foo.Bar "foo" startsWith foo?.Bar -"foo" startsWith foo?.String() -("bar" not endsWith "bar") and i64 < i32 -("bar" not endsWith "foo") == ok -("bar" not in foo) == ok -("foo" not matches "bar") and false ? f64 : array -(0.5 * 0.5) ** f32 +("bar" not endsWith "bar") != ok +("bar" not endsWith "foo") != ok +("bar" not endsWith "foo") && false != nil +("bar" not matches "foo") || reduce(list, ok) +("foo" not matches "bar") == ok (0.5 * 0.5) ** i -(0.5 * 0.5) ** i64 (0.5 * 0.5) ^ f32 -(0.5 * 0.5) ^ i32 -(0.5 * f32) ** i +(0.5 * 1) ** f64 +(0.5 * 1) ** i +(0.5 * 1) ^ i32 (0.5 * f64) ^ f32 -(0.5 * i32) ** f32 -(0.5 + 1) * i -(0.5 + 1) ** i64 -(0.5 + 1) / i +(0.5 * i) ^ i +(0.5 + 0.5) * f32 +(0.5 + 0.5) ^ i32 +(0.5 + 1) ^ i +(0.5 + f64) * f64 +(0.5 + f64) / i32 +(0.5 + i) ** i +(0.5 + i) ^ i +(0.5 + i64) ** f32 (0.5 + i64) / f32 -(0.5 - 0.5) ^ half(f64) -(0.5 - 1) * i64 -(0.5 - 1) ** i64 -(0.5 - f32) ** (0.5 * f64) -(0.5 - f64) * f64 +(0.5 + i64) / i +(0.5 - 0.5) * (i32 - 0.5) +(0.5 - 0.5) * i64 +(0.5 - 0.5) ** f32 +(0.5 - 1) * i32 +(0.5 - 1) ** f64 +(0.5 - 1) ^ i64 +(0.5 - f32) ** i +(0.5 - f64) * i (0.5 - f64) / f32 +(0.5 - f64) / f64 (0.5 - i) ^ f32 -(0.5 - i32) ** i64 -(0.5 - i32) ^ f64 +(0.5 - i32) ** (i32 * 1) +(0.5 - i32) / f64 +(0.5 - i32) ^ f32 +(0.5 - i64) * i +(0.5 - i64) / f64 +(0.5 - i64) / i64 +(0.5 / 0.5) ** f32 +(0.5 / 0.5) ** i32 (0.5 / 0.5) ^ f64 -(0.5 / f32) ** f32 -(0.5 / f32) ^ i32 -(0.5 / f64) ** i -(0.5 / f64) ** i32 +(0.5 / 1) ^ f32 +(0.5 / i) ** f64 +(0.5 / i) ** i (0.5 / i32) ** i -(0.5 / i64) ** f32 -(1 % i) ** f32 -(1 % i) ^ i -(1 % i64) ** f32 -(1 * 1) ** f64 -(1 * 1) ^ i -(1 * f32) ** f32 -(1 * i32) ** i -(1 * i64) ** i32 -(1 + 0.5) * f64 -(1 + 0.5) ^ i32 -(1 + 1) / i32 -(1 + 1) ^ i -(1 + f32) / f32 / i64 -(1 + f64) ** i64 -(1 + f64) / i32 -(1 + f64) ^ f64 -(1 + i32) / f32 -(1 + i64) / f64 -(1 - 0.5) / f64 -(1 - 0.5) ^ i32 -(1 - 1) * i -(1 - 1) * i32 -(1 - 1) ** f32 -(1 - 1) / i -(1 - f64) * 1 * i -(1 - f64) ^ i32 -(1 - i) ** i -(1 - i) / i64 -(1 - i32) ** i ^ 0.5 -(1 - i64) % i64 -(1 / 0.5) ^ f32 -(1 / 0.5) ^ f64 -(1 / 1) ** i32 -(1 / 1) ^ i32 -(1 / f64) ** f64 -(1 / i) ** i64 -(1 not in array) and none(list, true) -(f32 * 1) ** f32 -(f32 * 1) ** i64 -(f32 * i) ^ i64 -(f32 * i32) ** i -(f32 * i64) ** i64 -(f32 * i64) ^ i -(f32 + 0.5) / 0.5 ** 0.5 -(f32 + 1) ** i -(f32 + 1) / i -(f32 + 1) / i64 -(f32 + i32) ** i64 -(f32 + i64) ** i32 -(f32 - 0.5) * f64 -(f32 - 0.5) * i -(f32 - f32) ** f32 -(f32 - i) / f64 -(f32 - i) ^ i64 -(f32 - i64) * i64 -(f32 - i64) ** i64 -(f32 - i64) / i64 -(f32 / f64) ^ f32 -(f32 / f64) ^ i -(f32 / i32) ^ i32 -(f64 * 0.5) ^ i -(f64 * f64) ** i32 +(0.5 / i32) ^ f32 +(1 * 0.5) ** (f64 * 1) +(1 * 0.5) ** i32 +(1 * 0.5) ^ f64 +(1 * 1) ^ -1 +(1 * 1) ^ f32 +(1 * f32) ^ i32 +(1 * i) ** i32 +(1 * i32) ^ i +(1 * i64) ** i64 +(1 + 0.5) ** i +(1 + 1) * i64 +(1 + 1) / i +(1 + f32) ^ i +(1 + f64) ^ i +(1 + f64) ^ i32 +(1 + i) ** f32 +(1 + i) / f64 +(1 + i) ^ i64 +(1 + i32) * f64 +(1 + i32) ^ f64 +(1 - 0.5) * f32 ^ 1 +(1 - 0.5) * i64 +(1 - 0.5) / i +(1 - 0.5) ^ min(f32) +(1 - f32) * f32 +(1 - f64) ** f64 +(1 - i) * -i32 +(1 - i32) ^ f32 +(1 - i32) ^ i +(1 - i64) ** f32 +(1 - i64) / f64 +(1 - i64) / i64 +(1 / 0.5) ** f32 +(1 / 0.5) ^ i32 +(1 / 1) ** (f64 * 0.5) +(1 / 1) ^ ceil(i64) +(1 / 1) ^ max(0.5) +(1 / f32) ^ f32 +(1 / i) ^ f32 +(1 / i32) ^ i +(1 / i64) ** i64 +(f32 * 0.5) ** f64 +(f32 * 0.5) ^ i32 +(f32 * f32) ^ -f32 +(f32 * f32) ^ i +(f32 * i) ^ -1 +(f32 * i64) ** i +(f32 + f64) * i +(f32 + i) ^ f64 +(f32 - 0.5) / f64 +(f32 - 0.5) ^ f32 +(f32 - 1) / f64 +(f32 - 1) ^ f64 +(f32 - f32) / i64 +(f32 - i32) * i64 +(f32 / 0.5) ^ f32 +(f32 / i64) ^ f64 +(f64 * 0.5) ** f32 +(f64 * 0.5) ** i64 +(f64 * f32) ** f64 +(f64 * i64) ** f64 (f64 * i64) ** i32 -(f64 + f32) ** i64 -(f64 + i32) * f32 -(f64 + i64) / i32 -(f64 - 0.5) * -i -(f64 - 0.5) * i -(f64 - 0.5) / f32 -(f64 - 0.5) / i64 -(f64 - 0.5) ^ i -(f64 - 0.5) ^ i64 -(f64 - 1) * f32 -(f64 - f32) * i64 -(f64 - f64) / i32 -(f64 - i) * i32 ** 1 -(f64 - i64) / i64 -(f64 / 0.5) ** f64 -(f64 / i) ^ i64 -(false || ok) and ok -(i % 1) ** -f32 -(i % 1) ** f64 -(i % i) ** f32 -(i * 1) ** i -(i * f32) ** i32 -(i * f32) ^ f64 -(i * i) ^ count(array, true) -(i + 0.5) ** i32 -(i + 0.5) ^ f32 -(i + 1) % i32 +(f64 + 0.5) * f32 +(f64 + 0.5) * i64 +(f64 + f32) ** get(array, i) +(f64 + f32) ** i32 +(f64 + f64) * (i64 - i64) +(f64 + f64) ^ f64 +(f64 + i) * (0.5 + i64) +(f64 + i32) ^ i64 +(f64 + i64) ^ i +(f64 - 0.5) ** f64 +(f64 - 1) ** i64 +(f64 - 1) ^ i32 +(f64 - f32) ** i +(f64 - f32) ^ i64 +(f64 - i) * i32 +(f64 - i32) / i +(f64 - i64) ** i +(f64 - i64) / f32 +(f64 - i64) / f64 +(f64 / 1) ** i64 +(f64 / f32) ^ i +(f64 / f64) ** i32 +(f64 / f64) ^ i32 ** 0.5 +(false || ok) == ok +(i % i) ^ i +(i % i32) ^ (1 - i32) +(i % i64) ^ f64 +(i * 0.5) ** f32 +(i * 1) ^ f64 +(i * 1) ^ i +(i * i64) ** f32 +(i + 0.5) ** half(f64) +(i + 1) % i64 (i + 1) / i64 -(i + f64) ^ (f32 * f64) -(i + i) * -f64 -(i + i32) ^ i64 -(i - 0.5) / f32 -(i - 0.5) ^ f64 -(i - 1) ** i64 -(i - 1) / f32 -(i - 1) ^ f64 -(i - i64) ** f64 -(i - i64) ^ i -(i / 0.5) ^ i32 -(i / 1) ** f64 -(i / 1) ** i64 -(i / i32) ^ f32 -(i < i32 ? nil : f64) ** f64 -(i32 * 1) ** f32 -(i32 * f32) ^ i64 -(i32 * i) ^ i -(i32 * i32) ** f64 -(i32 + 0.5) / f64 -(i32 + 0.5) ^ i64 -(i32 + 1) * f64 -(i32 + 1) ** float(1) -(i32 + 1) / i -(i32 + 1) / i64 -(i32 + f32) ** f32 -(i32 + f64) ** i -(i32 + i32) * i32 -(i32 + i32) / i64 -(i32 + i64) ^ i -(i32 - 0.5) * i64 -(i32 - f32) * i32 -(i32 - i32) ** i -(i32 - i32) ** i64 -(i32 / 0.5) ^ i32 -(i32 / i32) ^ f32 -(i32 / i32) ^ i -(i64 * 0.5) ^ f32 -(i64 * 1) ** i64 -(i64 * 1) ^ f32 -(i64 * 1) ^ f64 -(i64 * f32) ** findIndex(list, ok) -(i64 + 1) * i32 -(i64 + f32) ^ f64 -(i64 + f64) / 1 * 1 -(i64 + f64) ^ f64 -(i64 + i) ^ i64 -(i64 + i32) * f32 -(i64 - 0.5) * i64 -(i64 - 0.5) / i32 -(i64 - i) % i32 -(i64 - i32) / len(array) -(i64 - i64) / i64 -(i64 / f64) ** f32 -(i64 / i32) ** f32 -(i64 / i32) ** i -(i64 / i32) ^ -1 -(i64 not in array) && ok -(ok && ok) == ok -(ok or false) and ok -(ok or ok) == not false -(ok || true) && i32 >= f64 +(i + i) ^ i64 +(i + i32) * i64 ^ f64 +(i + i32) / i32 +(i + i32) ^ f32 +(i + i64) ^ i32 +(i - 0.5) / i64 +(i - 1) ^ i64 +(i / 0.5) ** f32 +(i / f32) ^ f64 +(i32 % 1) ** f32 +(i32 % i) ** f32 +(i32 % i32) ** i32 +(i32 % i32) ^ i32 +(i32 * 0.5) ^ f32 +(i32 * 1) ^ i32 +(i32 + 0.5) ** i64 +(i32 + f32) * i64 +(i32 + f64) / i +(i32 + i) / i +(i32 + i32) ^ i32 +(i32 - 0.5) * f64 +(i32 - 0.5) / i64 +(i32 - 1) ^ f64 +(i32 - f32) / i64 +(i32 - i) % i64 +(i32 - i) / f32 +(i32 - i32) ^ (i32 * i) +(i32 - i64) * i32 +(i32 - i64) * i32 * i64 +(i32 / i) ** f32 +(i32 / i) ^ i64 +(i32 < f64 ? nil : i) .. i32 +(i32 not in array) and ok +(i64 % i) ** f32 +(i64 * 0.5) ^ f64 +(i64 * f32) ^ i64 +(i64 * f64) ^ i32 +(i64 * i) ** score(1) +(i64 * i64) ** i ** 0.5 +(i64 * i64) ^ i +(i64 + 0.5) * f32 +(i64 + 0.5) ** i64 +(i64 + 1) % i +(i64 + 1) ^ i +(i64 + f32) * -i32 +(i64 + f32) ** i32 +(i64 + f32) / f64 +(i64 + f32) / i +(i64 + f32) / i32 +(i64 + f64) * i32 +(i64 + i) % i64 +(i64 + i) / f64 +(i64 + i32) * i64 +(i64 + i64) / i64 +(i64 - 0.5) / f64 +(i64 - 0.5) ^ i64 +(i64 - 1) ^ i32 +(i64 - f32) ** f64 +(i64 - f32) ^ i64 +(i64 - i) ** i +(i64 - i32) * i64 +(i64 / 1) ** f32 +(i64 / f64) ** i32 +(nil not in array) || ok +(ok || true) && (ok or true) +-((i64 + 1) % i32) -(0.5 * 0.5) -(0.5 * 1) -(0.5 * f32) @@ -1003,7 +1081,6 @@ -(0.5 - i32) -(0.5 - i64) -(0.5 / 0.5) --(0.5 / 0.5) < i32 -(0.5 / 1) -(0.5 / f32) -(0.5 / f64) @@ -1024,6 +1101,7 @@ -(1 * 0.5) -(1 * 1) -(1 * f32) +-(1 * f64) -(1 * i) -(1 * i32) -(1 * i64) @@ -1081,12 +1159,10 @@ -(f32 + f32) -(f32 + f64) -(f32 + i) --(f32 + i32) -(f32 + i64) -(f32 - 0.5) -(f32 - 1) --(f32 - f64) --(f32 - i - f32) +-(f32 - f32) -(f32 - i) -(f32 - i32) -(f32 - i64) @@ -1100,6 +1176,7 @@ -(f32 ^ 0.5) -(f32 ^ 1) -(f32 ^ f32) +-(f32 ^ f64) -(f32 ^ i) -(f32 ^ i32) -(f32 ^ i64) @@ -1116,7 +1193,6 @@ -(f64 ** f64) -(f64 ** i) -(f64 ** i32) --(f64 ** i32) > i32 -(f64 ** i64) -(f64 + 0.5) -(f64 + 1) @@ -1129,14 +1205,12 @@ -(f64 - f32) -(f64 - f64) -(f64 - i) --(f64 - i32) -(f64 - i64) -(f64 / 0.5) -(f64 / 1) -(f64 / f32) -(f64 / f64) -(f64 / i) --(f64 / i32) -(f64 / i64) -(f64 ^ 0.5) -(f64 ^ 1) @@ -1149,7 +1223,6 @@ -(i % i) -(i % i32) -(i % i64) --(i % score(1)) -(i * 0.5) -(i * 1) -(i * f32) @@ -1157,37 +1230,38 @@ -(i * i) -(i * i32) -(i * i64) +-(i ** 0.5) -(i ** 1) --(i ** f32) -(i ** f64) -(i ** i) -(i ** i32) -(i ** i64) --(i ** int(i)) -(i + 0.5) -(i + 1) --(i + f32) --(i + f64) --(i + i) +-(i + i32) -(i + i64) -(i - 0.5) -(i - 1) -(i - f32) -(i - f64) +-(i - i ** 1) -(i - i) -(i - i32) +-(i - i64) -(i / 0.5) -(i / 1) -(i / f32) -(i / f64) -(i / i) -(i / i32) +-(i / i64) -(i ^ 0.5) -(i ^ 1) -(i ^ f32) -(i ^ f64) -(i ^ i) --(i32 % 1 % i) +-(i ^ i32) +-(i ^ i64) -(i32 % 1) -(i32 % i) -(i32 % i32) @@ -1202,11 +1276,11 @@ -(i32 ** 0.5) -(i32 ** 1) -(i32 ** f32) +-(i32 ** f64) -(i32 ** i) -(i32 ** i32) -(i32 ** i64) -(i32 + 0.5) --(i32 + 1 ^ i64) -(i32 + 1) -(i32 + f32) -(i32 + f64) @@ -1222,7 +1296,6 @@ -(i32 - i64) -(i32 / 0.5) -(i32 / 1) --(i32 / f32) -(i32 / f64) -(i32 / i) -(i32 / i32) @@ -1232,6 +1305,8 @@ -(i32 ^ f32) -(i32 ^ f64) -(i32 ^ i) +-(i32 ^ i32) +-(i32 ^ i64) -(i64 % 1) -(i64 % i) -(i64 % i32) @@ -1254,17 +1329,16 @@ -(i64 + 1) -(i64 + f32) -(i64 + f64) --(i64 + i) -(i64 + i32) -(i64 + i64) -(i64 - 0.5) -(i64 - 1) +-(i64 - f32) -(i64 - f64) -(i64 - i) -(i64 - i32) -(i64 - i64) -(i64 / 0.5) --(i64 / 1 / 1) -(i64 / 1) -(i64 / f32) -(i64 / f64) @@ -1278,248 +1352,285 @@ -(i64 ^ i) -(i64 ^ i32) -(i64 ^ i64) --(max(0.5) + i64) ---(1 * i64) ---(i64 * 1) ----1 ----i +-(max(f32) ^ i32) +-(min(0.5) ^ i32) +--(f64 ** 0.5) +--(i64 ** i64) --0.5 --1 ---abs(f64) +--ceil(1) --f32 --f64 +--f64 ** i64 +--float(f64) --i --i32 --i64 ---max(0.5) --0.5 != 1 ? array : f64 -0.5 != f32 --0.5 != f64 ** 0.5 -0.5 != i32 --0.5 != max(i64) +-0.5 * 1 ** 1 +-0.5 * f32 -0.5 * f64 --0.5 * i -0.5 * i32 -0.5 * i64 --0.5 * len(array) +-0.5 ** -1 +-0.5 ** ceil(i) -0.5 ** f32 +-0.5 ** f64 -0.5 ** i -0.5 ** i32 -0.5 ** i64 --0.5 + f32 -0.5 + f64 --0.5 + f64 / f64 -0.5 + i -0.5 + i32 --0.5 - -i32 --0.5 - 1 + 1 +-0.5 + i64 +-0.5 - abs(i) -0.5 - f32 -0.5 - f64 -0.5 - i -0.5 - i32 --0.5 - i32 * i --0.5 / (f32 + 0.5) --0.5 / -i32 +-0.5 - i64 -0.5 / f32 --0.5 / f64 --0.5 / float(f64) -0.5 / i --0.5 / i64 --0.5 / i64 ** 1 --0.5 < f32 --0.5 < f64 +-0.5 / i32 -0.5 < i32 --0.5 < i32 ? false : "bar" --0.5 < i32 ^ f64 --0.5 <= 1 == false +-0.5 < i64 +-0.5 <= 0.5 + 0.5 -0.5 <= f32 --0.5 <= f64 --0.5 <= f64 + f32 +-0.5 <= i +-0.5 <= i32 -0.5 <= i64 -0.5 == f32 --0.5 == f64 / 0.5 +-0.5 == f64 -0.5 == i -0.5 == i32 +-0.5 == i32 ^ i32 -0.5 == i64 -0.5 > f32 --0.5 > f64 --0.5 > i32 --0.5 > i64 +-0.5 > i +-0.5 >= f32 +-0.5 >= f32 ? f32 : i32 -0.5 >= f64 -0.5 >= i -0.5 >= i32 -0.5 >= i64 -0.5 ^ f32 -0.5 ^ f64 --0.5 ^ i +-0.5 ^ float(f64) -0.5 ^ i32 -0.5 ^ i64 +-0.5 in array +-0.5 not in sort(array) +-1 != -i +-1 != f32 -1 != f64 --1 != i +-1 != i32 -1 != i64 --1 != i64 * f32 +-1 % i -1 % i32 --1 % i64 --1 * 1 ** i64 +-1 * array[i] -1 * f32 +-1 * f64 +-1 * i -1 * i32 -1 * i64 +-1 ** (f32 + f32) +-1 ** (i + i64) +-1 ** ceil(0.5) -1 ** f32 +-1 ** f64 -1 ** i --1 ** i64 --1 + 1 + 0.5 +-1 ** i64 ^ 1 +-1 + -i32 -1 + f32 --1 + half(f64) +-1 + f64 -1 + i +-1 + i32 -1 + i64 --1 - f32 +-1 + reduce(array, #) +-1 + reduce(list, f32) +-1 - f64 -1 - i +-1 - i % i32 -1 - i32 -1 - i64 -1 .. i --1 .. i32 -1 .. i64 --1 / 1 * 1 -1 / f32 +-1 / f64 +-1 / i -1 / i32 --1 < 0.5 ^ i64 --1 < f32 --1 < f64 * 1 --1 < i32 +-1 < f64 +-1 < i -1 < i64 --1 <= f32 --1 <= f32 == true +-1 <= -1 -1 <= f64 +-1 <= i -1 <= i32 +-1 <= i64 -1 == f32 -1 == f64 --1 == nil != nil --1 > -i32 +-1 == floor(f64) +-1 == i +-1 == i32 +-1 == i64 -1 > f32 --1 > half(0.5) -1 > i --1 > i32 -1 > i64 --1 > i64 ? array : nil --1 >= 0.5 * 0.5 --1 >= f32 +-1 >= f32 * f32 -1 >= f64 -1 >= i32 --1 >= i32 - 1 -1 >= i64 -1 ^ f32 -1 ^ f64 +-1 ^ i32 -1 ^ i64 -1 in array -1 not in array --abs(0.5 * f64) -abs(0.5) -abs(1) --abs(1) .. i -abs(f32) -abs(f64) -abs(i) -abs(i32) -abs(i64) --add(1, 1) -add(i, 1) +-add(i, i) -array[1] -array[i32] -array[i64] -array[i] +-bitand(i64, i32) +-bitnand(1, i) +-bitnot(1) +-bitnot(i) +-bitnot(i32) +-bitnot(i64) +-bitor(1, i64) +-bitor(i, i32) +-bitshl(i, 1) +-bitshl(i, i32) +-bitshl(i, i64) +-bitshl(i64, i32) +-bitshr(i, i) +-bitshr(i64, i32) +-bitushr(i, i32) +-bitxor(1, 1) +-bitxor(i, i32) +-ceil(0.5) +-ceil(1) +-ceil(f32) +-ceil(f64) +-ceil(i) +-ceil(i32) +-ceil(i64) -count(array, false) -count(array, ok) -count(array, true) -count(list, ok) -count(list, true) -div(1, 1) --div(1, i) --div(i, i) -f32 --f32 != 1 / i --f32 != f32 --f32 != f64 --f32 != i64 --f32 * 1 ** i32 --f32 * f32 +-f32 != i32 +-f32 * i64 +-f32 ** (i + 1) -f32 ** f32 --f32 ** f32 ** 1 +-f32 ** f64 +-f32 ** i +-f32 ** i32 -f32 ** i64 --f32 + f32 -f32 + i32 --f32 + i64 --f32 - f32 --f32 - f64 -f32 - i --f32 - i32 --f32 - i64 +-f32 - round(i) -f32 / f32 --f32 / i32 --f32 / i64 +-f32 / f64 +-f32 / i +-f32 < f32 ** 0.5 -f32 < f64 +-f32 < i -f32 < i32 --f32 < i64 +-f32 <= f32 -f32 <= i -f32 <= i32 +-f32 <= i64 -f32 == f32 -f32 == f64 --f32 == i --f32 == i32 --f32 == i64 +-f32 > 0.5 ? f32 : "bar" -f32 > f32 -f32 > f64 --f32 > i --f32 > i64 --f32 >= 1 / f32 -f32 >= f32 -f32 >= f64 -f32 >= i64 --f32 ^ f32 --f32 ^ f64 +-f32 ^ i +-f32 ^ i32 -f32 ^ i64 --f32 ^ min(f64) +-f32 in array +-f32 not in array -f64 +-f64 != f32 -f64 != f64 -f64 != i --f64 != i64 +-f64 != i32 +-f64 * -1 +-f64 * -f64 +-f64 * f32 -f64 * f64 +-f64 * i +-f64 * i32 +-f64 * i64 +-f64 ** 0.5 ** f32 -f64 ** f32 +-f64 ** i -f64 ** i32 --f64 ** i64 -f64 + f32 --f64 + i32 -f64 + i64 --f64 - 0.5 / i32 --f64 - f64 +-f64 - 0.5 / i64 +-f64 - f32 +-f64 - i -f64 - i32 +-f64 - i64 +-f64 - int(f64) +-f64 / f32 -f64 / f64 -f64 / i +-f64 / i32 -f64 / i64 --f64 < f32 +-f64 < 0.5 ^ f32 +-f64 < f64 +-f64 < f64 ** 1 +-f64 < half(0.5) +-f64 < half(f64) -f64 < i +-f64 < i ^ f32 +-f64 < i32 +-f64 < i64 -f64 <= f32 -f64 <= f64 --f64 <= i32 --f64 == f32 +-f64 == f64 -f64 == i -f64 == i32 +-f64 == i64 +-f64 > f32 +-f64 > f32 ? false : array -f64 > f64 -f64 > i32 -f64 > i64 +-f64 >= f32 +-f64 >= f32 / f64 -f64 >= f64 --f64 >= f64 ^ 0.5 --f64 >= i --f64 ^ 0.5 ** i64 +-f64 >= i32 -f64 ^ f32 -f64 ^ f64 --f64 ^ i --f64 ^ i32 -f64 ^ i64 +-f64 not in array -find(array, ok) -find(array, true) +-findIndex(array, # <= #) -findIndex(array, ok) -findIndex(array, true) -findIndex(list, ok) +-findIndex(list, true) +-findLast(array, # <= #) -findLast(array, ok) -findLast(array, true) -findLastIndex(array, ok) @@ -1527,847 +1638,971 @@ -findLastIndex(list, ok) -findLastIndex(list, true) -first(array) --float(-1) +-float(0.5 ** 0.5) +-float(0.5 ^ 0.5) -float(0.5) -float(1) --float(f32 ** 0.5) +-float(bitnot(i64)) -float(f32) -float(f64) -float(i) -float(i32) -float(i64) +-floor(0.5) +-floor(1) +-floor(f32) +-floor(f64) +-floor(i) +-floor(i32) +-floor(i64) -get(array, 1) -get(array, i) -get(array, i32) -get(array, i64) +-half(-0.5) -half(-1) -half(0.5) +-half(1) +-half(f32 + i64) -half(f64) +-half(median(array)) -i +-i != f32 -i != f64 +-i != f64 ? foo : 1 +-i != i +-i != i + f64 -i != i32 --i != i32 * 1 -i != i64 --i % i -i % i32 -i % i64 --i * f32 +-i * abs(0.5) -i * f64 --i * i32 +-i * i -i * i64 +-i * reduce(array, 0.5) -i ** f32 -i ** f64 --i ** i32 --i ** i64 +-i ** i -i + f32 --i + i +-i + f64 -i + i32 --i + i64 +-i + i64 * 1 -i - f32 --i - f64 --i - i -i - i64 --i .. i32 --i / f64 --i / i --i / i32 +-i .. i +-i .. i64 +-i / f32 -i / i64 -i < f32 +-i < half(1) +-i < i -i < i64 +-i <= 0.5 ? half : "bar" +-i <= 1 - 0.5 -i <= f32 +-i <= i -i <= i32 --i == -0.5 --i == 1 ** f64 --i == 1 + 0.5 +-i <= i64 +-i <= i64 ** 0.5 +-i == f32 +-i == f64 +-i == f64 ^ f32 +-i == i +-i == i32 -i > f32 -i > i -i > i32 -i >= f32 --i >= i32 --i ^ -i +-i >= f64 +-i >= i +-i >= i64 +-i >= score(1) +-i ^ 0.5 ** 0.5 +-i ^ f32 +-i ^ f32 ^ 0.5 -i ^ f64 --i ^ i32 +-i ^ i +-i ^ i64 +-i in array -i not in array -i32 -i32 != f32 --i32 != f64 -i32 != i +-i32 != i32 ** 1 -i32 != i64 +-i32 % i -i32 % i32 -i32 % i64 --i32 * f32 --i32 * f64 -i32 * i -i32 * i32 +-i32 * i64 +-i32 ** f32 -i32 ** f64 --i32 ** i32 -i32 ** i64 --i32 + 1 + i -i32 + f32 --i32 + f64 -i32 + i -i32 + i32 --i32 - i32 --i32 - i64 --i32 .. i --i32 .. i64 --i32 / (i32 - f64) --i32 / f64 --i32 / i --i32 < 0.5 * 1 --i32 < f32 --i32 < f64 - f64 +-i32 - f32 +-i32 .. i32 +-i32 / i32 +-i32 / i64 +-i32 < i -i32 < i32 -i32 < i64 --i32 <= 0.5 ? f64 : 1 --i32 <= f32 +-i32 < round(f64) -i32 <= f64 --i32 <= f64 + i +-i32 <= i +-i32 <= i32 +-i32 <= i64 +-i32 == 1 % i -i32 == f32 --i32 == i32 +-i32 == f64 +-i32 == i64 +-i32 == max(1) +-i32 > f32 +-i32 > f64 -i32 > i +-i32 > i ** 0.5 -i32 > i32 -i32 > i64 --i32 >= f32 -i32 >= f64 --i32 >= i64 --i32 ^ (i - 0.5) --i32 ^ i +-i32 >= i +-i32 >= i == nil +-i32 >= i32 +-i32 ^ f32 -i32 ^ i32 -i32 ^ i64 --i32 ^ i64 ** i32 +-i32 ^ score(1) -i32 in array --i32 not in array -i64 --i64 != i --i64 != i ? i : foo +-i64 != f32 +-i64 != f64 +-i64 != i32 -i64 != i64 --i64 % i --i64 % i32 +-i64 != i64 ? score : foo +-i64 * (1 + f64) -i64 * f32 --i64 * f64 -i64 * i -i64 * i32 -i64 * i64 --i64 ** f64 --i64 ** i64 --i64 + 0.5 * i32 --i64 + f64 +-i64 * indexOf("foo", "bar") +-i64 ** i +-i64 ** i32 +-i64 + f32 -i64 + i +-i64 + i32 +-i64 + i64 -i64 - f32 --i64 - f64 +-i64 - i -i64 - i32 --i64 - i64 -i64 .. i -i64 .. i32 --i64 / f32 --i64 / i --i64 / i64 --i64 / i64 * f32 --i64 < -0.5 +-i64 .. i64 +-i64 / f64 +-i64 / i32 -i64 < f32 -i64 < f64 --i64 < i +-i64 < half(f64) -i64 < i32 -i64 < i64 +-i64 <= i -i64 <= i32 --i64 <= i64 +-i64 == 1 ^ i64 -i64 == f32 +-i64 == f64 -i64 == i -i64 == i32 --i64 == i64 -i64 > f32 -i64 > f64 +-i64 > i -i64 > i32 +-i64 >= f32 -i64 >= i -i64 >= i32 --i64 >= i64 -i64 ^ f64 +-i64 ^ float(i) +-i64 ^ i -i64 ^ i32 -i64 ^ i64 +-i64 in array -i64 not in array --i64 not in sort(array) -int(0.5) -int(1) -int(f32) -int(f64) -int(i) -int(i32) --int(i64 - i) -int(i64) --int(int(1)) -last(array) -len("bar") -len("foo") --len([foo]) -len(array) --len(false ? greet : "foo") -len(list) --max(0.5 * i) -max(0.5) --max(0.5, 1) +-max(0.5, 0.5, f64) -max(1) -max(f32) --max(f32, 0.5, f32) --max(f32, i64) -max(f64) -max(i) --max(i, 1) --max(i, i64) +-max(i, 0.5) +-max(i32 - 1) -max(i32) --max(i32, 0.5) +-max(i32, f32) +-max(i64 * 0.5) -max(i64) --max(score(1)) +-max(i64, f64) +-max(i64, i) +-mean(array) +-median(array) +-min(-1) -min(0.5) --min(0.5, 1) --min(0.5, i32) -min(1) --min(1, f32) +-min(1, 0.5) -min(f32) --min(f32, 0.5) +-min(f32, 1) -min(f64) --min(f64, 0.5) --min(f64, f32) --min(f64, i64) +-min(float(0.5)) -min(i) --min(i, i) +-min(i, 1) -min(i32) --min(i32, 1) --min(i32, f64) +-min(i32, 0.5) -min(i64) --min(i64, f32) --min(i64, f64) +-min(i64, i, 0.5) +-reduce(array, #) +-reduce(array, -#) +-reduce(array, 0.5) +-reduce(array, 1) +-reduce(array, 1) - f32 +-reduce(array, f64) +-reduce(array, i) +-reduce(array, i32) +-reduce(array, i64) +-reduce(list, 0.5) +-reduce(list, 1) +-reduce(list, f32) +-reduce(list, f64) +-reduce(list, i) +-reduce(list, i32) +-round(0.5) +-round(1) +-round(f32) +-round(f64) +-round(i) +-round(i32) +-round(i64) -score(1) -score(1, 1) -score(1, i) -score(i) --score(i, 1) --score(i32 * i) -0.5 != 0.5 ? f64 : half -0.5 != 0.5 ? i64 : f64 -0.5 != 0.5 ? list : array -0.5 != 0.5 or ok -0.5 != f32 || 0.5 > 0.5 -0.5 != i && i64 > 1 -0.5 != i64 != ok -0.5 != i64 ? -f32 : add -0.5 != nil or ok -0.5 * 0.5 != i / 1 -0.5 * 0.5 * i -0.5 * 0.5 * i32 -0.5 * 0.5 + i32 -0.5 * 0.5 - i +-score(i32 + i) +-score(int(i)) +-sum(array) +-sum(i .. 1) +0.5 != 0.5 == ok +0.5 != f64 ? list : f32 +0.5 != f64 and !true +0.5 != f64 and ok +0.5 != i == ok +0.5 != i32 && ok +0.5 != i32 == ok +0.5 != i32 ? ok : ok +0.5 != i32 and 1 > f64 +0.5 != nil == ok +0.5 * 0.5 * f64 +0.5 * 0.5 / f32 0.5 * 0.5 / f64 -0.5 * 0.5 / i32 -0.5 * 0.5 < f32 -0.5 * 0.5 < i -0.5 * 0.5 > i32 -0.5 * 1 + f32 -0.5 * 1 + half(f64) -0.5 * 1 < f64 -0.5 * 1 > f64 +0.5 * 0.5 < f64 +0.5 * 0.5 >= i64 +0.5 * 1 * i64 +0.5 * 1 <= f32 0.5 * 1 > i32 -0.5 * f32 / i64 +0.5 * 1 not in array +0.5 * f32 * f32 +0.5 * f32 * i32 +0.5 * f32 + f32 +0.5 * f32 - f64 +0.5 * f32 / half(1) 0.5 * f32 == i32 -0.5 * f64 * f64 -0.5 * f64 + i64 -0.5 * f64 > i -0.5 * f64 >= i -0.5 * f64 >= i64 -0.5 * i - i -0.5 * i / i64 -0.5 * i / i64 ^ 0.5 -0.5 * i == f32 -0.5 * i32 < i32 -0.5 * i32 in [f64] -0.5 * i64 != f32 -0.5 * i64 != i -0.5 * i64 + f32 -0.5 * i64 <= i64 -0.5 ** 0.5 != i -0.5 ** 0.5 ** f32 -0.5 ** 0.5 / f32 -0.5 ** 0.5 / i -0.5 ** 0.5 < i / i32 -0.5 ** 0.5 == f32 -0.5 ** 0.5 == i32 -0.5 ** 1 + i64 -0.5 ** 1 / f32 -0.5 ** f32 < 1 / f64 -0.5 ** f32 < i -0.5 ** f32 < i32 -0.5 ** f32 < min(i64) -0.5 ** f32 == f64 -0.5 ** f32 ^ f32 -0.5 ** f32 ^ i64 -0.5 ** f64 * f32 -0.5 ** f64 + -i -0.5 ** i * 0.5 ** i -0.5 ** i < f32 -0.5 ** i <= i32 -0.5 ** i > f32 -0.5 ** i ^ f64 -0.5 ** i32 != f64 -0.5 ** i32 <= i32 -0.5 ** i32 ^ f32 -0.5 ** i64 != f32 -0.5 ** i64 - f32 -0.5 ** i64 - i64 -0.5 ** i64 ^ min(i) -0.5 + 0.5 != i32 -0.5 + 0.5 - f32 -0.5 + 0.5 - i64 -0.5 + 0.5 < 1 ? f32 : score -0.5 + 0.5 <= f32 -0.5 + 0.5 == f64 -0.5 + 0.5 > i64 -0.5 + 0.5 >= i64 -0.5 + 1 != i -0.5 + 1 < f32 -0.5 + 1 >= i -0.5 + f32 != i -0.5 + f32 != i + i64 -0.5 + f32 >= i -0.5 + f64 == i32 -0.5 + f64 > f64 -0.5 + i > f32 -0.5 + i32 + i64 -0.5 + i32 < f32 -0.5 + i64 + f64 -0.5 + i64 < f64 -0.5 + i64 <= 0.5 + 1 -0.5 + i64 == i32 -0.5 + i64 >= i64 -0.5 - 0.5 != i64 -0.5 - 0.5 + i32 -0.5 - 0.5 - f64 -0.5 - 0.5 < 0.5 * f32 -0.5 - 0.5 == f32 -0.5 - 1 != i ? "foo" : div -0.5 - 1 + f32 -0.5 - 1 - f64 -0.5 - 1 <= i32 -0.5 - 1 <= i64 -0.5 - f32 + i -0.5 - f64 <= i32 -0.5 - i - i32 -0.5 - i > f64 -0.5 - i > i -0.5 - i32 + 0.5 ^ i -0.5 - i32 + f32 -0.5 - i32 < i -0.5 - i32 <= i64 -0.5 - i64 == f64 -0.5 - i64 > f32 -0.5 - i64 >= f64 -0.5 - i64 >= i -0.5 / 0.5 != i32 -0.5 / 0.5 / i -0.5 / 0.5 / i32 -0.5 / 0.5 < i -0.5 / 0.5 == i -0.5 / 0.5 >= i32 -0.5 / 0.5 >= min(i32) -0.5 / 1 != i32 == nil -0.5 / 1 - i -0.5 / 1 < f32 -0.5 / 1 < i32 -0.5 / 1 == i64 -0.5 / 1 > 1 ** 0.5 -0.5 / f32 != i32 +0.5 * f32 > i +0.5 * f64 != i64 +0.5 * f64 < i +0.5 * f64 <= i +0.5 * i + i +0.5 * i + mean(array) +0.5 * i - i32 +0.5 * i == 0.5 ? ok : ok +0.5 * i32 / f32 +0.5 * i64 < f64 +0.5 * i64 == 1 ** i64 +0.5 ** 0.5 != i64 +0.5 ** 0.5 * max(1) +0.5 ** 0.5 ** i64 +0.5 ** 0.5 + -f32 +0.5 ** 0.5 < f64 +0.5 ** 0.5 == i +0.5 ** 0.5 ^ f32 +0.5 ** 0.5 not in array +0.5 ** 1 != i +0.5 ** 1 != i32 +0.5 ** 1 - f64 +0.5 ** 1 / f64 +0.5 ** 1 / i32 +0.5 ** 1 ^ i64 +0.5 ** f32 + f32 / i64 +0.5 ** f32 <= f32 +0.5 ** f32 ^ i +0.5 ** f64 * f64 +0.5 ** f64 > f64 ? 1 : nil +0.5 ** f64 >= i64 +0.5 ** i / i +0.5 ** i > i +0.5 ** i32 * i32 +0.5 ** i32 > f64 +0.5 ** i32 >= mean(array) +0.5 + 0.5 != i +0.5 + 0.5 == i32 +0.5 + 0.5 > f32 +0.5 + 1 != f64 +0.5 + 1 + i32 +0.5 + 1 - i32 +0.5 + 1 < float(1) +0.5 + 1 == f32 +0.5 + f32 - i64 +0.5 + f32 <= ceil(f32) +0.5 + f32 <= i32 +0.5 + f32 > f32 +0.5 + f64 != i64 +0.5 + f64 <= i32 +0.5 + f64 == 1 / 0.5 +0.5 + i + i +0.5 + i > i64 +0.5 + i in array +0.5 + i32 - i64 +0.5 + i32 <= f32 +0.5 + i64 - i +0.5 + i64 > i64 * 0.5 +0.5 - 0.5 - i32 +0.5 - 0.5 >= f32 +0.5 - 0.5 >= i +0.5 - 0.5 >= i32 +0.5 - 1 + i +0.5 - 1 + i / i +0.5 - 1 <= f64 +0.5 - f32 != i64 +0.5 - f32 >= i64 +0.5 - f64 - f32 +0.5 - f64 < i +0.5 - f64 in array +0.5 - i != i64 +0.5 - i + i +0.5 - i > f32 +0.5 - i32 != f32 +0.5 - i64 + -f64 +0.5 - i64 == i +0.5 - i64 not in array +0.5 / 0.5 + i +0.5 / 0.5 - i +0.5 / 0.5 - i32 +0.5 / 0.5 - i64 +0.5 / 0.5 / half(0.5) +0.5 / 0.5 < i32 +0.5 / 0.5 == i64 +0.5 / 0.5 >= f32 +0.5 / 0.5 >= f64 +0.5 / 1 * i +0.5 / 1 / f64 +0.5 / 1 < f64 +0.5 / 1 == i +0.5 / 1 > f32 +0.5 / 1 >= i32 +0.5 / 1 not in array 0.5 / f32 * f64 -0.5 / f64 / i -0.5 / f64 <= f64 -0.5 / f64 == i -0.5 / f64 == i64 -0.5 / f64 >= f64 ^ 1 -0.5 / i < f64 ? i64 : i64 +0.5 / f64 + f64 +0.5 / f64 - i +0.5 / f64 / f64 +0.5 / f64 < i +0.5 / f64 == f32 +0.5 / i != i64 +0.5 / i * i64 +0.5 / i / i32 0.5 / i <= i -0.5 / i == i64 - f32 -0.5 / i32 + i32 -0.5 / i32 < f32 +0.5 / i32 + i64 +0.5 / i32 > i ^ i +0.5 / i32 > i64 +0.5 / i32 >= f64 +0.5 / i64 != f64 +0.5 / i64 != i +0.5 / i64 != min(f32) 0.5 / i64 * i32 -0.5 < 0.5 == nil ? true : foo -0.5 < 0.5 || ok -0.5 < 1 and ok -0.5 < 1 or fromJSON("foo")?.Bar -0.5 < f32 ? map(list, i32) : i -0.5 < f64 != false ? f32 : score -0.5 < f64 ? list : greet -0.5 < f64 || ok -0.5 < i ? f64 : foo -0.5 < i32 or i32 == 1 -0.5 < i64 or ok -0.5 <= 0.5 and ok -0.5 <= 1 ? half : greet -0.5 <= array[i32] -0.5 <= f32 or ok -0.5 <= f64 and !true -0.5 <= f64 or ok -0.5 <= i == ok -0.5 <= i and nil == list -0.5 <= i32 and i < i64 -0.5 <= i64 && f64 >= f64 -0.5 == 0.5 ? score : i -0.5 == 1 == ok -0.5 == 1 == ok ? "foo" : div -0.5 == 1 or ok -0.5 == 1 || nil != score -0.5 == f32 ? score : i32 -0.5 == f64 && ok -0.5 == nil || div != score +0.5 < 0.5 ? f32 : array +0.5 < 0.5 ? foo : greet +0.5 < 1 == ok +0.5 < 1 || ok +0.5 < f32 && ok +0.5 < f32 || ok +0.5 <= 0.5 ? half : trimPrefix(nil) +0.5 <= f64 ? i : i64 +0.5 <= f64 || ok +0.5 == 1 and ok +0.5 == 1 || ok +0.5 == array[ok ? 0.5 : score] +0.5 == f32 and i64 == i32 +0.5 == f64 ? i : (false ? i : i64) +0.5 == f64 and i64 == 0.5 +0.5 == i or ok +0.5 == i32 and ok +0.5 == i64 and ok +0.5 == nil or "foo" endsWith "bar" +0.5 == nil or ok 0.5 == nil || ok -0.5 > 1 == ok -0.5 > 1 or ok -0.5 > f32 or !true -0.5 > f64 != ok -0.5 >= 0.5 == ok -0.5 >= 0.5 || ok -0.5 >= 1 != ok -0.5 >= 1 and ok -0.5 >= i32 && i > f32 -0.5 >= i64 and ok -0.5 ^ 0.5 != i32 -0.5 ^ 0.5 + i32 -0.5 ^ 0.5 / i -0.5 ^ 0.5 < f64 -0.5 ^ 0.5 > i -0.5 ^ 0.5 > i64 +0.5 > 0.5 == ok +0.5 > array[i64] +0.5 > f32 and ok +0.5 > i && 0.5 < i64 +0.5 > i64 ? -i : array +0.5 >= 0.5 ? array[i64] : f32 +0.5 >= 0.5 and ok +0.5 >= i && 1 < 0.5 +0.5 >= i32 == ok +0.5 >= i32 and ok +0.5 ^ 0.5 == f64 0.5 ^ 0.5 >= i32 -0.5 ^ 1 * f64 -0.5 ^ 1 * i -0.5 ^ 1 + i64 -0.5 ^ 1 - -i -0.5 ^ 1 / i -0.5 ^ 1 == f32 -0.5 ^ 1 == i32 -0.5 ^ f32 + i32 +0.5 ^ 0.5 >= i64 +0.5 ^ 1 ** i64 +0.5 ^ 1 - f32 +0.5 ^ 1 < f32 +0.5 ^ 1 < i +0.5 ^ 1 <= i32 +0.5 ^ 1 > f64 / 1 +0.5 ^ 1 >= i +0.5 ^ f32 * i +0.5 ^ f32 ** i64 0.5 ^ f32 <= i32 -0.5 ^ f32 > f64 ? array : nil -0.5 ^ f32 >= f64 -0.5 ^ f32 ^ i32 -0.5 ^ f64 - i32 -0.5 ^ f64 > f32 -0.5 ^ f64 >= f32 -0.5 ^ f64 >= f64 -0.5 ^ f64 >= i -0.5 ^ f64 ^ i64 -0.5 ^ i == i64 -0.5 ^ i >= i32 -0.5 ^ i32 * i -0.5 ^ i32 * score(i) -0.5 ^ i32 / i -0.5 ^ i32 == i -0.5 ^ i64 < i -0.5 ^ i64 <= f32 -0.5 ^ i64 == f64 -0.5 ^ i64 > f64 -0.5 ^ i64 > i +0.5 ^ f32 > i64 +0.5 ^ f32 >= i +0.5 ^ f64 - i64 +0.5 ^ f64 / f32 +0.5 ^ f64 < f32 +0.5 ^ f64 > i32 +0.5 ^ i != f64 +0.5 ^ i * reduce(array, i) +0.5 ^ i ** floor(0.5) +0.5 ^ i / (0.5 + i32) +0.5 ^ i < -f64 +0.5 ^ i <= i32 +0.5 ^ i >= i64 +0.5 ^ i32 * reduce(list, f64) +0.5 ^ i32 ** f32 +0.5 ^ i32 < f32 ? ok : i32 +0.5 ^ i32 == i64 +0.5 ^ i32 ^ f64 +0.5 ^ i32 in array +0.5 ^ i64 * i +0.5 ^ i64 ** i +0.5 ^ i64 ** i64 0.5 ^ i64 > i32 -0.5 ^ i64 >= f32 -1 != 1 != hasPrefix("bar", "bar") -1 != array[i - 1] -1 != f32 && i32 <= 0.5 -1 != f32 == ok -1 != f32 ? i64 : foo -1 != f32 and i in array -1 != f64 != ok -1 != i32 ? score : greet -1 != i64 && ok -1 != i64 ? f32 : greet +0.5 in array != ok +0.5 in array && ok +1 != 0.5 != ok +1 != 0.5 and 1 == 1 +1 != 1 && ok +1 != 1 ? f64 : 0.5 > i +1 != 1 ? list : score +1 != f32 != ok +1 != f32 ? ok : half +1 != i or ok +1 != i64 ? add : div 1 != nil && ok -1 != nil ? half : foo -1 % 1 != f64 -1 % 1 * f32 -1 % 1 < f32 -1 % 1 > f32 -1 % 1 > i -1 % 1 >= i64 -1 % i / i32 -1 % i < f64 +1 != nil == ok +1 != nil or not false +1 % 1 != i +1 % 1 != i32 +1 % 1 % i +1 % 1 / f32 +1 % 1 / i32 +1 % 1 < f64 +1 % 1 < i +1 % 1 == f64 +1 % 1 == i ? nil : 0.5 +1 % 1 == i32 +1 % array[i32] +1 % array[i] +1 % i != -i64 +1 % i != 1 != nil +1 % i - i64 1 % i < i32 -1 % i == f32 -1 % i32 * i64 -1 % i32 < max(i64) -1 % i64 != f32 -1 % i64 * f64 -1 % i64 + f32 -1 % i64 .. i64 -1 % i64 <= i64 +1 % i >= f64 +1 % i >= i +1 % i not in array +1 % i32 != i +1 % i32 <= f32 +1 % i32 > i64 +1 % i32 >= f64 +1 % i64 - f32 +1 % i64 < score(i) 1 % i64 > f32 -1 % i64 > i32 -1 * 0.5 + i -1 * 0.5 - -i -1 * 0.5 <= f32 -1 * 0.5 > f32 -1 * 1 % i -1 * 1 + i32 -1 * 1 <= f64 -1 * array[i64] -1 * f32 < i -1 * f32 < i32 -1 * f32 <= i32 -1 * f64 * -i -1 * f64 * f32 -1 * f64 + i -1 * i % i -1 * i + f32 -1 * i < int(1) -1 * i <= 1 % 1 -1 * i > f32 +1 * 0.5 + f64 +1 * 0.5 + i32 +1 * 0.5 + round(f64) +1 * 0.5 / i +1 * 0.5 / i64 +1 * 0.5 < i64 +1 * 0.5 == f32 +1 * 0.5 >= f32 +1 * 1 - i32 +1 * 1 <= int(i) +1 * 1 >= f32 +1 * f32 != f64 - 0.5 +1 * f32 <= reduce(array, #) +1 * f32 >= f64 +1 * f64 * i64 +1 * f64 <= i64 +1 * f64 > i +1 * f64 >= f64 +1 * i * f32 +1 * i - i32 +1 * i / f64 +1 * i < f32 +1 * i > i32 1 * i not in array -1 * i32 % i64 -1 * i32 * i32 -1 * i32 / i32 -1 * i32 > f32 -1 * i64 + f64 -1 * i64 == i32 -1 * i64 > i64 -1 ** 0.5 * f64 -1 ** 0.5 - i -1 ** 0.5 > i32 +1 * i32 + i32 +1 * i32 - i +1 * i32 < i +1 * i64 * f32 +1 * i64 + i +1 * i64 - f64 +1 * i64 / f64 +1 * i64 <= f64 +1 * i64 in array +1 ** 0.5 * i +1 ** 0.5 ** f32 +1 ** 0.5 ** f64 +1 ** 0.5 ** i64 +1 ** 0.5 - f32 +1 ** 0.5 - i32 +1 ** 0.5 - i64 +1 ** 0.5 < -f32 +1 ** 0.5 > i +1 ** 0.5 > i64 1 ** 0.5 ^ f64 -1 ** 1 != i -1 ** 1 != i64 -1 ** 1 - i -1 ** 1 / i64 -1 ** 1 < i64 -1 ** 1 == i32 +1 ** 1 ** f64 +1 ** 1 + f64 +1 ** 1 + i64 +1 ** 1 - round(0.5) +1 ** 1 / f64 +1 ** 1 < f32 +1 ** 1 == 0.5 + i32 1 ** 1 >= i -1 ** f32 != i64 -1 ** f32 / i -1 ** f64 != i64 -1 ** f64 ** i64 -1 ** f64 + i -1 ** f64 / f32 -1 ** f64 < i -1 ** i != i -1 ** i ** i64 -1 ** i < f64 -1 ** i < i32 -1 ** i > f64 -1 ** i32 ** (1 / 1) -1 ** i32 == i -1 ** i32 > i -1 ** i64 ** f64 -1 ** i64 - f64 -1 + 0.5 != i -1 + 0.5 <= f64 / f32 -1 + 0.5 <= i32 -1 + 1 - i32 +1 ** 1 >= i32 +1 ** 1 ^ i +1 ** 1 ^ i32 +1 ** 1 in array +1 ** array[i32] +1 ** f32 / i32 +1 ** f32 / i64 +1 ** f32 <= f32 +1 ** f32 <= i64 +1 ** f32 == i64 ? i32 : array +1 ** f32 >= f32 +1 ** f32 >= i +1 ** f32 ^ f32 +1 ** f32 ^ i64 +1 ** i + i32 +1 ** i >= i +1 ** i32 != i32 +1 ** i32 + f32 +1 ** i32 + i64 +1 ** i64 <= f32 +1 ** i64 <= f64 +1 ** i64 <= i32 +1 ** i64 > f32 +1 + 0.5 != i32 +1 + 0.5 + i +1 + 0.5 - i64 +1 + 0.5 < f32 +1 + 0.5 < i +1 + 0.5 == f64 +1 + 0.5 == f64 != nil +1 + 0.5 > i64 +1 + 0.5 not in array +1 + 1 != 0.5 ? 0.5 : half +1 + 1 - f32 +1 + 1 - i 1 + 1 < i -1 + 1 == f64 -1 + 1 == i64 -1 + 1 >= i64 -1 + f32 != i -1 + f32 > i -1 + f64 != f64 -1 + f64 - i -1 + f64 >= i32 +1 + 1 == f64 * i64 +1 + 1 > f32 +1 + 1 >= half(0.5) +1 + 1 >= i +1 + f32 != i32 +1 + f32 < i32 +1 + f32 <= i +1 + f32 > i64 +1 + f64 == i64 +1 + f64 >= f64 +1 + i .. i32 +1 + i <= ceil(f32) 1 + i <= f64 -1 + i in map(list, i32) -1 + i32 - i64 -1 + i32 < i -1 + i64 >= f32 -1 - 0.5 != half(0.5) +1 + i >= min(i64) +1 + i32 != i32 +1 + i32 - f64 +1 + i32 < f32 +1 + i32 < i32 +1 + i32 <= f64 +1 + i32 > reduce(array, #) +1 + i32 >= f64 +1 + i64 != i32 +1 + i64 != i64 +1 + i64 < i32 +1 + i64 <= i64 +1 - 0.5 != f32 1 - 0.5 + i -1 - 0.5 + i32 -1 - 0.5 - i64 -1 - 0.5 <= f64 -1 - 0.5 == i64 -1 - 1 .. i64 -1 - 1 < i64 +1 - 0.5 - f32 +1 - 0.5 <= i32 +1 - 0.5 <= i64 +1 - 1 < i64 ? 0.5 : "foo" +1 - 1 <= i32 + i64 1 - 1 == f64 -1 - 1 > -f32 -1 - f32 != i -1 - f32 <= f64 -1 - f32 <= i32 -1 - f64 - f32 -1 - f64 - f64 -1 - f64 < i64 +1 - 1 > i32 / i32 +1 - f32 != f32 +1 - f32 <= i64 +1 - f64 != f32 +1 - f64 + f32 +1 - f64 + i - 0.5 1 - f64 <= i -1 - i .. i64 -1 - i < min(f64) -1 - i32 < f64 -1 - i32 <= f64 -1 - i32 <= i32 -1 - i32 >= f64 -1 - i64 + i -1 - i64 - f32 -1 .. 1 == list -1 .. array[i] -1 .. i == list -1 .. i64 == list -1 / 0.5 + f64 -1 / 0.5 - array[i64] -1 / 0.5 < f64 -1 / 1 + -0.5 -1 / 1 + i32 -1 / 1 - -0.5 -1 / 1 / f64 -1 / 1 < f32 -1 / 1 <= f32 -1 / 1 <= i -1 / 1 == f64 -1 / 1 == i -1 / 1 == i32 -1 / 1 > f32 -1 / 1 > i64 -1 / f32 + -1 -1 / f64 * i -1 / f64 * i32 -1 / f64 + i32 -1 / f64 / f32 -1 / f64 == f32 -1 / f64 == i -1 / f64 > i -1 / i * i -1 / i < f64 ? ok : add -1 / i32 <= f32 -1 / i32 == i -1 / i32 == i64 -1 / i32 > i -1 / i64 + i64 -1 / i64 == i64 -1 / i64 > i -1 / i64 >= i32 -1 < array[i64] -1 < f64 != ok -1 < i32 and 1 == nil -1 < i64 ? "foo" not endsWith "foo" : i -1 <= 0.5 and i32 == 1 -1 <= 0.5 || ok -1 <= 1 && greet != greet -1 <= 1 and ok -1 <= f32 != ok -1 <= f32 == !ok -1 <= f64 ? add : f64 -1 <= i64 or nil == f32 -1 == array[i] -1 > 0.5 != ok -1 > 1 and ok -1 > 1 || ok -1 > f32 and ok -1 > f64 == ok -1 > f64 and ok -1 > i32 == ok -1 > i64 || i32 < i -1 >= 1 || ok -1 >= i || ok -1 >= i64 or nil in list -1 ^ 0.5 - f32 -1 ^ 0.5 <= f32 -1 ^ 0.5 <= i64 -1 ^ 0.5 ^ i32 -1 ^ 1 - f64 -1 ^ 1 - i32 -1 ^ 1 - i64 -1 ^ 1 / f32 -1 ^ 1 < f32 -1 ^ 1 < i64 / f32 -1 ^ 1 <= 1 ** f64 -1 ^ 1 == f64 -1 ^ 1 >= f32 -1 ^ 1 >= i64 -1 ^ f32 == i64 -1 ^ f32 > max(f32) -1 ^ f64 != i32 -1 ^ f64 * f32 -1 ^ f64 ** f64 -1 ^ i != findLast(array, false) -1 ^ i != i -1 ^ i * f64 -1 ^ i < i32 -1 ^ i <= f32 -1 ^ i == abs(1) -1 ^ i32 + i -1 ^ i32 < i -1 ^ i32 < i64 +1 - f64 in array +1 - f64 not in array +1 - i > f64 +1 - i > i +1 - i > i32 +1 - i >= i64 +1 - i not in array +1 - i32 < i32 +1 - i32 < i64 +1 - i32 == i32 +1 - i64 <= i32 +1 .. i != list +1 / 0.5 <= abs(f32) +1 / 0.5 <= i32 +1 / 0.5 == f64 +1 / 0.5 > f32 +1 / 0.5 >= i +1 / 0.5 >= i - i +1 / 0.5 >= i32 +1 / 1 != i32 +1 / 1 * f32 +1 / 1 <= f64 +1 / 1 in array +1 / f32 != f64 +1 / f32 / i64 +1 / f32 <= f32 +1 / f32 <= f64 +1 / f32 == i32 +1 / f32 == i32 / i +1 / f32 > f32 +1 / f32 >= f64 +1 / f64 + f64 +1 / f64 < f32 +1 / f64 == f64 +1 / i * f32 +1 / i / f64 +1 / i < i +1 / i == f64 +1 / i >= i32 +1 / i in map(list, 1) +1 / i32 > f32 +1 / i32 >= i64 +1 / i64 * i +1 / i64 > f32 / f64 +1 / i64 > f64 +1 / i64 >= f64 +1 < 1 == ok +1 < 1 and half == div +1 < 1 and ok +1 < array[get(array, i32)] +1 < array[i32] +1 < f32 != not true +1 < f64 || ok +1 < i ? array : foo +1 < i32 || 1 >= f32 +1 < i64 == ok +1 < i64 ? ok : list +1 <= 1 == ok +1 <= 1 || add == add +1 <= f32 && ok +1 <= f64 || ok +1 <= i32 ? foo : f32 +1 == 0.5 ? i32 : greet +1 == 0.5 and ok +1 == 1 || ok +1 == f64 && 0.5 != nil +1 == f64 || ok +1 == i32 && ok +1 == i32 == ok +1 == i64 == ok +1 == nil ? ok : half +1 > 0.5 == ok +1 > 1 || add != greet +1 > array[i64] +1 > f32 && ok +1 > f32 == reduce(array, ok) +1 > f64 != ok +1 > i == ok +1 > i64 or i != 1 +1 >= 1 != (nil not in list) +1 >= f32 ? i64 : half +1 >= f64 ? ok : half +1 >= i and ok +1 ^ 0.5 != f32 +1 ^ 0.5 != i +1 ^ 0.5 ** f32 +1 ^ 0.5 ** i32 +1 ^ 0.5 - i32 +1 ^ 0.5 < i32 +1 ^ 0.5 <= f64 +1 ^ 0.5 == i +1 ^ 0.5 ^ f32 +1 ^ 0.5 ^ i64 +1 ^ 1 != f64 +1 ^ 1 != i64 +1 ^ 1 ** i +1 ^ 1 + f64 +1 ^ 1 / i +1 ^ 1 < i +1 ^ 1 < i64 +1 ^ 1 >= i +1 ^ 1 >= i32 +1 ^ f32 < i32 +1 ^ f32 <= f64 +1 ^ f64 / f64 +1 ^ f64 == f32 +1 ^ f64 > f32 +1 ^ f64 >= 1 / f64 +1 ^ i != i * f32 +1 ^ i - i32 +1 ^ i < i +1 ^ i32 * i32 +1 ^ i32 ** i64 +1 ^ i32 / i 1 ^ i32 >= i32 -1 ^ i64 ** f64 -1 ^ i64 ** i32 -1 ^ i64 + i -1 ^ i64 <= i -1 ^ i64 <= i32 +1 ^ i32 >= i64 +1 ^ i64 * i64 +1 ^ i64 ** reduce(list, 1) +1 ^ i64 - i64 +1 ^ i64 / f64 1 ^ i64 > i -1 ^ i64 >= i64 +1 ^ i64 >= i32 + i32 +1 in array ? f32 : foo [!false] [!ok] -["foo" != nil] -["foo" endsWith "bar"] +[!true] +["bar" + "foo"] +["bar" < "bar"] +["bar" not contains "bar"] [-0.5] +[-1] [-f32] [-f64] -[-i32] -[-i64, add] [-i64] -[0.5 * 1] -[0.5 + 0.5] -[0.5 / i] -[0.5 <= f64] -[0.5 <= i, -1] -[0.5 >= i] -[0.5 ^ 1] +[0.5 != f32] +[0.5 != i] +[0.5 * 0.5] +[0.5 * f32] +[0.5 ** i] +[0.5 - 0.5] +[0.5 - i] +[0.5 / i32] +[0.5 <= i32, half] +[0.5 > 1] +[0.5 > f32] +[0.5 > i64] +[0.5 >= f64] +[0.5 ^ 0.5] [1 != 1] -[1 % 1, !true] -[1 < 0.5] +[1 * 0.5] +[1 ** 0.5] +[1 + i64, add] +[1 == i64] [1 == i] -[abs(0.5)] -[add != div] -[add == nil] -[add, array] +[[f32]] +[add != nil] +[add, add] [add, f32] -[add, f64] -[add, greet] -[add, half] -[add, i64] -[add, score] -[add, toJSON(array)] +[add, i] [add] -[array == list] +[all(list, false)] +[any(list, ok)] +[array, add] +[array, array] [array, f32] -[array, f64] [array, greet] -[array, half] +[array, i64] +[array, i] [array, list] -[array, ok] -[array, score] -[array[1]] -[array[i64]] +[array, ok, add] +[array, string(nil)] [array] -[div == half] -[div, f32] -[div, greet] -[div, map(list, half)] -[div, ok] -[div, score] +[bitnot(1)] +[ceil(i32)] +[div(1, 1)] +[div, add] +[div, foo] +[div, i32] +[div, i64, array] [div] -[f32 + 1] -[f32 - 0.5] -[f32 < i] -[f32 ^ 0.5] -[f32 ^ f64] +[f32 * i] +[f32 + f64] +[f32 >= i] [f32, f64] -[f32, half] -[f32, max(f64)] +[f32, foo, greet] +[f32, greet] +[f32, i32] +[f32, list] +[f32, ok] +[f32, score] [f32] -[f64 != 1] -[f64 != i32] -[f64 * f64] +[f64 + f64] +[f64 / f64] +[f64 < 0.5] [f64 < f32] -[f64 >= 1] +[f64 < i64] +[f64 <= 1] +[f64 in array] +[f64, add] [f64, f64] -[f64, foo] -[f64, i32] +[f64, half] [f64, i64] -[f64, list] -[f64, score] [f64] -[false ? f64 : f32] -[findIndex(array, true)] -[first(array)] -[float(i64)] +[f64] == array +[find(array, true)] +[findIndex(list, false)] +[findLast(list, ok)] +[float(0.5)] +[float(1)] [foo, add] -[foo, f32] -[foo, foo] +[foo, array] +[foo, half] [foo, i] -[foo, list] +[foo, ok] +[foo, reduce(array, #)] +[foo.Bar] [foo.Qux] -[foo.String(), greet] -[foo.String()] +[foo?.Bar, f32, f64] +[foo?.Bar, i32] [foo?.Bar] [foo?.Qux] +[foo?.String()] [foo] +[greet != nil] +[greet, array] [greet, div] -[greet, f32 ^ 0.5] -[greet, f32] -[greet, f64] +[greet, foo] +[greet, greet] [greet, half] -[greet, i32] [greet, i64] [greet, list] [greet] +[greet] == list +[groupBy(array, "bar")] +[groupBy(array, #), half] +[groupBy(array, #)] +[groupBy(array, f64)] +[groupBy(list, #)?.Qux] +[half(0.5)] +[half(f64)] +[half(i64 ^ 1)] +[half, array] [half, div] -[half, foo] -[half, greet] +[half, f64] +[half, i64 < f64] +[half, list] [half] [i != i64] -[i != i] -[i - 1] [i .. 1] -[i / 0.5] -[i < f32] -[i > f64] -[i, add] -[i, half] -[i32 * 1] -[i32 <= 0.5] -[i32 == 0.5] +[i / i] +[i < i64, score] +[i <= 0.5] +[i == i32] +[i >= i32] +[i ^ 1] +[i, array, list] +[i, array] +[i, greet("bar")] +[i, greet] +[i, i32] +[i, i] +[i, list] +[i32 < i] [i32 > 1] -[i32 > f32] -[i32, i] -[i32, score] +[i32, -1] +[i32, div] +[i32, f64] +[i32, i32] +[i32, list] +[i32, type(greet)] [i32] +[i64 != f64] +[i64 + 0.5] [i64 / f64] -[i64 == i32] +[i64 <= i64] [i64 >= 1] -[i64 ^ i, i32] -[i64, add] +[i64 ^ 1] [i64, div] [i64, foo] -[i64, i32] -[i64, ok] +[i64, half] +[i64, score] [i64] -[i64] == array [i] -[int(1)] -[len(array)] -[list == list] +[list != nil] [list, div] -[list, f64] +[list, f32] +[list, greet] +[list, half] [list, i] +[list, ok] [list] [map(array, #)] -[map(array, 1 >= i32)] +[map(array, add)] +[map(array, f64)] [map(array, foo)] -[map(list, #)] -[map(list, half)] -[map(list, ok)] [max(1)] -[max(i32)] -[min(0.5)] -[min(f64)] -[min(i32)] -[nil != ok, foo] -[nil == 0.5] -[nil not in list] +[nil != 0.5] [not false] -[not ok] -[not true] -[ok && ok] +[ok ? 1 : greet] [ok, f32] [ok, half] -[ok, score] +[ok, i64] +[ok, i] +[ok, list, 0.5] == list +[ok, ok] [ok] -[score != add] -[score(1)] -[score(i)] -[score, array, foo] +[reduce(array, foo)] +[reduce(list, #)] +[reduce(list, div)] +[score == nil] +[score, div] [score, f32] [score, f64] [score, greet] +[score, half] +[score, one(array, # > i32)] +[score, score] [score] -[string(0.5), foo] -[string(f64)] -[string(i32)] -[toJSON(1)] -[toJSON(nil)] -[type(0.5)] +[string(0.5)] +[string(1)] +[string(foo)] +[string(i)] +[string(i64)] +[toJSON(list)] +[trimPrefix("bar")] +[true ? add : f64] +[true and ok] +[true || ok] [type(1)] [type(add)] -[type(false)] -[type(i32)] -[{"foo": foo}] +[type(div)] +[type(greet)] +[type(nil)] abs(-0.5) abs(-1) abs(-f32) @@ -2377,159 +2612,153 @@ abs(-i32) abs(-i64) abs(0.5 * 0.5) abs(0.5 * 1) -abs(0.5 * f64) -abs(0.5 * i32) +abs(0.5 * i) abs(0.5 * i64) abs(0.5 ** 0.5) abs(0.5 ** 1) -abs(0.5 ** f32) -abs(0.5 ** f64) -abs(0.5 ** i64) +abs(0.5 ** i32) abs(0.5 + 0.5) +abs(0.5 + 1) abs(0.5 + f32) abs(0.5 + i) abs(0.5 + i64) abs(0.5 - 0.5) -abs(0.5 - f32) +abs(0.5 - 1) abs(0.5 - i) +abs(0.5 - i32) abs(0.5 - i64) abs(0.5 / 0.5) abs(0.5 / 1) -abs(0.5 / f32) abs(0.5 / f64) -abs(0.5 / i) -abs(0.5 / i64) abs(0.5 ^ 0.5) abs(0.5 ^ 1) -abs(0.5 ^ f64) -abs(0.5 ^ i32) -abs(0.5) * i -abs(0.5) - i -abs(0.5) - i64 -abs(0.5) / i32 -abs(0.5) < f32 -abs(0.5) == i32 -abs(0.5) > f32 -abs(0.5) >= f32 -abs(0.5) >= i -abs(0.5) >= i32 -abs(0.5) ^ f64 -abs(1 % 1) -abs(1 % i) -abs(1 * 0.5) -abs(1 * 1) +abs(0.5 ^ f32) +abs(0.5) - i32 +abs(0.5) / f32 +abs(0.5) < f64 +abs(0.5) < i32 +abs(0.5) <= i64 +abs(0.5) == -0.5 +abs(0.5) == half(1) +abs(0.5) > i32 +abs(0.5) >= f64 +abs(0.5) ^ i64 +abs(0.5) not in array abs(1 * f32) +abs(1 * f64) +abs(1 * i32) +abs(1 ** 0.5) abs(1 ** 1) abs(1 ** i) abs(1 + 1) -abs(1 + f64) +abs(1 + i) +abs(1 + i64) abs(1 - 0.5) -abs(1 - i) -abs(1 - i32) +abs(1 - 1) +abs(1 - i64) abs(1 / 0.5) abs(1 / 1) -abs(1 / f32) -abs(1 / f64) +abs(1 / i) abs(1 / i32) -abs(1 / i64) -abs(1 ^ 0.5) -abs(1 ^ 1) -abs(1 ^ f64) -abs(1) * f64 -abs(1) * i -abs(1) ** f64 -abs(1) + f64 -abs(1) + i -abs(1) - f64 +abs(1 ^ f32) +abs(1 ^ i) +abs(1 ^ i32) +abs(1) - i32 abs(1) .. i -abs(1) / f32 -abs(1) < f32 -abs(1) < i -abs(1) == f64 ? 1 : foo -abs(1) > i -abs(1) ^ f32 -abs(1) ^ i32 +abs(1) / f64 +abs(1) / i64 +abs(1) < i64 +abs(1) <= i32 +abs(1) == i32 +abs(1) >= i +abs(1) ^ f64 abs(abs(0.5)) abs(abs(1)) -abs(abs(abs(i))) -abs(abs(f32)) abs(abs(f64)) -abs(abs(i)) abs(abs(i32)) abs(abs(i64)) -abs(array[1]) -abs(array[i]) -abs(count(list, true)) +abs(add(i, 1)) +abs(bitand(i64, i32)) +abs(bitnand(i64, i)) +abs(bitnot(1)) +abs(bitnot(i)) +abs(bitnot(i32)) +abs(bitnot(i64)) +abs(bitushr(1, 1)) +abs(ceil(0.5)) +abs(ceil(1)) +abs(ceil(f32)) +abs(ceil(i)) +abs(ceil(i32)) +abs(ceil(i64)) +abs(count(array, ok)) +abs(count(array, true)) +abs(count(list, false)) +abs(div(i, i)) abs(f32 * 0.5) -abs(f32 * 1) -abs(f32 * f64) -abs(f32 ** 0.5) abs(f32 ** 1) +abs(f32 ** f32) abs(f32 ** i32) abs(f32 + 0.5) abs(f32 + 1) -abs(f32 + f32) -abs(f32 + f64) abs(f32 + i) abs(f32 + i32) abs(f32 - 0.5) abs(f32 - 1) -abs(f32 - f32) +abs(f32 - i32) +abs(f32 - i64) +abs(f32 / 0.5) abs(f32 / 1) abs(f32 / f32) abs(f32 / f64) abs(f32 / i32) -abs(f32 ^ 1) -abs(f32 ^ f64) -abs(f32 ^ i32) +abs(f32 ^ i) abs(f32 ^ i64) abs(f32) -abs(f32) != i64 / i64 -abs(f32) * i32 -abs(f32) + i32 -abs(f32) <= i64 -abs(f32) == i -abs(f32) ^ f64 -abs(f64 * 1) +abs(f32) ** f32 +abs(f32) ** i +abs(f32) + i64 +abs(f32) - i32 +abs(f32) / f64 +abs(f32) < f64 +abs(f32) >= 0.5 / 1 +abs(f32) ^ f32 abs(f64 * f32) -abs(f64 * i32) +abs(f64 * f64) abs(f64 ** 1) -abs(f64 ** f32) -abs(f64 ** i32) abs(f64 + 0.5) abs(f64 + 1) -abs(f64 + i32) -abs(f64 + i64) -abs(f64 - 0.5) +abs(f64 + f64) abs(f64 - 1) abs(f64 - f32) -abs(f64 - i32) abs(f64 / 0.5) +abs(f64 / 1) abs(f64 / f64) abs(f64 / i) -abs(f64 / i64) -abs(f64 ^ i32) +abs(f64 ^ 0.5) +abs(f64 ^ f32) +abs(f64 ^ i) +abs(f64 ^ i64) abs(f64) -abs(f64) * i64 -abs(f64) - f32 -abs(f64) - i64 - i32 -abs(f64) / i -abs(f64) / i64 -abs(f64) < f64 -abs(f64) <= abs(i32) -abs(f64) <= i -abs(f64) <= i32 -abs(f64) == i -abs(false ? 1 : f32) -abs(false ? f64 : 0.5) -abs(false ? false : i64) -abs(findIndex(array, # > i32)) -abs(findIndex(array, ok)) -abs(findIndex(array, true)) +abs(f64) + f32 +abs(f64) + f64 +abs(f64) + i32 +abs(f64) + i64 / i +abs(f64) - i +abs(f64) < i32 +abs(f64) <= f64 +abs(f64) > i64 +abs(f64) ^ f32 +abs(f64) ^ i64 +abs(f64) in array +abs(false ? f32 : 1) +abs(false ? half : 0.5) +abs(false ? list : 1) +abs(find(array, ok)) +abs(find(array, true)) +abs(findIndex(list, ok)) abs(findIndex(list, true)) abs(findLastIndex(array, ok)) -abs(findLastIndex(array, true)) -abs(findLastIndex(list, ok)) abs(first(array)) abs(float(0.5)) abs(float(1)) @@ -2537,383 +2766,397 @@ abs(float(f32)) abs(float(f64)) abs(float(i)) abs(float(i32)) -abs(float(i64)) +abs(floor(0.5)) +abs(floor(f32)) +abs(floor(i32)) +abs(get(array, 1)) +abs(get(array, i)) abs(get(array, i32)) abs(get(array, i64)) abs(half(0.5)) +abs(half(1)) abs(half(f64)) -abs(i % i64) abs(i * 1) -abs(i * i) -abs(i * i32) -abs(i ** 0.5) +abs(i * f32) abs(i ** 1) +abs(i ** f32) abs(i ** i32) -abs(i + 1) -abs(i + i32) +abs(i + 0.5) +abs(i + f64) abs(i - 0.5) abs(i - 1) -abs(i / 1) +abs(i - f32) +abs(i - f64) +abs(i - i32) +abs(i / 0.5) +abs(i / f64) +abs(i / i) abs(i / i32) +abs(i / i64) abs(i ^ 0.5) -abs(i ^ f32) +abs(i ^ f64) +abs(i ^ i) abs(i ^ i32) +abs(i ^ i64) abs(i) -abs(i) != float(0.5) -abs(i) % i64 -abs(i) * f32 -abs(i) ** i -abs(i) ** max(1) -abs(i) / i64 -abs(i) <= i32 +abs(i) % i +abs(i) * i32 +abs(i) ** f32 +abs(i) + f64 +abs(i) - f32 +abs(i) .. i +abs(i) .. i32 +abs(i) / f32 +abs(i) < f64 abs(i) <= i64 -abs(i) > f64 +abs(i) == 0.5 / i +abs(i) > i64 +abs(i) ^ f64 +abs(i) ^ half(1) +abs(i) ^ i +abs(i) ^ i32 +abs(i32 % i32) abs(i32 % i64) -abs(i32 * 0.5) -abs(i32 * 1) +abs(i32 * f64) abs(i32 * i32) -abs(i32 * i64) abs(i32 ** 0.5) abs(i32 ** 1) -abs(i32 ** f64) -abs(i32 ** i) -abs(i32 ** i64) +abs(i32 ** i32) abs(i32 + 0.5) +abs(i32 + 1) abs(i32 + f64) +abs(i32 + i) abs(i32 + i32) -abs(i32 - 1) -abs(i32 - f32) -abs(i32 - f64) +abs(i32 - 0.5) abs(i32 - i64) -abs(i32 / 1) +abs(i32 / 0.5) abs(i32 / i) -abs(i32 / i32) -abs(i32 ^ 0.5) -abs(i32 ^ 1) -abs(i32 ^ i) -abs(i32 ^ i64) +abs(i32 / i64) abs(i32) -abs(i32) % i32 -abs(i32) ** i64 -abs(i32) / -f32 -abs(i32) < f32 -abs(i32) > min(i64, f64, i32) -abs(i32) ^ f64 -abs(i32) not in array -abs(i64 % 1) -abs(i64 % i32) -abs(i64 * 1) +abs(i32) != f64 +abs(i32) * f32 +abs(i32) * i +abs(i32) ** i +abs(i32) - i32 +abs(i32) / -1 +abs(i32) / i32 ** f64 +abs(i32) < i64 == false +abs(i32) <= i +abs(i32) <= i32 +abs(i32) == i32 +abs(i32) ^ i64 +abs(i32) in array +abs(i64 * 0.5) abs(i64 * f32) -abs(i64 * i) abs(i64 * i32) -abs(i64 * i64) abs(i64 ** 0.5) -abs(i64 ** 1) +abs(i64 ** f64) abs(i64 ** i64) abs(i64 + 0.5) abs(i64 + 1) +abs(i64 + f32) +abs(i64 + f64) abs(i64 + i) -abs(i64 + i32) -abs(i64 + i64) -abs(i64 - 1) -abs(i64 - f64) -abs(i64 - i32) +abs(i64 - 0.5) +abs(i64 - i) +abs(i64 / f32) abs(i64 / i32) -abs(i64 ^ i64) +abs(i64 ^ f64) +abs(i64 ^ i) +abs(i64 ^ i32) abs(i64) -abs(i64) != f64 -abs(i64) - f64 -abs(i64) - i64 -abs(i64) .. i64 -abs(i64) == f32 -abs(i64) == i -abs(i64) == i32 -abs(i64) == nil ? i : f64 -abs(i64) > i64 -abs(i64) >= f64 -abs(i64) in array +abs(i64) * i32 +abs(i64) ** i +abs(i64) + f32 +abs(i64) / i +abs(i64) > i32 +abs(i64) ^ i32 +abs(i64) not in array abs(int(0.5)) abs(int(1)) -abs(int(f32)) -abs(int(f64)) abs(int(i)) abs(int(i32)) abs(int(i64)) abs(last(array)) -abs(len("bar")) abs(len("foo")) -abs(len(array)) abs(len(list)) abs(max(0.5)) -abs(max(1)) -abs(max(1, 1)) -abs(max(1, i64, f64)) abs(max(f32)) abs(max(f64)) -abs(max(i)) abs(max(i32)) abs(max(i64)) +abs(mean(array)) +abs(median(array)) abs(min(0.5)) -abs(min(0.5, 1)) abs(min(1)) -abs(min(1, f32)) abs(min(f32)) abs(min(f64)) abs(min(i)) abs(min(i32)) -abs(min(i64)) abs(ok ? 1 : "foo") -abs(ok ? f32 : 1) -abs(ok ? i : "bar") +abs(ok ? f32 : 0.5) +abs(ok ? f32 : nil) +abs(ok ? f64 : ok) +abs(ok ? i32 : foo) +abs(reduce(array, #)) +abs(reduce(array, i)) +abs(reduce(list, 1)) +abs(reduce(list, i32)) +abs(round(0.5)) +abs(round(1)) +abs(round(f32)) +abs(round(i)) +abs(round(i64)) abs(score(1)) abs(score(i)) -abs(true ? f32 : "bar") -abs(true ? f64 : i32) +abs(sum(array)) +abs(true ? 1 : ok) add add != add +add != add == nil add != div -add != div ? foo : i64 -add != div and ok +add != div != false +add != div == true add != foo.Qux add != foo.String add != foo?.Qux add != foo?.String add != greet -add != greet ? score : f32 +add != greet == ok +add != greet ? array : 1 +add != greet ? greet : ok add != half -add != half == nil -add != half ? 0.5 : ok -add != nil == nil -add != nil ? "bar" : f32 -add != nil ? half : f32 +add != half == ok +add != half || nil != add +add != nil ? f64 : i64 +add != reduce(list, add) +add != reduce(list, greet) add != score add == add -add == add == ok +add == add != nil +add == add == nil +add == add ? 1 : i64 add == div -add == div ? i32 : f64 -add == div or ok +add == div ? f64 : list add == foo.Qux add == foo.String add == foo?.Qux add == foo?.String add == greet -add == greet ? 1 : 1 add == half -add == nil && ok -add == nil ? "foo" : list -add == nil ? add : half -add == nil ? add : score -add == nil ? i32 : div -add == nil ? score : i64 -add == nil || ok +add == half != ok +add == half ? nil : f32 +add == nil ? false : i32 +add == nil ? greet : i32 +add == nil ? nil : nil +add == reduce(list, score) add == score +add == score != ok add == score != true -add == score and i32 >= 1 -add == score or 0.5 < 1 -add in [div] -add not in sort(array) -add(1, 1) ** i -add(1, 1) ^ i -add(1, i) .. i64 -add(i, 1 - i32) -add(i, abs(i)) +add == score == true +add == score or ok +add in sort(array) +add(1, i) < i +add(i, 1) ** f32 add(i, i) -add(i, i64 % 1) -add(i, min(i)) -add(min(1, 1), i32 * 1) -add(score(i, i), i) -all(1 .. i32, ok) -all(array, !(# <= #)) -all(array, !false) +add(i, i32 + 1) +all(1 .. i64, ok) +all(["bar"], # >= #) +all(["foo"], # not matches #) +all([false], # && false) +all([false], #) +all(array, !(# >= f64)) all(array, !ok) -all(array, !true or 0.5 < #) -all(array, "bar" in foo) -all(array, "bar" matches "bar") +all(array, !true) +all(array, "foo" < "bar") all(array, # != #) all(array, # != 1) all(array, # != f32) all(array, # != f64) -all(array, # != i64) +all(array, # != i32) all(array, # != nil) -all(array, # + # >= 0.5 + i) all(array, # < #) all(array, # < 0.5) all(array, # < 1) +all(array, # < f64) +all(array, # < i) +all(array, # < i64) all(array, # <= #) all(array, # <= 0.5) -all(array, # <= f64) all(array, # <= i) +all(array, # == # + #) all(array, # == #) all(array, # == 0.5) +all(array, # == 1) +all(array, # == f64) +all(array, # == i) all(array, # == i32) all(array, # == i64) -all(array, # == nil) all(array, # > #) all(array, # > 0.5) all(array, # > 1) -all(array, # > f32) all(array, # > f64) all(array, # > i) +all(array, # > i32) all(array, # > i64) all(array, # >= #) all(array, # >= 0.5) +all(array, # >= f32) all(array, # >= f64) -all(array, # >= i) -all(array, # ^ # == i64) +all(array, # >= i32) +all(array, # >= i64) all(array, # in array) -all(array, # not in array) all(array, 0.5 != #) -all(array, 0.5 != f32) -all(array, 0.5 + 0.5 >= #) all(array, 0.5 < #) -all(array, 0.5 < 1) -all(array, 0.5 < i64) +all(array, 0.5 < f32) all(array, 0.5 <= #) -all(array, 0.5 == #) -all(array, 0.5 == f32) -all(array, 0.5 > #) -all(array, 0.5 > 1) +all(array, 0.5 <= f32) +all(array, 0.5 <= i) +all(array, 0.5 > f32) +all(array, 0.5 > f64) +all(array, 0.5 > i32) all(array, 0.5 >= #) +all(array, 0.5 >= 0.5) +all(array, 0.5 in array) all(array, 1 != #) -all(array, 1 != i) -all(array, 1 != i64) -all(array, 1 != nil) +all(array, 1 != f32) all(array, 1 < #) -all(array, 1 <= #) +all(array, 1 < f32) all(array, 1 == #) all(array, 1 > #) -all(array, 1 in array) -all(array, all(array, add != score)) -all(array, all(array, false)) -all(array, all(list, false)) +all(array, 1 > i64) +all(array, 1 >= #) +all(array, 1 >= 1) +all(array, 1 >= i64) +all(array, f32 < #) +all(array, f32 <= #) +all(array, f32 <= f32) +all(array, f32 > i) all(array, f32 >= #) all(array, f64 != #) -all(array, f64 != i32) -all(array, f64 < #) all(array, f64 <= #) +all(array, f64 <= f32) all(array, f64 == #) -all(array, f64 > #) -all(array, false or ok) -all(array, i != f32) +all(array, f64 == 0.5) +all(array, f64 == i64) +all(array, f64 >= i64) +all(array, false && true) +all(array, false ? 1 : true) +all(array, i != 0.5) +all(array, i <= 0.5) +all(array, i <= f32) +all(array, i <= i32) all(array, i == #) -all(array, i > #) -all(array, i >= #) +all(array, i32 != #) all(array, i32 != i64) -all(array, i32 < #) -all(array, i32 <= #) -all(array, i32 <= i32) -all(array, i32 > #) -all(array, i32 >= 1 % #) -all(array, i64 < #) -all(array, i64 < 1) -all(array, i64 < i64) -all(array, i64 == #) -all(array, i64 == 0.5) +all(array, i32 < i) +all(array, i32 >= #) +all(array, i64 != #) +all(array, i64 != i64) +all(array, i64 == i32) all(array, i64 > #) -all(array, list != list) +all(array, i64 > 0.5) +all(array, i64 >= #) +all(array, nil != "bar") all(array, nil != #) -all(array, nil != i) +all(array, nil != list) +all(array, nil != ok) all(array, nil == "foo") -all(array, nil == div) -all(array, nil in list) -all(array, not (nil in array)) +all(array, nil == i32) +all(array, nil == list) +all(array, none(list, true)) all(array, not false) all(array, not true) all(array, ok) -all(array, one(array, ok)) -all(array, score == add) -all(array, score(#) > f32) -all(array, true || false) -all(array, true) or ok -all(false ? greet : "foo", # == i32) -all(filter(array, ok), # < #) +all(false ? add : "bar", ok) all(filter(array, true), ok) -all(i32 .. 1, 0.5 < i32) -all(i64 .. i64, # != #) -all(list, !any(array, false)) +all(groupBy(array, #)?.f32, #) +all(groupBy(array, f32).score, 0.5 in #?.f64) +all(groupBy(array, foo)?.i64, none(.div, true == #)) +all(groupBy(list, #).i, #?.half() not in # + #) +all(groupBy(list, #)?.add, #?.f64.i64(f32 startsWith #, div)) +all(i32 .. 1, ok) all(list, !false) -all(list, !ok) +all(list, "bar" in #) all(list, "bar" not in #) -all(list, "foo" >= "foo") +all(list, "foo" > "foo") all(list, # != #) -all(list, # != foo) +all(list, # != nil) +all(list, # == # || f64 != i64) all(list, # == #) all(list, # == foo) -all(list, 0.5 != f64) -all(list, 0.5 != nil) -all(list, 0.5 <= f64) -all(list, 0.5 > 1) -all(list, 1 != 0.5) -all(list, 1 != i) -all(list, 1 < f32) -all(list, 1 < i) -all(list, 1 <= 0.5) -all(list, 1 == 1) -all(list, 1 > f32) -all(list, 1 >= i64) -all(list, all(array, true)) -all(list, array != nil) -all(list, div != div) -all(list, f32 != 0.5) -all(list, f32 == f64) -all(list, f64 < 1) -all(list, f64 <= 1) -all(list, f64 <= i) -all(list, f64 <= i32) -all(list, f64 >= 1) -all(list, false) or 0.5 <= 1 -all(list, foo != #) -all(list, greet != half) -all(list, greet == score) -all(list, i <= i64) -all(list, i32 != i64) -all(list, i32 < i64) +all(list, # in list) +all(list, # not in list) +all(list, 0.5 < f64) +all(list, 0.5 < i64) +all(list, 0.5 <= i64) +all(list, 0.5 >= i) +all(list, 0.5 >= i32) +all(list, 1 != 1) +all(list, 1 <= 1) +all(list, 1 > i32) +all(list, 1 >= f64) +all(list, add == div) +all(list, all(array, ok)) +all(list, div != nil) +all(list, f64 != 0.5) +all(list, f64 != f32) +all(list, f64 < i32) +all(list, f64 > i64) +all(list, false ? i : true) +all(list, greet == half) +all(list, i < f32) +all(list, i <= 1) +all(list, i <= i32) +all(list, i > f64) +all(list, i > i32) +all(list, i >= 1) +all(list, i32 < 1) all(list, i32 <= 0.5) -all(list, i32 <= f64) -all(list, int(i32) != i32) +all(list, i32 == f32) +all(list, i64 != nil) +all(list, i64 <= 0.5) +all(list, i64 > 1) all(list, list != nil) all(list, nil != 1) -all(list, nil != foo) +all(list, nil != i64) +all(list, nil != nil) +all(list, nil != score) all(list, nil == #) -all(list, nil == greet) -all(list, nil in list) -all(list, none(array, ok)) -all(list, not false) -all(list, not ok) +all(list, nil == score) +all(list, nil in array) +all(list, none(array, 1 > #)) all(list, not true) -all(list, ok and false) all(list, ok) -all(list, ok) or ok -all(list, true != false) -all(list, true != true) -all(list, true ? true : 1) -all(list[i64:i32], !false) -all(map(array, #), # != #) -all(map(array, #), # != 0.5) -all(map(array, #), # >= #) -all(map(array, #), i64 == #) -all(map(array, #), true or false) -all(map(array, 1), ok) -all(map(array, i), f64 > #) -all(map(array, ok), #) -all(map(list, "bar"), ok) -all(map(list, #), "bar" not in #) -all(map(list, #), f32 > 1) -all(map(list, 1), ok) -all(map(list, false), #) -all(map(list, i64), # <= #) +all(list, reduce(array, true)) +all(list, score != add) +all(list, score != div) +all(list, type(i) not endsWith .Bar) +all(map(array, #), ok && false) +all(map(array, #), ok) +all(map(array, f32), !ok) +all(map(array, false), #) +all(map(array, score), # != #) +all(map(array, score), ok) +all(map(list, "bar" not in #), #) +all(map(list, 0.5), 0.5 <= #) +all(map(list, i), # == 0.5) +all(map(list, list), 1 == 0.5) all(map(list, ok), #) -all(map(list, true), # == #) -all(map(list, true), #) -all(map(list, true), ok) -any([0.5, add, 0.5], # == #) -any([1], i64 >= #) -any(array, !false) -any(array, "foo" <= "foo") +all(reduce(array, array), # > #) +all(reduce(array, list), ok) +all(true ? list : false, not true) +any(["bar"], # not endsWith #) +any([foo], # != i64) +any([greet], ok) +any(array, !(i32 <= #)) +any(array, "foo" >= "foo") +any(array, "foo" not endsWith "bar") +any(array, # != # or # > #) any(array, # != #) any(array, # != 0.5) -any(array, # != 1) -any(array, # != i) +any(array, # != f32) +any(array, # != f64) any(array, # != i32) any(array, # != i64) any(array, # != nil) @@ -2926,259 +3169,739 @@ any(array, # < i) any(array, # < i32) any(array, # <= #) any(array, # <= 0.5) -any(array, # <= 1 ^ #) any(array, # <= 1) +any(array, # <= f32) any(array, # <= i) any(array, # <= i32) +any(array, # <= i64) any(array, # == #) +any(array, # == 0.5) any(array, # == 1) -any(array, # == f64) -any(array, # == i) any(array, # == i32) any(array, # == i64) -any(array, # == nil) any(array, # > #) +any(array, # > 0.5) any(array, # > 1) +any(array, # > f64) any(array, # > i32) -any(array, # > i64) any(array, # >= #) any(array, # >= 0.5) any(array, # >= 1) -any(array, # >= f64) -any(array, # >= i) +any(array, # >= f32) any(array, # >= i32) +any(array, # >= i64) any(array, # in array) -any(array, # not in array) any(array, 0.5 != #) -any(array, 0.5 != f64) -any(array, 0.5 != i) -any(array, 0.5 < 0.5) -any(array, 0.5 <= #) any(array, 0.5 == #) -any(array, 0.5 == 0.5) +any(array, 0.5 == i32) any(array, 0.5 > #) -any(array, 0.5 > f32) +any(array, 0.5 > f64) +any(array, 0.5 >= #) +any(array, 1 != i64) any(array, 1 < #) -any(array, 1 <= i64) +any(array, 1 < 0.5) +any(array, 1 <= #) any(array, 1 == #) -any(array, 1 > f64) -any(array, 1 >= i) -any(array, 1 >= i32) -any(array, all(list, true)) -any(array, array == array) -any(array, div != nil) -any(array, f32 < #) +any(array, 1 > #) +any(array, 1 > 1) +any(array, 1 >= #) +any(array, 1 >= f64) +any(array, add == greet) +any(array, all(list, false)) +any(array, f32 < i) any(array, f32 > #) +any(array, f32 > 0.5) +any(array, f32 >= #) any(array, f64 != #) -any(array, f64 != 1) -any(array, f64 < #) -any(array, f64 <= 0.5) -any(array, f64 <= f32) +any(array, f64 < i) +any(array, f64 <= #) any(array, f64 == #) any(array, f64 > #) any(array, f64 > 0.5) -any(array, f64 >= i64) -any(array, false != nil) -any(array, false) and f32 != f32 -any(array, greet != half) -any(array, half != div) -any(array, half != nil) -any(array, i != 1) -any(array, i < # ** #) -any(array, i <= #) -any(array, i == #) -any(array, i == i) +any(array, false && false) +any(array, greet == greet) +any(array, i != #) +any(array, i < #) any(array, i > #) any(array, i >= #) -any(array, i32 != #) -any(array, i32 != i64) -any(array, i32 <= #) -any(array, i32 == #) -any(array, i32 > #) -any(array, i32 >= i64) -any(array, i64 != #) -any(array, i64 != i64) -any(array, i64 <= 0.5) -any(array, i64 == #) -any(array, i64 > #) -any(array, i64 > 1) -any(array, i64 > f32) -any(array, i64 >= i) +any(array, i32 > i64) +any(array, i64 < #) +any(array, i64 == f64) +any(array, i64 >= #) any(array, nil != #) -any(array, nil != f64) -any(array, nil != greet) +any(array, nil != 1) +any(array, nil != i) +any(array, nil != ok) +any(array, nil == "foo") any(array, nil == #) any(array, nil == 1) -any(array, not ok) -any(array, not true) +any(array, ok != true) any(array, ok) -any(array, one(list, false)) -any(array, true ? ok : f32) -any(array, true) and ok -any(filter(array, ok), ok) -any(filter(list, false), ok) -any(filter(list, true), # == #) +any(array, one(array, # <= 0.5)) +any(array, one(array, ok)) +any(array, score != add) +any(array, score == half) +any(array, score == nil) +any(groupBy(list, #)?.Bar, #) +any(i32 .. i, half == half) +any(list, !ok) any(list, !true) -any(list, "bar" contains "foo") -any(list, "bar" matches "foo") +any(list, "bar" < "foo") any(list, "bar" not in #) any(list, "bar" not startsWith "foo") +any(list, "foo" not in foo) any(list, # != #) -any(list, # != foo) -any(list, # != nil) any(list, # == #) +any(list, # == foo) any(list, # == nil) -any(list, # in list) -any(list, # not in list) +any(list, 0.5 != 1) any(list, 0.5 < 1) -any(list, 0.5 <= f32) -any(list, 0.5 == 0.5) -any(list, 0.5 >= 0.5) -any(list, 0.5 >= f32) -any(list, 0.5 >= i64) -any(list, 1 <= 0.5) -any(list, 1 == f32) -any(list, f32 != i) -any(list, f32 == nil) -any(list, f32 >= i) -any(list, f64 <= 1) -any(list, f64 > 0.5) -any(list, false ? nil : false) -any(list, foo == foo) -any(list, greet == div) -any(list, half != nil) -any(list, i != 1) -any(list, i < f32) -any(list, i < f64) +any(list, 0.5 < f64) +any(list, 0.5 == i64) +any(list, 1 >= f64) +any(list, 1 >= i32) +any(list, add == score) +any(list, any(list, false)) +any(list, any(list, ok)) +any(list, array == nil) +any(list, f32 < 1) +any(list, f32 <= i64) +any(list, f32 > 1) +any(list, f32 > i64) +any(list, f32 >= i32) +any(list, f64 != i64) +any(list, f64 >= 1) +any(list, false) == (foo not in list) +any(list, false) || false ? nil : add any(list, i > i64) -any(list, i32 != i32) -any(list, i32 < 0.5) -any(list, i32 == f64) -any(list, i64 < 1) -any(list, i64 < f64) -any(list, i64 < i64) -any(list, i64 <= i32) -any(list, i64 >= 1) -any(list, i64 >= f32) -any(list, list != nil) -any(list, nil != #) -any(list, nil != #?.String()) -any(list, nil != nil) -any(list, nil == #) -any(list, nil == 1) -any(list, nil == i64) +any(list, i >= 0.5) +any(list, i32 != 0.5) +any(list, i64 <= 1) +any(list, i64 == 0.5) +any(list, i64 == i) +any(list, i64 >= i32) +any(list, i64 not in array) +any(list, nil == false) any(list, nil == nil) -any(list, not false) +any(list, none(array, false)) any(list, not ok) -any(list, ok and foo != #) +any(list, ok || # == #) any(list, ok) -any(list, ok) && i <= 1 -any(list, ok) ? array : foo -any(list, true or ok) -any(list, true) ? f64 : foo.Bar -any(map(array, #), # == #) +any(list, reduce(list, true)) +any(list, true ? false : f64) +any(map(array, #), # >= #) any(map(array, #), ok) -any(map(array, 0.5), # <= #) -any(map(array, f64), # < #) any(map(array, false), #) +any(map(array, ok), # and #) any(map(array, ok), #) -any(map(list, #), i == f64) -any(map(list, #), ok) -any(map(list, 1), # != #) -any(map(list, array), ok) -any(map(list, foo), # != #) -any(map(list, greet), # == #) -any(ok ? "bar" : half, ok) -any(splitAfter("bar", "foo"), # not startsWith #) +any(map(list, #), nil == #) +any(map(list, false), nil == i32) +any(map(list, ok), #) +any(ok ? "foo" : 1, ok) +any(ok ? "foo" : f32, i > #) +any(reduce(array, array), 1 == #) array -array != [array] array != array -array != filter(list, true) +array != array ? 1 : false +array != array ? score : i32 array != list -array != map(array, i) -array != nil != ok -array != nil ? 0.5 : i32 -array != nil ? true : nil -array != nil or nil == f32 -array != nil || ok -array != sort(array) -array != {"bar": f32, "foo": 1}.ok +array != list ? list : f64 +array != map(array, #) +array != map(array, 1) +array != map(list, #) +array != map(list, true) +array != nil ? add : 0.5 array == array -array == array ? "foo" : 0.5 +array == array ? half : false array == list -array == list ? i : half -array == map(array, #) -array == map(array, add) -array == nil != nil -array == nil != true ? 0.5 : 0.5 -array == nil && (false || ok) -array[-1] +array == map(array, score) +array == map(list, #) +array == nil ? list : float(f32) +array not in sort(array) array[-i32] array[-i64] array[-i] -array[1 % 1] -array[1 % i:i64] -array[1] != f32 -array[1] != score(i) -array[1] <= f64 -array[1] == f32 -array[1] == i64 -array[1] ^ 0.5 ^ f64 -array[1] ^ i32 -array[false ? half : 0.5] -array[false ? i : i32] -array[i - i64] -array[i32:i32] +array[1 % i64] +array[1 + 1] +array[1] * i32 +array[1] * i64 +array[1] - f64 +array[1] / i32 +array[1] == -i +array[1] > i +array[1] ^ i +array[abs(1)] +array[array[i32]] +array[bitnot(1)] +array[bitor(1, i)] +array[count(list, ok)] +array[get(array, 1)] +array[i32 * 1] +array[i32:i] array[i32] +array[i32] != i +array[i32] % i32 +array[i32] * f64 +array[i32] ** i32 +array[i32] + i64 array[i32] - f64 -array[i32] .. i32 -array[i64 % 1] -array[i64:i32] -array[i64:i] +array[i32] / f32 +array[i32] == i32 +array[i32] == i64 +array[i32] > f64 +array[i32] >= f32 +array[i64:i64] array[i64] -array[i64] ** f32 -array[i64] / i -array[i64] < i -array[i64] == f64 -array[i64] > f32 -array[i64] >= -i64 +array[i64] .. i32 +array[i64] == floor(0.5) +array[i64] == i +array[i64] > half(f64) +array[i64] ^ f64 +array[i:i32] array[i:i64] -array[i:i] array[i] -array[i] ** i64 +array[i] * f64 array[i] + f32 -array[i] < i -array[i] == min(i32, i) -array[i] > i32 -array[int(1)] -array[int(i32)] -array[max(i64)] -array[min(1)] -array[min(i32)] -array[min(i64)] +array[i] - f32 +array[i] / f64 +array[i] < round(i) +array[i] == i32 +array[i] > f64 +array[i] >= 0.5 ** i +array[max(1)] +array[reduce(list, 1)] +array[score(1):i] array[score(1)] array[score(i)] -count([list], false or ok) +bitand(1 * i64, i) +bitand(1, 1) != i +bitand(1, i64) == f64 +bitand(i, i) +bitand(i, i32) +bitand(i, i64) +bitand(i32, 1) != f32 +bitand(i32, i) +bitand(i32, i) - i32 +bitand(i32, i32 * i) +bitand(i32, i32) +bitand(i32, i64) +bitand(i64, 1) <= i32 +bitand(i64, i + i64) +bitand(i64, i) +bitand(i64, i) ^ f64 +bitand(i64, i32) +bitand(i64, i64) +bitand(int(i32), i64) +bitnand(1, i64) != int(i64) +bitnand(i, i) +bitnand(i, i32 + i32) +bitnand(i, i32) +bitnand(i, i64) +bitnand(i32, bitnot(1)) +bitnand(i32, i) +bitnand(i32, i32) +bitnand(i32, i64) +bitnand(i64 + i, i32) +bitnand(i64 + i64, i64) +bitnand(i64, -1) +bitnand(i64, 1) + i64 + 1 +bitnand(i64, i) +bitnand(i64, i32) +bitnand(i64, i32) > f64 +bitnand(i64, i64) +bitnot(-1) +bitnot(-i) +bitnot(-i32) +bitnot(-i64) +bitnot(1 % 1) +bitnot(1 % i32) +bitnot(1 % i64) +bitnot(1 * 1) +bitnot(1 * i64) +bitnot(1 + 1) +bitnot(1 - i) +bitnot(1 - i32) +bitnot(1) * i % 1 +bitnot(1) ** f32 +bitnot(1) ** i +bitnot(1) + i32 +bitnot(1) - i +bitnot(1) - i32 +bitnot(1) / min(i) +bitnot(1) < i32 +bitnot(1) < i64 +bitnot(1) == i32 +bitnot(1) > f64 +bitnot(1) >= i +bitnot(1) >= i64 +bitnot(abs(1)) +bitnot(abs(i32)) +bitnot(abs(i64)) +bitnot(array[1]) +bitnot(array[i64]) +bitnot(array[i]) +bitnot(bitnot(i)) +bitnot(bitushr(1, 1)) +bitnot(bitushr(i32, 1)) +bitnot(bitxor(i, i64)) +bitnot(count(array, false)) +bitnot(findLast(array, ok)) +bitnot(first(array)) +bitnot(get(array, 1)) +bitnot(get(array, i)) +bitnot(i % i64) +bitnot(i * i) +bitnot(i * i32) +bitnot(i + 1) +bitnot(i - 1) +bitnot(i - i64) +bitnot(i) +bitnot(i) % i32 +bitnot(i) * i +bitnot(i) + f64 +bitnot(i) .. i64 +bitnot(i) == 1 - i +bitnot(i) > i +bitnot(i) >= i32 +bitnot(i) ^ f32 +bitnot(i) ^ f64 +bitnot(i) in array +bitnot(i32 % 1) +bitnot(i32 % i64) +bitnot(i32 + i) +bitnot(i32 + i32) +bitnot(i32 - 1) +bitnot(i32 - i32) +bitnot(i32) +bitnot(i32) != f64 +bitnot(i32) != i32 +bitnot(i32) * i +bitnot(i32) * i64 +bitnot(i32) ** f32 +bitnot(i32) - i32 +bitnot(i32) / f64 +bitnot(i32) == i64 +bitnot(i32) > 1 != true +bitnot(i32) >= f32 +bitnot(i64 % 1) +bitnot(i64 % i) +bitnot(i64 % i32) +bitnot(i64 * 1) +bitnot(i64 * i) +bitnot(i64 * i32) +bitnot(i64 * i64) +bitnot(i64 - 1) +bitnot(i64 - i) +bitnot(i64 - i64) +bitnot(i64) +bitnot(i64) % i32 +bitnot(i64) * f32 +bitnot(i64) < f32 +bitnot(i64) > f64 +bitnot(i64) > i % i +bitnot(i64) >= i32 ^ f32 +bitnot(i64) ^ f64 +bitnot(i64) not in array +bitnot(int(f32)) +bitnot(int(f64)) +bitnot(int(i)) +bitnot(int(i32)) +bitnot(int(i64)) +bitnot(last(array)) +bitnot(len("bar")) +bitnot(len("foo")) +bitnot(len(list)) +bitnot(max(1)) +bitnot(max(1, i64)) +bitnot(max(i)) +bitnot(max(i32)) +bitnot(min(1)) +bitnot(min(i32)) +bitnot(min(i64)) +bitnot(ok ? 1 : array) +bitnot(ok ? 1 : ok) +bitnot(ok ? i : add) +bitnot(reduce(array, #)) +bitnot(reduce(array, 1)) +bitnot(reduce(list, 1)) +bitnot(score(1)) +bitnot(score(i)) +bitnot(sum(array)) +bitor(1, 1) < i +bitor(1, 1) == i +bitor(1, i32) != i64 +bitor(i, -i64) +bitor(i, i) +bitor(i, i64) +bitor(i32, i) +bitor(i32, i32) +bitor(i32, i64) +bitor(i64 % 1, i32) +bitor(i64, i) +bitor(i64, i32) +bitor(i64, i64) +bitor(min(i64), i) +bitor(score(i), i64) +bitshl(bitnot(i), i) +bitshl(i, i) +bitshl(i, i32) +bitshl(i, i64) +bitshl(i32, i) +bitshl(i32, i32) +bitshl(i32, i64) +bitshl(i64, i32) +bitshl(i64, i64) +bitshl(len(array), i) +bitshl(score(i), i32) +bitshr(i % 1, i32) +bitshr(i, 1) - i64 +bitshr(i, i32) +bitshr(i, i64) +bitshr(i32, i) +bitshr(i32, i) - f32 +bitshr(i32, i32) +bitshr(i32, i64) +bitshr(i64, i32) +bitshr(i64, i64) +bitushr(-i64, i64) +bitushr(1 % i, i) +bitushr(1, i) * i +bitushr(abs(1), i32) +bitushr(i, i) +bitushr(i, i) % i64 +bitushr(i, i32) +bitushr(i, i64) +bitushr(i32, i) +bitushr(i32, i32) +bitushr(i32, i64) +bitushr(i64, i) +bitushr(i64, i32) +bitushr(i64, i64) +bitxor(-i, i64) +bitxor(1, i) * i +bitxor(bitnot(1), -i) +bitxor(i, i32) +bitxor(i, i64) +bitxor(i32, 1) > i64 +bitxor(i32, i) +bitxor(i32, i) ** f64 +bitxor(i32, i32) +bitxor(i32, i64) +bitxor(i32, i64) ** i32 +bitxor(i64, i) +bitxor(i64, i32) +bitxor(i64, i64) +bitxor(score(1), i) +ceil(-0.5) +ceil(-1) +ceil(-f32) +ceil(-f64) +ceil(-i) +ceil(-i32) +ceil(-i64) +ceil(0.5 * 0.5) +ceil(0.5 * 1) +ceil(0.5 * f64) +ceil(0.5 * i) +ceil(0.5 ** 1) +ceil(0.5 ** f64) +ceil(0.5 ** i) +ceil(0.5 + 0.5) +ceil(0.5 + 1) +ceil(0.5 + f32) +ceil(0.5 + f64) +ceil(0.5 + i) +ceil(0.5 + i32) +ceil(0.5 + i64) +ceil(0.5 - 0.5) +ceil(0.5 - f64) +ceil(0.5 - i) +ceil(0.5 / 0.5) +ceil(0.5 / 1) +ceil(0.5 / f32) +ceil(0.5 / i) +ceil(0.5 / i32) +ceil(0.5 ^ 1) +ceil(0.5 ^ f32) +ceil(0.5 ^ i32) +ceil(0.5 ^ i64) +ceil(0.5) != 0.5 * 0.5 +ceil(0.5) != i +ceil(0.5) != nil ? score : "foo" +ceil(0.5) ** round(f32) +ceil(0.5) - i +ceil(0.5) < i +ceil(0.5) == f32 +ceil(0.5) == i ? div : half +ceil(0.5) == i64 +ceil(0.5) > f64 +ceil(0.5) >= i +ceil(0.5) >= i64 +ceil(0.5) ^ i64 +ceil(1 % i64) +ceil(1 * 0.5) +ceil(1 * 1) +ceil(1 ** 1) +ceil(1 + 0.5) +ceil(1 + 1) +ceil(1 + f64) +ceil(1 + i) +ceil(1 - 0.5) +ceil(1 - f64) +ceil(1 / 0.5) +ceil(1 / 1) +ceil(1 / f64) +ceil(1 / i64) +ceil(1 ^ f64) +ceil(1 ^ i) +ceil(1 ^ i64) +ceil(1) ** f32 +ceil(1) + i32 +ceil(1) / i +ceil(1) < f32 ^ i +ceil(1) <= f32 +ceil(1) <= i64 +ceil(1) == f32 +ceil(1) > f32 +ceil(1) >= f32 +ceil(1) >= i64 ** 0.5 +ceil(1) ^ i +ceil(abs(0.5)) +ceil(abs(1)) +ceil(abs(f32)) +ceil(abs(f64)) +ceil(abs(i32)) +ceil(abs(i64)) +ceil(add(1, 1)) +ceil(array[1]) +ceil(array[i64]) +ceil(array[i]) +ceil(bitnot(1)) +ceil(bitnot(i)) +ceil(ceil(0.5)) +ceil(ceil(f64)) +ceil(ceil(i)) +ceil(ceil(i32)) +ceil(count(list, ok)) +ceil(f32 * 0.5) +ceil(f32 * i) +ceil(f32 * i32) +ceil(f32 ** i) +ceil(f32 ** i32) +ceil(f32 + 1) +ceil(f32 + i64) +ceil(f32 - f32) +ceil(f32 - i) +ceil(f32 - i32) +ceil(f32 - i64) +ceil(f32 / 0.5) +ceil(f32 / f64) +ceil(f32 / i32) +ceil(f32 ^ 0.5) +ceil(f32 ^ 1) +ceil(f32 ^ i64) +ceil(f32) +ceil(f32) != i64 +ceil(f32) * i64 +ceil(f32) ** -1 +ceil(f32) ** i +ceil(f32) + i +ceil(f32) + i64 +ceil(f32) - i32 +ceil(f32) / i64 +ceil(f32) < i +ceil(f32) < i32 +ceil(f64 * 1) +ceil(f64 * i) +ceil(f64 ** i) +ceil(f64 ** i64) +ceil(f64 + 1) +ceil(f64 + f32) +ceil(f64 - 0.5) +ceil(f64 - f32) +ceil(f64 - f64) +ceil(f64 - i32) +ceil(f64 / 0.5) +ceil(f64 / f64) +ceil(f64 / i32) +ceil(f64 / i64) +ceil(f64 ^ 0.5) +ceil(f64 ^ f32) +ceil(f64 ^ f64) +ceil(f64 ^ i32) +ceil(f64 ^ i64) +ceil(f64) +ceil(f64) != i +ceil(f64) != i64 +ceil(f64) * f32 +ceil(f64) ** f32 +ceil(f64) - i32 +ceil(f64) / f64 +ceil(f64) / i / i64 +ceil(f64) in array +ceil(false ? add : 0.5) +ceil(find(array, ok)) +ceil(findLast(array, true)) +ceil(findLastIndex(list, ok)) +ceil(findLastIndex(list, true)) +ceil(first(array)) +ceil(float(0.5)) +ceil(float(1)) +ceil(float(f64)) +ceil(float(i)) +ceil(float(i32)) +ceil(float(i64)) +ceil(floor(0.5)) +ceil(floor(1)) +ceil(floor(f64)) +ceil(floor(i)) +ceil(floor(i32)) +ceil(floor(i64)) +ceil(get(array, 1)) +ceil(get(array, i)) +ceil(half(0.5)) +ceil(half(1)) +ceil(half(f64)) +ceil(i % i) +ceil(i * 0.5) +ceil(i * i) +ceil(i ** f64) +ceil(i ** i) +ceil(i + 0.5) +ceil(i + 1) +ceil(i + f32) +ceil(i + i64) +ceil(i - i) +ceil(i / f32) +ceil(i / i) +ceil(i / i64) +ceil(i ^ i) +ceil(i ^ i32) +ceil(i) +ceil(i) != i32 +ceil(i) * f64 +ceil(i) * i64 +ceil(i) ** f64 +ceil(i) + i +ceil(i) - f32 +ceil(i) / f32 +ceil(i) <= f64 +ceil(i) == i32 +ceil(i) > i64 +ceil(i32 * i) +ceil(i32 * i32) +ceil(i32 ** i32) +ceil(i32 + 0.5) +ceil(i32 + i32) +ceil(i32 - 0.5) +ceil(i32 - 1) +ceil(i32 - i) +ceil(i32 - i64) +ceil(i32 / 0.5) +ceil(i32 / f32) +ceil(i32 / i) +ceil(i32 / i32) +ceil(i32 ^ 0.5) +ceil(i32 ^ i64) +ceil(i32) +ceil(i32) * 1 ^ i32 +ceil(i32) * i32 +ceil(i32) ** max(i) +ceil(i32) + f32 +ceil(i32) + i +ceil(i32) + i32 +ceil(i32) <= i64 +ceil(i32) not in array +ceil(i64 % 1) +ceil(i64 % i32) +ceil(i64 * f32) +ceil(i64 * f64) +ceil(i64 ** i32) +ceil(i64 ** i64) +ceil(i64 + 0.5) +ceil(i64 + f64) +ceil(i64 + i32) +ceil(i64 - 0.5) +ceil(i64 - f64) +ceil(i64 / 0.5) +ceil(i64 / 1) +ceil(i64 / f64) +ceil(i64 ^ 0.5) +ceil(i64 ^ i) +ceil(i64 ^ i32) +ceil(i64 ^ i64) +ceil(i64) +ceil(i64) - -1 +ceil(i64) - f32 +ceil(i64) - i32 +ceil(i64) / (0.5 - f32) +ceil(i64) >= f32 +ceil(i64) ^ i32 +ceil(int(0.5)) +ceil(int(f32)) +ceil(int(f64)) +ceil(int(i)) +ceil(int(i64)) +ceil(len("bar")) +ceil(len(array)) +ceil(len(list)) +ceil(max(1, i)) +ceil(max(f32, 0.5)) +ceil(max(f64)) +ceil(max(i)) +ceil(mean(array)) +ceil(median(array)) +ceil(min(0.5, f32)) +ceil(min(1)) +ceil(min(f32)) +ceil(min(f64)) +ceil(min(i)) +ceil(min(i64)) +ceil(ok ? f32 : nil) +ceil(ok ? i32 : "bar") +ceil(ok ? i32 : i64) +ceil(reduce(array, #)) +ceil(reduce(array, 0.5)) +ceil(reduce(list, 1)) +ceil(round(0.5)) +ceil(round(1)) +ceil(round(f32)) +ceil(round(f64)) +ceil(round(i)) +ceil(round(i32)) +ceil(round(i64)) +ceil(score(1)) +ceil(score(i)) +ceil(true ? 1 : half) +ceil(true ? 1 : nil) +ceil(true ? f64 : nil) +count(["bar", score, i], 1 != #) +count(["bar"], # startsWith #) +count([0.5], ok) +count([greet], ok) +count([i32], f32 != #) +count([list, 0.5], # not in list) +count([nil], ok) count(array, !ok) -count(array, "bar" != "bar") +count(array, !true) +count(array, "bar" <= "bar") count(array, "bar" not endsWith "bar") +count(array, "foo" matches "foo") count(array, # != #) -count(array, # != f32) -count(array, # != i32) +count(array, # != 0.5) +count(array, # != i) +count(array, # != i64) +count(array, # != nil) count(array, # < #) -count(array, # < 0.5) -count(array, # < 1) -count(array, # < f32) -count(array, # < f64) count(array, # < i) -count(array, # < i64) +count(array, # < i32) count(array, # <= #) count(array, # <= 0.5) -count(array, # <= f32) -count(array, # <= f64) +count(array, # <= 1) count(array, # <= i) count(array, # <= i32) count(array, # == #) +count(array, # == 0.5) count(array, # == 1) count(array, # == f32) count(array, # == i) @@ -3188,2512 +3911,2582 @@ count(array, # > #) count(array, # > 0.5) count(array, # > i) count(array, # > i64) -count(array, # >= # / #) count(array, # >= #) count(array, # >= 0.5) count(array, # >= 1) -count(array, # >= f64) +count(array, # >= f32) count(array, # >= i) -count(array, # >= i64) +count(array, # in array) +count(array, # not in array) count(array, 0.5 != #) +count(array, 0.5 < #) count(array, 0.5 <= #) +count(array, 0.5 <= f32) +count(array, 0.5 <= f64) count(array, 0.5 == #) +count(array, 0.5 == f32) +count(array, 0.5 == i) count(array, 0.5 > #) -count(array, 0.5 > 1) -count(array, 0.5 >= #) -count(array, 0.5 >= 0.5) -count(array, 0.5 >= i) count(array, 1 != #) +count(array, 1 != 0.5) count(array, 1 < #) -count(array, 1 < 0.5) -count(array, 1 < 1) count(array, 1 <= #) -count(array, 1 > #) +count(array, 1 == #) count(array, 1 >= #) -count(array, add == half) -count(array, f32 != i) -count(array, f32 < # ? true : half) -count(array, f32 < #) -count(array, f32 < 0.5) +count(array, any(array, true)) +count(array, div(#, 1) >= #) count(array, f32 <= #) -count(array, f32 <= 1) -count(array, f32 <= i) count(array, f32 == #) -count(array, f32 == 1) -count(array, f64 != #) count(array, f64 < #) +count(array, f64 < f32) count(array, f64 <= #) +count(array, f64 <= 1) count(array, f64 == #) -count(array, f64 > #) -count(array, false == true) -count(array, false) != f64 -count(array, false) / i -count(array, false) >= f32 +count(array, false) ** i32 +count(array, false) + f32 +count(array, false) - i64 +count(array, false) / f64 +count(array, false) > i64 * i64 +count(array, foo in list) count(array, foo not in list) -count(array, greet != greet) -count(array, greet == score) -count(array, i != f32) -count(array, i == nil) -count(array, i > #) +count(array, i != #) +count(array, i < #) +count(array, i < 0.5) +count(array, i <= #) +count(array, i == #) +count(array, i > i64) count(array, i >= #) -count(array, i32 != 1) +count(array, i32 != #) +count(array, i32 != i) count(array, i32 < #) -count(array, i32 < 0.5) +count(array, i32 < 1) +count(array, i32 <= #) +count(array, i32 <= f32) count(array, i32 == #) -count(array, i32 > i) +count(array, i32 == 0.5) +count(array, i32 > #) count(array, i32 >= #) -count(array, i32 >= 1) -count(array, i64 != #) +count(array, i32 >= f32) +count(array, i32 >= i32) +count(array, i64 != i32) +count(array, i64 != i64) count(array, i64 < #) -count(array, i64 <= 1) -count(array, i64 <= f64) +count(array, i64 <= #) count(array, i64 == #) count(array, i64 == i64) count(array, i64 > 1) -count(array, i64 > f32) -count(array, nil != #) -count(array, nil == #) -count(array, nil == foo) -count(array, not ok) +count(array, list != array) +count(array, list != nil) +count(array, nil != "foo") +count(array, nil != f64) +count(array, nil == 1) +count(array, nil == list) +count(array, nil == nil) +count(array, none(array, false)) +count(array, not false) +count(array, ok or false) count(array, ok) -count(array, ok) + i64 -count(array, ok) - i64 -count(array, ok) .. i64 -count(array, one(array, false)) -count(array, true ? false : 0.5) -count(array, true) != 1 ^ f32 -count(array, true) ** f32 -count(array, true) / int(0.5) -count(array, true) >= f64 / 0.5 -count(filter(list, false), ok) -count(i .. 1, # > #) -count(i .. i32, # > #) -count(i32 .. 1, # == #) -count(i64 .. i, div == nil) -count(i64 .. i, ok) +count(array, ok) * i32 +count(array, ok) ^ i +count(array, reduce(list, false)) +count(array, true == ok) +count(array, true) / f64 +count(filter(list, true), ok) +count(groupBy(array, #)?.String, #) +count(groupBy(list, #).String, .div?.array) +count(groupBy(list, #)?.list, #?.Qux) +count(i .. 1, # == i) +count(i .. i, ok) +count(i32 .. i, # >= #) +count(i64 .. 1, nil != f32) count(list, !false) -count(list, !ok) -count(list, "bar" == "bar") -count(list, "bar" in #) -count(list, "bar" matches "foo") -count(list, "bar" not in #) +count(list, !true) +count(list, "bar" not matches "bar") count(list, "foo" in #) -count(list, "foo" not in #) count(list, # != #) -count(list, # != nil) count(list, # == #) count(list, # == nil) -count(list, 0.5 == f32) +count(list, # in list) +count(list, 0.5 < f32) +count(list, 0.5 <= 0.5) +count(list, 0.5 <= i64) count(list, 0.5 > 0.5) -count(list, 0.5 >= i32) -count(list, 1 != 1) -count(list, 1 != f32) -count(list, 1 < 0.5) -count(list, 1 <= i) +count(list, 0.5 > 1) +count(list, 0.5 > f32) +count(list, 1 != i) +count(list, 1 >= 0.5) count(list, 1 >= f32) -count(list, 1 >= i32) -count(list, all(list, true)) -count(list, f32 <= i32) -count(list, f64 != i) -count(list, false ? # : ok) -count(list, false or ok) -count(list, false || false) -count(list, false) .. i32 -count(list, false) > i64 -count(list, foo != #) -count(list, half == div) -count(list, i == i64) -count(list, i32 == i) -count(list, i32 == i32) -count(list, list == array) +count(list, add != half) +count(list, div == score) +count(list, f32 == i64) +count(list, f32 >= f32) +count(list, false && false) +count(list, false) + -1 +count(list, false) / f64 +count(list, false) > f32 +count(list, foo == #) +count(list, greet != score) +count(list, i != i64) +count(list, i < 0.5) +count(list, i <= i64) +count(list, i > 1) +count(list, i32 < f32) +count(list, i32 < i64) +count(list, i64 not in array) count(list, nil != #) -count(list, nil != score) -count(list, nil == #) -count(list, nil == add) -count(list, nil == true) -count(list, none(list, ok)) +count(list, nil != false) +count(list, nil == list) count(list, not false) -count(list, not ok) -count(list, not true) -count(list, ok == nil) count(list, ok) -count(list, ok) - i32 -count(list, ok) < f64 -count(list, ok) > -0.5 -count(list, ok) >= i -count(list, true and ok) -count(list, true) ** i64 -count(list, true) == f64 -count(list, true) ^ i64 -count(map(array, #), # != #) -count(map(array, #), # > #) -count(map(array, #), i == #) +count(list, ok) % i64 +count(list, ok) / half(1) +count(list, ok) / i +count(list, ok) >= i32 +count(list, ok) ^ i +count(list, ok) ^ i64 +count(list, true or ok) +count(list, true || true) +count(list, true) * f32 +count(list, true) == i +count(map(array, #), # == i32) +count(map(array, #), not true) count(map(array, #), ok) -count(map(array, add), ok) -count(map(array, div), ok) -count(map(array, foo), ok) -count(map(array, i32), 0.5 == f32) -count(map(array, i32), 1 != #) -count(map(array, i64), # == 0.5) -count(map(array, true), #) -count(map(list, #), "bar" in #) -count(map(list, #), # == #) -count(map(list, #), # == nil) -count(map(list, 0.5), # != nil) -count(map(list, f32), # <= #) -count(map(list, true), #) -count(sort(array), foo == #) -count(sort(array), ok) -date("bar", "bar")?.String +count(map(array, false), #) +count(map(array, i), ok) +count(map(array, i32), 1 == #) +count(map(array, i64), f64 != nil) +count(map(array, ok), !#) +count(map(list, 0.5), "bar" == "foo") +count(map(list, div), ok) +count(map(list, f32), # == #) +count(map(list, greet), ok) +count(map(list, i32), # != i64) +count(map(list, ok), #) +count(map(list, ok), 0.5 <= i64) +count(ok ? array : i64, # > 0.5) +count(sort(array), 1 <= #) div div != add -div != add != ok +div != add != nil +div != add == ok div != div -div != div ? score : 0.5 -div != div or half != greet +div != div != ok +div != div && ok +div != div ? "bar" : "foo" div != foo.Qux div != foo.String div != foo?.Qux +div != foo?.String div != greet +div != greet != ok +div != greet or ok div != half -div != half ? f32 : ok -div != half and !ok -div != nil != ok -div != nil ? array : add -div != nil ? i : i64 +div != half != true +div != half ? false : div +div != half ? greet : true +div != nil == ok +div != nil || f32 < 0.5 +div != reduce(array, div) div != score +div != score != true div == add +div == add ? 1 : ok div == div -div == div ? 0.5 : half -div == div ? nil : i -div == div || true ? f32 : add div == foo.Qux div == foo.String div == foo?.Qux div == foo?.String div == greet -div == greet != ok -div == greet || !false +div == greet == nil +div == greet ? 1 : 1 div == half -div == nil ? greet : foo -div == nil ? half : half -div == nil ? score : i64 -div == nil || ok +div == half != false +div == nil ? f32 : half +div == nil ? false : 1 div == score -div == score == ok -div == score ? true : "bar" -div in map(list, add) -div not in [add] -div not in [half, f32, false] -div not in map(array, div) -div(-1, i) -div(1, 1) > i64 -div(1, i) >= i64 -div(i, 1) / f32 -div(i, 1) == i +div == score ? "bar" : true +div == score or f32 != f64 +div(-i, array[i64]) +div(-i, i) +div(1, i) + i +div(findLast(array, true), i) +div(i, -1) div(i, i) +div(last(array), 1 * i32) +div(score(1), bitnot(1)) f32 -f32 != --f64 +f32 != -0.5 f32 != -1 -f32 != 0.5 * f32 -f32 != 0.5 + i64 -f32 != 0.5 / i64 +f32 != -f32 +f32 != 0.5 != false +f32 != 0.5 * 1 +f32 != 0.5 * i64 +f32 != 0.5 ** f32 +f32 != 0.5 + 1 +f32 != 0.5 - i64 +f32 != 0.5 / 0.5 +f32 != 0.5 / i32 f32 != 0.5 == ok -f32 != 0.5 ? array : ok -f32 != 0.5 ? list : 1 -f32 != 0.5 ^ i32 -f32 != 1 % i32 -f32 != 1 * 1 -f32 != 1 * i64 -f32 != 1 ** 0.5 -f32 != 1 - i -f32 != 1 ? "foo" : foo -f32 != 1 ^ f32 -f32 != abs(i64) +f32 != 0.5 == true +f32 != 0.5 ? array : score +f32 != 0.5 ? foo : f64 +f32 != 0.5 ? true : i32 +f32 != 0.5 ^ 1 +f32 != 0.5 ^ f32 +f32 != 1 && ok +f32 != 1 * i +f32 != 1 + i64 f32 != f32 -f32 != f32 + f64 -f32 != f32 - f64 +f32 != f32 / 0.5 +f32 != f32 / f32 f32 != f64 -f32 != f64 ** i32 -f32 != f64 + i32 -f32 != f64 - f32 -f32 != f64 ^ i32 -f32 != findIndex(list, ok) -f32 != float(i) +f32 != findLast(array, ok) +f32 != findLastIndex(array, ok) +f32 != floor(0.5) +f32 != half(0.5) f32 != i -f32 != i * i64 -f32 != i - f64 +f32 != i != true +f32 != i % 1 +f32 != i % i +f32 != i ** i64 +f32 != i / f64 f32 != i32 +f32 != i32 % i +f32 != i32 * i32 +f32 != i32 + 0.5 f32 != i64 -f32 != i64 * 1 -f32 != i64 ? f64 : f32 +f32 != i64 != nil +f32 != i64 != true +f32 != i64 ? 0.5 : f64 +f32 != i64 ^ i32 +f32 != int(f32) +f32 != int(i32) f32 != len(array) -f32 != max(i) -f32 != min(1) -f32 != min(f64) -f32 != nil ? half : greet +f32 != nil ? true : score +f32 != nil || ok +f32 != round(i) f32 != score(1) -f32 * (1 - f32) -f32 * (i + 1) -f32 * (i32 + f32) -f32 * (i64 + f32) -f32 * (i64 - i64) +f32 != score(1, i) +f32 * (0.5 + f64) +f32 * (0.5 + i32) +f32 * (0.5 - f32) +f32 * (f64 + f64) +f32 * (f64 + i64) +f32 * (f64 - i) f32 * -0.5 -f32 * -f32 +f32 * -1 f32 * -f64 -f32 * -i32 -f32 * 0.5 != f32 -f32 * 0.5 ** f32 -f32 * 0.5 - f32 -f32 * 0.5 < f64 -f32 * 0.5 < i32 -f32 * 0.5 <= f32 -f32 * 0.5 <= f32 ? "bar" : array -f32 * 0.5 <= i64 +f32 * -i +f32 * -i64 +f32 * -len(array) +f32 * 0.5 * 0.5 +f32 * 0.5 * i +f32 * 0.5 * i32 +f32 * 0.5 - i32 +f32 * 0.5 / i +f32 * 0.5 <= i +f32 * 0.5 ^ f32 +f32 * 0.5 not in array f32 * 1 != f32 -f32 * 1 * 1 -f32 * 1 ** f64 -f32 * 1 + i -f32 * 1 - i -f32 * 1 / i64 -f32 * 1 < f64 -f32 * 1 <= f32 -f32 * 1 >= i32 -f32 * array[i64] -f32 * count(array, ok) +f32 * 1 * f64 +f32 * 1 * i32 +f32 * 1 ** 0.5 +f32 * 1 + f64 +f32 * 1 < i64 +f32 * 1 >= i64 +f32 * 1 ^ i64 +f32 * ceil(i) f32 * f32 -f32 * f32 * i -f32 * f32 ^ i64 +f32 * f32 * 0.5 +f32 * f32 < i32 +f32 * f32 <= i64 +f32 * f32 > f32 - 1 +f32 * f32 ^ 0.5 +f32 * f32 in array f32 * f64 -f32 * f64 * i64 -f32 * f64 + f32 -f32 * f64 - i -f32 * f64 ^ f32 -f32 * findIndex(list, true) -f32 * float(0.5) +f32 * f64 + f64 +f32 * f64 + i32 +f32 * f64 / i64 +f32 * f64 >= 1 - i +f32 * float(i) +f32 * float(i32) +f32 * floor(0.5) +f32 * floor(i) +f32 * half(0.5) +f32 * half(1) +f32 * half(f64) f32 * i -f32 * i < f64 -f32 * i <= -i64 -f32 * i <= min(0.5, f64) +f32 * i != i32 +f32 * i - i +f32 * i / f64 +f32 * i == i64 f32 * i32 -f32 * i32 ** 1 -f32 * i32 - i64 +f32 * i32 != max(i) +f32 * i32 * i32 +f32 * i32 ** 0.5 +f32 * i32 >= i f32 * i64 -f32 * i64 ** 0.5 -f32 * i64 ** i64 -f32 * i64 < f64 -f32 * i64 < half(f64) -f32 * i64 ^ i -f32 * i64 ^ i64 -f32 * int(f64) -f32 * max(f32) -f32 * min(0.5) -f32 * min(f64) -f32 * score(1) -f32 ** (0.5 + i) -f32 ** (0.5 - 0.5) -f32 ** (1 - i64) -f32 ** (1 / 0.5) -f32 ** (f32 * i) -f32 ** (f32 + 0.5) -f32 ** (f32 + i64) -f32 ** (f32 - 1) -f32 ** (f64 - i32) -f32 ** (i32 * 1) -f32 ** (i32 * i) +f32 * i64 != f64 +f32 * i64 ** i +f32 * int(i64) +f32 * min(i64) +f32 * reduce(array, 1) +f32 * reduce(list, 1) +f32 * round(f64) +f32 ** (0.5 + 0.5) +f32 ** (0.5 - 1) +f32 ** (0.5 / f32) +f32 ** (1 / f64) +f32 ** (f32 - 0.5) +f32 ** (f64 - i64) +f32 ** (i % 1) +f32 ** (i64 * i32) +f32 ** (i64 + 0.5) +f32 ** (i64 - 1) f32 ** -0.5 -f32 ** -1 +f32 ** -f32 f32 ** -f64 f32 ** -i -f32 ** -i32 -f32 ** -i64 -f32 ** 0.5 >= i64 +f32 ** 0.5 != f32 +f32 ** 0.5 + f32 +f32 ** 0.5 >= -i64 +f32 ** 0.5 ^ (f32 / f64) f32 ** 0.5 ^ i64 -f32 ** 1 * f32 -f32 ** 1 ** 0.5 -f32 ** 1 / i32 -f32 ** 1 <= i -f32 ** array[i64] +f32 ** 1 + i64 +f32 ** 1 / i +f32 ** 1 < f64 +f32 ** 1 < i64 +f32 ** 1 <= i64 +f32 ** ceil(i64) f32 ** f32 -f32 ** f32 * i ^ f64 -f32 ** f32 + f32 -f32 ** f32 - 0.5 + 1 -f32 ** f32 ^ 1 -f32 ** f32 ^ i +f32 ** f32 * f32 +f32 ** f32 ** f32 +f32 ** f32 < f64 +f32 ** f32 ^ f32 +f32 ** f32 ^ f64 f32 ** f64 -f32 ** f64 + i64 +f32 ** f64 ** 1 f32 ** f64 <= f64 -f32 ** f64 >= f32 -f32 ** float(i64) -f32 ** half(f64) +f32 ** f64 >= i +f32 ** float(f32) +f32 ** float(f64) +f32 ** half(0.5) +f32 ** half(1) f32 ** i -f32 ** i * f64 -f32 ** i / f64 -f32 ** i == score(i) +f32 ** i != half(1) +f32 ** i ** f64 +f32 ** i ** i32 +f32 ** i <= i64 f32 ** i32 -f32 ** i32 ** i32 -f32 ** i32 >= i32 +f32 ** i32 / i32 +f32 ** i32 == f64 +f32 ** i32 ^ f32 f32 ** i64 -f32 ** i64 * i32 -f32 ** i64 + i64 -f32 ** i64 / i64 -f32 ** int(0.5) -f32 ** int(1) +f32 ** i64 / f32 +f32 ** i64 == i32 +f32 ** i64 > i32 +f32 ** int(f64) f32 ** len("foo") -f32 ** len(list) f32 ** max(f32) -f32 ** max(f64) -f32 ** max(i64) +f32 ** max(i32) +f32 ** median(array) +f32 ** reduce(array, 0.5) +f32 ** round(f64) f32 + -0.5 f32 + -1 f32 + -f32 f32 + -i -f32 + -i64 -f32 + 0.5 + 1 -f32 + 0.5 + f32 +f32 + 0.5 ** f32 +f32 + 0.5 + i32 +f32 + 0.5 - i +f32 + 0.5 - i32 +f32 + 0.5 / f32 +f32 + 0.5 == i +f32 + 0.5 > i64 +f32 + 0.5 ^ 0.5 f32 + 1 * 0.5 -f32 + 1 * i32 -f32 + 1 ** f64 -f32 + 1 - f32 +f32 + 1 * 1 +f32 + 1 + i +f32 + 1 - f64 f32 + 1 - i64 -f32 + 1 < i32 -f32 + abs(0.5) -f32 + abs(f32) -f32 + count(array, true) +f32 + 1 / f64 +f32 + 1 < f32 +f32 + 1 < i +f32 + 1 >= ceil(0.5) +f32 + bitnot(i64) +f32 + ceil(-1) +f32 + ceil(1) +f32 + ceil(f32) f32 + f32 -f32 + f32 + i32 -f32 + f32 == 0.5 ^ i +f32 + f32 * 0.5 +f32 + f32 ** i64 +f32 + f32 - i32 +f32 + f32 / 1 +f32 + f32 > i32 +f32 + f32 ^ 0.5 f32 + f64 -f32 + f64 - 0.5 -f32 + f64 - f32 -f32 + f64 / f64 -f32 + f64 < f32 -f32 + f64 ^ f32 -f32 + find(array, ok) -f32 + float(f64) -f32 + half(0.5) +f32 + f64 in array +f32 + findIndex(array, true) +f32 + first(array) +f32 + float(i) +f32 + floor(1) +f32 + floor(i64) +f32 + half(1) +f32 + half(f64) f32 + i -f32 + i != i -f32 + i - i -f32 + i ^ f64 +f32 + i != i64 +f32 + i + 1 +f32 + i + i +f32 + i - i32 +f32 + i == f64 f32 + i32 -f32 + i32 * 0.5 -f32 + i32 + 0.5 -f32 + i32 >= f32 +f32 + i32 != f32 +f32 + i32 % i +f32 + i32 / f32 +f32 + i32 <= i +f32 + i32 ^ 0.5 f32 + i64 -f32 + i64 % 1 -f32 + i64 - 1 -f32 + i64 - f32 +f32 + i64 != f32 +f32 + i64 + 0.5 +f32 + i64 < f32 +f32 + i64 <= i32 +f32 + i64 >= i +f32 + i64 >= i32 f32 + int(1) f32 + int(f64) -f32 + int(i32) -f32 + len(array) f32 + max(0.5) f32 + max(f64) -f32 + max(i64) -f32 + min(1) -f32 + min(f32) -f32 + min(i32) -f32 + min(i64, 1, 1) +f32 + reduce(array, #) +f32 + round(1) +f32 + round(i32) f32 + score(1) f32 + score(i) -f32 - -0.5 f32 - -1 f32 - -f64 f32 - -i -f32 - -i32 +f32 - 0.5 ** i64 +f32 - 0.5 + 0.5 f32 - 0.5 + f64 -f32 - 0.5 - i32 f32 - 0.5 - i64 -f32 - 0.5 <= f64 +f32 - 0.5 < i +f32 - 0.5 <= i32 f32 - 0.5 <= i64 -f32 - 0.5 >= i64 -f32 - 0.5 ^ f64 -f32 - 0.5 ^ i32 -f32 - 1 != i64 -f32 - 1 % 1 +f32 - 0.5 > f64 f32 - 1 % i64 +f32 - 1 * i64 f32 - 1 + 1 -f32 - 1 + i32 % i -f32 - 1 - f32 +f32 - 1 / 0.5 +f32 - 1 < i32 +f32 - 1 <= i32 +f32 - 1 == f32 +f32 - 1 >= f64 f32 - abs(i32) -f32 - array[i] +f32 - abs(i64) +f32 - bitshl(i, i32) +f32 - ceil(f64) f32 - f32 -f32 - f32 - f64 -f32 - f32 - i32 +f32 - f32 ** i32 +f32 - f32 + i f32 - f32 == i -f32 - f32 == min(1) -f32 - f32 >= i f32 - f64 -f32 - f64 * 1 -f32 - f64 ** i32 -f32 - f64 + f32 -f32 - f64 + i64 -f32 - f64 - f32 +f32 - f64 + f64 f32 - f64 - i f32 - f64 <= f32 -f32 - f64 ^ 1 -f32 - float(0.5) -f32 - float(1) -f32 - float(i32) -f32 - half(0.5) f32 - i -f32 - i % 1 -f32 - i * f32 -f32 - i + i32 % 1 -f32 - i + i32 ** 0.5 -f32 - i - 0.5 +f32 - i >= f32 f32 - i32 -f32 - i32 * 1 -f32 - i32 ** f32 -f32 - i32 ** i32 -f32 - i32 + 1 -f32 - i32 >= i -f32 - i32 ^ i +f32 - i32 * 0.5 +f32 - i32 * f64 +f32 - i32 ** 1 +f32 - i32 <= f32 +f32 - i32 <= i32 +f32 - i32 >= abs(0.5) f32 - i64 -f32 - i64 - 1 -f32 - i64 <= i32 -f32 - i64 ^ 1 -f32 - int(0.5) -f32 - int(i64) -f32 - len("bar") -f32 - len(list) -f32 - max(i32) -f32 - min(1) -f32 - min(i64) +f32 - i64 ** 0.5 +f32 - len(array) +f32 - max(1) +f32 - min(0.5) +f32 - min(0.5, 0.5) +f32 - reduce(array, #) +f32 - score(1) f32 - score(i) -f32 / (0.5 + i64) -f32 / (1 - i) -f32 / (i64 - f64) -f32 / -0.5 -f32 / -f32 +f32 / (0.5 - i32) +f32 / (1 + i) +f32 / (f64 - 0.5) +f32 / (i - i32) +f32 / (i32 + 1) +f32 / -1 f32 / -f64 -f32 / -i -f32 / -i32 -f32 / 0.5 * 0.5 -f32 / 0.5 * i -f32 / 0.5 - f64 -f32 / 0.5 - i -f32 / 0.5 - i64 -f32 / 0.5 > f64 -f32 / 1 != f64 -f32 / 1 * i64 -f32 / 1 ** f32 -f32 / 1 - f64 - i64 +f32 / -i64 +f32 / 0.5 ** f64 +f32 / 0.5 / i +f32 / 0.5 <= i64 +f32 / 0.5 ^ f64 +f32 / 1 * i32 +f32 / 1 <= f32 +f32 / 1 >= 0.5 ? f64 : foo f32 / 1 >= f32 -f32 / 1 ^ 0.5 -f32 / 1 ^ i -f32 / abs(1) -f32 / abs(f32) +f32 / 1 >= i32 +f32 / array[1] +f32 / array[i32] +f32 / bitnot(i) +f32 / ceil(1) +f32 / ceil(f32) +f32 / count(list, false) f32 / f32 -f32 / f32 / f32 -f32 / f32 < f32 +f32 / f32 / 0.5 +f32 / f32 ^ 1 f32 / f64 -f32 / f64 ^ 0.5 +f32 / f64 * i32 +f32 / f64 + f32 +f32 / f64 - i32 +f32 / f64 / 1 +f32 / f64 / f64 +f32 / f64 / i64 +f32 / f64 < i +f32 / float(1) +f32 / float(i32) f32 / float(i64) -f32 / get(array, 1) +f32 / floor(i) f32 / half(0.5) +f32 / half(1) +f32 / half(f64) f32 / i -f32 / i <= i64 +f32 / i * 0.5 +f32 / i / 0.5 +f32 / i <= i +f32 / i == i32 +f32 / i > f64 f32 / i32 -f32 / i32 != i -f32 / i32 ** i -f32 / i32 / f64 -f32 / i32 >= i +f32 / i32 * 1 +f32 / i32 * f32 +f32 / i32 ** f32 +f32 / i32 + i +f32 / i32 + i64 +f32 / i32 < f64 + 0.5 +f32 / i32 >= i32 f32 / i64 -f32 / i64 * i64 -f32 / i64 > i32 -f32 / i64 ^ 1 -f32 / i64 ^ i -f32 / int(f32) -f32 / int(f64) -f32 / int(i) -f32 / int(i32) -f32 / last(array) +f32 / i64 - f64 +f32 / i64 ^ 0.5 +f32 / int(0.5) +f32 / int(1 * i64) f32 / max(0.5) -f32 / max(1) -f32 / min(f32) +f32 / min(i32) +f32 / reduce(array, #) +f32 / reduce(list, 1) +f32 / score(i) f32 < -0.5 -f32 < -f32 f32 < -f64 -f32 < -i32 +f32 < -i f32 < -i64 -f32 < 0.5 != true -f32 < 0.5 ? array : array -f32 < 0.5 ? false : score -f32 < 0.5 ? i64 : i32 -f32 < 0.5 ? ok : f32 +f32 < 0.5 + 0.5 +f32 < 0.5 + 1 f32 < 0.5 ^ f32 -f32 < 1 != ok -f32 < 1 * f32 -f32 < 1 ** 1 -f32 < 1 ** i -f32 < 1 - i -f32 < 1 / 0.5 -f32 < 1 ? f32 : i64 -f32 < 1 ? foo : i -f32 < 1 ? i64 : foo -f32 < 1 || not ok -f32 < abs(1) -f32 < abs(i) -f32 < array[i64] -f32 < array[i] -f32 < div(1, 1) +f32 < 0.5 ^ i64 +f32 < 1 % 1 +f32 < 1 + f64 +f32 < 1 ? f64 : i +f32 < 1 and ok +f32 < abs(0.5) +f32 < ceil(0.5) +f32 < ceil(f64) +f32 < count(array, ok) +f32 < count(list, ok) f32 < f32 -f32 < f32 ** 1 -f32 < f32 ^ 0.5 +f32 < f32 / 1 +f32 < f32 ^ f64 f32 < f64 -f32 < f64 != ok -f32 < f64 / f64 -f32 < f64 == nil -f32 < f64 == true -f32 < f64 ? "foo" : half -f32 < float(f32) -f32 < float(i64) -f32 < half(f64) +f32 < f64 ** 1 +f32 < f64 + 0.5 +f32 < f64 + i +f32 < f64 / i64 +f32 < f64 ? 0.5 : array +f32 < f64 ? div : i32 +f32 < f64 and ok +f32 < floor(0.5) +f32 < floor(i) +f32 < half(0.5) +f32 < half(1) f32 < i -f32 < i * 1 -f32 < i - i32 -f32 < i ? greet : "foo" +f32 < i != ok +f32 < i / 1 +f32 < i ? 1 : i f32 < i32 -f32 < i32 ** 0.5 +f32 < i32 ** i64 +f32 < i32 ? f64 : i +f32 < i32 ? greet : i32 f32 < i32 or ok -f32 < i32 || ok f32 < i64 -f32 < i64 != nil -f32 < i64 && ok -f32 < i64 * i32 -f32 < i64 - f32 -f32 < int(f64) -f32 < max(1) -f32 < score(1) -f32 < score(i) +f32 < i64 - i32 +f32 < i64 / 0.5 +f32 < i64 ? foo : i32 +f32 < i64 ? foo?.Bar : div +f32 < i64 ^ 0.5 +f32 < max(i) +f32 < max(i32, 1) +f32 < min(0.5) +f32 < reduce(array, #) +f32 < reduce(list, 1) +f32 < round(i64) f32 <= -0.5 f32 <= -1 -f32 <= -f32 f32 <= -f64 -f32 <= -i f32 <= -i64 -f32 <= -min(i64) +f32 <= 0.5 != true f32 <= 0.5 * 0.5 -f32 <= 0.5 ** i32 -f32 <= 0.5 - 1 -f32 <= 0.5 / 0.5 -f32 <= 0.5 == ok -f32 <= 0.5 == true -f32 <= 1 != nil -f32 <= 1 % i -f32 <= 1 * 0.5 -f32 <= 1 * i32 -f32 <= 1 == ok -f32 <= abs(1) +f32 <= 0.5 + i +f32 <= 0.5 / i64 +f32 <= 0.5 ? i64 : i +f32 <= 1 - 0.5 +f32 <= 1 == nil +f32 <= 1 ? f64 : add +f32 <= 1 ? i64 : i64 % 1 +f32 <= 1 ? list : div +f32 <= 1 || ok f32 <= f32 -f32 <= f32 ** i64 -f32 <= f32 ? 0.5 : foo +f32 <= f32 * 1 +f32 <= f32 + f64 +f32 <= f32 + i +f32 <= f32 ? greet : half f32 <= f64 -f32 <= f64 ? ok : f64 -f32 <= f64 ^ f32 -f32 <= f64 and ok -f32 <= findIndex(list, ok) -f32 <= first(array) +f32 <= findIndex(list, ok) * f64 +f32 <= float(1) +f32 <= float(i) +f32 <= float(i64) +f32 <= float(toJSON(1)) +f32 <= floor(0.5) f32 <= half(0.5) +f32 <= half(1) +f32 <= half(f64) f32 <= i -f32 <= i != nil -f32 <= i % i64 -f32 <= i ** i32 -f32 <= i - 0.5 -f32 <= i / f32 -f32 <= i == ok +f32 <= i == nil +f32 <= i and i32 <= f32 f32 <= i32 -f32 <= i32 * i64 f32 <= i32 ** i32 -f32 <= i32 + i32 -f32 <= i32 - 1 +f32 <= i32 + 1 f32 <= i32 / 1 -f32 <= i32 ? 0.5 : i32 -f32 <= i32 and ok f32 <= i64 -f32 <= i64 * i -f32 <= i64 ? true : array -f32 <= i64 or ok -f32 <= int(0.5) -f32 <= int(i) -f32 <= len("foo") -f32 <= max(f32) -f32 <= max(i64) -f32 <= min(i64, i32) +f32 <= i64 ** i64 +f32 <= i64 - f32 +f32 <= i64 ? f64 : f64 +f32 <= i64 ^ i32 +f32 <= i64 || nil in array +f32 <= last(array) +f32 <= min(0.5) +f32 <= min(1) +f32 <= min(f64) +f32 <= round(0.5) f32 <= score(1) -f32 <= score(i) -f32 == --f64 f32 == -0.5 f32 == -1 f32 == -f32 f32 == -i32 f32 == -i64 -f32 == 0.5 && i32 == i32 -f32 == 0.5 * i32 -f32 == 0.5 ** 1 -f32 == 0.5 and ok -f32 == 1 && ok ? add : f32 -f32 == 1 ^ i -f32 == abs(1) -f32 == array[1] -f32 == count(array, ok) +f32 == 0.5 != ok +f32 == 0.5 * 0.5 +f32 == 0.5 * 1 +f32 == 0.5 ** i32 +f32 == 0.5 + 1 +f32 == 0.5 / i32 +f32 == 0.5 / i64 +f32 == 0.5 ? array : greet +f32 == 0.5 ? true : score +f32 == 0.5 ^ 0.5 +f32 == 0.5 || f64 >= 1 +f32 == 1 != nil +f32 == 1 + f32 +f32 == 1 - 1 +f32 == 1 - i +f32 == 1 == ok +f32 == 1 ? foo : f32 +f32 == 1 ? ok : add != nil +f32 == add(i, 1) +f32 == array[i32] +f32 == bitnot(i) +f32 == ceil(1) +f32 == ceil(i32) +f32 == ceil(i64) f32 == f32 -f32 == f32 ** f32 -f32 == f32 - i32 -f32 == f32 ? 1 : greet -f32 == f32 ? list : "bar" +f32 == f32 ? f32 : list +f32 == f32 and ok f32 == f64 -f32 == f64 - 1 -f32 == f64 - f64 -f32 == f64 ? ok : i64 -f32 == find(array, ok) -f32 == findLast(array, ok) -f32 == findLastIndex(list, true) -f32 == get(array, 1) +f32 == f64 + f64 +f32 == f64 ^ 1 +f32 == findLastIndex(array, ok) +f32 == first(array) +f32 == float(0.5) +f32 == float(1) +f32 == floor(f64) +f32 == half(1) +f32 == half(f64) f32 == i -f32 == i * i64 -f32 == i + f64 + 0.5 -f32 == i - f64 -f32 == i - i32 -f32 == i / 0.5 -f32 == i ? "foo" : i64 -f32 == i ? i : 0.5 +f32 == i != nil +f32 == i - 0.5 +f32 == i - i64 f32 == i32 -f32 == i32 % 1 -f32 == i32 - 0.5 +f32 == i32 + i32 +f32 == i32 ? 0.5 : array +f32 == i32 ? i64 : i64 +f32 == i32 ? true : half +f32 == i32 ^ i32 +f32 == i32 or ok f32 == i64 -f32 == i64 % i -f32 == i64 * 0.5 -f32 == int(1) -f32 == max(0.5, 1) -f32 == max(i) +f32 == i64 * i64 +f32 == i64 + 0.5 +f32 == i64 - 0.5 +f32 == i64 - 1 +f32 == i64 ? div : 0.5 +f32 == last(array) +f32 == max(f64) f32 == min(0.5) -f32 == min(i64) -f32 == nil ? "foo" : div -f32 == nil ? i32 : greet +f32 == min(f32) +f32 == nil ? array : add +f32 == nil ? i : div +f32 == round(1) f32 == score(1) +f32 == score(i) +f32 > -(0.5 / 1) f32 > -0.5 -f32 > -f64 -f32 > -i +f32 > -f32 f32 > -i32 -f32 > -i64 -f32 > 0.5 != false -f32 > 0.5 != ok -f32 > 0.5 - 0.5 -f32 > 0.5 / 0.5 -f32 > 0.5 ? foo : f64 -f32 > 0.5 ? greet : half -f32 > 1 % 1 -f32 > 1 ** 0.5 -f32 > 1 + f32 -f32 > 1 / i64 -f32 > 1 == true -f32 > 1 ? nil : half -f32 > 1 ^ i32 -f32 > array[i32] +f32 > 0.5 / f32 +f32 > 0.5 / i32 +f32 > 0.5 == true ? i32 : array +f32 > 0.5 ? half : false +f32 > 0.5 ^ f64 +f32 > 1 ** i +f32 > 1 ? 1 : false +f32 > 1 ? list : "foo" +f32 > abs(1) +f32 > abs(f32) +f32 > abs(f64) +f32 > count(array, ok) f32 > f32 -f32 > f32 ** f32 -f32 > f32 - i -f32 > f32 == true +f32 > f32 + f32 +f32 > f32 - f32 +f32 > f32 == nil f32 > f64 -f32 > f64 - i32 -f32 > f64 / i64 -f32 > f64 ? array : false -f32 > f64 ? true : array -f32 > f64 or ok +f32 > f64 * i +f32 > f64 ** 0.5 +f32 > float(0.5) +f32 > float(i32) +f32 > floor(1) +f32 > half(1) +f32 > half(f64) f32 > i -f32 > i * 0.5 -f32 > i + f32 +f32 > i != ok +f32 > i * 1 +f32 > i ? array : 1 +f32 > i ? foo : list f32 > i32 -f32 > i32 != ok -f32 > i32 * i +f32 > i32 != nil +f32 > i32 * f64 +f32 > i32 ? 0.5 : greet +f32 > i32 and ok f32 > i64 -f32 > i64 ? 1 : f64 -f32 > i64 ? ok : greet -f32 > int(0.5) -f32 > int(f64) -f32 > max(i32) -f32 > max(i32, 1) -f32 > min(f64) -f32 > score(1) -f32 > score(i) +f32 > i64 % i64 +f32 > i64 ** i +f32 > i64 + 0.5 +f32 > i64 - i64 +f32 > i64 ? i : 0.5 +f32 > mean(array) +f32 > min(f32) +f32 > min(i64) +f32 > reduce(array, #) +f32 > reduce(array, i64) +f32 > reduce(list, f32) +f32 > round(0.5) +f32 > score(1, 1) +f32 >= -0.5 +f32 >= -f32 f32 >= -f64 -f32 >= -i -f32 >= -i32 -f32 >= -i64 -f32 >= 0.5 ** f64 -f32 >= 0.5 - 0.5 -f32 >= 0.5 == ok -f32 >= 1 != ok -f32 >= 1 != true -f32 >= 1 % 1 -f32 >= 1 % i -f32 >= 1 - 1 -f32 >= 1 - i -f32 >= 1 - i64 -f32 >= 1 ? "foo" endsWith "foo" : f64 -f32 >= abs(1) +f32 >= 0.5 * f64 +f32 >= 0.5 / i64 +f32 >= 0.5 ? i64 : nil +f32 >= 0.5 ^ i64 +f32 >= 1 == false +f32 >= 1 == ok ? add : array +f32 >= 1 ? i : 1 +f32 >= abs(0.5) +f32 >= abs(f32) +f32 >= abs(i) +f32 >= array[1] +f32 >= array[i32] +f32 >= bitnot(i32) +f32 >= count(list, false) f32 >= f32 f32 >= f32 ** 1 -f32 >= f32 ** f32 -f32 >= f32 + i32 +f32 >= f32 - i64 +f32 >= f32 ? half : greet +f32 >= f32 or nil != ok f32 >= f64 -f32 >= f64 + i32 -f32 >= first(array) -f32 >= float(i32) -f32 >= float(i64) +f32 >= f64 && ok +f32 >= f64 ** 0.5 +f32 >= f64 ** i32 +f32 >= f64 - f64 +f32 >= f64 / i64 +f32 >= f64 or ok +f32 >= float(0.5) f32 >= half(f64) f32 >= i -f32 >= i != true -f32 >= i * 0.5 -f32 >= i ** 0.5 -f32 >= i ** i32 -f32 >= i + f64 -f32 >= i ? "bar" : nil -f32 >= i ? ok : i +f32 >= i - f32 +f32 >= i ? 1 : nil +f32 >= i ^ i f32 >= i32 -f32 >= i32 * 0.5 -f32 >= i32 ? array : foo -f32 >= i32 ^ i32 +f32 >= i32 % i +f32 >= i32 - f32 +f32 >= i32 / i64 +f32 >= i32 ? f32 : 0.5 +f32 >= i32 or not ok f32 >= i64 -f32 >= i64 % i64 -f32 >= i64 ** 0.5 -f32 >= i64 ? 1 : i32 -f32 >= i64 ? i64 : add -f32 >= i64 || ok -f32 >= len("foo") +f32 >= i64 * i32 +f32 >= i64 + f64 +f32 >= i64 / 1 +f32 >= len("bar") f32 >= max(i) -f32 >= min(i) +f32 >= max(i64) +f32 >= reduce(array, #) f32 >= score(1) -f32 ^ (1 * f32) -f32 ^ (1 + 1) -f32 ^ (1 - 0.5) -f32 ^ (f32 * 0.5) -f32 ^ (f32 / 1) -f32 ^ (i + i) -f32 ^ (i32 % 1) -f32 ^ (i32 % i64) -f32 ^ (i32 / 1) -f32 ^ (i32 / f64) +f32 >= sum(array) +f32 ^ (0.5 * f64) +f32 ^ (0.5 / 1) +f32 ^ (0.5 / i) +f32 ^ (1 * i) +f32 ^ (1 + f64) +f32 ^ (f32 * i64) +f32 ^ (f64 * f64) +f32 ^ (f64 - 1) +f32 ^ (f64 / i) +f32 ^ (i64 * f64) +f32 ^ (i64 * i32) +f32 ^ (i64 * i64) +f32 ^ (i64 + i64) f32 ^ (i64 - f32) f32 ^ -0.5 f32 ^ -1 -f32 ^ -f32 -f32 ^ -i f32 ^ -i32 -f32 ^ -i64 -f32 ^ 0.5 != i64 -f32 ^ 0.5 + f32 -f32 ^ 0.5 + i64 -f32 ^ 0.5 - f64 -f32 ^ 0.5 <= 0.5 ^ 0.5 -f32 ^ 0.5 ^ f32 -f32 ^ 1 - i -f32 ^ 1 - i32 -f32 ^ 1 <= 1 * 1 -f32 ^ 1 <= i32 -f32 ^ 1 ^ 0.5 +f32 ^ 0.5 ** i32 +f32 ^ 0.5 - f32 +f32 ^ 0.5 - i32 +f32 ^ 0.5 == i64 +f32 ^ 0.5 ^ 0.5 +f32 ^ 1 != i64 +f32 ^ 1 / f32 +f32 ^ 1 >= -0.5 +f32 ^ abs(1) +f32 ^ abs(f32) +f32 ^ array[i64] +f32 ^ array[i] +f32 ^ bitnot(1) +f32 ^ bitor(1, i32) f32 ^ f32 -f32 ^ f32 ** i -f32 ^ f32 + f32 -f32 ^ f32 / f32 +f32 ^ f32 ^ 0.5 +f32 ^ f32 in array f32 ^ f64 -f32 ^ f64 < f64 -f32 ^ f64 < i64 -f32 ^ f64 <= f64 -f32 ^ f64 == f64 -f32 ^ f64 > i +f32 ^ f64 ** f64 +f32 ^ f64 / 1 * 1 +f32 ^ f64 / f64 +f32 ^ f64 == i64 +f32 ^ f64 not in array +f32 ^ floor(0.5) +f32 ^ floor(1) +f32 ^ half(1) f32 ^ half(f64) f32 ^ i -f32 ^ i ** i32 +f32 ^ i - f64 +f32 ^ i <= i +f32 ^ i >= f64 +f32 ^ i ^ f32 f32 ^ i32 -f32 ^ i32 + f32 +f32 ^ i32 ** i64 f32 ^ i64 -f32 ^ last(array) -f32 ^ max(0.5) -f32 ^ max(f32) -f32 ^ max(i64) +f32 ^ i64 ** 1 +f32 ^ i64 + i64 +f32 ^ i64 - f32 +f32 ^ i64 >= f64 +f32 ^ i64 ^ f32 +f32 ^ int(i32) +f32 ^ len("foo") +f32 ^ len(array) f32 ^ min(1) -f32 ^ min(1, 1) +f32 ^ min(f64) +f32 ^ min(i) +f32 ^ reduce(array, 1) +f32 ^ round(i) +f32 ^ round(i32) f32 ^ score(i) -f32 in [false, list] +f32 ^ score(reduce(array, #)) +f32 in [i] f32 in [nil] -f32 not in sort(array) +f32 in array +f32 in array == nil +f32 in array ? 1 : i +f32 in array ? false : 0.5 +f32 in array ? nil : "bar" +f32 in groupBy(array, #) +f32 in groupBy(list, #) +f32 in groupBy(list, ok) +f32 in map(array, #) +f32 not in [f32, "bar"] +f32 not in array +f32 not in array ? foo : i +f32 not in array ? i32 : div f64 -f64 != -(0.5 ** 0.5) +f64 != -0.5 f64 != -1 -f64 != -f64 +f64 != -f32 f64 != -i -f64 != -i32 -f64 != 0.5 && ok -f64 != 0.5 + 1 -f64 != 0.5 + f64 -f64 != 0.5 == nil -f64 != 0.5 == true -f64 != 0.5 ? false : array -f64 != 0.5 and ok -f64 != 1 ? list : false -f64 != 1 ^ i64 -f64 != abs(f32) -f64 != array[i64] +f64 != -i64 +f64 != 0.5 != false +f64 != 0.5 ** 1 +f64 != 0.5 ** f64 +f64 != 0.5 + f32 +f64 != 0.5 ^ 0.5 +f64 != 1 - 1 +f64 != 1 / 0.5 +f64 != 1 ? half : div +f64 != 1 ^ i +f64 != abs(i32) +f64 != bitnot(i64) +f64 != ceil(i) f64 != f32 -f64 != f32 * i32 +f64 != f32 != nil +f64 != f32 + 0.5 +f64 != f32 + i32 +f64 != f32 - i32 +f64 != f32 ? array : nil +f64 != f32 ? i32 : "bar" +f64 != f32 ? ok : i +f64 != f32 or greet == nil f64 != f64 f64 != f64 * f32 -f64 != f64 ^ 1 -f64 != findLastIndex(list, ok) +f64 != f64 ? f64 : true f64 != first(array) -f64 != get(array, i32) +f64 != floor(1) f64 != half(0.5) -f64 != half(f64) +f64 != half(1) f64 != i -f64 != i && ok -f64 != i + 1 +f64 != i * 0.5 +f64 != i / 1 +f64 != i / f32 +f64 != i ^ f64 f64 != i32 -f64 != i32 + f64 -f64 != i32 ? "bar" : nil -f64 != i32 ? add : 1 -f64 != i32 ^ 0.5 +f64 != i32 * f32 +f64 != i32 == ok +f64 != i32 ? f64 : ok +f64 != i32 ? foo : ok +f64 != i32 ^ i32 f64 != i64 -f64 != i64 ** 0.5 +f64 != i64 * f64 +f64 != i64 - i32 +f64 != i64 or ok f64 != int(i64) -f64 != max(i64) -f64 != min(1) -f64 != min(i32) -f64 != nil == ok -f64 != score(1) -f64 != score(i) -f64 * (0.5 - f32) -f64 * (0.5 - i64) -f64 * (f32 + i32) -f64 * (i32 - 0.5) -f64 * (i64 - f64) +f64 != min(f64) +f64 != nil != ok +f64 != nil && f64 > 0.5 +f64 != nil == true +f64 != nil ? array : foo +f64 != nil ? f64 : half +f64 != nil ? i64 : 0.5 +f64 != nil ? nil : half +f64 != round(1) +f64 * (0.5 - 1) +f64 * (i64 + 0.5) f64 * -1 f64 * -f32 f64 * -f64 -f64 * -i32 -f64 * -i64 -f64 * 0.5 * 0.5 ^ i64 +f64 * 0.5 * 1 +f64 * 0.5 * i64 +f64 * 0.5 ** 0.5 +f64 * 0.5 / 0.5 +f64 * 0.5 / f32 f64 * 0.5 / i32 +f64 * 0.5 < f32 +f64 * 0.5 <= i +f64 * 0.5 == f64 f64 * 0.5 ^ 1 -f64 * 1 ** 0.5 -f64 * 1 + i64 -f64 * 1 / i32 -f64 * 1 < 0.5 * 0.5 -f64 * abs(i) +f64 * 1 * f64 +f64 * 1 * i32 +f64 * 1 ** 1 +f64 * 1 + f64 +f64 * 1 - i32 +f64 * 1 <= 1 + 1 +f64 * 1 == i64 +f64 * 1 > f32 +f64 * 1 > f64 +f64 * 1 >= f64 +f64 * bitnot(i64) +f64 * ceil(i) +f64 * ceil(i64) f64 * f32 -f64 * f32 * f32 -f64 * f32 - f32 -f64 * f32 - f64 -f64 * f32 / f64 -f64 * f32 >= f64 +f64 * f32 != i +f64 * f32 / i64 +f64 * f32 > f64 +f64 * f32 > i f64 * f64 -f64 * f64 / i -f64 * f64 < f64 -f64 * f64 >= score(1) -f64 * float(i) +f64 * f64 * f64 +f64 * f64 / 1 +f64 * f64 <= f64 +f64 * f64 > f64 +f64 * f64 in array +f64 * float(f32) +f64 * floor(0.5) +f64 * get(array, 1) +f64 * half(f64) f64 * i -f64 * i != i -f64 * i * 0.5 -f64 * i * i -f64 * i * i64 -f64 * i - f64 +f64 * i / f64 f64 * i32 -f64 * i32 * 1 -f64 * i32 > f64 +f64 * i32 != i64 * f64 +f64 * i32 - i32 f64 * i64 -f64 * i64 + f32 -f64 * i64 + i -f64 * i64 - f32 +f64 * i64 ** i +f64 * i64 == i +f64 * i64 > i32 f64 * i64 ^ i32 -f64 * int(0.5) -f64 * int(f32) -f64 * int(f64) -f64 * last(array) -f64 * len(list) -f64 * max(i64) -f64 * min(i32) -f64 * score(1) -f64 * score(i) -f64 ** (0.5 * i32) -f64 ** (0.5 + 1) -f64 ** (0.5 + i) -f64 ** (1 + 1) -f64 ** (1 + f64) -f64 ** (1 - 1) -f64 ** (1 / i64) -f64 ** (f32 * i) -f64 ** (f64 + 0.5) -f64 ** (f64 + f64) -f64 ** (f64 + i) -f64 ** (i % 1) -f64 ** (i % i32) -f64 ** (i32 * 1) -f64 ** (i32 + 0.5) -f64 ** (i32 - f32) -f64 ** (i64 * 1) +f64 * median(array) +f64 * min(1) +f64 * min(f64) +f64 * min(i) +f64 * round(1) +f64 * round(i64) +f64 ** (0.5 - i) +f64 ** (0.5 / i64) +f64 ** (1 * i) +f64 ** (f64 * i32) +f64 ** (f64 / 1) +f64 ** (i * 1) +f64 ** (i * i64) +f64 ** (i32 * i) +f64 ** (i32 + i32) +f64 ** (i32 - f64) +f64 ** (i32 / i64) +f64 ** (i64 % 1) f64 ** (i64 + 0.5) -f64 ** (i64 / i) +f64 ** (i64 + i64) +f64 ** (i64 - i32) +f64 ** (i64 / 0.5) f64 ** -0.5 f64 ** -1 -f64 ** -f32 -f64 ** -f64 f64 ** -i -f64 ** -i32 -f64 ** -i64 -f64 ** 0.5 ** i64 -f64 ** 0.5 <= 1 - 1 -f64 ** 1 ** 0.5 ** 0.5 -f64 ** 1 < 1 - i64 -f64 ** 1 == f64 + f32 -f64 ** 1 ^ i -f64 ** 1 ^ i64 -f64 ** abs(1) -f64 ** abs(f64) +f64 ** 0.5 ** f32 +f64 ** 0.5 == i32 +f64 ** 1 + f64 +f64 ** 1 / i +f64 ** 1 < f32 +f64 ** 1 > i32 +f64 ** 1 ^ f32 +f64 ** abs(i) +f64 ** bitand(1, 1) +f64 ** ceil(0.5) +f64 ** ceil(f64) f64 ** f32 -f64 ** f32 ** 0.5 -f64 ** f32 == i64 +f64 ** f32 != f64 +f64 ** f32 ** f64 +f64 ** f32 > f64 f64 ** f64 -f64 ** f64 != f32 -f64 ** f64 ** 0.5 -f64 ** f64 / f32 -f64 ** f64 < f64 -f64 ** f64 <= f64 -f64 ** f64 ^ f64 -f64 ** f64 ^ i32 -f64 ** float(i32) -f64 ** get(array, i64) +f64 ** f64 - f32 +f64 ** f64 / min(1) +f64 ** f64 <= f32 +f64 ** f64 <= i64 +f64 ** f64 ^ 0.5 f64 ** half(0.5) f64 ** i -f64 ** i != i -f64 ** i - i32 -f64 ** i / f32 -f64 ** i >= i32 -f64 ** i ^ i32 +f64 ** i * f64 +f64 ** i ** i +f64 ** i + -i32 +f64 ** i + f32 f64 ** i32 -f64 ** i32 != max(f64, 0.5) -f64 ** i32 ** 1 -f64 ** i32 ^ 1 +f64 ** i32 != f64 +f64 ** i32 > f64 f64 ** i64 -f64 ** i64 ** i64 -f64 ** i64 / f64 -f64 ** i64 ^ i -f64 ** int(0.5) -f64 ** int(1) -f64 ** max(i32) -f64 ** min(1) +f64 ** i64 + f32 +f64 ** i64 <= f32 +f64 ** i64 not in map(array, 0.5) +f64 ** last(array) +f64 ** len("bar") +f64 ** max(i) f64 ** min(f32) -f64 ** score(1, 1) +f64 ** reduce(array, #) +f64 ** reduce(list, i32) +f64 ** score(i) f64 + -0.5 +f64 + -1 f64 + -f64 f64 + -i f64 + -i32 -f64 + -i64 -f64 + 0.5 * 1 -f64 + 0.5 * i32 f64 + 0.5 / f32 -f64 + 0.5 == i64 -f64 + 1 != f64 -f64 + 1 + f64 -f64 + 1 - 0.5 -f64 + 1 < i64 -f64 + 1 > 0.5 ? 1 : 0.5 -f64 + 1 > i64 -f64 + 1 >= f32 -f64 + abs(i) -f64 + abs(i64) -f64 + array[1] -f64 + array[i64] -f64 + count(array, ok) +f64 + 0.5 < i32 +f64 + 0.5 <= f64 +f64 + 0.5 <= float(f32) +f64 + 0.5 <= i +f64 + 0.5 > f64 +f64 + 0.5 ^ i +f64 + 0.5 ^ i64 +f64 + 1 % i +f64 + 1 * 0.5 +f64 + 1 * 1 +f64 + 1 * f64 +f64 + 1 ** 0.5 +f64 + 1 + i32 +f64 + 1 / i64 +f64 + 1 ^ i +f64 + 1 not in map(array, #) +f64 + ceil(0.5) +f64 + count(list, true) f64 + f32 -f64 + f32 * i32 -f64 + f32 - i64 +f64 + f32 == i != true f64 + f64 -f64 + f64 + i64 -f64 + f64 == i32 -f64 + f64 > i32 -f64 + f64 ^ 0.5 -f64 + float(i64) +f64 + f64 < f32 +f64 + f64 <= i32 +f64 + f64 ^ i32 +f64 + float(f64) +f64 + floor(f64) +f64 + get(array, i32) f64 + half(0.5) -f64 + half(f64) +f64 + half(1) f64 + i -f64 + i ** 0.5 -f64 + i + 1 +f64 + i + 0.5 f64 + i / 0.5 +f64 + i / i32 +f64 + i > 0.5 != true +f64 + i > f64 +f64 + i >= f64 f64 + i32 -f64 + i32 ** i64 -f64 + i32 + i32 -f64 + i32 / 1 -f64 + i32 <= i -f64 + i32 >= i64 +f64 + i32 != i64 +f64 + i32 % i32 +f64 + i32 ** 1 +f64 + i32 > i64 f64 + i64 -f64 + i64 - f64 -f64 + i64 ^ f32 -f64 + int(0.5) -f64 + int(i32) -f64 + len(array) -f64 + min(0.5, 0.5) -f64 + min(f32) -f64 + score(i) +f64 + i64 + i64 +f64 + i64 / f64 +f64 + i64 > i32 / i +f64 + i64 > i64 +f64 + i64 ^ i32 +f64 + reduce(array, #) +f64 + reduce(list, f32) +f64 + score(1) f64 - -0.5 f64 - -1 f64 - -f64 f64 - -i -f64 - -i32 f64 - -i64 -f64 - 0.5 != f64 -f64 - 0.5 * 0.5 -f64 - 0.5 ** i -f64 - 0.5 + f32 -f64 - 0.5 + i -f64 - 0.5 + i32 -f64 - 0.5 >= -0.5 -f64 - 1 * f32 -f64 - 1 ** f32 -f64 - 1 ** i32 -f64 - 1 + 1 +f64 - 0.5 - 0.5 +f64 - 0.5 - 1 +f64 - 0.5 - i32 +f64 - 0.5 >= f64 +f64 - 0.5 ^ i64 +f64 - 1 * i32 +f64 - 1 + i64 f64 - 1 - f64 -f64 - 1 / 0.5 +f64 - 1 / i64 f64 - 1 < f32 -f64 - 1 ^ 0.5 -f64 - 1 ^ 1 -f64 - abs(0.5) -f64 - abs(i) -f64 - array[i64] +f64 - 1 < f32 ? i64 : false +f64 - 1 >= len(array) +f64 - 1 ^ i64 f64 - f32 -f64 - f32 * f64 -f64 - f32 + 1 + 0.5 -f64 - f32 - f64 +f64 - f32 != i64 +f64 - f32 + f32 f64 - f32 < f64 -f64 - f32 >= i32 +f64 - f32 ^ f32 f64 - f64 -f64 - f64 - 0.5 -f64 - f64 - i32 -f64 - f64 <= i -f64 - f64 == f64 -f64 - f64 > f32 -f64 - f64 >= get(array, i64) -f64 - get(array, i) -f64 - half(0.5) +f64 - f64 + -1 +f64 - f64 < f64 +f64 - float(f32) +f64 - floor(1) +f64 - half(1) f64 - i -f64 - i % i32 +f64 - i + 0.5 f64 - i + 1 -f64 - i / 1 -f64 - i < i32 -f64 - i < i64 -f64 - i == i -f64 - i == i64 -f64 - i > f64 +f64 - i + i32 +f64 - i / i +f64 - i ^ f32 f64 - i32 -f64 - i32 + i -f64 - i32 - i64 -f64 - i32 >= i32 +f64 - i32 / 0.5 +f64 - i32 >= i64 +f64 - i32 ^ 0.5 f64 - i64 -f64 - i64 * 0.5 -f64 - i64 * 1 -f64 - i64 - f32 -f64 - int(0.5) +f64 - i64 ** i32 +f64 - int(i) f64 - int(i32) -f64 - max(1) -f64 - min(1) -f64 - min(i32, i64) +f64 - reduce(array, -#) +f64 - round(1) f64 - score(i) -f64 / (0.5 + f32) -f64 / (0.5 - 0.5) -f64 / (0.5 - f64) -f64 / (0.5 - i32) -f64 / (1 + i32) -f64 / (1 - 1) -f64 / (i32 + f64) -f64 / (i32 - 1) -f64 / (i64 - i64) +f64 / (0.5 - 1) +f64 / (0.5 - i64) +f64 / (f32 + 1) +f64 / (i + 0.5) +f64 / (i32 + i64) f64 / -0.5 f64 / -1 -f64 / -f32 +f64 / -f64 f64 / -i f64 / -i32 -f64 / 0.5 * i -f64 / 0.5 ** 0.5 -f64 / 0.5 ** f64 -f64 / 0.5 / f64 -f64 / 0.5 / i64 -f64 / 0.5 > f64 -f64 / 0.5 ^ i +f64 / -i64 +f64 / 0.5 != f64 +f64 / 0.5 * f32 +f64 / 0.5 + f64 +f64 / 0.5 / 1 +f64 / 0.5 < i32 +f64 / 0.5 == i32 +f64 / 0.5 >= i64 f64 / 1 != i -f64 / 1 * abs(i64) -f64 / 1 * i -f64 / 1 ** 0.5 -f64 / 1 ^ i64 -f64 / array[i32] -f64 / array[i] +f64 / 1 * i32 +f64 / 1 ** 1 +f64 / 1 / i +f64 / 1 <= i64 +f64 / 1 ^ i +f64 / abs(f64) +f64 / array[1] +f64 / array[i64] +f64 / ceil(i32) f64 / f32 -f64 / f32 != f64 f64 / f32 * i -f64 / f32 > f64 -f64 / f32 ^ i32 -f64 / f32 in [f32] +f64 / f32 * i64 +f64 / f32 / 0.5 +f64 / f32 == f32 +f64 / f32 ^ 0.5 f64 / f64 -f64 / f64 != f32 -f64 / f64 * f32 -f64 / f64 - f32 -f64 / f64 - f64 -f64 / get(array, i64) +f64 / f64 / 0.5 +f64 / f64 >= f64 +f64 / f64 >= i32 +f64 / f64 >= i64 +f64 / float(1) +f64 / float(f64) +f64 / floor(i64) +f64 / get(array, 1) +f64 / get(array, i32) f64 / half(0.5) +f64 / half(1) f64 / i -f64 / i * i32 +f64 / i != f64 f64 / i ** 0.5 -f64 / i ** i32 -f64 / i + i64 -f64 / i < f64 -f64 / i > 1 ** 1 -f64 / i > f64 -f64 / i >= f64 +f64 / i ** f32 +f64 / i + i32 +f64 / i == i64 +f64 / i >= i f64 / i32 -f64 / i32 / i32 -f64 / i32 < f64 +f64 / i32 != 0.5 - i64 +f64 / i32 == f64 ** i +f64 / i32 == i32 +f64 / i32 >= f32 f64 / i64 -f64 / i64 * i64 ^ i -f64 / i64 - f32 -f64 / i64 / 0.5 -f64 / i64 / i64 -f64 / i64 <= f64 -f64 / i64 > i +f64 / i64 < f64 f64 / int(f32) -f64 / int(i64) +f64 / last(array) f64 / max(i) -f64 / min(0.5) -f64 / score(i) +f64 / reduce(array, #) +f64 / reduce(array, f64) +f64 / reduce(list, f32) +f64 / round(1) +f64 / round(i64) +f64 / score(1) f64 < -0.5 -f64 < -1 f64 < -i32 f64 < -i64 -f64 < 0.5 ** f32 +f64 < 0.5 + i64 +f64 < 0.5 / 0.5 +f64 < 0.5 / i f64 < 0.5 == true -f64 < 0.5 ? 0.5 : foo -f64 < 0.5 ? 1 : array -f64 < 0.5 ? greet : false -f64 < 0.5 ^ 1 -f64 < 0.5 or ok -f64 < 1 == not ok -f64 < 1 ? 1 : half -f64 < 1 ? 1 : i -f64 < 1 ? ok : i -f64 < 1 and nil == i32 +f64 < 0.5 ? f64 : array +f64 < 1 % 1 +f64 < 1 * 0.5 +f64 < 1 ** i32 +f64 < 1 / f32 +f64 < 1 == false +f64 < 1 ? i : "foo" f64 < abs(1) -f64 < abs(i32) -f64 < array[i32] -f64 < count(list, true) +f64 < abs(f32) +f64 < array[i64] +f64 < bitnot(1) +f64 < ceil(f64) +f64 < count(array, false) f64 < f32 -f64 < f32 * 0.5 -f64 < f32 * f64 -f64 < f32 ** i32 -f64 < f32 - 1 -f64 < f32 ? array : 0.5 +f64 < f32 * i +f64 < f32 / i64 +f64 < f32 ^ 1 +f64 < f32 ^ f64 f64 < f64 -f64 < f64 * f32 +f64 < f64 == ok +f64 < floor(i64) f64 < get(array, i) -f64 < half(0.5) f64 < i -f64 < i - f64 -f64 < i == ok -f64 < i ? false : nil +f64 < i && "bar" < "bar" +f64 < i && ok +f64 < i ** i32 +f64 < i + 1 +f64 < i ? 0.5 : "bar" +f64 < i ? div : nil f64 < i32 -f64 < i32 % i32 -f64 < i32 % i64 -f64 < i32 == ok -f64 < i32 and ok +f64 < i32 * f64 +f64 < i32 * i +f64 < i32 ** f32 +f64 < i32 ** i64 +f64 < i32 + f32 +f64 < i32 + f64 +f64 < i32 + i64 +f64 < i32 ? false : ok +f64 < i32 ? true : 1 +f64 < i32 ^ 1 +f64 < i32 ^ i32 f64 < i64 -f64 < i64 * i +f64 < i64 * f64 +f64 < i64 ^ i f64 < int(0.5) -f64 < max(1, i64) -f64 < min(1) -f64 < min(f64) -f64 < min(i64) +f64 < max(1) +f64 < max(f64, i32) +f64 < min(0.5, i64) +f64 < min(f32) +f64 < min(f64, f32) +f64 < min(i32) +f64 < round(0.5) +f64 < score(1) f64 <= -0.5 f64 <= -1 -f64 <= -f32 f64 <= -i f64 <= -i32 -f64 <= 0.5 != ok -f64 <= 0.5 - 1 -f64 <= 0.5 / 0.5 -f64 <= 0.5 == true -f64 <= 0.5 ? foo : list -f64 <= 0.5 ? nil : add -f64 <= 1 != true -f64 <= 1 ** 0.5 +f64 <= 0.5 != false +f64 <= 0.5 + 0.5 +f64 <= 0.5 / f32 +f64 <= 0.5 ? greet : f64 +f64 <= 0.5 ? score : array +f64 <= 1 * i32 f64 <= 1 + 0.5 -f64 <= 1 == false -f64 <= 1 ? array : foo -f64 <= 1 ^ i64 -f64 <= abs(f32) +f64 <= 1 / i +f64 <= 1 == nil +f64 <= 1 ? "bar" : array +f64 <= 1 ? half : list +f64 <= 1 ^ f64 +f64 <= abs(0.5) f64 <= abs(i) -f64 <= array[i] +f64 <= array[i64] +f64 <= ceil(i) f64 <= f32 -f64 <= f32 + f64 -f64 <= f32 - 0.5 -f64 <= f32 ? false : "foo" -f64 <= f32 ? false : i -f64 <= f32 ? i64 : false +f64 <= f32 ** 0.5 +f64 <= f32 - i64 +f64 <= f32 ? f64 : div +f64 <= f32 ^ f32 f64 <= f64 +f64 <= f64 != ok f64 <= f64 + f64 -f64 <= f64 - 0.5 -f64 <= f64 - f64 -f64 <= f64 ^ 0.5 -f64 <= find(array, true) -f64 <= float(f64) +f64 <= f64 + i32 +f64 <= f64 - 1 +f64 <= f64 ^ i +f64 <= float(i) +f64 <= float(i64) f64 <= half(0.5) +f64 <= half(1) f64 <= i -f64 <= i * i32 -f64 <= i ? false : false -f64 <= i ? foo : false +f64 <= i * i64 +f64 <= i - 1 +f64 <= i - f32 +f64 <= i ^ f64 f64 <= i32 -f64 <= i32 == true -f64 <= i32 ? "bar" : nil -f64 <= i32 ? add : ok -f64 <= i32 ? i32 : false +f64 <= i32 ** 1 +f64 <= i32 ? div : foo +f64 <= i32 or all(list, ok) f64 <= i64 -f64 <= i64 % 1 -f64 <= i64 - f32 -f64 <= i64 - i64 -f64 <= i64 ^ 1 -f64 <= i64 and ok -f64 <= int(1) -f64 <= int(f64) -f64 <= int(i) -f64 <= max(f32) -f64 <= min(0.5) -f64 <= score(1) +f64 <= i64 + 1 +f64 <= i64 - 0.5 +f64 <= int(f32) +f64 <= max(i) +f64 <= max(i64, i32) +f64 <= min(i32) +f64 <= min(i64) +f64 <= reduce(array, #) f64 == -0.5 f64 == -1 f64 == -f32 f64 == -f64 f64 == -i -f64 == -i32 -f64 == 0.5 != ok +f64 == -i64 f64 == 0.5 ** 0.5 -f64 == 0.5 ** i32 -f64 == 0.5 / i -f64 == 0.5 / i32 -f64 == 0.5 ? i64 : div -f64 == 1 * f64 -f64 == 1 == nil -f64 == 1 ? false : "foo" -f64 == abs(1) -f64 == abs(i32) -f64 == array[i32] -f64 == array[i64] +f64 == 0.5 - i +f64 == 0.5 ? 0.5 : i64 +f64 == 0.5 ? 1 : 1 +f64 == 1 != ok +f64 == 1 % 1 +f64 == 1 * i64 +f64 == 1 ** 0.5 +f64 == 1 == false +f64 == abs(0.5) +f64 == abs(i64) +f64 == ceil(i) f64 == f32 -f64 == f32 + i64 -f64 == f32 - 1 -f64 == f32 / 0.5 +f64 == f32 && ok +f64 == f32 + len(array) +f64 == f32 ? 0.5 : i +f64 == f32 ^ i32 f64 == f64 -f64 == f64 ** i32 -f64 == f64 - 1 -f64 == f64 / 1 +f64 == f64 ** i +f64 == f64 - f64 f64 == float(0.5) -f64 == float(i) -f64 == get(array, i64) +f64 == floor(0.5) +f64 == half(0.5) f64 == half(f64) f64 == i -f64 == i ** f32 -f64 == i + 0.5 -f64 == i / i32 -f64 == i ? false : f32 -f64 == i ^ f32 +f64 == i != false +f64 == i * 1 +f64 == i ? i32 : score f64 == i32 -f64 == i32 * 1 -f64 == i32 + f64 -f64 == i32 / 1 -f64 == i32 ? greet : array +f64 == i32 == ok ? 1 : list +f64 == i32 == true +f64 == i32 || ok f64 == i64 -f64 == i64 - f32 -f64 == i64 == true -f64 == int(0.5) +f64 == i64 / i +f64 == i64 ? 1 : 0.5 +f64 == i64 ? greet : i32 f64 == int(f32) -f64 == min(0.5) -f64 == min(i64) -f64 == nil == ok -f64 == nil ? i32 : div -f64 == nil ? nil : 0.5 -f64 == score(1) +f64 == max(0.5) +f64 == max(i) +f64 == min(i32) +f64 == nil && ok +f64 == nil ? 0.5 : add +f64 == nil ? foo : "foo" +f64 == reduce(list, i32) +f64 == round(i) +f64 == score(i, 1) f64 > -0.5 f64 > -1 -f64 > -f32 f64 > -f64 f64 > -i f64 > -i32 -f64 > 0.5 - f64 -f64 > 0.5 / 0.5 -f64 > 0.5 ? 0.5 : nil -f64 > 0.5 ? score(1, 1) : nil == nil -f64 > 0.5 ^ 1 -f64 > 0.5 || ok -f64 > 1 != ok -f64 > 1 != true -f64 > 1 % i -f64 > 1 * 0.5 -f64 > 1 - 0.5 -f64 > 1 - i32 -f64 > 1 / 0.5 -f64 > 1 / f64 -f64 > 1 ? 0.5 : ok -f64 > 1 ? false : true -f64 > 1 ^ 1 -f64 > abs(0.5) -f64 > abs(1) -f64 > abs(i) -f64 > abs(i32) -f64 > count(array, true) +f64 > 0.5 ** f32 +f64 > 0.5 / i +f64 > 0.5 ^ i +f64 > 0.5 or i <= 0.5 +f64 > 1 + f32 +f64 > 1 + i32 +f64 > 1 ? div : i32 +f64 > 1 ^ i32 +f64 > array[i64] +f64 > ceil(0.5) +f64 > ceil(1) +f64 > ceil(f32) f64 > f32 -f64 > f32 - 0.5 +f64 > f32 / 1 f64 > f64 -f64 > f64 ** 0.5 -f64 > f64 ? f64 : list -f64 > f64 ^ 0.5 -f64 > findIndex(array, ok) -f64 > float(1) -f64 > float(f32) +f64 > f64 - 0.5 +f64 > float(0.5 * i64) +f64 > floor(f64) +f64 > get(array, 1) f64 > half(0.5) +f64 > half(1) +f64 > half(f64) f64 > i -f64 > i != ok -f64 > i ** i32 -f64 > i - i32 +f64 > i - 0.5 f64 > i32 -f64 > i32 ** f32 -f64 > i32 - f32 f64 > i32 == ok -f64 > i32 ? i : 0.5 +f64 > i32 ? f32 : array +f64 > i32 ? list : half +f64 > i32 ^ i32 +f64 > i32 ^ i64 f64 > i64 -f64 > i64 ** i64 -f64 > int(0.5) -f64 > int(i64) +f64 > i64 - 1 +f64 > i64 ? array : half +f64 > i64 ? list : div +f64 > i64 || ok or ok +f64 > int(f32) +f64 > last(array) f64 > max(0.5) -f64 > max(i64) -f64 > min(1) -f64 > min(f64) -f64 > min(i) -f64 > min(i32) -f64 > score(i) +f64 > max(0.5, i64) +f64 > max(f32) +f64 > median(array) +f64 > min(f32) f64 >= -0.5 f64 >= -1 -f64 >= -f64 -f64 >= -i32 f64 >= -i64 -f64 >= 0.5 * 1 -f64 >= 0.5 ** 0.5 -f64 >= 0.5 ** i32 -f64 >= 0.5 + 0.5 -f64 >= 0.5 + i -f64 >= 0.5 - i -f64 >= 0.5 - i32 -f64 >= 0.5 ? nil : 0.5 -f64 >= 0.5 ^ 0.5 -f64 >= 1 * i -f64 >= 1 - 0.5 -f64 >= 1 / i64 -f64 >= 1 == ok -f64 >= 1 ^ 1 -f64 >= 1 || ok -f64 >= abs(1) -f64 >= abs(f32) -f64 >= abs(f64) -f64 >= count(list, true) +f64 >= 0.5 + i32 +f64 >= 0.5 - 1 +f64 >= 0.5 - f32 +f64 >= 0.5 / i64 +f64 >= 0.5 ? list : i32 +f64 >= 0.5 ^ i64 +f64 >= array[1] f64 >= f32 -f64 >= f32 != true -f64 >= f32 - f32 -f64 >= f32 ? true : nil +f64 >= f32 - i32 +f64 >= f32 ^ 1 f64 >= f64 -f64 >= f64 * 0.5 -f64 >= f64 ? nil : f64 -f64 >= f64 ? score : f32 -f64 >= half(f64) +f64 >= f64 != nil +f64 >= f64 != ok +f64 >= findIndex(array, ok) +f64 >= floor(f32) +f64 >= floor(i) +f64 >= half(0.5) +f64 >= half(1) f64 >= i -f64 >= i - 1 +f64 >= i * 0.5 +f64 >= i ** 0.5 +f64 >= i ** i32 +f64 >= i / i32 +f64 >= i ^ 1 f64 >= i32 -f64 >= i32 != nil -f64 >= i32 ** 0.5 -f64 >= i32 + f32 -f64 >= i32 + i64 -f64 >= i32 ^ f32 +f64 >= i32 - f64 +f64 >= i32 ? ok : add +f64 >= i32 ^ 1 f64 >= i64 -f64 >= i64 * 0.5 -f64 >= i64 * f64 -f64 >= i64 * i64 -f64 >= i64 ? list : i >= f32 -f64 >= i64 ? ok : true -f64 >= i64 || ok -f64 >= max(f64) -f64 >= min(0.5) -f64 >= score(1) +f64 >= i64 + f64 +f64 >= i64 ? 0.5 : score +f64 >= i64 ? 1 : f32 +f64 >= max(1) +f64 >= median(array) +f64 >= reduce(array, #) +f64 >= reduce(array, i32) f64 >= score(i) -f64 ^ (0.5 * 1) -f64 ^ (0.5 * f32) -f64 ^ (0.5 / i) -f64 ^ (1 + i) -f64 ^ (1 - f32) -f64 ^ (1 / 0.5) -f64 ^ (1 / i64) -f64 ^ -1 -f64 ^ 0.5 != f32 -f64 ^ 0.5 * i64 -f64 ^ 0.5 + f64 -f64 ^ 0.5 < 0.5 ^ 0.5 -f64 ^ 0.5 <= i64 -f64 ^ 0.5 > i == nil -f64 ^ 0.5 >= i32 / i64 -f64 ^ 1 != i +f64 ^ (0.5 * i) +f64 ^ (0.5 + 1) +f64 ^ (1 * f64) +f64 ^ (1 - 1) +f64 ^ (f32 + 1) +f64 ^ (f32 - 0.5) +f64 ^ (f32 - i) +f64 ^ (f32 / -f64) +f64 ^ (i32 - 1) +f64 ^ (i32 / f32) +f64 ^ (i64 - 1) +f64 ^ -0.5 +f64 ^ -i32 +f64 ^ 0.5 * f64 +f64 ^ 0.5 ** f32 +f64 ^ 0.5 ** i32 +f64 ^ 0.5 > ceil(f32) +f64 ^ 0.5 > i +f64 ^ 0.5 >= f64 +f64 ^ 0.5 >= i32 +f64 ^ 0.5 ^ i32 +f64 ^ 0.5 not in array f64 ^ 1 ** i -f64 ^ 1 + i -f64 ^ 1 / f32 -f64 ^ 1 / i64 -f64 ^ 1 <= i32 +f64 ^ 1 ** i64 f64 ^ 1 ^ i -f64 ^ abs(i32) -f64 ^ count(array, true) +f64 ^ abs(0.5) +f64 ^ array[i64] f64 ^ f32 -f64 ^ f32 != i32 -f64 ^ f32 * f32 -f64 ^ f32 ** i -f64 ^ f32 + f64 -f64 ^ f32 / i64 -f64 ^ f32 < i -f64 ^ f32 >= i64 -f64 ^ f32 ^ i64 +f64 ^ f32 ** 1 +f64 ^ f32 < score(1) +f64 ^ f32 >= i32 f64 ^ f64 -f64 ^ f64 != f32 -f64 ^ f64 * i -f64 ^ f64 + int(0.5) -f64 ^ float(i64) -f64 ^ half(0.5) +f64 ^ f64 - -i +f64 ^ f64 == i32 +f64 ^ f64 > f64 +f64 ^ f64 ^ i +f64 ^ f64 ^ i64 +f64 ^ findIndex(array, true) +f64 ^ float(abs(i)) +f64 ^ floor(f64) +f64 ^ half(1) f64 ^ half(f64) f64 ^ i -f64 ^ i ** i32 -f64 ^ i / i -f64 ^ i <= f32 +f64 ^ i ** 1 +f64 ^ i + f32 +f64 ^ i + i32 +f64 ^ i <= i32 +f64 ^ i ^ i64 f64 ^ i32 -f64 ^ i32 ** i -f64 ^ i32 + f64 +f64 ^ i32 / f64 +f64 ^ i32 <= i32 f64 ^ i32 >= i -f64 ^ i32 ^ f64 f64 ^ i64 -f64 ^ i64 + i64 -f64 ^ i64 - i -f64 ^ i64 < i -f64 ^ i64 >= i32 +f64 ^ i64 ** i64 +f64 ^ int(0.5) f64 ^ int(f64) f64 ^ last(array) f64 ^ len(list) -f64 ^ max(0.5) +f64 ^ min(1) +f64 ^ reduce(array, #) +f64 ^ round(i) f64 ^ score(1) -false != true || 1 > f64 -false && ok or ok -false ? "bar" : 0.5 == f32 -false ? "bar" : 1 != i -false ? "bar" : foo.Qux -false ? 0.5 : foo.Qux -false ? 1 : half != div -false ? 1 : true != ok -false ? add : foo?.Bar -false ? f32 : foo.Bar -false ? f32 : foo?.String() -false ? f32 : i .. i32 -false ? f64 : 0.5 >= f64 -false ? f64 : f32 / f32 -false ? false : 0.5 + i32 -false ? false : i64 >= i -false ? foo : foo.Qux -false ? greet : i64 != i -false ? half : 0.5 > 1 + i64 -false ? half : f32 > min(0.5) -false ? i : 1 != i -false ? i32 : 1 >= f64 -false ? i64 : "foo" < toJSON(f64) -false ? i64 : foo?.Qux -false ? list : 1 < f32 -false ? list : f32 ** i32 -false ? list : foo.Bar -false ? nil : 1 >= get(array, 1) +f64 in array +f64 in array != nil +f64 in groupBy(list, i64) +f64 not in array +f64 not in array != ok +f64 not in array != true +f64 not in array == true +f64 not in groupBy(array, #) +f64 not in groupBy(array, bitnand(#, 1)) +f64 not in i .. i32 +f64 not in map(array, #) +false != false ? foo : greet +false && i not in array +false && nil not in array +false && nil not in list +false == nil ? i32 : f64 +false == nil ? i32 : i32 +false ? "bar" : 0.5 - i +false ? "foo" : f32 * i +false ? "foo" : f32 / i32 +false ? "foo" : foo.Qux +false ? add : 1 / i ^ 0.5 +false ? add : i64 - i +false ? div : i64 ** i +false ? f32 : foo.Qux +false ? f32 : half != score +false ? f64 : 0.5 != i32 +false ? f64 : 0.5 ** i32 +false ? f64 : 1 >= i +false ? f64 : foo?.Qux +false ? f64 : i ^ f32 +false ? false : foo?.Qux +false ? foo : i32 - i +false ? half : 0.5 == f32 +false ? half : i ^ i64 +false ? i : foo?.Qux +false ? i : nil in list +false ? i32 : 1 <= i32 +false ? i32 : foo.Qux +false ? i64 : 1 <= f32 +false ? i64 : foo.Qux +false ? i64 : i64 ** i64 +false ? list : list == list false ? nil : foo?.Qux -false ? ok : foo.String -false ? score : 0.5 == i -false ? score : 1 / i64 -false ? score : f64 - -f32 -false ? true : 0.5 == f32 -false or ok ? string(1) : f64 == f32 -filter(1 .. 1, # == 0.5) -filter(1 .. i64, ok) -filter([div], any(array, true)) -filter([i32, i], # <= f64) -filter(array, !false) -filter(array, !ok) -filter(array, "bar" == "bar") -filter(array, "bar" matches "bar") -filter(array, "foo" not matches "bar") +false ? nil : i32 > i32 +false ? ok : foo.String() +false ? ok : i64 < i64 +false and false || 0.5 > f32 +false or 1 not in array +false or true or ok +false or true || ok +filter(1 .. 1, # > i) +filter(1 .. i, i >= #) +filter([0.5], # > 0.5) +filter([nil], # != false) +filter(array, !true) +filter(array, "bar" != "foo") +filter(array, "foo" == nil) filter(array, # != #) +filter(array, # != f32) filter(array, # != f64) filter(array, # != i) -filter(array, # != i32) filter(array, # != i64) filter(array, # < #) -filter(array, # < 1) -filter(array, # < f32) filter(array, # < f64) -filter(array, # < i) -filter(array, # < i32) filter(array, # <= #) -filter(array, # <= 0.5) filter(array, # <= 1) -filter(array, # <= f64) +filter(array, # <= bitshr(#, #)) filter(array, # <= i) -filter(array, # <= i32) +filter(array, # <= i64) filter(array, # == #) -filter(array, # == 1) +filter(array, # == 0.5) filter(array, # == f32) filter(array, # == f64) filter(array, # == i) +filter(array, # == i32) +filter(array, # == i64) filter(array, # == nil) filter(array, # > #) +filter(array, # > 0.5) filter(array, # > 1) filter(array, # > i) +filter(array, # > i32) filter(array, # >= #) +filter(array, # >= 0.5) filter(array, # >= 1) filter(array, # >= f32) -filter(array, # >= f64) +filter(array, # >= i) filter(array, # >= i32) -filter(array, # in array) -filter(array, # not in array) +filter(array, # >= i64) filter(array, 0.5 != #) +filter(array, 0.5 != f64) +filter(array, 0.5 != i) filter(array, 0.5 < #) -filter(array, 0.5 < f32) filter(array, 0.5 < f64) +filter(array, 0.5 < i32) +filter(array, 0.5 <= #) +filter(array, 0.5 <= i) +filter(array, 0.5 <= i32) filter(array, 0.5 == #) -filter(array, 0.5 > 0.5) +filter(array, 0.5 == f64) +filter(array, 0.5 > #) filter(array, 0.5 >= #) filter(array, 1 != #) -filter(array, 1 != f32) -filter(array, 1 < #) -filter(array, 1 < f64) -filter(array, 1 <= #) +filter(array, 1 < i) filter(array, 1 == #) -filter(array, 1 > #) -filter(array, 1 > 0.5) -filter(array, add == div) -filter(array, all(list, ok)) +filter(array, 1 == 0.5) +filter(array, 1 == i) +filter(array, 1 > i) +filter(array, 1 >= #) +filter(array, add == add) +filter(array, add == nil) +filter(array, any(list, ok)) +filter(array, div != score) filter(array, f32 != #) -filter(array, f32 < i32) -filter(array, f32 <= f32) +filter(array, f32 < #) +filter(array, f32 <= #) filter(array, f32 == #) -filter(array, f32 > 1) +filter(array, f32 == i64) +filter(array, f32 > #) filter(array, f32 >= #) -filter(array, f64 != #) -filter(array, f64 != 0.5) +filter(array, f64 < #) filter(array, f64 <= #) -filter(array, f64 == #) -filter(array, f64 > #) -filter(array, f64 >= 1) -filter(array, foo == nil) -filter(array, greet == add) -filter(array, greet == half) -filter(array, i <= 1) -filter(array, i <= f64) -filter(array, i == f32) -filter(array, i >= 1) -filter(array, i >= f64 != false) -filter(array, i32 != #) -filter(array, i32 <= #) -filter(array, i32 == #) -filter(array, i32 == 1) -filter(array, i32 > # % #) +filter(array, f64 == i32) +filter(array, f64 >= #) +filter(array, half != nil) +filter(array, half == half) +filter(array, half(1) >= # ^ i) +filter(array, i != #) +filter(array, i != f64) +filter(array, i <= i32) +filter(array, i == #) +filter(array, i > #) +filter(array, i > f32) +filter(array, i32 != i64) +filter(array, i32 < 0.5) filter(array, i32 > #) -filter(array, i32 > 0.5) -filter(array, i32 >= #) -filter(array, i64 != #) filter(array, i64 < #) -filter(array, i64 < 1) filter(array, i64 < i64) -filter(array, i64 <= #) -filter(array, i64 == 1) +filter(array, i64 == #) +filter(array, i64 == i32) +filter(array, i64 >= #) filter(array, nil != #) filter(array, nil != greet) filter(array, nil == #) -filter(array, nil == f32) -filter(array, nil in list) -filter(array, none(array, ok)) +filter(array, nil == 1) +filter(array, nil == i32) +filter(array, not false) +filter(array, not ok) +filter(array, not true) +filter(array, ok && true) filter(array, ok) -filter(array, score(#) != #) -filter(array, true && ok) -filter(array, true or false) -filter(array, true)[i:i32] -filter(filter(array, true), i >= f32) -filter(filter(list, false), "bar" in #) -filter(filter(list, ok), ok) -filter(i .. 1, not ok) -filter(i32 .. i32, nil == true) -filter(i32 .. i64, ok) -filter(list, !false) +filter(array, ok)[i64] +filter(array, score == nil) +filter(array, true == true) +filter(array, true and true) +filter(false ? ok : array, # == nil) +filter(filter(list, true), ok) +filter(groupBy(array, #).greet, # matches #?.score) +filter(groupBy(array, #)?.div, .Qux(#).array) +filter(groupBy(array, f64)?.f32, #) +filter(groupBy(list, #).f64, # not matches #?.foo) +filter(groupBy(list, #)?.f64, .foo) +filter(groupBy(list, 0.5)?.i, #) +filter(i .. i64, ok) filter(list, !ok) filter(list, !true) -filter(list, "bar" not in #) +filter(list, "bar" < "foo") filter(list, "bar" not matches "foo") -filter(list, "bar" startsWith "bar") +filter(list, "foo" == "foo") filter(list, "foo" in #) -filter(list, "foo" not in #) +filter(list, "foo" not endsWith "bar") +filter(list, "foo" startsWith "bar") filter(list, # != #) filter(list, # != foo) filter(list, # != nil) filter(list, # == #) filter(list, # == foo) -filter(list, # == nil) -filter(list, 0.5 != f64) -filter(list, 0.5 != i) -filter(list, 0.5 > f32) -filter(list, 1 != 0.5) -filter(list, 1 != i32) -filter(list, 1 != nil) -filter(list, 1 < 0.5) +filter(list, # in list) +filter(list, 0.5 < 1) +filter(list, 0.5 <= 0.5) +filter(list, 0.5 >= 1) +filter(list, 0.5 >= i) +filter(list, 0.5 >= i64) filter(list, 1 < 1) -filter(list, all(array, false)) -filter(list, all(array, true)) -filter(list, div == half) -filter(list, f32 < 0.5) -filter(list, f32 <= f32) -filter(list, f32 == i64) -filter(list, f32 >= 1) -filter(list, f64 >= 0.5) -filter(list, false == ok) -filter(list, foo != #) +filter(list, 1 <= f32) +filter(list, any(array, ok)) +filter(list, any(list, true)) +filter(list, div != div) +filter(list, f32 <= 1) +filter(list, f32 == f64) +filter(list, f32 > i) +filter(list, f64 <= 1) +filter(list, f64 == 0.5) +filter(list, false != false) +filter(list, false or ok) filter(list, foo == #) -filter(list, foo == foo) -filter(list, foo in list) -filter(list, greet != nil) -filter(list, half != half) -filter(list, i <= 0.5) -filter(list, i <= i) -filter(list, i == f32) -filter(list, i == i32) -filter(list, i == i64) -filter(list, i >= i32) -filter(list, i32 != 1) -filter(list, i32 != nil) -filter(list, i32 < i64) -filter(list, i32 <= i32) -filter(list, i32 == i) -filter(list, i64 > f32) -filter(list, nil != f64) -filter(list, nil != score) -filter(list, nil != true) +filter(list, i < 0.5) +filter(list, i < f32) +filter(list, i >= 0.5) +filter(list, i64 > 0.5) +filter(list, nil != "foo") +filter(list, nil != #) +filter(list, nil != #?.Bar) +filter(list, nil != add) +filter(list, nil != greet) +filter(list, nil != i64) filter(list, nil == #) -filter(list, not ok) -filter(list, ok or true) -filter(list, ok || true) +filter(list, nil == 0.5) +filter(list, nil == f32) +filter(list, nil == half) +filter(list, nil == i32) +filter(list, nil == score) +filter(list, ok == nil) +filter(list, ok and false) filter(list, ok) -filter(list, true == nil) -filter(map(array, "bar"), # >= #) -filter(map(array, "foo"), ok) -filter(map(array, #), # != 0.5) -filter(map(array, #), ok) -filter(map(array, 0.5 >= #), ok) -filter(map(list, "bar"), i >= i) -filter(map(list, "foo"), "bar" not matches #) -filter(map(list, #), # != #) +filter(list, ok)[i] +filter(list, score == half) +filter(list, true == ok) +filter(list, true || true) +filter(list, true) == list +filter(map(array, #), # == 1) +filter(map(array, #), # > #) +filter(map(array, 1), ok) +filter(map(array, greet), ok) +filter(map(array, i32), ok) +filter(map(array, i64), nil == div) +filter(map(array, ok), true || ok) +filter(map(array, score), # != nil) +filter(map(list, #), # == #) +filter(map(list, #), half != nil) filter(map(list, #), ok) -filter(map(list, 1), f32 != #) +filter(map(list, array), # == #) +filter(map(list, f32), # == #) +filter(map(list, f32), ok) filter(map(list, false), #) -filter(sort(array), ok) -filter(split("foo", "bar"), ok) -find(1 .. 1, # <= #) -find([nil], 0.5 == 0.5) +filter(map(list, i32), i64 <= i32) +filter(map(list, ok), #) +filter(map(list, true), #) +filter(ok ? "foo" : 0.5, # <= i64) +filter(true ? list : score, # != #) +find(1 .. i, ok) find([ok], #) +find([score, score], # == #) +find(array, !(# <= i32)) find(array, !ok) find(array, !true) -find(array, "bar" startsWith "foo") +find(array, "bar" not startsWith "foo") +find(array, "foo" not contains "bar") find(array, # != #) -find(array, # != 0.5) -find(array, # != f32) +find(array, # != 1) +find(array, # != i) find(array, # != i32) -find(array, # - # != #) +find(array, # != nil) +find(array, # - i != #) find(array, # < #) find(array, # < 0.5) find(array, # < 1) find(array, # < f32) -find(array, # < f64) +find(array, # < i) find(array, # < i32) +find(array, # < i64) find(array, # <= #) find(array, # <= 0.5) find(array, # <= 1) -find(array, # <= f32) -find(array, # <= i) +find(array, # <= i32) find(array, # == #) find(array, # == 0.5) find(array, # == 1) -find(array, # == f32) -find(array, # == f64) find(array, # == i) -find(array, # == i32) +find(array, # == i64) find(array, # == nil) find(array, # > #) -find(array, # > 0.5) -find(array, # > i) +find(array, # > 1) +find(array, # > i32) find(array, # > i64) find(array, # >= #) find(array, # >= 1) +find(array, # >= f64) find(array, # >= i) -find(array, # >= i32) -find(array, 0.5 < i64) +find(array, # not in array) +find(array, 0.5 != 1) +find(array, 0.5 / i64 <= #) +find(array, 0.5 < #) +find(array, 0.5 < f64) find(array, 0.5 <= #) -find(array, 0.5 == #) -find(array, 0.5 > #) -find(array, 0.5 > 1) +find(array, 0.5 >= #) +find(array, 0.5 >= 0.5) +find(array, 0.5 >= f64) +find(array, 1 != #) +find(array, 1 < #) +find(array, 1 < i32) +find(array, 1 < i64) find(array, 1 <= #) -find(array, 1 <= 0.5) -find(array, 1 == f32) -find(array, 1 == i64) +find(array, 1 <= i) +find(array, 1 == #) find(array, 1 > #) -find(array, 1 > 0.5) -find(array, 1 > i32) -find(array, 1 > i64) find(array, 1 >= #) -find(array, 1 >= i) -find(array, add != div) -find(array, add != nil) -find(array, any(array, true)) -find(array, array == list) +find(array, div != nil) find(array, div == half) +find(array, f32 != #) +find(array, f32 != f32) +find(array, f32 < #) find(array, f32 <= #) +find(array, f32 == #) +find(array, f32 == i32) find(array, f32 > #) -find(array, f32 > 0.5) find(array, f32 >= #) -find(array, f32 >= 1) find(array, f64 != #) -find(array, f64 != i32) -find(array, f64 != nil) find(array, f64 < #) -find(array, f64 == nil) -find(array, f64 >= 0.5) -find(array, false == false) -find(array, false) != i32 -find(array, i < #) +find(array, f64 < 1) +find(array, f64 <= #) +find(array, f64 == #) +find(array, f64 == i64) +find(array, false ? # : false) +find(array, false) != f64 +find(array, floor(#) > #) +find(array, greet != greet) +find(array, half == score) +find(array, i % # != f64) +find(array, i < 0.5) find(array, i <= #) -find(array, i == #) -find(array, i > #) +find(array, i > 0.5) find(array, i >= #) -find(array, i >= i64) +find(array, i >= 1) find(array, i32 != #) -find(array, i32 != 1) -find(array, i32 < #) -find(array, i32 <= #) -find(array, i32 <= f32) -find(array, i32 <= f64) +find(array, i32 != i32) find(array, i32 == #) -find(array, i32 == 1) -find(array, i32 == f64) find(array, i32 > #) +find(array, i32 >= #) find(array, i64 != #) +find(array, i64 != 1) find(array, i64 < #) -find(array, nil != "bar") -find(array, nil != #) +find(array, i64 <= #) +find(array, i64 == #) +find(array, i64 > #) +find(array, nil != nil) find(array, nil == #) -find(array, nil not in array) -find(array, not false) -find(array, not true) -find(array, ok && ok) +find(array, nil == 0.5) +find(array, nil == i32) +find(array, none(array, true)) +find(array, not (# == #)) find(array, ok == nil) +find(array, ok and false) find(array, ok) -find(array, ok) * f64 -find(array, ok) ** i64 -find(array, ok) ^ i32 -find(array, score(#) >= #) -find(array, true) / get(array, i64) -find(array, true) > i -find(array, true) ^ i32 -find(filter(array, ok), # >= #) -find(filter(array, true), # != #) -find(i32 .. 1, # > 0.5) -find(i64 .. 1, ok) -find(list, !true) -find(list, "bar" startsWith "foo") -find(list, "foo" < "foo") -find(list, "foo" in #) -find(list, "foo" not in #) +find(array, ok) % i32 +find(array, ok) ** i +find(array, ok) >= i32 +find(array, true) > f64 +find(array, true) > i64 +find(filter(list, false), i64 not in array) +find(groupBy(array, #).Qux, .String?.f32) +find(groupBy(array, #).ok, first(#[1])) +find(i .. i64, ok) +find(i64 .. i32, # != #) +find(list, !false) +find(list, !ok) +find(list, "bar" not in #) +find(list, "foo" contains "foo") find(list, # != #) +find(list, # != nil) find(list, # == #) +find(list, # == foo) find(list, # == nil) -find(list, # not in list) -find(list, 0.5 < f64) -find(list, 0.5 <= i64) -find(list, 0.5 > i) -find(list, 1 < 0.5) -find(list, 1 <= 0.5) +find(list, 0.5 != 1) +find(list, 0.5 <= 0.5) +find(list, 1 != 0.5) +find(list, 1 < 1) +find(list, 1 < i64) +find(list, 1 == f64) +find(list, 1 > 0.5) find(list, 1 > i) -find(list, add == add) -find(list, f32 != f32) -find(list, f32 < f64) -find(list, f32 <= f32) +find(list, 1 > i64) +find(list, f32 < 1) +find(list, f32 <= 0.5) find(list, f32 <= i32) -find(list, f32 == f32) -find(list, f64 != f32) -find(list, f64 <= i64) -find(list, f64 >= f32) +find(list, f32 == i64) +find(list, f32 > f64) +find(list, f32 not in array) +find(list, f64 < f64) +find(list, false && true) find(list, false)?.Bar find(list, foo != #) find(list, foo == #) -find(list, i < 1) -find(list, i >= f64) -find(list, i32 <= f32) -find(list, i64 != f64) -find(list, i64 >= 0.5) -find(list, list != array) +find(list, greet != div) +find(list, i != 1) +find(list, i != f64) +find(list, i != i32) +find(list, i32 != 1) +find(list, i32 != f64) +find(list, i32 < i) +find(list, i32 == i32) find(list, nil != #) -find(list, nil != greet) -find(list, nil != half) find(list, nil != ok) -find(list, nil == #) -find(list, nil == half) -find(list, nil == score) -find(list, nil not in array) -find(list, nil not in list) -find(list, not ok) -find(list, ok or ok) +find(list, nil == array) +find(list, nil == div) +find(list, not false) +find(list, ok != false) find(list, ok) -find(list, ok).Bar -find(list, ok).Qux find(list, ok).String +find(list, ok).String() +find(list, ok)?.Bar find(list, ok)?.Qux find(list, ok)?.String -find(list, score != add) -find(list, score != greet) +find(list, score == score) +find(list, true != nil) +find(list, true == true) +find(list, true or false) find(list, true).Bar find(list, true).Qux find(list, true).String find(list, true)?.Bar -find(list, true)?.Qux find(list, true)?.String -find(list, true)?.String() -find(map(array, #), # == #) +find(map(array, #), # != f32) +find(map(array, #), # <= 1) +find(map(array, #), # == 0.5) find(map(array, #), ok) -find(map(array, i), ok) -find(map(array, true), #) -find(map(list, "foo"), ok) +find(map(array, false), #) +find(map(array, foo), ok) +find(map(array, ok), #) find(map(list, #), # != #) -find(map(list, 0.5), # >= #) -find(map(list, ok), ok) +find(map(list, #), ok) +find(map(list, 0.5), # != #) +find(map(list, add), 0.5 >= i64) +find(map(list, div), # == #) +find(map(list, f32), # > 0.5) +find(map(list, false), #) +find(map(list, i), # == i64) +find(map(list, ok), #) find(map(list, true), #) -find(ok ? "bar" : 0.5, # != i32) -find(sort(array), ok) -find(true ? array : false, 0.5 > #)?.list -findIndex(["bar"], ok) -findIndex(["foo"], 0.5 > i64) -findIndex(["foo"], ok) -findIndex([1], # < #) -findIndex([f64, greet], 1 > f64) -findIndex([false], #) -findIndex(array, !(# != #)) -findIndex(array, !(# == 1)) -findIndex(array, !false) +find(ok ? "foo" : f64, f32 >= #) findIndex(array, !ok) -findIndex(array, !true) -findIndex(array, "bar" not endsWith "bar") -findIndex(array, "bar" not startsWith "foo") +findIndex(array, "bar" == "foo") +findIndex(array, "foo" > "foo") +findIndex(array, "foo" in foo) findIndex(array, # != #) findIndex(array, # != 0.5) findIndex(array, # != f32) findIndex(array, # != f64) -findIndex(array, # != i32) +findIndex(array, # != i) findIndex(array, # != i64) findIndex(array, # != nil) -findIndex(array, # ** # > #) findIndex(array, # < #) findIndex(array, # < 1) -findIndex(array, # < f64) -findIndex(array, # < i) findIndex(array, # < i32) -findIndex(array, # < i64) findIndex(array, # <= #) +findIndex(array, # <= 0.5) findIndex(array, # <= 1) -findIndex(array, # <= i) -findIndex(array, # <= i32) findIndex(array, # == #) +findIndex(array, # == 0.5) findIndex(array, # == 1) -findIndex(array, # == f64) findIndex(array, # == i32) +findIndex(array, # == nil) findIndex(array, # > #) findIndex(array, # > 0.5) findIndex(array, # > 1) -findIndex(array, # > f32) findIndex(array, # > f64) -findIndex(array, # > i64 - i) +findIndex(array, # > i) findIndex(array, # > i64) findIndex(array, # >= #) +findIndex(array, # >= 0.5) findIndex(array, # >= 1) findIndex(array, # >= f32) +findIndex(array, # >= f64) findIndex(array, # >= i) findIndex(array, # >= i32) -findIndex(array, # in array) -findIndex(array, # not in array) -findIndex(array, 0.5 < #) -findIndex(array, 0.5 <= 1) -findIndex(array, 0.5 <= f32) +findIndex(array, # >= i64) +findIndex(array, 0.5 != #) +findIndex(array, 0.5 != 1) +findIndex(array, 0.5 < 1) +findIndex(array, 0.5 <= #) findIndex(array, 0.5 == #) -findIndex(array, 0.5 > i64) -findIndex(array, 0.5 >= #) -findIndex(array, 0.5 >= i) +findIndex(array, 0.5 == i64) +findIndex(array, 0.5 > #) +findIndex(array, 0.5 > 0.5) +findIndex(array, 0.5 > i) +findIndex(array, 0.5 > i32) +findIndex(array, 0.5 >= 0.5) +findIndex(array, 0.5 >= 1) +findIndex(array, 0.5 not in array) findIndex(array, 1 != #) +findIndex(array, 1 != i64) +findIndex(array, 1 != nil) findIndex(array, 1 < #) -findIndex(array, 1 < f32) -findIndex(array, 1 < i64) findIndex(array, 1 <= #) -findIndex(array, 1 == #) findIndex(array, 1 > #) +findIndex(array, 1 > i) findIndex(array, 1 >= #) -findIndex(array, add != half) -findIndex(array, any(array, f32 < #)) -findIndex(array, f32 <= #) +findIndex(array, add != div) +findIndex(array, add != nil) +findIndex(array, f32 != #) +findIndex(array, f32 != 1) +findIndex(array, f32 < #) findIndex(array, f32 == #) -findIndex(array, f32 == nil) -findIndex(array, f32 > #) findIndex(array, f32 >= #) -findIndex(array, f64 <= #) -findIndex(array, f64 <= i64) -findIndex(array, f64 == #) -findIndex(array, f64 > #) +findIndex(array, f32 >= i32) findIndex(array, f64 >= #) -findIndex(array, f64 >= 1) -findIndex(array, half != greet) -findIndex(array, i != #) -findIndex(array, i < 0.5) +findIndex(array, f64 >= i32) +findIndex(array, false) == -f64 +findIndex(array, i != f64) +findIndex(array, i < #) +findIndex(array, i < i32) findIndex(array, i <= #) -findIndex(array, i <= i32) +findIndex(array, i <= 0.5) findIndex(array, i == #) -findIndex(array, i == i) -findIndex(array, i > #) findIndex(array, i >= i) +findIndex(array, i >= i32) findIndex(array, i32 != #) findIndex(array, i32 < #) -findIndex(array, i32 < f64) -findIndex(array, i32 < i) -findIndex(array, i32 <= #) findIndex(array, i32 == #) -findIndex(array, i32 == nil) -findIndex(array, i32 > #) +findIndex(array, i32 > f32) findIndex(array, i64 != #) -findIndex(array, i64 == #) +findIndex(array, i64 != nil) +findIndex(array, i64 < 0.5) +findIndex(array, i64 <= #) +findIndex(array, i64 <= i64) findIndex(array, i64 > #) findIndex(array, i64 >= #) -findIndex(array, nil != #) -findIndex(array, nil != 1) -findIndex(array, nil != list) -findIndex(array, nil == foo) -findIndex(array, nil == i) -findIndex(array, not ok) +findIndex(array, i64 >= f64) +findIndex(array, i64 >= i32) +findIndex(array, nil != half) +findIndex(array, nil != ok) +findIndex(array, nil == #) +findIndex(array, nil == 1) +findIndex(array, nil == nil) +findIndex(array, not false) findIndex(array, ok) -findIndex(array, ok) * f64 -findIndex(array, ok) - i32 findIndex(array, ok) / f64 -findIndex(array, ok) >= f64 +findIndex(array, ok) / i +findIndex(array, ok) <= f32 +findIndex(array, one(list, false)) findIndex(array, score == greet) -findIndex(array, true or false) -findIndex(false ? div : list, ok) +findIndex(array, true) + f64 +findIndex(array, true) - f64 +findIndex(array, true) .. i +findIndex(filter(array, false), # > 1) +findIndex(filter(array, true), # not in array) +findIndex(filter(list, false), 1 <= i64) +findIndex(groupBy(array, #).f64, .Bar(half(add, half, div, greet, f64))) +findIndex(groupBy(array, #)?.greet, .f64(foo(array, #), # != "bar")) +findIndex(groupBy(array, false).String, #?.i64()) +findIndex(groupBy(array, foo).String, #) +findIndex(groupBy(list, #).Qux, #) +findIndex(groupBy(list, #)?.Qux, #) +findIndex(groupBy(list, #)?.i64, #) +findIndex(groupBy(list, true)?.list, get(false ? # : #, score(#, Bar, half, #))) +findIndex(i32 .. 1, # >= #) findIndex(list, !false) +findIndex(list, !ok) findIndex(list, !true) -findIndex(list, "bar" == "bar") -findIndex(list, "foo" != "bar") -findIndex(list, "foo" contains "bar") -findIndex(list, "foo" matches "bar") +findIndex(list, "bar" > "foo") +findIndex(list, "bar" in #) +findIndex(list, "bar" not in #) findIndex(list, # != #) -findIndex(list, # != foo) findIndex(list, # != nil) findIndex(list, # == #) -findIndex(list, # == nil) +findIndex(list, # == foo) findIndex(list, # in list) -findIndex(list, 0.5 < i) -findIndex(list, 0.5 <= f64) -findIndex(list, 0.5 <= i64) -findIndex(list, 0.5 > f64) -findIndex(list, 0.5 >= f32) -findIndex(list, 1 == nil) -findIndex(list, array != list) -findIndex(list, f32 < f64) -findIndex(list, f64 <= f32) -findIndex(list, f64 <= f64) -findIndex(list, f64 == nil) -findIndex(list, f64 > f64) -findIndex(list, false && true) +findIndex(list, #?.Bar not in #) +findIndex(list, 0.5 != i) +findIndex(list, 0.5 > 1) +findIndex(list, 0.5 >= i) +findIndex(list, 1 != i32) +findIndex(list, 1 < f64) +findIndex(list, 1 < i32) +findIndex(list, 1 == f32) +findIndex(list, 1 > 0.5) +findIndex(list, 1 > i32) +findIndex(list, 1 >= 1) +findIndex(list, 1 >= i) +findIndex(list, f32 != f32) +findIndex(list, f32 != i) +findIndex(list, f32 < i32) +findIndex(list, f32 == bitshl(i, i64)) +findIndex(list, f32 > 1) +findIndex(list, f64 != 0.5) +findIndex(list, f64 < 1) +findIndex(list, f64 < i) +findIndex(list, f64 > 1) +findIndex(list, f64 >= f64) +findIndex(list, false != nil) +findIndex(list, false || ok) findIndex(list, foo != #) -findIndex(list, foo == #) -findIndex(list, greet != half) -findIndex(list, half == add) -findIndex(list, i32 == i) -findIndex(list, i32 > f64) -findIndex(list, i32 >= i32) -findIndex(list, i64 < 0.5) -findIndex(list, i64 > f64) -findIndex(list, nil != #) -findIndex(list, nil != f64) -findIndex(list, nil != false) -findIndex(list, nil == #) -findIndex(list, nil == 0.5) -findIndex(list, nil == ok) -findIndex(list, nil in list) -findIndex(list, not false) +findIndex(list, greet == nil) +findIndex(list, i < 0.5) +findIndex(list, i <= i32) +findIndex(list, i32 == 1) +findIndex(list, i32 >= i64) +findIndex(list, i64 != f32) +findIndex(list, nil != 0.5) +findIndex(list, nil != f32) +findIndex(list, nil != i64) +findIndex(list, nil == "foo") +findIndex(list, nil == f64) findIndex(list, not ok) -findIndex(list, ok != ok) -findIndex(list, ok or ok) +findIndex(list, not true) findIndex(list, ok) -findIndex(list, ok) + f32 -findIndex(list, ok) / i -findIndex(list, ok) > i32 -findIndex(list, one(list, ok)) -findIndex(list, true ? true : true) -findIndex(list, true) .. i -findIndex(list, true) == 0.5 ^ i32 -findIndex(list, true) > i32 ** f32 -findIndex(list, true) not in array -findIndex(map(array, #), # > #) -findIndex(map(array, #), # >= f32) -findIndex(map(array, 1), # != #) -findIndex(map(array, add), i64 >= i64) -findIndex(map(array, div), # == #) -findIndex(map(array, false), #) -findIndex(map(array, i64), ok) -findIndex(map(list, #), !ok) -findIndex(map(list, #), div == div) -findIndex(map(list, #), ok) -findIndex(map(list, f32), i32 == f64) -findIndex(map(list, list), ok) -findIndex(map(list, ok), # == ok) -findIndex(sort(array), # < #) -findIndex(true ? "bar" : i32, # < #) -findIndex(true ? "bar" : true, ok) -findLast([0.5], i64 != 0.5) +findIndex(list, ok) * i +findIndex(list, ok) ** i +findIndex(list, ok) >= f64 +findIndex(list, ok) ^ i32 +findIndex(list, true ? ok : #) +findIndex(list, true) % i64 +findIndex(map(array, #), # < #) +findIndex(map(array, #), # >= #) +findIndex(map(array, #), i > #) +findIndex(map(array, f32), i32 == #) +findIndex(map(array, i), # != #) +findIndex(map(array, i), ok) +findIndex(map(list, #), # != #) +findIndex(map(list, #), # == #) +findIndex(map(list, i64), # == 0.5) +findIndex(map(list, i64), i64 < #) +findIndex(map(list, true), #) +findIndex(map(list, true), ok) +findIndex(ok ? "foo" : greet, !ok) +findIndex(ok ? "foo" : i, # == #) +findIndex(sort(array), i32 == #) +findIndex(true ? "foo" : ok, # == greet) +findLast(1 .. i, # <= #) +findLast(1 .. i32, 1 >= #) +findLast(1 .. i64, ok) +findLast([1, f64], half == add) +findLast([false], #) findLast(array, !false) -findLast(array, !true) -findLast(array, "bar" > "bar") -findLast(array, "foo" startsWith "foo") +findLast(array, !ok) +findLast(array, "foo" > "bar") findLast(array, # != #) +findLast(array, # != 0.5) +findLast(array, # != 1) +findLast(array, # != f32) findLast(array, # != f64) -findLast(array, # != nil) +findLast(array, # != i) findLast(array, # < #) findLast(array, # < 0.5) -findLast(array, # < 1) findLast(array, # < f32) findLast(array, # < f64) -findLast(array, # < i) +findLast(array, # < i + #) findLast(array, # <= #) findLast(array, # <= 0.5) findLast(array, # <= 1) findLast(array, # <= f32) -findLast(array, # <= f64) -findLast(array, # <= i) findLast(array, # <= i64) findLast(array, # == #) findLast(array, # == 0.5) -findLast(array, # == f64) -findLast(array, # == i64) +findLast(array, # == nil) findLast(array, # > #) findLast(array, # > 0.5) +findLast(array, # > 1) findLast(array, # > i) findLast(array, # > i32) findLast(array, # > i64) findLast(array, # >= #) findLast(array, # >= 0.5) -findLast(array, # >= f64) -findLast(array, # >= i) +findLast(array, # >= 1) +findLast(array, # >= f32) findLast(array, # >= i32) -findLast(array, # not in array) -findLast(array, 0.5 != #) -findLast(array, 0.5 != 0.5) -findLast(array, 0.5 != i) -findLast(array, 0.5 < #) -findLast(array, 0.5 < i64) findLast(array, 0.5 <= #) -findLast(array, 0.5 == #) -findLast(array, 0.5 > 0.5) +findLast(array, 0.5 <= i64) +findLast(array, 0.5 > #) +findLast(array, 0.5 >= #) findLast(array, 0.5 >= 1) -findLast(array, 0.5 >= f64) findLast(array, 1 != #) -findLast(array, 1 != i64) -findLast(array, 1 < #) findLast(array, 1 <= #) -findLast(array, 1 <= 0.5) -findLast(array, 1 <= f32) findLast(array, 1 == #) -findLast(array, 1 == nil) -findLast(array, 1 > #) -findLast(array, 1 >= #) -findLast(array, 1 >= 1) -findLast(array, add != greet) -findLast(array, array == array) -findLast(array, div != score) -findLast(array, f32 != nil) -findLast(array, f32 < #) findLast(array, f32 >= #) -findLast(array, f32 >= 1) -findLast(array, f64 != i) -findLast(array, f64 < i64) -findLast(array, f64 >= #) -findLast(array, foo != nil) -findLast(array, half == nil) -findLast(array, i != i32) +findLast(array, f64 != #) +findLast(array, f64 != nil) +findLast(array, f64 <= #) +findLast(array, f64 <= 1) +findLast(array, f64 == #) +findLast(array, f64 == nil) +findLast(array, f64 >= 1) +findLast(array, f64 >= i64) +findLast(array, false != true) +findLast(array, false or true) +findLast(array, greet != nil) findLast(array, i < #) -findLast(array, i <= #) -findLast(array, i >= #) -findLast(array, i32 != #) -findLast(array, i32 <= f32) -findLast(array, i32 == 1) +findLast(array, i == i32) +findLast(array, i > #) +findLast(array, i >= 0.5) +findLast(array, i32 < #) +findLast(array, i32 == 0.5) findLast(array, i32 > #) findLast(array, i32 >= #) -findLast(array, i32 >= 0.5) +findLast(array, i32 >= i32) findLast(array, i64 != #) -findLast(array, i64 != 1) findLast(array, i64 < #) findLast(array, i64 <= #) -findLast(array, i64 <= 0.5) findLast(array, i64 == #) -findLast(array, i64 == nil) -findLast(array, i64 >= #) -findLast(array, i64 >= i32) -findLast(array, nil != #) -findLast(array, nil != nil) -findLast(array, nil == #) -findLast(array, nil == nil) +findLast(array, i64 > 0.5) +findLast(array, list != nil) +findLast(array, nil != array) +findLast(array, not (array == array)) findLast(array, not false) -findLast(array, not true) +findLast(array, not ok) +findLast(array, ok and true) findLast(array, ok) -findLast(array, ok) < f64 -findLast(array, true) + i -findLast(array, true) + i32 -findLast(array, true) <= f64 -findLast(array, true) > i -findLast(i .. 1, # > f32) -findLast(i32 .. 1, # >= #) -findLast(i32 .. i32, ok) -findLast(i64 .. 1, f32 <= #) -findLast(list, !true) -findLast(list, "bar" in #) -findLast(list, "bar" not contains "bar") -findLast(list, "bar" not in #) -findLast(list, "bar" not matches "bar") -findLast(list, "foo" == "foo") -findLast(list, "foo" > "foo") +findLast(array, ok) == i64 +findLast(array, reduce(list, ok)) +findLast(array, score != div) +findLast(array, score != nil) +findLast(array, true) % i64 +findLast(groupBy(array, #).i32, #) +findLast(groupBy(array, f64)?.score, #) +findLast(groupBy(list, "bar").div, #?.f32?.half()) +findLast(groupBy(list, #)[ok], .ok) +findLast(groupBy(list, 0.5)?.String, #?.half(Bar)) +findLast(groupBy(list, 0.5)?.f32, ok) +findLast(groupBy(list, f64).foo, .f32(#, #)?.Qux(#?.i64(add, nil))) +findLast(groupBy(list, f64)?.Bar, #) +findLast(i .. 1, # < #) +findLast(i .. i32, # != i64) +findLast(i .. i32, ok) +findLast(i32 .. i64, # >= i) +findLast(i64 .. 1, # < #) +findLast(list, !false) +findLast(list, !ok) findLast(list, "foo" in #) -findLast(list, "foo" not in #) findLast(list, # != #) +findLast(list, # != nil) findLast(list, # == #) findLast(list, # == foo) -findLast(list, # == nil) +findLast(list, # in list) findLast(list, # not in list) -findLast(list, 0.5 == nil) -findLast(list, 0.5 > f32) -findLast(list, 1 != 0.5) -findLast(list, 1 != 1) -findLast(list, 1 <= i) -findLast(list, 1 > 1) -findLast(list, 1 > i) -findLast(list, 1 >= 0.5) -findLast(list, 1 >= 1) -findLast(list, add == nil) -findLast(list, all(list, false)) -findLast(list, f32 < f64) +findLast(list, 0.5 != i64) +findLast(list, 0.5 <= 1) +findLast(list, 0.5 == i64) +findLast(list, 1 != f32) +findLast(list, 1 != nil) +findLast(list, 1 <= 1) +findLast(list, 1 > f32) +findLast(list, 1 >= f64) +findLast(list, f32 != i) +findLast(list, f32 > f32) +findLast(list, f32 >= 1) +findLast(list, f64 <= i) +findLast(list, f64 in array) findLast(list, false)?.Bar -findLast(list, foo != #)?.Bar -findLast(list, foo == #) -findLast(list, greet == half) -findLast(list, i != 1) -findLast(list, i != i64) -findLast(list, i >= f32) -findLast(list, i32 == 1) -findLast(list, i64 <= 0.5) -findLast(list, i64 <= i) -findLast(list, i64 == i32) -findLast(list, i64 > 0.5) +findLast(list, foo != #) +findLast(list, foo in list) +findLast(list, i != i) +findLast(list, i <= 1) +findLast(list, i <= i) +findLast(list, i == i32) +findLast(list, i >= i) +findLast(list, i32 != f32) +findLast(list, i64 > f32) findLast(list, i64 > i) -findLast(list, i64 >= i32) -findLast(list, nil != "bar") +findLast(list, i64 >= 1) findLast(list, nil != #) -findLast(list, nil != add) -findLast(list, nil != false) -findLast(list, nil != foo) -findLast(list, nil != nil) -findLast(list, nil != ok) -findLast(list, nil == #) -findLast(list, nil == i32) -findLast(list, nil == i64) -findLast(list, nil == list) -findLast(list, nil == nil) -findLast(list, not ok) -findLast(list, ok ? ok : nil) +findLast(list, nil not in array) +findLast(list, nil not in list) +findLast(list, none(array, ok)) +findLast(list, not false) +findLast(list, not true) +findLast(list, ok or true) findLast(list, ok) +findLast(list, ok) not in list findLast(list, ok).Bar findLast(list, ok).Qux findLast(list, ok).String -findLast(list, ok).String() findLast(list, ok)?.Bar findLast(list, ok)?.Qux findLast(list, ok)?.String -findLast(list, one(list, true)) -findLast(list, true != nil) +findLast(list, true or ok) findLast(list, true).Bar findLast(list, true).Qux findLast(list, true).String findLast(list, true)?.Bar findLast(list, true)?.Qux findLast(list, true)?.String -findLast(map(array, #), # > f32) -findLast(map(array, #), # >= #) +findLast(map(array, #), # < #) +findLast(map(array, #), # < i32) +findLast(map(array, #), # <= 1) +findLast(map(array, #), # == f64) +findLast(map(array, #), 0.5 != 0.5) findLast(map(array, #), i32 == #) findLast(map(array, #), ok) -findLast(map(array, f64), # <= #) -findLast(map(array, i), # <= #) -findLast(map(array, ok), #) -findLast(map(array, ok), not #) -findLast(map(array, true), #) -findLast(map(list, #), # != #) -findLast(map(list, array), # == #) -findLast(map(list, i), # >= #) -findLast(map(list, list), ok) -findLast(map(list, score), 0.5 > f32) -findLast(ok ? array : div, # >= #) -findLast(sort(array), # && false) -findLastIndex([i32], # >= 0.5) -findLastIndex(array, !false) -findLastIndex(array, !ok) -findLastIndex(array, !true) -findLastIndex(array, "bar" != "bar") +findLast(map(array, f64 * #), # + # > f32) +findLast(map(array, score), ok) +findLast(map(list, #), # == #) +findLast(map(list, #), greet == nil) +findLast(map(list, #), ok) +findLast(map(list, ok), # ? # : #) +findLastIndex(1 .. 1, i64 < #) +findLastIndex([false], 0.5 == #) +findLastIndex([i64, half], ok) +findLastIndex(array, "bar" not matches "foo") +findLastIndex(array, "bar" startsWith "foo") +findLastIndex(array, "foo" == nil) +findLastIndex(array, "foo" >= "foo") +findLastIndex(array, "foo" contains "foo") findLastIndex(array, # != #) -findLastIndex(array, # != 0.5) +findLastIndex(array, # != 1) +findLastIndex(array, # != f32) +findLastIndex(array, # != f64) +findLastIndex(array, # != i32) findLastIndex(array, # != i64) findLastIndex(array, # != nil) -findLastIndex(array, # / f32 == #) -findLastIndex(array, # < # ** i32) findLastIndex(array, # < #) -findLastIndex(array, # < 0.5) findLastIndex(array, # < 1) -findLastIndex(array, # < f32) findLastIndex(array, # < f64) findLastIndex(array, # < i) findLastIndex(array, # < i64) findLastIndex(array, # <= #) findLastIndex(array, # <= 0.5) -findLastIndex(array, # <= 1) -findLastIndex(array, # <= f32) -findLastIndex(array, # <= f64) -findLastIndex(array, # <= i) -findLastIndex(array, # <= i32) findLastIndex(array, # <= i64) findLastIndex(array, # == #) findLastIndex(array, # == 0.5) findLastIndex(array, # == 1) -findLastIndex(array, # == i32) +findLastIndex(array, # == f64) +findLastIndex(array, # == i64) findLastIndex(array, # == nil) findLastIndex(array, # > #) findLastIndex(array, # > 0.5) -findLastIndex(array, # > 1) +findLastIndex(array, # > f32) +findLastIndex(array, # > f64) findLastIndex(array, # > i) -findLastIndex(array, # > i64) findLastIndex(array, # >= #) +findLastIndex(array, # >= 0.5) findLastIndex(array, # >= 1) -findLastIndex(array, # >= f64) -findLastIndex(array, # in array) +findLastIndex(array, # >= f32) +findLastIndex(array, # >= i32) +findLastIndex(array, # ^ # >= #) findLastIndex(array, # not in array) findLastIndex(array, 0.5 != #) -findLastIndex(array, 0.5 != 0.5) +findLastIndex(array, 0.5 != i64) findLastIndex(array, 0.5 < #) -findLastIndex(array, 0.5 < i) +findLastIndex(array, 0.5 < i32) findLastIndex(array, 0.5 <= #) -findLastIndex(array, 0.5 <= 0.5) -findLastIndex(array, 0.5 == #) findLastIndex(array, 0.5 > #) -findLastIndex(array, 0.5 > i) -findLastIndex(array, 0.5 >= #) -findLastIndex(array, 0.5 >= f32) +findLastIndex(array, 0.5 >= 0.5) +findLastIndex(array, 0.5 >= f64) findLastIndex(array, 1 != #) -findLastIndex(array, 1 < #) findLastIndex(array, 1 <= #) -findLastIndex(array, 1 <= i) -findLastIndex(array, 1 <= i64) findLastIndex(array, 1 == #) -findLastIndex(array, 1 > #) -findLastIndex(array, 1 > 1) -findLastIndex(array, 1 >= #) -findLastIndex(array, 1 in array) -findLastIndex(array, add != add) -findLastIndex(array, any(list, false)) +findLastIndex(array, 1 == f64) +findLastIndex(array, 1 >= i32) +findLastIndex(array, array == nil) findLastIndex(array, f32 != #) +findLastIndex(array, f32 != f32) findLastIndex(array, f32 < #) -findLastIndex(array, f32 <= f64) -findLastIndex(array, f32 == f64) +findLastIndex(array, f32 == #) +findLastIndex(array, f32 == nil) findLastIndex(array, f32 > #) -findLastIndex(array, f32 >= f64) findLastIndex(array, f64 != #) findLastIndex(array, f64 < #) +findLastIndex(array, f64 <= #) +findLastIndex(array, f64 <= i32) findLastIndex(array, f64 == #) -findLastIndex(array, f64 > i) -findLastIndex(array, f64 >= #) -findLastIndex(array, i == #) -findLastIndex(array, i > #) -findLastIndex(array, i > 1) -findLastIndex(array, i >= #) -findLastIndex(array, i32 != #) -findLastIndex(array, i32 < #) -findLastIndex(array, i32 <= 0.5) -findLastIndex(array, i32 == #) -findLastIndex(array, i32 == i32) -findLastIndex(array, i32 > #) -findLastIndex(array, i64 != #) -findLastIndex(array, i64 != f32) -findLastIndex(array, i64 >= #) -findLastIndex(array, list != nil) -findLastIndex(array, nil != "foo") +findLastIndex(array, f64 == 0.5) +findLastIndex(array, f64 > #) +findLastIndex(array, false ? # : false) +findLastIndex(array, foo != foo) +findLastIndex(array, greet == greet) +findLastIndex(array, half == greet) +findLastIndex(array, i - # >= #) +findLastIndex(array, i < #) +findLastIndex(array, i <= #) +findLastIndex(array, i > 0.5) +findLastIndex(array, i32 <= #) +findLastIndex(array, i32 <= 1) +findLastIndex(array, i32 <= f32) +findLastIndex(array, i32 > 0.5) +findLastIndex(array, i32 >= #) +findLastIndex(array, i64 <= # + #) +findLastIndex(array, i64 > #) +findLastIndex(array, min(1, #) <= i32 + #) findLastIndex(array, nil != #) -findLastIndex(array, nil != 0.5) -findLastIndex(array, nil != foo) -findLastIndex(array, nil != nil) +findLastIndex(array, nil != add) +findLastIndex(array, nil != i32) findLastIndex(array, nil == #) -findLastIndex(array, nil == i) -findLastIndex(array, nil not in list) -findLastIndex(array, none(array, true)) -findLastIndex(array, not (# != #)) -findLastIndex(array, not false) +findLastIndex(array, not (i32 != 0.5)) +findLastIndex(array, not ok) +findLastIndex(array, ok && true) findLastIndex(array, ok) -findLastIndex(array, ok) * f64 -findLastIndex(array, ok) / i64 -findLastIndex(array, ok) <= i64 -findLastIndex(array, ok) ^ f32 -findLastIndex(array, true ? ok : 1) +findLastIndex(array, ok) % i64 +findLastIndex(array, ok) + f64 +findLastIndex(array, one(list, ok)) +findLastIndex(array, score == nil) +findLastIndex(array, true == false) findLastIndex(array, true) / f32 -findLastIndex(array, true) <= i64 -findLastIndex(array, true) > f64 -findLastIndex(false ? i : "bar", ok) -findLastIndex(filter(list, true), ok) -findLastIndex(i .. i32, # == 1) -findLastIndex(i32 .. i, ok) -findLastIndex(i32 .. i64, f64 == nil) -findLastIndex(i64 .. 1, # != nil) -findLastIndex(i64 .. 1, add == nil) +findLastIndex(array, true) not in array +findLastIndex(filter(array, false), ok) +findLastIndex(groupBy(array, "foo")?.add, #[list]) +findLastIndex(groupBy(array, #)?.foo, #) +findLastIndex(groupBy(array, #)?.i32, not #) +findLastIndex(groupBy(array, #)?.score, #) +findLastIndex(groupBy(list, #).ok, #) +findLastIndex(groupBy(list, #)?.String, # + #.add) +findLastIndex(groupBy(list, 0.5).Bar, #?.String endsWith .f32(list)) +findLastIndex(i32 .. i32, ok) +findLastIndex(i64 .. 1, ok) +findLastIndex(list, !(nil != #)) +findLastIndex(list, !false) findLastIndex(list, !ok) findLastIndex(list, !true) findLastIndex(list, "bar" in #) -findLastIndex(list, "foo" matches "bar") +findLastIndex(list, "bar" matches "foo") +findLastIndex(list, "bar" not endsWith "foo") +findLastIndex(list, "bar" not matches "bar") +findLastIndex(list, "foo" <= "bar") +findLastIndex(list, "foo" not in #) findLastIndex(list, # != #) findLastIndex(list, # != foo) -findLastIndex(list, # != nil) findLastIndex(list, # == #) +findLastIndex(list, # == foo) findLastIndex(list, # == nil) findLastIndex(list, # in list) -findLastIndex(list, 0.5 != i) -findLastIndex(list, 0.5 <= 0.5) -findLastIndex(list, 0.5 <= f32) -findLastIndex(list, 1 != 0.5) -findLastIndex(list, 1 != f64) -findLastIndex(list, 1 != i64) -findLastIndex(list, 1 < i32) -findLastIndex(list, 1 <= f32) -findLastIndex(list, 1 <= i) -findLastIndex(list, array != list) +findLastIndex(list, # not in list) +findLastIndex(list, 1 != f32) +findLastIndex(list, 1 != nil) +findLastIndex(list, 1 > 1) +findLastIndex(list, 1 >= 0.5) findLastIndex(list, array != nil) -findLastIndex(list, array == list) -findLastIndex(list, div == add) -findLastIndex(list, div == score) -findLastIndex(list, f32 != 0.5) -findLastIndex(list, f32 < f64) -findLastIndex(list, f32 < i32) -findLastIndex(list, f32 <= i64) -findLastIndex(list, f32 == i32) -findLastIndex(list, f32 > f32) -findLastIndex(list, f64 <= 1) -findLastIndex(list, f64 == f64) -findLastIndex(list, false == false) -findLastIndex(list, false and false) -findLastIndex(list, false and ok) -findLastIndex(list, false) != i -findLastIndex(list, foo != #) -findLastIndex(list, foo == foo) -findLastIndex(list, greet != half) -findLastIndex(list, greet == nil) -findLastIndex(list, half != nil) -findLastIndex(list, i < i64) -findLastIndex(list, i <= i) -findLastIndex(list, i32 != nil) -findLastIndex(list, i32 < f64) -findLastIndex(list, i32 <= i32) -findLastIndex(list, i32 >= 0.5) -findLastIndex(list, i32 >= i) -findLastIndex(list, i64 < f64) -findLastIndex(list, i64 == f32) -findLastIndex(list, i64 >= i) +findLastIndex(list, div != nil) +findLastIndex(list, f32 != 1) +findLastIndex(list, f32 != f64) +findLastIndex(list, f64 > 0.5) +findLastIndex(list, foo == #) +findLastIndex(list, half != div) +findLastIndex(list, half == greet) +findLastIndex(list, half == score) +findLastIndex(list, i <= 1) +findLastIndex(list, i32 > 1) +findLastIndex(list, i32 > f32) +findLastIndex(list, i64 == i64) +findLastIndex(list, i64 >= 0.5) findLastIndex(list, i64 not in array) +findLastIndex(list, nil != "bar") findLastIndex(list, nil != #) +findLastIndex(list, nil != f64) findLastIndex(list, nil == #) -findLastIndex(list, none(array, ok)) -findLastIndex(list, not ok) +findLastIndex(list, nil == 1) +findLastIndex(list, nil == half) +findLastIndex(list, not false) findLastIndex(list, not true) -findLastIndex(list, ok != nil) +findLastIndex(list, ok ? ok : 0.5) +findLastIndex(list, ok and false) findLastIndex(list, ok) -findLastIndex(list, ok) ** f32 -findLastIndex(list, ok) ** f64 -findLastIndex(list, ok) - i -findLastIndex(list, ok) >= i64 -findLastIndex(list, true == nil) -findLastIndex(list, true) ** i64 -findLastIndex(list, true) + i -findLastIndex(list, true) .. i64 -findLastIndex(list, true) < i -findLastIndex(list, true) > f32 -findLastIndex(list, true) >= f32 -findLastIndex(list, true) in array -findLastIndex(map(array, "foo"), # == #) -findLastIndex(map(array, #), i < #) -findLastIndex(map(array, #), nil != half) +findLastIndex(list, ok) != i64 +findLastIndex(list, ok) > f32 +findLastIndex(list, ok) > i64 +findLastIndex(list, one(array, true)) +findLastIndex(list, true && ok) +findLastIndex(list, true) * i32 +findLastIndex(list, true) - i32 +findLastIndex(list, true) < i64 +findLastIndex(list, true) > i64 +findLastIndex(list, true) ^ f64 +findLastIndex(map(array, "bar"), # not endsWith #) +findLastIndex(map(array, #), # < f64) +findLastIndex(map(array, #), # <= #) findLastIndex(map(array, #), ok) -findLastIndex(map(array, 0.5), ok) -findLastIndex(map(array, array), 1 != i) -findLastIndex(map(array, false), #) -findLastIndex(map(array, true), #) -findLastIndex(map(list, #), !ok) -findLastIndex(map(list, #), 0.5 < f32) -findLastIndex(map(list, 0.5), # <= #) -findLastIndex(map(list, f32), # == #) -findLastIndex(map(list, f32), # >= #) -findLastIndex(map(list, f32), ok) +findLastIndex(map(array, div), 0.5 <= 0.5) +findLastIndex(map(array, f32), nil == nil) +findLastIndex(map(array, list), ok) +findLastIndex(map(array, ok), # and #) +findLastIndex(map(list, "bar"), # >= #) +findLastIndex(map(list, #), !true) +findLastIndex(map(list, #), nil == 0.5) findLastIndex(map(list, false), #) -findLastIndex(map(list, half), ok) -findLastIndex(map(list, ok), # or #) -findLastIndex(map(list, ok), #) -findLastIndex(sort(array), ok) -first(1 .. i) -first(1 .. i32) +findLastIndex(map(list, foo), ok) +findLastIndex(map(list, i32), # >= #) +findLastIndex(map(list, i64), ok) +findLastIndex(ok ? "bar" : add, not false) +findLastIndex(true ? "foo" : 1, # and false) +first(1 .. 1) +first(1 .. i64) first([f32]) -first([f64]) -first([false, list]) -first([i64, nil]) -first([list, i32]) -first([not false]) +first([foo]) +first([ok]) first(array) first(array) * i -first(array) ** i32 -first(array) ** i64 -first(array) + i32 -first(array) / 1 * 0.5 -first(array) <= i32 -first(array) <= i64 +first(array) * i64 +first(array) + f32 +first(array) <= i +first(array) == f32 +first(array) == f64 first(array) == i64 -first(array) > i32 +first(array) > 0.5 ** i first(array) > i64 -first(array) in array -first(false ? f64 : true) -first(false ? greet : i) -first(filter(array, false)) -first(filter(list, ok)) -first(i .. 1) +first(array) ^ f64 +first(array[1:1]) +first(false ? foo : 1) +first(false ? greet : foo) +first(get(groupBy(array, #), i)) +first(groupBy(array, #).greet) +first(groupBy(list, #)?.div) first(i .. i) -first(i .. i32) -first(i32 .. 1) -first(i32 .. i) -first(i32 .. i64) first(i64 .. i32) +first(i64 .. i64) first(list) first(list) not in list first(list).Bar @@ -5704,44 +6497,33 @@ first(list)?.Bar first(list)?.Qux first(list)?.String first(list)?.String() -first(map(array, "bar")) first(map(array, #)) first(map(array, 0.5)) first(map(array, 1)) first(map(array, add)) -first(map(array, f32)) -first(map(array, f64)) -first(map(array, foo)) -first(map(array, greet)) +first(map(array, array)) +first(map(array, div)) first(map(array, half)) first(map(array, i)) -first(map(array, list)) +first(map(array, i32)) +first(map(array, i64)) first(map(array, ok)) -first(map(array, score)) first(map(list, #)) first(map(list, 0.5)) -first(map(list, add)) -first(map(list, array)) -first(map(list, div)) first(map(list, f32)) -first(map(list, f64)) -first(map(list, i32)) +first(map(list, greet)) +first(map(list, i)) first(map(list, list)) first(map(list, score)) -first(ok ? "bar" : 0.5) -first(ok ? 1 : "foo") -first(ok ? add : f32) -first(ok ? array : "bar") -first(ok ? list : nil) -first(ok ? ok : array) -first(ok ? ok : foo) -first(ok ? ok : score) +first(ok ? 0.5 : false) +first(ok ? array : add) +first(ok ? greet : i64) +first(ok ? list : ok) +first(reduce(list, array)) first(sort(array)) -first(true ? 0.5 : i64) -first(true ? add : ok) -first(true ? array : false) -first(true ? ok : div) -float(-(1 / i32)) +first(true ? f32 : div) +first(true ? greet : div) +first(true ? score : div) float(-0.5) float(-1) float(-f32) @@ -5750,184 +6532,149 @@ float(-i) float(-i32) float(-i64) float(0.5 * 0.5) +float(0.5 * 1) float(0.5 * f32) -float(0.5 * i) -float(0.5 * i32) float(0.5 * i64) float(0.5 ** 0.5) -float(0.5 ** 1) float(0.5 ** f32) -float(0.5 ** i32) float(0.5 + 1) -float(0.5 + f32) -float(0.5 + i) +float(0.5 + i32) float(0.5 + i64) float(0.5 - 0.5) float(0.5 - 1) -float(0.5 - f32) -float(0.5 - i) -float(0.5 - i32) float(0.5 - i64) float(0.5 / 0.5) -float(0.5 / 1) -float(0.5 / f32) -float(0.5 / f64) -float(0.5 / i) -float(0.5 ^ 0.5) +float(0.5 / i32) +float(0.5 / i64) float(0.5 ^ 1) -float(0.5 ^ f64) -float(0.5 ^ i32) -float(0.5 ^ i64) +float(0.5 ^ i) +float(0.5) != f32 float(0.5) != i32 -float(0.5) ** (1 % 1) -float(0.5) + 0.5 - f64 -float(0.5) + f32 -float(0.5) + i32 -float(0.5) - -f32 -float(0.5) - f32 +float(0.5) * f32 +float(0.5) * i32 +float(0.5) * i64 +float(0.5) ** f64 +float(0.5) ** i +float(0.5) ** i32 +float(0.5) - i +float(0.5) - i64 float(0.5) / f32 -float(0.5) < i32 -float(0.5) >= i32 -float(1 % 1) -float(1 % i) -float(1 % i32) +float(0.5) / f64 +float(0.5) / i32 +float(0.5) == i32 * 0.5 +float(0.5) ^ i64 +float(0.5) in array float(1 % i64) float(1 * 0.5) -float(1 * 1) +float(1 * f32) float(1 * i) -float(1 * i32) float(1 * i64) float(1 ** 0.5) +float(1 ** 1) +float(1 ** f64) float(1 ** i) -float(1 + 0.5) -float(1 + 1) -float(1 + f32) float(1 + f64) -float(1 + i) +float(1 + i32) float(1 - 0.5) -float(1 - 1) -float(1 - f32) -float(1 - i) float(1 / 0.5) -float(1 / 1) -float(1 / f64) -float(1 / i) -float(1 ^ 1) -float(1 ^ f32) float(1 ^ f64) -float(1 ^ i) -float(1 ^ i32) -float(1 ^ i64) -float(1) != abs(f32) -float(1) != {"foo": i32}?.add +float(1) * f32 +float(1) * i64 +float(1) ** i float(1) ** i64 -float(1) - i64 -float(1) / i -float(1) / i64 -float(1) < i32 +float(1) - f64 float(1) <= i64 -float(1) == int(0.5) -float(1) > i -float(1) >= f32 -float(1) >= i - i -float(abs(0.5)) -float(abs(1)) +float(1) == i64 +float(1) > -0.5 +float(1) > i64 +float(1) >= f64 +float(1) >= i float(abs(f32)) +float(abs(f64)) float(abs(i)) float(abs(i32)) -float(abs(i64)) -float(add(i, 1)) -float(array[1]) +float(add(1, 1)) float(array[i32]) float(array[i64]) float(array[i]) -float(count(array, true)) -float(count(list, false) * (i - 1)) -float(count(list, false)) -float(div(1, i)) -float(div(i, 1)) -float(f32 * 0.5) -float(f32 * f32) +float(bitnot(1)) +float(bitnot(i)) +float(bitnot(i32)) +float(bitnot(i64)) +float(ceil(0.5)) +float(ceil(f32)) +float(ceil(f64)) +float(ceil(i32)) +float(ceil(i64)) +float(count(array, false)) +float(count(array, ok)) +float(count(list, i32 == 0.5)) +float(f32 * f64) +float(f32 * i) float(f32 * i32) -float(f32 * i64) -float(f32 ** 0.5) float(f32 ** 1) +float(f32 ** f32) float(f32 ** i) float(f32 ** i64) float(f32 + 0.5) float(f32 + 1) -float(f32 + f32) +float(f32 + f64) float(f32 + i32) +float(f32 + i64) float(f32 - 0.5) -float(f32 - 1) float(f32 - f64) -float(f32 - i) +float(f32 - i64) float(f32 / 0.5) float(f32 / 1) -float(f32 / f32) float(f32 / i) -float(f32 / i64) float(f32 ^ 0.5) +float(f32 ^ 1) float(f32 ^ f32) -float(f32 ^ f64) -float(f32 ^ i64) +float(f32 ^ i) +float(f32 ^ i32) float(f32) -float(f32) * f32 -float(f32) + f32 -float(f32) - f32 -float(f32) - f64 -float(f32) - i64 -float(f32) / f64 float(f32) < i32 float(f32) <= f32 -float(f32) >= f32 -float(f32) >= f32 ** f32 +float(f32) <= f64 / f32 +float(f32) <= i +float(f32) > i +float(f32) >= i64 float(f32) ^ f64 -float(f32) ^ i32 +float(f32) ^ i64 float(f64 * 0.5) +float(f64 * 1) float(f64 * f32) -float(f64 * i) +float(f64 * f64) float(f64 * i32) -float(f64 ** 1) float(f64 ** f32) -float(f64 + 0.5) float(f64 + 1) float(f64 + i) -float(f64 - 0.5) +float(f64 + i32) +float(f64 - 1) float(f64 - i) -float(f64 - i32) -float(f64 - i32) / i -float(f64 / -i32) +float(f64 / 0.5) float(f64 / 1) -float(f64 / f32) -float(f64 / i32) -float(f64 ^ 0.5) -float(f64 ^ 1) +float(f64 / i64) float(f64 ^ f32) -float(f64 ^ f64) float(f64) -float(f64) != int(i32) -float(f64) * i32 -float(f64) / f32 -float(f64) / f64 -float(f64) / i64 -float(f64) < i -float(f64) < i32 -float(f64) <= f32 -float(f64) <= i64 -float(f64) == i32 -float(f64) > i32 -float(f64) >= f64 +float(f64) * f32 +float(f64) * i +float(f64) / -i32 +float(f64) / i +float(f64) == f64 +float(f64) > f64 +float(f64) > i64 +float(f64) >= f32 float(f64) >= i -float(f64) >= i32 -float(f64) ^ i -float(false ? div : i32) -float(false ? f32 : 0.5) +float(f64) >= i64 +float(f64) ^ i64 +float(false ? f64 : 0.5) +float(false ? half : f64) +float(false ? list : f64) float(find(array, ok)) -float(find(array, true)) -float(findIndex(list, true)) -float(findLast(array, ok)) -float(findLast(array, true)) +float(findIndex(array, ok)) +float(findLastIndex(array, ok)) +float(findLastIndex(list, true)) float(first(array)) float(float(0.5)) float(float(1)) @@ -5935,353 +6682,649 @@ float(float(f32)) float(float(f64)) float(float(i)) float(float(i32)) -float(float(i64)) +float(floor(0.5)) +float(floor(1)) +float(floor(f32)) +float(floor(f64)) +float(floor(i32)) +float(floor(i64)) float(get(array, 1)) float(get(array, i)) -float(get(array, i64)) -float(half(-f64)) float(half(0.5)) +float(half(1)) float(half(f64)) -float(i % 1) +float(i % i32) float(i * 0.5) -float(i * 1) float(i * f64) -float(i * i) -float(i * i32 * i32) -float(i * i32) float(i * i64) -float(i ** 1) -float(i ** f64) +float(i ** f32) float(i ** i32) float(i + 0.5) -float(i + f64) +float(i + 1) float(i + i64) -float(i - 0.5) float(i - 1) -float(i - findIndex(array, true)) +float(i - f64) +float(i / 0.5) float(i / 1) -float(i / f64) -float(i / i64) -float(i ^ f32) -float(i ^ f64) -float(i ^ i64) +float(i ^ 0.5) +float(i ^ i32) float(i) -float(i) != f32 -float(i) != i32 -float(i) != i64 -float(i) ** f32 -float(i) / i32 -float(i) < f32 -float(i) < i64 -float(i) <= f32 -float(i) == i32 +float(i) != 1 ? nil : foo +float(i) != f64 +float(i) + f32 +float(i) + f64 +float(i) < i +float(i) == f32 +float(i) == i float(i) > f64 -float(i) ^ f64 -float(i) ^ i64 -float(i32 % 1) float(i32 % i) -float(i32 * 1) -float(i32 * f32) -float(i32 ** 0.5) -float(i32 ** f64) -float(i32 ** i32) -float(i32 ** i64) -float(i32 + 1) -float(i32 + f32) -float(i32 - 0.5) -float(i32 - f64) -float(i32 - i) -float(i32 - i32) -float(i32 / 0.5) +float(i32 % i64) +float(i32 * f64) +float(i32 * i32) +float(i32 ** 1) +float(i32 + f64) +float(i32 + i64) float(i32 / 1) -float(i32 / 1) > f64 -float(i32 / i) -float(i32 ^ 1) +float(i32 / f32) +float(i32 / i32) float(i32 ^ f64) -float(i32 ^ i) +float(i32 ^ i32) float(i32) float(i32) != f64 -float(i32) * i64 -float(i32) + i -float(i32) + i64 -float(i32) - i64 -float(i32) / i -float(i32) / i32 -float(i32) < -0.5 -float(i32) == f32 -float(i32) == i32 -float(i32) > f32 +float(i32) ** f32 +float(i32) ** i float(i32) > i32 -float(i32) >= f32 -float(i32) >= f64 -float(i32) ^ f32 -float(i32) ^ f64 -float(i32) ^ i32 -float(i64 % i) -float(i64 % i32) -float(i64 * 0.5) -float(i64 * 1) -float(i64 ** f64) -float(i64 ** i64) -float(i64 + 0.5) -float(i64 + f64) +float(i32) >= i +float(i64 % i64) +float(i64 * i64) +float(i64 ** 1) +float(i64 + f32) +float(i64 + i) +float(i64 - 0.5) float(i64 - 1) float(i64 - f32) -float(i64 - f64) -float(i64 - i32) -float(i64 - i64) -float(i64 / 0.5) float(i64 / 1) -float(i64 / f32) -float(i64 ^ f64) +float(i64 ^ f32) float(i64) -float(i64) ** i +float(i64) != i +float(i64) ** max(f64) +float(i64) + i32 +float(i64) - 0.5 ^ f32 +float(i64) - f64 float(i64) / i32 -float(i64) > f64 ^ f32 -float(i64) >= i -float(i64) >= i64 +float(i64) < i32 +float(i64) == i +float(i64) == i64 +float(i64) > i +float(i64) ^ f32 float(int(0.5)) float(int(1)) float(int(f32)) -float(int(f64)) float(int(i)) float(int(i32)) -float(int(i64)) +float(last(array)) float(len("bar")) -float(len("foo")) float(len(array)) float(len(list)) float(max(0.5)) -float(max(0.5, i32)) +float(max(0.5, i64)) float(max(1)) -float(max(1, i)) -float(max(1, i64)) +float(max(1, 1)) +float(max(f32)) float(max(f64)) float(max(i)) float(max(i32)) float(max(i64)) -float(min(0.5)) +float(mean(array)) float(min(1)) -float(min(f32)) float(min(f64)) -float(min(i)) +float(min(f64, i64)) float(min(i32)) float(min(i64)) -float(ok ? f64 : half) -float(ok ? i : greet) +float(ok ? 0.5 : foo) +float(ok ? 0.5 : list) +float(reduce(array, #)) +float(reduce(array, 0.5)) +float(reduce(array, f64)) +float(reduce(array, i32)) +float(reduce(list, i64)) +float(round(0.5)) +float(round(1)) +float(round(i32)) +float(round(i64)) float(score(1)) +float(score(1, 1)) float(score(i)) -float(score(i, i)) <= f32 -float(score(score(i))) float(string(0.5)) float(string(1)) -float(string(f32)) -float(string(f64)) +float(string(f64 - 0.5)) float(string(i)) +float(string(i32)) float(string(i64)) +float(sum(array)) float(toJSON(0.5)) float(toJSON(1)) float(toJSON(f32)) float(toJSON(f64)) -float(toJSON(i)) float(toJSON(i32)) -float(true ? 1 : div) -float(true ? 1 : i64) -float(true ? f64 : div) +float(toJSON(i64)) +float(true ? f32 : "foo") +floor(-0.5) +floor(-1) +floor(-f32) +floor(-f64) +floor(-i) +floor(-i32) +floor(-i64) +floor(0.5 * 0.5) +floor(0.5 * 1) +floor(0.5 * i32) +floor(0.5 ** 1) +floor(0.5 ** f64) +floor(0.5 ** i) +floor(0.5 + 1) +floor(0.5 + f32) +floor(0.5 + i) +floor(0.5 + i32) +floor(0.5 + i64) +floor(0.5 - 1) +floor(0.5 - f32) +floor(0.5 - i) +floor(0.5 / 0.5) +floor(0.5 / 1) +floor(0.5 / i32) +floor(0.5 ^ 0.5) +floor(0.5 ^ 1) +floor(0.5 ^ f32) +floor(0.5 ^ f64) +floor(0.5 ^ i) +floor(0.5) != i64 +floor(0.5) ** f32 +floor(0.5) - i +floor(0.5) - i64 +floor(0.5) / i +floor(0.5) <= i64 +floor(0.5) > i32 +floor(0.5) > i64 != ok +floor(0.5) >= f32 +floor(0.5) ^ i +floor(1 % 1) +floor(1 % i) +floor(1 * 0.5) +floor(1 * 1) +floor(1 ** 1) +floor(1 ** f64) +floor(1 ** i32) +floor(1 + 0.5) +floor(1 + 1) +floor(1 + f32) +floor(1 + f64) +floor(1 + i32) +floor(1 - 0.5) +floor(1 - 1) +floor(1 - i) +floor(1 - i32) +floor(1 - i64) +floor(1 / 0.5) +floor(1 / 1) +floor(1 / i) +floor(1 / i64) +floor(1 ^ i) +floor(1 ^ i32) +floor(1 ^ i64) +floor(1) * i64 +floor(1) - f32 +floor(1) - i +floor(1) <= f32 +floor(1) >= half(0.5) +floor(abs(0.5)) +floor(abs(1)) +floor(abs(f32)) +floor(abs(f64)) +floor(abs(i32)) +floor(abs(i64)) +floor(array[1]) +floor(array[i32]) +floor(array[i64]) +floor(array[i]) +floor(bitnot(1)) +floor(bitnot(i)) +floor(bitnot(i32)) +floor(bitnot(i64)) +floor(ceil(0.5)) +floor(ceil(1)) +floor(ceil(f64)) +floor(ceil(i)) +floor(ceil(i32)) +floor(ceil(i64)) +floor(count(array, false)) +floor(count(array, ok)) +floor(count(list, ok)) +floor(f32 ** 1) +floor(f32 ** f64) +floor(f32 ** i32) +floor(f32 + f32) +floor(f32 + i32) +floor(f32 + i64) +floor(f32 - 0.5) +floor(f32 - f64) +floor(f32 / 0.5) +floor(f32 / f64) +floor(f32 / i) +floor(f32 / i32) +floor(f32 / i64) +floor(f32 ^ 0.5) +floor(f32 ^ f64) +floor(f32 ^ i) +floor(f32) +floor(f32) != -i32 +floor(f32) * i32 +floor(f32) + f32 +floor(f32) / f32 +floor(f32) / f64 +floor(f32) == i64 +floor(f32) > i32 +floor(f32) >= f32 +floor(f32) >= i +floor(f32) ^ f32 +floor(f64 * f32) +floor(f64 ** 0.5) +floor(f64 ** 1) +floor(f64 ** i32) +floor(f64 + 0.5) +floor(f64 + 1) +floor(f64 + i32) +floor(f64 - 0.5) +floor(f64 - i32) +floor(f64 / 0.5) +floor(f64 / 1) +floor(f64 / f32) +floor(f64 / f64) +floor(f64 / i) +floor(f64 ^ 1) +floor(f64) +floor(f64) * i32 +floor(f64) ** f64 +floor(f64) / f32 +floor(f64) < i32 +floor(f64) <= f64 +floor(f64) <= i64 +floor(f64) == f64 ** i +floor(f64) == i +floor(f64) > i32 +floor(f64) >= 1 * 1 +floor(f64) >= f32 +floor(false ? div : 0.5) +floor(find(array, true)) +floor(findIndex(array, ok)) +floor(findLastIndex(array, ok)) +floor(float(0.5)) +floor(float(1)) +floor(float(f64)) +floor(float(i32)) +floor(floor(0.5)) +floor(floor(1)) +floor(floor(f32)) +floor(floor(f64)) +floor(floor(i)) +floor(floor(i32)) +floor(floor(i64)) +floor(get(array, 1)) +floor(get(array, i)) +floor(get(array, i64)) +floor(half(0.5)) +floor(half(1)) +floor(half(f64)) +floor(i % 1) +floor(i % i) +floor(i % i32) +floor(i % i64) +floor(i * 1) +floor(i * f64) +floor(i ** 0.5) +floor(i ** f32) +floor(i ** i32) +floor(i ** i64) +floor(i + 0.5) +floor(i + f64) +floor(i - 0.5) +floor(i - f32) +floor(i - i32) +floor(i / 0.5) +floor(i / 1) +floor(i / f64) +floor(i ^ i32) +floor(i) +floor(i) != i +floor(i) * f64 +floor(i) ^ i +floor(i32 % i32) +floor(i32 * 1) +floor(i32 * f32) +floor(i32 * f64) +floor(i32 * i32) +floor(i32 ** i) +floor(i32 ** i64) +floor(i32 + 0.5) +floor(i32 + f64) +floor(i32 - 1) +floor(i32 - f32) +floor(i32 - i) +floor(i32 - i32) +floor(i32 - i64) +floor(i32 ^ 0.5) +floor(i32 ^ 1) +floor(i32 ^ f64) +floor(i32 ^ i) +floor(i32 ^ i32) +floor(i32 ^ i64) +floor(i32) +floor(i32) != f32 +floor(i32) * f64 +floor(i32) * i +floor(i32) * i64 +floor(i32) > i32 +floor(i32) > i64 +floor(i32) >= i32 +floor(i32) ^ i32 +floor(i64 % i) +floor(i64 * 0.5) +floor(i64 * f32) +floor(i64 * i) +floor(i64 ** 0.5) +floor(i64 ** 1) +floor(i64 ** i) +floor(i64 ** i32) +floor(i64 + 0.5) +floor(i64 + f64) +floor(i64 + i64) +floor(i64 - f64) +floor(i64 - i) +floor(i64 / f32) +floor(i64 ^ 0.5) +floor(i64 ^ f32) +floor(i64 ^ i64) +floor(i64) +floor(i64) * i64 +floor(i64) / (i64 - i) +floor(i64) / f64 +floor(i64) / i32 +floor(i64) < f32 +floor(i64) <= i64 +floor(i64) ^ f32 +floor(int(0.5)) +floor(int(1)) +floor(int(i32)) +floor(int(i64)) +floor(len("foo")) +floor(len(array)) +floor(len(list)) +floor(max(0.5)) +floor(max(1)) +floor(max(f32)) +floor(max(f64)) +floor(max(i32)) +floor(min(0.5)) +floor(min(f64) ^ i64) +floor(min(i, i64)) +floor(min(i32)) +floor(ok ? 1 : 1) +floor(ok ? f32 : "foo") +floor(ok ? i64 : f64) +floor(reduce(array, #)) +floor(reduce(array, i)) +floor(reduce(array, i64)) +floor(reduce(list, 1)) +floor(reduce(list, f32)) +floor(reduce(list, i64)) +floor(round(0.5)) +floor(round(f32)) +floor(round(f64)) +floor(round(i)) +floor(round(i32)) +floor(score(1)) +floor(score(1, 1)) +floor(score(i)) +floor(true ? 0.5 : false) +floor(true ? 1 : true) +floor(true ? f64 : 0.5) +floor(true ? f64 : array) foo -foo != first(list) foo != foo -foo != foo ? 1 : 1 -foo != get(list, i) -foo != last(list) -foo != nil ? half : nil +foo != nil != nil +foo != reduce(list, #) foo == foo -foo == foo ? i : score -foo == last(list) -foo == nil == nil -foo == nil || ok +foo == foo and 0.5 != f64 +foo == get(list, 1) +foo == list[i] +foo == nil ? i : i32 +foo == nil ? i64 : i +foo == reduce(list, #) foo in filter(list, false) +foo in groupBy(array, #) +foo in groupBy(list, #) foo in list -foo in list ? nil : i32 -foo in map(list, #) +foo in list != ok +foo not in groupBy(array, #) +foo not in groupBy(array, f64).foo +foo not in groupBy(list, #).i +foo not in groupBy(list, f32) +foo not in groupBy(list, ok) foo not in list +foo not in list and ok +foo not in list or false +foo not in map(list, #) foo.Bar -foo.Bar != string(i64) -foo.Bar + type(greet) -foo.Bar < toJSON(0.5) -foo.Bar == type(0.5) -foo.Bar not matches string(half) -foo.Bar not startsWith foo.String() +foo.Bar <= foo.Bar +foo.Bar matches foo.Bar +foo.Bar matches trimPrefix("foo") foo.Qux -foo.Qux != add +foo.Qux != greet foo.Qux != half -foo.Qux != score +foo.Qux == add foo.Qux == div -foo.Qux == foo?.Qux -foo.Qux(foo?.String()) -foo.Qux(greet("bar")) -foo.Qux(toJSON(0.5)) +foo.Qux == greet +foo.Qux == half +foo.Qux == score +foo.Qux("foo" + "foo") +foo.Qux(foo.Bar) +foo.Qux(foo.String()) +foo.Qux(greet("foo")) +foo.Qux(string("foo")) foo.Qux(toJSON(i)) -foo.Qux(toJSON(nil)) -foo.Qux(trimSuffix("foo")) foo.Qux(type("bar")) -foo.Qux(type(i)) +foo.Qux(type(f64)) +foo.Qux(type(half)) foo.String foo.String != div +foo.String != greet +foo.String != half foo.String == add -foo.String == greet +foo.String == div foo.String == half -foo.String == score foo.String() +foo.String() != foo?.String() +foo.String() in foo +foo.String() not in foo foo?.Bar -foo?.Bar + type(score) +foo?.Bar != foo?.Bar foo?.Bar in foo -foo?.Bar not endsWith "bar" ? score : array +foo?.Bar matches toJSON(f64) +foo?.Bar not endsWith foo.Bar +foo?.Bar not endsWith toJSON(foo) foo?.Qux -foo?.Qux != div +foo?.Qux != add foo?.Qux != greet foo?.Qux != half foo?.Qux != score foo?.Qux == add +foo?.Qux == div foo?.Qux == greet foo?.Qux == half foo?.Qux == score foo?.Qux(foo?.Bar) -foo?.Qux(string(0.5)) -foo?.Qux(type(0.5)) +foo?.Qux(string(i32)) +foo?.Qux(toJSON(1)) +foo?.Qux(toJSON(i32)) foo?.Qux(upper("bar")) foo?.String -foo?.String != div foo?.String != greet foo?.String != half -foo?.String != nil ? half : list foo?.String != score -foo?.String == add +foo?.String == greet foo?.String == half +foo?.String == score foo?.String() -foo?.String() + type(list) -foo?.String() < string(i32) -foo?.String() < toJSON(nil) -foo?.String() matches toBase64("bar") +foo?.String() contains string("foo") fromBase64(string(ok)) -fromBase64(string(true)) -fromBase64(toBase64("foo")) -fromBase64(toBase64(toJSON(nil))) -fromBase64(toJSON(nil)) -fromBase64(toJSON(ok)) -fromBase64(toJSON(true)) +fromBase64(toBase64("bar")) +fromBase64(type(1 == 0.5)) fromBase64(type(add)) fromBase64(type(div)) fromBase64(type(false)) fromBase64(type(greet)) fromBase64(type(half)) -fromBase64(type(nil == score)) fromBase64(type(ok)) fromBase64(type(score)) fromBase64(type(true)) -fromJSON("foo") not in list && false -fromJSON(string(0.5)) fromJSON(string(1)) fromJSON(string(f32)) fromJSON(string(f64)) -fromJSON(string(false)) fromJSON(string(i)) fromJSON(string(i32)) fromJSON(string(i64)) -fromJSON(string(i64)) ** f64 fromJSON(string(ok)) fromJSON(string(true)) -fromJSON(toJSON("foo")) -fromJSON(toJSON(0.5 ** 0.5)) -fromJSON(toJSON(1)) -fromJSON(toJSON(abs(1))) +fromJSON(toJSON("bar")) +fromJSON(toJSON(0.5)) fromJSON(toJSON(array)) -fromJSON(toJSON(f32)) fromJSON(toJSON(f64)) +fromJSON(toJSON(false)) +fromJSON(toJSON(foo)) fromJSON(toJSON(i)) fromJSON(toJSON(i32)) -fromJSON(toJSON(i64)) fromJSON(toJSON(list)) fromJSON(toJSON(nil)) -fromJSON(toJSON(ok)) fromJSON(toJSON(true)) -get(1 .. i32, i) -get(1 .. i64, abs(1)) -get(1 .. i64, i) -get(1 .. i64, i32) -get(["bar"], i64) -get([array], i) -get([greet], i) -get([nil, half], i) -get([score, 0.5, score], i64) +fromPairs(filter(array, false)) +fromPairs(filter(list, false)) +fromPairs(groupBy(array, #)?.String) +get(["foo"], i32) get(array, -1) -get(array, -i) get(array, -i32) -get(array, 1 % 1) -get(array, 1 % i64) -get(array, 1 - 1) -get(array, 1 - i) -get(array, 1) * f64 +get(array, -i64) +get(array, -score(1)) +get(array, 1 * 1) +get(array, 1 * i) +get(array, 1) ** f32 get(array, 1) < f32 -get(array, 1) <= i32 -get(array, 1) > i -get(array, 1) ^ f64 -get(array, 1) ^ i -get(array, array[1]) -get(array, count(list, true)) -get(array, false ? div : false) -get(array, first(array)) -get(array, i % i64) -get(array, i * 1) +get(array, 1) > i32 +get(array, 1) > i64 +get(array, bitnot(1)) +get(array, count(array, ok)) +get(array, false ? "foo" : 0.5) get(array, i) -get(array, i) + i -get(array, i) > i32 -get(array, i) ^ f32 -get(array, i32 * i64) +get(array, i) != f32 +get(array, i) != i32 +get(array, i) * i32 +get(array, i) - i +get(array, i) / i64 +get(array, i) > f64 +get(array, i) >= f64 +get(array, i) >= i64 +get(array, i) ^ half(0.5) +get(array, i32 % i32) get(array, i32) -get(array, i32) ** f32 -get(array, i32) == i32 -get(array, i32) > f64 +get(array, i32) / f64 +get(array, i32) < i +get(array, i64 - 1) get(array, i64) -get(array, i64) ** i -get(array, i64) ** i64 -get(array, i64) .. i32 -get(array, i64) <= -i32 -get(array, i64) <= f64 / f32 -get(array, i64) <= i -get(array, i64) == i64 -get(array, int(1)) -get(array, int(f32)) -get(array, int(f64)) -get(array, int(i32)) -get(array, len(array)) -get(array, max(1)) +get(array, i64) > f64 +get(array, last(array)) get(array, min(i)) -get(array, min(i32)) +get(array, reduce(array, #)) +get(array, reduce(list, i64)) get(array, score(1)) -get(array, true ? i : 1) -get(false ? "bar" : f64, list) -get(false ? "bar" : i32, greet) -get(false ? "foo" : i, ok) -get(false ? 0.5 : i64, true not in String) -get(false ? 1 : greet, ok) -get(false ? div : true, min("foo")) -get(false ? greet : score, score) -get(false ? half : list, i32) -get(false ? list : 1, i32) -get(false ? list : i64, i >= f64) -get(false ? score : 0.5, add) -get(false ? score : 0.5, half) -get(false ? score : f64, half) -get(filter(list, ok), i32) -get(filter(list, ok), i64) -get(i .. i, i) -get(i32 .. 1, i) +get(array, score(abs(1))) +get(array, score(i)) +get(array, sum(array)) +get(false ? 0.5 : greet, list) +get(false ? add : array, f64) +get(false ? add : score, ok) +get(false ? f64 : 1, ok) +get(false ? f64 : score, add) +get(false ? false : f32, i) +get(false ? i32 : list, i64) +get(false ? i32 : ok, now(div, array)) +get(false ? i64 : foo, Bar) +get(false ? i64 : true, f64) +get(false ? score : ok, trimSuffix("bar", "bar")) +get(filter(list, true), i) +get(groupBy(array, "bar"), add) +get(groupBy(array, "bar"), i) +get(groupBy(array, "bar"), ok) +get(groupBy(array, "foo"), half) +get(groupBy(array, #), add) +get(groupBy(array, #), array) +get(groupBy(array, #), f32) +get(groupBy(array, #), f64) +get(groupBy(array, #), foo) +get(groupBy(array, #), greet) +get(groupBy(array, #), half) +get(groupBy(array, #), i) +get(groupBy(array, #), i64 * 0.5) +get(groupBy(array, #), i64) +get(groupBy(array, #)?.String, i64) +get(groupBy(array, 0.5), add) +get(groupBy(array, 0.5), div) +get(groupBy(array, 0.5), ok) +get(groupBy(array, 1), add) +get(groupBy(array, 1), f32) +get(groupBy(array, f64), i64) +get(groupBy(array, false), findIndex(array, ok)) +get(groupBy(array, i), ok) +get(groupBy(array, i), score) +get(groupBy(array, i64), add) +get(groupBy(array, ok), add) +get(groupBy(array, true), i32) +get(groupBy(list, "bar"), i32) +get(groupBy(list, "foo"), greet) +get(groupBy(list, #), div) +get(groupBy(list, #), f32 <= f64) +get(groupBy(list, #), f32) +get(groupBy(list, #), foo) +get(groupBy(list, #), greet) +get(groupBy(list, #), half) +get(groupBy(list, #), i) +get(groupBy(list, #), i32) +get(groupBy(list, #), i64) +get(groupBy(list, #), int(f32)) +get(groupBy(list, #), list) +get(groupBy(list, #), reduce(array, foo)) +get(groupBy(list, #), score(1)) +get(groupBy(list, #), score) +get(groupBy(list, 0.5), array) +get(groupBy(list, 0.5), div) +get(groupBy(list, 0.5), ok) +get(groupBy(list, 1), i32) +get(groupBy(list, f32), greet) +get(groupBy(list, foo), add) +get(groupBy(list, foo), i32) +get(groupBy(list, ok), greet) +get(groupBy(list, ok), list) +get(i .. 1, 1 * 1) +get(i .. i32, i) +get(i32 .. i, i64) get(i64 .. 1, i32) +get(i64 .. i, i32) +get(i64 .. i64, i64) +get(list, -1) get(list, -i) -get(list, -i32) get(list, -i64) -get(list, 1 * i) +get(list, 1 * 1) +get(list, 1 - 1) +get(list, 1 - i) +get(list, 1) != foo get(list, 1).Bar get(list, 1).Qux get(list, 1).String @@ -6290,11 +7333,12 @@ get(list, 1)?.Bar get(list, 1)?.Qux get(list, 1)?.String get(list, 1)?.String() -get(list, abs(i)) -get(list, abs(i32)) +get(list, bitshr(i, i32)) +get(list, first(array)) +get(list, get(array, 1)) +get(list, get(array, i64)) +get(list, i % 1) get(list, i) -get(list, i) != foo -get(list, i) == foo get(list, i).Bar get(list, i).Qux get(list, i).String @@ -6302,129 +7346,153 @@ get(list, i)?.Bar get(list, i)?.Qux get(list, i)?.String get(list, i)?.String() +get(list, i32 * i32) +get(list, i32 - i32) get(list, i32) get(list, i32).Bar get(list, i32).Qux get(list, i32).String -get(list, i32).String() get(list, i32)?.Bar get(list, i32)?.Qux get(list, i32)?.String get(list, i32)?.String() -get(list, i64 * i32) +get(list, i64 * 1) +get(list, i64 * i) +get(list, i64 - 1) get(list, i64) get(list, i64).Bar get(list, i64).Qux get(list, i64).String -get(list, i64).String() get(list, i64)?.Bar get(list, i64)?.Qux get(list, i64)?.String get(list, i64)?.String() -get(list, int(1) > 0.5 ? div : 0.5) -get(list, int(i)) -get(list, int(i32)) -get(list, int(i64)) -get(list, last(array)) -get(list, max(1, i64, i64)) +get(list, int(1)) +get(list, max(i32)) get(list, min(i32)) get(list, min(i64)) +get(list, ok ? 0.5 : "foo") +get(list, ok ? array : "foo") +get(list, reduce(list, i64)) get(list, score(1)) -get(list[i32:i], i64) +get(list, score(i)) +get(list, true ? i : i32) +get(list, {"foo": i32}?.i) +get(list[i64:1], i) get(map(array, #), i) +get(map(array, #), i32) get(map(array, #), i64) -get(map(array, #), last(array)) -get(map(array, 0.5), i) -get(map(array, 1), i) -get(map(array, i32), i64) -get(map(array, ok), i) -get(map(array, ok), i64) +get(map(array, add), i32) +get(map(array, array), i) +get(map(array, greet), i64) +get(map(array, half), i64) +get(map(list, "foo"), i64) get(map(list, #), i) -get(map(list, #), i32) get(map(list, #), i64) -get(map(list, 0.5), i64) +get(map(list, 1), i32) get(map(list, array), i) -get(map(list, div), i32) get(map(list, i32), i64) -get(map(list, ok), i32) -get(map(list, true), i64) -get(ok ? 0.5 : add, f32) -get(ok ? add : 0.5, ok) -get(ok ? add : false, div) -get(ok ? array : 0.5, Bar) -get(ok ? array : i, add) -get(ok ? div : foo, filter("bar", ok)) -get(ok ? greet : 0.5, foo in String) -get(ok ? greet : f32, Bar) -get(ok ? i : f64, greet)?.f64 -get(ok ? i32 : "foo", score) -get(ok ? i32 : add, div) -get(ok ? list : "foo", f32) -get(ok ? ok : half, array) -get(ok ? true : i32, f32) +get(map(list, i64), i64) +get(ok ? "bar" : false, array) +get(ok ? 1 : "bar", f32) +get(ok ? 1 : add, String) +get(ok ? add : f32, array) +get(ok ? array : i, Bar) +get(ok ? f32 : list, get(half, nil)) +get(ok ? f64 : div, i64) +get(ok ? f64 : list, half in Bar)?.array() +get(ok ? false : list, f32 > i) +get(ok ? foo : 0.5, div) +get(ok ? greet : "bar", get(add, String)) +get(ok ? half : i32, i) +get(ok ? half : ok, f64) +get(ok ? i : 0.5, half) +get(ok ? i : half, String) +get(ok ? i32 : half, f64) +get(ok ? i64 : foo, f32) +get(ok ? list : "foo", add) +get(ok ? list : i32, f32) +get(ok ? ok : div, greet) +get(ok ? score : 1, Qux?.i) +get(ok ? score : f64, i) +get(ok ? score : foo, String?.foo()) +get(ok ? score : i64, foo) +get(reduce(list, array), i32) get(sort(array), i32) -get(true ? 0.5 : score, foo) -get(true ? 1 : f64, foo) -get(true ? 1 : greet, greet)?.foo -get(true ? 1 : score, String?.Qux()) -get(true ? add : score, i) -get(true ? array : 1, half) -get(true ? array : i64, ok) -get(true ? div : foo, list) -get(true ? f32 : 1, greet) -get(true ? f64 : greet, String) -get(true ? f64 : ok, Bar?.ok) -get(true ? i : f64, add) -get(true ? i64 : score, i) -get(true ? list : ok, ok) -get({"bar": i32}.i32, ok) +get(sum(array), Qux) +get(sum(array), String) +get(sum(array), f32) +get(sum(array), f64 == list) +get(sum(array), greet) +get(sum(array), i) +get(take(list, i), i64) +get(true ? "bar" : ok, score(i)) +get(true ? "foo" : half, list) +get(true ? 0.5 : i32, array) +get(true ? 1 : array, Bar)?.f64 +get(true ? f32 : 0.5, ok) +get(true ? false : foo, i64 > 0.5) +get(true ? greet : false, Bar) +get(true ? greet : i32, score) +get(true ? half : 0.5, Qux) +get(true ? half : f32, greet) +get(true ? half : list, add) +get(true ? i64 : greet, i32) +get(true ? score : true, half)?.half +get(true ? true : add, Qux) +get(true ? true : i, f64) +get({"bar": true, "foo": greet}.i, String) +get({"foo": foo, "bar": false}, type(i)) greet greet != add greet != div -greet != div != nil +greet != div and ok greet != foo.Qux greet != foo.String greet != foo?.Qux greet != foo?.String greet != greet -greet != greet != nil -greet != greet or 0.5 == i +greet != greet != ok greet != half -greet != half ? 1 : ok -greet != half ? array : 0.5 -greet != half ? false : f64 -greet != half ? greet : greet -greet != nil ? i64 : 0.5 +greet != nil ? "bar" : add +greet != nil ? 0.5 : false +greet != nil ? list : false greet != score +greet != score != false +greet != score or ok +greet != sum(array) greet == add -greet == add == ok -greet == add ? div == greet : i64 +greet == add ? i : list +greet == add or ok greet == div -greet == div ? add : i32 +greet == div || ok greet == foo.Qux greet == foo.String greet == foo?.Qux greet == foo?.String greet == greet +greet == greet ? 0.5 : "bar" +greet == greet and ok greet == half -greet == nil != nil -greet == nil && ok +greet == half ? 1 : ok greet == nil == ok +greet == nil ? i64 : ok +greet == reduce(list, div) +greet == reduce(list, half) greet == score -greet in [nil] +greet == score ? 1 : ok +greet == score ? add : nil +greet in groupBy(array, f64).f32 +greet in groupBy(list, #).score +greet not in map(array, score) +greet not in map(list, div) +greet not in sort(array) greet("bar" + "bar") -greet("bar" + "foo") -greet("bar") != foo.String() -greet("bar") != nil != false -greet("bar") in foo -greet("foo" + "bar") greet("foo" + "foo") -greet("foo") >= string(foo) -greet("foo") not contains "bar" ? array : half -greet("foo") startsWith greet("bar") -greet(false ? f32 : "foo") -greet(false ? i : "bar") +greet("foo") startsWith type(f64) +greet(false ? i64 : "bar") greet(foo.Bar) +greet(foo.Qux("foo")) greet(foo.String()) greet(foo?.Bar) greet(foo?.String()) @@ -6432,14 +7500,20 @@ greet(greet("bar")) greet(greet("foo")) greet(lower("bar")) greet(lower("foo")) -greet(ok ? "bar" : div) +greet(ok ? "bar" : 1) +greet(ok ? "bar" : i64) +greet(ok ? "foo" : 0.5) +greet(ok ? "foo" : div) +greet(ok ? "foo" : true) +greet(reduce(array, "bar")) +greet(reduce(array, "foo")) +greet(reduce(list, "foo")) +greet(repeat("bar", 1)) +greet(repeat(foo?.String(), i32)) greet(string("bar")) greet(string("foo")) -greet(string(-i64)) -greet(string(0.5 == 1)) greet(string(0.5)) greet(string(1)) -greet(string([0.5])) greet(string(add)) greet(string(array)) greet(string(div)) @@ -6447,20 +7521,18 @@ greet(string(f32)) greet(string(f64)) greet(string(false)) greet(string(foo)) -greet(string(foo?.Qux)) greet(string(greet)) greet(string(half)) greet(string(i)) greet(string(i32)) greet(string(i64)) greet(string(list)) -greet(string(nil != false)) greet(string(nil)) greet(string(ok)) greet(string(score)) greet(string(true)) greet(toBase64("bar")) -greet(toBase64("foo")) +greet(toBase64(trimPrefix("bar"))) greet(toJSON("bar")) greet(toJSON("foo")) greet(toJSON(0.5)) @@ -6476,27 +7548,26 @@ greet(toJSON(i64)) greet(toJSON(list)) greet(toJSON(nil)) greet(toJSON(ok)) -greet(toJSON(string(array))) greet(toJSON(true)) greet(trim("bar")) greet(trim("foo")) -greet(trim(string(array))) greet(trimPrefix("bar")) greet(trimPrefix("foo")) greet(trimSuffix("bar")) greet(trimSuffix("foo")) -greet(trimSuffix("foo", "foo")) -greet(true ? "foo" : 0.5) +greet(trimSuffix(foo.String())) +greet(trimSuffix(foo?.Bar)) +greet(true ? "bar" : i64) +greet(true ? "bar" : ok) +greet(true ? "foo" : foo) greet(type("bar")) greet(type("foo")) greet(type(0.5)) greet(type(1)) -greet(type(abs(f32))) greet(type(add)) greet(type(array)) greet(type(div)) greet(type(f32)) -greet(type(f64 / i)) greet(type(f64)) greet(type(false)) greet(type(foo)) @@ -6512,46 +7583,1583 @@ greet(type(score)) greet(type(true)) greet(upper("bar")) greet(upper("foo")) +groupBy(1 .. 1, #).f64 +groupBy(1 .. i, #) +groupBy(1 .. i, i32)?.score +groupBy(1 .. i32, #) +groupBy(1 .. i32, ok) +groupBy(1 .. i64, i32) +groupBy([0.5, f64], nil == "foo") +groupBy([1], # <= #) +groupBy([f32 ^ i64], #) +groupBy([f32], f64) +groupBy([f64], # >= f32) +groupBy([half], f32) +groupBy([i32], array[#]) +groupBy([nil], foo) +groupBy([true], #) +groupBy(array, !false) +groupBy(array, !true) +groupBy(array, "bar" in foo).String +groupBy(array, "bar").Bar +groupBy(array, "bar").Qux +groupBy(array, "bar").String +groupBy(array, "bar").add +groupBy(array, "bar").array +groupBy(array, "bar").div +groupBy(array, "bar").f32 +groupBy(array, "bar").f64 +groupBy(array, "bar").foo +groupBy(array, "bar").greet +groupBy(array, "bar").half +groupBy(array, "bar").i +groupBy(array, "bar").i32 +groupBy(array, "bar").i64 +groupBy(array, "bar").list +groupBy(array, "bar").ok +groupBy(array, "bar").score +groupBy(array, "bar")?.Bar +groupBy(array, "bar")?.Qux +groupBy(array, "bar")?.String +groupBy(array, "bar")?.add +groupBy(array, "bar")?.array +groupBy(array, "bar")?.div +groupBy(array, "bar")?.f32 +groupBy(array, "bar")?.f64 +groupBy(array, "bar")?.foo +groupBy(array, "bar")?.greet +groupBy(array, "bar")?.half +groupBy(array, "bar")?.i +groupBy(array, "bar")?.i64 +groupBy(array, "bar")?.list +groupBy(array, "bar")?.ok +groupBy(array, "bar")?.score +groupBy(array, "bar")[f32 > f32] +groupBy(array, "foo").Bar +groupBy(array, "foo").Qux +groupBy(array, "foo").String +groupBy(array, "foo").add +groupBy(array, "foo").array +groupBy(array, "foo").div +groupBy(array, "foo").f32 +groupBy(array, "foo").f64 +groupBy(array, "foo").foo +groupBy(array, "foo").greet +groupBy(array, "foo").half +groupBy(array, "foo").i +groupBy(array, "foo").i32 +groupBy(array, "foo").i64 +groupBy(array, "foo").list +groupBy(array, "foo").ok +groupBy(array, "foo").score +groupBy(array, "foo")?.Bar +groupBy(array, "foo")?.String +groupBy(array, "foo")?.add +groupBy(array, "foo")?.array +groupBy(array, "foo")?.div +groupBy(array, "foo")?.f32 +groupBy(array, "foo")?.f64 +groupBy(array, "foo")?.foo +groupBy(array, "foo")?.greet +groupBy(array, "foo")?.half +groupBy(array, "foo")?.i +groupBy(array, "foo")?.i32 +groupBy(array, "foo")?.i64 +groupBy(array, "foo")?.list +groupBy(array, "foo")?.ok +groupBy(array, "foo")?.score +groupBy(array, # != #) +groupBy(array, # != #).Qux +groupBy(array, # != #)?.array +groupBy(array, # != 0.5) +groupBy(array, # != 1) +groupBy(array, # != f32) +groupBy(array, # != f64) +groupBy(array, # != f64)?.String +groupBy(array, # != i64) +groupBy(array, # != nil) +groupBy(array, # % #) +groupBy(array, # % 1) +groupBy(array, # % i32) +groupBy(array, # * #) +groupBy(array, # * #)?.Qux +groupBy(array, # * 0.5) +groupBy(array, # * 1) +groupBy(array, # * i) +groupBy(array, # * i32) +groupBy(array, # * i64) +groupBy(array, # ** #) +groupBy(array, # ** #).add +groupBy(array, # ** 0.5) +groupBy(array, # ** 0.5)?.foo +groupBy(array, # ** 0.5)?.greet +groupBy(array, # ** 1) +groupBy(array, # ** f64) +groupBy(array, # ** i) +groupBy(array, # ** i32) +groupBy(array, # ** i64) +groupBy(array, # + #) +groupBy(array, # + 1) +groupBy(array, # + f32) +groupBy(array, # + i) +groupBy(array, # - #) +groupBy(array, # - 0.5) +groupBy(array, # - 1) +groupBy(array, # - f32) +groupBy(array, # - f64) +groupBy(array, # - i) +groupBy(array, # - i32) +groupBy(array, # / #) +groupBy(array, # / 0.5) +groupBy(array, # / 0.5)?.foo +groupBy(array, # / 1) +groupBy(array, # / i) +groupBy(array, # / i32) +groupBy(array, # / i64) +groupBy(array, # < # || 0.5 > f64) +groupBy(array, # < #) +groupBy(array, # < 0.5) +groupBy(array, # < 1) +groupBy(array, # < i32) +groupBy(array, # < i64) +groupBy(array, # <= #) +groupBy(array, # <= #)?.Bar +groupBy(array, # <= #)?.Qux +groupBy(array, # <= 0.5) +groupBy(array, # <= 1) +groupBy(array, # <= f32) +groupBy(array, # <= f64) +groupBy(array, # <= i) +groupBy(array, # <= i64) +groupBy(array, # == #) +groupBy(array, # == #).String +groupBy(array, # == #)?.half +groupBy(array, # == 0.5) +groupBy(array, # == 1) +groupBy(array, # == f32) +groupBy(array, # == f32).half +groupBy(array, # == f64) +groupBy(array, # == i) +groupBy(array, # == i64) +groupBy(array, # == nil) +groupBy(array, # > #) +groupBy(array, # > 0.5) +groupBy(array, # > 1) +groupBy(array, # > 1).Bar +groupBy(array, # > i)?.i64 +groupBy(array, # > i64) +groupBy(array, # >= #) +groupBy(array, # >= f64) +groupBy(array, # >= i) +groupBy(array, # >= i32) +groupBy(array, # >= i64) +groupBy(array, # ^ #) +groupBy(array, # ^ 0.5) +groupBy(array, # ^ f32) +groupBy(array, # ^ i) +groupBy(array, # ^ i32) +groupBy(array, # in array) +groupBy(array, #) +groupBy(array, #).Bar +groupBy(array, #).Qux +groupBy(array, #).String +groupBy(array, #).add +groupBy(array, #).array +groupBy(array, #).div +groupBy(array, #).f32 +groupBy(array, #).f64 +groupBy(array, #).foo +groupBy(array, #).greet +groupBy(array, #).half +groupBy(array, #).i +groupBy(array, #).i32 +groupBy(array, #).i64 +groupBy(array, #).list +groupBy(array, #).ok +groupBy(array, #).score +groupBy(array, #)?.Bar +groupBy(array, #)?.Qux +groupBy(array, #)?.String +groupBy(array, #)?.add +groupBy(array, #)?.array +groupBy(array, #)?.div +groupBy(array, #)?.f32 +groupBy(array, #)?.f64 +groupBy(array, #)?.foo +groupBy(array, #)?.greet +groupBy(array, #)?.half +groupBy(array, #)?.i +groupBy(array, #)?.i32 +groupBy(array, #)?.i64 +groupBy(array, #)?.list +groupBy(array, #)?.ok +groupBy(array, #)?.score +groupBy(array, #)[1 / i] +groupBy(array, #)[f32] +groupBy(array, #)[f64] +groupBy(array, #)[foo] +groupBy(array, #)[i32] +groupBy(array, #)[i64] +groupBy(array, #)[i] +groupBy(array, #)[ok] +groupBy(array, #)[reduce(list, #)] +groupBy(array, -# * # * 0.5) +groupBy(array, -#) +groupBy(array, -#).Qux +groupBy(array, -0.5) +groupBy(array, -1) +groupBy(array, -f32) +groupBy(array, -i)?.score +groupBy(array, -i32) +groupBy(array, -i64) +groupBy(array, 0.5 != #) +groupBy(array, 0.5 * #) +groupBy(array, 0.5 * 0.5) +groupBy(array, 0.5 * f64) +groupBy(array, 0.5 ** #) +groupBy(array, 0.5 ** 1) +groupBy(array, 0.5 ** i64) +groupBy(array, 0.5 + #)?.score +groupBy(array, 0.5 + f32) +groupBy(array, 0.5 - 1) +groupBy(array, 0.5 / #).array +groupBy(array, 0.5 / f64) +groupBy(array, 0.5 / i64) +groupBy(array, 0.5 < 0.5) +groupBy(array, 0.5 <= f32) +groupBy(array, 0.5 == #) +groupBy(array, 0.5 >= #) +groupBy(array, 0.5 >= i32) +groupBy(array, 0.5 >= i64) +groupBy(array, 0.5 ^ f32) +groupBy(array, 0.5 ^ i64) +groupBy(array, 0.5).Bar +groupBy(array, 0.5).Qux +groupBy(array, 0.5).String +groupBy(array, 0.5).add +groupBy(array, 0.5).array +groupBy(array, 0.5).div +groupBy(array, 0.5).f32 +groupBy(array, 0.5).f64 +groupBy(array, 0.5).foo +groupBy(array, 0.5).greet +groupBy(array, 0.5).half +groupBy(array, 0.5).i +groupBy(array, 0.5).i32 +groupBy(array, 0.5).i64 +groupBy(array, 0.5).list +groupBy(array, 0.5).ok +groupBy(array, 0.5).score +groupBy(array, 0.5)?.Bar +groupBy(array, 0.5)?.Qux +groupBy(array, 0.5)?.String +groupBy(array, 0.5)?.add +groupBy(array, 0.5)?.array +groupBy(array, 0.5)?.div +groupBy(array, 0.5)?.f32 +groupBy(array, 0.5)?.f64 +groupBy(array, 0.5)?.foo +groupBy(array, 0.5)?.greet +groupBy(array, 0.5)?.half +groupBy(array, 0.5)?.i +groupBy(array, 0.5)?.i32 +groupBy(array, 0.5)?.i64 +groupBy(array, 0.5)?.list +groupBy(array, 0.5)?.ok +groupBy(array, 0.5)?.score +groupBy(array, 1 != #)?.String +groupBy(array, 1 != 0.5) +groupBy(array, 1 != f32) +groupBy(array, 1 % #) +groupBy(array, 1 % i) +groupBy(array, 1 * 0.5) +groupBy(array, 1 * i) +groupBy(array, 1 + #) +groupBy(array, 1 + 1) +groupBy(array, 1 - #) +groupBy(array, 1 - 1) +groupBy(array, 1 / #) +groupBy(array, 1 < #) +groupBy(array, 1 < i32)?.array +groupBy(array, 1 < i64)?.ok +groupBy(array, 1 <= #) +groupBy(array, 1 == #) +groupBy(array, 1 == #).add +groupBy(array, 1 == i32) +groupBy(array, 1 == nil) +groupBy(array, 1 > i) +groupBy(array, 1 >= #) +groupBy(array, 1 ^ #) +groupBy(array, 1 not in array) +groupBy(array, 1).Bar +groupBy(array, 1).Qux +groupBy(array, 1).String +groupBy(array, 1).add +groupBy(array, 1).array +groupBy(array, 1).div +groupBy(array, 1).f64 +groupBy(array, 1).foo +groupBy(array, 1).greet +groupBy(array, 1).half +groupBy(array, 1).i +groupBy(array, 1).i32 +groupBy(array, 1).i64 +groupBy(array, 1).list +groupBy(array, 1).ok +groupBy(array, 1).score +groupBy(array, 1)?.Bar +groupBy(array, 1)?.Qux +groupBy(array, 1)?.String +groupBy(array, 1)?.add +groupBy(array, 1)?.array +groupBy(array, 1)?.div +groupBy(array, 1)?.f32 +groupBy(array, 1)?.f64 +groupBy(array, 1)?.foo +groupBy(array, 1)?.greet +groupBy(array, 1)?.half +groupBy(array, 1)?.i +groupBy(array, 1)?.i32 +groupBy(array, 1)?.i64 +groupBy(array, 1)?.list +groupBy(array, 1)?.ok +groupBy(array, 1)?.score +groupBy(array, abs(#)) +groupBy(array, abs(0.5)) +groupBy(array, abs(1)) +groupBy(array, abs(f32)) +groupBy(array, abs(f64)) +groupBy(array, abs(i)) +groupBy(array, abs(i64)) +groupBy(array, add(#, #)) +groupBy(array, add(#, 1))?.i64 +groupBy(array, bitnand(1, #)) +groupBy(array, bitnot(#)) +groupBy(array, bitnot(1)) +groupBy(array, bitor(#, #)) +groupBy(array, bitor(1, #)) +groupBy(array, bitor(i32, #)) +groupBy(array, bitshl(1, #)) +groupBy(array, bitshr(i, #)) +groupBy(array, bitushr(#, #)) +groupBy(array, ceil(#)) +groupBy(array, ceil(i)) +groupBy(array, ceil(i32)) +groupBy(array, div != score) +groupBy(array, div == half) +groupBy(array, div(#, #)) +groupBy(array, f32 != #) +groupBy(array, f32 ** 0.5) +groupBy(array, f32 - #) +groupBy(array, f32 - f64) +groupBy(array, f32 / #) +groupBy(array, f32 < #) +groupBy(array, f32 <= #) +groupBy(array, f32 == #) +groupBy(array, f32 > 0.5) +groupBy(array, f32 > i32) +groupBy(array, f32 ^ i) +groupBy(array, f32) +groupBy(array, f32).Bar +groupBy(array, f32).Qux +groupBy(array, f32).String +groupBy(array, f32).add +groupBy(array, f32).array +groupBy(array, f32).div +groupBy(array, f32).f64 +groupBy(array, f32).greet +groupBy(array, f32).half +groupBy(array, f32).i +groupBy(array, f32).i32 +groupBy(array, f32).i64 +groupBy(array, f32).list +groupBy(array, f32).ok +groupBy(array, f32).score +groupBy(array, f32)?.Bar +groupBy(array, f32)?.Qux +groupBy(array, f32)?.String +groupBy(array, f32)?.add +groupBy(array, f32)?.array +groupBy(array, f32)?.div +groupBy(array, f32)?.f32 +groupBy(array, f32)?.f64 +groupBy(array, f32)?.greet +groupBy(array, f32)?.half +groupBy(array, f32)?.i32 +groupBy(array, f32)?.i64 +groupBy(array, f32)?.list +groupBy(array, f32)?.ok +groupBy(array, f32)?.score +groupBy(array, f32)[foo] +groupBy(array, f64 != #) +groupBy(array, f64 != i64) +groupBy(array, f64 ** #) +groupBy(array, f64 - #) +groupBy(array, f64 - #).i32 +groupBy(array, f64 < #) +groupBy(array, f64 == #) +groupBy(array, f64 > #) +groupBy(array, f64 >= #) +groupBy(array, f64 >= 0.5) +groupBy(array, f64) +groupBy(array, f64).Bar +groupBy(array, f64).Qux +groupBy(array, f64).String +groupBy(array, f64).add +groupBy(array, f64).array +groupBy(array, f64).div +groupBy(array, f64).f32 +groupBy(array, f64).f64 +groupBy(array, f64).foo +groupBy(array, f64).greet +groupBy(array, f64).half +groupBy(array, f64).i +groupBy(array, f64).i32 +groupBy(array, f64).i64 +groupBy(array, f64).list +groupBy(array, f64).ok +groupBy(array, f64).score +groupBy(array, f64)?.Bar +groupBy(array, f64)?.Qux +groupBy(array, f64)?.String +groupBy(array, f64)?.add +groupBy(array, f64)?.array +groupBy(array, f64)?.div +groupBy(array, f64)?.f32 +groupBy(array, f64)?.f64 +groupBy(array, f64)?.foo +groupBy(array, f64)?.greet +groupBy(array, f64)?.half +groupBy(array, f64)?.i +groupBy(array, f64)?.i32 +groupBy(array, f64)?.i64 +groupBy(array, f64)?.list +groupBy(array, f64)?.ok +groupBy(array, f64)?.score +groupBy(array, f64)[i32] +groupBy(array, false ? # : #) +groupBy(array, false || ok) +groupBy(array, false).Bar +groupBy(array, false).Qux +groupBy(array, false).String +groupBy(array, false).add +groupBy(array, false).array +groupBy(array, false).div +groupBy(array, false).f32 +groupBy(array, false).f64 +groupBy(array, false).greet +groupBy(array, false).half +groupBy(array, false).i +groupBy(array, false).i32 +groupBy(array, false).i64 +groupBy(array, false).list +groupBy(array, false).ok +groupBy(array, false).score +groupBy(array, false)?.Bar +groupBy(array, false)?.Qux +groupBy(array, false)?.String +groupBy(array, false)?.add +groupBy(array, false)?.array +groupBy(array, false)?.div +groupBy(array, false)?.f32 +groupBy(array, false)?.f64 +groupBy(array, false)?.foo +groupBy(array, false)?.greet +groupBy(array, false)?.half +groupBy(array, false)?.i +groupBy(array, false)?.i32 +groupBy(array, false)?.i64 +groupBy(array, false)?.list +groupBy(array, false)?.ok +groupBy(array, false)?.score +groupBy(array, findLastIndex(list, true)) +groupBy(array, float(#)) +groupBy(array, floor(#)) +groupBy(array, floor(i32)) +groupBy(array, foo) +groupBy(array, foo).Bar +groupBy(array, foo).Qux +groupBy(array, foo).String +groupBy(array, foo).add +groupBy(array, foo).array +groupBy(array, foo).div +groupBy(array, foo).f32 +groupBy(array, foo).f64 +groupBy(array, foo).foo +groupBy(array, foo).greet +groupBy(array, foo).half +groupBy(array, foo).i +groupBy(array, foo).i32 +groupBy(array, foo).i64 +groupBy(array, foo).list +groupBy(array, foo).ok +groupBy(array, foo).score +groupBy(array, foo)?.Bar +groupBy(array, foo)?.Qux +groupBy(array, foo)?.String +groupBy(array, foo)?.add +groupBy(array, foo)?.array +groupBy(array, foo)?.div +groupBy(array, foo)?.f32 +groupBy(array, foo)?.f64 +groupBy(array, foo)?.foo +groupBy(array, foo)?.greet +groupBy(array, foo)?.half +groupBy(array, foo)?.i +groupBy(array, foo)?.i32 +groupBy(array, foo)?.i64 +groupBy(array, foo)?.list +groupBy(array, foo)?.ok +groupBy(array, foo)?.score +groupBy(array, foo.Bar) +groupBy(array, foo?.Bar) +groupBy(array, get(array, #)) +groupBy(array, get(list, #)) +groupBy(array, get(list, i32)) +groupBy(array, half != add) +groupBy(array, half(1)) +groupBy(array, half(f64)) +groupBy(array, half(f64))?.i64 +groupBy(array, i != #) +groupBy(array, i % #) +groupBy(array, i * #) +groupBy(array, i * #)?.f64 +groupBy(array, i ** #) +groupBy(array, i + #) +groupBy(array, i - f64).array +groupBy(array, i / #) +groupBy(array, i < #) +groupBy(array, i <= #) +groupBy(array, i <= f64) +groupBy(array, i > i) +groupBy(array, i ^ #) +groupBy(array, i ^ 0.5) +groupBy(array, i) +groupBy(array, i).Bar +groupBy(array, i).Qux +groupBy(array, i).String +groupBy(array, i).add +groupBy(array, i).array +groupBy(array, i).div +groupBy(array, i).f32 +groupBy(array, i).f64 +groupBy(array, i).foo +groupBy(array, i).greet +groupBy(array, i).half +groupBy(array, i).i +groupBy(array, i).i32 +groupBy(array, i).i64 +groupBy(array, i).list +groupBy(array, i).ok +groupBy(array, i).score +groupBy(array, i)?.Bar +groupBy(array, i)?.String +groupBy(array, i)?.add +groupBy(array, i)?.array +groupBy(array, i)?.div +groupBy(array, i)?.f32 +groupBy(array, i)?.f64 +groupBy(array, i)?.foo +groupBy(array, i)?.greet +groupBy(array, i)?.half +groupBy(array, i)?.i +groupBy(array, i)?.i32 +groupBy(array, i)?.i64 +groupBy(array, i)?.list +groupBy(array, i)?.ok +groupBy(array, i)?.score +groupBy(array, i)[f64] +groupBy(array, i)[false ? i32 : ok] +groupBy(array, i32 * f64) +groupBy(array, i32 ** # <= i32) +groupBy(array, i32 ** f64) +groupBy(array, i32 ** i) +groupBy(array, i32 ** i64) +groupBy(array, i32 + #) +groupBy(array, i32 - 1)?.foo +groupBy(array, i32 - i64) +groupBy(array, i32 / #) +groupBy(array, i32 / f32) +groupBy(array, i32 < #) +groupBy(array, i32 < f64) +groupBy(array, i32 <= 1) +groupBy(array, i32 == #) +groupBy(array, i32 == i) +groupBy(array, i32 > #) +groupBy(array, i32 >= #).Bar +groupBy(array, i32 ^ #) +groupBy(array, i32) +groupBy(array, i32).Bar +groupBy(array, i32).Qux +groupBy(array, i32).String +groupBy(array, i32).add +groupBy(array, i32).array +groupBy(array, i32).div +groupBy(array, i32).f32 +groupBy(array, i32).f64 +groupBy(array, i32).greet +groupBy(array, i32).half +groupBy(array, i32).i +groupBy(array, i32).i32 +groupBy(array, i32).i64 +groupBy(array, i32).list +groupBy(array, i32).ok +groupBy(array, i32).score +groupBy(array, i32)?.Bar +groupBy(array, i32)?.Qux +groupBy(array, i32)?.String +groupBy(array, i32)?.add +groupBy(array, i32)?.array +groupBy(array, i32)?.div +groupBy(array, i32)?.f32 +groupBy(array, i32)?.f64 +groupBy(array, i32)?.foo +groupBy(array, i32)?.greet +groupBy(array, i32)?.half +groupBy(array, i32)?.i +groupBy(array, i32)?.i32 +groupBy(array, i32)?.i64 +groupBy(array, i32)?.list +groupBy(array, i32)?.ok +groupBy(array, i32)?.score +groupBy(array, i32)[i] +groupBy(array, i64 != i) +groupBy(array, i64 % #) +groupBy(array, i64 * f32) +groupBy(array, i64 ** #) +groupBy(array, i64 ** i) +groupBy(array, i64 + #) +groupBy(array, i64 - #) +groupBy(array, i64 / #)?.Qux +groupBy(array, i64 / 0.5) +groupBy(array, i64 < #) +groupBy(array, i64 <= #).foo +groupBy(array, i64 >= #) +groupBy(array, i64 ^ #) +groupBy(array, i64) +groupBy(array, i64).Bar +groupBy(array, i64).Qux +groupBy(array, i64).String +groupBy(array, i64).add +groupBy(array, i64).array +groupBy(array, i64).div +groupBy(array, i64).f32 +groupBy(array, i64).f64 +groupBy(array, i64).foo +groupBy(array, i64).greet +groupBy(array, i64).half +groupBy(array, i64).i +groupBy(array, i64).i32 +groupBy(array, i64).i64 +groupBy(array, i64).list +groupBy(array, i64).ok +groupBy(array, i64).score +groupBy(array, i64)?.Bar +groupBy(array, i64)?.Qux +groupBy(array, i64)?.String +groupBy(array, i64)?.add +groupBy(array, i64)?.array +groupBy(array, i64)?.div +groupBy(array, i64)?.f32 +groupBy(array, i64)?.f64 +groupBy(array, i64)?.foo +groupBy(array, i64)?.greet +groupBy(array, i64)?.half +groupBy(array, i64)?.i +groupBy(array, i64)?.i32 +groupBy(array, i64)?.i64 +groupBy(array, i64)?.list +groupBy(array, i64)?.ok +groupBy(array, i64)?.score +groupBy(array, int(f64)).i32 +groupBy(array, max(#)) +groupBy(array, max(#, #, #)).ok +groupBy(array, max(0.5, #)) +groupBy(array, max(1)) +groupBy(array, max(f64)) +groupBy(array, min(#)) +groupBy(array, min(0.5)) +groupBy(array, min(f32)) +groupBy(array, min(i, #, i32)) +groupBy(array, nil != #) +groupBy(array, nil != f64) +groupBy(array, nil != foo) +groupBy(array, nil != half) +groupBy(array, nil == #) +groupBy(array, nil == 0.5) +groupBy(array, none(array, false)) +groupBy(array, none(array, ok)) +groupBy(array, not ok)?.Bar +groupBy(array, not true) +groupBy(array, ok == ok) +groupBy(array, ok ? # : #) +groupBy(array, ok) +groupBy(array, ok).Bar +groupBy(array, ok).Qux +groupBy(array, ok).String +groupBy(array, ok).add +groupBy(array, ok).array +groupBy(array, ok).div +groupBy(array, ok).f32 +groupBy(array, ok).f64 +groupBy(array, ok).foo +groupBy(array, ok).greet +groupBy(array, ok).half +groupBy(array, ok).i +groupBy(array, ok).i32 +groupBy(array, ok).i64 +groupBy(array, ok).list +groupBy(array, ok).ok +groupBy(array, ok).score +groupBy(array, ok)?.Bar +groupBy(array, ok)?.Qux +groupBy(array, ok)?.String +groupBy(array, ok)?.array +groupBy(array, ok)?.div +groupBy(array, ok)?.f32 +groupBy(array, ok)?.f64 +groupBy(array, ok)?.foo +groupBy(array, ok)?.greet +groupBy(array, ok)?.half +groupBy(array, ok)?.i32 +groupBy(array, ok)?.i64 +groupBy(array, ok)?.list +groupBy(array, ok)?.ok +groupBy(array, ok)?.score +groupBy(array, one(array, ok)) +groupBy(array, reduce(array, #)) +groupBy(array, reduce(array, foo)) +groupBy(array, reduce(list, #)) +groupBy(array, round(#)) +groupBy(array, score == div) +groupBy(array, score(#)) +groupBy(array, score(#, #)) +groupBy(array, score(#, #, #, 1)) +groupBy(array, score(#, 1)).list +groupBy(array, score(1)) +groupBy(array, score(i)) +groupBy(array, string(#)) +groupBy(array, string(div)) +groupBy(array, string(i32)) +groupBy(array, toJSON("bar")) +groupBy(array, toJSON(#)) +groupBy(array, toJSON(1 .. i)) +groupBy(array, toJSON(foo)) +groupBy(array, trimPrefix("foo")) +groupBy(array, true == nil) +groupBy(array, true ? # : #) +groupBy(array, true ? # : 1) +groupBy(array, true ? nil : "foo") +groupBy(array, true).Bar +groupBy(array, true).Qux +groupBy(array, true).add +groupBy(array, true).div +groupBy(array, true).f64 +groupBy(array, true).foo +groupBy(array, true).greet +groupBy(array, true).half +groupBy(array, true).i +groupBy(array, true).i32 +groupBy(array, true).i64 +groupBy(array, true).list +groupBy(array, true).ok +groupBy(array, true).score +groupBy(array, true)?.Bar +groupBy(array, true)?.Qux +groupBy(array, true)?.String +groupBy(array, true)?.add +groupBy(array, true)?.array +groupBy(array, true)?.div +groupBy(array, true)?.f32 +groupBy(array, true)?.f64 +groupBy(array, true)?.half +groupBy(array, true)?.i +groupBy(array, true)?.i32 +groupBy(array, true)?.i64 +groupBy(array, true)?.list +groupBy(array, true)?.ok +groupBy(array, true)?.score +groupBy(array, true)[i32] +groupBy(array, type(# <= #)) +groupBy(array, type(#)).i64 +groupBy(array, type(-f64)) +groupBy(array, type(f32)) +groupBy(false ? 0.5 : "bar", #) +groupBy(filter(array, false), #) +groupBy(filter(array, false), add) +groupBy(filter(array, false), f32) +groupBy(filter(array, false), nil == #) +groupBy(filter(array, ok), half(1)) +groupBy(filter(array, true), #) +groupBy(filter(array, true), f64) +groupBy(filter(list, ok), #) +groupBy(groupBy(array, "foo").list, #) +groupBy(groupBy(array, #).i32, add) +groupBy(groupBy(array, 0.5)?.div, get(.foo(add, false), none(#, foo))) +groupBy(groupBy(array, f64)?.ok, .Bar()?.Bar) +groupBy(groupBy(array, ok).Bar, #?.array not matches #) +groupBy(groupBy(array, true).f64, #[#]) +groupBy(i .. 1, !ok)?.f64 +groupBy(i .. 1, # % #) +groupBy(i .. i, i64) +groupBy(i .. i32, #) +groupBy(i .. i32, f64 * #) +groupBy(i .. i64, f64)?.score +groupBy(i .. i64, foo) +groupBy(i .. len(array), #) +groupBy(i32 .. 1, # - #) +groupBy(i32 .. 1, #)?.f32 +groupBy(i32 .. i, #) +groupBy(i32 .. i32, i) +groupBy(i32 .. i32, i32) +groupBy(i32 .. i32, i64) +groupBy(i32 .. i32, list[i]) +groupBy(i32 .. i32, ok) +groupBy(i32 .. i64, #) +groupBy(i32 .. i64, get(array, #)) +groupBy(i64 .. 1, -0.5) +groupBy(i64 .. 1, i) +groupBy(i64 .. i, -#) +groupBy(i64 .. i, i32) +groupBy(i64 .. i32, i) +groupBy(i64 .. i64, i32) +groupBy(list, !("foo" in #)) +groupBy(list, !false) +groupBy(list, !ok) +groupBy(list, !true) +groupBy(list, "bar" contains "foo")?.ok +groupBy(list, "bar" endsWith "bar") +groupBy(list, "bar" not in #) +groupBy(list, "bar").Bar +groupBy(list, "bar").Qux +groupBy(list, "bar").String +groupBy(list, "bar").add +groupBy(list, "bar").array +groupBy(list, "bar").div +groupBy(list, "bar").f32 +groupBy(list, "bar").f64 +groupBy(list, "bar").foo +groupBy(list, "bar").greet +groupBy(list, "bar").i +groupBy(list, "bar").i32 +groupBy(list, "bar").i64 +groupBy(list, "bar").list +groupBy(list, "bar").ok +groupBy(list, "bar").score +groupBy(list, "bar")?.Bar +groupBy(list, "bar")?.Qux +groupBy(list, "bar")?.String +groupBy(list, "bar")?.add +groupBy(list, "bar")?.array +groupBy(list, "bar")?.div +groupBy(list, "bar")?.f32 +groupBy(list, "bar")?.f64 +groupBy(list, "bar")?.foo +groupBy(list, "bar")?.greet +groupBy(list, "bar")?.half +groupBy(list, "bar")?.i +groupBy(list, "bar")?.i32 +groupBy(list, "bar")?.i64 +groupBy(list, "bar")?.list +groupBy(list, "bar")?.ok +groupBy(list, "bar")?.score +groupBy(list, "foo" not in #)?.foo +groupBy(list, "foo").Bar +groupBy(list, "foo").Qux +groupBy(list, "foo").String +groupBy(list, "foo").add +groupBy(list, "foo").array +groupBy(list, "foo").div +groupBy(list, "foo").f32 +groupBy(list, "foo").f64 +groupBy(list, "foo").foo +groupBy(list, "foo").greet +groupBy(list, "foo").half +groupBy(list, "foo").i +groupBy(list, "foo").i32 +groupBy(list, "foo").i64 +groupBy(list, "foo").list +groupBy(list, "foo").ok +groupBy(list, "foo").score +groupBy(list, "foo")?.Bar +groupBy(list, "foo")?.Qux +groupBy(list, "foo")?.String +groupBy(list, "foo")?.add +groupBy(list, "foo")?.array +groupBy(list, "foo")?.div +groupBy(list, "foo")?.f32 +groupBy(list, "foo")?.f64 +groupBy(list, "foo")?.foo +groupBy(list, "foo")?.greet +groupBy(list, "foo")?.half +groupBy(list, "foo")?.i +groupBy(list, "foo")?.i32 +groupBy(list, "foo")?.i64 +groupBy(list, "foo")?.list +groupBy(list, "foo")?.ok +groupBy(list, "foo")?.score +groupBy(list, # != #) +groupBy(list, # != foo) +groupBy(list, # != foo)?.i +groupBy(list, # != nil) +groupBy(list, # == #) +groupBy(list, # == #).div +groupBy(list, # in list) +groupBy(list, # not in list) +groupBy(list, #) +groupBy(list, #).Bar +groupBy(list, #).Qux +groupBy(list, #).String +groupBy(list, #).add +groupBy(list, #).array +groupBy(list, #).div +groupBy(list, #).f32 +groupBy(list, #).f64 +groupBy(list, #).foo +groupBy(list, #).greet +groupBy(list, #).half +groupBy(list, #).i +groupBy(list, #).i32 +groupBy(list, #).i64 +groupBy(list, #).list +groupBy(list, #).ok +groupBy(list, #).score +groupBy(list, #)?.Bar +groupBy(list, #)?.Qux +groupBy(list, #)?.String +groupBy(list, #)?.add +groupBy(list, #)?.array +groupBy(list, #)?.div +groupBy(list, #)?.f32 +groupBy(list, #)?.f64 +groupBy(list, #)?.foo +groupBy(list, #)?.greet +groupBy(list, #)?.half +groupBy(list, #)?.i +groupBy(list, #)?.i32 +groupBy(list, #)?.i64 +groupBy(list, #)?.list +groupBy(list, #)?.ok +groupBy(list, #)?.score +groupBy(list, #)[-i64] +groupBy(list, #)[1 == i32] +groupBy(list, #)[f32] +groupBy(list, #)[foo] +groupBy(list, #)[i == i64] +groupBy(list, #)[i32] +groupBy(list, #)[i64] +groupBy(list, #)[ok] +groupBy(list, #?.Bar) +groupBy(list, #?.String()) +groupBy(list, #?.String())?.score +groupBy(list, -0.5) +groupBy(list, -1) +groupBy(list, -f32) +groupBy(list, -i) +groupBy(list, .Bar) +groupBy(list, .Bar).f32 +groupBy(list, .String()) +groupBy(list, .String())?.score +groupBy(list, 0.5 != f32) +groupBy(list, 0.5 != f64) +groupBy(list, 0.5 * f32) +groupBy(list, 0.5 ** i64) +groupBy(list, 0.5 / i) +groupBy(list, 0.5).Bar +groupBy(list, 0.5).Qux +groupBy(list, 0.5).String +groupBy(list, 0.5).add +groupBy(list, 0.5).array +groupBy(list, 0.5).div +groupBy(list, 0.5).f32 +groupBy(list, 0.5).f64 +groupBy(list, 0.5).greet +groupBy(list, 0.5).half +groupBy(list, 0.5).i +groupBy(list, 0.5).i32 +groupBy(list, 0.5).i64 +groupBy(list, 0.5).list +groupBy(list, 0.5).ok +groupBy(list, 0.5).score +groupBy(list, 0.5)?.Bar +groupBy(list, 0.5)?.Qux +groupBy(list, 0.5)?.String +groupBy(list, 0.5)?.add +groupBy(list, 0.5)?.array +groupBy(list, 0.5)?.div +groupBy(list, 0.5)?.f32 +groupBy(list, 0.5)?.f64 +groupBy(list, 0.5)?.foo +groupBy(list, 0.5)?.greet +groupBy(list, 0.5)?.half +groupBy(list, 0.5)?.i +groupBy(list, 0.5)?.i32 +groupBy(list, 0.5)?.i64 +groupBy(list, 0.5)?.list +groupBy(list, 0.5)?.ok +groupBy(list, 0.5)?.score +groupBy(list, 1 * f64).f32 +groupBy(list, 1 + i) +groupBy(list, 1 - 0.5) +groupBy(list, 1 ^ 0.5) +groupBy(list, 1 ^ 1) +groupBy(list, 1 ^ i) +groupBy(list, 1).Bar +groupBy(list, 1).Qux +groupBy(list, 1).String +groupBy(list, 1).add +groupBy(list, 1).array +groupBy(list, 1).div +groupBy(list, 1).f32 +groupBy(list, 1).f64 +groupBy(list, 1).foo +groupBy(list, 1).greet +groupBy(list, 1).half +groupBy(list, 1).i +groupBy(list, 1).i32 +groupBy(list, 1).i64 +groupBy(list, 1).list +groupBy(list, 1).ok +groupBy(list, 1).score +groupBy(list, 1)?.Bar +groupBy(list, 1)?.Qux +groupBy(list, 1)?.String +groupBy(list, 1)?.add +groupBy(list, 1)?.array +groupBy(list, 1)?.div +groupBy(list, 1)?.f32 +groupBy(list, 1)?.f64 +groupBy(list, 1)?.foo +groupBy(list, 1)?.greet +groupBy(list, 1)?.half +groupBy(list, 1)?.i +groupBy(list, 1)?.i32 +groupBy(list, 1)?.i64 +groupBy(list, 1)?.list +groupBy(list, 1)?.ok +groupBy(list, 1)?.score +groupBy(list, 1)[i] +groupBy(list, 1)[reduce(list, "foo")] +groupBy(list, abs(1)) +groupBy(list, abs(i)) +groupBy(list, abs(i64)) +groupBy(list, all(list, ok)) +groupBy(list, ceil(0.5)) +groupBy(list, ceil(f64)) +groupBy(list, f32 ** 0.5) +groupBy(list, f32 ** 1) +groupBy(list, f32 < f32) +groupBy(list, f32 == i64) +groupBy(list, f32 >= 1) +groupBy(list, f32) +groupBy(list, f32).Bar +groupBy(list, f32).Qux +groupBy(list, f32).String +groupBy(list, f32).add +groupBy(list, f32).array +groupBy(list, f32).div +groupBy(list, f32).f32 +groupBy(list, f32).f64 +groupBy(list, f32).foo +groupBy(list, f32).half +groupBy(list, f32).i +groupBy(list, f32).i32 +groupBy(list, f32).i64 +groupBy(list, f32).list +groupBy(list, f32).ok +groupBy(list, f32)?.Bar +groupBy(list, f32)?.Qux +groupBy(list, f32)?.String +groupBy(list, f32)?.add +groupBy(list, f32)?.array +groupBy(list, f32)?.div +groupBy(list, f32)?.f32 +groupBy(list, f32)?.f64 +groupBy(list, f32)?.foo +groupBy(list, f32)?.greet +groupBy(list, f32)?.half +groupBy(list, f32)?.i +groupBy(list, f32)?.i32 +groupBy(list, f32)?.i64 +groupBy(list, f32)?.list +groupBy(list, f32)?.ok +groupBy(list, f32)?.score +groupBy(list, f32)[add == nil] +groupBy(list, f32)[toJSON(true)] +groupBy(list, f64 * 0.5) +groupBy(list, f64 * 1) +groupBy(list, f64 - 1) +groupBy(list, f64 < f64) +groupBy(list, f64) +groupBy(list, f64).Bar +groupBy(list, f64).Qux +groupBy(list, f64).String +groupBy(list, f64).add +groupBy(list, f64).array +groupBy(list, f64).div +groupBy(list, f64).f32 +groupBy(list, f64).f64 +groupBy(list, f64).foo +groupBy(list, f64).greet +groupBy(list, f64).half +groupBy(list, f64).i +groupBy(list, f64).i32 +groupBy(list, f64).i64 +groupBy(list, f64).list +groupBy(list, f64).ok +groupBy(list, f64).score +groupBy(list, f64)?.Bar +groupBy(list, f64)?.Qux +groupBy(list, f64)?.String +groupBy(list, f64)?.add +groupBy(list, f64)?.array +groupBy(list, f64)?.div +groupBy(list, f64)?.f32 +groupBy(list, f64)?.f64 +groupBy(list, f64)?.foo +groupBy(list, f64)?.greet +groupBy(list, f64)?.half +groupBy(list, f64)?.i +groupBy(list, f64)?.i32 +groupBy(list, f64)?.i64 +groupBy(list, f64)?.list +groupBy(list, f64)?.ok +groupBy(list, f64)?.score +groupBy(list, false == ok) +groupBy(list, false ? score : #) +groupBy(list, false).Bar +groupBy(list, false).add +groupBy(list, false).array +groupBy(list, false).div +groupBy(list, false).f32 +groupBy(list, false).foo +groupBy(list, false).greet +groupBy(list, false).half +groupBy(list, false).i +groupBy(list, false).i32 +groupBy(list, false).i64 +groupBy(list, false).list +groupBy(list, false).ok +groupBy(list, false)?.Bar +groupBy(list, false)?.Qux +groupBy(list, false)?.String +groupBy(list, false)?.add +groupBy(list, false)?.div +groupBy(list, false)?.f32 +groupBy(list, false)?.f64 +groupBy(list, false)?.greet +groupBy(list, false)?.half +groupBy(list, false)?.i +groupBy(list, false)?.i32 +groupBy(list, false)?.i64 +groupBy(list, false)?.list +groupBy(list, false)?.ok +groupBy(list, false)?.score +groupBy(list, findLastIndex(array, ok)) +groupBy(list, findLastIndex(list, false)) +groupBy(list, first(array)) +groupBy(list, float(-1)) +groupBy(list, float(0.5)) +groupBy(list, floor(i)) +groupBy(list, floor(i64)) +groupBy(list, foo != #) +groupBy(list, foo) +groupBy(list, foo).Bar +groupBy(list, foo).Qux +groupBy(list, foo).String +groupBy(list, foo).add +groupBy(list, foo).array +groupBy(list, foo).div +groupBy(list, foo).f32 +groupBy(list, foo).f64 +groupBy(list, foo).foo +groupBy(list, foo).greet +groupBy(list, foo).half +groupBy(list, foo).i +groupBy(list, foo).i32 +groupBy(list, foo).i64 +groupBy(list, foo).list +groupBy(list, foo).ok +groupBy(list, foo).score +groupBy(list, foo)?.Bar +groupBy(list, foo)?.Qux +groupBy(list, foo)?.String +groupBy(list, foo)?.add +groupBy(list, foo)?.array +groupBy(list, foo)?.div +groupBy(list, foo)?.f32 +groupBy(list, foo)?.f64 +groupBy(list, foo)?.foo +groupBy(list, foo)?.half +groupBy(list, foo)?.i +groupBy(list, foo)?.i32 +groupBy(list, foo)?.i64 +groupBy(list, foo)?.list +groupBy(list, foo)?.ok +groupBy(list, foo)?.score +groupBy(list, foo)[i32] +groupBy(list, foo.Bar) +groupBy(list, foo.String()) +groupBy(list, foo?.String()) +groupBy(list, greet != greet) +groupBy(list, greet == add) +groupBy(list, greet("bar")) +groupBy(list, i * i) +groupBy(list, i / f64) +groupBy(list, i <= i) +groupBy(list, i ^ i) +groupBy(list, i) +groupBy(list, i).Bar +groupBy(list, i).Qux +groupBy(list, i).String +groupBy(list, i).add +groupBy(list, i).array +groupBy(list, i).div +groupBy(list, i).f32 +groupBy(list, i).f64 +groupBy(list, i).foo +groupBy(list, i).half +groupBy(list, i).i +groupBy(list, i).i32 +groupBy(list, i).i64 +groupBy(list, i).list +groupBy(list, i).ok +groupBy(list, i).score +groupBy(list, i)?.Bar +groupBy(list, i)?.Qux +groupBy(list, i)?.String +groupBy(list, i)?.add +groupBy(list, i)?.array +groupBy(list, i)?.div +groupBy(list, i)?.f32 +groupBy(list, i)?.f64 +groupBy(list, i)?.foo +groupBy(list, i)?.greet +groupBy(list, i)?.half +groupBy(list, i)?.i +groupBy(list, i)?.i32 +groupBy(list, i)?.i64 +groupBy(list, i)?.list +groupBy(list, i)?.ok +groupBy(list, i)?.score +groupBy(list, i32 != f32)?.foo +groupBy(list, i32 * 0.5) +groupBy(list, i32 ** 0.5) +groupBy(list, i32 ** f32) +groupBy(list, i32 > i) +groupBy(list, i32 ^ i) +groupBy(list, i32) +groupBy(list, i32).Bar +groupBy(list, i32).Qux +groupBy(list, i32).add +groupBy(list, i32).array +groupBy(list, i32).div +groupBy(list, i32).f32 +groupBy(list, i32).f64 +groupBy(list, i32).foo +groupBy(list, i32).greet +groupBy(list, i32).half +groupBy(list, i32).i +groupBy(list, i32).i32 +groupBy(list, i32).i64 +groupBy(list, i32).list +groupBy(list, i32).ok +groupBy(list, i32).score +groupBy(list, i32)?.Bar +groupBy(list, i32)?.Qux +groupBy(list, i32)?.String +groupBy(list, i32)?.add +groupBy(list, i32)?.array +groupBy(list, i32)?.div +groupBy(list, i32)?.f32 +groupBy(list, i32)?.f64 +groupBy(list, i32)?.foo +groupBy(list, i32)?.greet +groupBy(list, i32)?.half +groupBy(list, i32)?.i +groupBy(list, i32)?.i32 +groupBy(list, i32)?.i64 +groupBy(list, i32)?.list +groupBy(list, i32)?.ok +groupBy(list, i32)?.score +groupBy(list, i64 != i32) +groupBy(list, i64 != nil) +groupBy(list, i64 - 0.5) +groupBy(list, i64 < 1) +groupBy(list, i64 <= 1) +groupBy(list, i64 == 1) +groupBy(list, i64 == nil) +groupBy(list, i64) +groupBy(list, i64).Bar +groupBy(list, i64).Qux +groupBy(list, i64).String +groupBy(list, i64).add +groupBy(list, i64).array +groupBy(list, i64).div +groupBy(list, i64).f32 +groupBy(list, i64).f64 +groupBy(list, i64).foo +groupBy(list, i64).greet +groupBy(list, i64).half +groupBy(list, i64).i +groupBy(list, i64).i32 +groupBy(list, i64).list +groupBy(list, i64).ok +groupBy(list, i64).score +groupBy(list, i64)?.Bar +groupBy(list, i64)?.Qux +groupBy(list, i64)?.String +groupBy(list, i64)?.add +groupBy(list, i64)?.array +groupBy(list, i64)?.div +groupBy(list, i64)?.f32 +groupBy(list, i64)?.f64 +groupBy(list, i64)?.foo +groupBy(list, i64)?.greet +groupBy(list, i64)?.half +groupBy(list, i64)?.i +groupBy(list, i64)?.i32 +groupBy(list, i64)?.i64 +groupBy(list, i64)?.list +groupBy(list, i64)?.ok +groupBy(list, i64)?.score +groupBy(list, i64)[max(i)] +groupBy(list, i64)[ok] +groupBy(list, int(1)) +groupBy(list, list == array) +groupBy(list, lower("foo")) +groupBy(list, max(f64)) +groupBy(list, max(i)) +groupBy(list, nil != #) +groupBy(list, nil != div) +groupBy(list, nil != true) +groupBy(list, nil == #) +groupBy(list, nil == #).i +groupBy(list, nil in list) +groupBy(list, not false) +groupBy(list, not ok) +groupBy(list, ok != false) +groupBy(list, ok ? # : true) +groupBy(list, ok) +groupBy(list, ok).Bar +groupBy(list, ok).Qux +groupBy(list, ok).String +groupBy(list, ok).add +groupBy(list, ok).array +groupBy(list, ok).div +groupBy(list, ok).f32 +groupBy(list, ok).f64 +groupBy(list, ok).foo +groupBy(list, ok).greet +groupBy(list, ok).half +groupBy(list, ok).i +groupBy(list, ok).i32 +groupBy(list, ok).i64 +groupBy(list, ok).list +groupBy(list, ok).ok +groupBy(list, ok).score +groupBy(list, ok)?.Bar +groupBy(list, ok)?.Qux +groupBy(list, ok)?.String +groupBy(list, ok)?.add +groupBy(list, ok)?.array +groupBy(list, ok)?.div +groupBy(list, ok)?.f32 +groupBy(list, ok)?.f64 +groupBy(list, ok)?.foo +groupBy(list, ok)?.greet +groupBy(list, ok)?.half +groupBy(list, ok)?.i +groupBy(list, ok)?.i32 +groupBy(list, ok)?.i64 +groupBy(list, ok)?.list +groupBy(list, ok)?.ok +groupBy(list, ok)?.score +groupBy(list, reduce(array, #)) +groupBy(list, reduce(list, #)).i32 +groupBy(list, reduce(list, f64)) +groupBy(list, reduce(list, i32)) +groupBy(list, reduce(map(list, i64), #)) +groupBy(list, round(0.5)) +groupBy(list, round(1)) +groupBy(list, round(f64)) +groupBy(list, score(1)) +groupBy(list, score(i)) +groupBy(list, string(#)) +groupBy(list, string(add)) +groupBy(list, string(half)) +groupBy(list, string(i32)) +groupBy(list, string(true)) +groupBy(list, toBase64("foo")) +groupBy(list, toJSON(#)) +groupBy(list, toJSON(1)) +groupBy(list, toJSON(array)) +groupBy(list, toJSON(foo)) +groupBy(list, true && false) +groupBy(list, true ? # : 1) +groupBy(list, true ? 1 : #) +groupBy(list, true).Qux +groupBy(list, true).String +groupBy(list, true).add +groupBy(list, true).array +groupBy(list, true).div +groupBy(list, true).f32 +groupBy(list, true).f64 +groupBy(list, true).foo +groupBy(list, true).greet +groupBy(list, true).half +groupBy(list, true).i +groupBy(list, true).i32 +groupBy(list, true).i64 +groupBy(list, true).list +groupBy(list, true).ok +groupBy(list, true).score +groupBy(list, true)?.Bar +groupBy(list, true)?.Qux +groupBy(list, true)?.String +groupBy(list, true)?.add +groupBy(list, true)?.array +groupBy(list, true)?.div +groupBy(list, true)?.f32 +groupBy(list, true)?.f64 +groupBy(list, true)?.foo +groupBy(list, true)?.greet +groupBy(list, true)?.half +groupBy(list, true)?.i +groupBy(list, true)?.i32 +groupBy(list, true)?.i64 +groupBy(list, true)?.list +groupBy(list, true)?.ok +groupBy(list, true)?.score +groupBy(list, type("foo")) +groupBy(list, type(#)) +groupBy(list, type(false)) +groupBy(list[i32:1], i64) +groupBy(list[i32:i32], foo) +groupBy(list[i64:1], i32) +groupBy(list[i:1], f64) +groupBy(map(array, #), # <= #) +groupBy(map(array, #), # == #) +groupBy(map(array, #), # >= #) +groupBy(map(array, #), #) +groupBy(map(array, #), 0.5 < 0.5) +groupBy(map(array, #), foo) +groupBy(map(array, #), i) +groupBy(map(array, #), i64) +groupBy(map(array, #), min(1)) +groupBy(map(array, #), ok) +groupBy(map(array, 0.5), # != 0.5) +groupBy(map(array, 0.5), # / #) +groupBy(map(array, 0.5), #) +groupBy(map(array, 0.5), f64) +groupBy(map(array, 1), 0.5 / #) +groupBy(map(array, 1), f64) +groupBy(map(array, 1), max(#)) +groupBy(map(array, 1), ok) +groupBy(map(array, div), div != #) +groupBy(map(array, f32), # - 0.5) +groupBy(map(array, f32), min(#)) +groupBy(map(array, f64), #) +groupBy(map(array, false), f64) +groupBy(map(array, false), i) +groupBy(map(array, foo), #).add +groupBy(map(array, foo), i) +groupBy(map(array, foo), ok) +groupBy(map(array, i), #) +groupBy(map(array, i32), # % i) +groupBy(map(array, i32), #) +groupBy(map(array, ok), i64) +groupBy(map(list, "bar"), #) +groupBy(map(list, "foo"), #) +groupBy(map(list, #), "bar" == "bar") +groupBy(map(list, #), #) +groupBy(map(list, #), #)?.array +groupBy(map(list, #), f32) +groupBy(map(list, #), f64) +groupBy(map(list, #), i32) +groupBy(map(list, #), i64) +groupBy(map(list, #), ok) +groupBy(map(list, 0.5), # * i64) +groupBy(map(list, 0.5), # ** #) +groupBy(map(list, 0.5), #) +groupBy(map(list, 0.5), i32) +groupBy(map(list, 1), #) +groupBy(map(list, 1), get(list, #)).i64 +groupBy(map(list, 1), i64) +groupBy(map(list, f32), # ** #).array +groupBy(map(list, f64), #) +groupBy(map(list, f64), #).half +groupBy(map(list, f64), f32) +groupBy(map(list, f64), i) +groupBy(map(list, i), #) +groupBy(map(list, i32), # == #) +groupBy(map(list, i64), #)?.i32 +groupBy(map(list, i64), i) +groupBy(map(list, list), foo) +groupBy(map(list, ok), #) +groupBy(ok ? "foo" : greet, # <= #) +groupBy(reduce(array, # .. i64), add) +groupBy(reduce(array, array), foo) +groupBy(reduce(array, array), i) +groupBy(reduce(list, array), # / #) +groupBy(reduce(list, array), true ? true : nil) +groupBy(sort(array), #) +groupBy(sort(array), foo) +groupBy(true ? "foo" : 1, # > 0.5) +groupBy(true ? "foo" : 1, foo) +groupBy(true ? "foo" : false, # / #) +groupBy(true ? "foo" : score, #) half half != add -half != add ? ok : half +half != add ? add : array +half != add ? true : 1 +half != add || ok half != div -half != div == true +half != div ? i32 : f64 +half != div ? nil : greet half != foo.Qux half != foo.String half != foo?.Qux half != foo?.String half != greet +half != greet == ok +half != greet ? score : true half != half +half != half != nil +half != half and "bar" in foo +half != nil == false +half != nil ? "bar" : div +half != nil ? "bar" : false +half != nil ? true : div +half != reduce(list, half) half != score +half != score && i32 > 1 half == add -half == add ? "bar" : half +half == add == nil +half == add ? list : add +half == add or ok half == div -half == div ? add : 0.5 -half == div and 1 >= 1 half == foo.Qux half == foo.String half == foo?.Qux half == foo?.String half == greet -half == greet == nil -half == greet ? ok : foo -half == greet || ok +half == greet != ok +half == greet ? half : div +half == greet ? i64 : ok +half == greet || true ? i : list half == half -half == half && i >= 0.5 -half == half ? score : "bar" -half == half and ok -half == nil == true -half == nil ? 1 : 0.5 -half == nil ? 1 : score +half == nil && ok +half == nil ? array : 0.5 +half == nil ? foo : false half == score -half not in [list, i64, ok] -half not in {"bar": list, "foo": 0.5}.ok -half(-(f32 - 0.5)) -half(--1) +half == score ? f32 : nil +half == score ? foo : "bar" +half(-(0.5 + 1)) +half(-(f64 + 1)) +half(-(i64 - 0.5)) half(-0.5) half(-1) -half(-f32 ^ i) half(-f64) half(0.5 * 0.5) half(0.5 * 1) @@ -6567,9 +9175,11 @@ half(0.5 ** i) half(0.5 ** i32) half(0.5 ** i64) half(0.5 + 0.5) +half(0.5 + 1 + i64) half(0.5 + 1) half(0.5 + f32) half(0.5 + f64) +half(0.5 + i) half(0.5 + i32) half(0.5 + i64) half(0.5 - 0.5) @@ -6584,7 +9194,6 @@ half(0.5 / 1) half(0.5 / f32) half(0.5 / f64) half(0.5 / i) -half(0.5 / i32) half(0.5 / i64) half(0.5 ^ 0.5) half(0.5 ^ 1) @@ -6593,38 +9202,49 @@ half(0.5 ^ f64) half(0.5 ^ i) half(0.5 ^ i32) half(0.5 ^ i64) -half(0.5) != f32 +half(0.5) != -i64 +half(0.5) != 0.5 ^ i +half(0.5) != i32 half(0.5) != i64 half(0.5) * f32 +half(0.5) * i +half(0.5) * i32 +half(0.5) * i64 half(0.5) ** f32 -half(0.5) ** f64 -half(0.5) + 1 * f64 +half(0.5) ** i +half(0.5) ** i32 +half(0.5) ** i64 +half(0.5) ** max(1) +half(0.5) + 1 / 1 +half(0.5) + f32 half(0.5) + f64 half(0.5) + i32 half(0.5) + i64 -half(0.5) - f32 -half(0.5) - f64 -half(0.5) - i -half(0.5) - i32 +half(0.5) - i64 +half(0.5) / -0.5 +half(0.5) / f64 half(0.5) / i -half(0.5) / i32 half(0.5) / i64 -half(0.5) < i32 -half(0.5) <= i -half(0.5) == f32 != true -half(0.5) == i -half(0.5) == i32 +half(0.5) < f64 +half(0.5) <= f32 ? f64 : 1 +half(0.5) <= f64 +half(0.5) <= i32 +half(0.5) <= i64 + i32 +half(0.5) <= int(0.5) +half(0.5) == f32 +half(0.5) == i32 / i half(0.5) == i64 +half(0.5) > f32 +half(0.5) > f64 half(0.5) > i -half(0.5) > i32 half(0.5) > i64 -half(0.5) >= f32 -half(0.5) >= f64 -half(0.5) >= i half(0.5) >= i32 -half(0.5) >= i64 -half(0.5) ^ (i32 - 1) +half(0.5) ^ (1 * i32) +half(0.5) ^ f32 +half(0.5) ^ f64 +half(0.5) ^ i half(0.5) ^ i32 +half(0.5) ^ i64 half(1 * 0.5) half(1 * 1) half(1 * f32) @@ -6666,22 +9286,77 @@ half(1 ^ f32) half(1 ^ f64) half(1 ^ i) half(1 ^ i32) +half(1 ^ i64) +half(1) != f32 +half(1) != f64 +half(1) != f64 ** f32 +half(1) != f64 ^ 0.5 +half(1) != i32 +half(1) != i64 +half(1) * i32 * i64 +half(1) ** (i64 * f32) +half(1) ** f32 +half(1) ** i +half(1) ** i32 +half(1) ** i64 +half(1) + f32 +half(1) + f32 / 0.5 +half(1) + i +half(1) + i32 +half(1) + i64 + i32 +half(1) - f32 +half(1) - i < i64 +half(1) - i32 +half(1) - i64 +half(1) / -1 +half(1) / 0.5 / i +half(1) / i +half(1) / i32 +half(1) < f64 +half(1) < i +half(1) < i64 +half(1) <= f32 +half(1) <= i32 +half(1) <= i64 +half(1) == -1 +half(1) == 1 ^ i64 +half(1) == f32 +half(1) == i32 +half(1) > i +half(1) > i32 +half(1) > i64 +half(1) >= f32 +half(1) >= i +half(1) >= i32 +half(1) >= i64 +half(1) >= max(1) +half(1) >= mean(array) +half(1) ^ f32 +half(1) ^ findIndex(list, true) +half(1) ^ i64 +half(1) in array +half(1) not in array half(abs(0.5)) half(abs(f64)) -half(abs(f64)) - i +half(ceil(0.5)) +half(ceil(1)) +half(ceil(f32)) +half(ceil(f64)) +half(ceil(i)) +half(ceil(i32)) +half(ceil(i64)) half(f32 * 0.5) half(f32 * 1) half(f32 * f64) half(f32 * i) half(f32 * i32) -half(f32 * i64) half(f32 ** 0.5) half(f32 ** f32) half(f32 ** f64) +half(f32 ** i64) half(f32 + 0.5) half(f32 + 1) half(f32 + f64) -half(f32 + i) half(f32 + i32) half(f32 + i64) half(f32 - 0.5) @@ -6694,84 +9369,85 @@ half(f32 / 0.5) half(f32 / 1) half(f32 / f32) half(f32 / f64) +half(f32 / i) half(f32 / i32) half(f32 / i64) half(f32 ^ 0.5) +half(f32 ^ 1) half(f32 ^ f32) half(f32 ^ f64) +half(f32 ^ i) half(f32 ^ i32) half(f32 ^ i64) half(f64 * 0.5) -half(f64 * 1) half(f64 * f32) +half(f64 * f64) half(f64 * i) half(f64 * i32) +half(f64 * i64) half(f64 ** 0.5) half(f64 ** 1) half(f64 ** f32) -half(f64 ** f64) half(f64 ** i) half(f64 ** i32) +half(f64 + 0.5) half(f64 + 1) -half(f64 + f32) +half(f64 + f64) half(f64 + i) -half(f64 + i32) +half(f64 + i64) half(f64 - 0.5) half(f64 - 1) half(f64 - f32) half(f64 - f64) half(f64 - i) -half(f64 - i32) half(f64 - i64) +half(f64 / 0.5) half(f64 / 1) half(f64 / f32) half(f64 / f64) +half(f64 / i) half(f64 / i32) -half(f64 / i64) half(f64 ^ 0.5) half(f64 ^ 1) half(f64 ^ f32) -half(f64 ^ i) +half(f64 ^ f64) half(f64 ^ i32) -half(f64 ^ i64) half(f64) -half(f64) != f32 -half(f64) != f64 +half(f64) != f64 != false +half(f64) != i32 half(f64) != i64 -half(f64) * f32 -half(f64) * i64 -half(f64) ** (i32 * 0.5) -half(f64) ** 0.5 ** i half(f64) ** f64 -half(f64) ** i64 -half(f64) + 1 + f64 -half(f64) + f64 -half(f64) + i +half(f64) ** i +half(f64) ** i32 half(f64) + i32 half(f64) + i64 half(f64) - f64 half(f64) - i32 -half(f64) / f32 half(f64) / f64 half(f64) / i32 -half(f64) / i64 -half(f64) < f64 half(f64) < i half(f64) < i32 -half(f64) < i64 -half(f64) <= 0.5 + f64 -half(f64) <= f64 -half(f64) <= i64 +half(f64) <= f32 +half(f64) <= i32 +half(f64) == f32 +half(f64) == f64 +half(f64) == i +half(f64) == i32 half(f64) == i64 -half(f64) > abs(i) -half(f64) > f32 * 0.5 -half(f64) > max(i64) -half(f64) >= f32 +half(f64) > f32 +half(f64) > f64 +half(f64) > i +half(f64) > i32 +half(f64) > i64 half(f64) >= i half(f64) >= i64 -half(f64) ^ f32 -half(false ? 0.5 : 0.5) -half(float(-f64)) +half(f64) ^ i +half(f64) not in array +half(false ? f64 : 0.5) +half(false ? i32 : 0.5) +half(false ? ok : 0.5) +half(false ? score : 0.5) +half(false ? true : f64) half(float(0.5)) half(float(1)) half(float(f32)) @@ -6779,37 +9455,43 @@ half(float(f64)) half(float(i)) half(float(i32)) half(float(i64)) -half(greet == div ? "bar" : 0.5) +half(floor(0.5)) +half(floor(1)) +half(floor(f32)) +half(floor(f64)) +half(floor(i)) +half(floor(i32)) +half(floor(i64)) half(half(0.5)) +half(half(1)) +half(half(ceil(i))) +half(half(f64 - 0.5)) half(half(f64)) -half(half(i - 0.5)) half(i * 0.5) half(i * 1) -half(i * f32) half(i * f64) half(i ** 0.5) half(i ** 1) half(i ** f32) half(i ** f64) half(i ** i) +half(i ** i32) half(i ** i64) half(i + 0.5) half(i + 1) half(i + f32) half(i + f64) -half(i - 0.5) half(i - 1) +half(i - f32) half(i - f64) half(i / 0.5) half(i / 1) -half(i / f32) half(i / f64) half(i / i) half(i / i32) -half(i / i64) half(i ^ 0.5) half(i ^ 1) -half(i ^ f32) +half(i ^ i) half(i ^ i32) half(i ^ i64) half(i32 * 0.5) @@ -6818,2451 +9500,2668 @@ half(i32 * f32) half(i32 * f64) half(i32 ** 0.5) half(i32 ** 1) -half(i32 ** f32) half(i32 ** f64) half(i32 ** i) half(i32 ** i32) half(i32 ** i64) half(i32 + 0.5) half(i32 + 1) +half(i32 + f32) half(i32 + f64) half(i32 - 0.5) half(i32 - 1) half(i32 - f32) -half(i32 - f64) half(i32 / 0.5) half(i32 / 1) half(i32 / f32) half(i32 / f64) half(i32 / i) +half(i32 / i32 / f32 / f64) half(i32 / i32) half(i32 / i64) half(i32 ^ 0.5) half(i32 ^ 1) half(i32 ^ f32) +half(i32 ^ f64) half(i32 ^ i) half(i32 ^ i32) +half(i32 ^ i64 ^ i) half(i32 ^ i64) +half(i64 != i ? true : 0.5) half(i64 * 0.5) half(i64 * 1) half(i64 * f64) half(i64 ** 0.5) half(i64 ** 1) -half(i64 ** f32) half(i64 ** f64) +half(i64 ** i) +half(i64 ** i32) half(i64 ** i64) half(i64 + 0.5) -half(i64 + 1) half(i64 + f32) half(i64 + f64) half(i64 - 0.5) half(i64 - 1) half(i64 - f32) +half(i64 - f64) half(i64 / 0.5) half(i64 / 1) half(i64 / f32) half(i64 / f64) half(i64 / i) half(i64 / i32) -half(i64 / i64) half(i64 ^ 0.5) half(i64 ^ 1) half(i64 ^ f32) half(i64 ^ f64) +half(i64 ^ i) half(i64 ^ i32) -half(i64 ^ i64) half(max(0.5)) -half(max(0.5, f32)) +half(max(0.5)) ** i half(max(f64)) +half(mean(array)) +half(median(array)) half(min(0.5)) -half(min(0.5, 0.5)) -half(min(1, 0.5, 1)) +half(min(0.5, f32)) +half(min(0.5, i32)) half(min(f64)) -half(ok ? 0.5 : f32) -half(ok ? 0.5 : false) -half(ok ? 0.5 : foo) -half(true ? 0.5 : 0.5) -hasPrefix("bar", "foo") != ok -hasSuffix("foo", "foo") or 0.5 <= i +half(min(i, 0.5)) +half(reduce(array, 0.5)) +half(reduce(array, f64)) +half(reduce(list, 0.5)) +half(reduce(list, f64)) +half(round(0.5)) +half(round(1)) +half(round(f32)) +half(round(f64)) +half(round(i)) +half(round(i32)) +half(round(i64)) +half(score(1) ^ i64) +half(true ? 0.5 : i64) +half(true ? f64 : nil) i i != -0.5 i != -1 i != -f32 i != -f64 i != -i -i != -i64 -i != 0.5 / 0.5 -i != 0.5 == ok -i != 0.5 ? 1 : array -i != 0.5 ? i32 : 0.5 -i != 0.5 ? score : score -i != 1 % i64 -i != 1 * i -i != 1 + 1 -i != 1 - 0.5 -i != 1 - 1 -i != 1 - i64 -i != 1 == ok -i != 1 ? ok : i64 -i != 1 or i64 != 1 +i != -i32 +i != 0.5 + 0.5 +i != 0.5 - 1 +i != 0.5 / 1 +i != 0.5 ? 1 : div +i != 0.5 ? false : i32 +i != 0.5 ^ 0.5 +i != 0.5 ^ 1 +i != 0.5 ^ f32 +i != 1 != nil +i != 1 / 1 +i != 1 ? f64 : score +i != ceil(1) +i != ceil(f32) +i != ceil(i64) i != f32 -i != f32 + i -i != f32 / 1 -i != f32 ? div : list +i != f32 ** i64 +i != f32 + i64 +i != f32 == ok i != f64 -i != f64 * 0.5 -i != f64 + 1 -i != f64 / 0.5 -i != f64 ? 0.5 : nil -i != f64 ? array : div -i != f64 ? half : 1 -i != f64 || ok -i != first(array) -i != float(1) -i != float(f32) -i != float(f64) +i != f64 + i32 +i != f64 == true +i != f64 ^ f32 +i != f64 ^ i64 +i != float(0.5) +i != float(i) i != half(0.5) +i != half(f64) i != i -i != i != nil -i != i ^ f64 +i != i * 1 +i != i * i32 +i != i - i32 +i != i ? i : false i != i32 -i != i32 % i32 -i != i32 * f64 -i != i32 - i64 -i != i32 / i64 -i != i32 ? 1 : i -i != i32 ? list : i -i != i32 || half != nil +i != i32 != nil ? greet : score +i != i32 * 0.5 +i != i32 * f32 +i != i32 and ok i != i64 -i != i64 - f32 -i != i64 ? true : "foo" -i != i64 ^ f64 +i != i64 ** i +i != i64 ? add : i64 +i != i64 ? f32 : nil +i != i64 ^ 1 i != int(1) -i != max(i32) -i != min(1) -i != nil != true -i != nil ? ok : "bar" +i != min(i64) +i != nil != ok +i != nil ? ok : f64 +i != reduce(array, #) +i != reduce(array, 0.5) +i != reduce(list, 1) +i != round(f64) +i != score(1) i != score(i) +i != {"foo": score}?.f32 +i % (1 + i32) +i % (i32 + i32) +i % (i64 + 1) i % -1 i % -i i % -i32 -i % -i64 -i % 1 != i64 -i % 1 .. i32 -i % 1 / i +i % 1 % i32 +i % 1 % i64 +i % 1 * i32 +i % 1 + i64 +i % 1 .. i +i % 1 / 0.5 +i % 1 / f32 +i % 1 <= i64 i % 1 >= i -i % 1 >= i32 -i % array[i] -i % first(array) -i % get(array, i64) +i % abs(1) +i % abs(i) +i % array[1] +i % array[i64] i % i -i % i % i32 -i % i + i32 -i % i == i -i % i in array +i % i / i i % i32 +i % i32 != i32 +i % i32 * 1 +i % i32 * f64 i % i32 / i32 -i % i32 <= f32 +i % i32 <= f64 i % i64 -i % i64 != i -i % int(i64) -i % len(array) -i % score(1) +i % i64 != i ? f64 : list +i % i64 <= i +i % min(1) +i % min(i64) +i % reduce(array, #) i % score(i) -i * (0.5 + 0.5) -i * (f32 + f32) -i * (i32 + 0.5) -i * (i32 - f64) -i * (i64 + 1) -i * -1 -i * -f32 -i * -i +i * (1 + 1) +i * (f32 + 0.5) +i * (f32 + 1) +i * (f64 + i) +i * (f64 - i32) +i * -i32 i * -i64 i * 0.5 * f64 i * 0.5 + i -i * 0.5 - i -i * 0.5 < i -i * 0.5 <= i64 ** f64 -i * 1 % i -i * 1 ** i32 -i * 1 / f64 -i * 1 / i64 -i * 1 <= f32 -i * abs(0.5) -i * add(1, 1) -i * array[i32] +i * 0.5 / i +i * 0.5 < i32 +i * 0.5 > i32 * f32 +i * 0.5 ^ 1 +i * 1 % i64 +i * 1 ** 1 +i * 1 < f64 +i * 1 < i32 +i * 1 == i32 +i * bitnand(i64, i64) +i * bitnot(i64) +i * ceil(1) i * f32 -i * f32 != f32 -i * f32 ** 0.5 -i * f32 >= f32 +i * f32 <= f64 +i * f32 ^ 0.5 +i * f32 ^ 1 i * f32 ^ f32 i * f64 -i * f64 * 1 -i * float(f64) +i * f64 != i +i * f64 * f32 > i +i * f64 * i +i * f64 ** i32 +i * float(f32) +i * floor(f32) +i * floor(i) +i * floor(i32) +i * floor(i64) +i * half(0.5) +i * half(1) i * half(f64) i * i -i * i != i64 -i * i / f32 -i * i / f64 -i * i / i32 -i * i / i64 +i * i % i +i * i * 0.5 +i * i * f32 +i * i ** 0.5 +i * i - f32 +i * i .. i +i * i == f32 i * i32 -i * i32 ** f64 -i * i32 ** i32 -i * i32 - i -i * i32 / i32 -i * i32 <= i32 +i * i32 * i +i * i32 .. i32 +i * i32 / min(1) +i * i32 == f32 +i * i32 in array i * i64 -i * i64 % i32 -i * i64 * 0.5 -i * i64 + f32 -i * i64 >= i32 -i * i64 ^ i64 -i * int(f64) -i * int(i) -i * int(i64) -i * max(0.5) -i * min(i64) +i * i64 < f64 +i * int(1) +i * max(1) +i * max(f64, f32) +i * max(i) +i * min(f64, i) +i * reduce(array, #) i * score(1) -i ** (0.5 + f64) -i ** (0.5 + i64) -i ** (1 * 1) -i ** (1 - 0.5) -i ** (i32 % i64) -i ** (i32 - 1) +i * score(i) +i * sum(array) +i ** (0.5 * f64) +i ** (0.5 + 0.5) +i ** (0.5 - 1) +i ** (0.5 - f64) +i ** (0.5 / i32) +i ** (f32 + 0.5) +i ** (f32 + f32) +i ** (i * 0.5) +i ** (i * 1) +i ** (i + f64) +i ** (i - i32 + i32) +i ** (i32 - i64) +i ** (i32 / 1) +i ** (i64 - 0.5) i ** -0.5 -i ** -i +i ** -1 +i ** -f32 i ** -i32 i ** -i64 -i ** 0.5 ** 0.5 -i ** 0.5 ** 1 +i ** 0.5 ** f32 +i ** 0.5 ** reduce(array, #) +i ** 0.5 < bitnot(i64) i ** 0.5 < f32 -i ** 0.5 <= i64 ^ i32 -i ** 1 != f64 +i ** 0.5 < f64 +i ** 0.5 <= i64 +i ** 0.5 ^ i +i ** 0.5 ^ i64 i ** 1 ** 1 -i ** 1 ** f64 -i ** 1 ** i -i ** 1 == f32 +i ** 1 / i +i ** 1 < -f32 +i ** 1 >= f64 +i ** 1 ^ i +i ** 1 ^ i32 +i ** abs(0.5) +i ** array[i64] +i ** bitnand(i32, 1) +i ** bitshl(i64, i32) +i ** ceil(1) i ** f32 -i ** f32 ** 0.5 -i ** f32 ** f64 -i ** f32 + f64 -i ** f32 <= f32 -i ** f32 <= i32 ? 1 : f32 -i ** f32 >= float(i64) +i ** f32 * i32 +i ** f32 ** 1 +i ** f32 ^ f64 +i ** f32 ^ i64 i ** f64 -i ** f64 != f64 -i ** f64 < 1 / 0.5 -i ** float(0.5) -i ** float(f32) -i ** float(i32) +i ** f64 != i32 +i ** f64 ** f64 +i ** f64 > i64 ? 1 : ok +i ** f64 >= i +i ** first(array) +i ** floor(f64) +i ** half(1) i ** half(f64) +i ** half(i + f32) i ** i -i ** i + f64 -i ** i <= i -i ** i ^ i +i ** i != i == ok +i ** i ^ 0.5 i ** i32 -i ** i32 != i -i ** i32 != i32 -i ** i32 + i32 +i ** i32 == f32 +i ** i32 > i64 i ** i64 -i ** i64 ** 1 -i ** i64 ** f64 -i ** i64 ** i64 -i ** i64 - f64 +i ** i64 ** i +i ** i64 < i +i ** i64 == i32 i ** i64 >= i -i ** i64 >= i32 -i ** i64 ^ 1 -i ** int(1) -i ** max(f32) -i ** min(0.5, 1) -i ** min(f32) -i ** min(i) +i ** i64 ^ i64 +i ** i64 not in array +i ** len("foo") +i ** len(array) +i ** min(1) i ** min(i32) +i ** reduce(array, #) i ** score(1) +i ** score(i) +i + -0.5 i + -1 i + -f32 i + -f64 -i + -i -i + 0.5 != i -i + 0.5 ** i32 -i + 0.5 - i -i + 0.5 < 1 + f32 -i + 0.5 <= i32 -i + 0.5 > f32 -i + 1 / array[i32] +i + 0.5 ** 0.5 +i + 0.5 + i +i + 0.5 / 1 +i + 1 + f32 i + 1 / f32 -i + 1 <= f32 -i + 1 > i64 -i + 1 >= f64 -i + array[i32] -i + count(list, false) +i + 1 > f64 +i + 1 ^ 1 +i + 1 ^ f32 +i + abs(0.5) +i + array[i64] +i + array[i] +i + count(list, true) i + f32 -i + f32 != f64 -i + f32 * i i + f32 ** i +i + f32 / f64 +i + f32 / i32 +i + f32 < i64 i + f64 -i + f64 <= i64 -i + f64 == f64 +i + f64 - i32 +i + f64 < i64 +i + f64 == i32 +i + f64 > f64 i + float(0.5) -i + float(f32) -i + get(array, i64) -i + half(0.5) +i + float(i32) +i + get(array, i) +i + half(1) i + half(f64) i + i -i + i + f32 -i + i - i32 +i + i * i64 +i + i ^ 1 i + i32 -i + i32 != i64 -i + i32 - 0.5 +i + i32 .. -i64 i + i32 .. i -i + i32 > f32 +i + i32 <= f32 +i + i32 == i64 +i + i32 > min(i) +i + i32 >= i32 == nil +i + i32 in array i + i64 -i + i64 + f64 -i + i64 ^ 1 +i + i64 - f64 +i + i64 / 0.5 +i + i64 / f64 +i + i64 > f32 i + int(f32) -i + int(i64) -i + last(array) i + len("bar") -i + max(0.5) -i + max(f32) +i + reduce(array, #) +i + reduce(array, f32) +i + reduce(list, i32) +i + score(i) +i - -0.5 i - -1 i - -f32 -i - -i +i - -f64 i - -i64 -i - 0.5 * 0.5 -i - 0.5 * 1 -i - 0.5 / 1 -i - 1 * 1 -i - 1 * i32 -i - 1 - i +i - 0.5 + i64 +i - 0.5 - 1 +i - 0.5 < f64 +i - 0.5 > i +i - 0.5 not in array +i - 1 + i +i - 1 - i64 +i - 1 .. i64 +i - 1 < i32 +i - 1 <= f64 +i - 1 <= i +i - 1 > 0.5 - 0.5 i - 1 ^ 0.5 -i - 1 ^ i32 -i - abs(0.5) -i - abs(f32) -i - abs(i32) +i - bitxor(i, i) +i - ceil(f64) i - f32 -i - f32 * i32 -i - f32 ** 1 -i - f32 + f64 -i - f32 - 1 -i - f32 / 0.5 -i - f32 / f32 -i - f32 / i32 -i - f32 ^ i64 +i - f32 * f32 +i - f32 - i32 +i - f32 / i +i - f32 ^ 0.5 i - f64 -i - findIndex(list, ok) -i - half(0.5) +i - f64 + i32 +i - f64 + i32 - f64 +i - f64 / i32 +i - f64 ^ i64 +i - find(array, true) +i - float(0.5) +i - floor(1) +i - half(f64) i - i -i - i * 1 -i - i < i + f64 -i - i <= i -i - i <= i32 -i - i >= f32 -i - i not in array +i - i + f32 i - i32 -i - i32 > len(array) -i - i32 ^ 0.5 +i - i32 + 0.5 +i - i32 - f32 +i - i32 - i32 i - i64 -i - i64 ** 1 -i - i64 + i32 -i - i64 - 1 / 1 -i - i64 - f64 -i - int(1) -i - int(f32) -i - int(i) -i - last(array) -i - max(0.5) +i - i64 .. i32 +i - i64 / i +i - i64 <= i32 +i - i64 ^ f32 +i - i64 ^ f64 +i - int(i32) i - max(i64) -i - min(f32) +i - median(array) +i - round(i32) i - score(1) -i - score(i) +i .. -i i .. -i32 -i .. 1 % i32 -i .. 1 == array +i .. -i64 i .. abs(1) -i .. abs(i32) i .. i -i .. i % 1 i .. i32 -i .. i32 == array i .. i64 -i .. i64 + i -i .. i64 == list -i .. int(i64) -i .. last(array) -i .. len(list) -i .. min(1) +i .. i64 * 1 +i .. i64 + 1 +i .. int(0.5) +i .. max(1) +i .. max(i) +i .. min(i) +i .. reduce(list, i64) +i .. score(1) i .. score(i) -i / (f32 + f64) -i / (f64 + f32) -i / (i32 + f32) -i / -0.5 +i / (0.5 + 1) +i / (0.5 + f64) +i / (0.5 + i) +i / (0.5 - f32) +i / (i + f32) i / -1 +i / -f32 +i / -f64 i / -i32 -i / -i64 -i / 0.5 * f32 +i / 0.5 * 1 i / 0.5 * f64 -i / 0.5 ** f32 -i / 0.5 / i32 -i / 0.5 < i64 -i / 0.5 <= i64 -i / 0.5 == 0.5 - f64 -i / 0.5 >= i64 -i / 1 ** 1 -i / 1 / i64 -i / 1 == f64 -i / 1 ^ 1 -i / 1 ^ i64 -i / abs(i64) +i / 0.5 / f64 +i / 0.5 == nil != false +i / 0.5 >= f32 +i / 0.5 ^ i32 +i / 1 ** i32 +i / 1 <= i64 +i / 1 > i +i / abs(i) +i / bitnot(i64) +i / count(array, false) i / f32 -i / f32 != f32 -i / f32 ** i64 -i / f32 / i +i / f32 != i64 ? 1 : list +i / f32 >= len(array) i / f64 -i / f64 * f32 -i / f64 - f32 -i / float(i32) -i / half(0.5) -i / half(f64) +i / f64 * f64 +i / f64 ^ i32 +i / float(0.5) +i / float(1) +i / float(f64) +i / floor(1) +i / floor(i32) i / i -i / i != i64 -i / i > i32 -i / i > i64 +i / i ** 1 +i / i / i +i / i < i32 +i / i ^ 1 i / i32 -i / i32 - i -i / i32 / i -i / i32 / i64 -i / i32 ^ f32 +i / i32 / 1 i / i64 -i / i64 != i -i / i64 ** f32 -i / i64 < i % 1 -i / i64 >= i32 ? div : div -i / len("bar") -i / len(list) -i / max(1 / i) -i / min(0.5) -i / min(f64) -i / min(i32) +i / i64 * f32 +i / i64 / f64 +i / max(0.5) +i / mean(array) +i / min(f32) +i / min(i64) i / score(1) -i / score(i) -i < -(f32 - 1) -i < -1 -i < -f32 -i < -i +i < -(f32 * 1) +i < --f64 i < -i32 -i < 0.5 != false -i < 0.5 != ok -i < 0.5 * i -i < 0.5 + 0.5 +i < -i64 +i < 0.5 != nil +i < 0.5 + f64 i < 0.5 == ok -i < 0.5 ? "bar" : "bar" -i < 0.5 ? f32 : array -i < 0.5 ? f32 : half -i < 1 * 1 -i < 1 ** f32 -i < 1 == ok -i < 1 ? false : nil -i < abs(f64) +i < 1 / 0.5 +i < 1 == nil +i < 1 ? array : score +i < 1 ^ i64 +i < abs(i32) i < f32 -i < f32 * i -i < f32 ^ f32 +i < f32 && ok +i < f32 * 0.5 +i < f32 * i64 +i < f32 ** i +i < f32 ** i32 +i < f32 + 1 +i < f32 + array[i64] +i < f32 / 0.5 +i < f32 ? "bar" : div +i < f32 || ok i < f64 -i < f64 * f64 -i < findIndex(list, ok) -i < half(f32 ^ i64) +i < f64 - 1 +i < float(f64) +i < floor(f32) +i < half(0.5) +i < half(1) i < half(f64) i < i -i < i % 1 -i < i / 1 -i < i ? i32 : add -i < i ^ 0.5 -i < i ^ i32 +i < i != true +i < i ** 1 +i < i / i64 +i < i ? score : list i < i32 -i < i32 ** 0.5 -i < i32 - f32 -i < i32 == nil +i < i32 * f32 +i < i32 + 1 i < i64 -i < i64 && ok -i < i64 - f64 -i < i64 - i32 -i < i64 ? nil : "foo" -i < i64 ^ 0.5 -i < int(0.5) -i < int(i64) -i < len(array) -i < len(list) -i < min(i64) -i < score(1) -i < score(i) -i <= -f32 +i < i64 ^ f32 +i < max(0.5) +i < reduce(array, #) +i <= -0.5 +i <= -1 +i <= -f64 i <= -i +i <= -i32 i <= -i64 -i <= 0.5 ** 0.5 -i <= 0.5 ** f32 -i <= 0.5 == nil -i <= 0.5 ? score : array -i <= 1 != all(array, true) +i <= 0.5 * f32 +i <= 0.5 + 0.5 +i <= 0.5 / 1 +i <= 0.5 / f64 +i <= 0.5 == ok +i <= 0.5 ? i : ok +i <= 0.5 ? nil : i32 +i <= 0.5 ^ f32 i <= 1 != nil -i <= 1 % i -i <= 1 + 1 -i <= 1 - f64 -i <= 1 ? ok : 1 -i <= abs(1) -i <= abs(i32) -i <= add(1, 1) +i <= 1 && ok +i <= 1 * 0.5 +i <= 1 ** i +i <= 1 + f64 +i <= 1 - f32 +i <= 1 ? 0.5 : f32 +i <= 1 ? 0.5 : list +i <= 1 ? list : div +i <= 1 ^ f32 +i <= abs(0.5) +i <= ceil(1) i <= f32 -i <= f32 != nil -i <= f32 * 0.5 -i <= f32 / f32 -i <= f32 ? ok : 1 -i <= f32 or ok +i <= f32 - 0.5 +i <= f32 ? array : nil i <= f64 -i <= f64 * 1 -i <= f64 == nil -i <= f64 ? foo : div -i <= f64 or add == greet -i <= float(f64) -i <= float(i) -i <= float(i32) -i <= half(-1) -i <= half(0.5) +i <= float(0.5) +i <= float(f32) +i <= half(1) +i <= half(f64) i <= i -i <= i ** 1 -i <= i == true +i <= i != nil +i <= i * f32 +i <= i ** f64 +i <= i - 0.5 +i <= i - 1 +i <= i / i +i <= i ^ 1 i <= i32 -i <= i32 - f32 -i <= i32 - i64 +i <= i32 - f64 +i <= i32 - i +i <= i32 == ok +i <= i32 ? array : false +i <= i32 ? greet : foo +i <= i32 || false ? f32 : i32 i <= i64 -i <= i64 % i32 -i <= i64 / 1 -i <= i64 ? ok : 1 -i <= int(1) -i <= int(i32) -i <= len("bar") -i <= len(array) -i <= max(i) -i <= min(f32) -i <= min(f64) -i <= min(i) -i <= min(i64) -i == -0.5 -i == -1 +i <= i64 * i +i <= i64 + f64 +i <= len(list) +i <= max(0.5) +i <= max(f32, i32) +i <= round(f32) +i <= round(i32) +i <= score(1) i == -f32 i == -f64 i == -i i == -i32 i == -i64 -i == 0.5 + f32 -i == 0.5 - i32 +i == 0.5 ** f64 i == 0.5 == ok -i == 0.5 ? false : true -i == 0.5 ? list : i32 -i == 0.5 ^ 0.5 -i == 1 != true -i == 1 % i -i == 1 * f32 -i == 1 ** 1 -i == 1 ? foo : list -i == 1 || ok -i == abs(0.5) -i == abs(1) -i == div(1, i) +i == 0.5 ? "foo" : f64 +i == 1 * 0.5 +i == 1 ** i64 +i == 1 / 0.5 +i == 1 / f32 +i == 1 ? f32 : 1 +i == 1 ? f64 : f64 +i == 1 ? greet : score +i == abs(i64) +i == bitnot(1) i == f32 -i == f32 * i64 +i == f32 + i +i == f32 == nil +i == f32 ? foo : foo +i == f32 ^ i32 i == f64 -i == f64 != nil -i == f64 + i64 -i == f64 == ok +i == f64 + i32 +i == f64 - i +i == f64 ? i64 : div +i == f64 ? score : foo +i == f64 and ok +i == findIndex(list, true) +i == float(0.5) +i == floor(f32) +i == floor(i32) +i == half(0.5) +i == half(f64) i == i -i == i - f64 -i == i / i32 -i == i ? ok : score -i == i ^ i +i == i + 0.5 +i == i - i32 +i == i == true +i == i ? add : i32 +i == i ? i32 : add +i == i and ok i == i32 -i == i32 ** f32 -i == i32 ** i -i == i32 ? list : foo +i == i32 * 0.5 +i == i32 ** 0.5 +i == i32 + 0.5 +i == i32 + i64 +i == i32 ^ f32 i == i64 -i == i64 != ok -i == i64 + i32 -i == i64 ? array : 0.5 -i == i64 ? score : 1 -i == i64 ^ f64 -i == int(f64) -i == len(array) -i == max(0.5) -i == max(i64) -i == min(i) -i == nil ? false : 1 +i == i64 * 0.5 +i == i64 * f32 +i == i64 ** 0.5 +i == i64 == nil +i == i64 == ok +i == i64 ? list : div +i == len("bar") +i == nil ? 0.5 : div +i == nil ? div : i32 +i == nil and add != nil +i == reduce(array, #) +i == reduce(array, 0.5) i == score(1) -i > -i64 -i > 0.5 * f64 -i > 0.5 ** 0.5 -i > 0.5 / 0.5 -i > 0.5 / 1 -i > 0.5 == nil -i > 0.5 ^ 0.5 -i > 1 ? greet : "bar" -i > 1 ? greet : f64 -i > abs(i64) -i > array[i] +i == score(i) +i > -f32 +i > -f64 +i > -i +i > -i32 +i > 0.5 - 0.5 +i > 0.5 ^ i64 +i > 0.5 or ok +i > 0.5 || ok +i > 1 != ok +i > 1 % i64 +i > 1 ** i32 +i > 1 == ok +i > 1 ? greet : nil +i > 1 ? score : 0.5 +i > 1 ? true : greet +i > bitnot(1) +i > bitor(1, i32) +i > count(array, true) i > f32 +i > f32 ** i32 +i > f32 - f64 +i > f32 ^ 1 i > f64 -i > f64 + 0.5 -i > float(1) -i > half(f64) +i > f64 != ok +i > f64 * 1 +i > f64 * f32 +i > f64 ** i32 +i > f64 ? foo : array +i > f64 ? greet : "bar" +i > first(array) +i > floor(f64) i > i -i > i ** i32 -i > i ** i64 -i > i / i -i > i or ok +i > i % i32 +i > i ** i +i > i + i +i > i ? f32 : i32 i > i32 -i > i32 ? 1 : true -i > i32 ? foo : score -i > i32 ^ i +i > i32 * 1 +i > i32 * i32 +i > i32 + 1 +i > i32 == ok i > i64 -i > int(0.5) -i > int(i) -i > int(i32) -i > max(f32) -i > max(i) -i > min(0.5) -i > score(i) -i > score(len(array)) +i > i64 && f32 < 0.5 +i > i64 + 0.5 +i > i64 - 0.5 +i > i64 - i +i > int(f32) +i > len("bar") +i > reduce(list, i32) i >= -0.5 i >= -1 +i >= -f32 +i >= -i i >= -i32 i >= -i64 -i >= 0.5 ** f64 -i >= 0.5 + i32 -i >= 0.5 - 1 -i >= 0.5 == nil -i >= 0.5 ? div : i -i >= 0.5 ? score : f64 -i >= 1 / i -i >= 1 ? nil : 0.5 -i >= abs(0.5) -i >= abs(i64) +i >= 0.5 / 1 +i >= 0.5 ? i64 : array +i >= 0.5 ? nil : ok +i >= 0.5 ^ i +i >= 1 * i64 +i >= 1 + f32 +i >= 1 == nil +i >= 1 ? f32 : nil +i >= 1 ? ok : false +i >= 1 ^ f64 +i >= bitnot(i) i >= f32 -i >= f32 ** f64 -i >= f32 - i -i >= f32 ? "bar" : array -i >= f32 ? score : half +i >= f32 ? f32 : i +i >= f32 ? true : list i >= f64 -i >= f64 * i32 -i >= f64 + i32 -i >= f64 - i +i >= f64 * 0.5 +i >= f64 - 1 +i >= first(array) +i >= float(0.5) +i >= float(1) +i >= get(array, i64) +i >= half(f64) i >= i -i >= i ** 0.5 -i >= i / 1 -i >= i / i -i >= i == nil -i >= i == ok +i >= i * 1 +i >= i ** f32 +i >= i ? foo : div i >= i32 -i >= i32 ** 0.5 -i >= i32 - f64 -i >= i32 ? f64 : div +i >= i32 ** i64 +i >= i32 ? f32 : div +i >= i32 ^ 1 i >= i64 -i >= i64 * i -i >= i64 ^ 0.5 -i >= int(i32) -i >= len("foo") -i >= min(f32 ^ i64) +i >= int(0.5) +i >= min(0.5) +i >= reduce(array, f64) +i >= reduce(array, i) +i >= reduce(list, 1) +i >= round(1) +i >= score(1) i >= score(i) -i ^ (0.5 * 1) -i ^ (0.5 - 0.5) -i ^ (f32 * 1) -i ^ (f32 * f32) -i ^ (f32 * f64) -i ^ (f32 / f64) -i ^ (i * 1) -i ^ (i - i64) -i ^ (i32 % 1) -i ^ (i32 + i) -i ^ (i32 / 0.5) -i ^ (i64 / 0.5) -i ^ (i64 / 1) -i ^ --f32 +i ^ (1 % i) +i ^ (1 * f64) +i ^ (1 - 0.5) +i ^ (f32 - f64) +i ^ (f64 - 1) +i ^ (i + 0.5) +i ^ (i + i64) +i ^ (i - f32) +i ^ (i32 * i32) +i ^ (i32 + 1) +i ^ (i32 / f32) +i ^ (i32 / i) +i ^ (i64 * 1) i ^ -1 +i ^ -f32 +i ^ -f64 i ^ -i -i ^ -i32 -i ^ -i64 -i ^ 0.5 != 1 + i -i ^ 0.5 * f32 -i ^ 0.5 - i -i ^ 0.5 / f64 -i ^ 0.5 <= f32 -i ^ 0.5 > i64 +i ^ 0.5 ** 0.5 +i ^ 0.5 + i32 +i ^ 0.5 < f64 +i ^ 0.5 < i +i ^ 0.5 <= i64 +i ^ 0.5 > f64 +i ^ 0.5 >= f32 +i ^ 0.5 >= reduce(array, #) i ^ 0.5 ^ f32 -i ^ 1 != f32 -i ^ 1 * f32 -i ^ 1 ** i -i ^ 1 - f32 -i ^ 1 / i32 -i ^ 1 ^ i64 -i ^ abs(1) -i ^ abs(f32) -i ^ abs(i64) -i ^ add(1, 1) -i ^ array[i] +i ^ 0.5 ^ i64 +i ^ 1 * f64 +i ^ 1 / i +i ^ 1 >= f32 +i ^ 1 ^ i +i ^ 1 not in array +i ^ bitnot(i64 + 1) +i ^ bitnot(min(i)) +i ^ ceil(0.5) i ^ f32 -i ^ f32 != 1 - i -i ^ f32 != i64 ? list : i32 -i ^ f32 + f64 -i ^ f32 / i +i ^ f32 ** 1 i ^ f32 < i -i ^ f32 >= i32 +i ^ f32 <= -f32 i ^ f64 -i ^ f64 * i -i ^ f64 >= f64 -i ^ find(array, true) -i ^ float(f64) +i ^ f64 ** 0.5 +i ^ f64 - f64 +i ^ f64 / i32 +i ^ f64 <= f32 +i ^ f64 == i +i ^ f64 > f32 +i ^ find(array, ok) +i ^ floor(i32) +i ^ half(0.5) +i ^ half(1) +i ^ half(f64) i ^ i -i ^ i ** f64 -i ^ i + i32 -i ^ i >= f64 +i ^ i * i +i ^ i * i64 +i ^ i ** i +i ^ i / i i ^ i32 -i ^ i32 - f32 -i ^ i32 == i64 * i -i ^ i32 >= f64 -i ^ i32 >= max(i64) +i ^ i32 / f64 +i ^ i32 in array i ^ i64 -i ^ i64 * i64 -i ^ i64 ** i -i ^ i64 == f32 -i ^ i64 >= i64 ^ f32 -i ^ i64 ^ f64 -i ^ int(f32) -i ^ max(1) -i ^ min(i32) +i ^ i64 != f32 + 1 +i ^ i64 ** f32 +i ^ last(array) +i ^ median(array) +i ^ min(i32, 1) +i ^ reduce(array, #) +i ^ round(i32) i ^ score(1) +i in 1 .. i i in array -i in array == ok -i in array ? f32 : greet -i in array ? foo : false -i in array || ok +i in array != nil +i in array ? nil : 1 +i in groupBy(list, #) +i in groupBy(list, foo) +i in map(array, #) +i in map(array, i64) +i not in 1 .. 1 i not in array -i not in array ? foo : list -i not in array and true +i not in groupBy(array, #) +i not in groupBy(list, #) i not in i64 .. 1 +i not in i64 .. i64 i not in map(array, #) -i not in {"foo": 1}.div +i not in map(list, i32) i32 i32 != -0.5 i32 != -1 i32 != -f32 i32 != -i -i32 != 0.5 && nil == i64 +i32 != -i32 +i32 != -i64 +i32 != 0.5 - 0.5 +i32 != 0.5 - i32 +i32 != 0.5 / f32 +i32 != 0.5 ^ 0.5 +i32 != 0.5 ^ i64 +i32 != 0.5 || ok +i32 != 1 % i64 i32 != 1 && ok -i32 != 1 * i64 -i32 != 1 + 1 -i32 != 1 / 1 -i32 != 1 ? 0.5 : greet -i32 != 1 ? false : i64 -i32 != 1 ? greet : half -i32 != 1 ? greet : ok -i32 != abs(i64) -i32 != array[i] -i32 != count(array, ok) +i32 != 1 * f32 +i32 != 1 ? "foo" : array +i32 != 1 ? greet : "foo" +i32 != array[i64] +i32 != bitnot(i) +i32 != bitnot(i64) +i32 != ceil(1) +i32 != ceil(f64) +i32 != count(array, false) i32 != f32 -i32 != f32 && ok -i32 != f32 / f64 -i32 != f32 ? f64 : i32 -i32 != f32 and ok +i32 != f32 == true +i32 != f32 ? false : 0.5 +i32 != f32 ? i : 0.5 i32 != f64 -i32 != f64 == true -i32 != findIndex(list, false) -i32 != first(array) -i32 != float(i) -i32 != get(array, i64) -i32 != half(f64) +i32 != f64 ** i +i32 != f64 - 1 +i32 != f64 ? 1 : add +i32 != findLastIndex(array, false) +i32 != get(array, 1) +i32 != half(1) i32 != i -i32 != i ** 1 -i32 != i ** f64 +i32 != i + 1 i32 != i32 -i32 != i32 * 1 -i32 != i32 - 0.5 -i32 != i32 ? array : add +i32 != i32 ** 0.5 +i32 != i32 + 0.5 +i32 != i32 ^ i64 i32 != i64 -i32 != i64 % i32 -i32 != i64 * 0.5 -i32 != i64 ? div : nil -i32 != i64 ? true : nil -i32 != int(f32) -i32 != max(1) -i32 != max(f64, 0.5) -i32 != min(1, 0.5, f64) -i32 != min(i) -i32 != nil ? half : 1 -i32 != nil ? list : half(nil) -i32 % -i +i32 != i64 * i64 +i32 != i64 / 0.5 +i32 != i64 / f32 +i32 != len(list) +i32 != max(f64) +i32 != min(1) +i32 != min(i32) +i32 != nil != false +i32 != nil ? f64 : "foo" +i32 != reduce(array, #) +i32 != reduce(array, i) +i32 != reduce(list, f32) +i32 != round(1) +i32 % -1 i32 % -i32 -i32 % 1 != i64 -i32 % 1 % (i64 + i64) -i32 % 1 % i64 -i32 % 1 * f64 -i32 % 1 + f64 +i32 % 1 % i32 +i32 % 1 * f32 +i32 % 1 * i +i32 % 1 * i32 +i32 % 1 .. i +i32 % 1 / 0.5 +i32 % 1 / i32 i32 % 1 > i -i32 % add(1, 1) -i32 % count(list, ok) +i32 % array[i64] +i32 % get(array, 1) i32 % i -i32 % i != f32 +i32 % i != i +i32 % i < i i32 % i32 -i32 % i32 != i -i32 % i32 * f32 -i32 % i32 * i +i32 % i32 != f64 +i32 % i32 * i64 +i32 % i32 == i32 +i32 % i32 >= i64 i32 % i64 -i32 % i64 != f32 -i32 % i64 / i32 -i32 % i64 == i -i32 % i64 >= i64 -i32 % min(1, i64) -i32 % min(i) +i32 % i64 % i +i32 % i64 * i64 +i32 % i64 + i +i32 % i64 .. i +i32 % i64 / i +i32 % i64 == f64 +i32 % max(i32) +i32 % reduce(array, #) +i32 % score(1) +i32 * (1 + f32) +i32 * (1 + f64) i32 * (f32 + 1) -i32 * (f32 + f32) -i32 * (f32 + i) -i32 * (f64 - f32) -i32 * (i32 - 0.5) +i32 * (f32 - i) +i32 * (f64 + 0.5) +i32 * (f64 + i) +i32 * (i - f32) +i32 * (i32 + i64) +i32 * (i32 - 1) i32 * (i32 - f64) -i32 * (i32 - i64) +i32 * -0.5 +i32 * -1 i32 * -f32 -i32 * -f64 -i32 * -i -i32 * 0.5 ** 0.5 -i32 * 0.5 + f64 -i32 * 0.5 <= f32 -i32 * 1 % i64 -i32 * 1 * f32 -i32 * 1 * i32 -i32 * 1 < i -i32 * array[i32] -i32 * count(array, true) +i32 * -i32 +i32 * -i64 +i32 * 0.5 * 0.5 +i32 * 0.5 / 0.5 +i32 * 0.5 / 1 +i32 * 0.5 / i32 +i32 * 0.5 == f64 +i32 * 0.5 == i64 +i32 * 0.5 ^ f64 +i32 * 0.5 ^ i32 +i32 * 1 * i +i32 * 1 ** i64 +i32 * 1 + f64 +i32 * 1 - i64 +i32 * 1 > half(0.5) +i32 * 1 ^ 1 +i32 * abs(i32) +i32 * bitnot(i32) +i32 * ceil(1) i32 * f32 -i32 * f32 != i +i32 * f32 + f32 +i32 * f32 / i +i32 * f32 <= f64 +i32 * f32 <= i32 +i32 * f32 ^ f32 i32 * f64 -i32 * f64 * i -i32 * f64 + f32 -i32 * f64 / i -i32 * f64 > i32 +i32 * f64 * 1 +i32 * f64 >= f32 +i32 * first(array) +i32 * float(f32) +i32 * float(f64) +i32 * floor(f64) +i32 * half(0.5) +i32 * half(1) i32 * i -i32 * i != i32 -i32 * i * 0.5 -i32 * i .. i -i32 * i / array[i32] -i32 * i / i32 +i32 * i / -i +i32 * i / f32 i32 * i / i64 +i32 * i < f32 i32 * i32 -i32 * i32 % i32 -i32 * i32 * 0.5 -i32 * i32 ** 1 -i32 * i32 - f32 -i32 * i32 == i32 +i32 * i32 != f64 +i32 * i32 % i64 / i +i32 * i32 / i64 +i32 * i32 < i64 +i32 * i32 >= f32 i32 * i64 i32 * i64 % 1 -i32 * i64 .. i -i32 * i64 / 1 -i32 * i64 / i32 -i32 * int(f32) -i32 * max(f64) +i32 * i64 % 1 % 1 +i32 * i64 ** i64 +i32 * i64 / f32 +i32 * i64 < i +i32 * len("foo") +i32 * max(i32) i32 * max(i64) -i32 * min(1) -i32 ** (0.5 * 0.5) -i32 ** (0.5 + 0.5) -i32 ** (0.5 + i32) -i32 ** (0.5 / f64) -i32 ** (f32 / i) -i32 ** (f64 + 0.5) -i32 ** (i + 1) -i32 ** (i64 - i) -i32 ** -1 ^ i32 -i32 ** -f32 -i32 ** -i32 +i32 * median(array) +i32 * min(0.5) +i32 * min(i) +i32 * reduce(array, #) +i32 * round(i) +i32 * score(1) +i32 * score(i) +i32 ** (0.5 - i32) +i32 ** (1 * i64) +i32 ** (1 / 0.5) +i32 ** (f32 * i64) +i32 ** (i % i32) +i32 ** (i - i) +i32 ** (i - i32) +i32 ** (i / 0.5) +i32 ** (i32 / i64) +i32 ** (i64 + 0.5) +i32 ** (i64 - 1) +i32 ** -1 +i32 ** -f64 +i32 ** -i i32 ** -i64 -i32 ** 0.5 / f32 -i32 ** 0.5 <= i32 +i32 ** 0.5 * i64 +i32 ** 0.5 - f64 +i32 ** 0.5 / reduce(array, #) i32 ** 0.5 ^ i i32 ** 1 ** i64 -i32 ** 1 + f64 -i32 ** 1 + i64 -i32 ** 1 - f32 -i32 ** 1 >= i64 * 0.5 -i32 ** 1 ^ f64 -i32 ** array[i] +i32 ** 1 + f32 +i32 ** 1 / i64 +i32 ** 1 <= i +i32 ** 1 ^ i64 +i32 ** 1 in array +i32 ** array[1] +i32 ** array[i64] +i32 ** bitnot(i64) +i32 ** ceil(1) +i32 ** ceil(f64) i32 ** f32 -i32 ** f32 ** i -i32 ** f32 == i64 +i32 ** f32 / score(1) +i32 ** f32 < f32 +i32 ** f32 <= i +i32 ** f32 == f32 i32 ** f64 -i32 ** f64 != i64 ? i : half -i32 ** f64 + f64 -i32 ** f64 >= i -i32 ** f64 ^ f32 -i32 ** float(1) -i32 ** float(f64) +i32 ** f64 == f32 +i32 ** f64 > i +i32 ** find(array, ok) +i32 ** float(i32) i32 ** half(0.5) +i32 ** half(1) +i32 ** half(f64) i32 ** i -i32 ** i ** 0.5 -i32 ** i ^ 0.5 +i32 ** i * f64 +i32 ** i ** i +i32 ** i ^ i i32 ** i32 +i32 ** i32 ^ i64 i32 ** i64 -i32 ** i64 != 0.5 == true -i32 ** i64 - f64 -i32 ** i64 / f64 -i32 ** i64 / i -i32 ** i64 > i -i32 ** i64 ^ 1 -i32 ** i64 ^ i -i32 ** int(0.5) -i32 ** int(f64) -i32 ** len(array) -i32 ** min(f64) -i32 ** min(i32) -i32 ** score(1) -i32 ** score(i) +i32 ** int(1) +i32 ** int(i32) +i32 ** len("foo") +i32 ** len(list) +i32 ** max(f32, i32) +i32 ** min(0.5) +i32 ** min(i64) +i32 ** reduce(array, 1) +i32 ** reduce(array, i64) +i32 ** reduce(list, i64) +i32 ** round(i64) +i32 ** sum(array) i32 + -0.5 i32 + -1 -i32 + -f32 -i32 + -f64 i32 + -i i32 + -i32 -i32 + 0.5 * 0.5 -i32 + 0.5 * i32 +i32 + -i64 +i32 + 0.5 != f32 +i32 + 0.5 != i32 +i32 + 0.5 * i +i32 + 0.5 + 0.5 i32 + 0.5 + 1 +i32 + 0.5 + f32 +i32 + 0.5 + f64 +i32 + 0.5 + i i32 + 0.5 + i64 -i32 + 0.5 - 0.5 -i32 + 0.5 - f32 -i32 + 0.5 <= i -i32 + 0.5 > i % 1 -i32 + 0.5 >= i -i32 + 1 / f64 -i32 + 1 < i32 -i32 + 1 ^ i -i32 + 1 ^ i32 -i32 + abs(i32) -i32 + count(array, false) +i32 + 0.5 / i64 +i32 + 0.5 <= -f32 +i32 + 1 % 1 +i32 + 1 + i64 +i32 + 1 - f32 +i32 + 1 - i +i32 + 1 - i64 +i32 + 1 / i +i32 + 1 ^ f32 +i32 + abs(f32) +i32 + array[i64] +i32 + bitnot(i32) +i32 + ceil(i) i32 + f32 +i32 + f32 / i +i32 + f32 < i32 +i32 + f32 <= i64 i32 + f64 i32 + f64 * 1 -i32 + f64 * f64 -i32 + f64 ** 0.5 -i32 + f64 - f32 * 0.5 -i32 + f64 == i32 -i32 + f64 >= i +i32 + f64 * i32 +i32 + f64 > i32 +i32 + f64 ^ 0.5 i32 + f64 ^ i32 -i32 + find(array, ok) +i32 + findIndex(list, true) +i32 + floor(0.5) +i32 + floor(f64) i32 + i -i32 + i * 1 -i32 + i - f32 -i32 + i > half(f64) -i32 + i >= -1 +i32 + i + f64 +i32 + i + i64 +i32 + i - 0.5 +i32 + i - i64 +i32 + i <= i32 +i32 + i > i64 i32 + i32 -i32 + i32 ** 0.5 -i32 + i32 >= f32 -i32 + i32 ^ i64 +i32 + i32 + f64 +i32 + i32 <= i + i64 +i32 + i32 > i +i32 + i32 > i32 i32 + i64 -i32 + i64 + i64 -i32 + i64 / f64 -i32 + i64 <= f32 -i32 + i64 ^ f32 -i32 + i64 not in array -i32 + int(f64) -i32 + last(array) -i32 + len("foo") -i32 + len(list) -i32 + min(0.5, i32) -i32 + min(1, i) -i32 + min(i) -i32 + min(i, i32) +i32 + i64 % i32 +i32 + i64 ** 1 +i32 + i64 - 0.5 +i32 + i64 - f32 +i32 + i64 / 0.5 +i32 + i64 ^ 1 +i32 + int(i64) +i32 + len("bar") +i32 + min(i32) +i32 + reduce(array, #) +i32 + round(f32) +i32 + round(i32) i32 + score(i) i32 - -0.5 i32 - -1 i32 - -f32 -i32 - -i32 -i32 - -i64 -i32 - 0.5 * 0.5 -i32 - 0.5 * i64 -i32 - 0.5 + i -i32 - 0.5 + i32 -i32 - 0.5 - f32 -i32 - 0.5 < i32 -i32 - 0.5 <= f64 -i32 - 1 != f32 -i32 - 1 * f32 -i32 - 1 ** i32 -i32 - 1 / 0.5 -i32 - 1 <= i64 -i32 - 1 not in array -i32 - array[1] +i32 - -i +i32 - 0.5 * f32 +i32 - 0.5 + half(0.5) +i32 - 0.5 - i32 +i32 - 0.5 <= f32 +i32 - 0.5 ^ 0.5 +i32 - 1 ** i +i32 - 1 + 0.5 +i32 - 1 > -i64 +i32 - abs(i32) +i32 - abs(i64) +i32 - array[i] +i32 - bitushr(i32, i64) +i32 - div(1, i) +i32 - div(i, i) i32 - f32 -i32 - f32 * f32 -i32 - f32 ** f64 -i32 - f32 + 0.5 -i32 - f32 / f64 +i32 - f32 * 0.5 +i32 - f32 + i32 +i32 - f32 - int(f64) +i32 - f32 / i32 +i32 - f32 < i64 +i32 - f32 <= f32 +i32 - f32 <= i32 +i32 - f32 > i +i32 - f32 >= f32 i32 - f64 -i32 - f64 ** f64 -i32 - f64 + 0.5 -i32 - f64 - i64 -i32 - f64 / i64 -i32 - f64 < i64 -i32 - first(array) -i32 - float(i) -i32 - get(array, i64) +i32 - f64 + f32 +i32 - float(0.5) +i32 - float(1) +i32 - float(f64) +i32 - floor(1) +i32 - floor(f64) +i32 - get(array, i) +i32 - half(0.5) +i32 - half(f64) i32 - i -i32 - i % i -i32 - i + f32 -i32 - i - 1 -i32 - i / i -i32 - i <= i64 -i32 - i == i +i32 - i ** i64 +i32 - i + i32 +i32 - i / 0.5 +i32 - i == f32 i32 - i > f64 -i32 - i >= f64 +i32 - i > i +i32 - i >= i64 i32 - i32 -i32 - i32 ** 0.5 -i32 - i32 <= i32 + i64 -i32 - i32 ^ 1 +i32 - i32 != i64 +i32 - i32 * 1 +i32 - i32 * i32 +i32 - i32 + 1 +i32 - i32 < i32 +i32 - i32 > i64 +i32 - i32 > i64 / i i32 - i64 -i32 - i64 % i -i32 - i64 % i64 -i32 - i64 .. i -i32 - i64 <= i -i32 - i64 ^ 0.5 -i32 - i64 ^ f64 -i32 - int(1) -i32 - int(f64) -i32 - max(i64) -i32 - max(i64, i) -i32 - min(0.5) -i32 - score(i) -i32 .. -1 -i32 .. -i -i32 .. -i32 +i32 - i64 != -f32 +i32 - i64 / 1 +i32 - i64 == f64 +i32 - len(array) +i32 - len(list) +i32 - max(f32) +i32 - score(1) i32 .. -i64 -i32 .. 1 - 1 -i32 .. abs(i) -i32 .. array[i32] -i32 .. count(array, ok) +i32 .. abs(i64) +i32 .. bitnot(i64) +i32 .. bitushr(i, 1) +i32 .. count(array, true) +i32 .. div(i, 1) i32 .. i -i32 .. i - 1 i32 .. i32 -i32 .. i32 != list i32 .. i64 -i32 .. i64 - i32 -i32 .. int(0.5) -i32 .. len(list) -i32 .. min(1) -i32 .. min(1, 0.5) -i32 .. min(i32) -i32 .. min(i64) +i32 .. int(f32) +i32 .. len("foo") +i32 .. max(1) +i32 .. max(i32) +i32 .. max(i32, 0.5) i32 .. score(i) -i32 / (0.5 + i32) -i32 / (1 + f32) -i32 / (1 - f32) -i32 / (1 - i) -i32 / (f32 + i) -i32 / (f32 - f64) -i32 / (f64 + 0.5) -i32 / (f64 - 1) -i32 / (i32 - 1) +i32 / (1 + 1) +i32 / (1 + i64) +i32 / (f64 - i64) +i32 / (i32 + i64) +i32 / (i64 + 0.5) i32 / -0.5 -i32 / -1 i32 / -f32 i32 / -i i32 / -i32 +i32 / -i64 i32 / 0.5 * i +i32 / 0.5 * i / 1 +i32 / 0.5 + i64 +i32 / 0.5 - i32 +i32 / 0.5 / i32 i32 / 0.5 / i64 -i32 / 0.5 >= f64 -i32 / 1 != f64 -i32 / 1 < i32 +i32 / 0.5 >= i64 +i32 / 0.5 ^ 1 +i32 / 0.5 ^ f64 +i32 / 1 != i +i32 / 1 * i64 +i32 / 1 ** 1 +i32 / 1 ^ 0.5 i32 / abs(0.5) +i32 / abs(1) +i32 / abs(f64) +i32 / abs(i32) +i32 / array[1] +i32 / ceil(i32) i32 / f32 +i32 / f32 ** 1 +i32 / f32 / i64 +i32 / f32 <= i32 +i32 / f32 <= i64 +i32 / f32 >= i32 == false i32 / f64 -i32 / f64 * i32 +i32 / f64 != f64 +i32 / f64 != i64 +i32 / f64 * 1 +i32 / f64 - i32 +i32 / f64 == i64 i32 / f64 >= f32 -i32 / half(f64) +i32 / find(array, ok) +i32 / float(f32) +i32 / floor(1) +i32 / floor(f64) +i32 / half(0.5) i32 / i -i32 / i <= i +i32 / i * i32 +i32 / i ^ i32 i32 / i32 -i32 / i32 * 1 -i32 / i32 / f32 / f64 +i32 / i32 * f64 i32 / i32 / i64 +i32 / i32 <= i64 i32 / i64 -i32 / i64 != i64 -i32 / i64 * i -i32 / i64 / i -i32 / i64 == f32 -i32 / i64 == f64 -i32 / int(i) -i32 / len("bar") +i32 / i64 ** f32 +i32 / i64 ^ 0.5 +i32 / int(1) i32 / len("foo") -i32 / max(i32) +i32 / max(1) +i32 / max(i) i32 / min(f32) -i32 / min(f64) -i32 / min(i) -i32 / min(i32) -i32 < -(i - f32) -i32 < -0.5 +i32 / reduce(array, #) +i32 / score(i) i32 < -f32 +i32 < -f64 i32 < -i32 i32 < 0.5 ** i32 +i32 < 0.5 - 1 i32 < 0.5 - f32 -i32 < 0.5 ^ 1 -i32 < 1 % 1 -i32 < 1 ** 1 -i32 < 1 + 0.5 -i32 < 1 + 1 -i32 < 1 ? "foo" : i32 -i32 < 1 ? 1 : 0.5 -i32 < 1 ^ i32 -i32 < abs(i64) -i32 < div(1, 1) +i32 < 0.5 / 1 +i32 < 0.5 == nil +i32 < 0.5 ? "foo" : half +i32 < 0.5 ? foo : 1 +i32 < 0.5 or ok +i32 < 0.5 || ok +i32 < 1 * f32 +i32 < 1 + i64 +i32 < 1 / f32 +i32 < 1 ^ i +i32 < abs(f64) i32 < f32 -i32 < f32 == nil -i32 < f32 ? div : true -i32 < f32 || i64 != f32 +i32 < f32 * i +i32 < f32 - 0.5 +i32 < f32 - 1 i32 < f64 -i32 < f64 != nil -i32 < f64 != true -i32 < f64 * f32 -i32 < f64 == nil -i32 < f64 ? f32 : half -i32 < f64 ? greet : false -i32 < f64 ? list : i32 -i32 < f64 ^ f32 -i32 < f64 || 1 < 1 -i32 < float(i) -i32 < float(i32) -i32 < half(0.5) +i32 < f64 * i64 +i32 < float(reduce(array, f32)) +i32 < get(array, i32) +i32 < get(array, i64) +i32 < half(1) +i32 < half(f64) i32 < i -i32 < i != true -i32 < i ^ 0.5 +i32 < i ** i64 +i32 < i + 0.5 +i32 < i / i32 +i32 < i ? score : score i32 < i32 -i32 < i32 != ok -i32 < i32 * f32 -i32 < i32 / i32 -i32 < i32 ? ok : 1 +i32 < i32 % i +i32 < i32 ** 1 +i32 < i32 - f32 +i32 < i32 ^ i64 i32 < i64 -i32 < i64 - 0.5 -i32 < i64 ^ f64 +i32 < i64 ** 0.5 +i32 < i64 + f32 +i32 < i64 / f64 i32 < int(0.5) -i32 < int(i32) -i32 < int(i64) -i32 < max(0.5) -i32 < max(1) -i32 < min(1, i32) +i32 < last(array) +i32 < min(1) i32 < min(f64) -i32 < min(i) -i32 < min(i64) +i32 < min(i32) i32 < score(1) +i32 < score(i) i32 <= -0.5 i32 <= -f32 i32 <= -i i32 <= -i32 -i32 <= 0.5 != nil -i32 <= 0.5 != ok -i32 <= 0.5 * 0.5 -i32 <= 0.5 * i -i32 <= 0.5 + i64 -i32 <= 1 ? i : f32 -i32 <= 1 ? true : true -i32 <= 1 or 0.5 == 0.5 -i32 <= abs(i32) -i32 <= count(list, ok) +i32 <= -i64 +i32 <= 0.5 - f64 +i32 <= 0.5 == nil +i32 <= 0.5 ? i32 : greet +i32 <= 0.5 ? i32 : half +i32 <= 0.5 ^ i64 +i32 <= 0.5 and ok +i32 <= 1 + i32 +i32 <= 1 + i64 +i32 <= 1 ^ 0.5 +i32 <= 1 and ok +i32 <= 1 || i32 >= i32 +i32 <= abs(1) i32 <= f32 -i32 <= f32 * i64 -i32 <= f32 / 0.5 -i32 <= f32 ^ i64 +i32 <= f32 != ok i32 <= f64 +i32 <= f64 != ok i32 <= f64 * i -i32 <= f64 ^ 1 -i32 <= float(i) +i32 <= f64 == ok +i32 <= f64 ^ f64 +i32 <= findIndex(array, true) +i32 <= float(i32) +i32 <= floor(0.5) i32 <= half(0.5) +i32 <= half(1) +i32 <= half(f64) i32 <= i -i32 <= i % i64 +i32 <= i * 1 +i32 <= i * i64 +i32 <= i - 0.5 i32 <= i32 -i32 <= i32 != nil -i32 <= i32 % 1 -i32 <= i32 ** f64 +i32 <= i32 != true i32 <= i64 -i32 <= i64 != false -i32 <= i64 != ok -i32 <= i64 + f32 -i32 <= i64 ? div : nil -i32 <= last(array) -i32 <= len(array) -i32 <= len(list) -i32 <= max(f64) -i32 <= min(i) +i32 <= i64 / 1 +i32 <= len("foo") +i32 <= max(i64) +i32 <= mean(array) +i32 <= round(0.5) i32 <= score(1) i32 <= score(i) i32 == -0.5 i32 == -1 +i32 == -f32 i32 == -f64 i32 == -i -i32 == -i64 -i32 == 0.5 / f64 -i32 == 0.5 ? half : array -i32 == 0.5 ^ i -i32 == 0.5 ^ i64 -i32 == 1 ** 1 -i32 == 1 ** i -i32 == 1 || f32 < f64 +i32 == 0.5 != false +i32 == 0.5 * f32 +i32 == 0.5 / 0.5 +i32 == 1 % 1 +i32 == 1 + f32 +i32 == 1 - i +i32 == 1 ? div : div +i32 == 1 ^ 0.5 +i32 == 1 ^ f64 +i32 == abs(f64) +i32 == abs(i) +i32 == bitnot(1) +i32 == bitnot(i) +i32 == ceil(1) +i32 == count(list, ok) i32 == f32 -i32 == f32 ? f32 : nil -i32 == f32 ? half : "bar" -i32 == f32 ? score : false -i32 == f32 or ok +i32 == f32 * i32 +i32 == f32 ** 1 +i32 == f32 - f32 +i32 == f32 ? f64 : list +i32 == f32 ? i64 : true +i32 == f32 ? score : "bar" i32 == f64 -i32 == f64 != ok -i32 == f64 * 0.5 -i32 == f64 ** f32 -i32 == f64 ** i64 -i32 == f64 ? add : half -i32 == findLastIndex(array, ok) -i32 == float(i) -i32 == half(0.5) +i32 == f64 ** 0.5 +i32 == find(array, 0.5 == i64) +i32 == first(array) +i32 == floor(f64) +i32 == half(f64) i32 == i -i32 == i % i64 -i32 == i ? "foo" : greet -i32 == i ? type(false) : array -i32 == i ^ f64 -i32 == i and ok -i32 == i || ok +i32 == i ** f64 +i32 == i ? half : 1 +i32 == i ? i : "bar" i32 == i32 -i32 == i32 ? add : add -i32 == i32 ? f32 : f64 -i32 == i32 ^ 1 +i32 == i32 && i == i +i32 == i32 - 1 +i32 == i32 - i64 i32 == i64 -i32 == i64 + f32 -i32 == i64 ? foo : list -i32 == len(list) -i32 == max(0.5) -i32 == min(f32) -i32 == min(i32) -i32 == nil ? f32 : add -i32 == nil and ok -i32 == {"foo": f32, "foo": list}?.String?.Qux +i32 == i64 * f32 +i32 == i64 ? "foo" : 1 +i32 == i64 or ok +i32 == int(f64) +i32 == int(i) +i32 == nil ? f32 : 0.5 +i32 == reduce(array, #) +i32 == round(i32) +i32 == round(i64) +i32 == score(1) i32 > -0.5 -i32 > -1 -i32 > -f32 i32 > -f64 -i32 > -i i32 > -i32 -i32 > -i64 -i32 > 0.5 != ok i32 > 0.5 != true i32 > 0.5 * f64 -i32 > 0.5 ** f32 +i32 > 0.5 ** 0.5 +i32 > 0.5 ** 1 i32 > 0.5 ** i -i32 > 0.5 + 0.5 -i32 > 0.5 + 1 -i32 > 0.5 - 1 -i32 > 0.5 / i64 -i32 > 0.5 == nil -i32 > 0.5 ? greet : f32 -i32 > 0.5 ? ok : false -i32 > 0.5 ^ f32 -i32 > 1 ** f64 -i32 > 1 - i -i32 > 1 / 1 -i32 > 1 ? i : add -i32 > 1 || ok -i32 > abs(1) -i32 > abs(f64) -i32 > array[1] -i32 > array[i32] +i32 > 0.5 - i +i32 > 0.5 / 1 +i32 > 0.5 == ok +i32 > 0.5 ^ 1 +i32 > 0.5 || ok +i32 > 1 * f64 +i32 > 1 * i32 +i32 > 1 + i64 +i32 > 1 ? f32 : f64 +i32 > 1 ? i : "bar" +i32 > 1 ? i64 : div +i32 > ceil(0.5) +i32 > ceil(1) +i32 > count(array, ok) i32 > f32 -i32 > f32 != ok -i32 > f32 && "bar" == nil i32 > f32 * i64 -i32 > f32 ? "bar" : half +i32 > f32 + 0.5 +i32 > f32 + 1 +i32 > f32 - f32 +i32 > f32 - i32 +i32 > f32 ^ 0.5 i32 > f64 -i32 > f64 * 0.5 -i32 > f64 - 1 -i32 > f64 / 1 -i32 > f64 / i32 -i32 > f64 == nil -i32 > f64 == ok -i32 > f64 == true -i32 > f64 ? 0.5 : add -i32 > f64 ^ i64 -i32 > float(i) -i32 > float(i32) -i32 > half(0.5) -i32 > half(f64) +i32 > f64 ** i32 +i32 > f64 + f64 +i32 > get(array, i32) +i32 > half(1) +i32 > half(half(1)) i32 > i +i32 > i != ok i32 > i + f32 -i32 > i / f32 +i32 > i ? i : i i32 > i ^ i32 i32 > i32 -i32 > i32 - 0.5 -i32 > i32 ? "bar" : div -i32 > i32 ? array : 0.5 -i32 > i32 ? foo : 1 +i32 > i32 - i +i32 > i32 == nil ? score : i +i32 > i32 ? score : 1 +i32 > i32 ^ 1 +i32 > i32 ^ i32 i32 > i64 +i32 > i64 != false i32 > i64 ** f32 -i32 > i64 + f64 -i32 > i64 - i -i32 > i64 ? list : list -i32 > int(i) +i32 > i64 / 1 +i32 > i64 == ok +i32 > i64 || ok +i32 > int(1) i32 > int(i64) -i32 > max(i) -i32 > min(0.5) -i32 > score(1) -i32 >= -0.5 +i32 > min(i32) +i32 > reduce(array, #) +i32 > round(i64) +i32 > score(i) i32 >= -1 +i32 >= -f32 +i32 >= -f64 i32 >= -i -i32 >= 0.5 ** 0.5 -i32 >= 0.5 ^ f32 -i32 >= 0.5 || ok -i32 >= 1 && ok -i32 >= abs(i) -i32 >= abs(i64) -i32 >= array[i] +i32 >= -i64 +i32 >= 0.5 != not true +i32 >= 0.5 == true +i32 >= 0.5 ? 0.5 : half +i32 >= 0.5 ^ 0.5 +i32 >= 0.5 ^ i32 +i32 >= 1 % i +i32 >= 1 * 0.5 +i32 >= 1 * i32 +i32 >= 1 + i64 +i32 >= 1 - 1 +i32 >= 1 == ok +i32 >= 1 ? 1 : false +i32 >= 1 ? add : 1 +i32 >= abs(0.5) +i32 >= abs(f32) +i32 >= bitnot(1 + i) +i32 >= bitnot(i64) +i32 >= ceil(1) +i32 >= ceil(f32) +i32 >= count(list, true) i32 >= f32 -i32 >= f32 != true -i32 >= f32 - 0.5 -i32 >= f32 ^ 0.5 +i32 >= f32 ** f32 +i32 >= f32 ^ 1 i32 >= f64 -i32 >= f64 && nil == 0.5 -i32 >= f64 - f64 -i32 >= f64 / 1 -i32 >= f64 ? f32 : list -i32 >= f64 ^ 1 -i32 >= float(1) +i32 >= f64 != false +i32 >= f64 ** f64 +i32 >= f64 / i64 +i32 >= f64 ? half : f64 +i32 >= f64 ^ f64 +i32 >= float(0.5) +i32 >= floor(1) +i32 >= floor(f32) i32 >= half(0.5) -i32 >= half(f64) i32 >= i +i32 >= i % 1 i32 >= i % i64 -i32 >= i ** i32 -i32 >= i / i -i32 >= i ? div : list -i32 >= i ? foo : 0.5 +i32 >= i / i32 +i32 >= i / i64 +i32 >= i == ok i32 >= i32 +i32 >= i32 ** i32 i32 >= i64 -i32 >= i64 != ok -i32 >= i64 ** i64 -i32 >= i64 / i64 -i32 >= i64 ? list : greet -i32 >= i64 ^ i32 +i32 >= i64 != false +i32 >= i64 - i64 +i32 >= i64 / i32 +i32 >= i64 ? 0.5 : 0.5 +i32 >= i64 ? div : half +i32 >= i64 ? half : i64 +i32 >= i64 and ok i32 >= int(i64) i32 >= last(array) -i32 >= len(array) i32 >= min(i32) +i32 >= reduce(array, #) +i32 >= reduce(array, i64) +i32 >= reduce(list, i32) +i32 >= round(f32) i32 >= score(1) -i32 >= score(i) -i32 ^ (f32 + i64) -i32 ^ (f64 + 0.5) -i32 ^ (i - f64) -i32 ^ (i32 + f32) -i32 ^ (i64 % i) -i32 ^ (i64 * 0.5) -i32 ^ (i64 + f32) -i32 ^ (i64 - f64) -i32 ^ --0.5 +i32 ^ (0.5 + 1) +i32 ^ (1 - i) +i32 ^ (i + 1) +i32 ^ (i / f64) +i32 ^ (i32 + 0.5) +i32 ^ (i32 - f32) +i32 ^ (i64 + i) i32 ^ -0.5 +i32 ^ -1 i32 ^ -f64 +i32 ^ -i i32 ^ -i32 -i32 ^ 0.5 ** i -i32 ^ 0.5 + i32 -i32 ^ 0.5 - i -i32 ^ 0.5 < i +i32 ^ -i64 +i32 ^ 0.5 != f32 +i32 ^ 0.5 != f64 +i32 ^ 0.5 * i +i32 ^ 0.5 ** i64 +i32 ^ 0.5 - f32 +i32 ^ 0.5 / i32 i32 ^ 0.5 == i64 -i32 ^ abs(1) +i32 ^ 0.5 >= f64 +i32 ^ 1 ** i32 +i32 ^ 1 + i32 +i32 ^ 1 - f64 +i32 ^ 1 < f64 +i32 ^ 1 ^ (1 + i64) +i32 ^ 1 ^ f32 +i32 ^ array[i64] i32 ^ f32 -i32 ^ f32 * i64 -i32 ^ f32 ** 0.5 -i32 ^ f32 ** i -i32 ^ f32 < 0.5 * i -i32 ^ f32 ^ i +i32 ^ f32 / bitnot(1) +i32 ^ f32 >= max(f64) i32 ^ f64 -i32 ^ f64 ^ 1 -i32 ^ float(f32) -i32 ^ half(0.5) -i32 ^ half(f64) +i32 ^ f64 + i +i32 ^ find(array, true) +i32 ^ first(array) +i32 ^ float(i64) i32 ^ i -i32 ^ i + i32 -i32 ^ i - f32 +i32 ^ i * f64 +i32 ^ i + i64 i32 ^ i <= f32 -i32 ^ i ^ 1 i32 ^ i32 -i32 ^ i32 ** f32 -i32 ^ i32 ** f64 -i32 ^ i32 + i32 -i32 ^ i32 + i64 -i32 ^ i32 <= i64 +i32 ^ i32 * f64 +i32 ^ i32 ** i i32 ^ i64 -i32 ^ i64 - f32 -i32 ^ max(0.5) -i32 ^ max(1) -i32 ^ max(i) -i32 ^ min(f32) -i32 ^ score(1) +i32 ^ i64 == f64 +i32 ^ i64 > -f64 +i32 ^ len(list) +i32 ^ mean(array) +i32 ^ min(i) +i32 ^ reduce(array, #) +i32 ^ reduce(list, 1) +i32 in [0.5] i32 in array +i32 in array || ok +i32 in groupBy(array, #) +i32 in groupBy(array, f32) +i32 in groupBy(list, #) +i32 in groupBy(list, #?.Bar) +i32 in groupBy(list, foo).i +i32 in i32 .. 1 +i32 in i32 .. i64 i32 in map(array, #) +i32 in map(list, 0.5) +i32 in map(list, i32) +i32 not in 1 .. i i32 not in array -i32 not in array ? score : score -i32 not in map(array, #) -i32 not in map(array, 1) +i32 not in array ? array : array +i32 not in filter(array, ok) +i32 not in groupBy(list, #) i64 -i64 != -0.5 i64 != -1 -i64 != -f32 -i64 != -f64 i64 != -i -i64 != 0.5 != nil -i64 != 0.5 != ok -i64 != 0.5 != true -i64 != 0.5 * 1 -i64 != 0.5 ? false : i64 -i64 != 0.5 ^ 1 -i64 != 0.5 and f64 == 1 -i64 != 1 || f64 < i -i64 != 1 || ok +i64 != -i64 +i64 != 0.5 && ok +i64 != 0.5 * 0.5 +i64 != 0.5 * i +i64 != 0.5 + 0.5 +i64 != 0.5 + i +i64 != 0.5 - 0.5 +i64 != 0.5 / i64 +i64 != 0.5 ? i : 1 +i64 != 0.5 ^ i32 +i64 != 1 * f64 +i64 != 1 - 1 i64 != abs(f64) +i64 != array[i64] +i64 != bitnot(i32) i64 != f32 -i64 != f32 + f32 -i64 != f32 / f32 -i64 != f32 ? div : 1 -i64 != f32 ? f64 : i64 -i64 != f32 ^ i +i64 != f32 + i64 i64 != f64 -i64 != f64 != false -i64 != f64 - i32 -i64 != f64 / i32 -i64 != f64 / i64 -i64 != f64 ? 0.5 : score -i64 != f64 ? i64 : true -i64 != findLast(array, false) -i64 != first(array) -i64 != float(i32) -i64 != get(array, i64) +i64 != f64 * 1 +i64 != f64 == true +i64 != f64 or i64 <= f32 +i64 != findIndex(array, ok) +i64 != float(1) +i64 != floor(i) +i64 != get(array, i) i64 != half(0.5) -i64 != half(f64) +i64 != half(1) i64 != i -i64 != i == nil -i64 != i ? array : f32 -i64 != i and ok +i64 != i % 1 +i64 != i + 1 +i64 != i / 0.5 +i64 != i ? f32 : true i64 != i32 -i64 != i32 ? 1 : f32 +i64 != i32 ? 0.5 : nil +i64 != i32 ? f64 : greet +i64 != i32 ^ i +i64 != i32 || ok i64 != i64 -i64 != i64 ? true : score -i64 != last(array) -i64 != len("foo") -i64 != min(0.5) +i64 != i64 - 0.5 +i64 != len("bar") +i64 != len(list) +i64 != max(0.5) +i64 != min(1) +i64 != min(1, f32) i64 != min(f32) -i64 != min(f64) -i64 != min(i64) -i64 != nil && ok +i64 != min(i) +i64 != nil != ok +i64 != nil ? div : 1 +i64 != nil ? greet : i +i64 != nil ? i : i +i64 != nil ? i64 : false i64 != score(1) -i64 % -1 +i64 != score(i) i64 % -i -i64 % -i32 -i64 % 1 * i32 -i64 % 1 .. i -i64 % 1 / 0.5 -i64 % 1 / f64 +i64 % 1 % 1 +i64 % 1 * i i64 % 1 < i32 -i64 % 1 <= -i32 -i64 % 1 == 0.5 + 0.5 -i64 % 1 not in array -i64 % abs(i64) -i64 % array[1] -i64 % find(array, true) -i64 % first(array) +i64 % 1 >= f64 +i64 % 1 >= i32 +i64 % abs(i32) +i64 % array[i32] i64 % i -i64 % i .. i32 -i64 % i not in array +i64 % i * i +i64 % i >= i i64 % i32 -i64 % i32 != f64 -i64 % i32 * f32 -i64 % i32 == i -i64 % i32 > f64 ^ i32 +i64 % i32 / f64 +i64 % i32 <= f64 i64 % i64 -i64 % i64 * 1 -i64 % i64 * f32 -i64 % i64 + -i64 -i64 % max(i32) -i64 % min(i) +i64 % i64 % 1 +i64 % i64 .. i64 +i64 % i64 == i64 +i64 % int(i32) +i64 % len("bar") +i64 % max(i) +i64 % min(1) i64 % score(1) -i64 * (0.5 + i64) -i64 * (0.5 - 1) -i64 * (1 + 1) +i64 * (0.5 + f64) +i64 * (1 - i64) +i64 * (f32 - f32) i64 * (f64 + f32) -i64 * (f64 - i) -i64 * (i - 1) -i64 * (i64 + 0.5) -i64 * --f64 +i64 * (i + 0.5) +i64 * (i + f64) +i64 * (i32 + f64) i64 * -0.5 i64 * -1 i64 * -f32 -i64 * -f64 -i64 * 0.5 != f64 +i64 * -i32 i64 * 0.5 * i32 +i64 * 0.5 ** 0.5 i64 * 0.5 - f32 -i64 * 0.5 < f32 -i64 * 0.5 == min(i64) +i64 * 0.5 / 1 i64 * 0.5 >= f32 -i64 * 0.5 ^ i -i64 * 1 * 1 +i64 * 1 % 1 +i64 * 1 * 0.5 +i64 * 1 * f64 +i64 * 1 ** 1 +i64 * 1 - i64 i64 * 1 .. i32 -i64 * 1 <= i64 -i64 * 1 == i32 -i64 * 1 >= i32 -i64 * array[i32] +i64 * 1 / i64 +i64 * 1 <= f64 +i64 * 1 == 0.5 != true +i64 * 1 == f32 +i64 * 1 > 1 - i64 +i64 * 1 > f64 +i64 * 1 ^ i32 +i64 * add(1, 1) +i64 * ceil(1) +i64 * ceil(i) +i64 * ceil(i64) +i64 * count(array, false) i64 * f32 -i64 * f32 - f32 -i64 * f32 / f64 -i64 * f32 >= i64 -i64 * f32 ^ i -i64 * f32 ^ i32 +i64 * f32 * f32 +i64 * f32 ** 1 +i64 * f32 / f32 +i64 * f32 / i +i64 * f32 / i32 +i64 * f32 not in array i64 * f64 -i64 * f64 * i32 -i64 * f64 ^ f64 +i64 * f64 + i32 +i64 * f64 - f64 +i64 * f64 / f64 +i64 * f64 < f64 +i64 * f64 > f64 +i64 * f64 ^ i32 +i64 * findIndex(array, ok) +i64 * float(i) i64 * float(i64) -i64 * get(array, i64) -i64 * half(f64) +i64 * half(0.5) i64 * i -i64 * i * i64 -i64 * i == i32 -i64 * i ^ i64 +i64 * i - -f64 +i64 * i <= f64 i64 * i32 -i64 * i32 ** f32 -i64 * i32 >= f64 -i64 * i32 >= i64 -i64 * i32 ^ 1 +i64 * i32 != i32 +i64 * i32 * 1 +i64 * i32 * i +i64 * i32 / 0.5 +i64 * i32 ^ i i64 * i64 -i64 * i64 ** 1 -i64 * i64 ** f32 -i64 * i64 - f64 -i64 * i64 in array +i64 * i64 % i64 +i64 * i64 * i64 +i64 * i64 ** i +i64 * i64 / f32 +i64 * i64 > i32 i64 * int(1) -i64 * min(f32, 0.5) +i64 * int(i) +i64 * max(1) +i64 * max(i64) +i64 * min(1) +i64 * min(i32) +i64 * reduce(array, #) +i64 * reduce(list, 0.5) +i64 * reduce(list, 1) +i64 * round(i) i64 * score(1) -i64 ** (0.5 * i64) -i64 ** (0.5 + 1) -i64 ** (1 % i) -i64 ** (f64 / i) -i64 ** (i * 0.5) -i64 ** (i - i) -i64 ** (i32 + i) +i64 ** (0.5 + 0.5) +i64 ** (0.5 / 1) +i64 ** (1 % 1) +i64 ** (1 * 1) +i64 ** (1 - f32) +i64 ** (f32 + 1) +i64 ** (f32 / 0.5) +i64 ** (f64 - 0.5) +i64 ** (i * i64) +i64 ** (i / 1) +i64 ** (i64 % i) +i64 ** (i64 / i) +i64 ** -0.5 i64 ** -1 -i64 ** -i -i64 ** -i32 -i64 ** 0.5 * f64 -i64 ** 0.5 + f32 -i64 ** 0.5 + f32 - 1 -i64 ** 0.5 - i -i64 ** 0.5 ^ 1 -i64 ** 0.5 ^ f32 -i64 ** 1 != i -i64 ** 1 ** f32 -i64 ** 1 ** float(1) -i64 ** 1 / f64 -i64 ** 1 / i -i64 ** 1 == i64 -i64 ** 1 ^ i64 -i64 ** abs(f32) -i64 ** abs(i64) +i64 ** -f32 +i64 ** 0.5 != i32 +i64 ** 0.5 <= f32 +i64 ** 0.5 <= i +i64 ** 1 + i32 +i64 ** 1 - f32 +i64 ** 1 / i64 +i64 ** 1 >= f32 +i64 ** bitnot(i32) +i64 ** ceil(i32) +i64 ** count(array, false) i64 ** f32 -i64 ** f32 != f64 -i64 ** f32 != i64 -i64 ** f32 ** i32 -i64 ** f32 / i64 / 1 -i64 ** f32 <= i64 -i64 ** f32 > f32 +i64 ** f32 * min(0.5) i64 ** f64 -i64 ** f64 / i -i64 ** f64 <= f32 -i64 ** f64 > f64 -i64 ** f64 >= f64 -i64 ** f64 >= i32 -i64 ** float(1) -i64 ** half(0.5) +i64 ** f64 ** f64 +i64 ** f64 not in array +i64 ** f64 not in array ? f32 : greet +i64 ** floor(f32) +i64 ** half(1) i64 ** i +i64 ** i != f32 +i64 ** i * f32 +i64 ** i <= -i +i64 ** i == f64 +i64 ** i ^ f32 i64 ** i32 -i64 ** i32 != f32 -i64 ** i32 <= f64 -i64 ** i32 <= min(0.5) +i64 ** i32 != i64 +i64 ** i32 * i ^ i +i64 ** i32 not in array i64 ** i64 -i64 ** i64 / f64 -i64 ** i64 >= f64 -i64 ** int(0.5) -i64 ** int(f64) -i64 ** len("foo") +i64 ** i64 - i64 +i64 ** i64 in array +i64 ** max(1) i64 ** min(0.5) -i64 ** score(1) -i64 + -(f32 / i) -i64 + -0.5 -i64 + -f32 -i64 + -f64 +i64 ** min(1) +i64 ** min(i32, 1) +i64 ** reduce(array, #) +i64 + -1 i64 + -i i64 + -i64 -i64 + 0.5 * i -i64 + 0.5 ** 1 -i64 + 0.5 + 1 +i64 + 0.5 ** f32 i64 + 0.5 + i32 -i64 + 1 % i -i64 + 1 ** i -i64 + 1 + i32 -i64 + 1 - f64 -i64 + 1 - i32 -i64 + 1 .. i -i64 + 1 < i32 -i64 + 1 < i64 -i64 + 1 <= i -i64 + 1 == i -i64 + abs(1) +i64 + 0.5 + i64 +i64 + 0.5 - f64 +i64 + 0.5 <= bitnand(1, 1) +i64 + 0.5 <= f64 +i64 + 0.5 == f32 +i64 + 1 != f64 +i64 + 1 % i64 +i64 + 1 + f64 +i64 + 1 <= f32 +i64 + array[i64] +i64 + array[i] i64 + f32 -i64 + f32 ** 1 -i64 + f32 >= f64 +i64 + f32 * f64 +i64 + f32 / i64 i64 + f64 -i64 + f64 != f32 -i64 + f64 + i -i64 + f64 <= f32 -i64 + f64 == i32 -i64 + findIndex(list, ok) -i64 + first(array) -i64 + get(array, i32) +i64 + f64 * 0.5 +i64 + f64 ** 0.5 +i64 + f64 > f32 +i64 + float(f32) +i64 + float(i32) i64 + half(0.5) -i64 + half(f64) i64 + i -i64 + i + i -i64 + i - f64 -i64 + i / 1 +i64 + i % 1 +i64 + i * 0.5 +i64 + i + f32 +i64 + i - i32 +i64 + i / i32 +i64 + i == 0.5 - i32 +i64 + i ^ f32 +i64 + i ^ f64 i64 + i32 -i64 + i32 * 1 -i64 + i32 * i -i64 + i32 < f64 -i64 + i32 >= f32 -i64 + i32 in array +i64 + i32 % i64 +i64 + i32 - 0.5 +i64 + i32 == f64 i64 + i64 -i64 + i64 % i64 -i64 + i64 ** f32 -i64 + i64 + 0.5 -i64 + i64 - int(f64) -i64 + i64 ^ i -i64 + max(f32) -i64 + min(0.5) -i64 + min(1) -i64 + min(f32) -i64 + min(i32) +i64 + i64 - 0.5 +i64 + reduce(array, #) i64 + score(i) i64 - -1 i64 - -f32 i64 - -i32 i64 - -i64 -i64 - 0.5 != i32 -i64 - 0.5 * 1 i64 - 0.5 + f32 -i64 - 0.5 + f64 -i64 - 0.5 / f64 -i64 - 0.5 == -0.5 -i64 - 0.5 ^ i32 -i64 - 1 - 0.5 -i64 - 1 - f32 -i64 - 1 - i32 +i64 - 0.5 / i64 +i64 - 0.5 <= i +i64 - 0.5 ^ f32 +i64 - 1 ** 1 +i64 - 1 < i i64 - 1 == i32 -i64 - 1 >= f64 +i64 - 1 > f32 i64 - 1 >= i -i64 - abs(1) -i64 - abs(i32) -i64 - array[i64] +i64 - 1 not in array +i64 - ceil(1) i64 - f32 -i64 - f32 != score(i) -i64 - f32 * i32 +i64 - f32 != f32 i64 - f32 - 1 -i64 - f32 <= f64 -i64 - f32 ^ f32 +i64 - f32 - i +i64 - f32 / 1 +i64 - f32 < i64 +i64 - f32 >= f64 i64 - f64 -i64 - f64 ** 0.5 +i64 - f64 != i +i64 - f64 ** f32 +i64 - f64 ** i32 +i64 - f64 + f32 +i64 - f64 + i32 +i64 - f64 >= f64 i64 - float(0.5) -i64 - float(f32) -i64 - float(i) +i64 - half(1) +i64 - half(f64) i64 - i -i64 - i != i32 -i64 - i * i64 -i64 - i + i32 -i64 - i - i64 -i64 - i > f64 - 0.5 -i64 - i >= i +i64 - i * 1 +i64 - i + i64 +i64 - i - 1 +i64 - i .. i64 +i64 - i < i32 +i64 - i > 1 - 0.5 +i64 - i >= f64 i64 - i ^ i64 +i64 - i not in array i64 - i32 -i64 - i32 % i32 -i64 - i32 + i32 -i64 - i32 <= i +i64 - i32 - i64 +i64 - i32 .. i64 +i64 - i32 > i +i64 - i32 >= i i64 - i64 -i64 - i64 + i32 -i64 - i64 .. i64 -i64 - i64 / i32 -i64 - max(f64) -i64 - min(1, 0.5) +i64 - i64 > f32 +i64 - int(i) +i64 - len("foo") +i64 - max(0.5) +i64 - min(f32) +i64 - min(f64) +i64 - min(i) +i64 - reduce(array, #) +i64 - reduce(array, i64) +i64 - round(1) i64 - score(1) +i64 - score(i) i64 .. -1 +i64 .. -i +i64 .. -i32 i64 .. -i64 -i64 .. 1 == list -i64 .. findIndex(list, ok) +i64 .. 1 * i64 +i64 .. 1 - 1 +i64 .. 1 - i +i64 .. 1 - i64 +i64 .. abs(i) +i64 .. bitnot(i32) +i64 .. count(array, false) i64 .. get(array, 1) i64 .. i +i64 .. i * i +i64 .. i + 1 +i64 .. i == list i64 .. i32 -i64 .. i32 * i +i64 .. i32 * 1 i64 .. i64 -i64 .. i64 + 1 +i64 .. i64 * i32 +i64 .. i64 + i +i64 .. i64 - i +i64 .. int(0.5) i64 .. int(f32) -i64 .. int(i32) -i64 .. last(array) -i64 .. len(list) +i64 .. int(i64) +i64 .. min(i32) +i64 .. min(i64, 0.5) +i64 .. reduce(array, #) i64 .. score(1) -i64 / (0.5 + f64) -i64 / (1 - 0.5) -i64 / (i32 - 1) +i64 / (f32 + i64) +i64 / (f32 - i) +i64 / (i + 1) +i64 / (i32 + 0.5) +i64 / (i64 - i) i64 / -0.5 i64 / -1 i64 / -f32 i64 / -f64 i64 / -i -i64 / -i64 -i64 / 0.5 < f64 -i64 / 0.5 == f32 -i64 / 0.5 ^ f64 -i64 / 1 ** 1 -i64 / 1 - f32 -i64 / 1 - min(0.5) -i64 / 1 / 0.5 -i64 / abs(i64) -i64 / array[i] +i64 / 0.5 * f64 +i64 / 0.5 - i64 +i64 / 0.5 / i +i64 / 0.5 == i +i64 / 1 ** i64 +i64 / 1 / i32 +i64 / 1 / i64 +i64 / 1 < i +i64 / 1 == f32 +i64 / ceil(i) i64 / f32 -i64 / f32 ** i -i64 / f32 <= i +i64 / f32 - i +i64 / f32 / i64 +i64 / f32 > i +i64 / f32 ^ 1 +i64 / f32 ^ i i64 / f64 -i64 / f64 * 1 -i64 / f64 ** 0.5 -i64 / f64 ** f64 -i64 / f64 + i32 -i64 / f64 <= f32 -i64 / f64 <= i64 -i64 / float(f32) -i64 / float(f64) -i64 / float(i) -i64 / float(i64) -i64 / half(0.5) -i64 / half(f64) +i64 / f64 * i64 +i64 / f64 - min(i64) +i64 / f64 / f32 +i64 / f64 / i * 0.5 +i64 / f64 / i32 +i64 / f64 in array +i64 / float(1) +i64 / get(array, i32) +i64 / half(1) i64 / i -i64 / i != i64 -i64 / i * 0.5 -i64 / i * f32 -i64 / i - i32 -i64 / i ^ i64 +i64 / i * i64 +i64 / i - f64 i64 / i32 -i64 / i32 * i +i64 / i32 != f32 +i64 / i32 * f64 +i64 / i32 == f64 +i64 / i32 > 1 + 1 +i64 / i32 >= f32 +i64 / i32 >= f64 +i64 / i32 ^ f32 i64 / i64 -i64 / i64 ** f32 -i64 / i64 - f64 -i64 / i64 / i64 -i64 / i64 < f32 -i64 / int(0.5) -i64 / min(f32) +i64 / i64 + f64 +i64 / i64 < i32 +i64 / i64 <= f32 +i64 / i64 == i32 +i64 / int(1) +i64 / len(list) +i64 / max(1) +i64 / reduce(array, #) +i64 / reduce(array, 1) +i64 / round(0.5) +i64 / round(i) i64 / score(1) +i64 / score(i) +i64 < -0.5 i64 < -1 +i64 < -f32 +i64 < -f64 +i64 < -i i64 < -i32 i64 < -i64 -i64 < 1 != true -i64 < 1 * f64 +i64 < 0.5 * 0.5 +i64 < 0.5 + i +i64 < 0.5 - 1 +i64 < 0.5 / 0.5 +i64 < 0.5 / 1 +i64 < 0.5 == ok +i64 < 0.5 || false ? 1 : nil +i64 < 1 * i32 +i64 < 1 ** 0.5 +i64 < 1 + 0.5 i64 < 1 + i64 -i64 < 1 / i32 -i64 < 1 ? half : ok -i64 < 1 ^ f64 -i64 < abs(f32) -i64 < array[1] +i64 < 1 / f32 +i64 < ceil(i64) i64 < f32 -i64 < f32 * i32 -i64 < f32 ? "bar" : ok -i64 < f32 ^ 0.5 +i64 < f32 * 0.5 +i64 < f32 - i64 +i64 < f32 ^ f32 i64 < f64 -i64 < f64 + f64 -i64 < f64 - f32 -i64 < f64 - i -i64 < f64 ? i64 : score -i64 < f64 or ok -i64 < float(f64) -i64 < half(0.5) +i64 < f64 && ok +i64 < f64 - f64 +i64 < f64 ? score : add +i64 < float(0.5) +i64 < float(i32) +i64 < floor(0.5) +i64 < floor(i32) +i64 < half(1) i64 < i -i64 < i != false +i64 < i % i64 +i64 < i ^ 0.5 +i64 < i || ok i64 < i32 -i64 < i32 * 1 -i64 < i32 + i64 -i64 < i32 - 0.5 -i64 < i32 - f32 -i64 < i32 ? greet : 1 -i64 < i32 ? nil : array -i64 < i32 ? true : "bar" +i64 < i32 + 1 +i64 < i32 + i32 +i64 < i32 / f32 +i64 < i32 ? foo : i i64 < i64 -i64 < i64 + 1 -i64 < i64 ? f32 : foo -i64 < i64 ? half : i -i64 < int(i64) -i64 < max(0.5) -i64 < min(0.5) -i64 < min(i) -i64 < score(1) -i64 < score(1) * i64 +i64 < i64 != nil +i64 < i64 * 1 +i64 < i64 * i64 +i64 < i64 / f32 +i64 < i64 / i +i64 < i64 ^ 1 +i64 < i64 ^ i +i64 < int(f64) +i64 < len("bar") +i64 < len("foo") +i64 <= -0.5 i64 <= -1 i64 <= -f32 -i64 <= -i -i64 <= -i32 +i64 <= -f64 i64 <= -i64 -i64 <= 0.5 != true -i64 <= 0.5 + i -i64 <= 0.5 - 1 -i64 <= 0.5 == nil -i64 <= 0.5 ? 0.5 : "foo" -i64 <= 1 != true -i64 <= 1 ** f64 +i64 <= 0.5 && ok +i64 <= 0.5 * 0.5 +i64 <= 0.5 + 1 +i64 <= 0.5 ? i : i32 +i64 <= 1 ** i32 +i64 <= 1 + 1 +i64 <= 1 - 0.5 +i64 <= 1 - 1 +i64 <= 1 / 1 i64 <= 1 == ok -i64 <= 1 ? array : ok -i64 <= 1 and ok -i64 <= array[i32] +i64 <= 1 ? add : div +i64 <= 1 ? f32 : greet +i64 <= 1 ? i64 : true +i64 <= 1 ^ 1 +i64 <= array[i64] +i64 <= array[i] +i64 <= bitnot(1) i64 <= f32 -i64 <= f32 && ok -i64 <= f32 + 1 -i64 <= f32 / f32 -i64 <= f32 ^ i32 +i64 <= f32 ** i +i64 <= f32 ** i64 +i64 <= f32 == ok i64 <= f64 i64 <= f64 + 1 -i64 <= f64 - f32 -i64 <= half(0.5) +i64 <= f64 + f32 +i64 <= f64 / 1 +i64 <= f64 ? nil : i32 +i64 <= float(1) +i64 <= floor(i) +i64 <= floor(i32) +i64 <= half(min(0.5, 1, i64)) i64 <= i -i64 <= i != true i64 <= i * 1 -i64 <= i + 1 -i64 <= i / i64 -i64 <= i ? i32 : list -i64 <= i ^ 0.5 +i64 <= i * f32 +i64 <= i ** i32 +i64 <= i ? greet : add i64 <= i32 -i64 <= i32 && ok -i64 <= i32 ? f64 : i < 1 +i64 <= i32 ** i32 +i64 <= i32 ? list : half +i64 <= i32 ^ -1 i64 <= i64 -i64 <= i64 - 0.5 -i64 <= i64 ? greet : div -i64 <= int(i64) -i64 <= last(array) +i64 <= i64 * i +i64 <= len(list) +i64 <= max(f32) i64 <= min(0.5) -i64 <= min(f64) -i64 <= score(1) -i64 <= score(i) -i64 == -0.5 +i64 <= min(i32) +i64 <= reduce(array, i32) +i64 <= reduce(list, i64) +i64 <= round(0.5) i64 == -1 +i64 == -f32 i64 == -f64 i64 == -i +i64 == -i32 +i64 == 0.5 * 1 +i64 == 0.5 - f64 i64 == 0.5 == ok -i64 == 0.5 ? 1 : list -i64 == 0.5 ? div : i64 -i64 == 0.5 ? foo : f32 -i64 == 0.5 ^ 0.5 -i64 == 0.5 ^ i -i64 == 1 % i64 -i64 == 1 && ok +i64 == 0.5 ? 0.5 : f64 i64 == 1 ** f64 -i64 == 1 + f32 -i64 == 1 - f64 -i64 == abs(0.5) -i64 == abs(i32) -i64 == count(array, true) -i64 == count(list, true) +i64 == 1 + 0.5 +i64 == 1 / i +i64 == 1 == ok +i64 == 1 ? "foo" : i +i64 == array[1] +i64 == bitnot(i64) +i64 == ceil(i64) i64 == f32 +i64 == f32 != true +i64 == f32 + i +i64 == f32 - f32 +i64 == f32 == ok i64 == f64 -i64 == f64 != ok -i64 == f64 != true -i64 == f64 - i -i64 == f64 ? f64 : add -i64 == findIndex(array, false) +i64 == f64 * f64 +i64 == f64 ? 1 : nil +i64 == f64 ^ 0.5 +i64 == f64 ^ f32 +i64 == f64 and not true +i64 == findIndex(list, f64 <= f64) +i64 == floor(0.5) +i64 == get(array, 1) +i64 == half(1) i64 == i -i64 == i * f32 -i64 == i == false -i64 == i == ok -i64 == i ^ 1 +i64 == i != nil +i64 == i + i32 +i64 == i ? i64 : foo i64 == i32 -i64 == i32 ** 0.5 -i64 == i32 / f64 i64 == i64 -i64 == i64 ^ 0.5 +i64 == i64 * f32 +i64 == i64 / i64 +i64 == i64 ? add : 0.5 +i64 == i64 ? add : greet +i64 == int(0.5) i64 == int(1) -i64 == int(f32) -i64 == last(array) -i64 == max(0.5) -i64 == nil ? true : ok +i64 == int(i) +i64 == len("foo") +i64 == nil != nil +i64 == reduce(array, #) i64 == score(1) -i64 == score(i) i64 > -0.5 -i64 > -1 i64 > -f32 i64 > -f64 -i64 > -i -i64 > -i32 -i64 > -i64 -i64 > 0.5 * 1 -i64 > 0.5 ** 0.5 -i64 > 0.5 == true -i64 > 0.5 ? f64 : greet -i64 > 0.5 ? foo : add -i64 > 1 ** 0.5 -i64 > 1 - 0.5 -i64 > 1 ? false : array -i64 > 1 ? half : i64 -i64 > abs(1) -i64 > abs(f64) -i64 > array[i64] +i64 > 0.5 + f32 +i64 > 0.5 - f64 +i64 > 0.5 - i32 +i64 > 0.5 ? array : 1 +i64 > 0.5 ? f32 : nil +i64 > 0.5 ? ok : nil +i64 > 0.5 ? score : foo +i64 > 0.5 or ok +i64 > 1 != true +i64 > 1 ** 1 +i64 > 1 == false +i64 > 1 ? nil : 1 +i64 > 1 ^ f32 +i64 > 1 ^ i32 i64 > f32 -i64 > f32 - 1 -i64 > f32 ? div : false +i64 > f32 * 0.5 +i64 > f32 + f64 +i64 > f32 / f32 +i64 > f32 ? "foo" : greet +i64 > f32 ? 1 : i32 i64 > f64 -i64 > f64 == nil -i64 > f64 and 1 > i64 +i64 > f64 * i +i64 > f64 - 0.5 +i64 > f64 - f32 i64 > first(array) -i64 > float(f32) -i64 > half(f64) +i64 > half(0.5) i64 > i -i64 > i % i32 -i64 > i * f64 -i64 > i ** 1 -i64 > i + i -i64 > i + i32 -i64 > i ^ i32 +i64 > i != nil +i64 > i == true i64 > i32 -i64 > i32 && ok -i64 > i32 ** 0.5 -i64 > i32 ** i +i64 > i32 ? div : f32 +i64 > i32 ^ f32 i64 > i64 -i64 > i64 % i32 -i64 > i64 - i64 -i64 > int(f32) -i64 > int(i32) -i64 > int(i64) +i64 > i64 - i +i64 > i64 - i32 +i64 > i64 / f64 +i64 > i64 == false +i64 > len(list) +i64 > max(0.5) +i64 > min(1) +i64 > min(i32) +i64 > reduce(array, #) +i64 > reduce(array, 1) +i64 > round(0.5) +i64 > round(i32) i64 > score(i) i64 >= -0.5 i64 >= -1 -i64 >= -f64 i64 >= -i -i64 >= 0.5 * f64 -i64 >= 0.5 ** f32 -i64 >= 0.5 + f32 +i64 >= -i64 +i64 >= 0.5 / i i64 >= 0.5 == nil -i64 >= 0.5 == true -i64 >= 0.5 ? array : array -i64 >= 0.5 ? i32 : nil -i64 >= 0.5 ^ 0.5 -i64 >= 0.5 and f32 != nil -i64 >= 1 + f64 -i64 >= 1 + i32 -i64 >= 1 ? i : false -i64 >= 1 ? i : string(array) -i64 >= 1 ? true : i +i64 >= 0.5 ? 0.5 : f64 +i64 >= 0.5 ^ i +i64 >= 1 % i64 +i64 >= 1 * f64 +i64 >= 1 * i64 +i64 >= abs(i64) +i64 >= array[i32] +i64 >= bitnot(1) i64 >= f32 -i64 >= f32 * f32 -i64 >= f32 ** f64 -i64 >= f32 ** i32 -i64 >= f32 / f64 +i64 >= f32 + f32 +i64 >= f32 - f32 +i64 >= f32 ? array : i +i64 >= f32 ? f32 : i32 +i64 >= f32 ? list : f32 i64 >= f64 -i64 >= f64 + i -i64 >= f64 / i64 -i64 >= f64 == ok -i64 >= f64 and ok -i64 >= find(array, ok) +i64 >= f64 + 0.5 +i64 >= first(array) +i64 >= float(0.5) i64 >= float(f32) -i64 >= float(i) -i64 >= float(i32) +i64 >= floor(1) +i64 >= floor(i64) i64 >= half(0.5) +i64 >= half(half(f64)) i64 >= i -i64 >= i and ok +i64 >= i / 0.5 +i64 >= i ? true : i32 i64 >= i32 -i64 >= i32 % i64 +i64 >= i32 * i +i64 >= i32 / f32 +i64 >= i32 == false +i64 >= i32 || f64 == 1 i64 >= i64 -i64 >= i64 % i -i64 >= i64 && i64 > f32 -i64 >= i64 / i32 -i64 >= i64 == nil -i64 >= i64 in {"foo": f64}.half -i64 >= max(f64) +i64 >= i64 + 1 +i64 >= i64 ? foo : foo +i64 >= i64 or ok +i64 >= int(f64) +i64 >= last(array) i64 >= max(i64) -i64 >= min(f32) +i64 >= min(1) +i64 >= min(f64) +i64 >= round(1) +i64 >= round(i) i64 >= score(1) -i64 ^ (0.5 + 1) -i64 ^ (0.5 / i32) -i64 ^ (1 * f32) -i64 ^ (1 / i) -i64 ^ (1 / i64) -i64 ^ (f32 + f32) -i64 ^ (f32 - f32) -i64 ^ (f64 * f32) -i64 ^ (i % i32) -i64 ^ (i - 0.5) -i64 ^ (i32 - f32) -i64 ^ (i64 + i32) -i64 ^ (i64 / f64) +i64 ^ (0.5 * i32) +i64 ^ (0.5 / i64) +i64 ^ (1 * f64) +i64 ^ (1 - i) +i64 ^ (f32 / 1) +i64 ^ (i % i) +i64 ^ (i32 * f64) +i64 ^ (i32 - f64) +i64 ^ (i64 + 0.5) +i64 ^ (i64 + 1) +i64 ^ (i64 - f32) i64 ^ -0.5 -i64 ^ -i32 -i64 ^ 0.5 ** f32 -i64 ^ 0.5 <= i -i64 ^ 0.5 >= f32 -i64 ^ 0.5 >= f64 -i64 ^ 0.5 >= i64 -i64 ^ 0.5 ^ 0.5 -i64 ^ 1 != i -i64 ^ 1 != i32 +i64 ^ -1 +i64 ^ -f32 +i64 ^ -i64 +i64 ^ 0.5 != i64 +i64 ^ 0.5 ** 0.5 +i64 ^ 0.5 / f32 +i64 ^ 0.5 <= i64 +i64 ^ 0.5 == i +i64 ^ 0.5 ^ f32 +i64 ^ 0.5 ^ i64 +i64 ^ 1 * i64 +i64 ^ 1 * round(0.5) +i64 ^ 1 ** f64 i64 ^ 1 ** i32 -i64 ^ 1 + f32 -i64 ^ 1 < f32 -i64 ^ 1 <= i +i64 ^ 1 - f32 +i64 ^ 1 < f64 +i64 ^ 1 >= f32 +i64 ^ 1 >= half(1) +i64 ^ 1 ^ f32 +i64 ^ 1 ^ i32 i64 ^ abs(1) -i64 ^ abs(i) -i64 ^ array[i64] +i64 ^ array[i] i64 ^ f32 -i64 ^ f32 - f32 +i64 ^ f32 * i32 +i64 ^ f32 ** f64 +i64 ^ f32 - f64 +i64 ^ f32 / i - i32 +i64 ^ f32 < f32 +i64 ^ f32 <= i64 +i64 ^ f32 ^ 1 i64 ^ f64 -i64 ^ f64 * i32 -i64 ^ f64 ** i -i64 ^ f64 + f32 -i64 ^ f64 < f32 -i64 ^ f64 == i64 -i64 ^ f64 > 1 + i64 +i64 ^ f64 * i +i64 ^ f64 ** 1 +i64 ^ f64 > i64 i64 ^ f64 ^ f32 -i64 ^ get(array, i) -i64 ^ half(f64) +i64 ^ float(i32) +i64 ^ floor(i32) +i64 ^ floor(i64) +i64 ^ half(0.5) +i64 ^ half(1) i64 ^ i -i64 ^ i ** f32 -i64 ^ i ** i64 +i64 ^ i * i +i64 ^ i ** i32 +i64 ^ i + i % 1 +i64 ^ i + i64 +i64 ^ i - f32 ^ 1 +i64 ^ i - f64 +i64 ^ i / i +i64 ^ i < f32 +i64 ^ i ^ i32 i64 ^ i32 -i64 ^ i32 != f32 -i64 ^ i32 != i32 -i64 ^ i32 ** i -i64 ^ i32 + f32 -i64 ^ i32 + f64 -i64 ^ i32 / f32 +i64 ^ i32 * i +i64 ^ i32 + i32 +i64 ^ i32 + i64 i64 ^ i64 -i64 ^ i64 * f64 i64 ^ i64 * i64 -i64 ^ i64 ** f64 -i64 ^ i64 ^ f32 -i64 ^ i64 ^ f64 -i64 ^ i64 ^ i -i64 ^ int(i64) -i64 ^ last(array) -i64 ^ len(array) +i64 ^ i64 + i +i64 ^ i64 == i64 +i64 ^ i64 ^ 1 +i64 ^ i64 in array +i64 ^ int(1) i64 ^ max(0.5) -i64 ^ max(1) -i64 ^ max(f32) +i64 ^ reduce(array, #) +i64 ^ round(i64) i64 ^ score(1) -i64 ^ score(1, 1) -i64 ^ score(i) i64 in array -i64 in array == nil -i64 in array ? false : greet +i64 in array == ok +i64 in groupBy(array, 0.5) +i64 in groupBy(array, foo) +i64 in groupBy(list, "bar") +i64 in groupBy(list, i) +i64 in i64 .. i32 i64 in map(array, #) +i64 in map(list, 1) +i64 in map(list, i) +i64 not in 1 .. i i64 not in array -indexOf("bar", "bar") + i64 -indexOf(foo.Bar, string(i32)) -int(-(i * 0.5)) +i64 not in array ? f32 : i32 +i64 not in array ? ok : f32 +i64 not in map(array, #) +i64 not in map(list, 0.5) int(-0.5) int(-1) -int(-abs(f64)) int(-f32) int(-f64) int(-i) int(-i32) -int(-i32) != i int(-i64) int(0.5 * 0.5) -int(0.5 * 1) int(0.5 * f32) -int(0.5 * i) +int(0.5 * f64) int(0.5 * i32) -int(0.5 * i64) int(0.5 ** 0.5) int(0.5 ** 1) int(0.5 ** f32) int(0.5 ** f64) -int(0.5 ** i64) -int(0.5 + f32) +int(0.5 ** i32) +int(0.5 + 0.5) +int(0.5 + 1) int(0.5 + f64) -int(0.5 + i) int(0.5 + i32) -int(0.5 - 0.5) +int(0.5 + i64) int(0.5 - f32) +int(0.5 - i) int(0.5 - i32) -int(0.5 / 0.5) -int(0.5 / 1) -int(0.5 / f32) -int(0.5 / f64) -int(0.5 / i32) +int(0.5 - i64) +int(0.5 / i) int(0.5 / i64) -int(0.5 ^ 0.5) -int(0.5 ^ 1) -int(0.5 ^ f32) int(0.5 ^ i) -int(0.5) ** i64 -int(0.5) ** int(i64) -int(0.5) + f32 -int(0.5) + f64 -int(0.5) + i64 -int(0.5) - i -int(0.5) - i64 -int(0.5) .. i32 -int(0.5) < int(f64) +int(0.5 ^ i64) +int(0.5) * -i +int(0.5) ** f64 +int(0.5) ** i32 +int(0.5) + i +int(0.5) / i32 +int(0.5) < 0.5 * f64 +int(0.5) <= i +int(0.5) <= i32 int(0.5) == f32 -int(0.5) == i -int(0.5) > -1 -int(0.5) >= i - i64 +int(0.5) > -i64 +int(0.5) > i +int(0.5) >= f32 +int(0.5) >= i32 +int(0.5) >= max(0.5) int(0.5) ^ i32 -int(0.5) ^ i64 -int(0.5) in array -int(0.5) not in array -int(1 % 1) int(1 % i) -int(1 % i32) -int(1 * 0.5) int(1 * f32) -int(1 * f64) int(1 * i) -int(1 * i64) -int(1 ** 0.5) -int(1 ** 1) -int(1 ** f32) -int(1 ** i32) -int(1 ** i64) -int(1 + 0.5) +int(1 * i32) +int(1 ** i) int(1 + 1) +int(1 + f32) int(1 + f64) -int(1 + i) +int(1 + i32) int(1 - 0.5) -int(1 - 1) +int(1 - f32) +int(1 - f64) +int(1 - i32) int(1 - i64) +int(1 / 0.5) int(1 / 1) -int(1 / f64) -int(1 / i32) -int(1 / i64) int(1 ^ 0.5) -int(1 ^ 1) -int(1 ^ i32) int(1 ^ i64) -int(1) * f64 -int(1) * i +int(1) != i64 int(1) ** f32 -int(1) ** i64 -int(1) + 0.5 + 1 +int(1) ** i32 +int(1) + f32 int(1) + i64 -int(1) - f64 -int(1) - i64 -int(1) .. i -int(1) / f32 -int(1) / i +int(1) + reduce(array, #) +int(1) - i int(1) < f64 -int(1) <= f32 -int(1) <= f64 -int(1) == i -int(1) == i64 -int(1) > f64 -int(1) > float(1) -int(1) > i32 -int(1) >= f32 -int(1) >= f64 -int(1) >= half(0.5) -int(1) ^ f32 +int(1) < i64 * 0.5 +int(1) == i32 int(1) ^ f64 -int(1) ^ i -int(1) ^ i32 -int(1) in array int(abs(0.5)) -int(abs(f32)) +int(abs(1)) int(abs(f64)) int(abs(i)) int(abs(i32)) int(abs(i64)) -int(array[1]) -int(array[i32]) +int(add(1, 1)) int(array[i64]) -int(count(list, ok)) -int(div(1, i)) -int(f32 * f32) -int(f32 * i64) +int(bitnot(1)) +int(bitnot(i32)) +int(bitnot(i64)) +int(bitshl(1, i)) +int(bitxor(1, i32) + i) +int(bitxor(i32, i)) +int(ceil(0.5)) +int(ceil(1)) +int(ceil(f32)) +int(ceil(half(1))) +int(ceil(i)) +int(ceil(i32)) +int(count(array, ok)) +int(count(list, false)) +int(f32 * 1) +int(f32 * i) int(f32 ** 0.5) -int(f32 ** f64) -int(f32 ** i32) +int(f32 ** i64) int(f32 + f32) -int(f32 + i64) int(f32 - 0.5) -int(f32 - f32) -int(f32 - i) +int(f32 - i64) +int(f32 / 0.5) +int(f32 / 1) int(f32 / f64) -int(f32 ^ 1) +int(f32 / i32) +int(f32 / i64) int(f32 ^ f32) -int(f32 ^ i) -int(f32 ^ i64) +int(f32 ^ i32) int(f32) -int(f32) != f32 -int(f32) % i -int(f32) * f64 -int(f32) .. i32 -int(f32) / f32 -int(f32) / i -int(f32) == 0.5 != nil -int(f32) == i -int(f32) > i -int(f32) >= i32 -int(f32) ^ i64 -int(f32) in array +int(f32) != i +int(f32) != i64 +int(f32) ** f64 +int(f32) + i32 +int(f32) - f32 +int(f32) < i +int(f32) <= i32 +int(f32) == i ? list : add int(f64 * 0.5) -int(f64 * 1) -int(f64 * f32) -int(f64 * f64) -int(f64 * i32) -int(f64 * i64) -int(f64 ** 0.5) int(f64 ** 1) -int(f64 ** f32) int(f64 ** i) int(f64 ** i32) -int(f64 ** i64) -int(f64 + f32) -int(f64 + i64) +int(f64 + 0.5) +int(f64 + 1) +int(f64 + i) int(f64 - 0.5) -int(f64 - 1) -int(f64 - f64) -int(f64 / 1) -int(f64 / i) +int(f64 - f32) +int(f64 / 0.5) +int(f64 / i64) int(f64 ^ 0.5) int(f64 ^ 1) -int(f64 ^ f32) +int(f64 ^ f64) +int(f64 ^ i64) int(f64) -int(f64) != i32 -int(f64) * i32 -int(f64) ** i64 -int(f64) - i +int(f64) % i64 +int(f64) * f64 +int(f64) + f64 int(f64) < i32 -int(f64) <= i32 -int(f64) == float(i32) -int(f64) ^ i32 -int(f64) ^ i64 -int(f64) not in array -int(false ? add : 0.5) -int(false ? f32 : 0.5) -int(false ? f64 : i32) -int(find(array, true)) -int(findIndex(array, ok)) -int(findIndex(array, true)) -int(findIndex(list, # == foo)) +int(f64) == f32 +int(f64) == f64 +int(f64) > i +int(f64) > i64 +int(false ? 0.5 : 0.5) +int(false ? i : 0.5) int(findIndex(list, ok)) -int(findLastIndex(array, ok)) -int(findLastIndex(array, true)) -int(findLastIndex(list, true)) +int(findLastIndex(list, ok)) int(first(array)) int(float(0.5)) int(float(1)) int(float(f32)) -int(float(f64) ** i64) int(float(f64)) -int(float(i)) +int(float(i32 ** i)) int(float(i32)) -int(float(i64)) -int(get(array, 1)) +int(floor(f64)) +int(floor(i)) +int(floor(i32)) int(get(array, i64)) int(half(0.5)) -int(half(1 / f32)) +int(half(1)) int(half(f64)) int(i % 1) +int(i % i32) int(i % i64) int(i * 0.5) int(i * 1) -int(i * f32) int(i * f64) -int(i ** 0.5) int(i ** f32) int(i ** f64) int(i ** i64) -int(i + 0.5) int(i + f32) -int(i + i32) -int(i + i64) -int(i - f64) +int(i + f64) +int(i + i) +int(i - 0.5) +int(i - f32) +int(i - i32) int(i - i64) -int(i / 1) <= i32 -int(i / f64) +int(i / 0.5) +int(i / 1) int(i / i) -int(i ^ f32) -int(i ^ f64) -int(i ^ i) +int(i / i32) +int(i ^ 0.5) +int(i ^ 1) int(i ^ i32) int(i) -int(i) != i -int(i) + f32 -int(i) + i32 -int(i) - i32 +int(i) != i32 +int(i) * f64 +int(i) * i64 +int(i) - i int(i) .. i64 -int(i) / i -int(i) < f32 -int(i) < f64 -int(i) <= f64 -int(i) == f32 -int(i) > i32 -int(i) > i64 -int(i) > int(i) -int(i) >= i -int(i) ^ i64 -int(i32 % i64) int(i32 * 0.5) int(i32 * 1) -int(i32 * f64) -int(i32 ** i) +int(i32 * i64) +int(i32 ** 0.5) +int(i32 ** 1) int(i32 + 0.5) int(i32 + 1) -int(i32 + f32) -int(i32 - 0.5) +int(i32 + f64) +int(i32 + i64) int(i32 - 1) -int(i32 - f64) int(i32 - i) -int(i32 - i64) int(i32 / 0.5) +int(i32 / 1) int(i32 / f64) int(i32 ^ 0.5) -int(i32 ^ f32) int(i32 ^ f64) -int(i32 ^ i) -int(i32 ^ i64) +int(i32 ^ i32) int(i32) int(i32) != f32 -int(i32) % i64 -int(i32) ** -0.5 -int(i32) + i -int(i32) - f32 -int(i32) .. i32 +int(i32) - i +int(i32) / f32 int(i32) / i -int(i32) / i32 +int(i32) / i64 int(i32) < i64 -int(i32) <= f32 -int(i32) == -i32 -int(i32) == f64 -int(i32) > f64 -int(i64 % i32) -int(i64 * f32) -int(i64 * f64) -int(i64 * i) -int(i64 ** i) -int(i64 + 1) +int(i32) > half(0.5) +int(i64 * 1) +int(i64 ** 0.5) +int(i64 ** f64) +int(i64 ** i64) int(i64 + i) -int(i64 + i64) +int(i64 + i32) +int(i64 - 0.5) int(i64 - f32) -int(i64 - f64) -int(i64 - i32) -int(i64 / f32) -int(i64 / f64) -int(i64 / i) -int(i64 / i64) -int(i64 ^ 0.5) +int(i64 - i) +int(i64 - i64) +int(i64 / 1) int(i64 ^ f64) int(i64 ^ i32) int(i64 ^ i64) int(i64) -int(i64) != f64 -int(i64) != i -int(i64) != nil ? 1 : half -int(i64) % i -int(i64) % i32 -int(i64) ** f64 -int(i64) - i32 +int(i64) != i64 +int(i64) - i64 int(i64) .. i32 +int(i64) / i int(i64) <= i -int(i64) <= i64 -int(i64) == min(i) -int(i64) > f64 -int(i64) > i32 -int(i64) >= f64 -int(i64) ^ f32 -int(i64) ^ i32 -int(i64) in array -int(i64) not in array +int(i64) == f32 +int(i64) > i64 +int(i64) ^ i int(int(0.5)) int(int(1)) -int(int(f32)) int(int(f64)) -int(int(i32)) -int(int(i64)) -int(last(array)) int(len("bar")) int(len(array)) -int(len(list)) int(max(0.5)) +int(max(0.5, i64)) int(max(1)) +int(max(f32)) int(max(f64)) int(max(i)) int(max(i64)) +int(mean(array)) int(min(0.5)) int(min(1)) +int(min(1, i64)) int(min(f32)) -int(min(f32, i32)) -int(min(f64)) -int(min(f64, 1)) int(min(i)) int(min(i32)) int(min(i64)) -int(min(i64, 1)) -int(ok ? 0.5 : i64) -int(ok ? 1 : div) -int(ok ? i32 : add) +int(ok ? i : div) +int(ok ? i : i64) +int(ok ? i64 : list) +int(reduce(array, #)) +int(reduce(array, f32)) +int(reduce(array, i32)) +int(reduce(list, 0.5)) +int(reduce(list, 1)) +int(reduce(list, i64)) +int(round(0.5)) +int(round(1)) +int(round(f32)) +int(round(f64)) +int(round(i)) int(score(1)) +int(score(1, i)) int(score(i)) int(string(1)) int(string(i)) int(string(i32)) int(string(i64)) -int(toJSON(1)) +int(sum(array)) int(toJSON(i)) int(toJSON(i32)) int(toJSON(i64)) -int(true ? f64 : 0.5) -int(true ? f64 : 1) -join(["bar"]) -join(map(array, "bar")) +int(true ? 1 : foo) +int(true ? f64 : greet) join(map(array, "foo")) -join(map(list, "bar")) -keys({"bar": i64}) -keys({"foo": 0.5}) -keys({"foo": f32}) -keys({"foo": i}) -last(1 .. i32) +join(map(list, "foo")) +keys(groupBy(array, "foo")) +keys(groupBy(array, # ** 0.5)) +keys(groupBy(array, #)) +keys(groupBy(array, f32 != f64)) +keys(groupBy(array, foo)) +keys(groupBy(array, i32)) +keys(groupBy(array, ok)) +keys(groupBy(list, "bar")) +keys(groupBy(list, #)) +keys(groupBy(list, false)) +keys(groupBy(list, i32)) +keys({"bar": 1}) +keys({"bar": array, "foo": "bar"}) +keys({"bar": f32}) +keys({"foo": array, "bar": f64}) +keys({"foo": array}) +last(1 .. 1) +last(1 .. i) last([0.5]) -last([array]) -last([f64]) -last([half, i32]) +last([f32, list]) +last([list, list]) last(array) -last(array) != f32 -last(array) != i32 -last(array) % i32 -last(array) * i32 -last(array) + f32 -last(array) + i +last(array) != int(i64) +last(array) + f64 last(array) - f32 last(array) - i64 -last(array) - score(i) -last(array) .. max(i) -last(array) / f64 -last(array) > f64 -last(array) > max(1) -last(array) >= f32 +last(array) .. i32 +last(array) / f32 +last(array) <= i32 +last(array) == f32 +last(array) > f32 * i64 last(array) >= f64 -last(false ? 0.5 : greet) -last(false ? div : 1) -last(false ? f32 : 1) -last(false ? list : 1)?.add -last(false ? list : add) +last(false ? "foo" : true) +last(false ? 0.5 : "bar") +last(false ? 1 : foo)?.div +last(false ? div : score) +last(false ? f64 : false) last(filter(array, false)) last(filter(array, ok)) last(filter(list, true)) -last(i .. i32) -last(i32 .. i32) +last(groupBy(array, foo).Qux) +last(groupBy(array, i32).Qux) +last(groupBy(list, #).list) +last(groupBy(list, #)?.Qux) +last(groupBy(list, #)?.ok) +last(i32 .. 1) last(i32 .. i64) -last(i64 .. i) +last(i64 .. 1) last(list) -last(list) == foo -last(list) not in list last(list).Bar last(list).Qux last(list).String @@ -9271,181 +12170,156 @@ last(list)?.Bar last(list)?.Qux last(list)?.String last(list)?.String() -last(map(array, "bar")) +last(list[1:i64]) last(map(array, #)) +last(map(array, 1)) last(map(array, array)) -last(map(array, i64)) -last(map(list, "bar")) +last(map(array, foo)) +last(map(array, i)) last(map(list, "foo")) last(map(list, #)) -last(map(list, 0.5)) -last(map(list, add)) -last(map(list, f32)) -last(map(list, foo)) -last(map(list, i)) +last(map(list, 1)) +last(map(list, false)) +last(map(list, half)) last(map(list, i32)) -last(map(list, true)) -last(ok ? 0.5 : score) -last(ok ? array : false) -last(ok ? foo : add != half) -last(ok ? nil : list) -last(ok ? ok : i32) -last(true ? 1 : list)?.String -last(true ? foo : half) -last(true ? half : 1) -last(true ? i32 : ok) -last(true ? i64 : 1) -last(true ? ok : f64) -lastIndexOf("bar", "foo") < f32 ^ f64 -len("bar" + "foo") -len("bar") != f32 -len("bar") % score(i) -len("bar") * i32 -len("bar") ** f64 -len("bar") ** i32 -len("bar") <= i64 -len("bar") > i32 -len("bar") >= 0.5 ^ 0.5 -len("bar") >= f32 -len("bar") >= f64 -len("foo" + foo.Bar) -len("foo") * i32 -len("foo") * i64 +last(map(list, i64)) +last(map(list, ok)) +last(ok ? "bar" : true) +last(ok ? "foo" : f64) +last(ok ? 0.5 : "foo") +last(ok ? 0.5 : list) +last(ok ? 1 : add) +last(ok ? 1 : half) +last(ok ? array : array) +last(ok ? array : ok) +last(ok ? f32 : 0.5) +last(ok ? greet : 1) +last(ok ? i32 : array) +last(ok ? i64 : add) +last(ok ? ok : 0.5) +last(reduce(array, list)) +last(reduce(list, array)) +last(sort(array)) +last(sum(array)) +last(true ? "bar" : half) +last(true ? add : list) +last(true ? foo : 1) +last(true ? greet : true) +last(true ? ok : 1) +len("bar") ** i64 +len("bar") + i64 - i64 +len("bar") / i64 +len("bar") >= i +len("bar") in array +len("foo") ** i32 +len("foo") ** i64 len("foo") - i -len("foo") .. i -len("foo") < f32 -len("foo") <= f32 -len("foo") <= f64 -len("foo") == i -len("foo") == i32 -len("foo") == i64 -len("foo") > f64 -len("foo") not in array -len([f64]) -len([false, add, half]) -len([false, foo, false]) -len([false]) +len("foo") - i32 +len("foo") >= i +len(1 .. 1) +len([f32]) +len([foo]) +len([half]) len(array) -len(array) != i -len(array) != i32 -len(array) * i -len(array) ** i -len(array) .. 1 - 1 -len(array) / f32 -len(array) < f32 -len(array) <= i -len(array) >= f32 +len(array) != f32 +len(array) + i64 +len(array) < f64 +len(array) <= i32 +len(array) == f32 len(array) >= f64 -len(array) >= i64 -len(false ? 1 : list) -len(false ? nil : "foo") +len(array) ^ i32 +len(array) not in array +len(filter(list, false)) +len(filter(list, ok)) len(foo.Bar) len(foo.String()) len(foo?.Bar) +len(foo?.Qux("bar")) len(foo?.String()) len(greet("bar")) len(greet("foo")) -len(i .. 1) -len(i32 .. 1) -len(i32 .. i) -len(i32 .. i32) -len(i32 .. i64) +len(groupBy(array, #)) +len(groupBy(array, 0.5)) +len(groupBy(array, f32)) +len(groupBy(array, false)) +len(groupBy(array, i64)) +len(groupBy(array, true)) +len(groupBy(list, #)) +len(groupBy(list, #).ok) +len(groupBy(list, 0.5)) +len(groupBy(list, false)) +len(groupBy(list, foo).list) +len(groupBy(list, i32)) +len(groupBy(list, i64)) len(i64 .. 1) len(i64 .. i) len(list) -len(list) != i64 -len(list) * f32 -len(list) ** i -len(list) / f64 -len(list) <= f64 -len(list) == f32 -len(list) == i +len(list) % i32 +len(list) % i64 +len(list) .. i64 +len(list) / i32 +len(list) <= i len(list) > i -len(list) > i64 - i -len(list) >= i -len(list) not in map(array, #) +len(list) ^ f64 +len(list[1:i]) +len(lower("bar")) len(lower("foo")) -len(lower(toBase64("foo"))) -len(lower(type(list))) len(map(array, "bar")) len(map(array, #)) -len(map(array, 0.5)) -len(map(array, array)) -len(map(array, f64)) -len(map(array, foo)) -len(map(array, half)) +len(map(array, add)) +len(map(array, f32)) +len(map(array, greet)) len(map(array, i)) -len(map(array, i64)) -len(map(array, list)) -len(map(array, ok)) +len(map(array, list)[i64]) len(map(array, score)) -len(map(list, "bar")) -len(map(list, "foo")) len(map(list, #)) -len(map(list, 0.5)) len(map(list, 1)) +len(map(list, f32)) len(map(list, f64)) -len(map(list, false)) -len(map(list, greet)) -len(map(list, half)) -len(map(list, i)) -len(map(list, score)) +len(map(list, foo)) +len(map(list, i64)) +len(map(list, ok)) len(map(list, true)) +len(ok ? list : score) len(sort(array)) len(string("bar")) len(string("foo")) len(string(0.5)) len(string(1)) len(string(add)) -len(string(array)) -len(string(div)) -len(string(f32)) len(string(f64)) len(string(foo)) -len(string(greet)) len(string(half)) +len(string(i)) len(string(i32)) len(string(i64)) len(string(list)) len(string(nil)) -len(string(ok)) len(string(score)) -len(string(true)) +len(string(string(list))) len(toJSON("bar")) len(toJSON("foo")) len(toJSON(0.5)) -len(toJSON(1 <= i32)) len(toJSON(1)) len(toJSON(array)) len(toJSON(f32)) -len(toJSON(f64)) len(toJSON(false)) -len(toJSON(foo)) -len(toJSON(foo.Bar)) len(toJSON(i)) len(toJSON(i32)) -len(toJSON(i64)) len(toJSON(list)) len(toJSON(nil)) len(toJSON(ok)) len(toJSON(true)) -len(trim("bar")) len(trim("foo")) -len(trimPrefix("bar")) len(trimPrefix("foo")) len(trimSuffix("bar")) -len(trimSuffix("foo")) +len(type("foo")) len(type(0.5)) len(type(1)) +len(type(add)) len(type(array)) len(type(div)) -len(type(f32)) -len(type(f64)) -len(type(false)) -len(type(foo)) -len(type(greet)) len(type(half)) -len(type(half)) > f32 len(type(i)) len(type(i32)) len(type(i64)) @@ -9455,46 +12329,48 @@ len(type(ok)) len(type(score)) len(upper("bar")) len(upper("foo")) -len({"bar": 1}) -len({"bar": add}) -len({"bar": f64, "bar": i}) -len({"bar": greet, "bar": greet}) -len({"foo": "foo"}) +len({"bar": array}) +len({"bar": f64}) +len({"bar": score}) +len({"foo": 1}) +len({"foo": add, "foo": "foo"}) +len({"foo": i64}) list +list != 1 .. 1 +list != ["foo"] +list != [i, 0.5] +list != [i] list != array -list != array == ok -list != array ? 0.5 : "bar" -list != filter(list, true) +list != filter(array, ok) +list != filter(array, true) list != list +list != list ? 0.5 : div +list != list ? half : div list != map(array, #) -list != map(array, 1) -list != map(array, div) -list != map(list, #) -list != map(list, div) -list != map(list, list) -list == [add] +list != map(list, 1) +list != map(list, i64) +list != nil && i32 <= 1 +list != nil ? false : 1 +list != nil ? i : 1 +list != sort(array) +list == [div, nil] +list == [i] list == array -list == array ? div : i +list == array == nil list == list -list == list == nil -list == list ? f64 : array -list == list or add != nil -list == map(list, f32) -list == map(list, i64) -list == nil == nil -list == nil == ok -list == nil or i == 0.5 -list == sort(array) -list == {"bar": half, "foo": "foo"}?.i32 +list == list != false +list == list ? i32 : i +list == map(list, #) +list == nil && ok +list == nil ? nil : "foo" +list == nil or f64 == f64 +list not in groupBy(list, #).i list[-1] list[-i32] list[-i64] -list[-i64].String list[-i] -list[-i].String -list[1 % i32] -list[1 * i64] -list[1:i] == list +list[1 - 1] +list[1] not in list list[1].Bar list[1].Qux list[1].String @@ -9503,35 +12379,35 @@ list[1]?.Bar list[1]?.Qux list[1]?.String list[1]?.String() -list[false ? add : 1] -list[false ? nil : i] -list[false ? true : f64] -list[findIndex(list, ok)] -list[i * i32] +list[bitnot(i)] +list[bitshr(i32, i32)] +list[findIndex(array, true)] +list[first(array)] +list[i * i64] list[i32:i32] -list[i32:i64] list[i32:i] list[i32] +list[i32] in list list[i32].Bar list[i32].Qux list[i32].String -list[i32].String() list[i32]?.Bar list[i32]?.Qux list[i32]?.String -list[i64 % 1] -list[i64:i32] +list[i32]?.String() +list[i64:i32 - i] list[i64:i64] -list[i64:i] list[i64] +list[i64] in list list[i64].Bar list[i64].Qux list[i64].String -list[i64].String() list[i64]?.Bar list[i64]?.Qux list[i64]?.String -list[i:false ? false : i64] +list[i:i32] +list[i:i64] +list[i:i64] == nil != nil list[i:i] list[i] list[i].Bar @@ -9540,17 +12416,22 @@ list[i].String list[i].String() list[i]?.Bar list[i]?.Qux +list[i]?.String list[i]?.String() -list[int(0.5)] +list[int(f32)] list[int(f64)] list[int(i)] -list[max(i)] +list[int(i64)] +list[max(i64, 1)] list[min(i)] -list[ok ? f32 : add] +list[min(i32)] +list[ok ? 1 : half] list[score(1)] list[score(i)] -list[true ? f64 : true] lower("bar" + "bar") +lower("bar") == trimSuffix("bar") +lower("foo" + "bar") +lower(false ? foo : "bar") lower(foo.Bar) lower(foo.String()) lower(foo?.Bar) @@ -9558,107 +12439,89 @@ lower(foo?.String()) lower(greet("bar")) lower(greet("foo")) lower(lower("bar")) -lower(lower(trimSuffix("bar"))) -lower(string("bar")) +lower(lower("foo")) +lower(reduce(array, "bar")) +lower(reduce(list, "bar")) lower(string("foo")) lower(string(0.5)) lower(string(add)) -lower(string(array)) -lower(string(div)) lower(string(f32)) lower(string(f64)) -lower(string(false)) lower(string(foo)) lower(string(greet)) -lower(string(half)) lower(string(i)) lower(string(i32)) lower(string(i64)) lower(string(list)) lower(string(nil)) -lower(string(ok)) lower(string(score)) -lower(string(true)) -lower(toBase64("bar" + "bar")) -lower(toBase64("bar")) lower(toBase64("foo")) +lower(toBase64(string(i))) lower(toJSON("bar")) lower(toJSON("foo")) lower(toJSON(0.5)) lower(toJSON(1)) -lower(toJSON(array)) -lower(toJSON(f32)) lower(toJSON(f64)) -lower(toJSON(false)) lower(toJSON(foo)) -lower(toJSON(i)) -lower(toJSON(i32)) -lower(toJSON(i64)) lower(toJSON(list)) lower(toJSON(nil)) lower(toJSON(ok)) lower(toJSON(true)) +lower(trim("bar")) lower(trim("foo")) lower(trimPrefix("bar")) +lower(trimPrefix("foo")) lower(trimSuffix("bar")) -lower(trimSuffix("foo")) -lower(trimSuffix(foo?.String())) lower(type("bar")) lower(type("foo")) -lower(type(0.5 * i64)) lower(type(0.5)) lower(type(1)) -lower(type(array)) +lower(type(add)) lower(type(div)) lower(type(f32)) -lower(type(f64)) -lower(type(false)) -lower(type(foo)) -lower(type(greet)) lower(type(half)) lower(type(i)) +lower(type(i32)) lower(type(i64)) -lower(type(nil)) +lower(type(list)) lower(type(ok)) -lower(type(score)) lower(type(true)) lower(upper("bar")) lower(upper("foo")) -map(1 .. 1, # .. #) -map(1 .. 1, # == f64) -map(1 .. i, #) +map(1 .. 1, f32) +map(1 .. 1, foo) +map(1 .. 1, score) map(1 .. i, foo) -map(1 .. i, greet) map(1 .. i32, #) -map(1 .. i32, ok) -map(1 .. i64, f64 ^ 1) -map(1 .. i64, foo) -map(1 .. i64, list) -map(["bar"], # == #) -map(["foo"], #) -map([1, i], #) -map([add], foo) -map([f32], f64) -map([false], score) -map([greet, i32], #) -map([greet], #) +map(1 .. i32, 0.5 / f64) +map(1 .. i32, div) +map(1 .. i32, reduce(array, #)) +map(1 .. i64, # ^ #) +map(1 .. i64, #) +map(1 .. i64, half) +map(1 .. i64, i32) +map([1], get(#, 1)) +map([f64], half) +map([false], ok) map([half], #) +map([i * i32], score) +map([i32, foo, score], #) map([i32], foo) -map([i64], #) -map([i], max(#)) -map([list, nil], i64) -map([list], #) -map([nil], #?.div(#)) -map([score, "bar"], #) -map([score], #) -map([score], array) -map(array, !false) -map(array, !true) -map(array, "bar" != "foo") -map(array, "bar" contains "foo") -map(array, "bar")[i64] -map(array, # != # ? # : array) +map([i32], greet) +map([i32], half) +map([list, 1, foo], i32) +map([nil], #?.f32(ok, #, false)) +map([nil], foo) +map([score, "bar"], f32) +map([true, i32, 1], #) +map(array, !(# == #)) +map(array, !(nil in list)) +map(array, !ok) +map(array, "bar" in foo) +map(array, "foo" not endsWith "bar") +map(array, "foo") == array map(array, # != #) +map(array, # != 0.5) map(array, # != 1) map(array, # != f64) map(array, # != i32) @@ -9666,1223 +12529,1153 @@ map(array, # != nil) map(array, # % #) map(array, # % 1) map(array, # % i) -map(array, # % i32) map(array, # % i64) map(array, # * #) map(array, # * 0.5) +map(array, # * 1) +map(array, # * f32) map(array, # * f64) -map(array, # * i32) -map(array, # * i64) +map(array, # * i) map(array, # ** #) -map(array, # ** 0.5) +map(array, # ** 1) +map(array, # ** f32) map(array, # ** i) -map(array, # ** i32) map(array, # ** i64) map(array, # + #) map(array, # + 0.5) map(array, # + 1) -map(array, # + f64) +map(array, # + f32) map(array, # + i) map(array, # + i32) -map(array, # + i64) map(array, # - #) map(array, # - 0.5) map(array, # - 1) map(array, # - f32) +map(array, # - f64) map(array, # - i) map(array, # - i32) map(array, # .. #) map(array, # .. 1) -map(array, # .. i) -map(array, # .. i32) -map(array, # .. i64) map(array, # / #) map(array, # / 0.5) +map(array, # / 1) +map(array, # / f32) map(array, # / f64) map(array, # / i) -map(array, # / i32) map(array, # / i64) map(array, # < #) -map(array, # < 0.5) map(array, # < 1) map(array, # < f32) -map(array, # < f64) +map(array, # < i32) +map(array, # < i64) map(array, # <= #) -map(array, # <= 1) -map(array, # <= i64) +map(array, # <= f32) +map(array, # <= i) +map(array, # <= i32) map(array, # == #) -map(array, # == 1) -map(array, # == i64) +map(array, # == f32) +map(array, # == f64) +map(array, # == nil) map(array, # > #) +map(array, # > 0.5) map(array, # > 1) map(array, # > f32) -map(array, # > i32) -map(array, # > i64) +map(array, # > f64) map(array, # >= #) -map(array, # >= 0.5) map(array, # >= 1) -map(array, # >= f64) -map(array, # >= i) +map(array, # >= f32) map(array, # >= i32) +map(array, # >= i64) map(array, # ^ #) map(array, # ^ 0.5) +map(array, # ^ 1) map(array, # ^ i) map(array, # ^ i32) -map(array, # ^ i64) -map(array, # in array) +map(array, # not in array) map(array, #) map(array, #) != array map(array, #) != list -map(array, #) != nil == nil +map(array, #) == array +map(array, #) == list map(array, #)[i64] map(array, #)[i] map(array, -#) -map(array, -(# ** f64)) +map(array, --#) map(array, -0.5) map(array, -1) map(array, -f64) map(array, -i) +map(array, -i32) map(array, -i64) map(array, 0.5 != #) map(array, 0.5 != 0.5) -map(array, 0.5 != i32) map(array, 0.5 * #) -map(array, 0.5 ** #) +map(array, 0.5 * f64) +map(array, 0.5 ** f32) +map(array, 0.5 ** i64) map(array, 0.5 + #) +map(array, 0.5 + 1) map(array, 0.5 - #) -map(array, 0.5 / #) +map(array, 0.5 - 0.5) +map(array, 0.5 / i) map(array, 0.5 < #) -map(array, 0.5 < 1) -map(array, 0.5 <= f32) -map(array, 0.5 == #) -map(array, 0.5 == i32) +map(array, 0.5 < i32) map(array, 0.5 > #) +map(array, 0.5 > i64) +map(array, 0.5 >= #) map(array, 0.5 ^ #) +map(array, 0.5)[i] map(array, 1 != #) -map(array, 1 != 1) map(array, 1 != f32) map(array, 1 % #) -map(array, 1 % i) -map(array, 1 * #) -map(array, 1 * f32) map(array, 1 ** #) -map(array, 1 ** 1) -map(array, 1 ** i32) +map(array, 1 ** i) +map(array, 1 ** i64) map(array, 1 + #) +map(array, 1 + f64) +map(array, 1 - #) map(array, 1 .. #) map(array, 1 / #) -map(array, 1 / 1) -map(array, 1 < 0.5) +map(array, 1 / i32) +map(array, 1 < #) map(array, 1 <= #) +map(array, 1 <= 1) +map(array, 1 <= f32) map(array, 1 == #) -map(array, 1 == nil) -map(array, 1 >= #) -map(array, 1 >= f64) map(array, 1 ^ #) -map(array, 1 ^ 1) -map(array, 1 in array) -map(array, 1)[i64] -map(array, 1)[i] -map(array, [array]) -map(array, [i32, foo]) map(array, abs(#)) -map(array, abs(0.5)) +map(array, abs(i64)) +map(array, add == greet) +map(array, add == nil) map(array, add(#, #)) map(array, add(#, i)) -map(array, add(1, #)) map(array, add) -map(array, add) != list -map(array, all(array, true)) -map(array, array != nil) map(array, array) -map(array, array) == array +map(array, array)[bitnot(i32)] +map(array, array)[i64] map(array, array[#:#]) -map(array, array[1]) +map(array, bitand(#, 1)) +map(array, bitnand(#, 1)) +map(array, bitnot(#)) +map(array, bitnot(1)) +map(array, bitshl(#, #)) +map(array, bitshr(#, #)) +map(array, bitshr(#, i64)) +map(array, bitushr(1, #)) +map(array, ceil(#)) +map(array, ceil(0.5)) +map(array, ceil(f32)) map(array, div(#, #)) map(array, div) +map(array, f32 * #) +map(array, f32 * f64) map(array, f32 ** #) -map(array, f32 ** f64) map(array, f32 + #) -map(array, f32 - f64) map(array, f32 / #) map(array, f32 < #) -map(array, f32 <= #) -map(array, f32 <= 1) map(array, f32 == #) map(array, f32 > #) +map(array, f32 >= #) +map(array, f32 >= i) +map(array, f32 ^ #) map(array, f32) +map(array, f32)[min(i32)] map(array, f64 != #) map(array, f64 != 0.5) -map(array, f64 * 1) +map(array, f64 * #) map(array, f64 ** #) -map(array, f64 - #) -map(array, f64 / 1) -map(array, f64 <= f64) -map(array, f64 > #) +map(array, f64 ** 0.5) +map(array, f64 / #) +map(array, f64 < #) +map(array, f64 < f64) +map(array, f64 <= #) +map(array, f64 == #) +map(array, f64 >= #) +map(array, f64 >= i32) +map(array, f64 ^ #) map(array, f64) -map(array, f64) != list -map(array, f64) == i .. 1 -map(array, false ? "foo" : #) -map(array, false ? 0.5 : #) -map(array, false)[i] -map(array, findLast(array, true)) -map(array, float(# * f64)) +map(array, false && false) +map(array, false ? # : f64) +map(array, false ? greet : i) +map(array, false)[i32] +map(array, find(array, true)) +map(array, findIndex(list, ok)) +map(array, float(# + #)) map(array, float(#)) -map(array, float(1)) -map(array, float(i64)) +map(array, floor(#)) +map(array, foo == foo) map(array, foo) map(array, foo.Bar) map(array, foo.Qux) map(array, foo.String()) map(array, foo.String) -map(array, foo?.Qux) +map(array, foo?.Bar) map(array, foo?.String) map(array, get(array, #)) -map(array, get(list, #)) -map(array, greet != half) map(array, greet("bar")) map(array, greet("foo")) map(array, greet) -map(array, greet) == list +map(array, groupBy(array, #)) +map(array, groupBy(array, f32)) +map(array, groupBy(list, #)) +map(array, groupBy(list, f64)) +map(array, groupBy(list, i)) +map(array, half != half) +map(array, half != nil) map(array, half(0.5)) +map(array, half(1)) +map(array, half(f64)) +map(array, half(i - 0.5)) map(array, half) -map(array, i != #) -map(array, i != f64) -map(array, i % i) -map(array, i * 0.5) -map(array, i ** #) -map(array, i ** 0.5) -map(array, i .. #) -map(array, i / #) +map(array, i % #) +map(array, i + #) +map(array, i - i32) +map(array, i / 0.5) +map(array, i <= #) +map(array, i <= f32) +map(array, i <= f64) map(array, i == #) -map(array, i > #) -map(array, i >= f64) -map(array, i ^ #) +map(array, i == f64) +map(array, i > i32) +map(array, i >= #) map(array, i) -map(array, i)[i64] -map(array, i32 % #) -map(array, i32 % i) +map(array, i)[i] map(array, i32 * #) -map(array, i32 + 0.5) -map(array, i32 + i64) -map(array, i32 - #) -map(array, i32 / #) -map(array, i32 < 0.5) +map(array, i32 ** #) +map(array, i32 ** f64) +map(array, i32 / f32) +map(array, i32 < #) +map(array, i32 < f64) map(array, i32 == #) -map(array, i32 == 0.5) -map(array, i32 == nil) +map(array, i32 == 1) map(array, i32 > #) -map(array, i32 >= f32) map(array, i32 ^ #) +map(array, i32 not in array) map(array, i32) +map(array, i32) == array +map(array, i32) == list map(array, i64 != #) +map(array, i64 % #) map(array, i64 * #) -map(array, i64 ** #) -map(array, i64 + #) +map(array, i64 * 0.5) +map(array, i64 + 0.5) map(array, i64 - #) map(array, i64 .. #) -map(array, i64 / #) -map(array, i64 <= 1) -map(array, i64 == #) -map(array, i64 == f64) +map(array, i64 < #) +map(array, i64 <= #) +map(array, i64 <= f64) +map(array, i64 <= i64) map(array, i64 > #) -map(array, i64 >= i64) -map(array, i64 ^ #) -map(array, i64 ^ i32) map(array, i64) -map(array, i64)[i32] map(array, int(#)) map(array, int(0.5)) -map(array, int(f64)) -map(array, last(array)) -map(array, len(array)) +map(array, len("foo")) +map(array, list != array) map(array, list) -map(array, map(array, #)) -map(array, map(array, true)) -map(array, map(list, #)) -map(array, map(list, f64)) +map(array, map(array, f64)) +map(array, map(list, greet)) map(array, max(#)) -map(array, max(#, #, #)) -map(array, max(0.5)) -map(array, max(0.5, #)) -map(array, max(i64, #, i)) -map(array, min(# ^ #)) -map(array, min(#)) -map(array, min(#, #, #, #)) -map(array, min(#, 1)) -map(array, min(#, 1, #)) -map(array, min(#, 1, f64)) -map(array, min(#, f32)) -map(array, min(#, f64)) -map(array, nil != #) +map(array, max(f32, 1)) +map(array, max(f64)) +map(array, mean(array)) +map(array, min(#, #)) map(array, nil == #) -map(array, nil == half) -map(array, not (# < 1)) -map(array, not false) +map(array, nil == ok) +map(array, nil not in list) +map(array, not ok) map(array, not true) -map(array, ok ? # : i64) -map(array, ok ? f32 : div) map(array, ok || ok) map(array, ok) -map(array, one(array, ok)) -map(array, one(array, true)) -map(array, score != nil) +map(array, ok)[i64] +map(array, reduce(array, "bar")) +map(array, reduce(array, #)) +map(array, reduce(list, add)) +map(array, reduce(list, half)) +map(array, round(#)) map(array, score(#)) map(array, score(#, #)) -map(array, score(#, #, 1)) map(array, score(1)) map(array, score) -map(array, sort(array)) -map(array, string("bar")) -map(array, string(# ** f64)) -map(array, string(#)) -map(array, string(array)) +map(array, string(add)) map(array, string(foo)) -map(array, string(list)) -map(array, string(score)) +map(array, string(i64)) +map(array, take(array, #)) +map(array, toBase64("foo")) map(array, toJSON(#)) -map(array, toJSON(array)) -map(array, toJSON(ok)) -map(array, true ? # : #) -map(array, true ? f32 : i) -map(array, true ? nil : #) -map(array, true)[i] +map(array, toJSON(foo)) +map(array, toJSON(list)) +map(array, true != nil) +map(array, true ? 0.5 : #) +map(array, true ? 0.5 : 1) +map(array, true ? f32 : div) +map(array, true ? i : true) map(array, type(#)) -map(array, type(half)) -map(array, type(i)) -map(array, upper("foo")) -map(array[i64:1], array) -map(array[i64:i64], #) -map(array[i:1], i > #) -map(false ? 0.5 : "bar", greet) -map(false ? 1 : list, half) -map(false ? array : "foo", i64 / 1) -map(false ? true : array, #) +map(array, type(f32)) +map(array[1:i32], list) +map(false ? i32 : list, ok) map(filter(array, false), foo) -map(filter(array, ok), # <= #) -map(filter(array, ok), #) -map(filter(array, ok), i32 + #) -map(filter(array, ok), score) -map(filter(array, true), f64) -map(filter(array, true), i) +map(filter(array, ok), 1 * #) +map(filter(list, # != #), #) map(filter(list, false), #) -map(filter(list, true), score) -map(i .. 1, # > #) -map(i .. 1, -i64) -map(i .. 1, f64) -map(i .. i32, #) -map(i .. i32, score) -map(i .. i64, #) -map(i .. i64, f64) -map(i .. i64, score) -map(i32 .. 1, #) -map(i32 .. 1, list) -map(i32 .. i, add) -map(i32 .. i, half) -map(i32 .. i32, #) -map(i32 .. i32, greet) -map(i32 .. i64, abs(#)) -map(i32 .. i64, f64) -map(i64 .. i, #) -map(i64 .. i, i) +map(filter(list, ok), #) +map(filter(list, ok), i) +map(filter(list, true), i64) +map(groupBy(array, #).String, i32) +map(groupBy(array, #).greet, foo.Qux(.f32)) +map(groupBy(array, #).greet, score) +map(groupBy(array, #).score, #?.list()) +map(groupBy(array, 0.5)?.i64, .Qux()) +map(groupBy(array, f64)?.array, first(.div())) +map(groupBy(list, i32).i, #) +map(i .. 1, -#) +map(i .. 1, 0.5 ^ #) +map(i .. 1, f32) +map(i .. 1, i) +map(i .. i, add(#, #)) +map(i .. i, div) +map(i .. i, i32) +map(i .. i32, half) +map(i .. i64, min(#, #, #)) +map(i32 .. 1, half) +map(i32 .. i, f32) +map(i32 .. i32, array) +map(i32 .. i64, div) +map(i32 .. i64, list) +map(i64 .. 1, #) +map(i64 .. 1, 1 ^ #) +map(i64 .. 1, array) +map(i64 .. 1, f32) +map(i64 .. 1, f64) map(i64 .. i32, #) +map(i64 .. i64, # - #) +map(i64 .. i64, #) map(list, !false) -map(list, !true) -map(list, "bar" in #) -map(list, "bar" not in #) +map(list, !ok) +map(list, "bar" not matches "foo") map(list, "bar") != list -map(list, "foo" + "foo") -map(list, "foo" in #) -map(list, "foo" not matches "bar") -map(list, "foo") == list +map(list, "bar")[i64] +map(list, "foo" not in foo) +map(list, "foo" not matches #.Bar) map(list, # != #) -map(list, # != foo) map(list, # != nil) map(list, # == #) -map(list, # == foo) -map(list, # not in list) +map(list, # in list) map(list, #) -map(list, #) == array +map(list, #) != array map(list, #) == list -map(list, #)[i32] map(list, #)[i64] map(list, #)[i] map(list, #?.Bar) -map(list, #?.Qux("bar")) map(list, #?.Qux) map(list, #?.String()) map(list, #?.String) map(list, -0.5) -map(list, -1) -map(list, -f64) +map(list, -f32) map(list, -i) -map(list, .Bar not in # != true) +map(list, -i32) map(list, .Bar) map(list, .Qux) map(list, .String()) map(list, .String) -map(list, 0.5 - i64) -map(list, 0.5 < f32) -map(list, 0.5 <= f32) -map(list, 0.5 <= i64) -map(list, 0.5 >= 1) -map(list, 0.5 ^ 1) -map(list, 1 + i) -map(list, 1 - f64) -map(list, 1 .. 1) -map(list, 1 .. i64) -map(list, 1 / 1) -map(list, 1 / f32) -map(list, 1 < i32) -map(list, 1 > i32) -map(list, 1 >= f64) -map(list, [1]) -map(list, [false]) -map(list, abs(0.5)) -map(list, abs(1)) +map(list, 0.5 != 0.5) +map(list, 0.5 != i64) +map(list, 0.5 + i64) +map(list, 0.5 - 0.5) +map(list, 0.5 <= 0.5) +map(list, 0.5 == i32) +map(list, 0.5 in array) +map(list, 0.5) != array +map(list, 0.5) == array +map(list, 1 % i) +map(list, 1 ** 0.5) +map(list, 1 ** f32) +map(list, 1 + 1) +map(list, 1 / f64) +map(list, 1 / i64) +map(list, 1 < 0.5) +map(list, 1 <= i32) +map(list, 1 ^ i32) +map(list, [#]) +map(list, [foo, 0.5, #]) +map(list, [score]) +map(list, abs(f32)) +map(list, add == score) map(list, add) map(list, array) -map(list, div != greet) -map(list, div == div) +map(list, ceil(0.5)) +map(list, count(array, true)) map(list, div) -map(list, div) != list -map(list, f32 != f32) -map(list, f32 ** f32) -map(list, f32 / i32) -map(list, f32 < 0.5) -map(list, f32 <= 1) +map(list, f32 != i32) +map(list, f32 ** 1) +map(list, f32 + i64) +map(list, f32 < f32) +map(list, f32 == 0.5) +map(list, f32 > i64) +map(list, f32 >= i) +map(list, f32 >= i32) +map(list, f32 ^ i) map(list, f32) -map(list, f64 * 0.5) -map(list, f64 * f32) -map(list, f64 ** i32) -map(list, f64 + 1) -map(list, f64 + i32) -map(list, f64 - 0.5) -map(list, f64 < f64) -map(list, f64 ^ i64) +map(list, f64 < 0.5) +map(list, f64 < f32) +map(list, f64 <= 1) +map(list, f64 > 1) +map(list, f64 >= 0.5) +map(list, f64 >= f32) map(list, f64) -map(list, f64) != list -map(list, false ? # : nil) -map(list, false ? f32 : #) -map(list, false ? f32 : foo) -map(list, false and true) -map(list, filter(list, false)) -map(list, first(list)) -map(list, float(0.5)) -map(list, float(1)) -map(list, float(f32)) -map(list, float(i64)) +map(list, f64)[i] +map(list, false ? # : list) +map(list, false) != array +map(list, float(f64)) +map(list, float(i)) +map(list, float(i32)) map(list, foo == #) map(list, foo) -map(list, foo.Bar) -map(list, foo.String) -map(list, foo?.String()) +map(list, foo.Qux) +map(list, foo.String()) map(list, foo?.String) -map(list, greet == greet) -map(list, greet("foo")) map(list, greet) -map(list, greet) != array ? 0.5 : 1 -map(list, half != score) +map(list, groupBy(array, #)) +map(list, groupBy(array, i)) +map(list, groupBy(list, #)) +map(list, half == greet) map(list, half(0.5)) +map(list, half(f64)) map(list, half) -map(list, i * 1) -map(list, i * i64) -map(list, i + i) -map(list, i >= f64) -map(list, i >= i64) -map(list, i ^ f32) -map(list, i ^ i64) +map(list, i ** 1) +map(list, i + i64) +map(list, i .. i) +map(list, i < 0.5) +map(list, i == 1) map(list, i) -map(list, i32 * f32) -map(list, i32 == i64) -map(list, i32 == nil) -map(list, i32 > i) -map(list, i32 ^ 0.5) +map(list, i)[i64] +map(list, i32 % i64) +map(list, i32 ** 0.5) +map(list, i32 + f32) +map(list, i32 - i32) +map(list, i32 / f64) +map(list, i32 < 1) +map(list, i32 < i32) +map(list, i32 <= 1) +map(list, i32 >= 1) map(list, i32) -map(list, i64 == 1) -map(list, i64 == f32) -map(list, i64 ^ (i + i32)) +map(list, i64 * i) +map(list, i64 + i64) +map(list, i64 <= i64) +map(list, i64 == nil) map(list, i64) -map(list, int(1)) -map(list, len(array)) +map(list, i64)[i64] +map(list, i64)[i] +map(list, last(array)) map(list, list) -map(list, map(array, score)) -map(list, map(list, #)) -map(list, min(i64)) +map(list, list)[i] +map(list, map(array, #)) +map(list, map(array, 1)) +map(list, map(array, div)) +map(list, map(array, i64)) +map(list, map(list, "foo")) +map(list, max(f32)) +map(list, min(0.5)) +map(list, min(f64)) map(list, nil != #) -map(list, nil != 1) -map(list, nil != array) -map(list, nil != i) -map(list, nil != nil) +map(list, nil != i64) map(list, nil == #) -map(list, nil == div) -map(list, nil == foo) -map(list, nil == i32) -map(list, nil not in array) -map(list, not false) +map(list, nil == ok) +map(list, nil not in list) +map(list, none(array, true)) map(list, not ok) -map(list, not true) -map(list, ok ? i64 : i64) +map(list, ok ? # : #) +map(list, ok || ok) map(list, ok) -map(list, ok) != array -map(list, score != greet) -map(list, score(i)) +map(list, reduce(array, half)) +map(list, reduce(list, foo)) +map(list, reduce(list, half)) +map(list, score != add) +map(list, score(1)) map(list, score) +map(list, score)[i64] map(list, string(#)) -map(list, string(foo)) -map(list, string(nil)) -map(list, toBase64("foo")) +map(list, string(1)) +map(list, string(add)) +map(list, string(i32)) map(list, toJSON(#)) -map(list, toJSON(1)) -map(list, toJSON(foo)) -map(list, toJSON(i)) -map(list, trimPrefix("bar")) -map(list, trimSuffix("foo")) -map(list, true ? false : score) -map(list, true ? nil : #) +map(list, toJSON([#])) +map(list, toJSON(false)) +map(list, toJSON(ok)) +map(list, true ? i : f32) +map(list, true ? i32 : #) +map(list, true ? list : div) map(list, true)[i32] +map(list, type("bar")) map(list, type(#)) -map(list, type(greet)) -map(list, type(half)) -map(list, type(i)) -map(list, type(i64)) -map(list[i:i], i) -map(map(array, "bar"), #) -map(map(array, # >= #), add) -map(map(array, #), # < #) -map(map(array, #), # ^ i32) +map(list, type(i32)) +map(list, type(true)) +map(list[i64:i32], greet) +map(map(array, #), # - i32) +map(map(array, #), # == #) +map(map(array, #), # >= #) map(map(array, #), #) map(map(array, #), add) -map(map(array, #), div) -map(map(array, #), f32) -map(map(array, #), f64) +map(map(array, #), bitand(#, #)) map(map(array, #), foo) -map(map(array, #), foo.Qux) map(map(array, #), greet) map(map(array, #), half) +map(map(array, #), i % i64) map(map(array, #), i) +map(map(array, #), i32) map(map(array, #), i64) -map(map(array, #), int(#)) -map(map(array, #), nil != half) -map(map(array, #), score(i)) -map(map(array, #), score) -map(map(array, 0.5), # != #) +map(map(array, #), list) map(map(array, 0.5), #) -map(map(array, 0.5), -1) -map(map(array, 0.5), list) -map(map(array, 1), #) -map(map(array, 1), ok) -map(map(array, 1), score) -map(map(array, add), #) -map(map(array, add), list) -map(map(array, array), add) -map(map(array, array), f64) +map(map(array, 0.5), ok) +map(map(array, 1), greet) +map(map(array, array), i32 ^ i32) +map(map(array, array), i64) +map(map(array, array), reduce(#, array)) +map(map(array, div), i) +map(map(array, div), list) map(map(array, f32), #) -map(map(array, f64), add) -map(map(array, f64), nil == nil) -map(map(array, foo), #) -map(map(array, foo), f64) -map(map(array, foo), greet) -map(map(array, half), div) +map(map(array, f32), array) +map(map(array, f32), f64) +map(map(array, f64), # > #) +map(map(array, f64), f64) +map(map(array, f64), greet) +map(map(array, foo), div) +map(map(array, greet), foo) +map(map(array, greet), list) +map(map(array, half), array) +map(map(array, i), #) +map(map(array, i32), #) +map(map(array, i64), array) map(map(array, i64), f64) -map(map(array, list), #) -map(map(array, true), #) -map(map(array, true), div) -map(map(array, true), foo) -map(map(list, "foo"), add) -map(map(list, "foo"), div) -map(map(list, "foo"), i32) -map(map(list, #), "bar" + "foo") +map(map(array, list), foo) +map(map(array, ok), !#) +map(map(array, ok), -f32) +map(map(array, true), # != nil) +map(map(array, true), i64) map(map(list, #), # != #) map(map(list, #), #) -map(map(list, #), array) +map(map(list, #), #?.Qux) +map(map(list, #), .Bar) map(map(list, #), div) map(map(list, #), f32) map(map(list, #), f64) map(map(list, #), greet) -map(map(list, #), i) -map(map(list, #), i32) -map(map(list, #), i64 < i32) -map(map(list, #), i64) -map(map(list, #), nil != i) +map(map(list, #), half) +map(map(list, #), list) map(map(list, #), ok) map(map(list, #), score) -map(map(list, 0.5), # / #) map(map(list, 0.5), #) -map(map(list, 0.5), greet) -map(map(list, 0.5), list) -map(map(list, 0.5), score) -map(map(list, 1), # <= #) -map(map(list, 1), foo) -map(map(list, add), [#, #]) -map(map(list, add), f64) -map(map(list, f32), #) -map(map(list, f32), greet) -map(map(list, f32), true ? "foo" : "foo") -map(map(list, f64), #) -map(map(list, false), array) -map(map(list, false), f64) -map(map(list, false), i32) -map(map(list, false), list) +map(map(list, 0.5), div) +map(map(list, 1), # * #) +map(map(list, 1), f32) +map(map(list, add), #) +map(map(list, add), i) +map(map(list, array), f64) +map(map(list, array), findIndex(#, ok)) +map(map(list, f64), f32) +map(map(list, f64), i32) +map(map(list, false), 0.5 / f64) map(map(list, foo), #) -map(map(list, foo), ok) -map(map(list, greet), "bar" != "foo") -map(map(list, greet), # == #) -map(map(list, greet), #) -map(map(list, greet), ["foo", 1]) -map(map(list, greet), half) -map(map(list, half), #) -map(map(list, i), i32) -map(map(list, i32), half) -map(map(list, i32), list) +map(map(list, foo), list) +map(map(list, greet), "bar" <= "foo") +map(map(list, i64), # >= f64) map(map(list, i64), #) -map(map(list, i64), array) -map(map(list, i64), div) -map(map(list, i64), f64) -map(map(list, i64), list) +map(map(list, i64), i64) map(map(list, list), #) -map(map(list, list), div) -map(map(list, list), i) -map(map(list, ok), #) -map(map(list, score), #) -map(map(list, score), ok) -map(map(list, true), #) -map(ok ? "foo" : 0.5, #) -map(ok ? "foo" : greet, f32) -map(ok ? array : "bar", ok) -map(ok ? array : foo, # / 1) -map(sort(array), # > #) -map(sort(array), i32 > #) -map(true ? "bar" : true, #) -map(true ? "foo" : add, i64) -map(true ? array : f64, #) -map(true ? array : true, #) -max(--1) +map(map(list, ok), f64 > i64) +map(map(list, ok), foo) +map(map(list, true), f64) +map(map(list, true), list) +map(ok ? "bar" : i64, ok) +map(ok ? "bar" : ok, i64) +map(ok ? "bar" : score, 1 .. #) +map(ok ? array : foo, foo) +map(ok ? array : i64, list) +map(ok ? list : i64, #) +map(ok ? list : list, add) +map(reduce(array, array), # <= #) +map(reduce(array, array), #) +map(reduce(list, array), -i32) +map(reduce(list, array), foo) +map(reduce(list, array), half) +map(reduce(list, list), #) +map(sort(array), # / 0.5) +map(sort(array), #) +map(sort(array), greet) +map(split("foo", "bar"), #) +map(true ? "foo" : 0.5, # * #) +map(true ? array : "foo", f32 + #) +map(true ? list : greet, greet) +map(true ? list : list, #) max(-0.5) max(-1) -max(-1, i) -max(-count(list, false), i64) max(-f32) max(-f64) +max(-findIndex(array, ok)) max(-i) -max(-i, i32, i) +max(-i, f32) max(-i32) max(-i64) -max(-i64, 0.5 / f64) -max(0.5 * 0.5) -max(0.5 * f64) +max(-reduce(array, #)) +max(0.5 * f32) max(0.5 * i) -max(0.5 * i, i32) -max(0.5 * i32) +max(0.5 * i64) max(0.5 ** 0.5) max(0.5 ** 1) max(0.5 ** f32) -max(0.5 ** f64) +max(0.5 ** f64 ^ reduce(array, f64)) max(0.5 ** i) -max(0.5 ** i64) -max(0.5 + 0.5) +max(0.5 ** i32) max(0.5 + 1) -max(0.5 + i) -max(0.5 + i32) -max(0.5 + i64) max(0.5 - 0.5) -max(0.5 - 1) -max(0.5 - i) -max(0.5 - i32) -max(0.5 - i64) +max(0.5 - f32) +max(0.5 - f64) max(0.5 / 0.5) -max(0.5 / f32) +max(0.5 / 1) max(0.5 / f64) -max(0.5 / f64, f64) -max(0.5 / i) +max(0.5 / i32) max(0.5 / i64) max(0.5 ^ 0.5) max(0.5 ^ 1) -max(0.5 ^ f32) max(0.5 ^ i) max(0.5 ^ i32) max(0.5 ^ i64) -max(0.5) != i == ok -max(0.5) * f32 -max(0.5) * f64 +max(0.5) != f32 +max(0.5) != i +max(0.5) + f64 max(0.5) + i -max(0.5) - f32 -max(0.5) - f64 -max(0.5) < f64 -max(0.5) <= 0.5 - 0.5 -max(0.5) <= f64 -max(0.5) == f32 -max(0.5) == i64 -max(0.5) > f32 -max(0.5) >= i32 -max(0.5) ^ i32 -max(0.5, 1) <= i32 +max(0.5) - i32 +max(0.5) / i64 +max(0.5) <= i +max(0.5) > f64 +max(0.5) > i +max(0.5) > i64 +max(0.5) >= i64 +max(0.5, 0.5) != i +max(0.5, i) ** i32 max(1 % 1) -max(1 % i) -max(1 % i32) max(1 % i64) max(1 * 0.5) max(1 * 1) +max(1 * f64) +max(1 * i32) max(1 ** 0.5) max(1 ** 1) -max(1 ** f64) +max(1 ** f32) max(1 ** i64) -max(1 + f32, f64) +max(1 + f32) max(1 + i64) -max(1 - 1) -max(1 - i32) -max(1 - i64) -max(1 / 0.5) +max(1 - f32) +max(1 - f64) max(1 / 1) max(1 / f32) +max(1 / f32, i64) max(1 / f64) +max(1 / i) +max(1 / i32) +max(1 / i64) +max(1 ^ 0.5) max(1 ^ 1) +max(1 ^ f32) +max(1 ^ f64) max(1 ^ i32) -max(1) != i -max(1) * i +max(1 ^ i64) +max(1) != 1 ? foo : "bar" +max(1) + f32 max(1) - f64 -max(1) - i64 -max(1) .. i32 +max(1) .. i max(1) / i -max(1) / i64 -max(1) <= f32 -max(1) <= i -max(1) <= i32 -max(1) <= i64 -max(1) == f32 -max(1) > f32 +max(1) == i64 max(1) > f64 -max(1) > i -max(1) > i64 -max(1, i32, f32) != i64 +max(1) > i32 +max(1, i) not in array max(abs(0.5)) max(abs(1)) max(abs(f32)) max(abs(f64)) max(abs(i)) max(abs(i32)) -max(abs(i64)) +max(add(1, i)) max(array[1]) max(array[i64]) -max(array[i]) -max(count(array, false)) -max(count(list, false)) -max(div(1, 1)) -max(f32 * 0.5) +max(bitnand(i32, 1)) +max(bitnot(1)) +max(bitnot(i)) +max(bitnot(i64)) +max(bitshr(1, i32)) +max(bitxor(1, 1)) +max(ceil(0.5), f64 / i64) +max(ceil(f32)) +max(ceil(i32)) max(f32 * 1) -max(f32 * f32) -max(f32 * i32) -max(f32 ** 0.5) +max(f32 * f64) +max(f32 * i64) max(f32 ** 1) -max(f32 ** i32) -max(f32 ** i64) +max(f32 ** f64) max(f32 + 1) max(f32 + f64) +max(f32 + i) max(f32 + i64) -max(f32 - f64) -max(f32 - i) -max(f32 - i32) +max(f32 - 1) +max(f32 - i64) max(f32 / 0.5) max(f32 / f32) -max(f32 ^ 0.5) max(f32 ^ 1) max(f32 ^ f32) -max(f32 ^ i32) +max(f32 ^ f64) max(f32 ^ i64) max(f32) -max(f32) != -i32 -max(f32) != i32 -max(f32) + i64 -max(f32) - f32 -max(f32) <= i -max(f32) <= max(f64) -max(f32) >= i64 +max(f32) * i64 +max(f32) ** i +max(f32) + f32 +max(f32) + f64 +max(f32) - f64 +max(f32) / i32 +max(f32) < i +max(f32) == i max(f32) ^ f32 -max(f32) ^ i32 -max(f32, -f32) -max(f32, 1) > i32 max(f32, f32) max(f32, f64) +max(f32, f64) in array max(f32, i) max(f32, i32) +max(f32, i32) ** i64 max(f32, i64) -max(f32, min(i)) -max(f64 * 0.5) +max(f64 * 1) max(f64 * f64) -max(f64 * i, f32) -max(f64 * i32) -max(f64 ** 1) +max(f64 ** 0.5) +max(f64 ** f64) max(f64 ** i) -max(f64 ** i64) -max(f64 + 0.5) -max(f64 - i32) -max(f64 - i64) -max(f64 / 0.5) -max(f64 / f32) -max(f64 / i32) +max(f64 + 1) +max(f64 + f32) +max(f64 + f64) +max(f64 - 0.5) +max(f64 - i) max(f64 ^ 0.5) -max(f64 ^ i32) -max(f64 ^ i64) +max(f64 ^ 1) +max(f64 ^ f32) +max(f64 ^ f64) max(f64) -max(f64) != i -max(f64) + f32 -max(f64) + i64 -max(f64) - f32 -max(f64) / f32 -max(f64) / i32 -max(f64) == f64 -max(f64) == i32 -max(f64) > f32 -max(f64) > f64 -max(f64) > i64 -max(f64) ^ 1 ^ i64 -max(f64) ^ i -max(f64) ^ min(i32, 1) -max(f64, -1) -max(f64, 0.5 ** i64) -max(f64, 1) <= f64 -max(f64, 1) == i32 +max(f64) != f64 +max(f64) < i32 +max(f64) <= f32 +max(f64) == f32 +max(f64) == i +max(f64) == round(i) +max(f64) ^ f32 +max(f64) ^ i64 max(f64, f32) -max(f64, f32, i32) -max(f64, f32, i64) +max(f64, f32) <= int(f64) max(f64, f64) -max(f64, f64, score(1)) -max(f64, float(i)) -max(f64, half(f64)) max(f64, i) +max(f64, i) - 1 ^ i +max(f64, i) < i +max(f64, i) > f64 max(f64, i32) max(f64, i64) -max(false ? 1 : 0.5) -max(false ? 1 : nil) -max(false ? add : ok) -max(false ? half : list) -max(false ? i : nil) -max(false ? i32 : score) -max(false ? true : 1) -max(find(array, ok)) -max(find(array, true)) -max(findIndex(array, ok)) -max(findIndex(array, true)) +max(f64, i64) ^ f32 +max(false ? 0.5 : array) +max(false ? add : f64) +max(false ? div : half) +max(false ? div : i64) +max(false ? ok : 0.5) +max(find(array, false)) +max(findIndex(list, false)) max(findIndex(list, ok)) -max(findIndex(list, true)) max(findLast(array, false)) -max(findLast(array, true)) -max(findLastIndex(array, false)) -max(findLastIndex(list, true)) -max(first(array)) max(float(0.5)) max(float(1)) -max(float(f32)) -max(float(f64)) -max(float(i)) +max(float(1), i) +max(float(i32)) max(float(i64)) -max(float(i64), f64) +max(float(score(i))) +max(floor(0.5)) +max(floor(1)) +max(floor(f32)) +max(floor(i)) +max(floor(i32)) +max(floor(len(array))) max(get(array, 1)) max(get(array, i)) max(get(array, i32)) max(get(array, i64)) -max(half(-0.5)) max(half(0.5)) +max(half(1)) +max(half(1), i64) max(half(f64)) -max(i % i) -max(i % i32) -max(i % i64) +max(i % 1) max(i * 0.5) -max(i * 1) max(i * f32) -max(i * i32) -max(i ** 0.5) -max(i ** 1) +max(i * i) +max(i * i64) max(i ** f64) -max(i ** i) -max(i ** i64) -max(i + 0.5) +max(i ** score(1)) max(i + 1) -max(i + f32) -max(i + f64) -max(i + i) max(i - 1) -max(i - i32) -max(i - i32, f32) +max(i - i) max(i - i64) -max(i / 0.5) -max(i / f32) -max(i / i32, f64) -max(i ^ 0.5) -max(i ^ 1) -max(i ^ f32) max(i ^ f64) max(i) -max(i) != f64 -max(i) ** f64 -max(i) + f32 -max(i) + i64 -max(i) - f32 -max(i) - f64 -max(i) - i32 -max(i) - i64 -max(i) / f64 -max(i) >= i64 -max(i) ^ (i * i) -max(i) ^ f32 -max(i, -f32) +max(i) != i32 +max(i) != i64 +max(i) % (i64 + i) +max(i) % array[i32] +max(i) ** (1 / i32) +max(i) + f64 +max(i) - i +max(i) / f32 +max(i) / i +max(i) < 0.5 - f64 +max(i) < f32 +max(i) < i32 +max(i) <= f64 +max(i) == f64 +max(i) >= i max(i, f32) -max(i, f32, f32) max(i, f64) max(i, i) max(i, i32) max(i, i64) -max(i, i64, i64) +max(i, i64, i32) max(i32 % 1) -max(i32 % i32) max(i32 * 0.5) max(i32 * 1) max(i32 * f32) +max(i32 * i) max(i32 * i64) -max(i32 + 0.5, f64) -max(i32 + f64) -max(i32 + i) -max(i32 + i32) +max(i32 ** f32) +max(i32 ** i) +max(i32 ** i32) +max(i32 + 0.5) +max(i32 + i64) +max(i32 - 0.5) +max(i32 - 1) +max(i32 - f64) max(i32 - i) -max(i32 - i64) -max(i32 / f32) -max(i32 / f64) -max(i32 / i64) -max(i32 ^ 0.5) -max(i32 ^ 1) -max(i32 ^ f32) +max(i32 / 1) max(i32 ^ i) -max(i32 ^ i32) +max(i32 ^ i, f32) max(i32) -max(i32) != min(i64) -max(i32) - f32 -max(i32) - i64 +max(i32) * i32 max(i32) / f32 -max(i32) >= i32 -max(i32) ^ i64 -max(i32, 1) == i32 -max(i32, abs(f64)) +max(i32) / i +max(i32) <= f32 +max(i32) ^ f32 +max(i32) in array max(i32, f32) -max(i32, f32) != i32 max(i32, f64) -max(i32, f64) - f32 max(i32, i) -max(i32, i, i) max(i32, i32) -max(i32, i32, i) max(i32, i64) max(i64 % i) -max(i64 % i32) max(i64 * 0.5) -max(i64 * 1) -max(i64 * f32) -max(i64 * i32) -max(i64 ** 1) +max(i64 * i64) +max(i64 ** 0.5) +max(i64 ** f32) max(i64 ** i64) -max(i64 + 0.5) -max(i64 + f32) -max(i64 + i32) +max(i64 + i) +max(i64 + i64) max(i64 - 0.5) max(i64 - 1) -max(i64 - f32) max(i64 - f64) -max(i64 - i) -max(i64 / 1) max(i64 / f64) -max(i64 / i) +max(i64 / i32) max(i64 / i64) max(i64 ^ 0.5) max(i64 ^ 1) max(i64 ^ i) -max(i64 ^ i64) max(i64) -max(i64) != f32 -max(i64) != i32 -max(i64) * i32 -max(i64) * i64 -max(i64) ** i64 -max(i64) + f32 -max(i64) + i64 -max(i64) / f32 -max(i64) / i -max(i64) / i64 +max(i64) ** (1 + 1) +max(i64) ** f32 +max(i64) + i32 +max(i64) - i32 +max(i64) - i64 +max(i64) .. i32 max(i64) < f32 -max(i64) < i64 -max(i64) <= i -max(i64) == f32 -max(i64) == f64 -max(i64) >= i32 -max(i64) ^ (i64 / f32) -max(i64) in array -max(i64, 1) * i32 +max(i64) >= f32 +max(i64) ^ i +max(i64, 0.5 + 1) +max(i64, 0.5, i64) ** i32 max(i64, f32) max(i64, f64) +max(i64, half(1)) max(i64, i) +max(i64, i) + i32 max(i64, i32) +max(i64, i32) == f64 max(i64, i64) max(int(0.5)) -max(int(1)) max(int(f32)) -max(int(f64)) -max(int(i)) max(int(i32)) max(int(i64)) -max(last(array)) -max(len("bar")) max(len("foo")) max(len(array)) max(len(list)) -max(len(list), 0.5 - i) max(max(0.5)) -max(max(0.5, 0.5)) +max(max(0.5, f64)) max(max(1)) -max(max(f32)) -max(max(f64)) max(max(i)) max(max(i32)) max(max(i64)) -max(min(0.5)) -max(min(0.5, i)) +max(mean(array)) +max(median(array)) +max(min(0.5, 0.5)) max(min(1)) -max(min(1, i64, 1)) -max(min(f32)) -max(min(f64)) -max(min(f64, i64)) +max(min(1, f64)) +max(min(f32, i64, i32)) max(min(i)) max(min(i32)) -max(min(i32, i)) -max(ok ? 1 : foo) +max(ok ? "foo" : f64) +max(ok ? 0.5 : i64) max(ok ? 1 : i) -max(ok ? 1 : i32) -max(ok ? div : foo) -max(ok ? div : i64) -max(ok ? i : true) -max(ok ? ok : i64) -max(ok ? true : 0.5) +max(ok ? array : true) +max(ok ? foo : greet) +max(ok ? half : f32) +max(ok ? half : list) +max(ok ? i : 1) +max(ok ? i : nil) +max(reduce(array, # % #)) +max(reduce(array, #)) +max(reduce(array, 1)) +max(reduce(array, f32)) +max(reduce(array, f64)) +max(reduce(list, 0.5)) +max(reduce(list, f32), i64) +max(reduce(list, i64)) +max(round(1)) +max(round(f32)) +max(round(f64)) +max(round(i)) +max(round(i32)) max(score(1)) -max(score(1), i64) -max(score(i)) -max(score(i, i)) -max(true ? 0.5 : half) -max(true ? 1 : i64) -max(true ? add : list) -max(true ? foo : add) -max(true ? foo : f32) -max(true ? i : ok) -max(true ? i64 : "bar") -min(-(0.5 + i)) -min(-(f32 + i64)) +max(score(i), i) +max(true ? f32 : f32) +max(true ? foo : array) +max(true ? greet : 1) +max({"bar": list}.String) +max({"foo": array}?.f32) +max({"foo": half}?.f32) +mean(1 .. 1) +mean(1 .. i) +mean([f64, 0.5]) +mean([i]) +mean(array) +mean(array) * i +mean(array) + i +mean(array) - min(i) +mean(array) / i +mean(array) / i64 +mean(array) < f32 +mean(array) < f64 +mean(array) <= i64 +mean(array) > f32 +mean(array) >= f32 +mean(array) >= i64 +mean(array) ^ i +mean(array) ^ i32 +mean(filter(array, true)) +mean(groupBy(array, #)?.half) +mean(groupBy(array, i64).score) +mean(i .. 1) +mean(i .. i) +mean(map(array, #)) +mean(map(array, -#)) +mean(map(array, f32)) +mean(map(array, i)) +mean(map(array, i32)) +mean(map(list, 1)) +mean(map(list, f32)) +mean(map(list, i)) +mean(map(list, i32)) +mean(sort(array)) +median(1 .. i) +median(array) +median(array) != f32 +median(array) * 1 * f32 +median(array) * i32 +median(array) ** i64 +median(array) + f32 +median(array) >= i32 +median(array) ^ i32 +median(array) ^ i64 +median(array) not in array +median(array[1:1]) +median(filter(array, ok)) +median(groupBy(list, #).i32) +median(i .. i) +median(i .. i64) +median(i64 .. i64) +median(map(array, #)) +median(map(array, 1)) +median(map(list, 0.5)) +median(map(list, f32)) +median(map(list, i32)) +median(reduce(array, array)) +median(reduce(list, array)) +median(sort(array)) min(-0.5) min(-0.5, i) min(-1) -min(-1, i) -min(-1, i64) min(-f32) -min(-f32, i64) min(-f64) -min(-f64, i32) +min(-half(0.5)) min(-i) min(-i32) min(-i64) min(0.5 * 0.5) min(0.5 * 1) +min(0.5 * f32, i32 ** i32) min(0.5 * f64) min(0.5 * i32) -min(0.5 ** 0.5) -min(0.5 ** f64) +min(0.5 * i64) +min(0.5 ** i) min(0.5 ** i64) -min(0.5 + 1) -min(0.5 + f32) min(0.5 + f64) min(0.5 + i) +min(0.5 + i32) min(0.5 - 0.5) min(0.5 - 1) +min(0.5 - f32) min(0.5 - f64) min(0.5 - i) min(0.5 / 0.5) -min(0.5 / f64) -min(0.5 ^ 1) +min(0.5 / i64) +min(0.5 / i64, i64) +min(0.5 ^ 0.5) min(0.5 ^ f32) min(0.5 ^ i) -min(0.5) != i32 -min(0.5) * 0.5 ** i64 +min(0.5 ^ i32) +min(0.5) != i64 +min(0.5) * i32 +min(0.5) ** f64 min(0.5) ** i -min(0.5) + i -min(0.5) + i32 -min(0.5) + i64 -min(0.5) < f32 -min(0.5) <= i ? f32 : 1 -min(0.5) <= i64 -min(0.5) == i - 0.5 -min(0.5) > i64 -min(0.5) >= i -min(0.5, 0.5) == f32 -min(0.5, 1) >= i64 -min(0.5, i) == i64 -min(0.5, i32, f32) + f32 +min(0.5) + f64 ^ i64 +min(0.5) - f32 +min(0.5) - f64 +min(0.5) / i32 +min(0.5) < i32 +min(0.5) == f32 / f32 +min(0.5) == i +min(0.5) >= i64 +min(0.5) ^ (f32 - i64) +min(0.5, 0.5) < f32 + f64 +min(1 % 1) +min(1 % i) min(1 % i32) min(1 % i64) min(1 * 0.5) min(1 * 1) +min(1 * f32) min(1 * i) min(1 * i32) -min(1 * i64) -min(1 ** 0.5) -min(1 ** f32) -min(1 ** f64) -min(1 ** i32) +min(1 ** i) min(1 + 0.5) min(1 + 1) min(1 + f32) -min(1 + i32) min(1 + i64) min(1 - 1) min(1 - f64) min(1 - i) min(1 - i32) -min(1 / 1) +min(1 - i64) +min(1 / 0.5) +min(1 / f32) min(1 / i) min(1 / i32) -min(1 / i32, f64) min(1 / i64) +min(1 ^ 0.5) min(1 ^ 1) min(1 ^ f32) -min(1 ^ f64) -min(1) != 1 ? list : f64 +min(1 ^ i) +min(1 ^ i32) +min(1 ^ i64) min(1) != i -min(1) % i64 -min(1) * -0.5 -min(1) * 1 ** 1 -min(1) - i64 ^ 0.5 -min(1) .. i -min(1) .. i64 -min(1) / f64 -min(1) / i -min(1) < i -min(1) == f64 -min(1) == i32 +min(1) - i +min(1) .. i32 +min(1) <= f32 +min(1) <= f64 +min(1) > i64 +min(1) >= i min(1) >= i64 -min(1) ^ f32 +min(1) ^ f64 min(abs(0.5)) min(abs(1)) min(abs(f32)) min(abs(f64)) -min(abs(i * 1)) min(abs(i)) min(abs(i32)) -min(abs(i64)) -min(abs(i64), f64) -min(add(1, i)) -min(add(i, i)) min(array[1]) +min(array[i32]) min(array[i]) +min(bitnand(1, i32)) +min(bitnot(1)) +min(bitnot(i)) +min(bitnot(i32)) +min(bitnot(i32), i64) +min(bitnot(i64)) +min(ceil(0.5)) +min(ceil(1)) +min(ceil(f32)) +min(ceil(f64)) +min(ceil(i)) min(count(array, false)) -min(count(array, ok)) -min(count(array, true)) min(count(list, ok)) min(f32 * 1) -min(f32 * f32) -min(f32 * i32) -min(f32 ** i32) -min(f32 ** i64) -min(f32 ** i64, f32) -min(f32 + f64) -min(f32 + i) -min(f32 + i32) -min(f32 + i64) -min(f32 - f32) +min(f32 * i64) +min(f32 ** 0.5) +min(f32 - 0.5) +min(f32 - 1) +min(f32 - f64) min(f32 - i) -min(f32 - i32) min(f32 - i64) -min(f32 / 0.5) -min(f32 / f64) -min(f32 / i) -min(f32 / i32) +min(f32 / 1) min(f32 / i64) -min(f32 ^ 1) -min(f32 ^ f32) -min(f32 ^ i) min(f32 ^ i32) min(f32) -min(f32) * f32 -min(f32) * f64 -min(f32) + i -min(f32) + i32 -min(f32) + i64 -min(f32) - f32 -min(f32) < i64 +min(f32) * i64 +min(f32) / f64 +min(f32) / i32 min(f32) == i -min(f32) == i32 * i32 -min(f32) == i64 -min(f32) > i32 -min(f32) ^ f64 -min(f32, 0.5 ^ 0.5) -min(f32, 0.5) <= i64 +min(f32) >= f64 +min(f32, -0.5) +min(f32, ceil(1)) min(f32, f32) min(f32, f64) -min(f32, f64) >= i -min(f32, get(array, i64)) min(f32, i) min(f32, i32) min(f32, i64) -min(f32, len(array)) -min(f32, len(list)) -min(f64 * 0.5) min(f64 * 1) min(f64 * f64) -min(f64 * i) -min(f64 * i32) -min(f64 ** 1) +min(f64 ** f32) min(f64 ** f64) -min(f64 ** i) -min(f64 ** i32) -min(f64 ** i64) -min(f64 + 1) -min(f64 + i) +min(f64 + 0.5) +min(f64 + f32) min(f64 + i64) -min(f64 - 0.5) +min(f64 - 1) min(f64 - i) min(f64 - i32) -min(f64 - i64) -min(f64 / 1) +min(f64 / 0.5) min(f64 / f32) min(f64 / i) -min(f64 / i32) min(f64 / i64) -min(f64 ^ 0.5) -min(f64 ^ f64) -min(f64 ^ i32) +min(f64 ^ 1) min(f64) -min(f64) + f64 -min(f64) + i32 -min(f64) + i64 -min(f64) / f32 -min(f64) ^ 1 ^ 1 -min(f64) ^ i32 -min(f64) ^ i64 -min(f64, 0.5 ** 1) -min(f64, 0.5, i) <= f64 -min(f64, 1 ** i) -min(f64, 1) < i64 +min(f64) * f64 +min(f64) * i32 +min(f64) / i +min(f64) >= f64 +min(f64, 0.5 ** i64) +min(f64, 0.5) == f64 min(f64, f32) min(f64, f64) -min(f64, f64, i64) min(f64, i) min(f64, i32) min(f64, i64) -min(false ? 1 : add) -min(false ? f64 : false) -min(false ? f64 : score) -min(false ? foo : 1) -min(false ? greet : i) -min(false ? i32 : "foo") -min(false ? i32 : i64) -min(false ? true : 0.5) +min(false ? foo : i32) +min(false ? greet : f32) min(find(array, false)) min(find(array, ok)) -min(findIndex(list, ok)) -min(findLast(array, true)) -min(findLastIndex(array, false)) +min(findIndex(array, false)) +min(findLastIndex(array, i32 > #)) min(findLastIndex(array, ok)) min(findLastIndex(array, true)) min(findLastIndex(list, ok)) @@ -10892,220 +13685,188 @@ min(float(1)) min(float(f32)) min(float(f64)) min(float(i)) -min(float(i32)) -min(float(i64)) -min(get(array, i)) -min(get(array, i64)) -min(half(0.5 ^ i32)) +min(float(i64), i) +min(floor(0.5)) +min(floor(1)) +min(floor(f32)) +min(floor(i)) +min(floor(i32)) +min(floor(i64)) min(half(0.5)) -min(half(0.5), f32) +min(half(1)) +min(half(1), -1) +min(half(f64 - 0.5)) min(half(f64)) min(i % 1) -min(i % i32) min(i % i64) -min(i * 0.5) -min(i * 1) min(i * i) -min(i * i64) min(i ** 0.5) -min(i ** f32) -min(i ** f64) min(i ** i) -min(i ** i64) -min(i + 0.5) -min(i + f32) -min(i + f64) -min(i + i) +min(i + 1) min(i - 0.5) -min(i - 1) -min(i - i) -min(i / 0.5) -min(i / i64) -min(i / i64, i) -min(i ^ 0.5) -min(i ^ i, i32) +min(i - f64) +min(i - i32) +min(i / 1) + f64 +min(i / f64) +min(i ^ f32) +min(i ^ f64) +min(i ^ i) min(i) -min(i) != i32 -min(i) % i min(i) * f32 -min(i) ** i -min(i) .. i +min(i) ** i64 min(i) / f64 -min(i) < f32 -min(i) <= i64 +min(i) / i +min(i) < f64 +min(i) < i32 +min(i) >= i32 +min(i) ^ f32 min(i, f32) +min(i, f32, i) + i32 min(i, f64) min(i, i) -min(i, i32 - i) min(i, i32) -min(i, i64 * f32) min(i, i64) -min(i32 % i) -min(i32 * 1) -min(i32 * f64) -min(i32 * i32) -min(i32 ** 1 ^ i64) -min(i32 ** f32) -min(i32 ** i) -min(i32 ** i64) -min(i32 + 0.5) -min(i32 + 1) -min(i32 + f32) +min(i, last(array)) +min(i32 % 1) +min(i32 * f32) +min(i32 * i) +min(i32 ** 0.5) +min(i32 ** i32) +min(i32 + i32) +min(i32 + i64) min(i32 - 0.5) -min(i32 - 1) -min(i32 - i32) -min(i32 / 1) -min(i32 / i) -min(i32 / i64) -min(i32 / i64, score(1)) -min(i32 ^ 1) +min(i32 - i64) +min(i32 / 0.5) +min(i32 / f64) +min(i32 ^ 0.5) +min(i32 ^ f32) min(i32 ^ f64) -min(i32 ^ i) min(i32 ^ i64) min(i32) -min(i32) != i64 -min(i32) + f32 -min(i32) - i64 -min(i32) / f32 -min(i32) < i32 -min(i32) == f32 -min(i32) == i32 -min(i32) >= i32 -min(i32) ^ f64 -min(i32, 0.5) .. i32 +min(i32) - i +min(i32) .. i32 +min(i32) / i +min(i32) < i +min(i32) <= f32 +min(i32) <= i +min(i32) > f32 +min(i32) > i64 + f64 +min(i32) >= i +min(i32) ^ f32 +min(i32) ^ i64 min(i32, f32) +min(i32, f64 * 0.5) min(i32, f64) min(i32, i) min(i32, i32) -min(i32, i32, i) min(i32, i64) -min(i32, i64) .. i -min(i32, i64) <= f64 -min(i32, min(i)) -min(i64 % i32) -min(i64 * 1, f32) -min(i64 * f64) +min(i64 % 1) +min(i64 * 0.5) +min(i64 * 1) +min(i64 * bitnot(i64)) +min(i64 * i) min(i64 * i32) +min(i64 * i64) min(i64 ** 0.5) -min(i64 ** 1) +min(i64 ** f64) min(i64 ** i) -min(i64 + 0.5) -min(i64 + 1) +min(i64 ** i32) min(i64 + f32) -min(i64 + i) -min(i64 + i32) -min(i64 - 0.5) -min(i64 - f32) min(i64 - f64) -min(i64 - i) -min(i64 - i64) -min(i64 / 0.5) -min(i64 / f64) +min(i64 - i32) +min(i64 / 1) +min(i64 / f32) min(i64 / i) +min(i64 / i32) min(i64 / i64) +min(i64 ^ 0.5) min(i64 ^ 1) +min(i64 ^ f64) min(i64 ^ i32) -min(i64 ^ i64) min(i64) -min(i64) != i64 -min(i64) % i32 -min(i64) ** -1 -min(i64) ** -f64 -min(i64) ** i -min(i64) + i32 -min(i64) .. i -min(i64) .. i64 -min(i64) <= f32 -min(i64) == i -min(i64) ^ f32 -min(i64) ^ f64 -min(i64) in array -min(i64, 1 ** 0.5) -min(i64, 1) <= f64 +min(i64) / f32 +min(i64) < i32 +min(i64) >= f64 +min(i64) not in array min(i64, f32) min(i64, f64) -min(i64, f64) != f64 -min(i64, f64) * i32 -min(i64, f64, i32) min(i64, i) min(i64, i32) -min(i64, i32, i) min(i64, i64) -min(i64, i64, f32) +min(i64, i64) < i64 min(int(0.5)) min(int(1)) min(int(f32)) min(int(f64)) min(int(i)) +min(int(i32)) min(int(i64)) +min(last(1 .. 1)) min(last(array)) -min(len("bar")) -min(len("foo")) min(len(array)) min(len(list)) -min(len(list), f64) min(max(0.5)) -min(max(1)) min(max(1, 0.5)) -min(max(1, f32)) -min(max(1, i32)) min(max(f32)) min(max(f64)) -min(max(i), i64) -min(max(i32)) -min(min(0.5)) -min(min(0.5, 1)) +min(max(i)) +min(max(i64, 1)) +min(mean(array)) min(min(1)) -min(min(f32)) -min(min(f32, i, i32)) -min(min(f64)) +min(min(1, 1, 1)) +min(min(1, i, f32)) min(min(i)) min(min(i32)) -min(min(i64)) -min(ok ? add : 0.5) -min(ok ? f32 : "foo") -min(ok ? f64 : true) -min(ok ? foo : 1) -min(ok ? true : 1) +min(min(reduce(list, f32))) +min(ok ? array : false) +min(ok ? f64 : i) +min(ok ? half : ok) +min(ok ? i : f32) +min(ok ? list : score) +min(ok ? true : div) +min(reduce(array, #)) +min(reduce(array, 0.5)) +min(reduce(array, 1)) +min(reduce(list, 1)) +min(round(0.5)) +min(round(1)) +min(round(f32)) +min(round(i32)) +min(round(i64)) min(score(1)) min(score(i)) -min(true ? 0.5 : ok) -min(true ? 1 : greet) -min(true ? add : greet) -min(true ? f32 : i) -min(true ? foo : 0.5) -min(true ? foo : half) -min(true ? i : 1) -min(true ? i32 : score) -nil != "bar" ? i64 : 0.5 - i -nil != 0.5 && 0.5 != f32 -nil != 1 && ok -nil != 1 or any(list, false) -nil != 1 || ok -nil != f32 || ok -nil != f64 && ok -nil != f64 or ok -nil != f64 || array != array -nil != false and not true -nil != false and ok -nil != false || ok -nil != foo == ok -nil != foo || ok +min(sum(array)) +min(true ? i : "foo") +min(true ? i : i32) +min(true ? i64 : "foo") +nil != array != nil ? add : half +nil != array && ok +nil != div == reduce(array, ok) +nil != f64 || ok || false +nil != false && ok +nil != false or i == nil +nil != foo and ok nil != foo.Bar nil != foo.Qux nil != foo.String +nil != foo.String() nil != foo?.Bar nil != foo?.Qux nil != foo?.String -nil != greet ? half : half -nil != greet or f32 < i -nil != i32 or f32 >= 1 -nil != i64 or i >= 1 -nil != ok == not true -nil != true == ok -nil == 1 != nil ? "bar" : i32 -nil == add == ("bar" not endsWith "foo") -nil == f32 && i64 < f64 +nil != foo?.String() +nil != nil ? score : div +nil != true || i < 1 +nil == "foo" != ok +nil == "foo" && 0.5 < f64 +nil == 0.5 and reduce(list, true) +nil == add && 0.5 >= 0.5 +nil == add || f32 >= i64 +nil == array and ok +nil == array or ok +nil == array[i64] +nil == div ? f64 : ok +nil == false && nil != true +nil == false ? i64 : toBase64("bar") nil == foo.Bar nil == foo.Qux nil == foo.String @@ -11113,28 +13874,30 @@ nil == foo.String() nil == foo?.Bar nil == foo?.Qux nil == foo?.String -nil == foo?.String() -nil == i64 ? add : add -nil == nil == ok -nil == true ? i64 ^ f32 : foo -nil == true || ok -nil in array || ok -nil in array[i32:i64] -nil in list and ok -none(array, !ok) +nil == greet ? i : greet("bar") +nil == list || f32 == i +nil == list[i32] +nil == nil and ok +nil in array || score == nil +nil in list != not false +none(1 .. i, # < #) +none(1 .. i32, # <= #) +none([foo, list, 1 >= i], ok) +none([greet], ok) +none([true], #) +none(array, !(i32 != i32)) +none(array, !false) none(array, !true) -none(array, "bar" == "bar") +none(array, "bar" endsWith "foo") none(array, # != #) +none(array, # != 0.5) none(array, # != 1) none(array, # != f32) none(array, # != f64) -none(array, # != i32) -none(array, # != i64) +none(array, # != i) none(array, # < #) none(array, # < 0.5) -none(array, # < 1) none(array, # < f32) -none(array, # < i) none(array, # < i32) none(array, # < i64) none(array, # <= #) @@ -11143,155 +13906,170 @@ none(array, # <= 1) none(array, # <= f32) none(array, # <= i) none(array, # <= i32) +none(array, # <= i64) none(array, # == #) none(array, # == 0.5) -none(array, # == 1) -none(array, # == i) +none(array, # == f32) +none(array, # == i32) +none(array, # == i64) none(array, # == nil) none(array, # > #) none(array, # > 0.5) -none(array, # > f32) -none(array, # > f64) none(array, # > i) -none(array, # > i32) none(array, # >= #) none(array, # >= 0.5) none(array, # >= 1) none(array, # >= f32) none(array, # >= f64) +none(array, # >= i32) +none(array, # >= i64) none(array, # in array) -none(array, # not in array) none(array, 0.5 != #) -none(array, 0.5 != f32) +none(array, 0.5 != 1) none(array, 0.5 < #) -none(array, 0.5 <= 0.5) +none(array, 0.5 < i64) +none(array, 0.5 <= #) none(array, 0.5 <= 1) -none(array, 0.5 <= i) -none(array, 0.5 > #) +none(array, 0.5 <= f64) +none(array, 0.5 == #) +none(array, 0.5 > 0.5) +none(array, 0.5 > 1) +none(array, 0.5 > f32) none(array, 0.5 >= #) -none(array, 1 != #) +none(array, 0.5 >= 1) none(array, 1 < #) -none(array, 1 < 0.5) -none(array, 1 < i) -none(array, 1 < i64) -none(array, 1 <= 1) -none(array, 1 == #) -none(array, 1 == f64) +none(array, 1 <= #) +none(array, 1 == 1) none(array, 1 > #) -none(array, 1 > f64) -none(array, 1 >= i) -none(array, add != greet) -none(array, all(array, true)) -none(array, div == greet) +none(array, any(array, true)) none(array, f32 != #) -none(array, f32 != nil) -none(array, f32 <= #) +none(array, f32 < 0.5) +none(array, f32 < 1) +none(array, f32 == 1) +none(array, f32 > #) none(array, f32 >= #) -none(array, f64 != #) +none(array, f32 >= 1) +none(array, f32 >= f32) +none(array, f64 != 1) none(array, f64 == #) -none(array, f64 >= 0.5) -none(array, half != nil) +none(array, f64 > #) +none(array, f64 >= #) +none(array, greet != div) +none(array, greet != half) +none(array, i != #) none(array, i < #) -none(array, i < 1) +none(array, i < f64) none(array, i <= #) -none(array, i == i64) -none(array, i not in array) +none(array, i > #) +none(array, i >= #) +none(array, i >= 0.5) +none(array, i >= i32) none(array, i32 != #) -none(array, i32 != f64) +none(array, i32 != i) none(array, i32 != nil) none(array, i32 < #) none(array, i32 > #) -none(array, i32 >= #) -none(array, i64 < #) -none(array, i64 < f64) +none(array, i64 != #) +none(array, i64 != 0.5) +none(array, i64 > i64) none(array, i64 >= #) -none(array, nil != 0.5) -none(array, nil != div) +none(array, nil != "bar") +none(array, nil != #) +none(array, nil != false) +none(array, nil != greet) none(array, nil == #) none(array, nil == 1) -none(array, nil == div) -none(array, none(array, !true)) -none(array, not ok) -none(array, ok == nil) +none(array, nil == f32) +none(array, nil == greet) +none(array, nil == half) +none(array, not (# == #)) +none(array, not (# >= 1)) +none(array, not false) none(array, ok) -none(array, ok) != ok -none(array, ok) ? f32 : !ok -none(array, score == nil) -none(array, score == score) -none(array, true ? ok : f64) -none(array, true or true) -none(i64 .. i32, # > #) -none(list, "bar" not in #) +none(array, reduce(array, true)) +none(filter(array, # >= f64), ok) +none(groupBy(array, #).f64, # or #.Bar) +none(groupBy(array, #)?.array, fromJSON(#)) +none(groupBy(array, #)?.f32, #) +none(groupBy(array, #)?.greet, #) +none(groupBy(list, #).div, ok) +none(groupBy(list, #).greet, #) +none(groupBy(list, 0.5).i, ok) +none(i .. i, ok) +none(i .. i32, # <= #) +none(list, !false) +none(list, !ok) +none(list, "bar" contains "bar") none(list, # != #) none(list, # != foo) none(list, # != nil) none(list, # == #) -none(list, # == nil) -none(list, 0.5 != i) -none(list, 0.5 <= 1) -none(list, 0.5 <= f64) -none(list, 0.5 == nil) -none(list, 1 < i32) +none(list, # == foo) +none(list, # in list) +none(list, # not in list) +none(list, (0.5 not in array) || ok) +none(list, 0.5 != i32) +none(list, 0.5 > f64) +none(list, 0.5 > i) +none(list, 1 != i64) +none(list, 1 != nil) none(list, 1 == f32) -none(list, any(list, ok)) -none(list, array == nil) -none(list, f32 > i) -none(list, f64 == i32) -none(list, false && false) -none(list, false) or f64 >= i64 +none(list, 1 > 0.5) +none(list, all(array, ok)) +none(list, div == #?.Qux) +none(list, f32 != 1 ** f64) +none(list, f32 >= 0.5) +none(list, f32 in array) +none(list, f32 not in array) +none(list, f64 <= i32) +none(list, f64 >= 1) +none(list, false) ? ok : half +none(list, false) || ok none(list, foo != #) -none(list, foo == #) -none(list, greet != add) -none(list, greet != half) -none(list, i <= i64) -none(list, i >= 1) -none(list, i >= f64) -none(list, i not in array) -none(list, i32 != nil) -none(list, i32 == f64) -none(list, i32 == nil) -none(list, i32 >= 1) -none(list, i32 >= f32) -none(list, i64 < f64) -none(list, i64 <= f64) -none(list, i64 > f64) +none(list, foo == foo) +none(list, i != i) +none(list, i != i64) +none(list, i >= f32) +none(list, i32 == f32) +none(list, i32 > 1) +none(list, i32 > i64) +none(list, i32 not in array) +none(list, i64 != 0.5) none(list, i64 > i64) -none(list, nil != array) -none(list, nil != true) -none(list, nil == foo) +none(list, nil != #) +none(list, nil != greet) +none(list, nil != i64) +none(list, nil == #) +none(list, nil == list) none(list, not false) -none(list, not ok) none(list, ok) -none(list, one(array, false)) -none(list, score != nil) -none(list, score == add) +none(list, one(array, true)) none(list, true && ok) -none(list, true == ok) -none(list, true) ? div : array -none(map(array, "bar"), # not endsWith #) -none(map(array, "foo"), # not endsWith #) +none(list, true) and ok none(map(array, #), ok) -none(map(array, 0.5), # == #) -none(map(array, 1), # >= #) -none(map(array, half), # == #) -none(map(array, ok), #) -none(map(list, "bar"), # not startsWith #) -none(map(list, "bar"), # startsWith #) -none(map(list, #), # != #) +none(map(array, div), # != #) +none(map(array, f64 == #), ok) +none(map(list, "bar"), # endsWith #) +none(map(list, #), nil == list) none(map(list, #), ok) -none(map(list, i32), f64 > #) -none(map(list, true), # != #) -none(ok ? "bar" : ok, # >= f64) -not !("foo" not matches "foo") -not !(0.5 > 1) -not !(f64 >= i32) -not !(false && ok) -not !(i >= i32) +none(map(list, 1), i > #) +none(map(list, ok), # ? true : #) +none(map(list, ok), #) +none(map(list, score), ok) +none(sort(filter(array, false)), #?.div > greet(#)) +not !(0.5 != i64) +not !(i < 1) +not !(i >= 0.5) +not !(i32 != i32) +not !(nil != false) not !false +not !not false not !ok not !true +not ("bar" != "bar") not ("bar" != "foo") not ("bar" != nil) +not ("bar" < "bar") not ("bar" < "foo") not ("bar" <= "bar") not ("bar" <= "foo") @@ -11308,6 +14086,7 @@ not ("bar" endsWith "bar") not ("bar" endsWith "foo") not ("bar" in foo) not ("bar" matches "bar") +not ("bar" matches "foo") not ("bar" not contains "bar") not ("bar" not contains "foo") not ("bar" not endsWith "bar") @@ -11315,6 +14094,8 @@ not ("bar" not endsWith "foo") not ("bar" not in foo) not ("bar" not matches "bar") not ("bar" not matches "foo") +not ("bar" not startsWith "bar") +not ("bar" not startsWith "foo") not ("bar" startsWith "bar") not ("bar" startsWith "foo") not ("foo" != "bar") @@ -11329,7 +14110,9 @@ not ("foo" == "foo") not ("foo" == nil) not ("foo" > "bar") not ("foo" > "foo") +not ("foo" >= "bar") not ("foo" >= "foo") +not ("foo" contains "bar") not ("foo" contains "foo") not ("foo" endsWith "bar") not ("foo" endsWith "foo") @@ -11341,13 +14124,13 @@ not ("foo" not contains "foo") not ("foo" not endsWith "bar") not ("foo" not endsWith "foo") not ("foo" not in foo) -not ("foo" not matches "bar") not ("foo" not matches "foo") -not ("foo" not startsWith "bar") not ("foo" not startsWith "foo") +not ("foo" startsWith "bar") not ("foo" startsWith "foo") not (0.5 != 0.5) not (0.5 != 1) +not (0.5 != f32) not (0.5 != f64) not (0.5 != i) not (0.5 != i32) @@ -11371,6 +14154,7 @@ not (0.5 == 0.5) not (0.5 == 1) not (0.5 == f32) not (0.5 == f64) +not (0.5 == i && i32 != i32) not (0.5 == i) not (0.5 == i32) not (0.5 == i64) @@ -11389,6 +14173,8 @@ not (0.5 >= f64) not (0.5 >= i) not (0.5 >= i32) not (0.5 >= i64) +not (0.5 in array) +not (0.5 not in array) not (1 != 0.5) not (1 != 1) not (1 != f32) @@ -11397,7 +14183,6 @@ not (1 != i) not (1 != i32) not (1 != i64) not (1 != nil) -not (1 + i > 0.5 ** i32) not (1 < 0.5) not (1 < 1) not (1 < f32) @@ -11417,6 +14202,7 @@ not (1 == 1) not (1 == f32) not (1 == f64) not (1 == i) +not (1 == i32) not (1 == i64) not (1 == nil) not (1 > 0.5) @@ -11433,17 +14219,13 @@ not (1 >= f64) not (1 >= i) not (1 >= i32) not (1 >= i64) -not (1 ^ f32 != i64) not (1 in array) not (1 not in array) -not (abs(i) <= i) not (add != add) -not (add != div) not (add != greet) not (add != half) not (add != nil) not (add != score) -not (add == add) not (add == div) not (add == greet) not (add == half) @@ -11455,8 +14237,10 @@ not (array != nil) not (array == array) not (array == list) not (array == nil) +not (array[i32] > i64) not (div != add) not (div != div) +not (div != foo?.Qux) not (div != greet) not (div != half) not (div != nil) @@ -11477,7 +14261,6 @@ not (f32 != i64) not (f32 != nil) not (f32 < 0.5) not (f32 < 1) -not (f32 < abs(0.5)) not (f32 < f32) not (f32 < f64) not (f32 < i) @@ -11485,7 +14268,6 @@ not (f32 < i32) not (f32 < i64) not (f32 <= 0.5) not (f32 <= 1) -not (f32 <= f32) not (f32 <= f64) not (f32 <= i) not (f32 <= i32) @@ -11494,6 +14276,7 @@ not (f32 == 0.5) not (f32 == 1) not (f32 == f32) not (f32 == f64) +not (f32 == i) not (f32 == i32) not (f32 == i64) not (f32 == nil) @@ -11501,15 +14284,19 @@ not (f32 > 0.5) not (f32 > 1) not (f32 > f32) not (f32 > f64) +not (f32 > i) not (f32 > i32) +not (f32 > i64) not (f32 >= 0.5) not (f32 >= 1) not (f32 >= f32) not (f32 >= f64) not (f32 >= i) +not (f32 >= i32) not (f32 >= i64) +not (f32 in array) +not (f32 not in array) not (f64 != 0.5) -not (f64 != 1 * 0.5) not (f64 != 1) not (f64 != f32) not (f64 != f64) @@ -11521,28 +14308,29 @@ not (f64 < 0.5) not (f64 < 1) not (f64 < f32) not (f64 < f64) -not (f64 < i) not (f64 < i32) not (f64 < i64) +not (f64 <= -0.5) not (f64 <= 0.5) not (f64 <= 1) not (f64 <= f32) not (f64 <= f64) +not (f64 <= i) not (f64 <= i32) not (f64 <= i64) not (f64 == 0.5) not (f64 == 1) -not (f64 == f32) not (f64 == f64) not (f64 == i) not (f64 == i32) -not (f64 == i64 - f32) +not (f64 == i64) not (f64 == nil) not (f64 > 0.5) not (f64 > 1) not (f64 > f32) not (f64 > f64) not (f64 > i) +not (f64 > i32) not (f64 > i64) not (f64 >= 0.5) not (f64 >= 1) @@ -11551,16 +14339,18 @@ not (f64 >= f64) not (f64 >= i) not (f64 >= i32) not (f64 >= i64) +not (f64 in array) +not (f64 not in array) not (false != false) not (false != nil) not (false != ok) not (false != true) +not (false && false) not (false && ok) -not (false && true) -not (false == false) not (false == nil) -not (false == true) +not (false == ok) not (false and false) +not (false and ok) not (false and true) not (false or false) not (false or ok) @@ -11568,6 +14358,7 @@ not (false or true) not (false || false) not (false || ok) not (false || true) +not (findIndex(list, ok) != i ^ f64) not (foo != foo) not (foo != nil) not (foo == foo) @@ -11589,10 +14380,12 @@ not (greet == score) not (half != add) not (half != div) not (half != greet) +not (half != half) not (half != nil) not (half != score) not (half == add) not (half == div) +not (half == foo?.String) not (half == greet) not (half == half) not (half == nil) @@ -11616,27 +14409,31 @@ not (i <= 0.5) not (i <= 1) not (i <= f32) not (i <= f64) +not (i <= i) not (i <= i32) not (i <= i64) not (i == 0.5) not (i == 1) +not (i == ceil(f64)) not (i == f32) not (i == f64) not (i == i) not (i == i32) +not (i == i64) not (i == nil) not (i > 0.5) not (i > 1) not (i > f32) not (i > f64) not (i > i) +not (i > i32) not (i > i64) not (i >= 0.5) not (i >= 1) -not (i >= div(1, 1)) not (i >= f32) not (i >= f64) not (i >= i) +not (i >= i32) not (i >= i64) not (i in array) not (i not in array) @@ -11645,10 +14442,13 @@ not (i32 != 1) not (i32 != f32) not (i32 != f64) not (i32 != i) +not (i32 != i32) not (i32 != i64) not (i32 != nil) not (i32 < 0.5) not (i32 < 1) +not (i32 < f32 ** 0.5) +not (i32 < f32) not (i32 < f64) not (i32 < i) not (i32 < i32) @@ -11660,6 +14460,7 @@ not (i32 <= f64) not (i32 <= i) not (i32 <= i32) not (i32 <= i64) +not (i32 == -i) not (i32 == 0.5) not (i32 == 1) not (i32 == f32) @@ -11683,6 +14484,7 @@ not (i32 >= i) not (i32 >= i32) not (i32 >= i64) not (i32 in array) +not (i32 not in array) not (i64 != 0.5) not (i64 != 1) not (i64 != f32) @@ -11698,12 +14500,12 @@ not (i64 < f64) not (i64 < i) not (i64 < i32) not (i64 < i64) -not (i64 < int(f64)) not (i64 <= 0.5) not (i64 <= 1) not (i64 <= f32) not (i64 <= f64) not (i64 <= i) +not (i64 <= i32) not (i64 <= i64) not (i64 == 0.5) not (i64 == 1) @@ -11715,6 +14517,7 @@ not (i64 == i64) not (i64 == nil) not (i64 > 0.5) not (i64 > 1) +not (i64 > f32) not (i64 > f64) not (i64 > i) not (i64 > i32) @@ -11725,8 +14528,7 @@ not (i64 >= f32) not (i64 >= f64) not (i64 >= i) not (i64 >= i32) -not (i64 >= max(i)) -not (i64 in array) +not (i64 >= i64) not (i64 not in array) not (list != array) not (list != list) @@ -11745,7 +14547,6 @@ not (nil != f32) not (nil != f64) not (nil != false) not (nil != foo) -not (nil != greet) not (nil != half) not (nil != i) not (nil != i32) @@ -11780,7 +14581,6 @@ not (nil in array) not (nil in list) not (nil not in array) not (nil not in list) -not (ok != false) not (ok != nil) not (ok != ok) not (ok != true) @@ -11815,8 +14615,9 @@ not (true != false) not (true != nil) not (true != ok) not (true != true) -not (true && ok) +not (true && false) not (true && true) +not (true == false) not (true == nil) not (true == ok) not (true == true) @@ -11825,707 +14626,1795 @@ not (true and ok) not (true and true) not (true or false) not (true or ok) +not (true or true) not (true || false) +not (true || ok) +not (true || true) +not all(array, false) not all(array, ok) not all(array, true) -not all(list, false) +not all(list, nil == #) not all(list, ok) not all(list, true) not any(array, false) not any(array, ok) not any(array, true) -not any(list, # != #) not any(list, false) not any(list, ok) not any(list, true) +not false && nil == f64 not false && ok -not false && ok ? list : array -not false ? "bar" : 0.5 -not false ? "bar" : foo -not false ? "foo" : 0.5 -not false ? 0.5 : greet -not false ? 1 : div -not false ? 1 : i32 -not false ? add : i -not false ? array : "foo" -not false ? array : array -not false ? array : greet -not false ? array : ok -not false ? div : greet -not false ? foo : 1 -not false ? foo : array -not false ? greet : ok -not false ? half : 0.5 -not false ? half : i32 -not false ? i : i64 -not false ? i : score -not false ? i32 : 0.5 -not false ? i32 : add -not false ? i32 : f32 -not false ? i32 : true +not false == ok +not false ? "foo" : "foo" +not false ? 0.5 : "foo" +not false ? 0.5 : array +not false ? 0.5 : div +not false ? 0.5 : foo +not false ? 0.5 : i64 +not false ? 0.5 : nil +not false ? 1 : 0.5 +not false ? add : array +not false ? array : 0.5 +not false ? array : 1 +not false ? array : f64 +not false ? array : i +not false ? array : true +not false ? div : 0.5 +not false ? div : f64 +not false ? f32 : 0.5 +not false ? f32 : 1 +not false ? f32 : i +not false ? f32 : nil +not false ? f32 : score +not false ? f64 : "foo" +not false ? f64 : f64 +not false ? false : half +not false ? false : list +not false ? foo : f64 +not false ? greet : 1 +not false ? i : "bar" +not false ? i : 1 +not false ? i : array +not false ? i : i +not false ? i32 : greet not false ? i64 : list -not false ? list : i32 -not false ? nil : greet -not false ? nil : i32 -not false ? nil : nil -not false ? ok : "bar" +not false ? list : i +not false ? list : true +not false ? nil : f32 +not false ? nil : half +not false ? nil : ok not false ? ok : 1 -not false ? ok : list -not false ? score : "foo" -not false ? score : array -not false ? score : score -not false ? score : true -not false ? true : 0.5 -not false ? true : 1 +not false ? score : ok +not false ? true : f64 not false ? true : nil -not false or "foo" > "bar" -not none(array, # == #) +not false or false == false +not false or ok +not false || ok +not none(array, # > f32) not none(array, false) not none(array, ok) not none(array, true) not none(list, false) not none(list, ok) not none(list, true) -not not ("bar" >= "foo") -not not (1 < i) -not not (add == nil) -not not (half == nil) +not not (f64 <= 1) +not not (i32 < i64) +not not (i64 >= f64) +not not (nil != greet) +not not (ok or ok) not not false not not ok not not true not ok +not ok != ok +not ok && 1 > 0.5 not ok && ok -not ok == ok -not ok ? "bar" : 1 -not ok ? "bar" : f32 -not ok ? 0.5 + f64 : half -not ok ? 0.5 : "foo" +not ok ? "bar" : list +not ok ? "foo" : 0.5 +not ok ? "foo" : 1 +not ok ? 0.5 : "bar" not ok ? 0.5 : 0.5 -not ok ? 0.5 : div -not ok ? 0.5 : f32 -not ok ? 0.5 : greet -not ok ? 1 : 1 -not ok ? add : 0.5 -not ok ? array : f64 -not ok ? array : true -not ok ? div : 1 -not ok ? div : add -not ok ? f32 : div -not ok ? f64 : 1 +not ok ? 0.5 : i +not ok ? 1 : f64 +not ok ? 1 : nil +not ok ? add : array +not ok ? add : groupBy(array, #) +not ok ? array : 1 +not ok ? array : f32 +not ok ? div : f64 +not ok ? f32 : f32 +not ok ? f64 : f64 not ok ? f64 : half -not ok ? false : f32 -not ok ? false : i -not ok ? false : true -not ok ? foo : add -not ok ? foo : false -not ok ? foo : i64 -not ok ? greet : add -not ok ? half : true -not ok ? i : div -not ok ? i : true -not ok ? i32 : nil -not ok ? i64 : add +not ok ? foo : foo +not ok ? greet : 0.5 +not ok ? half : half +not ok ? i : 1 +not ok ? i : add +not ok ? i32 : 1 +not ok ? i32 : i +not ok ? i64 : f32 +not ok ? i64 : f64 +not ok ? nil : "bar" not ok ? nil : 0.5 -not ok ? nil : div not ok ? nil : foo -not ok ? nil : half +not ok ? nil : greet not ok ? nil : i -not ok ? score : div -not ok ? score : i -not ok ? score : true -not ok ? true : f32 -not ok ? true : false -not ok ? true : score -not ok and not ok +not ok ? ok : false +not ok ? ok : list +not ok ? score : "foo" +not ok ? score : score +not ok ? true : 1 +not ok ? true : div +not ok ? true : half +not ok ? true : i64 +not ok ? true : nil +not ok and "foo" == "foo" +not ok and i32 > 0.5 +not ok and ok +not ok or 1 != i not ok or ok -not ok or one(array, true) +not ok || array == list not ok || ok -not ok || true ? 0.5 : 1 -not one(array, # > f32) not one(array, false) not one(array, ok) not one(array, true) not one(list, false) not one(list, ok) not one(list, true) -not true && i32 <= i32 -not true ? "foo" : i -not true ? 1 : i64 -not true ? add : add -not true ? add : foo -not true ? array : 1 -not true ? array : add -not true ? array : array -not true ? array : i32 -not true ? array : i64 -not true ? div : nil -not true ? f64 : i64 -not true ? foo : foo -not true ? greet : "bar" -not true ? greet : add -not true ? greet : foo -not true ? greet : i32 +not reduce(array, false) +not reduce(array, ok) +not reduce(array, true) +not reduce(list, false) +not reduce(list, ok) +not reduce(list, true) +not true != ok +not true && ok +not true == ok +not true ? "bar" : array +not true ? "bar" : i32 +not true ? "foo" : f32 +not true ? "foo" : f64 +not true ? 0.5 : foo +not true ? 0.5 : greet +not true ? 0.5 : i +not true ? 0.5 : i64 +not true ? 1 : f32 +not true ? add : i32 +not true ? add : ok +not true ? array : nil +not true ? f32 : 0.5 +not true ? f32 : div +not true ? f64 : 1 +not true ? f64 : array +not true ? foo : greet +not true ? foo : ok +not true ? greet : 1 +not true ? greet : i64 +not true ? greet : list +not true ? greet : true not true ? half : half -not true ? i : 1 -not true ? i : i -not true ? i32 : 0.5 -not true ? i64 : 1 +not true ? i : f64 +not true ? i64 : "foo" +not true ? i64 : array +not true ? i64 : i64 not true ? list : "bar" -not true ? list : 0.5 -not true ? list : 1 -not true ? list : array -not true ? list : type(add) -not true ? nil : list -not true ? score : 1 -not true ? score : list -not true ? score : true +not true ? list : f64 +not true ? list : foo +not true ? nil : div +not true ? ok : nil +not true ? score : f32 +not true ? score : score +not true ? true : 1 +not true and ok ? i : half not true || ok ok ok != !ok -ok != !true +ok != (0.5 not in array) ok != false != ok -ok != false ? 1 : i +ok != false ? f32 : list ok != nil == nil -ok != none(list, ok) -ok != not !ok +ok != nil ? f32 : greet +ok != nil ? nil : array ok != not ok ok != ok -ok != ok || ok -ok && !ok ? f32 : 0.5 -ok && !true -ok && "bar" >= "bar" -ok && "foo" <= "bar" -ok && 0.5 != nil -ok && 0.5 == 0.5 -ok && 0.5 >= f32 -ok && 1 != f64 +ok != ok ? false : "bar" +ok != sum(array) +ok && !false +ok && !ok +ok && "foo" matches "bar" +ok && ("bar" not endsWith "bar") +ok && (false || ok) +ok && (ok or false) +ok && (true || true) +ok && 0.5 < 1 +ok && 0.5 < f64 +ok && 0.5 <= 1 +ok && 0.5 == nil +ok && 0.5 > i64 +ok && 1 != 0.5 ok && 1 != i32 -ok && 1 < 1 -ok && 1 <= 0.5 -ok && 1 == f64 -ok && 1 >= f32 -ok && div == half -ok && f32 != 0.5 -ok && f32 < 0.5 -ok && f32 == f32 -ok && f32 == i64 -ok && f64 < 1 -ok && f64 < i32 -ok && f64 == i32 -ok && f64 >= i32 -ok && false == false -ok && i != i -ok && i32 != 0.5 -ok && i32 < f32 -ok && i32 <= i64 -ok && i32 == 1 -ok && i32 >= 1 -ok && i64 < i32 -ok && i64 <= i32 -ok && i64 > 1 -ok && list != array -ok && nil != f64 -ok && nil == add -ok && nil == i32 -ok && nil == true +ok && 1 <= 1 +ok && 1 <= f64 +ok && 1 == 0.5 +ok && 1 == nil +ok && 1 >= f64 +ok && add != greet +ok && f32 != i +ok && f32 >= i64 +ok && f64 <= 0.5 +ok && false != ok +ok && false ? i : list +ok && false ? ok : ok +ok && i < 0.5 +ok && i < i64 +ok && i == 0.5 +ok && i > f64 +ok && i32 > 0.5 +ok && i32 >= i64 +ok && i64 != i +ok && i64 == 0.5 +ok && nil != 0.5 +ok && nil != 1 +ok && nil == ok +ok && not false +ok && not true ok && ok -ok && score != add -ok && true != ok -ok && true == nil +ok && ok ? nil : div +ok && ok and false +ok && true != false +ok && true && 1 >= i64 ok == !false -ok == !ok -ok == (false or true) -ok == (ok and ok) -ok == any(list, ok) -ok == false == nil -ok == nil ? false : add -ok == nil ? score : array +ok == !true +ok == ("bar" not endsWith "foo") +ok == (0.5 not in array) +ok == (false and ok) +ok == (i32 not in array) +ok == (nil not in list) +ok == false ? f64 : 1 +ok == false ? score : 1 +ok == nil ? i64 : add +ok == nil ? nil : f64 +ok == none(array, true) ok == not false -ok == not true ok == ok -ok ? "bar" : i == f32 -ok ? "bar" : i32 < i32 -ok ? "foo" : foo.String -ok ? -0.5 : foo -ok ? -f32 : i64 + 1 -ok ? -f64 : score -ok ? -i64 : ok -ok ? 0.5 * array[i64] : greet -ok ? 0.5 : f64 < i64 -ok ? 0.5 : half != add -ok ? 0.5 : i .. i -ok ? 0.5 < i32 : score -ok ? 0.5 == 0.5 : half -ok ? 1 : 1 + i64 + i32 +ok == ok != false +ok == true && ok +ok ? "bar" : f64 <= f32 +ok ? "foo" : foo.Bar +ok ? -0.5 : add +ok ? -f64 : list +ok ? -i32 : i +ok ? 0.5 / 0.5 : f64 +ok ? 0.5 : i32 >= i64 +ok ? 0.5 > 1 : 0.5 * i64 +ok ? 1 + i : i32 +ok ? 1 / i64 : greet ok ? 1 : foo.Bar -ok ? 1 : foo.String +ok ? 1 : foo?.Qux +ok ? 1 : score != greet +ok ? abs(i64) : i64 +ok ? add : abs(f32) ok ? add : add ok ? add : array -ok ? add : div -ok ? add : f32 +ok ? add : f64 +ok ? add : foo +ok ? add : foo?.String ok ? add : greet +ok ? add : half ok ? add : i -ok ? add : i32 ok ? add : i64 ok ? add : list ok ? add : ok -ok ? array : div -ok ? array : f64 -ok ? array : float(i32) +ok ? array : array +ok ? array : f32 +ok ? array : f64 + f64 ok ? array : foo -ok ? array : foo?.Bar +ok ? array : foo.String +ok ? array : foo?.String +ok ? array : greet +ok ? array : greet(nil) +ok ? array : i ok ? array : i32 -ok ? array : i64 ok ? array : list -ok ? array : ok in map(array, ok) +ok ? array : ok +ok ? array : score +ok ? div : add +ok ? div : array ok ? div : div -ok ? div : f32 ok ? div : f64 -ok ? div : foo?.String +ok ? div : foo +ok ? div : foo.Bar ok ? div : greet ok ? div : half -ok ? div : half(1) -ok ? div : i32 -ok ? div : i64 -ok ? div : list -ok ? div : list == array +ok ? div : i32 > reduce(array, #) +ok ? div : nil == true +ok ? div : ok ok ? div : score -ok ? div : score(i) +ok ? f32 != i32 : f32 +ok ? f32 ** i64 : score +ok ? f32 : "foo" endsWith lower(nil) +ok ? f32 : -0.5 ok ? f32 : add ok ? f32 : array ok ? f32 : div ok ? f32 : f32 ok ? f32 : f64 ok ? f32 : foo -ok ? f32 : foo?.Bar ok ? f32 : half -ok ? f32 : i != i64 ok ? f32 : i32 +ok ? f32 : i64 +ok ? f32 : ok +ok ? f32 : score +ok ? f64 : add ok ? f64 : array +ok ? f64 : div +ok ? f64 : f64 - f64 +ok ? f64 : false != true +ok ? f64 : foo +ok ? f64 : foo.String ok ? f64 : greet -ok ? f64 : half -ok ? f64 : i64 +ok ? f64 : i32 +ok ? f64 : i32 % i32 +ok ? f64 : i32 >= -i64 +ok ? f64 : ok ok ? f64 : score -ok ? false : foo?.String() -ok ? foo : add +ok ? false : foo.Bar +ok ? foo : div +ok ? foo : f32 ok ? foo : foo -ok ? foo : foo?.Bar ok ? foo : greet -ok ? foo : i -ok ? foo : i == i32 +ok ? foo : half ok ? foo : i32 +ok ? foo : i32 > i32 ok ? foo : i64 -ok ? foo : i64 ^ f32 ok ? foo : list -ok ? get(array, i32) : ok +ok ? foo : ok +ok ? foo : score +ok ? foo.Qux : ok +ok ? greet : 0.5 > i +ok ? greet : 1 <= 0.5 ok ? greet : add ok ? greet : div -ok ? greet : f64 == i64 -ok ? greet : greet +ok ? greet : f32 +ok ? greet : f64 +ok ? greet : foo ok ? greet : half -ok ? greet : i / i32 -ok ? greet : i32 -ok ? greet : i64 % i64 +ok ? greet : i64 ok ? greet : list -ok ? greet : type(f64) -ok ? half : 0.5 ^ i32 +ok ? greet : map(list, i) +ok ? greet : ok +ok ? greet : score ok ? half : add -ok ? half : array -ok ? half : div -ok ? half : f32 == f64 +ok ? half : f32 ok ? half : f64 -ok ? half : f64 <= i ok ? half : foo -ok ? half : foo?.Bar +ok ? half : foo?.Qux ok ? half : greet ok ? half : half -ok ? half : i -ok ? half : i32 ok ? half : list +ok ? half : nil in list ok ? half : ok -ok ? half : type(add) -ok ? i : -i32 -ok ? i : 0.5 * i64 -ok ? i : 1 ** f64 +ok ? half : reduce(list, "bar") +ok ? half : string(array) +ok ? half(1) : add +ok ? i : 1 / i64 +ok ? i : add ok ? i : array -ok ? i : div -ok ? i : f32 -ok ? i : f64 -ok ? i : foo.Bar +ok ? i : f32 <= 0.5 +ok ? i : foo +ok ? i : half ok ? i : i ok ? i : i32 +ok ? i : i64 +ok ? i : list ok ? i : ok ok ? i : score -ok ? i32 + f32 : half -ok ? i32 : -i32 -ok ? i32 : 1 not in array +ok ? i32 : 1 - f64 ok ? i32 : add -ok ? i32 : array +ok ? i32 : div ok ? i32 : f32 +ok ? i32 : f32 + 0.5 +ok ? i32 : f64 +ok ? i32 : foo ok ? i32 : foo.Qux -ok ? i32 : foo?.Qux -ok ? i32 : half +ok ? i32 : greet ok ? i32 : i ok ? i32 : i32 +ok ? i32 : i32 + i32 ok ? i32 : list ok ? i32 : ok -ok ? i32 >= f64 : f32 -ok ? i64 : array +ok ? i32 : score +ok ? i64 : (ok ? list : half) ok ? i64 : div ok ? i64 : f32 -ok ? i64 : f64 +ok ? i64 : foo +ok ? i64 : foo.String ok ? i64 : half +ok ? i64 : i ok ? i64 : i32 ok ? i64 : i64 +ok ? i64 : list ok ? i64 : ok -ok ? int(1) : div -ok ? list : -1 +ok ? i64 ^ f32 : foo +ok ? list : 0.5 * f64 ok ? list : add ok ? list : array ok ? list : div +ok ? list : div(i64, 1) ok ? list : f32 -ok ? list : i32 +ok ? list : foo.String +ok ? list : greet +ok ? list : half +ok ? list : i +ok ? list : i - f32 ok ? list : i64 ok ? list : list -ok ? list : nil in array -ok ? list : ok +ok ? list : list != array +ok ? list : not ok ok ? list : score -ok ? lower("foo") : f32 -ok ? map(array, #) : duration("foo") -ok ? map(list, #) : score -ok ? min(f32) : score -ok ? min(i) : score +ok ? map(list, #) : add +ok ? nil : 0.5 <= f64 +ok ? nil : foo.Qux ok ? nil : foo?.Bar -ok ? ok : -f32 -ok ? ok : 0.5 + i +ok ? not false : i32 +ok ? ok : 0.5 ** i32 +ok ? ok : add ok ? ok : array -ok ? ok : f64 +ok ? ok : div +ok ? ok : f32 +ok ? ok : f64 ** int(f64) ok ? ok : foo +ok ? ok : foo.String ok ? ok : greet +ok ? ok : half +ok ? ok : i32 ok ? ok : i64 ok ? ok : list -ok ? ok : score -ok ? score : add -ok ? score : array +ok ? ok : ok +ok ? reduce(array, false) : score +ok ? reduce(list, #) : list +ok ? score : 1 == i32 +ok ? score : div ok ? score : f32 -ok ? score : foo.String -ok ? score : foo?.String +ok ? score : f64 ok ? score : greet ok ? score : half ok ? score : i ok ? score : i32 -ok ? score : list -ok ? score : nil != div -ok ? score : ok +ok ? score : min(i64) ok ? score : score -ok ? string(half) : array -ok ? toJSON("foo") : i32 -ok ? true : foo?.Qux +ok ? score : true == nil +ok ? toJSON(i64) : div ok and !ok -ok and "bar" not endsWith foo?.Bar -ok and "foo" endsWith "foo" -ok and 0.5 <= f32 -ok and 0.5 > f64 -ok and 0.5 >= f64 -ok and 1 != 1 -ok and 1 != nil +ok and "bar" < "foo" +ok and ("foo" not contains "bar") ok and 1 < i64 ok and 1 == 1 -ok and add == add -ok and any(list, false) +ok and 1 == i64 +ok and add == nil +ok and div == half +ok and f32 != 1 ok and f32 >= 1 -ok and f64 != i -ok and f64 != nil -ok and f64 > 1 -ok and false != true -ok and i > i32 -ok and i >= f64 -ok and i >= i64 -ok and i32 != nil -ok and i32 == 0.5 -ok and i32 >= f64 -ok and i64 != nil -ok and i64 <= i +ok and greet != div +ok and greet == greet +ok and i == 0.5 +ok and i32 < f32 +ok and i32 <= i64 +ok and i32 > i32 +ok and i64 < i32 +ok and i64 <= i64 ok and i64 > 1 -ok and list == list -ok and nil != i -ok and nil != true -ok and none(list, ok) +ok and i64 >= i +ok and i64 in array +ok and list != nil +ok and nil == array +ok and nil == nil +ok and nil in array +ok and nil in list +ok and nil not in array ok and not ok ok and not true ok and ok -ok not in sort(array) -ok or !false +ok and ok && ok +ok and true ? f64 : add +ok and true ? greet : i +ok in groupBy(array, "bar") +ok in groupBy(list, #) +ok in groupBy(list, i32) +ok in {"bar": true}?.greet +ok not in groupBy(array, # != i32) +ok not in groupBy(array, 0.5) +ok not in groupBy(array, f64) +ok not in groupBy(list, #)?.f64 +ok not in groupBy(list, f64)?.Bar ok or !ok ok or !true -ok or "bar" < "bar" -ok or "foo" != nil -ok or 0.5 != i32 -ok or 0.5 != i64 -ok or 0.5 <= 0.5 -ok or 0.5 == 1 -ok or 0.5 >= i -ok or 1 != i32 -ok or 1 >= 0.5 -ok or f64 < f32 -ok or f64 < i64 -ok or fromJSON("bar") -ok or greet != add -ok or half == nil -ok or half == score -ok or i != 0.5 +ok or "bar" endsWith "foo" +ok or 0.5 != f32 +ok or 0.5 != nil +ok or 0.5 == i +ok or 1 != f32 +ok or 1 <= 1 +ok or 1 <= i +ok or div != half +ok or div != nil +ok or div != score +ok or f32 != f32 +ok or f32 == 0.5 +ok or f32 == f32 +ok or f64 <= 1 +ok or false ? ok : 1 +ok or false and false +ok or foo != foo +ok or fromJSON(nil)?.ok +ok or half != add +ok or half == div ok or i < 1 -ok or i32 < 0.5 -ok or i32 == f64 -ok or i32 > 0.5 -ok or i64 != f32 -ok or i64 == 1 -ok or list == array -ok or nil != 0.5 +ok or i == 0.5 +ok or i == f32 +ok or i32 < 1 +ok or i32 > f64 +ok or i64 != i32 +ok or i64 > i64 +ok or i64 >= 0.5 +ok or i64 not in array +ok or nil != "foo" +ok or nil != f64 +ok or nil != foo +ok or nil != greet +ok or nil != ok +ok or nil == div ok or not false ok or not ok -ok or not true ok or ok -ok or ok || false -ok or one(array, true) -ok || "bar" not contains string(true) -ok || 0.5 < i32 -ok || 0.5 <= 0.5 -ok || 0.5 == i64 -ok || 1 != 0.5 -ok || 1 != 1 +ok or ok == true +ok or true || true +ok or {"foo": false}.String +ok || !ok +ok || (nil not in list) +ok || 0.5 < f32 +ok || 0.5 > 0.5 +ok || 0.5 > 1 +ok || 0.5 >= f64 ok || 1 != nil -ok || 1 < 0.5 -ok || 1 <= 1 -ok || add != score -ok || all(array, ok) -ok || div == nil -ok || f32 <= 0.5 -ok || f32 <= 1 -ok || f32 > i64 -ok || f32 >= f64 -ok || false && ok -ok || i != f64 -ok || i <= 0.5 -ok || i32 != 0.5 -ok || i32 < 0.5 -ok || i32 > 1 -ok || i64 > 0.5 +ok || 1 < i32 +ok || 1 == i +ok || f32 >= 1 +ok || f64 < 1 +ok || f64 == i +ok || f64 > f64 +ok || f64 >= i64 +ok || false ? half : i64 +ok || foo == foo +ok || greet == half +ok || i == i +ok || i32 < f32 +ok || i32 <= 0.5 +ok || i32 == i +ok || i32 > 0.5 +ok || i32 >= i32 +ok || i64 != i32 +ok || i64 == 0.5 +ok || list == list +ok || nil == 0.5 +ok || nil == array +ok || nil == nil +ok || nil not in array +ok || not false +ok || not ok ok || ok -ok || score != score -ok || toJSON(f64) > trimSuffix("bar") -one([1], ok) -one([i32], i32 >= #) -one([score, greet], # == #) -one([score], ok) -one(array, "bar" matches "foo") -one(array, "bar" not in foo) -one(array, "foo" != "foo") -one(array, "foo" > "foo") +ok || ok ? f64 : i64 +ok || ok ? ok : score +ok || ok or ok +ok || reduce(array, false) +ok || true ? add : ok +one(1 .. i64, ok) +one([div], nil == i32) +one([false], i64 != i32) +one(array, !(# <= 0.5)) +one(array, !false) +one(array, !ok) +one(array, !true) +one(array, "bar" matches "bar") one(array, # != #) one(array, # != 0.5) +one(array, # != 1) +one(array, # != f32) one(array, # != f64) +one(array, # != i) one(array, # != i32) one(array, # != nil) -one(array, # % # <= #) +one(array, # / i >= f64) one(array, # < #) one(array, # < 0.5) one(array, # < 1) one(array, # < f32) -one(array, # < f64) -one(array, # < i) -one(array, # < i32) +one(array, # < i64) one(array, # <= #) +one(array, # <= 0.5) +one(array, # <= 1) one(array, # <= f32) one(array, # <= f64) -one(array, # <= i) one(array, # <= i32) one(array, # == #) one(array, # == 0.5) one(array, # == 1) -one(array, # == f64) -one(array, # == i) -one(array, # == i32) -one(array, # == i64) +one(array, # == nil) one(array, # > #) +one(array, # > f32) one(array, # > f64) one(array, # > i32) -one(array, # > i64) one(array, # >= #) one(array, # >= 0.5) one(array, # >= 1) -one(array, # >= f32) -one(array, # >= i) -one(array, # >= i32) -one(array, # in array) +one(array, # >= f64) one(array, 0.5 != #) +one(array, 0.5 != i64) one(array, 0.5 < #) +one(array, 0.5 < 0.5) one(array, 0.5 <= #) one(array, 0.5 == #) +one(array, 0.5 == 0.5) one(array, 0.5 > #) -one(array, 0.5 > f32) +one(array, 0.5 > 1) one(array, 0.5 >= #) one(array, 1 != #) -one(array, 1 < 0.5) -one(array, 1 < i) +one(array, 1 != i64) +one(array, 1 != nil) +one(array, 1 < #) +one(array, 1 < f64) one(array, 1 <= #) -one(array, 1 <= 0.5) -one(array, 1 == #) -one(array, 1 == i32) -one(array, 1 > #) +one(array, 1 > 0.5) one(array, 1 >= #) -one(array, 1 >= f32) -one(array, f32 < 1) +one(array, add == div) +one(array, all(array, true)) +one(array, div != score) one(array, f32 <= #) -one(array, f32 <= i64) -one(array, f32 == #) -one(array, f32 == 0.5) -one(array, f32 == 1) +one(array, f32 <= 0.5) one(array, f32 >= #) -one(array, f64 != #) -one(array, f64 != 1) -one(array, f64 != i) -one(array, f64 != nil) +one(array, f64 < #) one(array, f64 == #) -one(array, f64 > #) -one(array, false == nil) -one(array, greet == score) -one(array, i != 0.5) -one(array, i < i32) -one(array, i <= #) -one(array, i == #) +one(array, f64 >= #) +one(array, f64 >= 1) +one(array, f64 >= i32) +one(array, f64 in array) +one(array, false || true) +one(array, i < #) +one(array, i > 0.5) one(array, i > f64) -one(array, i >= #) -one(array, i >= f32) one(array, i32 != #) +one(array, i32 < #) one(array, i32 <= #) -one(array, i32 == #) -one(array, i32 == i) one(array, i32 > #) -one(array, i64 <= #) +one(array, i32 >= #) +one(array, i64 != #) +one(array, i64 < #) one(array, i64 == #) -one(array, i64 > #) -one(array, i64 > 1) +one(array, i64 == f32) +one(array, i64 >= #) +one(array, i64 >= f64) +one(array, list != array) one(array, nil != #) -one(array, nil != foo) -one(array, nil == i64) +one(array, nil != i64) one(array, not ok) -one(array, not true) -one(array, ok && true) one(array, ok) -one(array, one(array, false)) +one(array, one(list, false)) +one(array, score != add) one(array, score != greet) one(array, score == div) -one(array, true || ok) -one(array, true || true) -one(filter(list, true), ok) -one(i32 .. i32, ok) -one(i32 .. i64, # >= #) +one(array, true != false) +one(array, true == nil) +one(array, true) ? greet : add +one(array, true) or 1 != nil +one(false ? greet : "bar", f64 != #) +one(groupBy(array, 0.5)?.String, #) +one(groupBy(array, f64).array, .i(nil).ok) +one(groupBy(list, ok).foo, .add?.array) +one(groupBy(list, ok)?.score, .i64()) +one(i32 .. 1, # == #) +one(i32 .. i32, not ok) +one(i64 .. 1, # >= 1) +one(i64 .. i32, # != #) +one(i64 .. i32, # >= #) +one(list, !(i64 != 1)) +one(list, !false) one(list, !ok) -one(list, !true) -one(list, "bar" not in #) -one(list, "foo" != "bar") -one(list, "foo" < "foo") +one(list, "foo" < "bar") +one(list, "foo" not endsWith "bar") one(list, "foo" not in #) +one(list, "foo" startsWith "bar") one(list, # != #) -one(list, # != nil) +one(list, # != foo) one(list, # == #) -one(list, # == foo) -one(list, # == nil) one(list, # in list) -one(list, 0.5 != f32) -one(list, 0.5 > 0.5) -one(list, 1 < 1) -one(list, any(array, true)) -one(list, any(list, ok)) +one(list, # not in list) +one(list, 0.5 < 1) +one(list, 0.5 <= 0.5) +one(list, 0.5 == f64) +one(list, 1 > i) +one(list, add != nil) +one(list, all(array, true)) one(list, any(list, true)) -one(list, f32 == 0.5) -one(list, f32 == f64) -one(list, f32 > f32) -one(list, f64 != nil) -one(list, f64 == f32) -one(list, f64 >= 0.5) +one(list, div != nil) +one(list, f32 == nil) +one(list, f32 > i) +one(list, f32 >= 1) one(list, f64 >= 1) +one(list, false == nil) +one(list, foo != #) +one(list, foo != nil) one(list, foo == #) -one(list, greet != nil) -one(list, greet == score) -one(list, half != add) -one(list, i != nil) -one(list, i == i64) -one(list, i64 != f32) -one(list, i64 < 1) -one(list, i64 <= 0.5) -one(list, i64 > 0.5) -one(list, i64 > 1) -one(list, list != nil) -one(list, nil != nil) -one(list, nil != score) +one(list, greet == nil) +one(list, half == nil) +one(list, i <= i64) +one(list, i > f64) +one(list, i > i32) +one(list, i32 != f32) +one(list, i64 == 1) +one(list, nil != #) +one(list, nil != half) one(list, nil == #) -one(list, none(array, ok)) -one(list, none(list, ok)) -one(list, not false) -one(list, not ok) -one(list, not true) +one(list, nil == f64) +one(list, ok or true) one(list, ok) -one(list, ok) and ok -one(list, one(list, ok)) -one(list, score == half) -one(list, true) && ok ? i : i64 -one(map(array, "foo"), # matches #) +one(list, ok) or 0.5 == nil +one(list, score != nil) +one(list, true == nil) +one(list[i64:i32], i != i) +one(map(array, "bar"), not false) one(map(array, #), # != #) -one(map(array, #), # < #) -one(map(array, #), # <= #) -one(map(array, #), # > #) -one(map(array, #), # > 1) -one(map(array, #), f64 <= 0.5) -one(map(array, #), ok) -one(map(array, div), # == nil) -one(map(array, i64), ok) +one(map(array, #), # >= #) +one(map(array, #), i32 == #) +one(map(array, 1), ok) +one(map(array, div), # == #) +one(map(array, f64), # < 0.5) +one(map(array, false), #) +one(map(array, i), ok) +one(map(array, list), ok) one(map(array, true), #) -one(map(list, "bar"), ok) -one(map(list, #), nil != #) -one(map(list, 1), # < 0.5) -one(map(list, f64), # <= #) -one(map(list, false), #) -one(map(list, i), ok) -one(map(list, list), ok) one(map(list, ok), #) -repeat(toJSON(nil), i) +one(map(list, score), # != #) +one(ok ? "foo" : false, # > #) +one(reduce(array, array), ok) +one(true ? array : 1, # <= #) +reduce(1 .. 1, #) +reduce(1 .. 1, f32 >= i) +reduce(1 .. i64, array) +reduce(1 .. i64, greet) +reduce(1 .. i64, half) +reduce(["foo"], f32) +reduce([0.5], f64) +reduce([1], .Qux) +reduce([div, "foo"], i32) +reduce([div], # >= 0.5) +reduce([div], list == #) +reduce([f32, f64], f32) +reduce([f32], .f64) +reduce([f64], # or #) +reduce([f64], .greet) +reduce([false], # ** #) +reduce([foo], ok) +reduce([greet], # % 1) +reduce([i32], list) +reduce([i64, half], "bar" not startsWith "foo") +reduce([i], # < #) +reduce([i], #[array]) +reduce([i], ok) +reduce([list], # - #) +reduce([list], # or #) +reduce([list], f64) +reduce([nil], # in array) +reduce([ok], #?.half) +reduce([true], #?.score()) +reduce([true], 0.5 > #) +reduce(array, !false) +reduce(array, "foo" endsWith "foo") +reduce(array, "foo") not in foo +reduce(array, # != #) +reduce(array, # != 1) +reduce(array, # != i32) +reduce(array, # != nil) +reduce(array, # % #) +reduce(array, # % i64) +reduce(array, # * #) +reduce(array, # * 0.5) +reduce(array, # * 1) +reduce(array, # * f32) +reduce(array, # * i) +reduce(array, # * i32) +reduce(array, # * i64) +reduce(array, # ** #) +reduce(array, # ** f32) +reduce(array, # ** i32) +reduce(array, # + #) +reduce(array, # + 0.5) +reduce(array, # + 1) +reduce(array, # + i) +reduce(array, # + i64) +reduce(array, # - #) +reduce(array, # - 0.5) +reduce(array, # - 1) +reduce(array, # - i) +reduce(array, # - i32) +reduce(array, # - i64) +reduce(array, # .. #) +reduce(array, # .. i32) +reduce(array, # / #) +reduce(array, # / 0.5) +reduce(array, # / 1) +reduce(array, # / f32) +reduce(array, # / i32) +reduce(array, # < #) +reduce(array, # < 0.5) +reduce(array, # < 1) +reduce(array, # < i32) +reduce(array, # <= #) +reduce(array, # <= 0.5) +reduce(array, # <= f32) +reduce(array, # <= i32) +reduce(array, # == #) +reduce(array, # == 0.5) +reduce(array, # == 1) +reduce(array, # == f32) +reduce(array, # == i32) +reduce(array, # == i64) +reduce(array, # == nil) +reduce(array, # > #) +reduce(array, # > 1) +reduce(array, # > f64) +reduce(array, # > i) +reduce(array, # >= #) +reduce(array, # >= f32) +reduce(array, # >= f64) +reduce(array, # >= i32) +reduce(array, # >= i64) +reduce(array, # ^ #) +reduce(array, # ^ 0.5) +reduce(array, # ^ f32) +reduce(array, # ^ f64) +reduce(array, # ^ i64) +reduce(array, # in array) +reduce(array, # not in array) +reduce(array, #) +reduce(array, #) != 0.5 == true +reduce(array, #) != 0.5 ? ok : nil +reduce(array, #) != f32 +reduce(array, #) != i32 +reduce(array, #) != i64 +reduce(array, #) % i +reduce(array, #) % i32 +reduce(array, #) % i64 +reduce(array, #) * i +reduce(array, #) * i32 +reduce(array, #) * len("foo") +reduce(array, #) ** f64 +reduce(array, #) ** min(1, i32) +reduce(array, #) + i +reduce(array, #) + i64 +reduce(array, #) + reduce(array, #) +reduce(array, #) - f64 +reduce(array, #) - i +reduce(array, #) - max(f32) +reduce(array, #) .. i +reduce(array, #) .. i32 +reduce(array, #) .. i64 +reduce(array, #) / f32 +reduce(array, #) / f64 +reduce(array, #) / i32 +reduce(array, #) / i64 +reduce(array, #) < f32 +reduce(array, #) < f32 / 0.5 +reduce(array, #) < f64 +reduce(array, #) < i +reduce(array, #) <= -1 +reduce(array, #) <= f32 +reduce(array, #) <= f64 +reduce(array, #) <= f64 * 0.5 +reduce(array, #) <= i +reduce(array, #) == f64 +reduce(array, #) == i64 +reduce(array, #) > i32 +reduce(array, #) >= f32 +reduce(array, #) >= f64 +reduce(array, #) >= i32 +reduce(array, #) >= i64 +reduce(array, #) ^ f32 ** 0.5 +reduce(array, #) ^ i32 +reduce(array, #) not in array +reduce(array, #) not in map(array, #) +reduce(array, (0.5 + #) * f32) +reduce(array, -#) +reduce(array, -(# - #)) +reduce(array, -0.5) +reduce(array, -1) +reduce(array, -f32) +reduce(array, -f64) +reduce(array, -i) +reduce(array, -i32) +reduce(array, -i64) +reduce(array, 0.5 != #) +reduce(array, 0.5 != 0.5) +reduce(array, 0.5 * #) +reduce(array, 0.5 ** #) +reduce(array, 0.5 ** 1) +reduce(array, 0.5 + #) +reduce(array, 0.5 - #) +reduce(array, 0.5 - i64) +reduce(array, 0.5 / #) +reduce(array, 0.5 / f32) +reduce(array, 0.5 < #) +reduce(array, 0.5 < 1) +reduce(array, 0.5 <= #) +reduce(array, 0.5 <= 1) +reduce(array, 0.5 == #) +reduce(array, 0.5 == f64) +reduce(array, 0.5 == i64) +reduce(array, 0.5 > #) +reduce(array, 0.5 > 0.5) +reduce(array, 0.5 >= 0.5) +reduce(array, 0.5 >= 1) +reduce(array, 0.5 ^ #) +reduce(array, 0.5 ^ 0.5) +reduce(array, 0.5) * f32 +reduce(array, 0.5) - i +reduce(array, 0.5) > i64 ? 1 : 0.5 +reduce(array, 1 != #) +reduce(array, 1 * f64) +reduce(array, 1 ** #) +reduce(array, 1 + #) +reduce(array, 1 - #) +reduce(array, 1 - 1) +reduce(array, 1 / i32) +reduce(array, 1 < #) +reduce(array, 1 >= #) +reduce(array, 1 ^ #) +reduce(array, 1 ^ 0.5) +reduce(array, 1 ^ i32) +reduce(array, 1) % i32 +reduce(array, 1) ** f32 +reduce(array, 1) + f64 +reduce(array, 1) / f64 +reduce(array, 1) / i32 +reduce(array, 1) <= i32 +reduce(array, 1) ^ i +reduce(array, 1) not in array +reduce(array, [#]) +reduce(array, abs(#)) +reduce(array, abs(f64)) +reduce(array, abs(i64)) +reduce(array, add(#, #)) +reduce(array, add) +reduce(array, all(list, ok)) +reduce(array, array) +reduce(array, array)[i32] +reduce(array, array[#:#]) +reduce(array, array[i64:#]) +reduce(array, bitand(i32, i32)) +reduce(array, bitnot(#)) +reduce(array, bitor(#, #)) +reduce(array, bitshr(#, #)) +reduce(array, bitushr(#, #)) +reduce(array, ceil(#)) +reduce(array, div(#, #)) +reduce(array, div) +reduce(array, f32 ** #) +reduce(array, f32 + #) +reduce(array, f32 / #) +reduce(array, f32 <= #) +reduce(array, f32 == #) +reduce(array, f32 == i) +reduce(array, f32 >= #) +reduce(array, f32 >= 0.5) +reduce(array, f32 ^ #) +reduce(array, f32 ^ f32) +reduce(array, f32 ^ i32) +reduce(array, f32) +reduce(array, f32) ** (0.5 * f64) +reduce(array, f32) <= f32 +reduce(array, f32) not in array +reduce(array, f64 ** #) +reduce(array, f64 + #) +reduce(array, f64 + i32) +reduce(array, f64 - #) +reduce(array, f64 / 1) +reduce(array, f64 < #) +reduce(array, f64 == #) +reduce(array, f64 ^ 1) +reduce(array, f64) +reduce(array, f64) != i32 +reduce(array, f64) * i +reduce(array, f64) / f64 +reduce(array, f64) <= f32 +reduce(array, f64) <= first(array) +reduce(array, f64) == i +reduce(array, f64) >= i +reduce(array, f64) ^ f64 +reduce(array, false ? f64 : #) +reduce(array, false ? score : #) +reduce(array, false) ? i64 : f32 +reduce(array, false) || ok +reduce(array, findLastIndex(list, false)) +reduce(array, findLastIndex(list, reduce(array, true))) +reduce(array, float(#)) +reduce(array, floor(i64)) +reduce(array, foo) +reduce(array, foo).Bar +reduce(array, foo).Qux +reduce(array, foo).String +reduce(array, foo).String() +reduce(array, foo)?.Bar +reduce(array, foo)?.Qux +reduce(array, foo)?.String +reduce(array, foo)?.String() +reduce(array, foo.Bar) +reduce(array, foo.String) +reduce(array, foo?.String()) +reduce(array, foo?.String) +reduce(array, get(array, 1)) +reduce(array, get(list, #)) +reduce(array, greet("bar")) +reduce(array, greet) +reduce(array, greet) != score != nil +reduce(array, groupBy(array, #)) +reduce(array, groupBy(list, #)) +reduce(array, groupBy(list, #)?.f32) +reduce(array, half(1)) +reduce(array, half) +reduce(array, i != #) +reduce(array, i % #) +reduce(array, i * #) +reduce(array, i ** f64) +reduce(array, i + 0.5) +reduce(array, i - #) +reduce(array, i / #) +reduce(array, i <= #) +reduce(array, i <= i64) +reduce(array, i > i32) +reduce(array, i ^ #) +reduce(array, i) +reduce(array, i) % i32 +reduce(array, i) + i32 +reduce(array, i) - f32 +reduce(array, i) == 0.5 ** 1 +reduce(array, i32 != #) +reduce(array, i32 != i32) +reduce(array, i32 + 0.5) +reduce(array, i32 - #) +reduce(array, i32 .. #) +reduce(array, i32 < #) +reduce(array, i32 < 1) +reduce(array, i32 > #) +reduce(array, i32 >= #) +reduce(array, i32) +reduce(array, i32) * 1 * 0.5 +reduce(array, i64 != #) +reduce(array, i64 % i) +reduce(array, i64 % i32) +reduce(array, i64 * #) +reduce(array, i64 + i32) +reduce(array, i64 - #) +reduce(array, i64 .. #) +reduce(array, i64 .. 1) +reduce(array, i64 / f64) +reduce(array, i64 <= #) +reduce(array, i64 == 1) +reduce(array, i64 == nil) +reduce(array, i64 ^ #) +reduce(array, i64 ^ f64) +reduce(array, i64) +reduce(array, i64) + i +reduce(array, i64) / f64 +reduce(array, i64) < i +reduce(array, i64) == f32 +reduce(array, int(f64)) +reduce(array, len(array)) +reduce(array, list) +reduce(array, list) != map(list, half) +reduce(array, map(array, div)) +reduce(array, map(array, score)) +reduce(array, map(list, 1)) +reduce(array, max(#, #, #)) +reduce(array, max(0.5)) +reduce(array, min(#)) +reduce(array, min(#, #, 0.5)) +reduce(array, min(0.5)) +reduce(array, min(1, 1)) +reduce(array, nil != "bar") +reduce(array, nil != #) +reduce(array, nil != 1) +reduce(array, not ok) +reduce(array, ok ? "foo" : "bar") +reduce(array, ok ? # : array) +reduce(array, ok ? # : i) +reduce(array, ok || true) +reduce(array, ok) +reduce(array, ok) and ok +reduce(array, reduce(array, 1)) +reduce(array, reduce(list, 0.5)) +reduce(array, round(0.5)) +reduce(array, score(#)) +reduce(array, score(1, #)) +reduce(array, score) +reduce(array, string(0.5)) +reduce(array, string(1)) +reduce(array, string(foo)) +reduce(array, string(i32)) +reduce(array, toJSON(i)) +reduce(array, trimPrefix("bar")) +reduce(array, true && true) +reduce(array, true ? add : #) +reduce(array, true) != ok +reduce(array, true) and ok +reduce(array, type(#)) +reduce(array, type(1)) +reduce(array, type(add)) +reduce(array, type(greet)) +reduce(array, type(score)) +reduce(array, upper("bar")) +reduce(false ? 0.5 : "bar", # and false) +reduce(false ? i32 : array, toJSON(#)) +reduce(false ? nil : list, #) +reduce(filter(array, ok), foo) +reduce(filter(list, ok), foo.Bar) +reduce(filter(list, true), i) +reduce(i .. 1, f64) +reduce(i .. 1, score) +reduce(i .. i, #) +reduce(i .. i, foo) +reduce(i .. i32, add) +reduce(i32 .. 1, #) +reduce(i32 .. 1, foo) +reduce(i32 .. i, 0.5 - #) +reduce(i32 .. i32, i64) +reduce(i32 .. i64, abs(f64)) +reduce(i64 .. 1, -#) +reduce(i64 .. i, #) +reduce(i64 .. i, -0.5) +reduce(i64 .. i, false ? "bar" : #) +reduce(i64 .. i, i) +reduce(i64 .. i, ok) +reduce(i64 .. i, round(i32)) +reduce(i64 .. i64, i64) +reduce(list, !true) +reduce(list, "bar" <= "bar") +reduce(list, "bar" in #) +reduce(list, "foo" not in #) +reduce(list, # != #) +reduce(list, # != foo) +reduce(list, # != nil) +reduce(list, # == #) +reduce(list, # == foo) +reduce(list, # == nil) +reduce(list, # in list) +reduce(list, # not in list) +reduce(list, #) +reduce(list, #) != foo +reduce(list, #) not in groupBy(array, i) +reduce(list, #) not in list +reduce(list, #).Bar +reduce(list, #).Qux +reduce(list, #).String +reduce(list, #).String() +reduce(list, #)?.Bar +reduce(list, #)?.Qux +reduce(list, #)?.String +reduce(list, #)?.String() +reduce(list, #?.Bar not in # ? # : #) +reduce(list, #?.Bar) +reduce(list, #?.Qux("foo")) +reduce(list, #?.Qux) +reduce(list, #?.String()) +reduce(list, #?.String) +reduce(list, -0.5) +reduce(list, -f64) +reduce(list, -i) +reduce(list, -i32) +reduce(list, .Bar) +reduce(list, .Qux) +reduce(list, .String()) +reduce(list, .String) +reduce(list, 0.5 != f64) +reduce(list, 0.5 != nil) +reduce(list, 0.5 == i64) +reduce(list, 0.5 >= 0.5) +reduce(list, 0.5) != i +reduce(list, 0.5) / i64 +reduce(list, 0.5) < f32 +reduce(list, 0.5) < i +reduce(list, 0.5) < i32 +reduce(list, 0.5) < i64 +reduce(list, 0.5) <= f32 +reduce(list, 0.5) >= f64 +reduce(list, 0.5) >= i64 +reduce(list, 1 != nil) +reduce(list, 1 + f64) +reduce(list, 1 - 0.5) +reduce(list, 1 / 0.5) +reduce(list, 1 < f64) +reduce(list, 1 <= 1) +reduce(list, 1 == 0.5) +reduce(list, 1 == nil) +reduce(list, 1 ^ 1) +reduce(list, 1) * f64 +reduce(list, 1) + f32 +reduce(list, 1) - i +reduce(list, add) +reduce(list, add) != div +reduce(list, add) in map(array, greet) +reduce(list, array != array) +reduce(list, array) +reduce(list, div == greet) +reduce(list, div) +reduce(list, f32 / 0.5) +reduce(list, f32 < i32) +reduce(list, f32 <= f32) +reduce(list, f32) +reduce(list, f32) == f32 +reduce(list, f64 != nil) +reduce(list, f64 + 0.5) +reduce(list, f64 + 1) +reduce(list, f64 / i32) +reduce(list, f64 <= i32) +reduce(list, f64 == f32) +reduce(list, f64 > f32) +reduce(list, f64 >= 0.5) +reduce(list, f64) +reduce(list, f64) * i64 +reduce(list, false == false) +reduce(list, false ? "foo" : list) +reduce(list, false ? # : #) +reduce(list, false || true) +reduce(list, filter(list, ok)) +reduce(list, findIndex(array, true)) +reduce(list, findLastIndex(list, false)) +reduce(list, float(i)) +reduce(list, floor(0.5)) +reduce(list, foo != #) +reduce(list, foo) +reduce(list, foo) == foo +reduce(list, foo).Bar +reduce(list, foo).Qux +reduce(list, foo).String +reduce(list, foo).String() +reduce(list, foo)?.Bar +reduce(list, foo)?.Qux +reduce(list, foo)?.String +reduce(list, foo)?.String() +reduce(list, foo.Bar) +reduce(list, foo.String) +reduce(list, foo?.Bar) +reduce(list, foo?.Qux) +reduce(list, foo?.String) +reduce(list, get(list, i)) +reduce(list, greet != nil) +reduce(list, greet("bar")) +reduce(list, greet) +reduce(list, groupBy(array, 1)) +reduce(list, groupBy(list, "bar")) +reduce(list, groupBy(list, #)) +reduce(list, half(1)) +reduce(list, half) +reduce(list, i * i64) +reduce(list, i + 1) +reduce(list, i - f64) +reduce(list, i .. 1) +reduce(list, i == 0.5) +reduce(list, i > i64) +reduce(list, i >= 0.5) +reduce(list, i) +reduce(list, i) * i64 +reduce(list, i) .. 1 % 1 +reduce(list, i) .. i +reduce(list, i) / f64 +reduce(list, i) / i32 +reduce(list, i) < f32 +reduce(list, i) == f32 +reduce(list, i) > f32 +reduce(list, i) ^ f32 +reduce(list, i32 != nil) +reduce(list, i32 - i32) +reduce(list, i32 .. 1) +reduce(list, i32 / 0.5) +reduce(list, i32 < i) +reduce(list, i32 <= i) +reduce(list, i32 == f64) +reduce(list, i32 >= f32) +reduce(list, i32) +reduce(list, i32) != f64 +reduce(list, i32) % i +reduce(list, i32) - f32 +reduce(list, i32) >= i +reduce(list, i64 .. 1) +reduce(list, i64 < i64) +reduce(list, i64 > i64) +reduce(list, i64 >= 0.5) +reduce(list, i64) +reduce(list, i64) * f64 +reduce(list, i64) ** i32 +reduce(list, i64) <= i64 +reduce(list, int(i64)) +reduce(list, len(array)) +reduce(list, list != nil) +reduce(list, list == nil) +reduce(list, list) +reduce(list, map(array, "bar")) +reduce(list, map(array, #)) +reduce(list, map(list, 1)) +reduce(list, max(0.5)) +reduce(list, max(f32)) +reduce(list, min(0.5)) +reduce(list, min(1)) +reduce(list, min(f32)) +reduce(list, nil != #) +reduce(list, nil != add) +reduce(list, nil != half) +reduce(list, nil == #) +reduce(list, not (half != score)) +reduce(list, not false) +reduce(list, not ok) +reduce(list, not true) +reduce(list, ok ? # : #) +reduce(list, ok ? # : score) +reduce(list, ok ? greet : add) +reduce(list, ok ? score : #) +reduce(list, ok) +reduce(list, reduce(array, ok)) +reduce(list, reduce(array, score)) +reduce(list, reduce(list, #)) +reduce(list, reduce(list, 1)) +reduce(list, reduce(list, add)) +reduce(list, reduce(list, i32)) +reduce(list, score != half) +reduce(list, score(i)) +reduce(list, score) +reduce(list, string(greet)) +reduce(list, toBase64("bar")) +reduce(list, toBase64("foo")) +reduce(list, toJSON(array)) +reduce(list, toJSON(list)) +reduce(list, toJSON(nil)) +reduce(list, true == nil) +reduce(list, true ? foo : f64) +reduce(list, type(#)) +reduce(map(array, "bar"), # not endsWith #) +reduce(map(array, "bar"), add) +reduce(map(array, "foo"), half(f64)) +reduce(map(array, #), # != i) +reduce(map(array, #), # .. #) +reduce(map(array, #), #) +reduce(map(array, #), abs(#)) +reduce(map(array, #), i) +reduce(map(array, #), i32 * #) +reduce(map(array, #), not ok) +reduce(map(array, 0.5), add) +reduce(map(array, 0.5), div) +reduce(map(array, 0.5), f32) +reduce(map(array, 1), # ^ 0.5) +reduce(map(array, 1), #) +reduce(map(array, 1), foo) +reduce(map(array, add), #) +reduce(map(array, add), f32) +reduce(map(array, add), list) +reduce(map(array, array), f64) +reduce(map(array, div), #) +reduce(map(array, div), div) +reduce(map(array, div), i32 * i) +reduce(map(array, f32), f32) +reduce(map(array, f32), i) +reduce(map(array, f32), i32) +reduce(map(array, f64), #) +reduce(map(array, f64), f32 < #) +reduce(map(array, false), # and true) +reduce(map(array, false), f32) +reduce(map(array, foo), # == nil) +reduce(map(array, i), # / 1) +reduce(map(array, i), #) +reduce(map(array, i), add) +reduce(map(array, i), f64 + 1) +reduce(map(array, i32), array) +reduce(map(array, i32), list) +reduce(map(array, i64), # <= #) +reduce(map(array, i64), #) +reduce(map(array, list), filter(#, false)) +reduce(map(array, ok), i) +reduce(map(array, score), i32) +reduce(map(list, "bar"), #) +reduce(map(list, "foo"), #) +reduce(map(list, #), #) +reduce(map(list, #), .Qux) +reduce(map(list, #), add) +reduce(map(list, #), array) +reduce(map(list, #), f32) +reduce(map(list, #), f64) +reduce(map(list, #), half) +reduce(map(list, #), i64) +reduce(map(list, #), ok) +reduce(map(list, 0.5), #) +reduce(map(list, 0.5), foo) +reduce(map(list, 1), # > #) +reduce(map(list, 1), #) +reduce(map(list, 1), list) +reduce(map(list, array), div) +reduce(map(list, div), add) +reduce(map(list, f64), #) +reduce(map(list, f64), ok) +reduce(map(list, false), div) +reduce(map(list, greet), #) +reduce(map(list, i), #) +reduce(map(list, i), [i32]) +reduce(map(list, i), f32) +reduce(map(list, i), score(#)) +reduce(map(list, i32), #) +reduce(map(list, i32), foo) +reduce(map(list, i64), #) +reduce(map(list, i64), i32) +reduce(map(list, list), ok) +reduce(map(list, score), #) +reduce(map(list, score), f64) +reduce(map(list, true), #) +reduce(map(list, true), add) +reduce(map(list, true), half) +reduce(ok ? "bar" : i32, #) +reduce(ok ? "foo" : list, #) +reduce(ok ? array : half, f32) +reduce(ok ? list : i, #) +reduce(reduce(array, array), f64 != #) +reduce(reduce(array, list), get(array, i32)) +reduce(reduce(list, array), f64) +reduce(sort(array), #) +reduce(sort(array), foo) +reduce(sort(array), greet) +reduce(sort(array), ok) +reduce(true ? array : 1, array) +reduce(true ? array : array, #) +repeat(type(ok), i) +round(-0.5) +round(-1) +round(-f32) +round(-f64) +round(-i) +round(-i32) +round(-i64) +round(0.5 * 1) +round(0.5 * f64) +round(0.5 * i32) +round(0.5 ** 0.5) +round(0.5 ** 1) +round(0.5 ** i) +round(0.5 ** i32) +round(0.5 ** i64) +round(0.5 + 1) +round(0.5 + f64) +round(0.5 + i) +round(0.5 + i32) +round(0.5 - 0.5) +round(0.5 - 1) +round(0.5 - i32) +round(0.5 / 0.5) +round(0.5 / 1) +round(0.5 / f64) +round(0.5 / i32) +round(0.5 ^ f64) +round(0.5 ^ i) +round(0.5 ^ i64) +round(0.5) * f32 +round(0.5) ** i32 +round(0.5) + -f32 +round(0.5) - i64 ^ i +round(0.5) < f64 +round(0.5) <= i64 +round(0.5) == i32 +round(0.5) == i64 +round(0.5) == max(i, i64) +round(0.5) > -1 +round(0.5) > i +round(0.5) >= i +round(0.5) in array +round(1 % i) +round(1 % i64) +round(1 * 0.5) +round(1 * f32) +round(1 * i64) +round(1 ** 0.5) +round(1 ** 1) +round(1 ** f32) +round(1 ** f64) +round(1 ** i) +round(1 + 0.5) +round(1 + 1) +round(1 + i64) +round(1 - 0.5) +round(1 - 1) +round(1 - i) +round(1 - i32) +round(1 - i64) +round(1 / 0.5) +round(1 / 1) +round(1 / f32) +round(1 / i) +round(1 / i64) +round(1 ^ 0.5) +round(1 ^ 1) +round(1 ^ f32) +round(1 ^ i) +round(1 ^ i64) +round(1) != ceil(i32) +round(1) * i32 +round(1) + i64 +round(1) - i64 +round(1) / i32 +round(1) / i64 +round(1) < i64 +round(1) <= i +round(1) == i +round(1) >= f64 +round(1) >= i32 +round(1) >= i64 +round(1) ^ f64 +round(1) not in array +round(abs(0.5)) +round(abs(1)) +round(abs(f64)) +round(abs(i)) +round(abs(i64)) +round(add(1, i)) +round(array[1]) +round(array[i32]) +round(array[i64]) +round(bitnot(i)) +round(bitnot(i32)) +round(bitnot(i64)) +round(ceil(1)) +round(ceil(f64)) +round(ceil(i32)) +round(ceil(i64)) +round(count(list, true)) +round(div(1, 1)) +round(f32 * 0.5) +round(f32 * 1) +round(f32 * f64) +round(f32 * i32 ^ f32) +round(f32 * i64) +round(f32 ** 0.5) +round(f32 ** 1) +round(f32 + f64) +round(f32 + i32) +round(f32 - 0.5) +round(f32 - i) +round(f32 / i32) +round(f32 ^ 0.5) +round(f32 ^ f32) +round(f32 ^ i) +round(f32 ^ i64) +round(f32) +round(f32) * i32 +round(f32) - i32 +round(f32) / f32 +round(f32) == i32 +round(f64 * 0.5) +round(f64 * i) +round(f64 ** 0.5) +round(f64 ** 1) +round(f64 ** f32) +round(f64 ** i) +round(f64 + f64) +round(f64 + i) +round(f64 + i32) +round(f64 - 0.5) +round(f64 - 1) +round(f64 - i32) +round(f64 / f64) +round(f64 / i) +round(f64 / i32) +round(f64 / i64) +round(f64 ^ 1) +round(f64 ^ f64) +round(f64) +round(f64) * f32 +round(f64) ** i32 +round(f64) + f64 +round(f64) <= f64 +round(f64) > i +round(f64) > i32 +round(f64) >= i64 +round(f64) not in array +round(false ? f32 : f64) +round(false ? f64 : 1) +round(false ? nil : 1) +round(findIndex(array, # <= #)) +round(findIndex(list, ok)) +round(findLast(array, ok)) +round(findLast(array, true)) +round(findLastIndex(array, ok)) +round(findLastIndex(list, ok)) +round(float(0.5)) +round(float(1)) +round(float(f32)) +round(float(i)) +round(floor(0.5)) +round(floor(1)) +round(floor(f64)) +round(floor(i32)) +round(floor(i64)) +round(get(array, i)) +round(get(array, i32)) +round(get(array, i64)) +round(half(-1)) +round(half(0.5)) +round(half(1)) +round(half(f64)) +round(i % i32) +round(i % i64) +round(i * 1) +round(i * f64) +round(i * i32) +round(i ** 1) +round(i ** i64) +round(i + 0.5) +round(i + 1) +round(i + f64) +round(i + i) +round(i + i32) +round(i + i64) +round(i - i) +round(i - i32) +round(i / 1) +round(i / i) +round(i / i64) +round(i ^ 0.5) > f32 +round(i ^ 1) +round(i ^ f32) +round(i) +round(i) * f32 +round(i) * i +round(i) / f64 +round(i) < i +round(i) < i32 +round(i) > i +round(i) > i64 != ok +round(i) >= f32 +round(i) >= i64 +round(i) ^ i32 +round(i32 % 1) +round(i32 * 1) +round(i32 ** 1) +round(i32 ** f32) +round(i32 ** f64) +round(i32 + 0.5) +round(i32 + 1) +round(i32 + i32) +round(i32 - 1) +round(i32 - f32) +round(i32 - f64) +round(i32 / 0.5) +round(i32 / 1) +round(i32 ^ f64) +round(i32) +round(i32) != i +round(i32) * f32 +round(i32) ** f64 +round(i32) - i +round(i32) < i32 +round(i32) <= ceil(1) +round(i32) <= f64 +round(i32) <= i64 +round(i32) >= f64 +round(i32) >= i32 +round(i32) ^ f64 +round(i64 % i) +round(i64 % i32) +round(i64 * 0.5) +round(i64 * i) +round(i64 ** 1) +round(i64 ** f64) +round(i64 ** i64) +round(i64 + f32) +round(i64 - 0.5) +round(i64 - 1) +round(i64 - i) +round(i64 / 0.5) +round(i64 / 1) +round(i64 ^ 1) +round(i64 ^ i32) +round(i64 ^ i64) +round(i64) +round(i64) != f64 +round(i64) * i64 +round(i64) ** i32 +round(i64) - bitnot(1) +round(i64) - f32 +round(i64) < f64 +round(i64) ^ f64 +round(int(0.5)) +round(int(1)) +round(int(f32)) +round(int(f64)) +round(int(i)) +round(int(i32)) +round(int(i64)) +round(last(array)) +round(len("bar")) +round(len("foo")) +round(len(array)) +round(len(list)) +round(max(0.5)) +round(max(1)) +round(max(i)) +round(max(i32)) +round(max(i64)) +round(max(i64, f32)) +round(mean(array)) +round(median(array)) +round(min(0.5)) +round(min(1)) +round(min(f32)) +round(min(f64)) +round(min(i32)) +round(min(i64)) +round(reduce(array, #)) +round(reduce(array, 0.5)) +round(reduce(array, 1)) +round(reduce(array, i64)) +round(reduce(list, 0.5)) +round(reduce(list, f32)) +round(round(0.5)) +round(round(1)) +round(round(f32)) +round(round(f64)) +round(round(i)) +round(round(i32)) +round(round(i64)) +round(score(1)) +round(score(i)) +round(sum(array)) +round(true ? i : ok) score score != add -score != add != true -score != add ? i64 : "foo" +score != add == ok +score != add ? 0.5 : div score != div -score != div ? i : f32 -score != div and ok score != foo.Qux score != foo.String score != foo?.Qux score != foo?.String score != greet -score != greet ? score : array +score != greet ? add : i64 +score != greet ? div : i score != half +score != half || ok +score != nil != ok +score != nil ? half : f64 +score != nil or i32 > 0.5 +score != nil || ok score != score -score != score ? 1 : i +score != score != ok +score != score ? i32 : i32 score == add -score == add == false -score == add ? f64 : not false score == div -score == div || foo == foo +score == div != nil +score == div == ok score == foo.Qux score == foo.String score == foo?.Qux score == foo?.String score == greet -score == greet ? half : f64 -score == greet and ok +score == greet != ok score == half +score == half ? 1 : add +score == half ? half : f64 +score == nil != nil +score == nil && ok +score == nil ? 0.5 : "bar" +score == reduce(array, half) score == score -score == score ? 0.5 : foo -score == score ? nil : i32 -score == score or ok -score == {"bar": 0.5}.f32 +score == score == true +score == score ? 0.5 : score +score in groupBy(list, #)?.array +score in map(list, add) +score in sort(array) score(-1) +score(-1, i) +score(-get(array, i)) score(-i) score(-i, i) score(1 % 1) @@ -12533,7 +16422,6 @@ score(1 % i) score(1 % i32) score(1 % i64) score(1 * 1) -score(1 * 1, i) score(1 * i) score(1 * i32) score(1 * i64) @@ -12544,73 +16432,81 @@ score(1 + i64) score(1 - 1) score(1 - i) score(1 - i32) -score(1 - i64) -score(1) != -0.5 -score(1) != f32 -score(1) != float(f64) +score(1) != -f32 score(1) != i -score(1) % i32 +score(1) != i32 +score(1) % -1 +score(1) % i +score(1) % i64 score(1) * f32 -score(1) * f64 +score(1) * i score(1) * i64 -score(1) ** -1 -score(1) ** f32 -score(1) ** i64 -score(1) + f32 +score(1) ** i32 score(1) + f64 +score(1) + i32 score(1) - f32 score(1) - i +score(1) - i32 +score(1) - int(0.5) +score(1) .. i +score(1) .. i32 score(1) .. i64 -score(1) / f64 -score(1) / i +score(1) .. score(1) +score(1) / f32 score(1) / i32 -score(1) / i64 +score(1) < i score(1) < i32 score(1) < i64 -score(1) <= i32 +score(1) < i64 - 0.5 +score(1) <= 0.5 * 1 +score(1) <= i score(1) <= i64 -score(1) == 1 ^ 1 -score(1) == f64 -score(1) == i ** f64 score(1) == i32 score(1) == i64 +score(1) > bitshr(i64, 1) +score(1) > f32 score(1) > i64 +score(1) >= 0.5 + f64 score(1) >= f32 -score(1) >= f64 score(1) >= i -score(1) >= i32 -score(1) >= i64 -score(1) ^ f32 +score(1) >= sum(array) score(1) ^ f64 score(1) ^ i +score(1) ^ i32 score(1) in array -score(1, i) > f32 +score(1) not in groupBy(list, false) +score(1, 1) < i +score(1, i) < f64 +score(1, i) ^ f32 score(abs(1)) score(abs(i)) -score(add(1, 1)) score(add(1, i)) score(array[1]) -score(array[i32]) score(array[i64]) score(array[i]) -score(count(array, f64 < 1)) +score(bitnand(1, i64)) +score(bitnand(i64, i32)) +score(bitnot(1)) +score(bitnot(i)) +score(bitnot(i32)) +score(bitnot(i64)) +score(bitshl(i32, i)) +score(bitshr(1, i64)) +score(bitshr(i32, i64)) +score(bitushr(1, i)) score(count(array, false)) score(count(array, ok)) score(count(array, true)) -score(count(list, false)) score(count(list, ok)) -score(count(list, true)) -score(div(1, 1)) -score(div(i, 1)) -score(false ? true : i) +score(false ? f64 : 1) +score(false ? foo : 1) +score(find(array, i != #)) score(find(array, ok)) +score(find(array, true)) score(findIndex(array, ok)) score(findIndex(array, true)) -score(findIndex(list, ok)) score(findIndex(list, true)) -score(findLast(array, 0.5 != #)) -score(findLast(array, ok)) -score(findLastIndex(array, ok)) +score(findLast(array, true)) score(findLastIndex(array, true)) score(findLastIndex(list, ok)) score(findLastIndex(list, true)) @@ -12619,76 +16515,95 @@ score(get(array, 1)) score(get(array, i)) score(get(array, i32)) score(get(array, i64)) +score(i % 1) score(i % i) -score(i % i32) +score(i % i64) +score(i * 1 * i) score(i * 1) +score(i * i) score(i * i32) score(i * i64) score(i + 1) score(i + i) score(i + i32) -score(i + i64) score(i - 1) score(i - i) score(i - i32) -score(i - i64) score(i) -score(i) != 1 == true -score(i) != float(i32) -score(i) != i -score(i) != i32 -score(i) % i32 % i64 -score(i) % i64 -score(i) * f64 +score(i) != f32 +score(i) != f64 +score(i) % i +score(i) % i * f64 +score(i) * f32 score(i) * i32 -score(i) * i64 -score(i) ** f64 +score(i) ** (0.5 / 0.5) +score(i) ** -0.5 score(i) ** i32 -score(i) + f32 -score(i) + i -score(i) + i32 -score(i) + i64 -score(i) - f32 -score(i) - i +score(i) ** i64 +score(i) + f64 +score(i) - f64 score(i) - i32 -score(i) / f32 -score(i) / i +score(i) / i64 +score(i) < 1 != ok score(i) < f32 +score(i) < f64 / 0.5 score(i) < i32 -score(i) <= f32 - f32 +score(i) < i64 +score(i) <= 0.5 / f32 +score(i) <= f32 +score(i) <= f64 +score(i) <= i +score(i) <= i32 score(i) == f32 -score(i) == i32 -score(i) == i64 +score(i) > f32 +score(i) > i +score(i) > i64 score(i) >= f32 -score(i) ^ f64 -score(i) ^ i -score(i, i + i) +score(i) >= f64 +score(i) >= i +score(i) >= i32 +score(i) >= i64 +score(i) ^ f32 +score(i) ^ i32 +score(i) ^ i64 +score(i) ^ score(1) +score(i, 1) + -1 +score(i, 1) .. i64 +score(i, 1) <= f32 score(i, i) -score(i, i) >= i -score(i, int(i64)) -score(i, score(i)) - i32 +score(i, i) ** f32 +score(i32 % 1) score(i32 % i) -score(i32 % i64) +score(i32 % i32) score(i32 * 1) score(i32 * i) +score(i32 * i32) +score(i32 * i64) +score(i32 + 1) score(i32 + i) +score(i32 + i32) score(i32 + i64) score(i32 - 1) score(i32 - i) +score(i32 - i32) +score(i32 - i64) score(i64 % 1) score(i64 % i) +score(i64 % i32) +score(i64 % i64) score(i64 * 1) -score(i64 * i) score(i64 * i32) +score(i64 * i64) score(i64 + 1) +score(i64 + i) +score(i64 + i32) score(i64 - 1) -score(i64 - i) -score(i64 - i32) +score(i64 - i64) score(int(0.5)) score(int(1)) -score(int(f32 * i)) score(int(f32)) score(int(f64)) +score(int(float(0.5))) score(int(i)) score(int(i32)) score(int(i64)) @@ -12696,72 +16611,74 @@ score(last(array)) score(len("bar")) score(len("foo")) score(len(array)) -score(len(i32 .. i64)) score(len(list)) score(max(1)) -score(max(1, 1)) +score(max(1, i32, 0.5)) score(max(i)) -score(max(i, 1)) +score(max(i, i32)) score(min(1)) -score(min(1, i64)) score(min(i)) +score(min(i, i32)) +score(ok ? 1 : "bar") +score(ok ? 1 : list) +score(reduce(array, #)) +score(reduce(array, i)) +score(reduce(list, 1)) +score(reduce(list, i)) score(score(1)) -score(score(1, 1)) score(score(i)) -score(score(i32 % 1)) -score(true ? 1 : true) -score(true ? i : i64) +score(score(i32 + i)) +score(sum(array)) sort(1 .. 1) -sort(1 .. i64) -sort([0.5]) -sort([1]) -sort([i32]) +sort(1 .. i) +sort([add]) +sort([greet]) +sort([half]) sort([i64]) -sort([nil]) +sort([list]) sort(array) -sort(array) != list -sort(false ? i64 : array) -sort(filter(array, false)) -sort(filter(array, true)) -sort(filter(list, false)) -sort(i .. 1) +sort(array) == array +sort(false ? greet : array) +sort(groupBy(list, #)?.foo) +sort(groupBy(list, i32).half) +sort(i .. i32) sort(i .. i64) sort(i32 .. 1) -sort(i32 .. i32) +sort(i64 .. 1) sort(map(array, "bar")) sort(map(array, "foo")) sort(map(array, #)) sort(map(array, 1)) -sort(map(array, i32)) -sort(map(list, "foo")) != list -sort(map(list, i)) -sort(sort(array)) -string(!(i <= f32)) +sort(map(array, f64)) +sort(map(array, i)) +sort(map(array, i64)) +sort(reduce(array, array)) +sortBy(array, string(true)) +string(!!false) string(!false) string(!ok) string(!true) -string("bar" != "bar") -string("bar" < "bar") +string("bar" != nil) +string("bar" <= "bar") string("bar" == "bar") -string("bar" > "bar") -string("bar" contains "foo") -string("bar" endsWith "bar") +string("bar" > "foo") +string("bar" >= "bar") string("bar" not endsWith "bar") -string("bar" not matches "foo") +string("bar" not matches "bar") string("bar" not startsWith "foo") -string("bar" startsWith "bar") -string("bar") >= type(score) -string("bar") endsWith "foo" + "foo" -string("bar") in foo +string("bar" startsWith "foo") +string("bar") > type(i64) +string("bar") >= toJSON("bar") string("foo" != nil) -string("foo" <= "foo") -string("foo" >= "bar") -string("foo" matches "foo") -string("foo" not endsWith "foo") +string("foo" == "foo") +string("foo" == nil) +string("foo" > "bar") +string("foo" in foo) +string("foo" matches "bar") +string("foo" not contains "bar") +string("foo" not contains "foo") string("foo" not in foo) -string("foo" not matches "foo") -string("foo" startsWith "bar") -string(-(0.5 + f64)) +string(--i) string(-0.5) string(-1) string(-f32) @@ -12770,292 +16687,251 @@ string(-i) string(-i32) string(-i64) string(0.5 != 0.5) -string(0.5 != 1) -string(0.5 != f32) string(0.5 != f64) string(0.5 != i) -string(0.5 != nil) +string(0.5 != i32) string(0.5 * 0.5) -string(0.5 * f32) string(0.5 * i) string(0.5 * i32) -string(0.5 ** 0.5) -string(0.5 ** 1) +string(0.5 ** f32) string(0.5 ** i32) -string(0.5 ** i64) -string(0.5 + 0.5) -string(0.5 + 1) -string(0.5 + f32) string(0.5 + f64) +string(0.5 + i) string(0.5 + i64) -string(0.5 - 0.5) -string(0.5 - 1) +string(0.5 - f32) +string(0.5 - f64) string(0.5 / 0.5) -string(0.5 / f64) +string(0.5 / 1) +string(0.5 / f32) string(0.5 / i) +string(0.5 < 0.5) string(0.5 < 1) -string(0.5 < f32) -string(0.5 < i) -string(0.5 < i32) +string(0.5 < i64) +string(0.5 <= 0.5) string(0.5 <= f64) string(0.5 <= i) -string(0.5 <= i64) +string(0.5 <= i32) string(0.5 == 0.5) string(0.5 == 1) -string(0.5 == f32) -string(0.5 == f64) -string(0.5 == i) -string(0.5 == i32) string(0.5 == i64) string(0.5 == nil) string(0.5 > 0.5) string(0.5 > 1) +string(0.5 > i) string(0.5 > i64) string(0.5 >= 0.5) string(0.5 >= 1) string(0.5 >= f32) -string(0.5 >= f64) -string(0.5 >= i) string(0.5 >= i32) -string(0.5 ^ 0.5) -string(0.5 ^ 1) +string(0.5 >= i64) string(0.5 ^ f32) string(0.5 ^ i) string(0.5 ^ i32) -string(0.5) not endsWith type(1) +string(0.5 ^ i64) +string(0.5 in array) +string(0.5 not in array) +string(1 != 0.5) string(1 != 1) -string(1 != f32) -string(1 != f64) string(1 != i) -string(1 != i32) +string(1 != i64) string(1 != nil) string(1 % 1) string(1 % i) string(1 % i32) -string(1 % i64) -string(1 * 1) -string(1 * i) -string(1 * i64) +string(1 * 0.5) +string(1 * f32) +string(1 * f64) string(1 ** 0.5) string(1 ** 1) -string(1 ** f64) string(1 ** i) -string(1 ** i32) +string(1 ** i64) string(1 + 0.5) -string(1 + f32) +string(1 + 1) string(1 + f64) -string(1 + i64) +string(1 - 0.5) string(1 - f32) -string(1 - i) +string(1 - i32) string(1 - i64) string(1 .. 1) -string(1 .. i) string(1 .. i32) +string(1 .. i64) string(1 / 0.5) -string(1 / 1) -string(1 / f32) +string(1 / f64) string(1 / i) -string(1 < i) -string(1 < i32) -string(1 < i64) -string(1 <= 0.5) +string(1 / i32) +string(1 / i64) +string(1 < 0.5) string(1 <= 1) string(1 <= f32) -string(1 <= f64) +string(1 <= i) string(1 <= i32) -string(1 == 0.5) +string(1 <= i64) string(1 == 1) -string(1 == f64) -string(1 == i) -string(1 == i64) -string(1 == nil) +string(1 == f32) +string(1 == i32) +string(1 > 0.5) string(1 > 1) -string(1 > f32) -string(1 >= 0.5) -string(1 >= 1) +string(1 > i64) string(1 >= f32) -string(1 >= f64) string(1 >= i) -string(1 >= i32) -string(1 >= i64) +string(1 ^ 0.5) string(1 ^ 1) string(1 ^ f32) string(1 ^ f64) -string(1 ^ i) -string(1 ^ i32) string(1 ^ i64) -string(1 in array) string(1 not in array) -string(1)[i64:i64] -string([0.5, f32]) -string([add]) -string([f32]) -string([greet]) -string([i32, half]) -string([i32]) -string([i]) -string([ok]) +string([0.5]) +string([div]) +string([f64]) +string([list]) string([score]) +string([true]) string(abs(0.5)) string(abs(1)) string(abs(f32)) -string(abs(f64)) -string(abs(half(0.5))) string(abs(i)) -string(abs(i64)) +string(abs(i32)) string(add != add) -string(add != half) -string(add != nil) +string(add != div) string(add != score) +string(add == div) string(add == greet) +string(add == nil) +string(add == score) string(add) -string(add) contains type(list) -string(add) not in foo -string(all(array, false)) +string(add) in foo ? i64 : i32 +string(add) not endsWith foo.Bar +string(all(array, ok)) string(all(array, true)) -string(any(array, false)) -string(any(list, true)) +string(any(array, ok)) +string(any(list, false)) +string(any(list, ok)) string(array != array) -string(array == nil) +string(array != nil) string(array) -string(array) not in foo -string(array[1:i]) -string(array[1]) -string(array[i64]) -string(count(array, # <= #)) -string(count(array, ok)) +string(array[i32]) +string(bitnot(1)) +string(bitnot(i32)) +string(bitnot(i64)) +string(ceil(0.5)) +string(ceil(1)) +string(ceil(f32)) +string(ceil(f64)) +string(ceil(i)) +string(ceil(i64)) +string(div != div) string(div != greet) string(div != nil) -string(div == nil) -string(div == score) +string(div != score) +string(div == add) +string(div == div) +string(div == greet) string(div) string(f32 != 0.5) -string(f32 != 1) -string(f32 != f32) string(f32 != f64) +string(f32 != i) string(f32 != nil) string(f32 * 0.5) +string(f32 * 1) string(f32 * f64) string(f32 * i) string(f32 * i32) string(f32 ** 1) -string(f32 ** i64) -string(f32 + 1) +string(f32 ** f64) string(f32 + f32) -string(f32 - i) -string(f32 / 1) -string(f32 / i) +string(f32 + f64) +string(f32 + i32) +string(f32 + i64) +string(f32 - 0.5) +string(f32 - 1) +string(f32 - i64) +string(f32 / 0.5) +string(f32 / f64) string(f32 / i64) -string(f32 < 0.5) -string(f32 < f64) -string(f32 < i32) -string(f32 <= 0.5) -string(f32 <= 1) -string(f32 <= f32) +string(f32 < f32) string(f32 <= i) string(f32 <= i32) string(f32 == 0.5) -string(f32 == 1) -string(f32 == i64) -string(f32 == nil) -string(f32 > 1) -string(f32 > f32) +string(f32 == i) +string(f32 > 0.5) string(f32 > f64) -string(f32 > i) -string(f32 > i32) -string(f32 >= 0.5) -string(f32 >= f32) -string(f32 >= f64) -string(f32 >= i32) -string(f32 ^ 1) -string(f32 ^ f32) -string(f32 ^ f64) -string(f32 ^ i) -string(f32 ^ i64) string(f32) -string(f32) matches trim("bar") +string(f32) in foo string(f64 != 1) -string(f64 != f32) +string(f64 != i) +string(f64 != nil) string(f64 * 0.5) -string(f64 * 1) -string(f64 * f32) -string(f64 * f64) string(f64 * i) +string(f64 * i32) +string(f64 * i64) string(f64 ** 0.5) -string(f64 ** 1) string(f64 ** f64) -string(f64 ** i32) +string(f64 ** i) string(f64 + 0.5) string(f64 + 1) string(f64 + f32) -string(f64 + i) -string(f64 + i32) -string(f64 + i64) string(f64 - 0.5) -string(f64 - f64) -string(f64 - i32) +string(f64 - 1) +string(f64 - i) string(f64 / 0.5) -string(f64 / f64) -string(f64 / i64) -string(f64 < 1) -string(f64 < f64) -string(f64 < i32) +string(f64 < f32) +string(f64 < i) +string(f64 <= 1) +string(f64 <= f32) string(f64 <= f64) -string(f64 <= i) -string(f64 == 0.5) string(f64 == 1) string(f64 == f32) -string(f64 == f64) string(f64 == i) -string(f64 == i32) string(f64 == i64) -string(f64 > 0.5) string(f64 > 1) -string(f64 > f32) -string(f64 > f64) -string(f64 > i64) -string(f64 >= 1) string(f64 >= f32) string(f64 >= i) -string(f64 >= i64) string(f64 ^ 0.5) +string(f64 ^ f32) string(f64 ^ i) -string(f64 ^ i32) -string(f64 ^ i64) +string(f64 in array) +string(f64 not in array) string(f64) -string(false && false) -string(false ? 0.5 : i32) -string(false ? 1 : "bar") -string(false ? 1 : f32) -string(false ? 1 : score) -string(false ? div : "foo") -string(false ? f32 : foo) -string(false and true) -string(false) <= foo.Bar -string(false) > string(add) -string(filter(list, ok)) +string(false != nil) +string(false != ok) +string(false != true) +string(false ? array : 0.5) +string(false ? f64 : i32) +string(false ? false : i) +string(false ? greet : f64) +string(false ? half : "bar") +string(false ? half : i) +string(false ? i : i) +string(false ? nil : nil) +string(false and ok) +string(false) endsWith toBase64("foo") +string(filter(array, false)) +string(filter(array, ok)) +string(filter(array, true)) +string(filter(list, false)) string(find(array, ok)) +string(find(array, true)) +string(find(list, ok)) string(findIndex(array, true)) -string(findIndex(list, ok)) -string(findLast(array, # >= #)) string(findLast(array, false)) string(findLast(array, ok)) -string(findLast(list, ok)) -string(findLastIndex(array, not false)) +string(findLast(array, true)) string(findLastIndex(array, ok)) -string(findLastIndex(array, true)) -string(findLastIndex(list, false)) -string(findLastIndex(list, ok)) -string(findLastIndex(list, true)) string(first(array)) string(first(list)) string(float(0.5)) string(float(1)) -string(float(f32)) string(float(f64)) string(float(i)) string(float(i64)) -string(foo != nil) +string(floor(0.5)) +string(floor(f32)) +string(floor(f64)) +string(floor(i)) +string(floor(i32)) +string(floor(i64)) +string(foo == foo) +string(foo == nil) string(foo not in list) string(foo) string(foo.Bar) @@ -13066,367 +16942,338 @@ string(foo?.Bar) string(foo?.Qux) string(foo?.String()) string(foo?.String) -string(get(array, 1)) string(get(array, i)) -string(get(list, i)) +string(get(array, i64)) +string(get(list, 1)) +string(get(list, i32)) string(get(list, i64)) string(greet != add) -string(greet != greet) string(greet != nil) -string(greet != score) -string(greet == add) string(greet == greet) -string(greet == half) string(greet == nil) string(greet == score) string(greet("bar")) string(greet("foo")) string(greet) -string(greet)[i64:i] -string(half != add) -string(half != div) -string(half != half) -string(half == greet) +string(greet) == nil ? 0.5 : i +string(groupBy(array, #)) +string(groupBy(array, 1)) +string(groupBy(array, f32)) +string(groupBy(array, false)) +string(groupBy(array, i32)) +string(groupBy(list, #)) +string(groupBy(list, 0.5)) +string(groupBy(list, 1)) +string(groupBy(list, f64)) +string(groupBy(list, false)) +string(groupBy(list, i)) +string(half != nil) +string(half != score) string(half == nil) -string(half == score) -string(half(-1)) +string(half == sum(array)) string(half(0.5)) +string(half(1)) string(half(f64)) string(half) -string(half) > toJSON(nil) -string(half) not endsWith type("foo") -string(i != 0.5) -string(i != f32) -string(i != f64) +string(i != 1) +string(i != i64) string(i % 1) string(i % i32) -string(i * i32) -string(i * i64) -string(i ** 1) +string(i % i64) +string(i * 1) +string(i * f64) string(i ** f32) -string(i + 1) +string(i ** f64) +string(i ** i64) +string(i + 0.5) string(i + i) -string(i + i32) -string(i + i64) string(i - f32) -string(i - i64) string(i .. 1) string(i .. i) -string(i .. i64) +string(i .. i32) string(i / 1) string(i / f32) -string(i / i) +string(i / f64) string(i / i32) string(i / i64) +string(i < 0.5) string(i < 1) -string(i < f32) string(i < i32) -string(i <= 0.5) -string(i <= 1) -string(i == 0.5) -string(i == f32) -string(i == i32) +string(i <= f32) +string(i <= i) +string(i == 1) +string(i == i) string(i > 0.5) string(i > 1) -string(i > f64) -string(i > i64) -string(i >= 1) -string(i >= f64) -string(i ^ 0.5) +string(i > f32) +string(i >= 0.5) +string(i >= i64) string(i ^ 1) +string(i ^ f32) string(i ^ i) -string(i in array) -string(i not in array) +string(i ^ i64) string(i) +string(i) in foo +string(i32 != 0.5) +string(i32 != 1) string(i32 != f64) -string(i32 != i) +string(i32 != i32) string(i32 != nil) -string(i32 * 0.5) +string(i32 % 1) +string(i32 % i) +string(i32 % i64) string(i32 * 1) string(i32 * f32) string(i32 * f64) -string(i32 * i64) +string(i32 * i) string(i32 ** 0.5) string(i32 ** f64) -string(i32 ** i) -string(i32 + f64) -string(i32 + i32) +string(i32 + 0.5) +string(i32 - 0.5) +string(i32 - 1) string(i32 - f32) string(i32 - f64) +string(i32 - i32) +string(i32 - i64) string(i32 .. 1) -string(i32 .. i32) -string(i32 .. i64) +string(i32 .. i) string(i32 / 0.5) -string(i32 / i64) -string(i32 < 0.5) -string(i32 < f32) -string(i32 < i) -string(i32 < i32) +string(i32 < 1) +string(i32 < f64) string(i32 < i64) -string(i32 <= f64) -string(i32 <= i64) -string(i32 == 1) string(i32 == f32) -string(i32 == f64) -string(i32 == i) +string(i32 == i64) string(i32 == nil) string(i32 > 1) -string(i32 > f64) +string(i32 > i) string(i32 >= 0.5) string(i32 >= 1) -string(i32 >= f64) string(i32 >= i) -string(i32 >= i64) -string(i32 ^ 1) +string(i32 ^ f32) string(i32 ^ f64) string(i32 ^ i32) -string(i32 ^ i64) string(i32 in array) string(i32 not in array) string(i32) -string(i32) == type("bar") -string(i64 != 0.5) +string(i32) not startsWith trimSuffix("foo") string(i64 != 1) string(i64 != i) string(i64 != i32) string(i64 != i64) -string(i64 != nil) -string(i64 % 1) -string(i64 % i64) +string(i64 % i32) string(i64 * 1) string(i64 * f32) -string(i64 * i32) -string(i64 * i64) +string(i64 * i) string(i64 ** 0.5) -string(i64 ** f32) -string(i64 ** i) -string(i64 ** i32) -string(i64 + 0.5) -string(i64 + f32) -string(i64 + f64) -string(i64 + i) -string(i64 + i32) -string(i64 - f32) +string(i64 + i64) string(i64 - i) -string(i64 / 0.5) -string(i64 / 1) -string(i64 / f32) +string(i64 - i32) +string(i64 - i64) +string(i64 .. 1) +string(i64 .. i) +string(i64 .. i32) string(i64 / f64) string(i64 / i) string(i64 / i64) -string(i64 < 1) -string(i64 <= 0.5) -string(i64 <= f32) -string(i64 <= i) -string(i64 <= i32) +string(i64 < 0.5) +string(i64 < i) string(i64 <= i64) -string(i64 == 1) +string(i64 == 0.5) string(i64 == i) -string(i64 == i32) -string(i64 == nil) -string(i64 > 1) -string(i64 > f32) -string(i64 > f64) -string(i64 > i) -string(i64 > i32) +string(i64 > 0.5) string(i64 > i64) -string(i64 >= f64) -string(i64 >= i64) +string(i64 >= 0.5) +string(i64 >= 1) string(i64 ^ 0.5) string(i64 ^ f64) -string(i64 ^ i) string(i64 in array) string(i64) -string(i64) >= foo.Bar +string(i64) matches greet("bar") string(i64) not in foo string(int(0.5)) string(int(1)) -string(int(f32 - i)) -string(int(f32)) -string(int(f64)) -string(int(i)) string(int(i32)) string(int(i64)) string(last(array)) -string(last(list)) +string(last(list).String()) +string(len("bar")) string(len(array)) string(len(list)) -string(len(string("foo"))) +string(list != nil) string(list == array) string(list == list) string(list == nil) string(list) -string(list) != toJSON(i64) string(list[1]) +string(list[i32]) string(list[i64]) -string(list[i64].String) -string(lower("bar")) -string(lower("foo")) -string(map(array, "bar")) +string(list[i]) string(map(array, #)) string(map(array, 0.5)) -string(map(array, 1)) -string(map(array, array)) +string(map(array, add)) string(map(array, div)) -string(map(array, greet)) string(map(array, i)) string(map(array, i32)) -string(map(array, ok)) string(map(array, true)) string(map(list, "bar")) string(map(list, "foo")) string(map(list, #)) string(map(list, 0.5)) string(map(list, 1)) -string(map(list, add)) -string(map(list, f32)) -string(map(list, f64)) -string(map(list, false)) -string(map(list, greet)) +string(map(list, array)) +string(map(list, half)) +string(map(list, i32)) string(map(list, i64)) -string(map(list, list)) string(max(0.5)) +string(max(0.5, f32)) string(max(1)) -string(max(1, 0.5)) -string(max(1, f32)) string(max(f32)) string(max(f64)) string(max(i)) -string(max(i32)) -string(max(i32, 1, i64)) string(max(i64)) +string(mean(array)) string(min(0.5)) -string(min(0.5, f64, f32)) -string(min(1)) string(min(f32)) -string(min(f64)) string(min(i)) string(min(i32)) -string(min(i32, i64)) string(min(i64)) -string(nil != "foo") -string(nil != 0.5) -string(nil != 1) -string(nil != array) +string(nil != "bar") string(nil != div) -string(nil != f64) string(nil != false) string(nil != greet) +string(nil != half) string(nil != i) -string(nil != i64) -string(nil != nil) -string(nil != score) -string(nil == "foo") +string(nil != ok) +string(nil == "bar") +string(nil == 0.5) string(nil == 1) -string(nil == add) -string(nil == f32) -string(nil == f64) -string(nil == false) +string(nil == div) +string(nil == foo) string(nil == list) +string(nil == nil) string(nil == ok) -string(nil == true) -string(nil in array) +string(nil == score) string(nil in list) -string(nil) > string(1) -string(nil) >= string(greet) -string(nil) in foo +string(nil not in list) +string(nil) <= list[i].Bar string(none(array, ok)) -string(none(list, true)) +string(none(list, false)) +string(none(list, ok)) +string(not !false) +string(not (i64 == 0.5)) string(not false) string(not ok) string(not true) -string(ok && false) -string(ok && ok) -string(ok == nil) -string(ok == true) -string(ok ? 0.5 : "foo") +string(ok != nil) +string(ok != true) +string(ok ? 0.5 : nil) string(ok ? 0.5 : true) -string(ok ? true : i32) +string(ok ? 1 : array) +string(ok ? 1 : f32) +string(ok ? array : add) +string(ok ? div : array) +string(ok ? half : score) +string(ok ? i : 1) +string(ok ? nil : half) +string(ok ? nil : list) string(ok or false) -string(ok or ok) -string(ok || ok) +string(ok || false) string(ok) -string(one(array, false)) -string(one(array, ok)) string(one(array, true)) string(one(list, true)) +string(reduce(array, #)) +string(reduce(array, 0.5)) +string(reduce(array, 1)) +string(reduce(array, f64)) +string(reduce(array, greet)) +string(reduce(array, half)) +string(reduce(array, i64)) +string(reduce(array, list)) +string(reduce(array, score)) +string(reduce(list, "bar")) +string(reduce(list, #)) +string(reduce(list, 1)) +string(reduce(list, add)) +string(reduce(list, div)) +string(reduce(list, foo)) +string(reduce(list, i)) +string(reduce(list, i64)) +string(reduce(list, list)) +string(round(0.5)) +string(round(1)) +string(round(ceil(i32))) +string(round(f64)) +string(round(i64)) +string(score != div) +string(score != greet) +string(score != half) string(score != nil) -string(score == div) +string(score == greet) string(score == nil) +string(score(1 % 1)) string(score(1)) string(score(i)) -string(score(score(i))) string(score) -string(score) < string(ok) -string(score) not in foo string(sort(array)) +string(sortBy(array, "foo")) string(string("bar")) string(string("foo")) string(string(0.5)) string(string(1)) -string(string(add)) string(string(array)) string(string(div)) +string(string(f32)) string(string(f64)) string(string(false)) -string(string(foo)) string(string(greet)) string(string(half)) string(string(i)) -string(string(i32)) string(string(i64)) -string(string(list)) string(string(nil)) string(string(ok)) string(string(score)) -string(string(true)) +string(sum(array)) +string(toBase64("foo")) string(toJSON("bar")) -string(toJSON("foo")) string(toJSON(0.5)) string(toJSON(1)) string(toJSON(array)) string(toJSON(f32)) string(toJSON(f64)) string(toJSON(false)) -string(toJSON(foo)) string(toJSON(i)) +string(toJSON(i32)) string(toJSON(i64)) string(toJSON(list)) string(toJSON(nil)) string(toJSON(ok)) string(toJSON(true)) -string(trim("foo")) -string(trim(toJSON(0.5))) -string(trimPrefix("bar")) +string(trim("bar")) +string(trim(type(nil))) string(trimPrefix("foo")) -string(trimPrefix(type(f32))) -string(trimSuffix("bar")) -string(true != true) +string(trimSuffix("foo")) +string(true != false) +string(true && ok) string(true == nil) -string(true == ok) -string(true ? 1 : true) -string(true ? array : f32) -string(true ? div : i64) -string(true ? i32 : "foo") -string(true ? i32 : greet) -string(true ? score : 0.5) -string(true ? true : i32) +string(true ? 0.5 : true) +string(true ? f64 : score) +string(true ? false : nil) +string(true ? greet : i) +string(true ? list : ok) string(true and false) -string(true or true) -string(true || false) -string(true) endsWith string(i64) -string(true) not in foo +string(true or false) +string(true or ok) +string(true || true) +string(type("bar")) string(type("foo")) +string(type(-i64)) string(type(0.5)) -string(type(1 < f64)) string(type(1)) -string(type(add)) string(type(array)) -string(type(div)) string(type(f32)) string(type(f64)) -string(type(false)) string(type(foo)) +string(type(greet)) string(type(half)) string(type(i)) string(type(i32)) @@ -13434,116 +17281,136 @@ string(type(i64)) string(type(list)) string(type(nil)) string(type(ok)) -string(type(score(1))) string(type(score)) -string(type(true)) -string(type(type(false))) -string(upper("bar")) string(upper("foo")) -string({"bar": 0.5}) -string({"bar": i32, "foo": i64}) -string({"foo": f64}) -string({"foo": true}) +string({"bar": "foo", "foo": half}) +string({"bar": f32, "foo": i32}) +string({"bar": f32}) +string({"bar": true}) +string({"foo": add}) +string({"foo": array, "foo": list}) +sum(1 .. 1) +sum(1 .. i) +sum(1 .. i32) +sum(1 .. i64) +sum([0.5]) +sum([f32]) +sum(array) +sum(array) != f32 +sum(array) != half +sum(array) != ok +sum(array) % i +sum(array) % i64 +sum(array) - f32 +sum(array) / -f64 +sum(array) < i +sum(array) == div +sum(array) == i64 - i +sum(array) ^ f64 +sum(array) not in array +sum(array) not in list +sum(filter(array, ok)) +sum(groupBy(array, i32).String) +sum(groupBy(list, #)?.greet) +sum(i32 .. 1) +sum(i64 .. i32) +sum(i64 .. i64) +sum(list[i:1]) +sum(map(array, #)) +sum(map(array, f32)) +sum(map(list, 0.5)) +sum(map(list, f32)) +sum(map(list, i32)) +sum(ok ? array : i64) +sum(reduce(array, array)) +sum(reduce(list, array)) +sum(sort(array)) +sum(true ? array : i32) +take(array, i) +take(array, i32) +take(array, i64) +take(list, i) +take(list, i32) +take(list, i64) +take(map(array, #), i) +toBase64("bar" + "bar") +toBase64("bar" + "foo") +toBase64("bar") startsWith type(score) +toBase64("foo" + "bar") toBase64(foo.Bar) toBase64(foo.String()) toBase64(foo?.Bar) toBase64(foo?.String()) toBase64(greet("bar")) toBase64(greet("foo")) -toBase64(greet(string(array))) toBase64(lower("bar")) toBase64(lower("foo")) -toBase64(lower(type(i32))) -toBase64(ok ? "foo" : 1) -toBase64(ok ? "foo" : foo) -toBase64(string("bar")) +toBase64(ok ? "bar" : f64) +toBase64(reduce(list, "bar")) toBase64(string("foo")) toBase64(string(0.5)) toBase64(string(1)) +toBase64(string(add)) toBase64(string(array)) -toBase64(string(f32 <= i32)) toBase64(string(f32)) toBase64(string(f64)) -toBase64(string(false)) toBase64(string(foo)) toBase64(string(greet)) toBase64(string(half)) toBase64(string(i)) -toBase64(string(i32)) -toBase64(string(i64)) toBase64(string(list)) -toBase64(string(nil)) toBase64(string(ok)) -toBase64(string(score)) -toBase64(string(true)) toBase64(toBase64("bar")) -toBase64(toBase64("foo")) toBase64(toJSON("bar")) -toBase64(toJSON("foo")) toBase64(toJSON(0.5)) toBase64(toJSON(1)) -toBase64(toJSON(array)) toBase64(toJSON(f32)) toBase64(toJSON(f64)) -toBase64(toJSON(false)) toBase64(toJSON(foo)) -toBase64(toJSON(i)) -toBase64(toJSON(i32)) toBase64(toJSON(i64)) toBase64(toJSON(list)) toBase64(toJSON(nil)) toBase64(toJSON(ok)) toBase64(toJSON(true)) toBase64(trim("bar")) -toBase64(trim("foo")) toBase64(trimPrefix("foo")) -toBase64(trimSuffix("bar")) toBase64(trimSuffix("foo")) -toBase64(true ? "bar" : ok) -toBase64(type("bar")) -toBase64(type("foo")) toBase64(type(0.5)) toBase64(type(1)) toBase64(type(add)) -toBase64(type(array)) toBase64(type(div)) toBase64(type(f32)) toBase64(type(f64)) toBase64(type(false)) toBase64(type(foo)) -toBase64(type(get(array, i))) toBase64(type(greet)) +toBase64(type(half)) toBase64(type(i)) toBase64(type(i32)) toBase64(type(i64)) toBase64(type(list)) -toBase64(type(ok)) -toBase64(type(true)) -toBase64(upper("bar")) +toBase64(type(nil)) +toBase64(type(score)) toBase64(upper("foo")) -toBase64(upper(foo.Bar)) toJSON(!false) toJSON(!ok) toJSON(!true) -toJSON("bar" != "foo") -toJSON("bar" + "bar") -toJSON("bar" + "foo") -toJSON("bar" <= "foo") -toJSON("bar" >= "foo") -toJSON("bar" contains "bar") -toJSON("bar" matches "bar") +toJSON("bar" < "foo") +toJSON("bar" >= "bar") +toJSON("bar" endsWith "bar") +toJSON("bar" matches "foo") +toJSON("bar" not in foo) toJSON("bar" not matches "bar") -toJSON("bar" not matches "foo") +toJSON("bar" not startsWith "foo") +toJSON("bar" startsWith "bar") +toJSON("bar") not in foo toJSON("foo" != "bar") -toJSON("foo" + "bar") -toJSON("foo" <= "bar") -toJSON("foo" == nil) -toJSON("foo" contains "bar") -toJSON("foo" matches "foo") -toJSON("foo" not in foo) -toJSON("foo" not matches "bar") -toJSON("foo") > foo?.Bar -toJSON("foo") not in foo +toJSON("foo" != "foo") +toJSON("foo" < "foo") +toJSON("foo" == "bar") +toJSON("foo" > "foo") +toJSON("foo" >= "foo") +toJSON("foo" startsWith "bar") toJSON(-0.5) toJSON(-1) toJSON(-f32) @@ -13551,133 +17418,104 @@ toJSON(-f64) toJSON(-i) toJSON(-i32) toJSON(-i64) -toJSON(0.5 != 0.5) toJSON(0.5 != 1) -toJSON(0.5 != f32) toJSON(0.5 != f64) -toJSON(0.5 != i) -toJSON(0.5 != i32) -toJSON(0.5 * 0.5) +toJSON(0.5 != nil) toJSON(0.5 * i) toJSON(0.5 * i32) +toJSON(0.5 * i64) +toJSON(0.5 ** 0.5) +toJSON(0.5 ** 1) +toJSON(0.5 ** f32) toJSON(0.5 ** f64) toJSON(0.5 ** i) -toJSON(0.5 ** i64) +toJSON(0.5 ** i32) toJSON(0.5 + 0.5) +toJSON(0.5 + 1) toJSON(0.5 + f32) toJSON(0.5 - 0.5) toJSON(0.5 - 1) toJSON(0.5 - f32) toJSON(0.5 - f64) -toJSON(0.5 / 0.5) +toJSON(0.5 - i) +toJSON(0.5 - i32) toJSON(0.5 / 1) toJSON(0.5 / f32) toJSON(0.5 / f64) -toJSON(0.5 / i) toJSON(0.5 / i32) -toJSON(0.5 / i64) -toJSON(0.5 < 0.5) toJSON(0.5 < 1) toJSON(0.5 < f32) +toJSON(0.5 < f64) toJSON(0.5 < i) +toJSON(0.5 <= 0.5) toJSON(0.5 <= 1) toJSON(0.5 <= f32) -toJSON(0.5 <= f64) -toJSON(0.5 <= i) +toJSON(0.5 <= i64) toJSON(0.5 == 0.5) -toJSON(0.5 == 1) -toJSON(0.5 == f32) +toJSON(0.5 == f64) toJSON(0.5 == i) +toJSON(0.5 == i32) toJSON(0.5 == i64) -toJSON(0.5 > 1) -toJSON(0.5 > f32) -toJSON(0.5 > f64) -toJSON(0.5 > i32) toJSON(0.5 >= 0.5) toJSON(0.5 >= 1) toJSON(0.5 >= f32) -toJSON(0.5 >= f64) -toJSON(0.5 >= i) -toJSON(0.5 >= i32) -toJSON(0.5 >= i64) -toJSON(0.5 ^ 0.5) -toJSON(0.5 ^ 1) toJSON(0.5 ^ f32) -toJSON(0.5 ^ f64) -toJSON(0.5 ^ i) toJSON(0.5 ^ i32) toJSON(0.5 ^ i64) -toJSON(0.5) contains "bar" ? "bar" : array +toJSON(0.5) not in foo toJSON(1 != 0.5) toJSON(1 != f32) toJSON(1 != nil) toJSON(1 % 1) +toJSON(1 % i) toJSON(1 % i32) -toJSON(1 * 0.5) -toJSON(1 * f32) toJSON(1 * f64) toJSON(1 * i32) toJSON(1 * i64) toJSON(1 ** 0.5) toJSON(1 ** 1) -toJSON(1 ** f32) -toJSON(1 ** f64) -toJSON(1 ** i >= f64) toJSON(1 ** i32) toJSON(1 + 0.5) -toJSON(1 + f32) +toJSON(1 + 1) toJSON(1 + f64) -toJSON(1 + i64) -toJSON(1 - 0.5) -toJSON(1 - 1) -toJSON(1 - f32) -toJSON(1 - f64) +toJSON(1 + i) +toJSON(1 + i32) +toJSON(1 - i) toJSON(1 - i32) -toJSON(1 .. 1) -toJSON(1 .. i) +toJSON(1 .. i32) toJSON(1 .. i64) -toJSON(1 / 0.5) toJSON(1 / 1) -toJSON(1 / f32) -toJSON(1 / i32) +toJSON(1 / f64) +toJSON(1 / i64) toJSON(1 < 0.5) toJSON(1 < 1) -toJSON(1 < f32) toJSON(1 < f64) toJSON(1 < i) toJSON(1 <= 0.5) -toJSON(1 <= 1) -toJSON(1 <= i) -toJSON(1 <= i32) -toJSON(1 <= i64) +toJSON(1 <= f32) +toJSON(1 <= f64) toJSON(1 == 0.5) -toJSON(1 == f32) +toJSON(1 == 1) +toJSON(1 == f64) toJSON(1 == i) toJSON(1 == i32) -toJSON(1 == i64) toJSON(1 == nil) -toJSON(1 > 0.5) -toJSON(1 > f64) +toJSON(1 > f32) toJSON(1 > i) -toJSON(1 > i32) -toJSON(1 > i64) -toJSON(1 >= 0.5) toJSON(1 >= 1) toJSON(1 >= f32) toJSON(1 >= i32) -toJSON(1 ^ 0.5) toJSON(1 ^ 1) toJSON(1 ^ f32) -toJSON(1 ^ f64) toJSON(1 ^ i32) toJSON(1 ^ i64) -toJSON(1 in array) -toJSON(1) == nil == true -toJSON(1) in foo -toJSON(1) not in foo -toJSON(1) startsWith foo.String() -toJSON([1]) -toJSON([i64]) +toJSON(1) > reduce(list, "bar") +toJSON(1) not contains string(true) +toJSON([f64]) +toJSON([false]) +toJSON([foo]) +toJSON([nil]) +toJSON([true]) toJSON(abs(0.5)) toJSON(abs(1)) toJSON(abs(f32)) @@ -13685,143 +17523,96 @@ toJSON(abs(f64)) toJSON(abs(i)) toJSON(abs(i32)) toJSON(abs(i64)) -toJSON(add != nil) -toJSON(add != score) -toJSON(add == div) -toJSON(add == half) -toJSON(add == nil) +toJSON(add != greet) +toJSON(add != half) +toJSON(add == add) toJSON(add == score) -toJSON(all(list, false)) -toJSON(all(list, ok)) -toJSON(all(list, true)) toJSON(any(array, false)) -toJSON(any(array, true)) -toJSON(array != array) -toJSON(array != nil) +toJSON(array == array) +toJSON(array == list) +toJSON(array == nil) toJSON(array) -toJSON(array) != toJSON(ok) -toJSON(array) > "bar" != false -toJSON(array) endsWith greet("foo") -toJSON(array) endsWith string(i32) -toJSON(array) in foo -toJSON(array) not startsWith greet("foo") -toJSON(array[1:1]) -toJSON(array[i32]) +toJSON(array[1:i64]) +toJSON(array[1]) toJSON(array[i]) -toJSON(count(array, false)) +toJSON(bitnot(1)) +toJSON(bitnot(i)) +toJSON(bitnot(i32)) +toJSON(bitnot(i64)) +toJSON(bitshl(i, i32)) +toJSON(ceil(1)) +toJSON(ceil(f64)) +toJSON(ceil(i)) +toJSON(ceil(i32)) +toJSON(ceil(i64)) toJSON(count(array, ok)) toJSON(div != div) -toJSON(div != greet) toJSON(div != score) toJSON(div == div) -toJSON(div == half) -toJSON(div == nil) -toJSON(div == score) -toJSON(f32 != 1) -toJSON(f32 * 0.5) -toJSON(f32 * 1) +toJSON(f32 != 0.5) +toJSON(f32 != 1 || ok) +toJSON(f32 != f32) +toJSON(f32 != i32) toJSON(f32 * f32) -toJSON(f32 * f64) -toJSON(f32 * i32) -toJSON(f32 ** f32) +toJSON(f32 ** 0.5) +toJSON(f32 ** 1) +toJSON(f32 ** f64) toJSON(f32 ** i32) -toJSON(f32 ** i64) -toJSON(f32 + 1) -toJSON(f32 + i) -toJSON(f32 + i32) +toJSON(f32 + 0.5) +toJSON(f32 + f32) +toJSON(f32 - 0.5) +toJSON(f32 - f32) toJSON(f32 - f64) -toJSON(f32 - i32) -toJSON(f32 / 0.5) -toJSON(f32 / 1) +toJSON(f32 - i64) toJSON(f32 < 0.5) -toJSON(f32 < f32) -toJSON(f32 < f64) -toJSON(f32 <= f32) -toJSON(f32 == 1) +toJSON(f32 < i) +toJSON(f32 < i64) +toJSON(f32 <= 0.5) +toJSON(f32 <= 1) +toJSON(f32 <= i64) toJSON(f32 == f64) toJSON(f32 == i) toJSON(f32 == nil) -toJSON(f32 > 0.5) -toJSON(f32 > f64) toJSON(f32 > i) -toJSON(f32 >= 1) -toJSON(f32 >= f32) -toJSON(f32 ^ 0.5) -toJSON(f32 ^ 1) -toJSON(f32 ^ f64) -toJSON(f32 ^ i) +toJSON(f32 > i32) +toJSON(f32 >= 0.5) toJSON(f32 ^ i64) toJSON(f32) -toJSON(f64 != 1) +toJSON(f32) in foo +toJSON(f64 != 0.5) toJSON(f64 != f32) -toJSON(f64 != f64) toJSON(f64 != i) -toJSON(f64 != i32 / i32) toJSON(f64 != i32) toJSON(f64 != nil) -toJSON(f64 * 0.5) +toJSON(f64 * 1) toJSON(f64 * f64) -toJSON(f64 * i) toJSON(f64 * i64) toJSON(f64 ** 0.5) toJSON(f64 ** f32) -toJSON(f64 ** i) -toJSON(f64 ** i64) -toJSON(f64 + 1) +toJSON(f64 + 0.5) toJSON(f64 + f32) -toJSON(f64 + i) toJSON(f64 + i32) -toJSON(f64 - 1) toJSON(f64 - f64) toJSON(f64 - i) -toJSON(f64 - i32) -toJSON(f64 / 0.5) -toJSON(f64 / f32) -toJSON(f64 / i32) -toJSON(f64 < 1) -toJSON(f64 < f32) -toJSON(f64 < i32) -toJSON(f64 < i64) +toJSON(f64 - i64) +toJSON(f64 / 1) +toJSON(f64 < f64) toJSON(f64 <= 0.5) -toJSON(f64 <= 1) -toJSON(f64 <= i32) -toJSON(f64 == 1) -toJSON(f64 == i64) -toJSON(f64 == nil) -toJSON(f64 > 1) -toJSON(f64 > f64) -toJSON(f64 >= 0.5) -toJSON(f64 >= i64) -toJSON(f64 ^ 1) -toJSON(f64 ^ f64) -toJSON(f64 ^ i) +toJSON(f64 == f64) +toJSON(f64 >= 1) +toJSON(f64 >= f64) +toJSON(f64 ^ f32) toJSON(f64) -toJSON(false != nil) -toJSON(false && false) -toJSON(false == false) -toJSON(false ? 0.5 : nil) -toJSON(false ? 1 : f32) -toJSON(false ? f32 : list) -toJSON(false ? false : i32) -toJSON(false ? greet : 1) -toJSON(false ? greet : i32) -toJSON(false ? nil : f64) -toJSON(false and ok) -toJSON(false and true) -toJSON(filter(array, ok)) -toJSON(filter(list, false)) +toJSON(false != ok) +toJSON(false ? 0.5 : "foo") +toJSON(false ? add : f64) +toJSON(false ? array : 1) +toJSON(false ? false : foo) +toJSON(false ? nil : ok) +toJSON(false ? ok : i32) toJSON(filter(list, true)) -toJSON(find(array, false)) -toJSON(find(array, ok)) -toJSON(findIndex(array, ok)) -toJSON(findIndex(array, true)) -toJSON(findIndex(list, ok)) -toJSON(findIndex(list, true)) -toJSON(findLast(array, false)) -toJSON(findLast(list, true)) -toJSON(findLastIndex(array, true)) -toJSON(findLastIndex(list, false)) -toJSON(findLastIndex(list, ok)) +toJSON(find(list, ok)) +toJSON(findIndex(map(array, list), ok)) toJSON(first(array)) toJSON(first(list)) toJSON(float(0.5)) @@ -13829,297 +17620,279 @@ toJSON(float(1)) toJSON(float(f32)) toJSON(float(f64)) toJSON(float(i)) -toJSON(float(i32)) toJSON(float(i64)) -toJSON(foo != foo) +toJSON(floor(0.5)) +toJSON(floor(f64)) +toJSON(floor(i)) +toJSON(floor(i32)) toJSON(foo != nil) -toJSON(foo == foo) -toJSON(foo == nil) toJSON(foo in list) toJSON(foo) toJSON(foo.Bar) toJSON(foo.String()) toJSON(foo?.Bar) toJSON(foo?.String()) -toJSON(get(array, 1)) +toJSON(get(array, i32)) toJSON(get(array, i64)) toJSON(get(list, 1)) toJSON(get(list, i)) +toJSON(get(list, i32)) toJSON(get(list, i64)) -toJSON(greet != div) -toJSON(greet != greet) -toJSON(greet != half) -toJSON(greet == add) +toJSON(greet != nil) +toJSON(greet != score) toJSON(greet == div) toJSON(greet == greet) toJSON(greet == half) +toJSON(greet == nil) +toJSON(greet == score) toJSON(greet("bar")) toJSON(greet("foo")) -toJSON(half != greet) -toJSON(half != nil) -toJSON(half != score) -toJSON(half == add) -toJSON(half == div) -toJSON(half == greet) -toJSON(half == nil) -toJSON(half == score) +toJSON(groupBy(array, #)?.div) +toJSON(groupBy(array, ok)?.foo) +toJSON(groupBy(list, #)?.foo) toJSON(half(0.5)) +toJSON(half(1)) toJSON(half(f64)) +toJSON(i != 0.5) toJSON(i != 1) -toJSON(i != f32) -toJSON(i != i) -toJSON(i != i32) -toJSON(i % 1) -toJSON(i % i64) +toJSON(i % i) +toJSON(i % i32) toJSON(i * 0.5) toJSON(i * 1) toJSON(i * f32) +toJSON(i * i) toJSON(i * i32) -toJSON(i ** 0.5) toJSON(i ** f32) -toJSON(i ** i32) +toJSON(i ** i) toJSON(i + 0.5) toJSON(i + 1) -toJSON(i + f32) -toJSON(i + f64) toJSON(i + i) toJSON(i - 1) -toJSON(i .. 1) +toJSON(i - f32) toJSON(i .. i) -toJSON(i / f32) +toJSON(i .. i32) +toJSON(i / i64) +toJSON(i < f32) +toJSON(i < f64) +toJSON(i < i) toJSON(i < i32) -toJSON(i < i64) toJSON(i <= 1) toJSON(i <= f32) toJSON(i <= f64) toJSON(i <= i) toJSON(i <= i32) +toJSON(i <= i64) +toJSON(i == 0.5) +toJSON(i == 1) toJSON(i == i32) -toJSON(i == i64) toJSON(i == nil) toJSON(i > 0.5) -toJSON(i > 1) -toJSON(i > f32) -toJSON(i >= 0.5) -toJSON(i >= 1) -toJSON(i >= f32) -toJSON(i >= i) -toJSON(i ^ 1) -toJSON(i ^ f64) +toJSON(i > i) +toJSON(i > i32) +toJSON(i > i64) +toJSON(i >= f64) +toJSON(i >= i32) +toJSON(i ^ i64) +toJSON(i not in array) toJSON(i) -toJSON(i) != string(1) -toJSON(i32 != f32) +toJSON(i) matches string("bar") toJSON(i32 != i) +toJSON(i32 != i64) toJSON(i32 % 1) -toJSON(i32 % i64) +toJSON(i32 * 0.5) toJSON(i32 * i) +toJSON(i32 * i32) toJSON(i32 * i64) +toJSON(i32 ** f64) toJSON(i32 ** i64) +toJSON(i32 + 0.5) +toJSON(i32 + 1) toJSON(i32 + f64) -toJSON(i32 + i) -toJSON(i32 + i32) -toJSON(i32 + i64) -toJSON(i32 - 0.5) -toJSON(i32 - 1) -toJSON(i32 - f32) -toJSON(i32 - f64) -toJSON(i32 - i) toJSON(i32 .. i) toJSON(i32 .. i64) toJSON(i32 / 0.5) toJSON(i32 / f32) -toJSON(i32 / i) +toJSON(i32 / f64) toJSON(i32 / i64) toJSON(i32 < 0.5) -toJSON(i32 < f32) +toJSON(i32 < 1) +toJSON(i32 < i) +toJSON(i32 < i32) toJSON(i32 <= 0.5) -toJSON(i32 <= i32) -toJSON(i32 == 1) -toJSON(i32 == f32) -toJSON(i32 == i) -toJSON(i32 == nil ? i32 : i32) -toJSON(i32 == nil) -toJSON(i32 > 0.5) toJSON(i32 > f64) toJSON(i32 > i) -toJSON(i32 >= 0.5) -toJSON(i32 >= 1) -toJSON(i32 >= f32) +toJSON(i32 > i32) toJSON(i32 >= f64) -toJSON(i32 >= i) -toJSON(i32 ^ 1) +toJSON(i32 ^ 0.5) +toJSON(i32 ^ f32) toJSON(i32 ^ f64) -toJSON(i32 ^ i) +toJSON(i32 ^ i32) toJSON(i32 in array) toJSON(i32 not in array) toJSON(i32) -toJSON(i32) < string(i64) -toJSON(i64 != 0.5) +toJSON(i32) contains foo.Bar toJSON(i64 != 1) -toJSON(i64 != f32) toJSON(i64 != i) toJSON(i64 != i32) -toJSON(i64 != nil) -toJSON(i64 % 1) -toJSON(i64 % i) toJSON(i64 % i32) -toJSON(i64 % i64) -toJSON(i64 * i) -toJSON(i64 + 0.5) -toJSON(i64 + i) -toJSON(i64 + i64) -toJSON(i64 - 0.5) -toJSON(i64 - 1) -toJSON(i64 - i64) +toJSON(i64 * 0.5) +toJSON(i64 * f64) +toJSON(i64 ** f64) +toJSON(i64 ** i) +toJSON(i64 ** i32) +toJSON(i64 + 1) +toJSON(i64 - i32) toJSON(i64 .. 1) -toJSON(i64 / 1) -toJSON(i64 / f32) +toJSON(i64 .. i32) +toJSON(i64 / f64) toJSON(i64 / i) toJSON(i64 / i64) -toJSON(i64 < 0.5) +toJSON(i64 < 1) +toJSON(i64 < f64) toJSON(i64 < i32) -toJSON(i64 <= 0.5) toJSON(i64 <= 1) -toJSON(i64 <= f32) toJSON(i64 <= i64) toJSON(i64 == 0.5) -toJSON(i64 == 1) -toJSON(i64 == i32) -toJSON(i64 == nil) -toJSON(i64 > f32) +toJSON(i64 > 0.5) +toJSON(i64 > 1) toJSON(i64 > i) -toJSON(i64 >= 0.5) +toJSON(i64 > i32) +toJSON(i64 > i64) toJSON(i64 >= 1) +toJSON(i64 >= i) toJSON(i64 >= i64) -toJSON(i64 ^ i) +toJSON(i64 ^ 0.5) +toJSON(i64 ^ f32) +toJSON(i64 ^ i32) +toJSON(i64 in array) toJSON(i64) toJSON(int(0.5)) toJSON(int(1)) -toJSON(int(f32)) -toJSON(int(f64)) toJSON(int(i)) toJSON(int(i32)) -toJSON(last(list)) +toJSON(int(i64)) toJSON(len("bar")) -toJSON(len("foo")) toJSON(len(array)) +toJSON(len(greet("foo"))) toJSON(len(list)) -toJSON(list != list) -toJSON(list == nil) +toJSON(list != array) +toJSON(list != nil) +toJSON(list == array) +toJSON(list == list) toJSON(list) -toJSON(list) <= foo?.Bar toJSON(list[1]) -toJSON(list[i32]) -toJSON(list[i64:1]) -toJSON(list[i64]) -toJSON(list[i]) toJSON(lower("bar")) -toJSON(lower("foo")) toJSON(map(array, #)) -toJSON(map(array, 0.5)) -toJSON(map(array, 1)) +toJSON(map(array, -#)) +toJSON(map(array, array)) toJSON(map(array, false)) toJSON(map(array, i)) -toJSON(map(array, i32)) +toJSON(map(array, i64)) toJSON(map(array, list)) -toJSON(map(array, true)) -toJSON(map(list, "foo")) toJSON(map(list, #)) +toJSON(map(list, 0.5)) toJSON(map(list, 1)) -toJSON(map(list, f32)) -toJSON(map(list, f64)) +toJSON(map(list, foo)) +toJSON(map(list, i32)) +toJSON(map(list, i64)) toJSON(map(list, list)) -toJSON(max(0.5)) +toJSON(map(list, ok)) toJSON(max(1)) toJSON(max(f32)) toJSON(max(f64)) -toJSON(max(i)) toJSON(max(i32)) -toJSON(max(i64)) +toJSON(mean(array)) +toJSON(median(array)) toJSON(min(0.5)) -toJSON(min(0.5, f32)) toJSON(min(1)) -toJSON(min(1, 1)) toJSON(min(f32)) toJSON(min(f64)) +toJSON(min(f64, f64)) toJSON(min(i)) -toJSON(min(i32) / f32) toJSON(min(i32)) toJSON(min(i64)) -toJSON(nil != "bar") -toJSON(nil != "foo") toJSON(nil != 0.5) +toJSON(nil != 1) toJSON(nil != add) +toJSON(nil != array) toJSON(nil != f32) -toJSON(nil != f64) +toJSON(nil != false) toJSON(nil != foo) -toJSON(nil != i32) -toJSON(nil != list) -toJSON(nil != nil) -toJSON(nil != score) -toJSON(nil != true) +toJSON(nil != greet) +toJSON(nil != half) toJSON(nil == 0.5) toJSON(nil == 1) -toJSON(nil == add) toJSON(nil == div) -toJSON(nil == f32) toJSON(nil == f64) -toJSON(nil == false) -toJSON(nil == foo) +toJSON(nil == half) toJSON(nil == i) toJSON(nil == i64) toJSON(nil == list) +toJSON(nil == nil) toJSON(nil == ok) -toJSON(nil == score) -toJSON(nil == true) toJSON(nil in array) -toJSON(nil not in array) -toJSON(nil not in list) -toJSON(nil) + string("bar") -toJSON(nil) == toJSON(1) -toJSON(nil) == type(nil) -toJSON(nil) in foo +toJSON(nil) + foo.Bar +toJSON(none(array, ok)) toJSON(none(array, true)) -toJSON(none(list, true)) +toJSON(none(list, false)) +toJSON(none(list, ok)) toJSON(not ("foo" not in foo)) +toJSON(not (f32 != 1)) toJSON(not false) toJSON(not ok) toJSON(not true) toJSON(ok != false) -toJSON(ok != nil) -toJSON(ok != ok) -toJSON(ok && true) +toJSON(ok && false) +toJSON(ok && ok) toJSON(ok == nil) toJSON(ok == ok) -toJSON(ok ? 1 : half) -toJSON(ok ? f32 : div) -toJSON(ok ? false : i32) -toJSON(ok ? nil : f32) +toJSON(ok ? "foo" : f32) +toJSON(ok ? 0.5 : f32) +toJSON(ok ? f64 : 0.5) +toJSON(ok ? i : false) +toJSON(ok ? nil : i) +toJSON(ok ? nil : true) +toJSON(ok ? true : greet) +toJSON(ok and ok) toJSON(ok or true) -toJSON(ok || ok) toJSON(ok) -toJSON(one(array, i32 < #)) +toJSON(one(array, false)) +toJSON(one(array, true)) +toJSON(reduce(array, #)) +toJSON(reduce(array, 0.5)) +toJSON(reduce(array, array)) +toJSON(reduce(array, foo)) +toJSON(reduce(array, i64)) +toJSON(reduce(array, list)) +toJSON(reduce(array, score(i32 * i64))) +toJSON(reduce(list, #)) +toJSON(reduce(list, 1)) +toJSON(reduce(list, f32)) +toJSON(reduce(list, false)) +toJSON(reduce(list, i)) +toJSON(reduce(list, i32)) +toJSON(reduce(list, list)) +toJSON(reduce(list, ok)) +toJSON(reduce(list, true)) +toJSON(round(1)) +toJSON(round(f64)) +toJSON(round(i32)) +toJSON(score != add) toJSON(score != div) -toJSON(score != greet) -toJSON(score != nil) toJSON(score != score) -toJSON(score == add) -toJSON(score == div) -toJSON(score == nil) +toJSON(score == half) toJSON(score(1)) +toJSON(score(1, 1)) toJSON(score(i)) -toJSON(score(i, i)) +toJSON(sort(array)) toJSON(string("bar")) -toJSON(string("foo")) toJSON(string(0.5)) toJSON(string(1)) toJSON(string(array)) -toJSON(string(div)) toJSON(string(f32)) toJSON(string(f64)) toJSON(string(false)) toJSON(string(foo)) -toJSON(string(greet)) toJSON(string(half)) toJSON(string(i)) toJSON(string(i32)) @@ -14128,11 +17901,11 @@ toJSON(string(list)) toJSON(string(nil)) toJSON(string(ok)) toJSON(string(score)) +toJSON(string(true)) +toJSON(sum(array)) +toJSON(take(array, i32)) toJSON(toBase64("bar")) -toJSON(toBase64("foo")) toJSON(toJSON("bar")) -toJSON(toJSON("foo")) -toJSON(toJSON(1)) toJSON(toJSON(array)) toJSON(toJSON(f32)) toJSON(toJSON(f64)) @@ -14144,50 +17917,58 @@ toJSON(toJSON(i64)) toJSON(toJSON(list)) toJSON(toJSON(nil)) toJSON(toJSON(ok)) -toJSON(toJSON(true)) toJSON(trim("bar")) -toJSON(trim("foo")) toJSON(trimPrefix("foo")) -toJSON(trimSuffix("foo")) -toJSON(true && true) -toJSON(true ? array : nil) -toJSON(true ? i32 : div) -toJSON(true ? list : true) -toJSON(true ? nil : array) -toJSON(true ? ok : list) -toJSON(true ? true : f64) -toJSON(true and ok) +toJSON(trimSuffix("bar")) +toJSON(true != true) +toJSON(true && ok) +toJSON(true == ok) +toJSON(true ? "bar" : "bar") +toJSON(true ? nil : score) +toJSON(true and false) +toJSON(true and true) toJSON(true) in foo -toJSON(type("bar")) toJSON(type("foo")) -toJSON(type(0.5)) -toJSON(type(1)) toJSON(type(add)) toJSON(type(array)) toJSON(type(f32)) toJSON(type(f64)) toJSON(type(false)) toJSON(type(foo)) -toJSON(type(greet)) -toJSON(type(half)) toJSON(type(i)) toJSON(type(i32)) toJSON(type(i64)) toJSON(type(list)) -toJSON(type(nil)) toJSON(type(ok)) toJSON(type(score)) toJSON(type(true)) toJSON(upper("bar")) -toJSON(upper("foo")) -toJSON({"bar": 0.5, "bar": array}) -toJSON({"foo": "foo"}) -toJSON({"foo": 0.5}) +toJSON({"bar": 1, "bar": array}) +toJSON({"bar": 1}) +toJSON({"bar": f64}) +toJSON({"bar": list}) +toJSON({"foo": i}) toJSON({"foo": nil}) -toJSON({"foo": ok, "bar": 0.5}) -trim("bar") in foo -trim("foo" + "foo") -trim(false ? greet : "bar") +toPairs(groupBy(array, # / #)) +toPairs(groupBy(array, #)) +toPairs(groupBy(array, 0.5)) +toPairs(groupBy(array, 1)) +toPairs(groupBy(array, false)) +toPairs(groupBy(array, foo)) +toPairs(groupBy(array, i)) +toPairs(groupBy(array, i32)) +toPairs(groupBy(array, ok)) +toPairs(groupBy(array, true)) +toPairs(groupBy(list, #)) +toPairs(groupBy(list, 1)) +toPairs(groupBy(list, f32)) +toPairs(groupBy(list, i)) +toPairs(groupBy(list, ok)) +toPairs({"bar": f32}) +toPairs({"foo": i32, "bar": score}) +toPairs({"foo": nil}) +trim("bar") not in foo +trim(false ? "bar" : "bar") trim(foo.Bar) trim(foo.String()) trim(foo?.Bar) @@ -14195,84 +17976,58 @@ trim(foo?.String()) trim(greet("bar")) trim(greet("foo")) trim(lower("bar")) -trim(lower(toJSON(0.5))) -trim(ok ? "bar" : i32) -trim(string("foo")) +trim(lower("foo")) +trim(reduce(list, "bar")) +trim(string("bar")) +trim(string(-f64)) trim(string(0.5)) trim(string(1)) trim(string(add)) -trim(string(div)) +trim(string(array)) trim(string(f32)) -trim(string(f64)) -trim(string(false)) trim(string(foo)) -trim(string(greet)) -trim(string(half)) -trim(string(i)) -trim(string(i32)) trim(string(i64)) trim(string(list)) trim(string(nil)) -trim(string(ok)) -trim(string(score)) -trim(string(true)) -trim(toBase64("bar")) -trim(toBase64("foo")) -trim(toJSON("foo")) -trim(toJSON(0.5)) +trim(toJSON("bar")) trim(toJSON(1)) -trim(toJSON(array)) trim(toJSON(f32)) -trim(toJSON(f64)) trim(toJSON(false)) trim(toJSON(foo)) -trim(toJSON(i)) trim(toJSON(i32)) trim(toJSON(i64)) -trim(toJSON(list)) -trim(toJSON(nil)) trim(toJSON(ok)) trim(toJSON(true)) trim(trim("bar")) -trim(trimPrefix("bar")) trim(trimPrefix("foo")) -trim(trimPrefix(string(i))) trim(trimSuffix("bar")) -trim(trimSuffix("foo")) +trim(true ? "foo" : greet) +trim(type("bar")) trim(type("foo")) trim(type(0.5)) trim(type(1)) trim(type(add)) -trim(type(array)) trim(type(div)) trim(type(f32)) trim(type(f64)) -trim(type(false)) -trim(type(foo)) trim(type(greet)) -trim(type(half)) trim(type(i)) -trim(type(i32)) -trim(type(i64)) trim(type(list)) -trim(type(nil != list)) trim(type(nil)) trim(type(ok)) trim(type(score)) -trim(type(toJSON(1))) trim(type(true)) -trim(upper("bar")) -trimPrefix("foo" + "foo") +trimPrefix("bar" + "foo") +trimPrefix("foo" + "bar") +trimPrefix(false ? 1 : "bar") trimPrefix(foo.Bar) trimPrefix(foo.String()) trimPrefix(foo?.Bar) trimPrefix(foo?.String()) trimPrefix(greet("bar")) trimPrefix(greet("foo")) -trimPrefix(greet(foo.String())) +trimPrefix(greet(type(0.5))) trimPrefix(lower("bar")) -trimPrefix(lower("foo")) -trimPrefix(ok ? "bar" : i64) trimPrefix(string("foo")) trimPrefix(string(0.5)) trimPrefix(string(1)) @@ -14280,50 +18035,35 @@ trimPrefix(string(add)) trimPrefix(string(array)) trimPrefix(string(div)) trimPrefix(string(f32)) +trimPrefix(string(f64)) trimPrefix(string(foo)) trimPrefix(string(greet)) trimPrefix(string(half)) trimPrefix(string(i)) trimPrefix(string(i32)) trimPrefix(string(i64)) -trimPrefix(string(list)) trimPrefix(string(nil)) -trimPrefix(string(ok)) trimPrefix(string(score)) +trimPrefix(string(true)) +trimPrefix(string({"bar": greet})) trimPrefix(toBase64("bar")) -trimPrefix(toBase64("foo")) -trimPrefix(toJSON("bar")) trimPrefix(toJSON("foo")) -trimPrefix(toJSON(0.5)) trimPrefix(toJSON(1)) trimPrefix(toJSON(array)) trimPrefix(toJSON(f32)) -trimPrefix(toJSON(f64)) -trimPrefix(toJSON(false)) trimPrefix(toJSON(foo)) -trimPrefix(toJSON(i)) trimPrefix(toJSON(i32)) trimPrefix(toJSON(i64)) +trimPrefix(toJSON(list)) trimPrefix(toJSON(nil)) trimPrefix(toJSON(true)) -trimPrefix(trim("bar")) -trimPrefix(trim("foo")) -trimPrefix(trimPrefix("bar")) trimPrefix(trimPrefix("foo")) -trimPrefix(trimSuffix("bar")) -trimPrefix(trimSuffix("foo")) trimPrefix(type("bar")) -trimPrefix(type(0.5 == 0.5)) trimPrefix(type(0.5)) -trimPrefix(type(1 == f64)) trimPrefix(type(1)) -trimPrefix(type(add)) trimPrefix(type(array)) -trimPrefix(type(div)) trimPrefix(type(f32)) trimPrefix(type(f64)) -trimPrefix(type(false)) -trimPrefix(type(foo)) trimPrefix(type(greet)) trimPrefix(type(half)) trimPrefix(type(i)) @@ -14332,142 +18072,127 @@ trimPrefix(type(i64)) trimPrefix(type(list)) trimPrefix(type(nil)) trimPrefix(type(ok)) -trimPrefix(type(score)) +trimPrefix(type(true)) +trimPrefix(upper("bar")) trimPrefix(upper("foo")) -trimSuffix("bar" + "bar") -trimSuffix("foo") <= trimPrefix("foo") +trimSuffix("bar" + "foo") +trimSuffix("bar") not contains reduce(list, "bar") +trimSuffix("foo" + "bar") +trimSuffix(false ? i64 : "foo") trimSuffix(foo.Bar) trimSuffix(foo.String()) trimSuffix(foo?.Bar) -trimSuffix(foo?.Qux("bar")) trimSuffix(foo?.String()) trimSuffix(greet("bar")) trimSuffix(greet("foo")) -trimSuffix(greet(toJSON(i64))) trimSuffix(lower("bar")) -trimSuffix(lower("foo")) -trimSuffix(repeat("foo", i)) +trimSuffix(reduce(array, "foo")) +trimSuffix(reduce(list, #)?.Bar) trimSuffix(string("bar")) +trimSuffix(string("foo")) trimSuffix(string(0.5)) -trimSuffix(string(1)) trimSuffix(string(add)) trimSuffix(string(array)) -trimSuffix(string(f32)) +trimSuffix(string(div)) trimSuffix(string(f64)) trimSuffix(string(false)) trimSuffix(string(foo)) -trimSuffix(string(greet)) trimSuffix(string(half)) trimSuffix(string(i)) trimSuffix(string(i32)) trimSuffix(string(i64)) trimSuffix(string(list)) trimSuffix(string(nil)) -trimSuffix(string(score)) -trimSuffix(string(type("foo"))) +trimSuffix(string(ok)) +trimSuffix(string(true)) trimSuffix(toBase64("bar")) -trimSuffix(toJSON("bar")) -trimSuffix(toJSON(0.5)) +trimSuffix(toBase64("foo")) +trimSuffix(toJSON(1 > f64)) trimSuffix(toJSON(1)) -trimSuffix(toJSON(array)) +trimSuffix(toJSON(f32)) trimSuffix(toJSON(f64)) trimSuffix(toJSON(false)) -trimSuffix(toJSON(first(array))) trimSuffix(toJSON(foo)) trimSuffix(toJSON(i)) trimSuffix(toJSON(i32)) trimSuffix(toJSON(i64)) trimSuffix(toJSON(list)) trimSuffix(toJSON(nil)) -trimSuffix(toJSON(ok)) +trimSuffix(toJSON(true)) trimSuffix(trim("bar")) trimSuffix(trim("foo")) trimSuffix(trimPrefix("bar")) trimSuffix(trimPrefix("foo")) -trimSuffix(trimSuffix("foo")) -trimSuffix(type("bar")) -trimSuffix(type("foo")) -trimSuffix(type(0.5)) +trimSuffix(trimSuffix("bar")) trimSuffix(type(1)) trimSuffix(type(add)) trimSuffix(type(array)) trimSuffix(type(div)) trimSuffix(type(f32)) -trimSuffix(type(f64)) -trimSuffix(type(false)) trimSuffix(type(foo)) +trimSuffix(type(greet)) trimSuffix(type(half)) -trimSuffix(type(i)) trimSuffix(type(i32)) -trimSuffix(type(i64)) trimSuffix(type(list)) trimSuffix(type(nil)) trimSuffix(type(ok)) -trimSuffix(type(true)) -trimSuffix(upper("bar")) trimSuffix(upper("foo")) -true != nil || true != nil -true == nil && ok -true ? "bar" : 0.5 ^ i -true ? "bar" : 1 <= 1 / 1 -true ? "bar" : i != i32 -true ? "foo" : foo?.Bar -true ? 0.5 : foo.Qux -true ? 1 : f64 + f32 -true ? 1 : nil == array -true ? array : foo.Qux +true != nil || true == true +true != ok != ok +true == ok == ok +true ? 0.5 : i <= f32 +true ? 1 : foo?.Bar +true ? 1 : ok or i64 == 0.5 +true ? add : foo?.Bar +true ? array : 0.5 >= i32 true ? array : foo.String -true ? array : i32 / i32 -true ? array : nil != map(list, #) -true ? array : nil != ok -true ? f32 : f64 == i32 -true ? f64 : foo?.String -true ? greet : 0.5 == i -true ? i : 0.5 + i64 -true ? i : 0.5 >= i64 -true ? i32 : foo.Bar -true ? i64 : foo.Bar -true ? list : f64 / f64 -true ? nil : 0.5 != i32 -true ? nil : foo.Qux +true ? array : foo?.Bar +true ? array : foo?.String +true ? array : i32 ** f64 +true ? div : i64 ** 1 ^ i32 +true ? false : 0.5 > i +true ? false : foo.Qux +true ? foo : 0.5 + -1 +true ? foo : foo.Bar +true ? foo : i64 / f32 +true ? greet : foo.Bar +true ? greet : ok == ok +true ? half : 0.5 / i32 +true ? half : foo.String +true ? i : 1 * i64 +true ? i : greet == half +true ? i32 : i32 - f32 +true ? i32 : i32 >= f32 +true ? i64 : f64 != i +true ? list : div != greet +true ? list : f32 != i true ? nil : foo.String -true ? nil : i32 .. i -true ? nil : i64 ** -i -true ? ok : f32 / f32 -true ? ok : f64 + f64 -true ? score : foo.Qux -true ? true : f32 >= i64 -true ? true : foo?.String -true and ok and ok -true || 1 not in array +true ? nil : foo?.String +true ? nil : i32 != f64 + 1 +true ? ok : foo.Qux +true ? ok : foo?.String +true ? score : ok or f64 < f32 +true and nil not in list +true and ok or ok +true and true || ok +true or 0.5 not in array +true || f32 not in groupBy(list, #) +true || false ? half : half type(!false) type(!ok) type(!true) -type("bar" != nil) -type("bar" + "foo") -type("bar" < "bar") +type("bar" != "bar") +type("bar" < "foo") type("bar" <= "bar") -type("bar" <= "foo") -type("bar" == nil) -type("bar" > "foo") -type("bar" endsWith "foo") -type("bar" matches "bar") -type("bar" matches "foo") -type("bar" not contains "bar") -type("bar" not endsWith "bar") +type("bar" == "foo") +type("bar" >= "bar") type("bar" not endsWith "foo") -type("bar" startsWith "foo") -type("bar") == string(array) -type("foo" != "bar") -type("foo" == "foo") -type("foo" > "bar") -type("foo" contains "foo") -type("foo" endsWith "foo") -type("foo" in foo) -type("foo" not endsWith "bar") -type("foo" not endsWith "foo") -type("foo" startsWith "foo") -type("foo" startsWith foo.Bar) +type("bar" startsWith "bar") +type("bar") startsWith greet("bar") +type("foo" != nil) +type("foo" + "bar") +type("foo" not startsWith "bar") +type("foo") not in foo type(-0.5) type(-1) type(-f32) @@ -14475,288 +18200,234 @@ type(-f64) type(-i) type(-i32) type(-i64) -type(0.5 != 0.5) -type(0.5 != 1) -type(0.5 != i) +type(-int(f64)) +type(0.5 != f64) type(0.5 != i32) type(0.5 != nil) type(0.5 * 0.5) -type(0.5 * 1) -type(0.5 * i) -type(0.5 * i32) +type(0.5 * f32) +type(0.5 * f64) type(0.5 * i64) type(0.5 ** 0.5) type(0.5 ** 1) type(0.5 ** f32) +type(0.5 ** f64) type(0.5 ** i) type(0.5 ** i32) -type(0.5 ** i64) +type(0.5 + 0.5) +type(0.5 + 1) type(0.5 + f32) -type(0.5 + i32) +type(0.5 + f64) +type(0.5 + i) type(0.5 + i64) -type(0.5 - 0.5) -type(0.5 - i) -type(0.5 / 0.5) +type(0.5 - 1) +type(0.5 - f64) +type(0.5 - i32) type(0.5 / 1) -type(0.5 / f64) +type(0.5 / f32) type(0.5 / i) +type(0.5 / i32) +type(0.5 / i64) type(0.5 < 1) -type(0.5 < f64) -type(0.5 < i) +type(0.5 < f32) +type(0.5 < i32) type(0.5 < i64) type(0.5 <= 1) type(0.5 <= f32) -type(0.5 <= i) type(0.5 <= i64) -type(0.5 == 1) -type(0.5 == i) -type(0.5 == nil) +type(0.5 == 0.5) +type(0.5 == f32) +type(0.5 == f64) +type(0.5 == i32) type(0.5 > 0.5) -type(0.5 > 1) -type(0.5 > f64) +type(0.5 > f32) type(0.5 > i) +type(0.5 > i32) +type(0.5 > i64) type(0.5 >= 0.5) -type(0.5 >= 1) -type(0.5 >= f64) type(0.5 >= i) type(0.5 >= i32) type(0.5 ^ 0.5) -type(0.5 ^ 1) -type(0.5 ^ f32) -type(0.5 ^ f64) type(0.5 ^ i) -type(0.5) not contains trimPrefix("bar") -type(0.5) not in foo -type(0.5) startsWith "bar" == nil -type(0.5)[i32:i64] -type(1 != 0.5) -type(1 != 1) -type(1 != f32) +type(0.5 ^ i32) +type(0.5 ^ i64) +type(0.5 not in array) +type(0.5) in foo type(1 != i32) type(1 != nil) type(1 % 1) type(1 % i) -type(1 % i32) -type(1 % i64) -type(1 * 1) +type(1 * 0.5) type(1 * f32) type(1 * i) -type(1 * i64) +type(1 * i32) type(1 ** 0.5) -type(1 ** 1) type(1 ** f64) -type(1 ** i32) +type(1 ** i) type(1 ** i64) type(1 + 0.5) +type(1 + 1) type(1 + f32) -type(1 + f64) type(1 + i64) type(1 - 0.5) type(1 - 1) -type(1 - f64) -type(1 - i32) +type(1 - i64) type(1 .. 1) -type(1 .. i) type(1 .. i64) -type(1 / 1) -type(1 / f32) type(1 / f64) -type(1 < 1) -type(1 < f32) -type(1 < i) -type(1 <= f32) +type(1 / i) +type(1 < i32) +type(1 < i64) +type(1 <= 0.5) +type(1 <= 1) type(1 <= f64) -type(1 <= i32) -type(1 <= i64) -type(1 == 1) +type(1 <= i) +type(1 == f32) +type(1 == f64) type(1 == i) +type(1 == i32) type(1 == i64) -type(1 == nil) -type(1 > 0.5) -type(1 > 1) -type(1 > f32) -type(1 > f64) +type(1 > i) type(1 >= 0.5) -type(1 >= 1) -type(1 >= f64) type(1 >= i) -type(1 >= i32) type(1 >= i64) -type(1 ^ 0.5) -type(1 ^ f32) +type(1 ^ 1) +type(1 ^ i) type(1 ^ i64) -type(1 in array) -type(1 not in array) -type(1) != toJSON(0.5) -type(1) == nil ? 1 : f64 -type(1) endsWith greet("foo") -type(1) in foo -type(1) in foo != true -type(1) not contains type(nil) -type(1) not endsWith toJSON(ok) -type([half, 1]) -type([nil]) +type(1) endsWith foo.Bar +type(1) in reduce(list, #) +type(1) not endsWith "bar" ? i64 : nil +type(1) not startsWith string(0.5) +type([div]) +type([f32]) type(abs(0.5)) -type(abs(1)) +type(abs(f32)) type(abs(f64)) type(abs(i)) type(abs(i32)) type(abs(i64)) -type(add != add) type(add != greet) type(add != half) -type(add == half) -type(add == nil) -type(add(1, 1)) type(add) -type(add) in foo -type(all(array, true)) -type(all(list, false)) +type(all(array, ok)) +type(all(list, ok)) +type(all(list, true)) type(any(array, false)) -type(any(list, true)) +type(any(array, ok)) +type(any(list, false)) +type(array != list) +type(array != nil) type(array == array) -type(array == list) type(array) -type(array) in foo -type(array) not in foo +type(array) >= trimPrefix("foo") type(array[1]) type(array[i32]) type(array[i]) -type(count(list, ok)) -type(count(list, true)) +type(bitand(1, i)) +type(bitnot(i)) +type(bitnot(i32)) +type(bitnot(i64)) +type(bitxor(i64, 1)) +type(ceil(0.5)) +type(ceil(f32)) +type(ceil(f64)) +type(ceil(i64)) +type(count(array, true)) type(div != div) type(div != half) -type(div != nil) -type(div == add) -type(div == greet) -type(div == half) +type(div == div) type(div) -type(div) not in foo type(f32 != 0.5) type(f32 != 1) -type(f32 != f32) -type(f32 != i32) -type(f32 * 0.5) type(f32 * 1) -type(f32 * f32) -type(f32 * f64) type(f32 * i) -type(f32 * i64) -type(f32 ** 0.5) -type(f32 ** 1) +type(f32 * i32) type(f32 ** f32) -type(f32 ** i) -type(f32 ** i32) -type(f32 + 0.5) type(f32 + 1) -type(f32 + f64) type(f32 + i) -type(f32 + i64) -type(f32 - 0.5) -type(f32 - 1) type(f32 - f32) -type(f32 - i) type(f32 - i32) -type(f32 - i64) +type(f32 / 1) +type(f32 / f32) type(f32 < 1) -type(f32 < f64) -type(f32 < i32) -type(f32 <= 0.5) -type(f32 <= 1) -type(f32 <= i64) +type(f32 < f32) +type(f32 <= f64) type(f32 == 0.5) -type(f32 == 1) +type(f32 == f64) +type(f32 == i) type(f32 == i32) +type(f32 == i64) type(f32 > 1) -type(f32 > f32) -type(f32 > f64) -type(f32 >= 0.5) -type(f32 ^ 0.5) -type(f32 ^ f32) -type(f32 ^ f64) -type(f32 ^ i32) +type(f32 >= f32) +type(f32 >= i) +type(f32 >= i32) type(f32 ^ i64) +type(f32 not in array) type(f32) -type(f64 != f64) -type(f64 != i64) +type(f64 != 0.5) +type(f64 != i) type(f64 * 0.5) type(f64 * 1) -type(f64 * i32) -type(f64 * i64) -type(f64 ** 0.5) +type(f64 * f32) type(f64 ** 1) -type(f64 ** f32) -type(f64 ** i) -type(f64 ** i32) -type(f64 + 0.5) -type(f64 + f64) -type(f64 + i) +type(f64 + f32) +type(f64 + i32) type(f64 - 0.5) -type(f64 - f32) +type(f64 - 1) type(f64 - f64) type(f64 - i) type(f64 / 1) -type(f64 / i) +type(f64 / f32) +type(f64 / i64) type(f64 < 0.5) -type(f64 < 1) +type(f64 < f32) type(f64 < f64) +type(f64 < i32) type(f64 < i64) type(f64 <= 0.5) -type(f64 <= i) -type(f64 <= i32) -type(f64 == 1) -type(f64 == f64) +type(f64 <= f64) +type(f64 <= i64) +type(f64 == 0.5) +type(f64 == f32) +type(f64 == i64) type(f64 == nil) -type(f64 > 1) -type(f64 > f64) type(f64 > i) type(f64 > i32) type(f64 >= 0.5) -type(f64 >= 1) -type(f64 ^ 1) -type(f64 ^ f64) -type(f64 ^ i) -type(f64 ^ i32) -type(f64 ^ i64) +type(f64 >= i) +type(f64 ^ 0.5) +type(f64 not in array) type(f64) type(false != nil) +type(false != ok) type(false && true) -type(false == ok) -type(false ? add : div) -type(false ? half : i) -type(false ? half : i32) -type(false ? i32 : 1) -type(false ? i32 : true) -type(false ? list : "foo") -type(false || ok) -type(false) not contains toJSON(i) -type(filter(array, true)) -type(filter(list, false)) -type(find([f64], "foo" == nil)) +type(false ? "bar" : score) +type(false ? div : f64) +type(false ? half : greet) +type(false ? true : foo) +type(false || true) +type(false) startsWith "bar" ? ok : f32 type(find(array, false)) -type(find(list, false)) -type(findIndex(array, false)) -type(findIndex(list, ok)) -type(findIndex(list, true)) +type(find(array, true)) +type(find(list, true)) +type(findIndex(array, ok)) type(findLast(array, false)) type(findLast(array, ok)) -type(findLast(list, false)) -type(findLastIndex(array, ok)) -type(findLastIndex(array, true)) +type(findLastIndex(array, false)) +type(findLastIndex(list, false)) type(findLastIndex(list, ok)) -type(first(array)) +type(findLastIndex(list, true)) type(first(list)) -type(float(0.5)) -type(float(1)) type(float(f32)) -type(float(f64)) -type(float(i)) type(float(i32)) -type(float(i64)) +type(floor(0.5)) +type(floor(1)) +type(floor(f64)) +type(floor(i64)) type(foo != foo) +type(foo != nil) type(foo in list) type(foo) -type(foo) in foo type(foo.Bar) type(foo.Qux) type(foo.String()) @@ -14766,182 +18437,147 @@ type(foo?.Qux) type(foo?.String()) type(foo?.String) type(get(array, 1)) -type(get(array, i)) -type(get(array, i32)) +type(get(array, i64)) type(get(list, 1)) +type(get(list, i)) type(get(list, i32)) +type(get(list, i64)) type(greet != div) -type(greet != half) -type(greet != score) type(greet == div) -type(greet == greet) -type(greet == half) type(greet("bar")) type(greet("foo")) -type(greet(lower("foo"))) type(greet) -type(greet) not in foo -type(half != add) -type(half != nil) -type(half == add) -type(half == div) +type(groupBy(array, #)) +type(groupBy(array, #).score) +type(groupBy(array, 0.5)) +type(groupBy(array, false)?.add) +type(groupBy(array, i)) +type(groupBy(array, i32)) +type(groupBy(array, i64)) +type(groupBy(list, "bar")) +type(groupBy(list, #)) +type(groupBy(list, #)?.Bar) +type(groupBy(list, 1)) +type(groupBy(list, i64)) +type(groupBy(list, true)) +type(half != div) +type(half != greet) +type(half != score) type(half(0.5)) +type(half(1)) type(half(f64)) type(half) -type(half) endsWith toJSON(1) -type(i != 0.5) -type(i != 1) -type(i != f32) -type(i != i64) +type(half) not in foo type(i % 1) +type(i % i32) type(i * 0.5) -type(i * i64) -type(i ** 0.5) -type(i ** 1) +type(i * i32) type(i ** f32) type(i ** f64) type(i ** i) -type(i ** i32) -type(i + 1) -type(i + i) type(i + i32) -type(i .. i64) +type(i - 0.5) +type(i - 1) +type(i - i) +type(i - i64) +type(i .. i) type(i / 0.5) -type(i / 1) -type(i < f32) -type(i < i64) -type(i == f32) -type(i == i32) -type(i == i64) -type(i > f64) -type(i >= 1) -type(i >= f32) -type(i >= f64) -type(i ^ 0.5) +type(i / i32) +type(i < 0.5) +type(i < 1) +type(i <= 0.5) +type(i <= 1) +type(i == 1) +type(i > 0.5) +type(i > 1) +type(i > f32) +type(i > i64) +type(i >= i32) type(i ^ 1) -type(i ^ f32) -type(i ^ f64) +type(i ^ i) +type(i ^ i32) type(i ^ i64) -type(i not in array) type(i) -type(i) not endsWith greet("foo") -type(i32 != 0.5) +type(i) + foo.Bar type(i32 != 1) -type(i32 != nil) -type(i32 % 1) -type(i32 % i64) +type(i32 != f64) type(i32 * 0.5) -type(i32 * 1) -type(i32 * i32) -type(i32 * i64) -type(i32 ** f32) +type(i32 * i) +type(i32 ** 0.5) type(i32 ** f64) type(i32 ** i) type(i32 + 1) -type(i32 + f32) -type(i32 + f64) -type(i32 + i) -type(i32 + i32) -type(i32 + i64) -type(i32 - f32) -type(i32 - i32) -type(i32 .. 1) -type(i32 .. i) +type(i32 - 1) +type(i32 .. i32) +type(i32 / 0.5) type(i32 / f64) -type(i32 / i32) -type(i32 < 1) -type(i32 < f32) -type(i32 < i) -type(i32 < i64) +type(i32 < 0.5) +type(i32 <= 0.5) type(i32 <= f64) type(i32 <= i32) -type(i32 <= i64) -type(i32 == 0.5) type(i32 == 1) -type(i32 == f32) -type(i32 == f64) -type(i32 == i) -type(i32 == i64) +type(i32 == nil) type(i32 > 0.5) -type(i32 > 1) type(i32 > f64) -type(i32 > i32) +type(i32 > i64) type(i32 >= 1) type(i32 >= f32) -type(i32 >= i) -type(i32 >= i32) -type(i32 ^ 0.5) +type(i32 >= i64) +type(i32 ^ 1) +type(i32 ^ f32) +type(i32 ^ f64) type(i32 ^ i) -type(i32 ^ i32) -type(i32 ^ i64) -type(i32 in array) +type(i32 not in array) type(i32) -type(i32) startsWith greet("foo") +type(i32) in foo +type(i32) not matches trim("foo") type(i64 != 1) -type(i64 != array[i32]) -type(i64 != f32) -type(i64 != i) -type(i64 != nil) -type(i64 % i) -type(i64 % i64) -type(i64 * 0.5) +type(i64 != f64) +type(i64 % 1) type(i64 * f32) -type(i64 * f64) type(i64 * i64) -type(i64 ** 1) +type(i64 ** 0.5) +type(i64 ** f64) +type(i64 ** i32) type(i64 + 0.5) -type(i64 + f64) -type(i64 + i) +type(i64 + 1) type(i64 + i64) type(i64 - 0.5) -type(i64 .. 1) +type(i64 - f32) +type(i64 - f64) +type(i64 - i32) type(i64 .. i32) -type(i64 .. i64) type(i64 / 0.5) -type(i64 / 1) -type(i64 / i) +type(i64 / f32) type(i64 / i64) -type(i64 < 1) +type(i64 < 0.5) +type(i64 < f32) type(i64 < f64) type(i64 < i) type(i64 < i64) +type(i64 <= 0.5) type(i64 <= 1) type(i64 <= f32) -type(i64 <= i64) -type(i64 == i32) -type(i64 == nil) -type(i64 > f64) -type(i64 >= 0.5) -type(i64 >= f32) -type(i64 >= i) -type(i64 >= i64) -type(i64 ^ 0.5) -type(i64 ^ 1) -type(i64 ^ f32) +type(i64 <= i) +type(i64 == 1) +type(i64 == f64) +type(i64 > i64) +type(i64 >= 1) type(i64 ^ f64) type(i64 ^ i) -type(i64 ^ i32) -type(i64 in array) type(i64 not in array) type(i64) -type(i64) != foo?.Bar -type(i64) contains string(foo) ? i : array -type(i64) not in foo -type(i64) not startsWith lower("foo") type(int(0.5)) -type(int(1)) type(int(f32)) type(int(f64)) type(int(i)) type(int(i32)) -type(int(i64) <= f32) type(int(i64)) type(last(array)) type(last(list)) -type(len("bar")) -type(len("foo")) type(len(array)) type(len(list)) +type(list != nil) type(list == array) type(list == nil) type(list) @@ -14949,1423 +18585,1416 @@ type(list[1]) type(list[i32]) type(list[i64]) type(list[i]) -type(lower("bar")) -type(lower("foo")) -type(lower(string(nil))) +type(map(array, "bar")) type(map(array, "foo")) type(map(array, #)) -type(map(array, 0.5)) -type(map(array, add)) -type(map(array, array)) -type(map(array, false)) +type(map(array, 1)) +type(map(array, div)) +type(map(array, f32)) type(map(array, foo)) -type(map(array, half)) -type(map(array, i)) -type(map(array, i64)) +type(map(array, greet)) type(map(array, ok)) -type(map(i .. i32, i64)) +type(map(array, true)) +type(map(list, "bar")) type(map(list, #)) -type(map(list, 0.5)) -type(map(list, 1)) type(map(list, array)) -type(map(list, f32)) -type(map(list, f64)) -type(map(list, foo)) type(map(list, greet)) -type(map(list, i)) +type(map(list, i64)) type(map(list, list)) type(map(list, ok)) type(max(0.5)) +type(max(0.5, f64)) type(max(1)) -type(max(f32)) -type(max(f32, i32)) +type(max(1, i32)) type(max(f64)) -type(max(f64, 0.5)) -type(max(i)) -type(max(i32)) -type(max(i32, i64)) type(max(i64)) -type(min(0.5)) +type(median(array)) type(min(1)) -type(min(1, 0.5)) -type(min(1, 1, f32)) type(min(f32)) -type(min(f64)) type(min(i)) -type(min(i, 1)) type(min(i32)) -type(min(i32, 0.5)) type(min(i64)) -type(nil != "bar") +type(nil != "foo") type(nil != 0.5) type(nil != 1) -type(nil != div) -type(nil != f64) -type(nil != false) -type(nil != foo) type(nil != greet) +type(nil != half) type(nil != i32) +type(nil != i64) type(nil != nil) -type(nil != ok) -type(nil == "bar") +type(nil != score) type(nil == "foo") -type(nil == 0.5) -type(nil == 1) -type(nil == add) type(nil == array) type(nil == f32) -type(nil == f64) -type(nil == i) -type(nil == i32) +type(nil == false) +type(nil == foo) +type(nil == greet) type(nil == nil) -type(nil == ok) type(nil == score) -type(nil == true) type(nil in array) +type(nil in list) type(nil not in array) -type(nil) != type(1) -type(none(array, ok)) -type(none(array, true)) +type(nil not in list) type(none(list, ok)) type(none(list, true)) +type(not (f64 <= i)) type(not false) type(not ok) type(not true) +type(ok != false) type(ok != nil) -type(ok == false) -type(ok ? 0.5 : i32) -type(ok ? 0.5 : list) -type(ok ? 1 : f32) -type(ok ? add : "bar") -type(ok ? false : i64) -type(ok ? foo : false) -type(ok ? half : half) -type(ok ? i32 : f64) -type(ok ? i64 : "bar") -type(ok ? list : "foo") -type(ok ? ok : half) -type(ok ? true : false) +type(ok != true) +type(ok && false) +type(ok == nil) +type(ok ? "bar" : half) +type(ok ? 1 : "bar") +type(ok ? array : i64) +type(ok ? array : score) +type(ok ? i : "bar") +type(ok ? i : nil) +type(ok ? nil : 0.5) +type(ok ? nil : div) type(ok and ok) -type(ok and true) type(ok or false) -type(ok or true) -type(ok || true) +type(ok || false) type(ok) -type(ok) in foo -type(ok) not matches string(i64) -type(ok) not startsWith lower("bar") -type(score != div) -type(score != greet) -type(score != half) -type(score != nil) -type(score == add) -type(score == foo.String) +type(one(array, false)) +type(one(array, true)) +type(one(list, false)) +type(one(list, true)) +type(reduce(array, "bar")) +type(reduce(array, #)) +type(reduce(array, 1)) +type(reduce(array, foo)) +type(reduce(array, greet)) +type(reduce(array, i)) +type(reduce(array, ok)) +type(reduce(list, "foo")) +type(reduce(list, #)) +type(reduce(list, array)) +type(reduce(list, i64)) +type(reduce(list, ok)) +type(round(0.5)) +type(round(1)) +type(round(f64)) +type(round(i)) +type(round(i64)) +type(score != score) +type(score == div) type(score == greet) -type(score == half) type(score == nil) -type(score == score) type(score(1)) +type(score(1, 1)) type(score(i)) -type(score(i, 1)) type(score) -type(score) < foo?.Bar -type(score) > string(score) -type(score) in foo -type(score) not contains type(1) type(sort(array)) -type(string("bar")) -type(string("foo")) type(string(0.5)) type(string(1)) type(string(add)) -type(string(array)) type(string(div)) +type(string(f32)) type(string(f64)) type(string(false)) -type(string(foo)) type(string(greet)) -type(string(half)) -type(string(i <= i32)) -type(string(i)) +type(string(i32)) type(string(i64)) type(string(list)) type(string(nil)) type(string(ok)) type(string(score)) -type(toBase64("foo")) +type(toBase64("bar")) type(toJSON("bar")) type(toJSON("foo")) -type(toJSON(0.5 < i)) type(toJSON(0.5)) type(toJSON(1)) type(toJSON(array)) -type(toJSON(f32)) -type(toJSON(f64)) type(toJSON(false)) -type(toJSON(foo)) +type(toJSON(i)) type(toJSON(i32)) type(toJSON(i64)) type(toJSON(list)) type(toJSON(nil)) -type(toJSON(ok)) -type(toJSON(true)) -type(trim("bar")) type(trim("foo")) -type(trimPrefix("foo")) -type(trimPrefix(toJSON(true))) -type(trimSuffix("bar")) +type(trimPrefix("bar")) +type(true != nil) type(true == false) type(true == nil) -type(true ? "bar" : 0.5) -type(true ? div : 0.5) -type(true ? f64 : array) -type(true ? foo : foo) -type(true ? foo : true) -type(true ? greet : "foo") -type(true ? list : ok) -type(true ? nil : list) -type(true ? nil : ok) -type(true ? true : 1) +type(true ? array : false) +type(true ? array : half) +type(true ? div : add) +type(true ? f64 : i32) +type(true ? ok : 1) +type(true and false) type(true and true) -type(true) endsWith toBase64("foo") -type(type("bar")) -type(type("foo")) +type(true or true) +type(true || ok) +type(true || true) +type(true) in foo +type(true) matches string(list) type(type(0.5)) type(type(1)) type(type(add)) -type(type(array)) type(type(div)) -type(type(f32)) -type(type(f64)) -type(type(false)) type(type(foo)) +type(type(greet)) type(type(half)) type(type(i)) type(type(i32)) type(type(i64)) -type(type(list)) type(type(nil)) type(type(ok)) -type(type(score)) type(type(true)) -type(upper("bar")) type(upper("foo")) -type({"bar": 0.5}) type({"bar": 1}) -type({"bar": greet}) -type({"foo": 0.5, "bar": foo}) -type({"foo": div}) -type({"foo": i64}) -type({"foo": nil}) -upper("bar" + "foo") -upper("bar") <= type(nil) -upper("bar") contains lower("foo") -upper("foo" + "bar") -upper(false ? 0.5 : "foo") +type({"bar": array}) +type({"foo": "foo"}) +type({"foo": f64}) +type({"foo": false, "foo": foo}.Bar) +upper("bar") not in foo +upper("foo" + "foo") +upper("foo") == toJSON("bar") upper(foo.Bar) upper(foo.String()) upper(foo?.Bar) upper(foo?.String()) +upper(greet("bar")) upper(greet("foo")) -upper(greet(string(ok))) +upper(last(list).Bar) upper(lower("bar")) -upper(ok ? "bar" : i) -upper(string("bar")) +upper(lower("foo")) +upper(reduce(list, #)?.Bar) upper(string("foo")) upper(string(0.5)) upper(string(1)) +upper(string(add)) upper(string(array)) -upper(string(div)) upper(string(f32)) -upper(string(f64)) -upper(string(foo)) -upper(string(greet)) -upper(string(half)) -upper(string(i)) upper(string(i32)) upper(string(i64)) upper(string(list)) upper(string(nil)) -upper(string(ok)) upper(string(score)) -upper(string(string(0.5))) upper(string(true)) +upper(toBase64("bar")) upper(toBase64("foo")) upper(toJSON("foo")) -upper(toJSON(0.5)) upper(toJSON(1)) -upper(toJSON(array)) upper(toJSON(f32)) -upper(toJSON(f64)) upper(toJSON(false)) upper(toJSON(foo)) upper(toJSON(i)) upper(toJSON(i32)) -upper(toJSON(i64)) upper(toJSON(list)) upper(toJSON(nil)) -upper(toJSON(ok)) upper(toJSON(true)) upper(trim("bar")) -upper(trim("bar", "bar")) upper(trim("foo")) -upper(trimPrefix("bar")) -upper(trimPrefix("foo")) upper(trimSuffix("bar")) upper(trimSuffix("foo")) -upper(true ? "bar" : f32) -upper(true ? "foo" : i32) upper(type("bar")) upper(type("foo")) -upper(type(0.5)) -upper(type(1)) -upper(type(add)) +upper(type(array)) upper(type(div)) upper(type(f32)) -upper(type(f64)) -upper(type(false)) -upper(type(foo)) +upper(type(foo.Bar)) upper(type(greet)) -upper(type(half)) upper(type(i)) -upper(type(i64)) +upper(type(i32)) upper(type(list)) upper(type(nil)) +upper(type(ok)) upper(type(score)) upper(type(true)) -upper(upper("bar")) -values({"bar": f32}) -values({"bar": greet}) -values({"bar": i64}) -values({"foo": 1}) -values({"foo": div}) -values({"foo": false}) -values({"foo": foo, "foo": ok}) -values({"foo": list, "bar": 1}) -{"bar": !false} -{"bar": !true} -{"bar": "bar", "foo": nil}?.String -{"bar": "bar", "foo": score}.i -{"bar": "bar", "foo": true}?.i?.foo -{"bar": "bar"}.add +upper(upper("foo")) +values(groupBy(array, "bar")) +values(groupBy(array, "foo")) +values(groupBy(array, #)) +values(groupBy(array, 0.5)) +values(groupBy(array, 1)) +values(groupBy(array, foo)) +values(groupBy(array, i)) +values(groupBy(list, #)) +values(groupBy(list, 1)) +values(groupBy(list, i)) +values(groupBy(list, i32)) +values(groupBy(list, true)) +values({"bar": "bar"}) +values({"bar": array}) +values({"foo": add, "bar": div}) +values({"foo": ok}) +{"bar": "bar" <= "foo"} +{"bar": "bar", "bar": half}.add +{"bar": "bar", "bar": i}.Qux +{"bar": "bar", "bar": i}.String +{"bar": "bar", "foo": 0.5}.i64 +{"bar": "bar", "foo": i64}?.Qux +{"bar": "bar", "foo": score}.f32 +{"bar": "bar"}.String?.foo {"bar": "bar"}.array -{"bar": "bar"}.f32 {"bar": "bar"}.f64 +{"bar": "bar"}.greet {"bar": "bar"}.list {"bar": "bar"}.ok -{"bar": "bar"}?.Bar -{"bar": "bar"}?.greet +{"bar": "bar"}?.Qux +{"bar": "bar"}?.array {"bar": "bar"}?.half -{"bar": "bar"}?.i -{"bar": "foo", "foo": 0.5}.add -{"bar": "foo", "foo": 1}.String?.ok -{"bar": "foo", "foo": greet}.half -{"bar": "foo", "foo": ok, "bar": f64}?.Bar -{"bar": "foo", "foo": ok}.Qux -{"bar": "foo", "foo": true}.ok -{"bar": "foo"}.Qux -{"bar": "foo"}.String -{"bar": "foo"}.add -{"bar": "foo"}.array -{"bar": "foo"}.div +{"bar": "bar"}?.list +{"bar": "foo", "bar": div}.half +{"bar": "foo", "foo": f32}.String +{"bar": "foo", "foo": i64}.ok?.f64 +{"bar": "foo", "foo": ok}?.i64 +{"bar": "foo"}.Bar {"bar": "foo"}.f32 +{"bar": "foo"}.foo +{"bar": "foo"}.half {"bar": "foo"}.i {"bar": "foo"}.i64 -{"bar": "foo"}.score -{"bar": "foo"}?.Qux -{"bar": "foo"}?.Qux?.score {"bar": "foo"}?.String -{"bar": "foo"}?.div +{"bar": "foo"}?.f32 {"bar": "foo"}?.foo +{"bar": "foo"}?.greet +{"bar": "foo"}?.i {"bar": "foo"}?.i32 -{"bar": "foo"}?.i64 +{"bar": "foo"}?.i?.String() +{"bar": "foo"}?.list +{"bar": "foo"}?.ok {"bar": -0.5} -{"bar": -1} -{"bar": -1}?.array {"bar": -f32} -{"bar": 0.5 * f64} -{"bar": 0.5 + 1} -{"bar": 0.5 - i32} -{"bar": 0.5 - i64} -{"bar": 0.5 < i64} -{"bar": 0.5 == nil} -{"bar": 0.5 > 1}.Qux -{"bar": 0.5, "bar": "bar"}.ok -{"bar": 0.5, "bar": 0.5}.f32 -{"bar": 0.5, "bar": 1}?.half -{"bar": 0.5, "foo": array}?.ok -{"bar": 0.5, "foo": i32, "bar": add}?.Bar -{"bar": 0.5}.Bar +{"bar": -f64} +{"bar": -i32} +{"bar": 0.5 != nil} +{"bar": 0.5 * 1}.foo +{"bar": 0.5, "bar": 0.5}.half +{"bar": 0.5, "bar": add, "foo": i32}.list +{"bar": 0.5, "bar": i}?.add +{"bar": 0.5, "bar": list}?.div +{"bar": 0.5, "bar": nil, "bar": nil}.i32 +{"bar": 0.5, "bar": ok, "foo": 1}?.String +{"bar": 0.5, "bar": true}.score +{"bar": 0.5, "foo": 0.5}?.f32 +{"bar": 0.5, "foo": array}?.list +{"bar": 0.5, "foo": f32}.i32?.Bar +{"bar": 0.5, "foo": ok}?.array {"bar": 0.5}.Qux {"bar": 0.5}.String {"bar": 0.5}.add -{"bar": 0.5}.div -{"bar": 0.5}.div?.array.foo +{"bar": 0.5}.array {"bar": 0.5}.f32 {"bar": 0.5}.f64 -{"bar": 0.5}.foo -{"bar": 0.5}.greet +{"bar": 0.5}.half +{"bar": 0.5}.i {"bar": 0.5}.i32 +{"bar": 0.5}.i64 {"bar": 0.5}.ok -{"bar": 0.5}.score {"bar": 0.5}?.Bar +{"bar": 0.5}?.Qux {"bar": 0.5}?.String -{"bar": 0.5}?.add -{"bar": 0.5}?.array {"bar": 0.5}?.div -{"bar": 0.5}?.f32 {"bar": 0.5}?.foo -{"bar": 0.5}?.greet?.i32 +{"bar": 0.5}?.greet {"bar": 0.5}?.half {"bar": 0.5}?.i {"bar": 0.5}?.i32 -{"bar": 0.5}?.i32?.i32 {"bar": 0.5}?.i64 -{"bar": 1 * i32} +{"bar": 0.5}?.list +{"bar": 0.5}?.score {"bar": 1 * i} -{"bar": 1 + i32} -{"bar": 1 - f32} +{"bar": 1 ** 0.5} {"bar": 1 / 0.5} -{"bar": 1 < f32} -{"bar": 1 <= 1} -{"bar": 1, "bar": "bar"}.i32 -{"bar": 1, "bar": array}?.f32 -{"bar": 1, "bar": false}.array -{"bar": 1, "bar": greet, "foo": "bar"}?.i64 -{"bar": 1, "bar": i64}?.array -{"bar": 1, "foo": 0.5}?.String -{"bar": 1, "foo": add, "foo": f32}?.i -{"bar": 1, "foo": foo}.div -{"bar": 1, "foo": i64}.i64 -{"bar": 1}.Bar -{"bar": 1}.Qux +{"bar": 1 / f32} +{"bar": 1 ^ 1} +{"bar": 1, "bar": add, "foo": "bar"}?.add +{"bar": 1, "bar": add}.div +{"bar": 1, "bar": f32}?.Bar +{"bar": 1, "bar": f64, "foo": array}.ok +{"bar": 1, "foo": "bar"}.half +{"bar": 1, "foo": array, "bar": score}?.i +{"bar": 1, "foo": i}?.list +{"bar": 1, "foo": i}?.ok +{"bar": 1, "foo": ok}?.f32 +{"bar": 1, "foo": score}.f64 {"bar": 1}.String {"bar": 1}.add -{"bar": 1}.div -{"bar": 1}.f64 +{"bar": 1}.f32 +{"bar": 1}.foo {"bar": 1}.greet {"bar": 1}.half {"bar": 1}.i -{"bar": 1}.ok -{"bar": 1}?.Bar +{"bar": 1}.i32 +{"bar": 1}.list +{"bar": 1}.score +{"bar": 1}?.Qux {"bar": 1}?.add -{"bar": 1}?.add?.i32 -{"bar": 1}?.div?.list +{"bar": 1}?.div {"bar": 1}?.f32 {"bar": 1}?.f64 {"bar": 1}?.i {"bar": 1}?.i32 +{"bar": 1}?.i64 +{"bar": 1}?.list {"bar": 1}?.ok -{"bar": ["bar", score]} -{"bar": add, "bar": "foo"}.String?.array -{"bar": add, "bar": 1}?.i64 -{"bar": add, "bar": div}?.f32 -{"bar": add, "bar": foo} -{"bar": add, "bar": list}.Bar -{"bar": add, "bar": score}.f64?.f64 -{"bar": add, "foo": "foo"}.i64 -{"bar": add, "foo": f64}?.score -{"bar": add, "foo": i32}?.half -{"bar": add, "foo": ok} -{"bar": add, "foo": score} +{"bar": add, "bar": half}.div +{"bar": add, "bar": i, "bar": ok}?.foo +{"bar": add, "bar": list} +{"bar": add, "bar": ok, "foo": 1}?.ok +{"bar": add, "foo": "foo"}?.f64 {"bar": add} {"bar": add}.Qux {"bar": add}.String -{"bar": add}.f64 -{"bar": add}.foo -{"bar": add}.greet -{"bar": add}.i32 -{"bar": add}.list +{"bar": add}.add +{"bar": add}.array +{"bar": add}.div +{"bar": add}.half +{"bar": add}?.Qux {"bar": add}?.String {"bar": add}?.add +{"bar": add}?.array {"bar": add}?.div -{"bar": add}?.i -{"bar": add}?.i64 -{"bar": add}?.score -{"bar": any(array, false)} -{"bar": any(list, ok)} -{"bar": array, "bar": f64} -{"bar": array, "bar": false, "bar": i}?.Qux -{"bar": array, "bar": false}.Qux -{"bar": array, "bar": half}.i32 -{"bar": array, "bar": i64}.i64 -{"bar": array, "bar": score} -{"bar": array, "foo": "foo"}?.array -{"bar": array, "foo": add == add} -{"bar": array, "foo": count(list, true)}.add +{"bar": add}?.f64 +{"bar": add}?.f64 != half +{"bar": add}?.half +{"bar": add}?.ok +{"bar": add}?.score?.div +{"bar": array, "bar": "bar"}?.i +{"bar": array, "bar": array}?.foo +{"bar": array, "bar": f32} +{"bar": array, "bar": nil}.i64 +{"bar": array, "foo": f32}?.String +{"bar": array, "foo": f64} +{"bar": array, "foo": half}?.add +{"bar": array, "foo": i32} +{"bar": array, "foo": score} {"bar": array} {"bar": array}.Bar -{"bar": array}.Qux -{"bar": array}.String -{"bar": array}.add -{"bar": array}.f32 -{"bar": array}.half?.foo +{"bar": array}.div +{"bar": array}.div?.Qux +{"bar": array}.greet {"bar": array}.i {"bar": array}.i64 -{"bar": array}?.Bar +{"bar": array}.list +{"bar": array}.score +{"bar": array}?.add?.ok {"bar": array}?.div +{"bar": array}?.f64 {"bar": array}?.greet {"bar": array}?.half -{"bar": array}?.i32 {"bar": array}?.i64 {"bar": array}?.ok -{"bar": div != greet} -{"bar": div, "bar": "bar", "bar": foo}.greet -{"bar": div, "bar": "bar", "foo": 1}?.div -{"bar": div, "bar": greet}?.i32 -{"bar": div, "bar": i32}?.array -{"bar": div, "foo": div}?.list -{"bar": div, "foo": greet, "foo": 1}?.score?.Qux -{"bar": div, "foo": i}?.i -{"bar": div, "foo": list}.f64 -{"bar": div, "foo": ok}?.i64 +{"bar": div, "bar": array, "bar": 0.5}.i64 +{"bar": div, "bar": div}?.f32 +{"bar": div, "bar": foo}.foo +{"bar": div, "bar": ok} +{"bar": div, "foo": 1, "bar": ok}.Qux +{"bar": div, "foo": false}?.String +{"bar": div, "foo": foo, "foo": score}.Bar +{"bar": div, "foo": greet}.i +{"bar": div, "foo": greet}?.ok {"bar": div, "foo": score} {"bar": div} -{"bar": div}.add -{"bar": div}.div +{"bar": div}.array {"bar": div}.f32 -{"bar": div}.f32?.score -{"bar": div}.half -{"bar": div}.i32 -{"bar": div}.i64 -{"bar": div}.score -{"bar": div}?.div -{"bar": div}?.div?.f32 -{"bar": div}?.foo +{"bar": div}.f64 +{"bar": div}.i64?.Qux +{"bar": div}.list +{"bar": div}.ok +{"bar": div}?.Bar +{"bar": div}?.array +{"bar": div}?.f64 +{"bar": div}?.greet {"bar": div}?.half -{"bar": div}?.i -{"bar": div}?.i64 {"bar": div}?.list {"bar": div}?.ok -{"bar": f32 ** 1} -{"bar": f32 - i32} -{"bar": f32, "bar": true, "bar": list}?.Bar -{"bar": f32, "foo": i32} -{"bar": f32, "foo": ok, "foo": f32}.half -{"bar": f32, "foo": score}?.greet +{"bar": div}?.score +{"bar": f32 ** i} +{"bar": f32 - 0.5} +{"bar": f32 >= 0.5} +{"bar": f32 ^ 1} +{"bar": f32, "bar": "foo"}.add +{"bar": f32, "bar": false}?.Bar +{"bar": f32, "bar": true}?.String +{"bar": f32, "foo": add, "foo": false}?.String +{"bar": f32, "foo": f32}.ok +{"bar": f32, "foo": f64} +{"bar": f32, "foo": half, "foo": ok} +{"bar": f32, "foo": half} +{"bar": f32, "foo": list}?.f32 +{"bar": f32, "foo": nil}?.f64?.foo {"bar": f32} -{"bar": f32}.Bar -{"bar": f32}.Qux?.i64 -{"bar": f32}.String -{"bar": f32}.add -{"bar": f32}.half -{"bar": f32}.list -{"bar": f32}?.String?.score +{"bar": f32}.Qux +{"bar": f32}.div +{"bar": f32}.f64 +{"bar": f32}.greet +{"bar": f32}.i +{"bar": f32}.i32 +{"bar": f32}.i64 +{"bar": f32}?.Bar +{"bar": f32}?.String +{"bar": f32}?.array {"bar": f32}?.f64 -{"bar": f32}?.foo -{"bar": f32}?.i32 -{"bar": f32}?.i64 +{"bar": f32}?.half {"bar": f32}?.list -{"bar": f32}?.score -{"bar": f64, "bar": 0.5}.div -{"bar": f64, "bar": i} -{"bar": f64, "bar": nil}?.f64 -{"bar": f64, "foo": "foo"}?.half -{"bar": f64, "foo": 0.5, "bar": foo}?.half -{"bar": f64, "foo": f64}.foo -{"bar": f64, "foo": i32} +{"bar": f64 + 1} +{"bar": f64 == i32} +{"bar": f64 > 0.5} +{"bar": f64 ^ i32} +{"bar": f64, "bar": "bar"}.i +{"bar": f64, "bar": foo}?.i +{"bar": f64, "bar": i64}?.i64 +{"bar": f64, "bar": i}.f64 +{"bar": f64, "bar": true}?.i +{"bar": f64, "foo": 0.5, "foo": score}.ok +{"bar": f64, "foo": 1}.f32 +{"bar": f64, "foo": f64}?.score +{"bar": f64, "foo": i}?.Qux?.f64 {"bar": f64} -{"bar": f64}.String -{"bar": f64}.div?.String() -{"bar": f64}.f32 +{"bar": f64}.array +{"bar": f64}.f32?.Bar {"bar": f64}.f64 -{"bar": f64}.f64?.list -{"bar": f64}.greet -{"bar": f64}.half +{"bar": f64}.foo {"bar": f64}.i +{"bar": f64}.i32 {"bar": f64}.ok {"bar": f64}?.Bar -{"bar": f64}?.Qux -{"bar": f64}?.f64 -{"bar": f64}?.half -{"bar": f64}?.i32 +{"bar": f64}?.Bar?.Qux +{"bar": f64}?.add +{"bar": f64}?.div +{"bar": f64}?.f32 +{"bar": f64}?.foo +{"bar": f64}?.i {"bar": f64}?.i64 -{"bar": f64}?.score -{"bar": false, "bar": 0.5, "bar": foo}.add -{"bar": false, "foo": greet, "foo": i64}.div -{"bar": false}.add -{"bar": false}.div +{"bar": f64}?.list +{"bar": f64}?.ok +{"bar": false, "bar": array}?.list +{"bar": false, "bar": i32}?.div +{"bar": false, "bar": i}?.i64 +{"bar": false, "bar": nil}.ok +{"bar": false}.Bar +{"bar": false}.Qux +{"bar": false}.array +{"bar": false}.f32 {"bar": false}.f64 -{"bar": false}.foo -{"bar": false}.greet {"bar": false}.half +{"bar": false}.i {"bar": false}.i32 -{"bar": false}.list {"bar": false}.ok {"bar": false}.score +{"bar": false}?.Bar {"bar": false}?.array -{"bar": false}?.greet -{"bar": false}?.i32 -{"bar": false}?.ok?.Qux?.score() -{"bar": false}?.score -{"bar": first(list)} -{"bar": float(f32)} -{"bar": foo, "bar": 0.5}.div -{"bar": foo, "bar": div}.array -{"bar": foo, "bar": half} -{"bar": foo, "bar": list}.f32 -{"bar": foo, "foo": greet}?.div -{"bar": foo, "foo": i32}.score -{"bar": foo, "foo": true}?.f32 +{"bar": false}?.div +{"bar": false}?.foo +{"bar": false}?.half +{"bar": false}?.i +{"bar": false}?.list +{"bar": false}?.ok +{"bar": filter(list, ok)} +{"bar": float(0.5)} +{"bar": floor(0.5)}.score +{"bar": floor(i32)} +{"bar": foo != nil, "foo": array} +{"bar": foo, "bar": "foo", "bar": score}?.score +{"bar": foo, "bar": 1, "bar": score}?.ok +{"bar": foo, "bar": greet} +{"bar": foo, "bar": i}?.i +{"bar": foo, "bar": score}?.ok +{"bar": foo, "foo": 0.5, "foo": ok}?.half +{"bar": foo, "foo": 0.5}.score +{"bar": foo, "foo": 1, "foo": i}?.add +{"bar": foo, "foo": f64} +{"bar": foo, "foo": f64}.Bar {"bar": foo.Bar} {"bar": foo.String()} -{"bar": foo?.Qux}?.foo +{"bar": foo?.Qux, "bar": f32} {"bar": foo?.String} {"bar": foo} -{"bar": foo}.Qux -{"bar": foo}.String +{"bar": foo}.Bar {"bar": foo}.array -{"bar": foo}.div -{"bar": foo}.f64 +{"bar": foo}.f32 {"bar": foo}.half -{"bar": foo}.half?.list(i32).array {"bar": foo}.i {"bar": foo}.list {"bar": foo}.ok -{"bar": foo}?.div -{"bar": foo}?.f64 +{"bar": foo}?.Bar +{"bar": foo}?.add {"bar": foo}?.greet {"bar": foo}?.i +{"bar": foo}?.i32 {"bar": foo}?.i64 {"bar": foo}?.list -{"bar": greet, "bar": foo} -{"bar": greet, "bar": nil}.f64 -{"bar": greet, "foo": foo} +{"bar": foo}?.ok +{"bar": foo}?.score +{"bar": get(list, i32)} +{"bar": greet("foo")} +{"bar": greet, "bar": 0.5}.i32 +{"bar": greet, "bar": 1}.Bar +{"bar": greet, "bar": f32}.Bar +{"bar": greet, "bar": i32} +{"bar": greet, "bar": not ok} +{"bar": greet, "foo": "bar"}.ok +{"bar": greet, "foo": f64} +{"bar": greet, "foo": false, "bar": ok}.i32 +{"bar": greet, "foo": i32} {"bar": greet} -{"bar": greet}.Qux -{"bar": greet}.add +{"bar": greet}.Bar {"bar": greet}.array -{"bar": greet}.div -{"bar": greet}.foo -{"bar": greet}.i -{"bar": greet}.i32 -{"bar": greet}.ok -{"bar": greet}.score -{"bar": greet}?.Bar -{"bar": greet}?.String -{"bar": greet}?.add +{"bar": greet}.f32 +{"bar": greet}.greet +{"bar": greet}.half +{"bar": greet}.list +{"bar": greet}?.Qux +{"bar": greet}?.div {"bar": greet}?.f32 -{"bar": greet}?.foo?.foo +{"bar": greet}?.f64 +{"bar": greet}?.greet {"bar": greet}?.half -{"bar": greet}?.i -{"bar": greet}?.list +{"bar": greet}?.i32 {"bar": greet}?.ok -{"bar": half(0.5), "bar": ok} -{"bar": half(0.5)} -{"bar": half(0.5)}?.array -{"bar": half, "bar": "foo", "bar": ok}?.String -{"bar": half, "bar": array}?.div?.i32 -{"bar": half, "bar": div} -{"bar": half, "bar": f32} -{"bar": half, "bar": greet}?.i64 +{"bar": greet}?.score +{"bar": groupBy(array, f32)} +{"bar": half == nil} +{"bar": half(f64)} +{"bar": half, "bar": add, "bar": f64}?.i32 +{"bar": half, "bar": foo} {"bar": half, "bar": list} -{"bar": half, "bar": score, "bar": i == f32} {"bar": half, "bar": score} -{"bar": half, "foo": array} -{"bar": half, "foo": f64 == i64} -{"bar": half, "foo": greet} -{"bar": half, "foo": i64}.array -{"bar": half, "foo": list}?.list?.ok +{"bar": half, "foo": 1}?.i64 +{"bar": half, "foo": list} +{"bar": half, "foo": ok, "bar": i} +{"bar": half, "foo": ok}.Qux +{"bar": half, "foo": true}?.String {"bar": half} +{"bar": half}.Bar?.i +{"bar": half}.Qux {"bar": half}.String -{"bar": half}.String?.score +{"bar": half}.div?.i +{"bar": half}.f32 +{"bar": half}.foo {"bar": half}.half {"bar": half}.i32 -{"bar": half}.i64 -{"bar": half}.ok -{"bar": half}.score -{"bar": half}?.Qux -{"bar": half}?.Qux?.f32 -{"bar": half}?.div +{"bar": half}.list +{"bar": half}.list?.String() +{"bar": half}?.Bar +{"bar": half}?.String +{"bar": half}?.array {"bar": half}?.f32 -{"bar": half}?.foo?.f32() -{"bar": half}?.half -{"bar": half}?.half?.f32 -{"bar": half}?.i -{"bar": i ** 0.5} -{"bar": i + i64} -{"bar": i .. i32} -{"bar": i .. i} -{"bar": i > i32} -{"bar": i >= 0.5, "bar": array} -{"bar": i >= i} -{"bar": i, "bar": 0.5}?.Qux -{"bar": i, "bar": foo}.foo -{"bar": i, "bar": nil}?.f32 -{"bar": i, "foo": 1 >= f64} -{"bar": i, "foo": array}.array -{"bar": i, "foo": f64}.i64 -{"bar": i, "foo": greet}?.foo -{"bar": i32 + 0.5} -{"bar": i32 < i32} -{"bar": i32 <= f64} -{"bar": i32, "bar": "foo"}?.half -{"bar": i32, "foo": f64}?.foo -{"bar": i32, "foo": foo, "foo": i32}?.i32?.String() -{"bar": i32, "foo": i64, "bar": true}?.i64 -{"bar": i32, "foo": i64}.half -{"bar": i32, "foo": list} -{"bar": i32, "foo": score, "foo": 1}.array -{"bar": i32, "foo": score, "foo": greet}.add -{"bar": i32, "foo": score, "foo": ok}.foo +{"bar": half}?.greet +{"bar": half}?.i32 +{"bar": half}?.list +{"bar": i % i32} +{"bar": i ** f64} +{"bar": i < 1}?.half +{"bar": i, "bar": 1}.add +{"bar": i, "bar": 1}?.i64 +{"bar": i, "bar": array}?.half +{"bar": i, "bar": div}.ok +{"bar": i, "bar": f64, "bar": "foo"}?.foo +{"bar": i, "bar": f64, "bar": nil}.i32 +{"bar": i, "bar": score} +{"bar": i, "foo": half} +{"bar": i, "foo": i32}?.score +{"bar": i, "foo": nil}?.String +{"bar": i32 ^ 0.5} +{"bar": i32 ^ f64} +{"bar": i32, "bar": list} +{"bar": i32, "foo": "bar"}.i64 +{"bar": i32, "foo": array}.div +{"bar": i32, "foo": f64, "foo": add}.f64 +{"bar": i32, "foo": foo}?.add +{"bar": i32, "foo": ok}.ok {"bar": i32} -{"bar": i32}.Bar +{"bar": i32}.Qux +{"bar": i32}.f64 {"bar": i32}.i -{"bar": i32}.i64 +{"bar": i32}.i32 {"bar": i32}.list -{"bar": i32}.score?.f32 -{"bar": i32}?.String +{"bar": i32}.ok +{"bar": i32}.score +{"bar": i32}?.Qux +{"bar": i32}?.add +{"bar": i32}?.array {"bar": i32}?.div {"bar": i32}?.f32 -{"bar": i32}?.foo -{"bar": i32}?.greet -{"bar": i32}?.half -{"bar": i32}?.i -{"bar": i32}?.list?.list +{"bar": i32}?.i32 +{"bar": i32}?.list {"bar": i32}?.ok -{"bar": i32}?.score -{"bar": i64 != f32, "bar": score} -{"bar": i64 ** f64} -{"bar": i64 / f64} -{"bar": i64, "bar": "bar", "foo": i64}.array -{"bar": i64, "bar": foo}.list -{"bar": i64, "bar": greet, "foo": score}.array -{"bar": i64, "bar": half}?.f64 -{"bar": i64, "bar": i64}?.Qux?.array() -{"bar": i64, "bar": list} -{"bar": i64, "foo": "foo"}.Bar -{"bar": i64, "foo": 0.5, "foo": list}.i64 -{"bar": i64, "foo": f32, "foo": nil}.i32 -{"bar": i64, "foo": f32}?.half -{"bar": i64, "foo": i, "foo": greet}.array -{"bar": i64, "foo": nil}.add -{"bar": i64, "foo": nil}?.Qux +{"bar": i64 + 1} +{"bar": i64 <= 0.5} +{"bar": i64 == 0.5} +{"bar": i64 in array} +{"bar": i64, "bar": !ok} +{"bar": i64, "bar": 0.5}.f32 +{"bar": i64, "bar": greet}.array +{"bar": i64, "bar": score}.ok +{"bar": i64, "foo": nil}?.i32 +{"bar": i64, "foo": ok} +{"bar": i64, "foo": ok}?.f32 {"bar": i64} -{"bar": i64}.add -{"bar": i64}.array +{"bar": i64}.array?.Bar {"bar": i64}.div -{"bar": i64}.div?.i64 {"bar": i64}.f32 -{"bar": i64}.foo -{"bar": i64}.greet -{"bar": i64}.i64 +{"bar": i64}.f64 +{"bar": i64}.i {"bar": i64}.list {"bar": i64}.ok -{"bar": i64}?.Qux -{"bar": i64}?.String -{"bar": i64}?.array -{"bar": i64}?.array?.foo +{"bar": i64}.score {"bar": i64}?.div {"bar": i64}?.f32 -{"bar": i64}?.i64 +{"bar": i64}?.f64 +{"bar": i64}?.half +{"bar": i64}?.i +{"bar": i64}?.i32 +{"bar": i64}?.i?.ok {"bar": i64}?.list -{"bar": i64}?.ok -{"bar": i64}?.score +{"bar": int(f64)} {"bar": i} -{"bar": i}.Bar -{"bar": i}.String +{"bar": i}.add {"bar": i}.array -{"bar": i}.div +{"bar": i}.div?.Qux.div {"bar": i}.f64 -{"bar": i}.foo -{"bar": i}.greet {"bar": i}.half {"bar": i}.i -{"bar": i}.i32 {"bar": i}.i64 -{"bar": i}.list?.list -{"bar": i}?.Qux +{"bar": i}.list {"bar": i}?.String -{"bar": i}?.add +{"bar": i}?.array +{"bar": i}?.f64 {"bar": i}?.foo {"bar": i}?.greet -{"bar": i}?.list -{"bar": list, "bar": 1}?.f64 -{"bar": list, "bar": div} -{"bar": list, "bar": f32, "bar": i64}.Bar -{"bar": list, "bar": f32, "bar": ok}.add -{"bar": list, "bar": f64}.foo -{"bar": list, "bar": false, "bar": 1}?.f32 -{"bar": list, "bar": i32}.half -{"bar": list, "bar": ok} -{"bar": list, "foo": div, "foo": ok}?.i64 -{"bar": list, "foo": f64, "foo": list}.half -{"bar": list, "foo": half}?.Qux -{"bar": list, "foo": i} -{"bar": list, "foo": list} -{"bar": list, "foo": ok, "foo": f64}?.half +{"bar": i}?.i +{"bar": i}?.i32 +{"bar": i}?.i64 +{"bar": i}?.score +{"bar": list == nil} +{"bar": list, "bar": half}?.Bar +{"bar": list, "bar": score} +{"bar": list, "foo": "foo"}.String +{"bar": list, "foo": 1, "foo": nil}.score +{"bar": list, "foo": 1, "foo": score}?.array +{"bar": list, "foo": array}?.i64 +{"bar": list, "foo": f64}.div?.Qux +{"bar": list, "foo": f64}.list +{"bar": list, "foo": half}?.f32 +{"bar": list, "foo": i64}?.array +{"bar": list, "foo": nil}.i64 +{"bar": list[i32:i32]} {"bar": list} -{"bar": list}.Bar +{"bar": list}.String {"bar": list}.add -{"bar": list}.f32 +{"bar": list}.array +{"bar": list}.array?.i64 {"bar": list}.f64 {"bar": list}.greet -{"bar": list}.score +{"bar": list}.i +{"bar": list}.list +{"bar": list}?.Bar +{"bar": list}?.Qux {"bar": list}?.add -{"bar": list}?.add?.array {"bar": list}?.div -{"bar": list}?.half -{"bar": list}?.i32 -{"bar": list}?.list +{"bar": list}?.f64 +{"bar": list}?.i64 {"bar": list}?.score -{"bar": map(list, i32)} -{"bar": min(0.5)} -{"bar": min(f32)} +{"bar": lower("bar")} +{"bar": map(array, #)} +{"bar": map(array, i)} +{"bar": map(list, #)} {"bar": nil != "bar"} -{"bar": nil != false} -{"bar": nil == "foo"} -{"bar": nil == 1} -{"bar": nil == f64} -{"bar": nil, "bar": div}.f32 -{"bar": nil, "bar": greet, "foo": "bar"}?.i64 -{"bar": nil, "bar": greet}.score -{"bar": nil, "bar": i}.f64 -{"bar": nil, "foo": 0.5}?.array -{"bar": nil, "foo": f64}?.add -{"bar": nil, "foo": half}?.foo -{"bar": nil}.String +{"bar": nil != nil} +{"bar": nil == 0.5} +{"bar": nil == nil} +{"bar": nil, "bar": "bar"}?.i32 +{"bar": nil, "bar": add, "bar": i}.add +{"bar": nil, "bar": foo}?.list +{"bar": nil, "foo": "foo"}.f64 +{"bar": nil, "foo": 1, "foo": add}.ok +{"bar": nil, "foo": foo}?.add +{"bar": nil, "foo": i}?.f64 +{"bar": nil, "foo": list}?.f32 +{"bar": nil}.Bar {"bar": nil}.add -{"bar": nil}.array +{"bar": nil}.div {"bar": nil}.f32 {"bar": nil}.foo +{"bar": nil}.greet {"bar": nil}.half -{"bar": nil}?.Bar +{"bar": nil}.i +{"bar": nil}.i32 +{"bar": nil}.i32?.greet +{"bar": nil}.i64 +{"bar": nil}.i?.f64 +{"bar": nil}.list +{"bar": nil}.ok +{"bar": nil}?.Qux +{"bar": nil}?.String {"bar": nil}?.add -{"bar": nil}?.array +{"bar": nil}?.div {"bar": nil}?.f32 {"bar": nil}?.f64 -{"bar": nil}?.foo -{"bar": nil}?.foo?.i32 -{"bar": nil}?.greet {"bar": nil}?.half +{"bar": nil}?.i {"bar": nil}?.i32 -{"bar": nil}?.i64 {"bar": nil}?.list {"bar": nil}?.ok -{"bar": ok or ok} -{"bar": ok || ok} -{"bar": ok, "bar": list} -{"bar": ok, "bar": nil == half}.f64 -{"bar": ok, "foo": div, "bar": "bar"}.Qux -{"bar": ok, "foo": i32, "bar": 1}.score +{"bar": none(list, ok)} +{"bar": not true} +{"bar": ok ? "bar" : i} +{"bar": ok ? i32 : "foo"} +{"bar": ok ? nil : greet} +{"bar": ok, "bar": 1, "foo": f64}.half +{"bar": ok, "bar": array} +{"bar": ok, "bar": i64, "foo": 1}?.Qux +{"bar": ok, "bar": i} +{"bar": ok, "bar": list}?.div +{"bar": ok, "bar": ok}.f32 +{"bar": ok, "foo": 0.5}?.score +{"bar": ok, "foo": 1}.i +{"bar": ok, "foo": greet} +{"bar": ok, "foo": half} +{"bar": ok, "foo": list} +{"bar": ok, "foo": list}?.f64 +{"bar": ok, "foo": nil}?.i32 +{"bar": ok, "foo": ok}.div {"bar": ok} -{"bar": ok}.String -{"bar": ok}.add -{"bar": ok}.array -{"bar": ok}.i +{"bar": ok}.Bar +{"bar": ok}.div +{"bar": ok}.f32 +{"bar": ok}.greet +{"bar": ok}.i32 {"bar": ok}.i64 +{"bar": ok}.list {"bar": ok}.ok +{"bar": ok}.score {"bar": ok}?.Qux -{"bar": ok}?.array -{"bar": ok}?.f64 -{"bar": ok}?.foo -{"bar": ok}?.greet -{"bar": ok}?.i +{"bar": ok}?.add +{"bar": ok}?.f32 {"bar": ok}?.i32 {"bar": ok}?.i64 -{"bar": score != score} -{"bar": score, "bar": 0.5}?.Bar -{"bar": score, "bar": div} -{"bar": score, "bar": foo} -{"bar": score, "bar": i64}.div -{"bar": score, "bar": i} -{"bar": score, "foo": greet} +{"bar": ok}?.list +{"bar": ok}?.score +{"bar": one(list, false)} +{"bar": reduce(array, i)}.i64 +{"bar": reduce(list, half)} +{"bar": score != add} +{"bar": score(i)} +{"bar": score, "bar": "bar", "bar": "foo"}?.f32 +{"bar": score, "bar": add}.String +{"bar": score, "bar": i64}.f32 +{"bar": score, "bar": nil}.i +{"bar": score, "foo": div} +{"bar": score, "foo": foo}.i +{"bar": score, "foo": half, "foo": i}?.array +{"bar": score, "foo": half} +{"bar": score, "foo": score}?.greet {"bar": score} -{"bar": score}.Bar {"bar": score}.add {"bar": score}.array {"bar": score}.div {"bar": score}.f64 -{"bar": score}.i32 -{"bar": score}.i64 +{"bar": score}.foo +{"bar": score}.half {"bar": score}.list -{"bar": score}.ok -{"bar": score}.score +{"bar": score}?.String +{"bar": score}?.array {"bar": score}?.f32 -{"bar": score}?.f64 +{"bar": score}?.foo +{"bar": score}?.half +{"bar": score}?.i {"bar": score}?.i32 {"bar": score}?.list {"bar": score}?.score -{"bar": string(array)} -{"bar": toJSON(array)} -{"bar": toJSON(i)}.i64?.i64 -{"bar": toJSON(i32)} -{"bar": true, "bar": false}.Bar -{"bar": true, "bar": foo}?.String -{"bar": true, "foo": 0.5}?.i -{"bar": true, "foo": div}.score -{"bar": true, "foo": foo}.div +{"bar": string(0.5)} +{"bar": string(i64)} +{"bar": string(ok)} +{"bar": toJSON(list)} +{"bar": true == false} +{"bar": true, "bar": f64}?.score +{"bar": true, "bar": i32}.array +{"bar": true, "foo": nil}?.f32 {"bar": true}.Bar -{"bar": true}.Qux?.greet() -{"bar": true}.f32 -{"bar": true}.f64 +{"bar": true}.Qux +{"bar": true}.String +{"bar": true}.div {"bar": true}.half -{"bar": true}.i -{"bar": true}.list?.String() -{"bar": true}.score +{"bar": true}.i32 {"bar": true}?.Bar +{"bar": true}?.add +{"bar": true}?.array +{"bar": true}?.div +{"bar": true}?.half +{"bar": true}?.i32 {"bar": true}?.i64 -{"bar": true}?.list -{"bar": type(f64)} -{"bar": type(greet)} -{"bar": {"foo": "bar", "bar": "bar", "bar": nil}} -{"foo": "bar", "bar": i32}.half -{"foo": "bar", "bar": nil}?.add?.i64 +{"bar": type(greet)}.Bar +{"bar": type(half)} +{"bar": type(score)} +{"foo": !ok} +{"foo": "bar" < "bar"} +{"foo": "bar" > "bar"} +{"foo": "bar", "bar": list}.div +{"foo": "bar", "bar": nil}.f64 +{"foo": "bar", "foo": 0.5}?.add +{"foo": "bar", "foo": 0.5}?.list +{"foo": "bar", "foo": array}?.f64?.list() +{"foo": "bar", "foo": list}.list {"foo": "bar"}.Bar {"foo": "bar"}.Qux {"foo": "bar"}.String -{"foo": "bar"}.array -{"foo": "bar"}.f64 +{"foo": "bar"}.foo {"foo": "bar"}.half {"foo": "bar"}.i {"foo": "bar"}.i64 -{"foo": "bar"}.list -{"foo": "bar"}.ok +{"foo": "bar"}?.Bar +{"foo": "bar"}?.String {"foo": "bar"}?.add -{"foo": "bar"}?.div?.ok +{"foo": "bar"}?.array +{"foo": "bar"}?.div +{"foo": "bar"}?.f32 {"foo": "bar"}?.f64 {"foo": "bar"}?.foo {"foo": "bar"}?.half -{"foo": "foo" != "bar"} -{"foo": "foo", "bar": nil}?.String -{"foo": "foo", "foo": add, "foo": "foo"}?.i -{"foo": "foo", "foo": div}.i64 -{"foo": "foo", "foo": greet}.array -{"foo": "foo", "foo": i, "bar": greet}?.score -{"foo": "foo", "foo": i32, "bar": f32}.greet -{"foo": "foo", "foo": i}?.foo -{"foo": "foo", "foo": list}.f32 -{"foo": "foo"}.Bar -{"foo": "foo"}.array +{"foo": "bar"}?.i32 +{"foo": "bar"}?.score +{"foo": "foo" <= "foo"} +{"foo": "foo" endsWith "foo"} +{"foo": "foo", "bar": false}.greet +{"foo": "foo", "bar": half}?.String +{"foo": "foo", "bar": list, "bar": div}?.String +{"foo": "foo", "foo": add}?.f32 +{"foo": "foo"}.Qux +{"foo": "foo"}.div {"foo": "foo"}.f32 -{"foo": "foo"}.foo -{"foo": "foo"}.greet -{"foo": "foo"}.i64 -{"foo": "foo"}?.Bar -{"foo": "foo"}?.add +{"foo": "foo"}.i +{"foo": "foo"}.i32 +{"foo": "foo"}.list {"foo": "foo"}?.div -{"foo": "foo"}?.greet -{"foo": "foo"}?.half +{"foo": "foo"}?.f32 +{"foo": "foo"}?.foo +{"foo": "foo"}?.i +{"foo": "foo"}?.i32 {"foo": "foo"}?.score +{"foo": -0.5} {"foo": -1} +{"foo": -f64} {"foo": -i64} -{"foo": -i} -{"foo": 0.5 ** i64} -{"foo": 0.5 - 0.5} +{"foo": 0.5 != 0.5} +{"foo": 0.5 ** f64} +{"foo": 0.5 < i64}.div {"foo": 0.5 <= 0.5} -{"foo": 0.5 > i64} -{"foo": 0.5, "bar": 1}.half -{"foo": 0.5, "bar": add}.Bar -{"foo": 0.5, "bar": div}.array -{"foo": 0.5, "bar": i32}?.String -{"foo": 0.5, "bar": score, "foo": score}.half -{"foo": 0.5, "foo": 1, "foo": list}.div -{"foo": 0.5, "foo": nil}?.div -{"foo": 0.5, "foo": nil}?.i64 -{"foo": 0.5}.Bar -{"foo": 0.5}.Qux +{"foo": 0.5, "bar": 0.5}.String +{"foo": 0.5, "bar": 0.5}.foo +{"foo": 0.5, "bar": 0.5}?.score +{"foo": 0.5, "bar": 1}?.div +{"foo": 0.5, "bar": i64}.i32 +{"foo": 0.5, "bar": list}?.i64 +{"foo": 0.5, "foo": 1}.Qux +{"foo": 0.5, "foo": array}.i64 +{"foo": 0.5, "foo": f64}.i +{"foo": 0.5, "foo": false, "bar": list}.add +{"foo": 0.5, "foo": greet}.i32 +{"foo": 0.5, "foo": score}.foo +{"foo": 0.5}.Qux?.half +{"foo": 0.5}.String +{"foo": 0.5}.add {"foo": 0.5}.array +{"foo": 0.5}.div {"foo": 0.5}.f32 -{"foo": 0.5}.f64 -{"foo": 0.5}.greet {"foo": 0.5}.half -{"foo": 0.5}.i {"foo": 0.5}.i64 {"foo": 0.5}.list -{"foo": 0.5}.ok -{"foo": 0.5}?.Bar?.i +{"foo": 0.5}.score +{"foo": 0.5}?.Bar {"foo": 0.5}?.String -{"foo": 0.5}?.add -{"foo": 0.5}?.array -{"foo": 0.5}?.array?.score -{"foo": 0.5}?.foo -{"foo": 0.5}?.greet +{"foo": 0.5}?.div +{"foo": 0.5}?.f32 +{"foo": 0.5}?.f64 {"foo": 0.5}?.half -{"foo": 0.5}?.i64 +{"foo": 0.5}?.i +{"foo": 0.5}?.list {"foo": 0.5}?.ok -{"foo": 1 + 0.5} -{"foo": 1 / 0.5} {"foo": 1 / i64} -{"foo": 1 < i32}?.i64 -{"foo": 1 not in array} -{"foo": 1, "bar": 0.5}.array -{"foo": 1, "bar": div}.f32 -{"foo": 1, "bar": f32}.Qux?.half?.list -{"foo": 1, "bar": i64, "foo": 0.5}.list -{"foo": 1, "bar": i64}?.ok -{"foo": 1, "bar": score}.foo -{"foo": 1, "foo": 0.5}.f32 -{"foo": 1, "foo": array}?.array -{"foo": 1, "foo": ok}.add -{"foo": 1, "foo": true}?.Qux +{"foo": 1 == f32} +{"foo": 1, "bar": nil}?.add +{"foo": 1, "bar": score}.greet +{"foo": 1, "foo": 1}.f64 +{"foo": 1, "foo": f64}.i +{"foo": 1, "foo": false}?.f32 +{"foo": 1, "foo": half}?.f32 +{"foo": 1, "foo": ok}.Bar +{"foo": 1, "foo": ok}.f32 +{"foo": 1, "foo": ok}.i32 +{"foo": 1, "foo": score}.half +{"foo": 1}.Bar {"foo": 1}.add +{"foo": 1}.div {"foo": 1}.f32 +{"foo": 1}.f64 {"foo": 1}.foo {"foo": 1}.greet {"foo": 1}.half +{"foo": 1}.i {"foo": 1}.i64 {"foo": 1}.list -{"foo": 1}.ok -{"foo": 1}?.Bar +{"foo": 1}?.String {"foo": 1}?.add -{"foo": 1}?.div -{"foo": 1}?.f32 -{"foo": 1}?.foo +{"foo": 1}?.f64 {"foo": 1}?.greet {"foo": 1}?.half -{"foo": 1}?.i -{"foo": 1}?.i32 -{"foo": 1}?.score -{"foo": abs(0.5)} -{"foo": add, "bar": 0.5}.i -{"foo": add, "bar": nil}.score -{"foo": add, "bar": ok} -{"foo": add, "bar": score}.half -{"foo": add, "foo": "bar"}?.String -{"foo": add, "foo": half, "foo": div}?.greet -{"foo": add, "foo": i32}.foo -{"foo": add, "foo": nil}?.list +{"foo": 1}?.list +{"foo": 1}?.ok +{"foo": abs(i64)} +{"foo": add, "bar": half} +{"foo": add, "bar": nil}.i +{"foo": add, "bar": nil}?.i +{"foo": add, "bar": ok, "foo": array}?.i32 +{"foo": add, "foo": 1, "bar": i32}.add +{"foo": add, "foo": array}?.f32 +{"foo": add, "foo": foo}?.i64 +{"foo": add, "foo": half} +{"foo": add, "foo": score, "bar": i32}.list {"foo": add} -{"foo": add}.Bar +{"foo": add}.array {"foo": add}.div +{"foo": add}.f32 {"foo": add}.foo {"foo": add}.half {"foo": add}.i -{"foo": add}.i64 +{"foo": add}.i32 +{"foo": add}.i?.score {"foo": add}.list -{"foo": add}.ok +{"foo": add}?.Bar +{"foo": add}?.Qux {"foo": add}?.String -{"foo": add}?.array {"foo": add}?.div +{"foo": add}?.f32 +{"foo": add}?.foo {"foo": add}?.greet {"foo": add}?.half -{"foo": add}?.i32 -{"foo": add}?.ok -{"foo": array, "bar": "foo"}?.f32 -{"foo": array, "bar": f64} -{"foo": array, "bar": greet} -{"foo": array, "bar": list}?.f32 -{"foo": array, "bar": ok} -{"foo": array, "foo": add} -{"foo": array, "foo": greet} -{"foo": array, "foo": true}?.i +{"foo": add}?.i +{"foo": add}?.i64 +{"foo": add}?.score +{"foo": array, "bar": "bar"}.add +{"foo": array, "bar": 0.5}?.div +{"foo": array, "bar": add}.ok +{"foo": array, "bar": array}.f32 +{"foo": array, "bar": i64}?.add +{"foo": array, "bar": list} +{"foo": array, "bar": nil}.half +{"foo": array, "bar": ok, "bar": i} +{"foo": array, "foo": "foo"}.array +{"foo": array, "foo": array} +{"foo": array, "foo": f32, "foo": half}.ok +{"foo": array, "foo": f64} +{"foo": array, "foo": list} {"foo": array} +{"foo": array}.Bar {"foo": array}.Qux -{"foo": array}.Qux?.String -{"foo": array}.String -{"foo": array}.f64 +{"foo": array}.f32 +{"foo": array}.foo {"foo": array}.greet +{"foo": array}.i {"foo": array}.i32 -{"foo": array}.ok -{"foo": array}?.Bar -{"foo": array}?.String +{"foo": array}.i64 +{"foo": array}.score +{"foo": array}?.Qux {"foo": array}?.add {"foo": array}?.array -{"foo": array}?.div -{"foo": array}?.f64 -{"foo": array}?.half +{"foo": array}?.greet +{"foo": array}?.i64?.add +{"foo": array}?.list {"foo": array}?.ok -{"foo": div, "bar": 1}?.add -{"foo": div, "bar": add} -{"foo": div, "bar": div} -{"foo": div, "bar": half}.half -{"foo": div, "bar": list, "bar": 0.5}?.Qux -{"foo": div, "foo": array}.Bar -{"foo": div, "foo": true}?.Qux +{"foo": div, "bar": "foo"}.array +{"foo": div, "bar": array} +{"foo": div, "bar": foo, "foo": true}?.i64 +{"foo": div, "bar": half} +{"foo": div, "bar": i64} +{"foo": div, "foo": array} +{"foo": div, "foo": f32} +{"foo": div, "foo": greet}?.i64 {"foo": div} {"foo": div}.Qux {"foo": div}.array {"foo": div}.div -{"foo": div}.foo -{"foo": div}.greet +{"foo": div}.f32 +{"foo": div}.greet?.i +{"foo": div}.i32 +{"foo": div}.i64 {"foo": div}?.Bar {"foo": div}?.Qux {"foo": div}?.String -{"foo": div}?.add -{"foo": div}?.f64 +{"foo": div}?.div +{"foo": div}?.greet {"foo": div}?.half -{"foo": div}?.i +{"foo": div}?.i32 {"foo": div}?.i64 {"foo": div}?.list -{"foo": div}?.ok -{"foo": f32 != i} -{"foo": f32 - f32} -{"foo": f32 == 0.5} -{"foo": f32, "bar": "bar"}?.String -{"foo": f32, "bar": 0.5}.f32 -{"foo": f32, "bar": i32} -{"foo": f32, "bar": list} -{"foo": f32, "foo": 1, "foo": i32}?.i32 -{"foo": f32, "foo": div} -{"foo": f32, "foo": i} -{"foo": f32, "foo": ok}?.i -{"foo": f32, "foo": type("bar")} +{"foo": div}?.score +{"foo": f32 > 1} +{"foo": f32 >= 1} +{"foo": f32, "bar": 0.5}.list +{"foo": f32, "bar": div} +{"foo": f32, "bar": f32} +{"foo": f32, "bar": f64} +{"foo": f32, "bar": greet}.greet +{"foo": f32, "bar": half} +{"foo": f32, "bar": ok}?.add +{"foo": f32, "bar": score}?.i64 +{"foo": f32, "foo": "foo"}.ok +{"foo": f32, "foo": add}?.half?.f64() +{"foo": f32, "foo": foo}?.half {"foo": f32} -{"foo": f32}.String +{"foo": f32}.Qux {"foo": f32}.add -{"foo": f32}.array {"foo": f32}.f32 {"foo": f32}.foo {"foo": f32}.greet {"foo": f32}.half {"foo": f32}.i {"foo": f32}.i32 +{"foo": f32}.i64 {"foo": f32}.list +{"foo": f32}.score?.greet {"foo": f32}?.Bar -{"foo": f32}?.Qux -{"foo": f32}?.add -{"foo": f32}?.f32 -{"foo": f32}?.f64 -{"foo": f32}?.half -{"foo": f32}?.i32 -{"foo": f32}?.score -{"foo": f64 * i} -{"foo": f64 / 1} -{"foo": f64 == 0.5} -{"foo": f64 >= 1} -{"foo": f64 ^ f32} -{"foo": f64, "bar": "foo"}.Qux -{"foo": f64, "bar": "foo"}.add -{"foo": f64, "bar": 0.5}.div -{"foo": f64, "bar": div} -{"foo": f64, "bar": greet} -{"foo": f64, "bar": half}?.list -{"foo": f64, "bar": ok}.half -{"foo": f64, "foo": foo, "bar": greet}.String -{"foo": f64, "foo": foo, "foo": "foo"}.Bar -{"foo": f64, "foo": greet} -{"foo": f64, "foo": ok, "foo": i64}?.f64 +{"foo": f32}?.String +{"foo": f32}?.array +{"foo": f32}?.f64?.i +{"foo": f32}?.i +{"foo": f32}?.ok +{"foo": f64 < f64} +{"foo": f64 > f32} +{"foo": f64 >= 0.5} +{"foo": f64 >= f32} +{"foo": f64 in array} +{"foo": f64, "bar": 0.5}.greet +{"foo": f64, "bar": add, "foo": greet}.Bar +{"foo": f64, "bar": list}.i64 +{"foo": f64, "bar": sum(array)} +{"foo": f64, "bar": true}?.greet +{"foo": f64, "foo": list, "foo": i}?.add {"foo": f64} +{"foo": f64}.Bar {"foo": f64}.Qux -{"foo": f64}.String?.f32 -{"foo": f64}.String?.i64 -{"foo": f64}.add -{"foo": f64}.array +{"foo": f64}.div +{"foo": f64}.f32 {"foo": f64}.f64 -{"foo": f64}.foo {"foo": f64}.greet -{"foo": f64}.i +{"foo": f64}.i32 {"foo": f64}.list -{"foo": f64}?.Bar +{"foo": f64}.ok {"foo": f64}?.String -{"foo": f64}?.div {"foo": f64}?.f32 {"foo": f64}?.f64 {"foo": f64}?.foo {"foo": f64}?.greet -{"foo": f64}?.i +{"foo": f64}?.i32 +{"foo": f64}?.i64 {"foo": f64}?.ok -{"foo": false, "foo": greet}?.add -{"foo": false, "foo": ok}.score -{"foo": false}.Bar +{"foo": f64}?.ok?.ok +{"foo": f64}?.score +{"foo": false or false}.array +{"foo": false, "bar": 0.5, "foo": add}.score +{"foo": false, "foo": foo, "bar": half}.array +{"foo": false, "foo": score, "foo": nil}?.div +{"foo": false, "foo": true}?.i32 {"foo": false}.array -{"foo": false}.div -{"foo": false}.half {"foo": false}.i -{"foo": false}?.array +{"foo": false}.ok {"foo": false}?.f32 {"foo": false}?.f64 -{"foo": false}?.foo -{"foo": false}?.i64 {"foo": false}?.list -{"foo": foo, "bar": add, "foo": foo}.Bar -{"foo": foo, "bar": ok, "foo": array}.String -{"foo": foo, "foo": foo} -{"foo": foo, "foo": list, "foo": greet}.i -{"foo": foo, "foo": nil}?.f32 -{"foo": foo, "foo": true}?.array +{"foo": foo == nil} +{"foo": foo, "bar": div} +{"foo": foo, "bar": foo} +{"foo": foo, "bar": ok}.i32 +{"foo": foo, "bar": {"foo": 1}} +{"foo": foo, "foo": add} +{"foo": foo, "foo": half} +{"foo": foo, "foo": i} +{"foo": foo, "foo": ok} +{"foo": foo, "foo": score, "foo": f64}.i +{"foo": foo.Bar} +{"foo": foo.String, "bar": foo} +{"foo": foo.String} +{"foo": foo?.Bar} {"foo": foo?.Qux} +{"foo": foo?.String()} +{"foo": foo?.String} {"foo": foo} -{"foo": foo}.div -{"foo": foo}.f64 +{"foo": foo}.Bar?.Bar +{"foo": foo}.Qux +{"foo": foo}.String +{"foo": foo}.String?.String +{"foo": foo}.f32 {"foo": foo}.greet -{"foo": foo}.list -{"foo": foo}.ok -{"foo": foo}.score -{"foo": foo}?.String +{"foo": foo}.half +{"foo": foo}.i64 +{"foo": foo}?.Qux +{"foo": foo}?.add {"foo": foo}?.array -{"foo": foo}?.div -{"foo": foo}?.f32 -{"foo": foo}?.foo +{"foo": foo}?.array?.Bar +{"foo": foo}?.f64 {"foo": foo}?.greet -{"foo": foo}?.half +{"foo": foo}?.i32 {"foo": foo}?.list {"foo": foo}?.ok -{"foo": get(array, i32)}?.i64 -{"foo": greet, "bar": 0.5, "bar": "foo"}?.half -{"foo": greet, "bar": 0.5}.Bar -{"foo": greet, "bar": f64} -{"foo": greet, "bar": f64}.list -{"foo": greet, "bar": i, "foo": foo}?.f32 -{"foo": greet, "foo": "bar", "foo": score}.i -{"foo": greet, "foo": f32} +{"foo": greet("foo")} +{"foo": greet, "bar": "bar"}?.i32 +{"foo": greet, "bar": i64} +{"foo": greet, "bar": i}.list +{"foo": greet, "foo": add}.String +{"foo": greet, "foo": nil}?.add {"foo": greet} +{"foo": greet}.Bar {"foo": greet}.Qux {"foo": greet}.String {"foo": greet}.add {"foo": greet}.array -{"foo": greet}.f32?.greet -{"foo": greet}.half?.greet +{"foo": greet}.f32 +{"foo": greet}.i +{"foo": greet}.i32 {"foo": greet}.i64 -{"foo": greet}.list +{"foo": greet}.i64?.greet {"foo": greet}.ok -{"foo": greet}?.add +{"foo": greet}.score +{"foo": greet}?.Qux {"foo": greet}?.array +{"foo": greet}?.div {"foo": greet}?.f32 -{"foo": greet}?.half +{"foo": greet}?.f64 {"foo": greet}?.i32 {"foo": greet}?.i64 {"foo": greet}?.list +{"foo": greet}?.ok {"foo": greet}?.score -{"foo": half(0.5)} -{"foo": half(f64)} -{"foo": half, "bar": 1}?.half -{"foo": half, "bar": add}?.foo -{"foo": half, "bar": f32}.i32 -{"foo": half, "bar": foo} -{"foo": half, "bar": half} -{"foo": half, "bar": i64, "bar": i32}.foo -{"foo": half, "bar": i64} -{"foo": half, "bar": nil}?.ok -{"foo": half, "foo": 1}?.ok -{"foo": half, "foo": div} -{"foo": half, "foo": greet, "bar": f32}?.add -{"foo": half, "foo": true}.f64 +{"foo": groupBy(array, 1)} +{"foo": groupBy(list, #)} +{"foo": half, "bar": "foo"}?.half +{"foo": half, "bar": add, "foo": true}?.array +{"foo": half, "bar": array}.half +{"foo": half, "bar": greet}?.half +{"foo": half, "bar": half}?.i +{"foo": half, "bar": list, "foo": 1}?.f64 +{"foo": half, "bar": list} +{"foo": half, "bar": true}?.Qux +{"foo": half, "foo": 1}?.i32 +{"foo": half, "foo": div, "foo": array}?.i32 +{"foo": half, "foo": f64} +{"foo": half, "foo": list, "foo": half}.half +{"foo": half, "foo": score, "foo": list}.String {"foo": half} {"foo": half}.Bar {"foo": half}.String +{"foo": half}.add {"foo": half}.div -{"foo": half}.f64 -{"foo": half}.greet +{"foo": half}.f32 +{"foo": half}.foo {"foo": half}.half {"foo": half}.i -{"foo": half}.i32 +{"foo": half}.i64 {"foo": half}.ok +{"foo": half}.score {"foo": half}?.Bar {"foo": half}?.Qux -{"foo": half}?.add -{"foo": half}?.f64 +{"foo": half}?.String +{"foo": half}?.div +{"foo": half}?.f32 {"foo": half}?.foo -{"foo": half}?.greet -{"foo": half}?.half -{"foo": half}?.list +{"foo": half}?.i32 +{"foo": half}?.i64 {"foo": half}?.score -{"foo": hasPrefix("bar", "foo")} -{"foo": i < f64} -{"foo": i > 0.5} -{"foo": i, "bar": score} -{"foo": i, "foo": i}.i64 -{"foo": i, "foo": ok} -{"foo": i, "foo": ok}?.ok -{"foo": i32, "bar": 0.5, "foo": array}.Bar -{"foo": i32, "bar": i32}.i64 -{"foo": i32, "bar": nil}?.i64 -{"foo": i32, "foo": 0.5}.i -{"foo": i32, "foo": add} -{"foo": i32, "foo": div, "foo": nil}.Bar -{"foo": i32, "foo": foo} -{"foo": i32, "foo": greet}?.foo -{"foo": i32, "foo": i32}?.score -{"foo": i32, "foo": ok, "bar": true}.f32 -{"foo": i32, "foo": ok}?.i32 +{"foo": i != 1} +{"foo": i - f64} +{"foo": i / 1} +{"foo": i ^ 1} +{"foo": i, "bar": 0.5}?.half +{"foo": i, "bar": f32} +{"foo": i, "bar": foo} +{"foo": i, "bar": list}.foo +{"foo": i, "foo": "bar"}?.div?.f32 +{"foo": i, "foo": 1}.list +{"foo": i, "foo": 1}?.list +{"foo": i, "foo": add} +{"foo": i, "foo": array, "bar": 0.5}?.f32 +{"foo": i, "foo": half}?.list +{"foo": i, "foo": score} +{"foo": i, "foo": score}?.f32 +{"foo": i32 != i} +{"foo": i32 * 0.5} +{"foo": i32 + 1} +{"foo": i32 - f32}.foo +{"foo": i32 - f64} +{"foo": i32 / 1} +{"foo": i32 < 1} +{"foo": i32, "bar": 0.5, "bar": foo}.i64 +{"foo": i32, "bar": foo}?.score +{"foo": i32, "bar": nil}?.ok +{"foo": i32, "foo": false, "bar": f32}?.foo +{"foo": i32, "foo": greet}?.greet {"foo": i32} -{"foo": i32}.Bar -{"foo": i32}.Qux -{"foo": i32}.i64 -{"foo": i32}.list +{"foo": i32}.i {"foo": i32}.ok -{"foo": i32}.score {"foo": i32}?.Bar -{"foo": i32}?.Qux +{"foo": i32}?.String {"foo": i32}?.add -{"foo": i32}?.div {"foo": i32}?.f32 -{"foo": i32}?.greet -{"foo": i32}?.half +{"foo": i32}?.f64 {"foo": i32}?.i +{"foo": i32}?.i32 {"foo": i32}?.i64 +{"foo": i32}?.list {"foo": i32}?.score -{"foo": i64 * f64, "foo": i64} -{"foo": i64 <= 0.5} -{"foo": i64 ^ i32} -{"foo": i64, "bar": "bar"}.Qux -{"foo": i64, "bar": array}.add -{"foo": i64, "bar": div} -{"foo": i64, "bar": f64, "bar": greet}.f32 -{"foo": i64, "bar": list} -{"foo": i64, "foo": 0.5, "bar": 0.5}.half -{"foo": i64, "foo": div} -{"foo": i64, "foo": i32} +{"foo": i64 % 1} +{"foo": i64 * f32} +{"foo": i64 .. i64} +{"foo": i64, "bar": array} +{"foo": i64, "foo": array}.f32 +{"foo": i64, "foo": f32} +{"foo": i64, "foo": i32}?.foo +{"foo": i64, "foo": i64, "bar": f64}.foo +{"foo": i64, "foo": i64} +{"foo": i64, "foo": i64}.greet +{"foo": i64, "foo": i64}?.foo {"foo": i64} -{"foo": i64}.Qux -{"foo": i64}.add +{"foo": i64}.Bar {"foo": i64}.array +{"foo": i64}.div +{"foo": i64}.foo +{"foo": i64}.greet +{"foo": i64}.half +{"foo": i64}.i +{"foo": i64}.i32 +{"foo": i64}.list {"foo": i64}?.Qux -{"foo": i64}?.String +{"foo": i64}?.add +{"foo": i64}?.array {"foo": i64}?.f32 -{"foo": i64}?.foo -{"foo": i64}?.greet +{"foo": i64}?.f64 +{"foo": i64}?.half {"foo": i64}?.i32 -{"foo": i64}?.list -{"foo": i64}?.score +{"foo": i64}?.i32?.f32 +{"foo": i64}?.i64 +{"foo": i64}?.score?.list +{"foo": int(i)} +{"foo": int(i32)} +{"foo": int(i64)} {"foo": i} {"foo": i}.Bar {"foo": i}.String -{"foo": i}.div -{"foo": i}.foo +{"foo": i}.add +{"foo": i}.array +{"foo": i}.f64 {"foo": i}.greet -{"foo": i}.i32?.add +{"foo": i}.i {"foo": i}.ok -{"foo": i}.score -{"foo": i}?.Bar -{"foo": i}?.array {"foo": i}?.div -{"foo": i}?.f64 -{"foo": i}?.foo -{"foo": i}?.half +{"foo": i}?.greet +{"foo": i}?.i +{"foo": i}?.i32 {"foo": i}?.i64 {"foo": i}?.score -{"foo": list == list}.f32 -{"foo": list, "bar": f32, "foo": i32}.i32 -{"foo": list, "bar": foo}?.list -{"foo": list, "bar": i64} -{"foo": list, "bar": score} -{"foo": list, "foo": score} +{"foo": last(list)} +{"foo": len(list)} +{"foo": list, "bar": add} +{"foo": list, "bar": all(list, false)} +{"foo": list, "bar": array} +{"foo": list, "bar": f32}.f64 +{"foo": list, "bar": half} +{"foo": list, "bar": i32, "bar": score}.array +{"foo": list, "bar": true}?.foo {"foo": list} -{"foo": list}.Bar +{"foo": list}.Qux {"foo": list}.String {"foo": list}.add {"foo": list}.div -{"foo": list}.foo +{"foo": list}.f32 +{"foo": list}.greet {"foo": list}.half +{"foo": list}.i {"foo": list}.i32 -{"foo": list}.score -{"foo": list}?.add +{"foo": list}?.String {"foo": list}?.div +{"foo": list}?.f32 +{"foo": list}?.foo {"foo": list}?.i +{"foo": list}?.i32 {"foo": list}?.i64 {"foo": list}?.ok +{"foo": list}?.score {"foo": map(array, #)} -{"foo": map(array, 0.5)} -{"foo": map(array, foo)} -{"foo": map(array, ok), "bar": i32} -{"foo": map(list, 0.5)} -{"foo": map(list, score)} -{"foo": min(0.5)} -{"foo": min(1)}?.f32 -{"foo": nil == 0.5} -{"foo": nil, "bar": 0.5}.score -{"foo": nil, "bar": add}?.array -{"foo": nil, "bar": div}.Bar -{"foo": nil, "bar": f64, "foo": div}.i32 -{"foo": nil, "bar": greet}?.add -{"foo": nil, "bar": i64}?.i64 -{"foo": nil, "bar": list}?.i32 -{"foo": nil, "foo": "foo"}.add -{"foo": nil, "foo": 1}.score -{"foo": nil, "foo": false}?.add -{"foo": nil, "foo": i64}.add -{"foo": nil}.Bar -{"foo": nil}.Qux -{"foo": nil}.String -{"foo": nil}.array +{"foo": map(array, i64)} +{"foo": nil, "bar": 0.5}.ok +{"foo": nil, "bar": add, "bar": f32}?.list +{"foo": nil, "bar": div, "bar": 1}.i64 +{"foo": nil, "bar": f32}.score +{"foo": nil, "bar": foo}?.String +{"foo": nil, "bar": score}?.ok?.div +{"foo": nil, "foo": "foo"}.Bar +{"foo": nil, "foo": greet}.String +{"foo": nil, "foo": half}.f64 +{"foo": nil, "foo": i64, "bar": f64}?.list +{"foo": nil, "foo": i}.div +{"foo": nil, "foo": list}.add +{"foo": nil, "foo": list}?.array +{"foo": nil, "foo": nil}.ok +{"foo": nil}.array?.half() {"foo": nil}.div {"foo": nil}.f32 {"foo": nil}.f64 -{"foo": nil}.greet?.i() -{"foo": nil}.greet?.i32 {"foo": nil}.half {"foo": nil}.i -{"foo": nil}.i64 +{"foo": nil}.i32 +{"foo": nil}.i64?.Bar() {"foo": nil}.list +{"foo": nil}.ok +{"foo": nil}.score {"foo": nil}?.Bar -{"foo": nil}?.Qux -{"foo": nil}?.String +{"foo": nil}?.Bar?.score +{"foo": nil}?.add {"foo": nil}?.array -{"foo": nil}?.div -{"foo": nil}?.f32?.ok -{"foo": nil}?.greet +{"foo": nil}?.f64 +{"foo": nil}?.foo +{"foo": nil}?.half {"foo": nil}?.i32 -{"foo": nil}?.i?.half +{"foo": nil}?.i64 {"foo": nil}?.list -{"foo": nil}?.list?.greet() -{"foo": nil}?.score -{"foo": not false} -{"foo": not ok} -{"foo": ok && ok} -{"foo": ok == nil} -{"foo": ok ? true : div} +{"foo": ok == false} +{"foo": ok, "bar": "foo"}?.i64 +{"foo": ok, "bar": add}.String {"foo": ok, "bar": f32} -{"foo": ok, "bar": i, "foo": greet}.i32 -{"foo": ok, "bar": i32} -{"foo": ok, "foo": 0.5}?.array -{"foo": ok, "foo": 1}.Qux -{"foo": ok, "foo": half, "bar": div}.score -{"foo": ok, "foo": i64} -{"foo": ok, "foo": i64}.i -{"foo": ok, "foo": nil}?.add +{"foo": ok, "foo": half}.ok +{"foo": ok, "foo": list} {"foo": ok} {"foo": ok}.Bar -{"foo": ok}.add +{"foo": ok}.Bar?.i +{"foo": ok}.String +{"foo": ok}.array {"foo": ok}.div {"foo": ok}.f64 -{"foo": ok}.greet -{"foo": ok}.i -{"foo": ok}.score +{"foo": ok}.foo +{"foo": ok}.i32 +{"foo": ok}.i64 +{"foo": ok}.ok {"foo": ok}?.Qux {"foo": ok}?.String -{"foo": ok}?.div +{"foo": ok}?.String?.Bar +{"foo": ok}?.array {"foo": ok}?.f32 +{"foo": ok}?.foo {"foo": ok}?.greet -{"foo": ok}?.half?.half +{"foo": ok}?.half {"foo": ok}?.i32 {"foo": ok}?.i64 {"foo": ok}?.list -{"foo": score(1)} -{"foo": score, "bar": 0.5}.list -{"foo": score, "bar": 1 ^ 1} -{"foo": score, "bar": i32} -{"foo": score, "bar": i64} -{"foo": score, "foo": 0.5}.add -{"foo": score, "foo": 1}?.div -{"foo": score, "foo": add, "bar": ok} -{"foo": score, "foo": f32, "bar": false}.div -{"foo": score, "foo": f32}?.i32 -{"foo": score, "foo": i}?.f32 -{"foo": score} -{"foo": score}.Bar -{"foo": score}.array -{"foo": score}.list -{"foo": score}?.Bar -{"foo": score}?.String -{"foo": score}?.add -{"foo": score}?.f32 -{"foo": score}?.greet -{"foo": score}?.half -{"foo": score}?.i -{"foo": score}?.list -{"foo": score}?.score -{"foo": string(i32)} -{"foo": string(list)} -{"foo": toBase64("bar")} -{"foo": toJSON(f32)} -{"foo": toJSON(i64)}?.i32 -{"foo": toJSON(nil)} -{"foo": true, "bar": false}?.array -{"foo": true, "bar": nil}?.div -{"foo": true, "bar": true}.f64 -{"foo": true, "foo": array, "bar": i32}?.ok -{"foo": true, "foo": i32}.i64 -{"foo": true, "foo": ok, "foo": add}.foo -{"foo": true}.String -{"foo": true}.f32 -{"foo": true}.foo -{"foo": true}.i -{"foo": true}.i64 -{"foo": true}?.String -{"foo": true}?.greet -{"foo": true}?.i32 -{"foo": type(1)} -{"foo": type(list)} -{"foo": type(nil)} -{"foo": type(ok)} +{"foo": reduce(array, "foo")} +{"foo": reduce(array, #)} +{"foo": reduce(list, #).String()} +{"foo": reduce(list, #)} +{"foo": reduce(list, #)}?.list +{"foo": score, "bar": add}.add +{"foo": score, "bar": div} +{"foo": score, "bar": f64} +{"foo": score, "bar": false}?.array +{"foo": score, "bar": false}?.i +{"foo": score, "bar": true}.div?.i +{"foo": score, "foo": 0.5}?.String +{"foo": score, "foo": 1}.array +{"foo": score, "foo": add} +{"foo": score, "foo": array}.array +{"foo": score, "foo": f32} +{"foo": score, "foo": greet} From dd925fd96f531a15ef9e0abddfc81fe532a67156 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 30 Dec 2023 12:49:43 +0100 Subject: [PATCH 234/506] Add mem grow to builtin (#505) * Add mem grow to builtin * Add OpValidateArgs opcode --- builtin/builtin.go | 24 ++++++++++++++---------- builtin/builtin_test.go | 23 ++++++++++++++++++++--- compiler/compiler.go | 26 ++++++++++++++++---------- vm/opcodes.go | 1 + vm/program.go | 5 ++++- vm/vm.go | 8 ++++++++ 6 files changed, 63 insertions(+), 24 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 2417446da..cd943bd0b 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -13,12 +13,13 @@ import ( ) type Function struct { - Name string - Func func(args ...any) (any, error) - Fast func(arg any) any - Types []reflect.Type - Validate func(args []reflect.Type) (reflect.Type, error) - Predicate bool + Name string + Func func(args ...any) (any, error) + Fast func(arg any) any + ValidateArgs func(args ...any) (any, error) + Types []reflect.Type + Validate func(args []reflect.Type) (reflect.Type, error) + Predicate bool } var ( @@ -325,12 +326,15 @@ var Builtins = []*Function{ }, { Name: "repeat", - Func: func(args ...any) (any, error) { + ValidateArgs: func(args ...any) (any, error) { n := runtime.ToInt(args[1]) - if n > 1e6 { - panic("memory budget exceeded") + if n < 0 { + panic(fmt.Errorf("invalid argument for repeat (expected positive integer, got %d)", n)) } - return strings.Repeat(args[0].(string), n), nil + return uint(n), nil + }, + Func: func(args ...any) (any, error) { + return strings.Repeat(args[0].(string), runtime.ToInt(args[1])), nil }, Types: types(strings.Repeat), }, diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index a861d0faa..23273a246 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -260,9 +260,26 @@ func TestBuiltin_memory_limits(t *testing.T) { for _, test := range tests { t.Run(test.input, func(t *testing.T) { - _, err := expr.Eval(test.input, nil) - assert.Error(t, err) - assert.Contains(t, err.Error(), "memory budget exceeded") + timeout := make(chan bool, 1) + go func() { + time.Sleep(time.Second) + timeout <- true + }() + + done := make(chan bool, 1) + go func() { + _, err := expr.Eval(test.input, nil) + assert.Error(t, err) + assert.Contains(t, err.Error(), "memory budget exceeded") + done <- true + }() + + select { + case <-done: + // Success. + case <-timeout: + t.Fatal("timeout") + } }) } } diff --git a/compiler/compiler.go b/compiler/compiler.go index f4bb3bd5d..1f1c00c92 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -147,31 +147,31 @@ func (c *compiler) addVariable(name string) int { func (c *compiler) emitFunction(fn *builtin.Function, argsLen int) { switch argsLen { case 0: - c.emit(OpCall0, c.addFunction(fn)) + c.emit(OpCall0, c.addFunction(fn.Name, fn.Func)) case 1: - c.emit(OpCall1, c.addFunction(fn)) + c.emit(OpCall1, c.addFunction(fn.Name, fn.Func)) case 2: - c.emit(OpCall2, c.addFunction(fn)) + c.emit(OpCall2, c.addFunction(fn.Name, fn.Func)) case 3: - c.emit(OpCall3, c.addFunction(fn)) + c.emit(OpCall3, c.addFunction(fn.Name, fn.Func)) default: - c.emit(OpLoadFunc, c.addFunction(fn)) + c.emit(OpLoadFunc, c.addFunction(fn.Name, fn.Func)) c.emit(OpCallN, argsLen) } } // addFunction adds builtin.Function.Func to the program.functions and returns its index. -func (c *compiler) addFunction(fn *builtin.Function) int { +func (c *compiler) addFunction(name string, fn Function) int { if fn == nil { panic("function is nil") } - if p, ok := c.functionsIndex[fn.Name]; ok { + if p, ok := c.functionsIndex[name]; ok { return p } p := len(c.functions) - c.functions = append(c.functions, fn.Func) - c.functionsIndex[fn.Name] = p - c.debugInfo[fmt.Sprintf("func_%d", p)] = fn.Name + c.functions = append(c.functions, fn) + c.functionsIndex[name] = p + c.debugInfo[fmt.Sprintf("func_%d", p)] = name return p } @@ -904,6 +904,12 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { for _, arg := range node.Arguments { c.compile(arg) } + + if f.ValidateArgs != nil { + c.emit(OpLoadFunc, c.addFunction("$_validate_args_"+f.Name, f.ValidateArgs)) + c.emit(OpValidateArgs, len(node.Arguments)) + } + if f.Fast != nil { c.emit(OpCallBuiltin1, id) } else if f.Func != nil { diff --git a/vm/opcodes.go b/vm/opcodes.go index 1106cd3f0..57b840507 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -60,6 +60,7 @@ const ( OpCallFast OpCallTyped OpCallBuiltin1 + OpValidateArgs OpArray OpMap OpLen diff --git a/vm/program.go b/vm/program.go index 27b8f6098..085b18a7f 100644 --- a/vm/program.go +++ b/vm/program.go @@ -137,7 +137,7 @@ func (program *Program) DisassembleWriter(w io.Writer) { constant("OpLoadMethod") case OpLoadFunc: - argument("OpLoadFunc") + argumentWithInfo("OpLoadFunc", "func") case OpLoadEnv: code("OpLoadEnv") @@ -278,6 +278,9 @@ func (program *Program) DisassembleWriter(w io.Writer) { case OpCallBuiltin1: builtinArg("OpCallBuiltin1") + case OpValidateArgs: + argument("OpValidateArgs") + case OpArray: code("OpArray") diff --git a/vm/vm.go b/vm/vm.go index 20e1594fd..fa2c75899 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -397,6 +397,14 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpCallBuiltin1: vm.push(builtin.Builtins[arg].Fast(vm.pop())) + case OpValidateArgs: + fn := vm.pop().(Function) + mem, err := fn(vm.stack[len(vm.stack)-arg:]...) + if err != nil { + panic(err) + } + vm.memGrow(mem.(uint)) + case OpArray: size := vm.pop().(int) vm.memGrow(uint(size)) From 09c0b343284ec523131e39ddebcd6c85c3db444b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 5 Jan 2024 22:36:41 +0100 Subject: [PATCH 235/506] Add heading ids --- docs/language-definition.md | 132 ++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/docs/language-definition.md b/docs/language-definition.md index d205edc6e..7574ff2f9 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -298,7 +298,7 @@ filter(tweets, len(.Content) > 240) ## String Functions -### trim(str[, chars]) +### trim(str[, chars]) {#trim} Removes white spaces from both ends of a string `str`. If the optional `chars` argument is given, it is a string specifying the set of characters to be removed. @@ -308,7 +308,7 @@ trim(" Hello ") == "Hello" trim("__Hello__", "_") == "Hello" ``` -### trimPrefix(str, prefix) +### trimPrefix(str, prefix) {#trimPrefix} Removes the specified prefix from the string `str` if it starts with that prefix. @@ -316,7 +316,7 @@ Removes the specified prefix from the string `str` if it starts with that prefix trimPrefix("HelloWorld", "Hello") == "World" ``` -### trimSuffix(str, suffix) +### trimSuffix(str, suffix) {#trimSuffix} Removes the specified suffix from the string `str` if it ends with that suffix. @@ -324,7 +324,7 @@ Removes the specified suffix from the string `str` if it ends with that suffix. trimSuffix("HelloWorld", "World") == "Hello" ``` -### upper(str) +### upper(str) {#upper} Converts all the characters in string `str` to uppercase. @@ -332,7 +332,7 @@ Converts all the characters in string `str` to uppercase. upper("hello") == "HELLO" ``` -### lower(str) +### lower(str) {#lower} Converts all the characters in string `str` to lowercase. @@ -340,7 +340,7 @@ Converts all the characters in string `str` to lowercase. lower("HELLO") == "hello" ``` -### split(str, delimiter[, n]) +### split(str, delimiter[, n]) {#split} Splits the string `str` at each instance of the delimiter and returns an array of substrings. @@ -349,7 +349,7 @@ split("apple,orange,grape", ",") == ["apple", "orange", "grape"] split("apple,orange,grape", ",", 2) == ["apple", "orange,grape"] ``` -### splitAfter(str, delimiter[, n]) +### splitAfter(str, delimiter[, n]) {#splitAfter} Splits the string `str` after each instance of the delimiter. @@ -358,7 +358,7 @@ splitAfter("apple,orange,grape", ",") == ["apple,", "orange,", "grape"] splitAfter("apple,orange,grape", ",", 2) == ["apple,", "orange,grape"] ``` -### replace(str, old, new) +### replace(str, old, new) {#replace} Replaces all occurrences of `old` in string `str` with `new`. @@ -366,7 +366,7 @@ Replaces all occurrences of `old` in string `str` with `new`. replace("Hello World", "World", "Universe") == "Hello Universe" ``` -### repeat(str, n) +### repeat(str, n) {#repeat} Repeats the string `str` `n` times. @@ -374,7 +374,7 @@ Repeats the string `str` `n` times. repeat("Hi", 3) == "HiHiHi" ``` -### indexOf(str, substring) +### indexOf(str, substring) {#indexOf} Returns the index of the first occurrence of the substring in string `str` or -1 if not found. @@ -382,7 +382,7 @@ Returns the index of the first occurrence of the substring in string `str` or -1 indexOf("apple pie", "pie") == 6 ``` -### lastIndexOf(str, substring) +### lastIndexOf(str, substring) {#lastIndexOf} Returns the index of the last occurrence of the substring in string `str` or -1 if not found. @@ -390,7 +390,7 @@ Returns the index of the last occurrence of the substring in string `str` or -1 lastIndexOf("apple pie apple", "apple") == 10 ``` -### hasPrefix(str, prefix) +### hasPrefix(str, prefix) {#hasPrefix} Returns `true` if string `str` starts with the given prefix. @@ -398,7 +398,7 @@ Returns `true` if string `str` starts with the given prefix. hasPrefix("HelloWorld", "Hello") == true ``` -### hasSuffix(str, suffix) +### hasSuffix(str, suffix) {#hasSuffix} Returns `true` if string `str` ends with the given suffix. @@ -427,7 +427,7 @@ And it is possible to compare dates: createdAt > now() - duration("1h") ``` -### now() +### now() {#now} Returns the current date as a [time.Time](https://pkg.go.dev/time#Time) value. @@ -435,7 +435,7 @@ Returns the current date as a [time.Time](https://pkg.go.dev/time#Time) value. now().Year() == 2024 ``` -### duration(str) +### duration(str) {#duration} Returns [time.Duration](https://pkg.go.dev/time#Duration) value of the given string `str`. @@ -445,7 +445,7 @@ Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". duration("1h").Seconds() == 3600 ``` -### date(str[, format[, timezone]]) +### date(str[, format[, timezone]]) {#date} Converts the given string `str` into a date representation. @@ -474,7 +474,7 @@ date("2023-08-14 00:00:00", "2006-01-02 15:04:05", "Europe/Zurich") ## Number Functions -### max(n1, n2) +### max(n1, n2) {#max} Returns the maximum of the two numbers `n1` and `n2`. @@ -482,7 +482,7 @@ Returns the maximum of the two numbers `n1` and `n2`. max(5, 7) == 7 ``` -### min(n1, n2) +### min(n1, n2) {#min} Returns the minimum of the two numbers `n1` and `n2`. @@ -490,7 +490,7 @@ Returns the minimum of the two numbers `n1` and `n2`. min(5, 7) == 5 ``` -### abs(n) +### abs(n) {#abs} Returns the absolute value of a number. @@ -498,7 +498,7 @@ Returns the absolute value of a number. abs(-5) == 5 ``` -### ceil(n) +### ceil(n) {#ceil} Returns the least integer value greater than or equal to x. @@ -506,7 +506,7 @@ Returns the least integer value greater than or equal to x. ceil(1.5) == 2.0 ``` -### floor(n) +### floor(n) {#floor} Returns the greatest integer value less than or equal to x. @@ -514,7 +514,7 @@ Returns the greatest integer value less than or equal to x. floor(1.5) == 1.0 ``` -### round(n) +### round(n) {#round} Returns the nearest integer, rounding half away from zero. @@ -524,7 +524,7 @@ round(1.5) == 2.0 ## Array Functions -### all(array, predicate) +### all(array, predicate) {#all} Returns **true** if all elements satisfies the [predicate](#predicate). If the array is empty, returns **true**. @@ -533,7 +533,7 @@ If the array is empty, returns **true**. all(tweets, {.Size < 280}) ``` -### any(array, predicate) +### any(array, predicate) {#any} Returns **true** if any elements satisfies the [predicate](#predicate). If the array is empty, returns **false**. @@ -542,7 +542,7 @@ If the array is empty, returns **false**. any(tweets, {.Size > 280}) ``` -### one(array, predicate) +### one(array, predicate) {#one} Returns **true** if _exactly one_ element satisfies the [predicate](#predicate). If the array is empty, returns **false**. @@ -551,7 +551,7 @@ If the array is empty, returns **false**. one(participants, {.Winner}) ``` -### none(array, predicate) +### none(array, predicate) {#none} Returns **true** if _all elements does not_ satisfy the [predicate](#predicate). If the array is empty, returns **true**. @@ -560,7 +560,7 @@ If the array is empty, returns **true**. none(tweets, {.Size > 280}) ``` -### map(array, predicate) +### map(array, predicate) {#map} Returns new array by applying the [predicate](#predicate) to each element of the array. @@ -569,7 +569,7 @@ the array. map(tweets, {.Size}) ``` -### filter(array, predicate) +### filter(array, predicate) {#filter} Returns new array by filtering elements of the array by [predicate](#predicate). @@ -577,7 +577,7 @@ Returns new array by filtering elements of the array by [predicate](#predicate). filter(users, .Name startsWith "J") ``` -### find(array, predicate) +### find(array, predicate) {#find} Finds the first element in an array that satisfies the [predicate](#predicate). @@ -585,7 +585,7 @@ Finds the first element in an array that satisfies the [predicate](#predicate). find([1, 2, 3, 4], # > 2) == 3 ``` -### findIndex(array, predicate) +### findIndex(array, predicate) {#findIndex} Finds the index of the first element in an array that satisfies the [predicate](#predicate). @@ -593,7 +593,7 @@ Finds the index of the first element in an array that satisfies the [predicate]( findIndex([1, 2, 3, 4], # > 2) == 2 ``` -### findLast(array, predicate) +### findLast(array, predicate) {#findLast} Finds the last element in an array that satisfies the [predicate](#predicate). @@ -601,7 +601,7 @@ Finds the last element in an array that satisfies the [predicate](#predicate). findLast([1, 2, 3, 4], # > 2) == 4 ``` -### findLastIndex(array, predicate) +### findLastIndex(array, predicate) {#findLastIndex} Finds the index of the last element in an array that satisfies the [predicate](#predicate). @@ -609,7 +609,7 @@ Finds the index of the last element in an array that satisfies the [predicate](# findLastIndex([1, 2, 3, 4], # > 2) == 3 ``` -### groupBy(array, predicate) +### groupBy(array, predicate) {#groupBy} Groups the elements of an array by the result of the [predicate](#predicate). @@ -617,7 +617,7 @@ Groups the elements of an array by the result of the [predicate](#predicate). groupBy(users, .Age) ``` -### count(array, predicate) +### count(array, predicate) {#count} Returns the number of elements what satisfies the [predicate](#predicate). @@ -627,7 +627,7 @@ Equivalent to: len(filter(array, predicate)) ``` -### join(array[, delimiter]) +### join(array[, delimiter]) {#join} Joins an array of strings into a single string with the given delimiter. If no delimiter is given, an empty string is used. @@ -637,7 +637,7 @@ join(["apple", "orange", "grape"], ",") == "apple,orange,grape" join(["apple", "orange", "grape"]) == "appleorangegrape" ``` -### reduce(array, predicate[, initialValue]) +### reduce(array, predicate[, initialValue]) {#reduce} Applies a predicate to each element in the array, reducing the array to a single value. Optional `initialValue` argument can be used to specify the initial value of the accumulator. @@ -654,7 +654,7 @@ reduce(1..9, #acc + #) reduce(1..9, #acc + #, 0) ``` -### sum(array) +### sum(array) {#sum} Returns the sum of all numbers in the array. @@ -662,7 +662,7 @@ Returns the sum of all numbers in the array. sum([1, 2, 3]) == 6 ``` -### mean(array) +### mean(array) {#mean} Returns the average of all numbers in the array. @@ -670,7 +670,7 @@ Returns the average of all numbers in the array. mean([1, 2, 3]) == 2.0 ``` -### median(array) +### median(array) {#median} Returns the median of all numbers in the array. @@ -678,7 +678,7 @@ Returns the median of all numbers in the array. median([1, 2, 3]) == 2.0 ``` -### first(array) +### first(array) {#first} Returns the first element from an array. If the array is empty, returns `nil`. @@ -686,7 +686,7 @@ Returns the first element from an array. If the array is empty, returns `nil`. first([1, 2, 3]) == 1 ``` -### last(array) +### last(array) {#last} Returns the last element from an array. If the array is empty, returns `nil`. @@ -694,7 +694,7 @@ Returns the last element from an array. If the array is empty, returns `nil`. last([1, 2, 3]) == 3 ``` -### take(array, n) +### take(array, n) {#take} Returns the first `n` elements from an array. If the array has fewer than `n` elements, returns the whole array. @@ -702,7 +702,7 @@ Returns the first `n` elements from an array. If the array has fewer than `n` el take([1, 2, 3, 4], 2) == [1, 2] ``` -### sort(array[, order]) +### sort(array[, order]) {#sort} Sorts an array in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc` or `desc`. @@ -712,7 +712,7 @@ sort([3, 1, 4]) == [1, 3, 4] sort([3, 1, 4], "desc") == [4, 3, 1] ``` -### sortBy(array, key[, order]) +### sortBy(array, key[, order]) {#sortBy} Sorts an array of maps by a specific key in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc` or `desc`. @@ -724,7 +724,7 @@ sortBy(users, "Age", "desc") ## Map Functions -### keys(map) +### keys(map) {#keys} Returns an array containing the keys of the map. @@ -732,7 +732,7 @@ Returns an array containing the keys of the map. keys({"name": "John", "age": 30}) == ["name", "age"] ``` -### values(map) +### values(map) {#values} Returns an array containing the values of the map. @@ -742,7 +742,7 @@ values({"name": "John", "age": 30}) == ["John", 30] ## Type Conversion Functions -### type(v) +### type(v) {#type} Returns the type of the given value `v`. @@ -765,7 +765,7 @@ type("hello") == "string" type(now()) == "time.Time" ``` -### int(v) +### int(v) {#int} Returns the integer value of a number or a string. @@ -773,7 +773,7 @@ Returns the integer value of a number or a string. int("123") == 123 ``` -### float(v) +### float(v) {#float} Returns the float value of a number or a string. @@ -781,7 +781,7 @@ Returns the float value of a number or a string. float("123.45") == 123.45 ``` -### string(v) +### string(v) {#string} Converts the given value `v` into a string representation. @@ -789,7 +789,7 @@ Converts the given value `v` into a string representation. string(123) == "123" ``` -### toJSON(v) +### toJSON(v) {#toJSON} Converts the given value `v` to its JSON string representation. @@ -797,7 +797,7 @@ Converts the given value `v` to its JSON string representation. toJSON({"name": "John", "age": 30}) ``` -### fromJSON(v) +### fromJSON(v) {#fromJSON} Parses the given JSON string `v` and returns the corresponding value. @@ -805,7 +805,7 @@ Parses the given JSON string `v` and returns the corresponding value. fromJSON('{"name": "John", "age": 30}') ``` -### toBase64(v) +### toBase64(v) {#toBase64} Encodes the string `v` into Base64 format. @@ -813,7 +813,7 @@ Encodes the string `v` into Base64 format. toBase64("Hello World") == "SGVsbG8gV29ybGQ=" ``` -### fromBase64(v) +### fromBase64(v) {#fromBase64} Decodes the Base64 encoded string `v` back to its original form. @@ -821,7 +821,7 @@ Decodes the Base64 encoded string `v` back to its original form. fromBase64("SGVsbG8gV29ybGQ=") == "Hello World" ``` -### toPairs(map) +### toPairs(map) {#toPairs} Converts a map to an array of key-value pairs. @@ -829,7 +829,7 @@ Converts a map to an array of key-value pairs. toPairs({"name": "John", "age": 30}) == [["name", "John"], ["age", 30]] ``` -### fromPairs(array) +### fromPairs(array) {#fromPairs} Converts an array of key-value pairs to a map. @@ -839,7 +839,7 @@ fromPairs([["name", "John"], ["age", 30]]) == {"name": "John", "age": 30} ## Miscellaneous Functions -### len(v) +### len(v) {#len} Returns the length of an array, a map or a string. @@ -849,7 +849,7 @@ len({"name": "John", "age": 30}) == 2 len("Hello") == 5 ``` -### get(v, index) +### get(v, index) {#get} Retrieves the element at the specified index from an array or map `v`. If the index is out of range, returns `nil`. Or the key does not exist, returns `nil`. @@ -861,7 +861,7 @@ get({"name": "John", "age": 30}, "name") == "John" ## Bitwise Functions -### bitand(int, int) +### bitand(int, int) {#bitand} Returns the values resulting from the bitwise AND operation. @@ -869,7 +869,7 @@ Returns the values resulting from the bitwise AND operation. bitand(0b1010, 0b1100) == 0b1000 ``` -### bitor(int, int) +### bitor(int, int) {#bitor} Returns the values resulting from the bitwise OR operation. @@ -877,7 +877,7 @@ Returns the values resulting from the bitwise OR operation. bitor(0b1010, 0b1100) == 0b1110 ``` -### bitxor(int, int) +### bitxor(int, int) {#bitxor} Returns the values resulting from the bitwise XOR operation. @@ -885,7 +885,7 @@ Returns the values resulting from the bitwise XOR operation. bitxor(0b1010, 0b1100) == 0b110 ``` -### bitnand(int, int) +### bitnand(int, int) {#bitnand} Returns the values resulting from the bitwise AND NOT operation. @@ -893,7 +893,7 @@ Returns the values resulting from the bitwise AND NOT operation. bitnand(0b1010, 0b1100) == 0b10 ``` -### bitnot(int) +### bitnot(int) {#bitnot} Returns the values resulting from the bitwise NOT operation. @@ -901,7 +901,7 @@ Returns the values resulting from the bitwise NOT operation. bitnot(0b1010) == -0b1011 ``` -### bitshl(int, int) +### bitshl(int, int) {#bitshl} Returns the values resulting from the Left Shift operation. @@ -909,7 +909,7 @@ Returns the values resulting from the Left Shift operation. bitshl(0b101101, 2) == 0b10110100 ``` -### bitshr(int, int) +### bitshr(int, int) {#bitshr} Returns the values resulting from the Right Shift operation. @@ -917,7 +917,7 @@ Returns the values resulting from the Right Shift operation. bitshr(0b101101, 2) == 0b1011 ``` -### bitushr(int, int) +### bitushr(int, int) {#bitushr} Returns the values resulting from the unsigned Right Shift operation. From f631fd2c26c46dd10b9e3d494dfa703a4a6d7b1f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 6 Jan 2024 20:08:05 +0100 Subject: [PATCH 236/506] Add info about nested predicates --- docs/language-definition.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/language-definition.md b/docs/language-definition.md index 7574ff2f9..3b72c0832 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -296,6 +296,17 @@ Braces `{` `}` can be omitted: filter(tweets, len(.Content) > 240) ``` +:::tip +In nested predicates, to access the outer variable, use [variables](#variables). + +```expr +filter(posts, { + let post = #; + any(.Comments, .Author == post.Author) +}) +``` +::: + ## String Functions ### trim(str[, chars]) {#trim} From bca1aaa9022bea221de7431fc7709fe3afd77463 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 12 Jan 2024 21:58:13 +0100 Subject: [PATCH 237/506] Add [generated] tags to files (#518) --- vm/func_types/main.go | 4 +- vm/{generated.go => func_types[generated].go} | 80 +++++++++---------- vm/runtime/helpers/main.go | 4 - .../{generated.go => helpers[generated].go} | 2 +- vm/runtime/runtime.go | 2 +- vm/vm.go | 2 +- 6 files changed, 45 insertions(+), 49 deletions(-) rename vm/{generated.go => func_types[generated].go} (73%) rename vm/runtime/{generated.go => helpers[generated].go} (99%) diff --git a/vm/func_types/main.go b/vm/func_types/main.go index 6262261ef..286a1f053 100644 --- a/vm/func_types/main.go +++ b/vm/func_types/main.go @@ -127,11 +127,11 @@ import ( "time" ) -var FuncTypes = []interface{}{ +var FuncTypes = []any{ {{ .Index }} } -func (vm *VM) call(fn interface{}, kind int) interface{} { +func (vm *VM) call(fn any, kind int) any { switch kind { {{ .Code }} } diff --git a/vm/generated.go b/vm/func_types[generated].go similarity index 73% rename from vm/generated.go rename to vm/func_types[generated].go index 1a0b36571..1375f22f2 100644 --- a/vm/generated.go +++ b/vm/func_types[generated].go @@ -13,14 +13,14 @@ var FuncTypes = []any{ 3: new(func() time.Time), 4: new(func() time.Weekday), 5: new(func() []uint8), - 6: new(func() []any), + 6: new(func() []interface{}), 7: new(func() bool), 8: new(func() uint8), 9: new(func() float64), 10: new(func() int), 11: new(func() int64), - 12: new(func() any), - 13: new(func() map[string]any), + 12: new(func() interface{}), + 13: new(func() map[string]interface{}), 14: new(func() int32), 15: new(func() string), 16: new(func() uint), @@ -29,7 +29,7 @@ var FuncTypes = []any{ 19: new(func(time.Duration) time.Time), 20: new(func(time.Time) time.Duration), 21: new(func(time.Time) bool), - 22: new(func([]any, string) string), + 22: new(func([]interface{}, string) string), 23: new(func([]string, string) string), 24: new(func(bool) bool), 25: new(func(bool) float64), @@ -56,20 +56,20 @@ var FuncTypes = []any{ 46: new(func(string, int32) int), 47: new(func(string, string) bool), 48: new(func(string, string) string), - 49: new(func(any) bool), - 50: new(func(any) float64), - 51: new(func(any) int), - 52: new(func(any) string), - 53: new(func(any) any), - 54: new(func(any) []any), - 55: new(func(any) map[string]any), - 56: new(func([]any) any), - 57: new(func([]any) []any), - 58: new(func([]any) map[string]any), - 59: new(func(any, any) bool), - 60: new(func(any, any) string), - 61: new(func(any, any) any), - 62: new(func(any, any) []any), + 49: new(func(interface{}) bool), + 50: new(func(interface{}) float64), + 51: new(func(interface{}) int), + 52: new(func(interface{}) string), + 53: new(func(interface{}) interface{}), + 54: new(func(interface{}) []interface{}), + 55: new(func(interface{}) map[string]interface{}), + 56: new(func([]interface{}) interface{}), + 57: new(func([]interface{}) []interface{}), + 58: new(func([]interface{}) map[string]interface{}), + 59: new(func(interface{}, interface{}) bool), + 60: new(func(interface{}, interface{}) string), + 61: new(func(interface{}, interface{}) interface{}), + 62: new(func(interface{}, interface{}) []interface{}), } func (vm *VM) call(fn any, kind int) any { @@ -85,7 +85,7 @@ func (vm *VM) call(fn any, kind int) any { case 5: return fn.(func() []uint8)() case 6: - return fn.(func() []any)() + return fn.(func() []interface{})() case 7: return fn.(func() bool)() case 8: @@ -97,9 +97,9 @@ func (vm *VM) call(fn any, kind int) any { case 11: return fn.(func() int64)() case 12: - return fn.(func() any)() + return fn.(func() interface{})() case 13: - return fn.(func() map[string]any)() + return fn.(func() map[string]interface{})() case 14: return fn.(func() int32)() case 15: @@ -122,8 +122,8 @@ func (vm *VM) call(fn any, kind int) any { return fn.(func(time.Time) bool)(arg1) case 22: arg2 := vm.pop().(string) - arg1 := vm.pop().([]any) - return fn.(func([]any, string) string)(arg1, arg2) + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}, string) string)(arg1, arg2) case 23: arg2 := vm.pop().(string) arg1 := vm.pop().([]string) @@ -212,50 +212,50 @@ func (vm *VM) call(fn any, kind int) any { return fn.(func(string, string) string)(arg1, arg2) case 49: arg1 := vm.pop() - return fn.(func(any) bool)(arg1) + return fn.(func(interface{}) bool)(arg1) case 50: arg1 := vm.pop() - return fn.(func(any) float64)(arg1) + return fn.(func(interface{}) float64)(arg1) case 51: arg1 := vm.pop() - return fn.(func(any) int)(arg1) + return fn.(func(interface{}) int)(arg1) case 52: arg1 := vm.pop() - return fn.(func(any) string)(arg1) + return fn.(func(interface{}) string)(arg1) case 53: arg1 := vm.pop() - return fn.(func(any) any)(arg1) + return fn.(func(interface{}) interface{})(arg1) case 54: arg1 := vm.pop() - return fn.(func(any) []any)(arg1) + return fn.(func(interface{}) []interface{})(arg1) case 55: arg1 := vm.pop() - return fn.(func(any) map[string]any)(arg1) + return fn.(func(interface{}) map[string]interface{})(arg1) case 56: - arg1 := vm.pop().([]any) - return fn.(func([]any) any)(arg1) + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}) interface{})(arg1) case 57: - arg1 := vm.pop().([]any) - return fn.(func([]any) []any)(arg1) + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}) []interface{})(arg1) case 58: - arg1 := vm.pop().([]any) - return fn.(func([]any) map[string]any)(arg1) + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}) map[string]interface{})(arg1) case 59: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(any, any) bool)(arg1, arg2) + return fn.(func(interface{}, interface{}) bool)(arg1, arg2) case 60: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(any, any) string)(arg1, arg2) + return fn.(func(interface{}, interface{}) string)(arg1, arg2) case 61: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(any, any) any)(arg1, arg2) + return fn.(func(interface{}, interface{}) interface{})(arg1, arg2) case 62: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(any, any) []any)(arg1, arg2) + return fn.(func(interface{}, interface{}) []interface{})(arg1, arg2) } panic(fmt.Sprintf("unknown function kind (%v)", kind)) diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index 66eb68dba..b3f598a43 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -93,10 +93,6 @@ func isFloat(t string) bool { return strings.HasPrefix(t, "float") } -func isInt(t string) bool { - return strings.HasPrefix(t, "int") -} - func isDuration(t string) bool { return t == "time.Duration" } diff --git a/vm/runtime/generated.go b/vm/runtime/helpers[generated].go similarity index 99% rename from vm/runtime/generated.go rename to vm/runtime/helpers[generated].go index a5b92f477..720feb455 100644 --- a/vm/runtime/generated.go +++ b/vm/runtime/helpers[generated].go @@ -3372,4 +3372,4 @@ func Modulo(a, b interface{}) int { } } panic(fmt.Sprintf("invalid operation: %T %% %T", a, b)) -} \ No newline at end of file +} diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 406f85096..09c58bdf7 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -1,6 +1,6 @@ package runtime -//go:generate sh -c "go run ./helpers > ./generated.go" +//go:generate sh -c "go run ./helpers > ./helpers[generated].go" import ( "fmt" diff --git a/vm/vm.go b/vm/vm.go index fa2c75899..4c2ff04fa 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -1,6 +1,6 @@ package vm -//go:generate sh -c "go run ./func_types > ./generated.go" +//go:generate sh -c "go run ./func_types > ./func_types[generated].go" import ( "fmt" From 1b3c10c0ef680ae4e6b6b3558308b233958b07f2 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 12 Jan 2024 22:03:10 +0100 Subject: [PATCH 238/506] Simplify abs --- builtin/lib.go | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/builtin/lib.go b/builtin/lib.go index 1deca3f99..228a74893 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -62,76 +62,76 @@ func Type(arg any) any { } func Abs(x any) any { - switch x.(type) { + switch x := x.(type) { case float32: - if x.(float32) < 0 { - return -x.(float32) + if x < 0 { + return -x } else { return x } case float64: - if x.(float64) < 0 { - return -x.(float64) + if x < 0 { + return -x } else { return x } case int: - if x.(int) < 0 { - return -x.(int) + if x < 0 { + return -x } else { return x } case int8: - if x.(int8) < 0 { - return -x.(int8) + if x < 0 { + return -x } else { return x } case int16: - if x.(int16) < 0 { - return -x.(int16) + if x < 0 { + return -x } else { return x } case int32: - if x.(int32) < 0 { - return -x.(int32) + if x < 0 { + return -x } else { return x } case int64: - if x.(int64) < 0 { - return -x.(int64) + if x < 0 { + return -x } else { return x } case uint: - if x.(uint) < 0 { - return -x.(uint) + if x < 0 { + return -x } else { return x } case uint8: - if x.(uint8) < 0 { - return -x.(uint8) + if x < 0 { + return -x } else { return x } case uint16: - if x.(uint16) < 0 { - return -x.(uint16) + if x < 0 { + return -x } else { return x } case uint32: - if x.(uint32) < 0 { - return -x.(uint32) + if x < 0 { + return -x } else { return x } case uint64: - if x.(uint64) < 0 { - return -x.(uint64) + if x < 0 { + return -x } else { return x } From db94b967cddea3fbac812c76218b6797bd328f90 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Jan 2024 13:14:38 +0100 Subject: [PATCH 239/506] Add build tag: expr_debug (#521) --- .github/workflows/test.yml | 11 ++++ debug/debugger.go | 10 ++-- vm/debug.go | 5 ++ vm/debug_off.go | 5 ++ vm/debug_test.go | 40 +++++++++++++++ vm/utils.go | 11 ++++ vm/vm.go | 100 ++++++++++++++++--------------------- vm/vm_test.go | 27 ---------- 8 files changed, 123 insertions(+), 86 deletions(-) create mode 100644 vm/debug.go create mode 100644 vm/debug_off.go create mode 100644 vm/debug_test.go create mode 100644 vm/utils.go diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8a8b87873..2fa55aae8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,3 +20,14 @@ jobs: go-version: ${{ matrix.go-version }} - name: Test run: go test ./... + + debug: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup Go 1.18 + uses: actions/setup-go@v4 + with: + go-version: 1.18 + - name: Test + run: go test -tags=expr_debug -run=TestDebugger -v ./vm diff --git a/debug/debugger.go b/debug/debugger.go index a870973ca..6f341e30e 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -7,9 +7,10 @@ import ( "strings" "time" - . "github.com/expr-lang/expr/vm" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" + + . "github.com/expr-lang/expr/vm" ) func StartDebugger(program *Program, env any) { @@ -112,14 +113,17 @@ func StartDebugger(program *Program, env any) { } stack.Clear() - for i, value := range vm.Stack() { + for i, value := range vm.Stack { stack.SetCellSimple(i, 0, fmt.Sprintf("% *d: ", 2, i)) stack.SetCellSimple(i, 1, fmt.Sprintf("%#v", value)) } stack.ScrollToEnd() scope.Clear() - s := vm.Scope() + var s *Scope + if len(vm.Scopes) > 0 { + s = vm.Scopes[len(vm.Scopes)-1] + } if s != nil { type pair struct { key string diff --git a/vm/debug.go b/vm/debug.go new file mode 100644 index 000000000..ab95bf9a0 --- /dev/null +++ b/vm/debug.go @@ -0,0 +1,5 @@ +//go:build expr_debug + +package vm + +const debug = true diff --git a/vm/debug_off.go b/vm/debug_off.go new file mode 100644 index 000000000..e0f2955a1 --- /dev/null +++ b/vm/debug_off.go @@ -0,0 +1,5 @@ +//go:build !expr_debug + +package vm + +const debug = false diff --git a/vm/debug_test.go b/vm/debug_test.go new file mode 100644 index 000000000..576960f06 --- /dev/null +++ b/vm/debug_test.go @@ -0,0 +1,40 @@ +//go:build expr_debug + +package vm_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr/compiler" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/vm" +) + +func TestDebugger(t *testing.T) { + input := `[1, 2]` + + node, err := parser.Parse(input) + require.NoError(t, err) + + program, err := compiler.Compile(node, nil) + require.NoError(t, err) + + debug := vm.Debug() + go func() { + debug.Step() + debug.Step() + debug.Step() + debug.Step() + }() + go func() { + for range debug.Position() { + } + }() + + _, err = debug.Run(program, nil) + require.NoError(t, err) + require.Len(t, debug.Stack, 0) + require.Nil(t, debug.Scopes) +} diff --git a/vm/utils.go b/vm/utils.go new file mode 100644 index 000000000..f9ec81a8c --- /dev/null +++ b/vm/utils.go @@ -0,0 +1,11 @@ +package vm + +import ( + "reflect" +) + +type Function = func(params ...any) (any, error) + +var MemoryBudget uint = 1e6 + +var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vm/vm.go b/vm/vm.go index 4c2ff04fa..5ae4d0687 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -13,11 +13,6 @@ import ( "github.com/expr-lang/expr/vm/runtime" ) -var MemoryBudget uint = 1e6 -var errorType = reflect.TypeOf((*error)(nil)).Elem() - -type Function = func(params ...any) (any, error) - func Run(program *Program, env any) (any, error) { if program == nil { return nil, fmt.Errorf("program is nil") @@ -27,15 +22,24 @@ func Run(program *Program, env any) (any, error) { return vm.Run(program, env) } +func Debug() *VM { + vm := &VM{ + debug: true, + step: make(chan struct{}, 0), + curr: make(chan int, 0), + } + return vm +} + type VM struct { - stack []any + Stack []any + Scopes []*Scope ip int - scopes []*Scope + memory uint + memoryBudget uint debug bool step chan struct{} curr chan int - memory uint - memoryBudget uint } type Scope struct { @@ -47,15 +51,6 @@ type Scope struct { Acc any } -func Debug() *VM { - vm := &VM{ - debug: true, - step: make(chan struct{}, 0), - curr: make(chan int, 0), - } - return vm -} - func (vm *VM) Run(program *Program, env any) (_ any, err error) { defer func() { if r := recover(); r != nil { @@ -74,14 +69,14 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { } }() - if vm.stack == nil { - vm.stack = make([]any, 0, 2) + if vm.Stack == nil { + vm.Stack = make([]any, 0, 2) } else { - vm.stack = vm.stack[0:0] + vm.Stack = vm.Stack[0:0] } - if vm.scopes != nil { - vm.scopes = vm.scopes[0:0] + if vm.Scopes != nil { + vm.Scopes = vm.Scopes[0:0] } vm.memoryBudget = MemoryBudget @@ -89,7 +84,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.ip = 0 for vm.ip < len(program.Bytecode) { - if vm.debug { + if debug && vm.debug { <-vm.step } @@ -204,7 +199,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { } case OpJumpIfEnd: - scope := vm.Scope() + scope := vm.scope() if scope.Index >= scope.Len { vm.ip += arg } @@ -399,7 +394,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpValidateArgs: fn := vm.pop().(Function) - mem, err := fn(vm.stack[len(vm.stack)-arg:]...) + mem, err := fn(vm.Stack[len(vm.Stack)-arg:]...) if err != nil { panic(err) } @@ -443,49 +438,49 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.push(runtime.Deref(a)) case OpIncrementIndex: - vm.Scope().Index++ + vm.scope().Index++ case OpDecrementIndex: - scope := vm.Scope() + scope := vm.scope() scope.Index-- case OpIncrementCount: - scope := vm.Scope() + scope := vm.scope() scope.Count++ case OpGetIndex: - vm.push(vm.Scope().Index) + vm.push(vm.scope().Index) case OpSetIndex: - scope := vm.Scope() + scope := vm.scope() scope.Index = vm.pop().(int) case OpGetCount: - scope := vm.Scope() + scope := vm.scope() vm.push(scope.Count) case OpGetLen: - scope := vm.Scope() + scope := vm.scope() vm.push(scope.Len) case OpGetGroupBy: - vm.push(vm.Scope().GroupBy) + vm.push(vm.scope().GroupBy) case OpGetAcc: - vm.push(vm.Scope().Acc) + vm.push(vm.scope().Acc) case OpSetAcc: - vm.Scope().Acc = vm.pop() + vm.scope().Acc = vm.pop() case OpPointer: - scope := vm.Scope() + scope := vm.scope() vm.push(scope.Array.Index(scope.Index).Interface()) case OpThrow: panic(vm.pop().(error)) case OpGroupBy: - scope := vm.Scope() + scope := vm.scope() if scope.GroupBy == nil { scope.GroupBy = make(map[any][]any) } @@ -496,29 +491,29 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpBegin: a := vm.pop() array := reflect.ValueOf(a) - vm.scopes = append(vm.scopes, &Scope{ + vm.Scopes = append(vm.Scopes, &Scope{ Array: array, Len: array.Len(), }) case OpEnd: - vm.scopes = vm.scopes[:len(vm.scopes)-1] + vm.Scopes = vm.Scopes[:len(vm.Scopes)-1] default: panic(fmt.Sprintf("unknown bytecode %#x", op)) } - if vm.debug { + if debug && vm.debug { vm.curr <- vm.ip } } - if vm.debug { + if debug && vm.debug { close(vm.curr) close(vm.step) } - if len(vm.stack) > 0 { + if len(vm.Stack) > 0 { return vm.pop(), nil } @@ -526,16 +521,16 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { } func (vm *VM) push(value any) { - vm.stack = append(vm.stack, value) + vm.Stack = append(vm.Stack, value) } func (vm *VM) current() any { - return vm.stack[len(vm.stack)-1] + return vm.Stack[len(vm.Stack)-1] } func (vm *VM) pop() any { - value := vm.stack[len(vm.stack)-1] - vm.stack = vm.stack[:len(vm.stack)-1] + value := vm.Stack[len(vm.Stack)-1] + vm.Stack = vm.Stack[:len(vm.Stack)-1] return value } @@ -546,15 +541,8 @@ func (vm *VM) memGrow(size uint) { } } -func (vm *VM) Stack() []any { - return vm.stack -} - -func (vm *VM) Scope() *Scope { - if len(vm.scopes) > 0 { - return vm.scopes[len(vm.scopes)-1] - } - return nil +func (vm *VM) scope() *Scope { + return vm.Scopes[len(vm.Scopes)-1] } func (vm *VM) Step() { diff --git a/vm/vm_test.go b/vm/vm_test.go index 0cbbb8998..17768c148 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -20,33 +20,6 @@ func TestRun_NilProgram(t *testing.T) { require.Error(t, err) } -func TestRun_Debugger(t *testing.T) { - input := `[1, 2]` - - node, err := parser.Parse(input) - require.NoError(t, err) - - program, err := compiler.Compile(node, nil) - require.NoError(t, err) - - debug := vm.Debug() - go func() { - debug.Step() - debug.Step() - debug.Step() - debug.Step() - }() - go func() { - for range debug.Position() { - } - }() - - _, err = debug.Run(program, nil) - require.NoError(t, err) - require.Len(t, debug.Stack(), 0) - require.Nil(t, debug.Scope()) -} - func TestRun_ReuseVM(t *testing.T) { node, err := parser.Parse(`map(1..2, {#})`) require.NoError(t, err) From b2f6fb83b7e749d225dfea77a56acf8624cccbf1 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Jan 2024 15:56:49 +0100 Subject: [PATCH 240/506] Allow to override builtins (#522) * Allow to override builtins * Add :: syntax to access builtin in case of override --- builtin/builtin_test.go | 84 ++++++++++++++++++++++++++------------ checker/checker.go | 24 ++++++----- conf/config.go | 22 ++++------ parser/lexer/lexer_test.go | 8 ++++ parser/lexer/state.go | 5 ++- parser/parser.go | 21 +++++++--- parser/parser_test.go | 23 +++++++++++ 7 files changed, 130 insertions(+), 57 deletions(-) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 23273a246..0cdf9515d 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -284,37 +284,71 @@ func TestBuiltin_memory_limits(t *testing.T) { } } -func TestBuiltin_disallow_builtins_override(t *testing.T) { - t.Run("via env", func(t *testing.T) { - env := map[string]any{ - "len": func() int { return 42 }, - "repeat": func(a string) string { - return a - }, +func TestBuiltin_allow_builtins_override(t *testing.T) { + t.Run("via env var", func(t *testing.T) { + for _, name := range builtin.Names { + t.Run(name, func(t *testing.T) { + env := map[string]any{ + name: "hello world", + } + program, err := expr.Compile(name, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, "hello world", out) + }) + } + }) + t.Run("via env func", func(t *testing.T) { + for _, name := range builtin.Names { + t.Run(name, func(t *testing.T) { + env := map[string]any{ + name: func() int { return 1 }, + } + program, err := expr.Compile(fmt.Sprintf("%s()", name), expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, 1, out) + }) } - assert.Panics(t, func() { - _, _ = expr.Compile(`string(len("foo")) + repeat("0", 2)`, expr.Env(env)) - }) }) t.Run("via expr.Function", func(t *testing.T) { - length := expr.Function("len", - func(params ...any) (any, error) { - return 42, nil - }, - new(func() int), - ) - repeat := expr.Function("repeat", - func(params ...any) (any, error) { - return params[0], nil - }, - new(func(string) string), - ) - assert.Panics(t, func() { - _, _ = expr.Compile(`string(len("foo")) + repeat("0", 2)`, length, repeat) - }) + for _, name := range builtin.Names { + t.Run(name, func(t *testing.T) { + fn := expr.Function(name, + func(params ...any) (any, error) { + return 42, nil + }, + new(func() int), + ) + program, err := expr.Compile(fmt.Sprintf("%s()", name), fn) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + require.NoError(t, err) + assert.Equal(t, 42, out) + }) + } }) } +func TestBuiltin_override_and_still_accessible(t *testing.T) { + env := map[string]any{ + "len": func() int { return 42 }, + "all": []int{1, 2, 3}, + } + + program, err := expr.Compile(`::all(all, #>0) && len() == 42 && ::len(all) == 3`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, true, out) +} + func TestBuiltin_DisableBuiltin(t *testing.T) { t.Run("via env", func(t *testing.T) { for _, b := range builtin.Builtins { diff --git a/checker/checker.go b/checker/checker.go index 4dced34ea..5dd722fee 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -156,24 +156,25 @@ func (v *checker) IdentifierNode(node *ast.IdentifierNode) (reflect.Type, info) if node.Value == "$env" { return mapType, info{} } - if fn, ok := v.config.Builtins[node.Value]; ok { - return functionType, info{fn: fn} - } - if fn, ok := v.config.Functions[node.Value]; ok { - return functionType, info{fn: fn} - } - return v.env(node, node.Value, true) + return v.ident(node, node.Value, true, true) } -// env method returns type of environment variable. env only lookups for -// environment variables, no builtins, no custom functions. -func (v *checker) env(node ast.Node, name string, strict bool) (reflect.Type, info) { +// ident method returns type of environment variable, builtin or function. +func (v *checker) ident(node ast.Node, name string, strict, builtins bool) (reflect.Type, info) { if t, ok := v.config.Types[name]; ok { if t.Ambiguous { return v.error(node, "ambiguous identifier %v", name) } return t.Type, info{method: t.Method} } + if builtins { + if fn, ok := v.config.Functions[name]; ok { + return functionType, info{fn: fn} + } + if fn, ok := v.config.Builtins[name]; ok { + return functionType, info{fn: fn} + } + } if v.config.Strict && strict { return v.error(node, "unknown name %v", name) } @@ -433,6 +434,7 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { base, _ := v.visit(node.Node) prop, _ := v.visit(node.Property) + // $env variable if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "$env" { if name, ok := node.Property.(*ast.StringNode); ok { strict := v.config.Strict @@ -443,7 +445,7 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { // should throw error if field is not found & v.config.Strict. strict = false } - return v.env(node, name.Value, strict) + return v.ident(node, name.Value, strict, false /* no builtins and no functions */) } return anyType, info{} } diff --git a/conf/config.go b/conf/config.go index 48d491a96..baf5dee05 100644 --- a/conf/config.go +++ b/conf/config.go @@ -98,20 +98,14 @@ func (c *Config) Check() { } } } - for fnName, t := range c.Types { - if kind(t.Type) == reflect.Func { - for _, b := range c.Builtins { - if b.Name == fnName { - panic(fmt.Errorf(`cannot override builtin %s(): use expr.DisableBuiltin("%s") to override`, b.Name, b.Name)) - } - } - } +} + +func (c *Config) IsOverridden(name string) bool { + if _, ok := c.Functions[name]; ok { + return true } - for _, f := range c.Functions { - for _, b := range c.Builtins { - if b.Name == f.Name { - panic(fmt.Errorf(`cannot override builtin %s(); use expr.DisableBuiltin("%s") to override`, f.Name, f.Name)) - } - } + if _, ok := c.Types[name]; ok { + return true } + return false } diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index feecf045d..442fd4dbd 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -225,6 +225,14 @@ func TestLex(t *testing.T) { {Kind: EOF}, }, }, + { + `: ::`, + []Token{ + {Kind: Operator, Value: ":"}, + {Kind: Operator, Value: "::"}, + {Kind: EOF}, + }, + }, } for _, test := range tests { diff --git a/parser/lexer/state.go b/parser/lexer/state.go index 9999fd3c5..72f02bf4e 100644 --- a/parser/lexer/state.go +++ b/parser/lexer/state.go @@ -37,11 +37,14 @@ func root(l *lexer) stateFn { case r == '|': l.accept("|") l.emit(Operator) + case r == ':': + l.accept(":") + l.emit(Operator) case strings.ContainsRune("([{", r): l.emit(Bracket) case strings.ContainsRune(")]}", r): l.emit(Bracket) - case strings.ContainsRune(",:;%+-^", r): // single rune operator + case strings.ContainsRune(",;%+-^", r): // single rune operator l.emit(Operator) case strings.ContainsRune("&!=*<>", r): // possible double rune operator l.accept("&=*") diff --git a/parser/parser.go b/parser/parser.go index 5f29279bc..1ce1cda0e 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -275,6 +275,13 @@ func (p *parser) parsePrimary() Node { } } + if token.Is(Operator, "::") { + p.next() + token = p.current + p.expect(Identifier) + return p.parsePostfixExpression(p.parseCall(token, false)) + } + return p.parseSecondary() } @@ -300,7 +307,7 @@ func (p *parser) parseSecondary() Node { node.SetLocation(token.Location) return node default: - node = p.parseCall(token) + node = p.parseCall(token, true) } case Number: @@ -379,15 +386,17 @@ func (p *parser) toFloatNode(number float64) Node { return &FloatNode{Value: number} } -func (p *parser) parseCall(token Token) Node { +func (p *parser) parseCall(token Token, checkOverrides bool) Node { var node Node if p.current.Is(Bracket, "(") { var arguments []Node - if b, ok := predicates[token.Value]; ok { - p.expect(Bracket, "(") + isOverridden := p.config.IsOverridden(token.Value) + isOverridden = isOverridden && checkOverrides - // TODO: Refactor parser to use builtin.Builtins instead of predicates map. + // TODO: Refactor parser to use builtin.Builtins instead of predicates map. + if b, ok := predicates[token.Value]; ok && !isOverridden { + p.expect(Bracket, "(") if b.arity == 1 { arguments = make([]Node, 1) @@ -417,7 +426,7 @@ func (p *parser) parseCall(token Token) Node { Arguments: arguments, } node.SetLocation(token.Location) - } else if _, ok := builtin.Index[token.Value]; ok && !p.config.Disabled[token.Value] { + } else if _, ok := builtin.Index[token.Value]; ok && !p.config.Disabled[token.Value] && !isOverridden { node = &BuiltinNode{ Name: token.Value, Arguments: p.parseArguments(), diff --git a/parser/parser_test.go b/parser/parser_test.go index 453fe91ac..0e7a23837 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -498,6 +498,29 @@ world`}, }, }, }, + { + `::split("a,b,c", ",")`, + &BuiltinNode{ + Name: "split", + Arguments: []Node{ + &StringNode{Value: "a,b,c"}, + &StringNode{Value: ","}, + }, + }, + }, + { + `::split("a,b,c", ",")[0]`, + &MemberNode{ + Node: &BuiltinNode{ + Name: "split", + Arguments: []Node{ + &StringNode{Value: "a,b,c"}, + &StringNode{Value: ","}, + }, + }, + Property: &IntegerNode{Value: 0}, + }, + }, } for _, test := range tests { t.Run(test.input, func(t *testing.T) { From 523a091bcc4439823dfc22fefb7a22d34bec72a9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Jan 2024 20:41:14 +0100 Subject: [PATCH 241/506] Fix race cond in variabels (#523) * Add race cond test * Move variables array to vm * Resize vars array for different programs --- .github/workflows/test.yml | 11 +++++++++++ compiler/compiler.go | 9 ++++----- expr_test.go | 20 ++++++++++++++++++++ vm/program.go | 4 ++-- vm/vm.go | 9 ++++++--- vm/vm_test.go | 23 +++++++++++++++++++++++ 6 files changed, 66 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2fa55aae8..087bbc7c4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,3 +31,14 @@ jobs: go-version: 1.18 - name: Test run: go test -tags=expr_debug -run=TestDebugger -v ./vm + + race: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup Go 1.21 + uses: actions/setup-go@v4 + with: + go-version: 1.21 + - name: Test + run: go test -race . diff --git a/compiler/compiler.go b/compiler/compiler.go index 1f1c00c92..d4ed3c8c4 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -64,7 +64,7 @@ type compiler struct { config *conf.Config locations []file.Location bytecode []Opcode - variables []any + variables int scopes []scope constants []any constantsIndex map[any]int @@ -137,10 +137,9 @@ func (c *compiler) addConstant(constant any) int { } func (c *compiler) addVariable(name string) int { - c.variables = append(c.variables, nil) - p := len(c.variables) - 1 - c.debugInfo[fmt.Sprintf("var_%d", p)] = name - return p + c.variables++ + c.debugInfo[fmt.Sprintf("var_%d", c.variables-1)] = name + return c.variables - 1 } // emitFunction adds builtin.Function.Func to the program.functions and emits call opcode. diff --git a/expr_test.go b/expr_test.go index 9d588f122..66ef11ce7 100644 --- a/expr_test.go +++ b/expr_test.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "reflect" + "sync" "testing" "time" @@ -2383,3 +2384,22 @@ func TestIssue474(t *testing.T) { }) } } + +func TestRaceCondition_variables(t *testing.T) { + program, err := expr.Compile(`let foo = 1; foo + 1`, expr.Env(mock.Env{})) + require.NoError(t, err) + + var wg sync.WaitGroup + + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + out, err := expr.Run(program, mock.Env{}) + require.NoError(t, err) + require.Equal(t, 2, out) + }() + } + + wg.Wait() +} diff --git a/vm/program.go b/vm/program.go index 085b18a7f..07ecec1c8 100644 --- a/vm/program.go +++ b/vm/program.go @@ -22,7 +22,7 @@ type Program struct { source *file.Source locations []file.Location - variables []any + variables int functions []Function debugInfo map[string]string } @@ -31,7 +31,7 @@ type Program struct { func NewProgram( source *file.Source, locations []file.Location, - variables []any, + variables int, constants []any, bytecode []Opcode, arguments []int, diff --git a/vm/vm.go b/vm/vm.go index 5ae4d0687..0bde66634 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -34,6 +34,7 @@ func Debug() *VM { type VM struct { Stack []any Scopes []*Scope + Variables []any ip int memory uint memoryBudget uint @@ -74,10 +75,12 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { } else { vm.Stack = vm.Stack[0:0] } - if vm.Scopes != nil { vm.Scopes = vm.Scopes[0:0] } + if len(vm.Variables) < program.variables { + vm.Variables = make([]any, program.variables) + } vm.memoryBudget = MemoryBudget vm.memory = 0 @@ -107,10 +110,10 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.pop() case OpStore: - program.variables[arg] = vm.pop() + vm.Variables[arg] = vm.pop() case OpLoadVar: - vm.push(program.variables[arg]) + vm.push(vm.Variables[arg]) case OpLoadConst: vm.push(runtime.Fetch(env, program.Constants[arg])) diff --git a/vm/vm_test.go b/vm/vm_test.go index 17768c148..2628b961d 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/compiler" "github.com/expr-lang/expr/conf" @@ -34,6 +35,28 @@ func TestRun_ReuseVM(t *testing.T) { require.NoError(t, err) } +func TestRun_ReuseVM_for_different_variables(t *testing.T) { + v := vm.VM{} + + program, err := expr.Compile(`let a = 1; a + 1`) + require.NoError(t, err) + out, err := v.Run(program, nil) + require.NoError(t, err) + require.Equal(t, 2, out) + + program, err = expr.Compile(`let a = 2; a + 1`) + require.NoError(t, err) + out, err = v.Run(program, nil) + require.NoError(t, err) + require.Equal(t, 3, out) + + program, err = expr.Compile(`let a = 2; let b = 2; a + b`) + require.NoError(t, err) + out, err = v.Run(program, nil) + require.NoError(t, err) + require.Equal(t, 4, out) +} + func TestRun_Cast(t *testing.T) { input := `1` From e213a6616920398b6716fad8c64cc2cf2963df97 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 14 Jan 2024 17:27:22 +0100 Subject: [PATCH 242/506] Fix context patcher (#526) --- builtin/builtin.go | 10 ---------- builtin/function.go | 22 ++++++++++++++++++++++ checker/checker.go | 6 +++--- checker/checker_test.go | 2 +- checker/types.go | 1 - patcher/with_context_test.go | 31 +++++++++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 builtin/function.go diff --git a/builtin/builtin.go b/builtin/builtin.go index cd943bd0b..14fc8a4b7 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -12,16 +12,6 @@ import ( "github.com/expr-lang/expr/vm/runtime" ) -type Function struct { - Name string - Func func(args ...any) (any, error) - Fast func(arg any) any - ValidateArgs func(args ...any) (any, error) - Types []reflect.Type - Validate func(args []reflect.Type) (reflect.Type, error) - Predicate bool -} - var ( Index map[string]int Names []string diff --git a/builtin/function.go b/builtin/function.go new file mode 100644 index 000000000..e6d882340 --- /dev/null +++ b/builtin/function.go @@ -0,0 +1,22 @@ +package builtin + +import ( + "reflect" +) + +type Function struct { + Name string + Func func(args ...any) (any, error) + Fast func(arg any) any + ValidateArgs func(args ...any) (any, error) + Types []reflect.Type + Validate func(args []reflect.Type) (reflect.Type, error) + Predicate bool +} + +func (f *Function) Type() reflect.Type { + if len(f.Types) > 0 { + return f.Types[0] + } + return reflect.TypeOf(f.Func) +} diff --git a/checker/checker.go b/checker/checker.go index 5dd722fee..0b5a0227a 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -169,10 +169,10 @@ func (v *checker) ident(node ast.Node, name string, strict, builtins bool) (refl } if builtins { if fn, ok := v.config.Functions[name]; ok { - return functionType, info{fn: fn} + return fn.Type(), info{fn: fn} } if fn, ok := v.config.Builtins[name]; ok { - return functionType, info{fn: fn} + return fn.Type(), info{fn: fn} } } if v.config.Strict && strict { @@ -833,7 +833,7 @@ func (v *checker) checkFunction(f *builtin.Function, node ast.Node, arguments [] } return t, info{} } else if len(f.Types) == 0 { - t, err := v.checkArguments(f.Name, functionType, false, arguments, node) + t, err := v.checkArguments(f.Name, f.Type(), false, arguments, node) if err != nil { if v.err == nil { v.err = err diff --git a/checker/checker_test.go b/checker/checker_test.go index d03e3a8ee..35daeda45 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -994,7 +994,7 @@ func TestCheck_builtin_without_call(t *testing.T) { err string }{ {`len + 1`, "invalid operation: + (mismatched types func(...interface {}) (interface {}, error) and int) (1:5)\n | len + 1\n | ....^"}, - {`string.A`, "type func(...interface {}) (interface {}, error)[string] is undefined (1:8)\n | string.A\n | .......^"}, + {`string.A`, "type func(interface {}) string[string] is undefined (1:8)\n | string.A\n | .......^"}, } for _, test := range tests { diff --git a/checker/types.go b/checker/types.go index 662139c37..8c0805049 100644 --- a/checker/types.go +++ b/checker/types.go @@ -18,7 +18,6 @@ var ( anyType = reflect.TypeOf(new(any)).Elem() timeType = reflect.TypeOf(time.Time{}) durationType = reflect.TypeOf(time.Duration(0)) - functionType = reflect.TypeOf(new(func(...any) (any, error))).Elem() ) func combined(a, b reflect.Type) reflect.Type { diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index 0d0917afe..4c2bd048f 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -30,3 +30,34 @@ func TestWithContext(t *testing.T) { require.NoError(t, err) require.Equal(t, 42, output) } + +func TestWithContext_with_env_Function(t *testing.T) { + env := map[string]any{ + "ctx": context.TODO(), + } + + fn := expr.Function("fn", + func(params ...any) (any, error) { + ctx := params[0].(context.Context) + a := params[1].(int) + + return ctx.Value("value").(int) + a, nil + }, + new(func(context.Context, int) int), + ) + + program, err := expr.Compile( + `fn(40)`, + expr.Env(env), + expr.WithContext("ctx"), + fn, + ) + require.NoError(t, err) + + ctx := context.WithValue(context.Background(), "value", 2) + env["ctx"] = ctx + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 42, output) +} From 6691bc8124ff555dbaf8001aa5cc6ded37f87a67 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Tue, 16 Jan 2024 14:10:36 +0530 Subject: [PATCH 243/506] Support Valuer Patching for MemberNode (#525) --- patcher/value/value.go | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/patcher/value/value.go b/patcher/value/value.go index 5af784844..59351be6b 100644 --- a/patcher/value/value.go +++ b/patcher/value/value.go @@ -22,13 +22,10 @@ import ( // contain metadata such as column type and if a value is specifically a NULL value. // // Use it directly as an Option to expr.Compile() -var ValueGetter = func() expr.Option { - vPatcher := patcher{} - return func(c *conf.Config) { - c.Visitors = append(c.Visitors, vPatcher) - getValueFunc(c) - } -}() +var ValueGetter = expr.Option(func(c *conf.Config) { + c.Visitors = append(c.Visitors, patcher{}) + getValueFunc(c) +}) // A AnyValuer provides a generic function for a custom type to return standard go values. // It allows for returning a `nil` value but does not provide any type checking at expression compile. @@ -136,21 +133,17 @@ var supportedInterfaces = []reflect.Type{ type patcher struct{} func (patcher) Visit(node *ast.Node) { - id, ok := (*node).(*ast.IdentifierNode) - if !ok { - return - } - - nodeType := id.Type() - - for _, t := range supportedInterfaces { - if nodeType.Implements(t) { - callnode := &ast.CallNode{ - Callee: &ast.IdentifierNode{Value: "$patcher_value_getter"}, - Arguments: []ast.Node{id}, + switch id := (*node).(type) { + case *ast.IdentifierNode, *ast.MemberNode: + nodeType := id.Type() + for _, t := range supportedInterfaces { + if nodeType.Implements(t) { + ast.Patch(node, &ast.CallNode{ + Callee: &ast.IdentifierNode{Value: "$patcher_value_getter"}, + Arguments: []ast.Node{id}, + }) + return } - - ast.Patch(node, callnode) } } } From 98d79a97c7b0c33468d5be7f99227adfcd741e9b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 16 Jan 2024 10:27:10 +0100 Subject: [PATCH 244/506] Fix type any type propagation with patcher relationship --- checker/checker.go | 15 ++++++++++++- patcher/with_context_test.go | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/checker/checker.go b/checker/checker.go index 0b5a0227a..fa7325ed3 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -539,9 +539,22 @@ func (v *checker) SliceNode(node *ast.SliceNode) (reflect.Type, info) { func (v *checker) CallNode(node *ast.CallNode) (reflect.Type, info) { t, i := v.functionReturnType(node) - if node.Type() != nil { + + // Check if type was set on node (for example, by patcher) + // and use node type instead of function return type. + // + // If node type is anyType, then we should use function + // return type. For example, on error we return anyType + // for a call `errCall().Method()` and method will be + // evaluated on `anyType.Method()`, so return type will + // be anyType `anyType.Method(): anyType`. Patcher can + // fix `errCall()` to return proper type, so on second + // checker pass we should replace anyType on method node + // with new correct function return type. + if node.Type() != nil && node.Type() != anyType { return node.Type(), i } + return t, i } diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index 4c2bd048f..310cbc06a 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -61,3 +61,46 @@ func TestWithContext_with_env_Function(t *testing.T) { require.NoError(t, err) require.Equal(t, 42, output) } + +type TestFoo struct { + contextValue int +} + +func (f *TestFoo) GetValue(a int) int64 { + return int64(f.contextValue + a) +} + +func TestWithContext_with_env_method_chain(t *testing.T) { + env := map[string]any{ + "ctx": context.TODO(), + } + + fn := expr.Function("fn", + func(params ...any) (any, error) { + ctx := params[0].(context.Context) + + contextValue := ctx.Value("value").(int) + + return &TestFoo{ + contextValue: contextValue, + }, nil + }, + new(func(context.Context) *TestFoo), + ) + + program, err := expr.Compile( + `fn().GetValue(40)`, + expr.Env(env), + expr.WithContext("ctx"), + fn, + expr.AsInt64(), + ) + require.NoError(t, err) + + ctx := context.WithValue(context.Background(), "value", 2) + env["ctx"] = ctx + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, int64(42), output) +} From 7ba66ee25c6e58f989263a23b6ad55bfa631e66b Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Tue, 16 Jan 2024 17:17:46 +0530 Subject: [PATCH 245/506] Remove parents field for optimization (#527) --- ast/node.go | 1 + checker/checker.go | 15 +++++---------- parser/parser.go | 1 + parser/parser_test.go | 6 ++++-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/ast/node.go b/ast/node.go index 68c9e7bef..03e8cf622 100644 --- a/ast/node.go +++ b/ast/node.go @@ -133,6 +133,7 @@ type MemberNode struct { Node Node // Node of the member access. Like "foo" in "foo.bar". Property Node // Property of the member access. For property access it is a StringNode. Optional bool // If true then the member access is optional. Like "foo?.bar". + Method bool } // SliceNode represents access to a slice of an array. diff --git a/checker/checker.go b/checker/checker.go index fa7325ed3..56784752e 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -54,7 +54,6 @@ type checker struct { config *conf.Config predicateScopes []predicateScope varScopes []varScope - parents []ast.Node err *file.Error } @@ -83,7 +82,6 @@ type info struct { func (v *checker) visit(node ast.Node) (reflect.Type, info) { var t reflect.Type var i info - v.parents = append(v.parents, node) switch n := node.(type) { case *ast.NilNode: t, i = v.NilNode(n) @@ -130,7 +128,6 @@ func (v *checker) visit(node ast.Node) (reflect.Type, info) { default: panic(fmt.Sprintf("undefined node type (%T)", node)) } - v.parents = v.parents[:len(v.parents)-1] node.SetType(t) return t, i } @@ -431,9 +428,6 @@ func (v *checker) ChainNode(node *ast.ChainNode) (reflect.Type, info) { } func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { - base, _ := v.visit(node.Node) - prop, _ := v.visit(node.Property) - // $env variable if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "$env" { if name, ok := node.Property.(*ast.StringNode); ok { @@ -450,6 +444,9 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { return anyType, info{} } + base, _ := v.visit(node.Node) + prop, _ := v.visit(node.Property) + if name, ok := node.Property.(*ast.StringNode); ok { if base == nil { return v.error(node, "type %v has no field %v", base, name.Value) @@ -498,10 +495,8 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) { if field, ok := fetchField(base, propertyName); ok { return field.Type, info{} } - if len(v.parents) > 1 { - if _, ok := v.parents[len(v.parents)-2].(*ast.CallNode); ok { - return v.error(node, "type %v has no method %v", base, propertyName) - } + if node.Method { + return v.error(node, "type %v has no method %v", base, propertyName) } return v.error(node, "type %v has no field %v", base, propertyName) } diff --git a/parser/parser.go b/parser/parser.go index 1ce1cda0e..caab130db 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -572,6 +572,7 @@ func (p *parser) parsePostfixExpression(node Node) Node { memberNode.SetLocation(propertyToken.Location) if p.current.Is(Bracket, "(") { + memberNode.Method = true node = &CallNode{ Callee: memberNode, Arguments: p.parseArguments(), diff --git a/parser/parser_test.go b/parser/parser_test.go index 0e7a23837..362c41fec 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -178,13 +178,13 @@ world`}, { "foo.bar()", &CallNode{Callee: &MemberNode{Node: &IdentifierNode{Value: "foo"}, - Property: &StringNode{Value: "bar"}}, + Property: &StringNode{Value: "bar"}, Method: true}, Arguments: []Node{}}, }, { `foo.bar("arg1", 2, true)`, &CallNode{Callee: &MemberNode{Node: &IdentifierNode{Value: "foo"}, - Property: &StringNode{Value: "bar"}}, + Property: &StringNode{Value: "bar"}, Method: true}, Arguments: []Node{&StringNode{Value: "arg1"}, &IntegerNode{Value: 2}, &BoolNode{Value: true}}}, @@ -220,12 +220,14 @@ world`}, Property: &StringNode{ Value: "b", }, + Method: true, }, Arguments: []Node{}, }, Property: &StringNode{ Value: "c", }, + Method: true, }, Arguments: []Node{}, }, From 7cd9fa622743e25ef6fbae26f1b3a6235c90de53 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 17 Jan 2024 20:01:34 +0100 Subject: [PATCH 246/506] Add ast tree to program (#528) * Add pro holder * explain --- .gitignore | 1 + compiler/compiler.go | 1 + vm/program.go | 19 ++++++++++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b089dce8a..da1a8182f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ *.out *.html custom_tests.json +pro/ diff --git a/compiler/compiler.go b/compiler/compiler.go index d4ed3c8c4..ac11805e0 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -49,6 +49,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro program = NewProgram( tree.Source, + tree.Node, c.locations, c.variables, c.constants, diff --git a/vm/program.go b/vm/program.go index 07ecec1c8..041cab51d 100644 --- a/vm/program.go +++ b/vm/program.go @@ -9,6 +9,7 @@ import ( "strings" "text/tabwriter" + "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/file" "github.com/expr-lang/expr/vm/runtime" @@ -21,6 +22,7 @@ type Program struct { Constants []any source *file.Source + node ast.Node locations []file.Location variables int functions []Function @@ -30,6 +32,7 @@ type Program struct { // NewProgram returns a new Program. It's used by the compiler. func NewProgram( source *file.Source, + node ast.Node, locations []file.Location, variables int, constants []any, @@ -40,6 +43,7 @@ func NewProgram( ) *Program { return &Program{ source: source, + node: node, locations: locations, variables: variables, Constants: constants, @@ -50,6 +54,16 @@ func NewProgram( } } +// Source returns origin file.Source. +func (program *Program) Source() *file.Source { + return program.source +} + +// Node returns origin ast.Node. +func (program *Program) Node() ast.Node { + return program.node +} + // Disassemble returns opcodes as a string. func (program *Program) Disassemble() string { var buf bytes.Buffer @@ -346,8 +360,3 @@ func (program *Program) DisassembleWriter(w io.Writer) { } } } - -// Source returns origin file.Source. -func (program *Program) Source() *file.Source { - return program.source -} From 71bc9f986c4e439802acf999726445f6204e9ddd Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 17 Jan 2024 23:21:11 +0100 Subject: [PATCH 247/506] Improve ast printing for boolean operators --- ast/print.go | 34 ++++++++++++++++++++++++++++++---- ast/print_test.go | 4 ++-- parser/operator/operator.go | 4 ++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/ast/print.go b/ast/print.go index 9a7d12391..7ecb1c04c 100644 --- a/ast/print.go +++ b/ast/print.go @@ -58,17 +58,43 @@ func (n *UnaryNode) String() string { } func (n *BinaryNode) String() string { + if n.Operator == ".." { + return fmt.Sprintf("%s..%s", n.Left, n.Right) + } + var lhs, rhs string + var lwrap, rwrap bool lb, ok := n.Left.(*BinaryNode) - if ok && (operator.Less(lb.Operator, n.Operator) || lb.Operator == "??") { + if ok { + if operator.Less(lb.Operator, n.Operator) { + lwrap = true + } + if lb.Operator == "??" { + lwrap = true + } + if operator.IsBoolean(lb.Operator) && n.Operator != lb.Operator { + lwrap = true + } + } + + rb, ok := n.Right.(*BinaryNode) + if ok { + if operator.Less(rb.Operator, n.Operator) { + rwrap = true + } + if operator.IsBoolean(rb.Operator) && n.Operator != rb.Operator { + rwrap = true + } + } + + if lwrap { lhs = fmt.Sprintf("(%s)", n.Left.String()) } else { lhs = n.Left.String() } - rb, ok := n.Right.(*BinaryNode) - if ok && operator.Less(rb.Operator, n.Operator) { + if rwrap { rhs = fmt.Sprintf("(%s)", n.Right.String()) } else { rhs = n.Right.String() @@ -132,7 +158,7 @@ func (n *ClosureNode) String() string { } func (n *PointerNode) String() string { - return "#" + return fmt.Sprintf("#%s", n.Name) } func (n *VariableDeclaratorNode) String() string { diff --git a/ast/print_test.go b/ast/print_test.go index 12ae6f741..2ecff147c 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -42,8 +42,8 @@ func TestPrint(t *testing.T) { {`a not in b`, `not (a in b)`}, {`a and b`, `a and b`}, {`a or b`, `a or b`}, - {`a or b and c`, `a or b and c`}, - {`a or (b and c)`, `a or b and c`}, + {`a or b and c`, `a or (b and c)`}, + {`a or (b and c)`, `a or (b and c)`}, {`(a or b) and c`, `(a or b) and c`}, {`a ? b : c`, `a ? b : c`}, {`a ? b : c ? d : e`, `a ? b : (c ? d : e)`}, diff --git a/parser/operator/operator.go b/parser/operator/operator.go index 455c06f17..8d804c7b3 100644 --- a/parser/operator/operator.go +++ b/parser/operator/operator.go @@ -16,6 +16,10 @@ func Less(a, b string) bool { return Binary[a].Precedence < Binary[b].Precedence } +func IsBoolean(op string) bool { + return op == "and" || op == "or" || op == "&&" || op == "||" +} + var Unary = map[string]Operator{ "not": {50, Left}, "!": {50, Left}, From cda16c21633e49505535aa4c0b70d39fd9640a21 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 18 Jan 2024 07:52:06 +0100 Subject: [PATCH 248/506] Fix type checker to visit all arguments of func even in args count mismatch --- checker/checker.go | 16 +++++++++++++--- checker/checker_test.go | 8 ++++---- patcher/with_context.go | 6 ++++-- patcher/with_context_test.go | 24 ++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 56784752e..3dc4e95ad 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -906,28 +906,38 @@ func (v *checker) checkArguments( fnInOffset = 1 } + var err *file.Error if fn.IsVariadic() { if len(arguments) < fnNumIn-1 { - return anyType, &file.Error{ + err = &file.Error{ Location: node.Location(), Message: fmt.Sprintf("not enough arguments to call %v", name), } } } else { if len(arguments) > fnNumIn { - return anyType, &file.Error{ + err = &file.Error{ Location: node.Location(), Message: fmt.Sprintf("too many arguments to call %v", name), } } if len(arguments) < fnNumIn { - return anyType, &file.Error{ + err = &file.Error{ Location: node.Location(), Message: fmt.Sprintf("not enough arguments to call %v", name), } } } + if err != nil { + // If we have an error, we should still visit all arguments to + // type check them, as a patch can fix the error later. + for _, arg := range arguments { + _, _ = v.visit(arg) + } + return fn.Out(0), err + } + for i, arg := range arguments { t, _ := v.visit(arg) diff --git a/checker/checker_test.go b/checker/checker_test.go index 35daeda45..2bf5ec864 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -170,9 +170,9 @@ type mock.Foo has no field bar (1:4) | Foo['bar'] | ...^ -Foo.Method(Not) +Foo.Method(42) too many arguments to call Method (1:5) - | Foo.Method(Not) + | Foo.Method(42) | ....^ Foo.Bar() @@ -210,9 +210,9 @@ array elements can only be selected using an integer (got string) (1:12) | ArrayOfFoo.Not | ...........^ -FuncParam(Not) +FuncParam(true) not enough arguments to call FuncParam (1:1) - | FuncParam(Not) + | FuncParam(true) | ^ MapOfFoo['str'].Not diff --git a/patcher/with_context.go b/patcher/with_context.go index 85f095d5d..55b604261 100644 --- a/patcher/with_context.go +++ b/patcher/with_context.go @@ -13,10 +13,12 @@ type WithContext struct { // Visit adds WithContext.Name argument to all functions calls with a context.Context argument. func (w WithContext) Visit(node *ast.Node) { - switch (*node).(type) { + switch call := (*node).(type) { case *ast.CallNode: - call := (*node).(*ast.CallNode) fn := call.Callee.Type() + if fn == nil { + return + } if fn.Kind() != reflect.Func { return } diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index 310cbc06a..afad4e6f0 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -104,3 +104,27 @@ func TestWithContext_with_env_method_chain(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(42), output) } + +func TestWithContext_issue529(t *testing.T) { + env := map[string]any{ + "ctx": context.Background(), + "foo": func(ctx context.Context, n int) int { + if ctx == nil { + panic("wanted a context") + } + return n + 1 + }, + } + options := []expr.Option{ + expr.Env(env), + expr.WithContext("ctx"), + } + + code := "foo(0) | foo()" + program, err := expr.Compile(code, options...) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 2, out) +} From 44dfabc57310d2ab9a6dd7a4799039bfc50df556 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 21 Jan 2024 11:55:30 +0100 Subject: [PATCH 249/506] Make AsAny the new default --- expr.go | 15 +++++++++++++++ expr_test.go | 11 +++++++++++ 2 files changed, 26 insertions(+) diff --git a/expr.go b/expr.go index 8569de8fb..f32df1d3c 100644 --- a/expr.go +++ b/expr.go @@ -65,6 +65,7 @@ func AsAny() Option { func AsKind(kind reflect.Kind) Option { return func(c *conf.Config) { c.Expect = kind + c.ExpectAny = true } } @@ -72,6 +73,7 @@ func AsKind(kind reflect.Kind) Option { func AsBool() Option { return func(c *conf.Config) { c.Expect = reflect.Bool + c.ExpectAny = true } } @@ -79,6 +81,7 @@ func AsBool() Option { func AsInt() Option { return func(c *conf.Config) { c.Expect = reflect.Int + c.ExpectAny = true } } @@ -86,6 +89,7 @@ func AsInt() Option { func AsInt64() Option { return func(c *conf.Config) { c.Expect = reflect.Int64 + c.ExpectAny = true } } @@ -93,6 +97,17 @@ func AsInt64() Option { func AsFloat64() Option { return func(c *conf.Config) { c.Expect = reflect.Float64 + c.ExpectAny = true + } +} + +// WarnOnAny tells the compiler to warn if expression return any type. +func WarnOnAny() Option { + return func(c *conf.Config) { + if c.Expect == reflect.Invalid { + panic("WarnOnAny() works only with combination with AsInt(), AsBool(), etc. options") + } + c.ExpectAny = false } } diff --git a/expr_test.go b/expr_test.go index 66ef11ce7..fb805c762 100644 --- a/expr_test.go +++ b/expr_test.go @@ -257,6 +257,17 @@ func ExampleAsFloat64_error() { // Output: expected float64, but got bool } +func ExampleWarnOnAny() { + // Arrays always have []any type. The expression return type is any. + // AsInt() instructs compiler to expect int or any, and cast to int, + // if possible. WarnOnAny() instructs to return an error on any type. + _, err := expr.Compile(`[42, true, "yes"][0]`, expr.AsInt(), expr.WarnOnAny()) + + fmt.Printf("%v", err) + + // Output: expected int, but got interface {} +} + func ExampleOperator() { code := ` Now() > CreatedAt && From 564b637c224da220c648e399669cb8c4e87d73fa Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 24 Jan 2024 23:49:57 +0100 Subject: [PATCH 250/506] Fix pipeline and call parsing --- builtin/builtin_test.go | 18 +++ parser/parser.go | 235 +++++++++++++++++----------------------- 2 files changed, 118 insertions(+), 135 deletions(-) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 0cdf9515d..e302d719d 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -327,6 +327,24 @@ func TestBuiltin_allow_builtins_override(t *testing.T) { program, err := expr.Compile(fmt.Sprintf("%s()", name), fn) require.NoError(t, err) + out, err := expr.Run(program, nil) + require.NoError(t, err) + assert.Equal(t, 42, out) + }) + } + }) + t.Run("via expr.Function as pipe", func(t *testing.T) { + for _, name := range builtin.Names { + t.Run(name, func(t *testing.T) { + fn := expr.Function(name, + func(params ...any) (any, error) { + return 42, nil + }, + new(func(s string) int), + ) + program, err := expr.Compile(fmt.Sprintf("'str' | %s()", name), fn) + require.NoError(t, err) + out, err := expr.Run(program, nil) require.NoError(t, err) assert.Equal(t, 42, out) diff --git a/parser/parser.go b/parser/parser.go index caab130db..07c1be547 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -15,22 +15,31 @@ import ( "github.com/expr-lang/expr/parser/utils" ) +type arg byte + +const ( + expr arg = 1 << iota + closure +) + +const optional arg = 1 << 7 + var predicates = map[string]struct { - arity int + args []arg }{ - "all": {2}, - "none": {2}, - "any": {2}, - "one": {2}, - "filter": {2}, - "map": {2}, - "count": {2}, - "find": {2}, - "findIndex": {2}, - "findLast": {2}, - "findLastIndex": {2}, - "groupBy": {2}, - "reduce": {3}, + "all": {[]arg{expr, closure}}, + "none": {[]arg{expr, closure}}, + "any": {[]arg{expr, closure}}, + "one": {[]arg{expr, closure}}, + "filter": {[]arg{expr, closure}}, + "map": {[]arg{expr, closure}}, + "count": {[]arg{expr, closure}}, + "find": {[]arg{expr, closure}}, + "findIndex": {[]arg{expr, closure}}, + "findLast": {[]arg{expr, closure}}, + "findLastIndex": {[]arg{expr, closure}}, + "groupBy": {[]arg{expr, closure}}, + "reduce": {[]arg{expr, closure, expr | optional}}, } type parser struct { @@ -143,7 +152,9 @@ func (p *parser) parseExpression(precedence int) Node { p.next() if opToken.Value == "|" { - nodeLeft = p.parsePipe(nodeLeft) + identToken := p.current + p.expect(Identifier) + nodeLeft = p.parseCall(identToken, []Node{nodeLeft}, true) goto next } @@ -279,7 +290,7 @@ func (p *parser) parsePrimary() Node { p.next() token = p.current p.expect(Identifier) - return p.parsePostfixExpression(p.parseCall(token, false)) + return p.parsePostfixExpression(p.parseCall(token, []Node{}, false)) } return p.parseSecondary() @@ -307,7 +318,12 @@ func (p *parser) parseSecondary() Node { node.SetLocation(token.Location) return node default: - node = p.parseCall(token, true) + if p.current.Is(Bracket, "(") { + node = p.parseCall(token, []Node{}, true) + } else { + node = &IdentifierNode{Value: token.Value} + node.SetLocation(token.Location) + } } case Number: @@ -386,68 +402,86 @@ func (p *parser) toFloatNode(number float64) Node { return &FloatNode{Value: number} } -func (p *parser) parseCall(token Token, checkOverrides bool) Node { +func (p *parser) parseCall(token Token, arguments []Node, checkOverrides bool) Node { var node Node - if p.current.Is(Bracket, "(") { - var arguments []Node - - isOverridden := p.config.IsOverridden(token.Value) - isOverridden = isOverridden && checkOverrides - - // TODO: Refactor parser to use builtin.Builtins instead of predicates map. - if b, ok := predicates[token.Value]; ok && !isOverridden { - p.expect(Bracket, "(") - - if b.arity == 1 { - arguments = make([]Node, 1) - arguments[0] = p.parseExpression(0) - } else if b.arity == 2 { - arguments = make([]Node, 2) - arguments[0] = p.parseExpression(0) - p.expect(Operator, ",") - arguments[1] = p.parseClosure() - } - if token.Value == "reduce" { - arguments = make([]Node, 2) - arguments[0] = p.parseExpression(0) - p.expect(Operator, ",") - arguments[1] = p.parseClosure() - if p.current.Is(Operator, ",") { - p.next() - arguments = append(arguments, p.parseExpression(0)) - } - } + isOverridden := p.config.IsOverridden(token.Value) + isOverridden = isOverridden && checkOverrides + + if b, ok := predicates[token.Value]; ok && !isOverridden { + p.expect(Bracket, "(") - p.expect(Bracket, ")") + // In case of the pipe operator, the first argument is the left-hand side + // of the operator, so we do not parse it as an argument inside brackets. + args := b.args[len(arguments):] - node = &BuiltinNode{ - Name: token.Value, - Arguments: arguments, + for i, arg := range args { + if arg&optional == optional { + if p.current.Is(Bracket, ")") { + break + } + } else { + if p.current.Is(Bracket, ")") { + p.error("expected at least %d arguments", len(args)) + } } - node.SetLocation(token.Location) - } else if _, ok := builtin.Index[token.Value]; ok && !p.config.Disabled[token.Value] && !isOverridden { - node = &BuiltinNode{ - Name: token.Value, - Arguments: p.parseArguments(), + + if i > 0 { + p.expect(Operator, ",") } - node.SetLocation(token.Location) - } else { - callee := &IdentifierNode{Value: token.Value} - callee.SetLocation(token.Location) - node = &CallNode{ - Callee: callee, - Arguments: p.parseArguments(), + var node Node + switch { + case arg&expr == expr: + node = p.parseExpression(0) + case arg&closure == closure: + node = p.parseClosure() } - node.SetLocation(token.Location) + arguments = append(arguments, node) + } + + p.expect(Bracket, ")") + + node = &BuiltinNode{ + Name: token.Value, + Arguments: arguments, + } + node.SetLocation(token.Location) + } else if _, ok := builtin.Index[token.Value]; ok && !p.config.Disabled[token.Value] && !isOverridden { + node = &BuiltinNode{ + Name: token.Value, + Arguments: p.parseArguments(arguments), } + node.SetLocation(token.Location) } else { - node = &IdentifierNode{Value: token.Value} + callee := &IdentifierNode{Value: token.Value} + callee.SetLocation(token.Location) + node = &CallNode{ + Callee: callee, + Arguments: p.parseArguments(arguments), + } node.SetLocation(token.Location) } return node } +func (p *parser) parseArguments(arguments []Node) []Node { + // If pipe operator is used, the first argument is the left-hand side + // of the operator, so we do not parse it as an argument inside brackets. + offset := len(arguments) + + p.expect(Bracket, "(") + for !p.current.Is(Bracket, ")") && p.err == nil { + if len(arguments) > offset { + p.expect(Operator, ",") + } + node := p.parseExpression(0) + arguments = append(arguments, node) + } + p.expect(Bracket, ")") + + return arguments +} + func (p *parser) parseClosure() Node { startToken := p.current expectClosingBracket := false @@ -575,7 +609,7 @@ func (p *parser) parsePostfixExpression(node Node) Node { memberNode.Method = true node = &CallNode{ Callee: memberNode, - Arguments: p.parseArguments(), + Arguments: p.parseArguments([]Node{}), } node.SetLocation(propertyToken.Location) } else { @@ -641,72 +675,3 @@ func (p *parser) parsePostfixExpression(node Node) Node { } return node } - -func (p *parser) parsePipe(node Node) Node { - identifier := p.current - p.expect(Identifier) - - arguments := []Node{node} - - if b, ok := predicates[identifier.Value]; ok { - p.expect(Bracket, "(") - - // TODO: Refactor parser to use builtin.Builtins instead of predicates map. - - if b.arity == 2 { - arguments = append(arguments, p.parseClosure()) - } - - if identifier.Value == "reduce" { - arguments = append(arguments, p.parseClosure()) - if p.current.Is(Operator, ",") { - p.next() - arguments = append(arguments, p.parseExpression(0)) - } - } - - p.expect(Bracket, ")") - - node = &BuiltinNode{ - Name: identifier.Value, - Arguments: arguments, - } - node.SetLocation(identifier.Location) - } else if _, ok := builtin.Index[identifier.Value]; ok { - arguments = append(arguments, p.parseArguments()...) - - node = &BuiltinNode{ - Name: identifier.Value, - Arguments: arguments, - } - node.SetLocation(identifier.Location) - } else { - callee := &IdentifierNode{Value: identifier.Value} - callee.SetLocation(identifier.Location) - - arguments = append(arguments, p.parseArguments()...) - - node = &CallNode{ - Callee: callee, - Arguments: arguments, - } - node.SetLocation(identifier.Location) - } - - return node -} - -func (p *parser) parseArguments() []Node { - p.expect(Bracket, "(") - nodes := make([]Node, 0) - for !p.current.Is(Bracket, ")") && p.err == nil { - if len(nodes) > 0 { - p.expect(Operator, ",") - } - node := p.parseExpression(0) - nodes = append(nodes, node) - } - p.expect(Bracket, ")") - - return nodes -} From 1c8c9e6c307c5110ece4d539f2c3a7121ef3aa0c Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 1 Feb 2024 00:07:26 +0700 Subject: [PATCH 251/506] Fix string literal slicing error (#543) --- expr_test.go | 4 ++++ parser/parser.go | 3 +-- parser/parser_test.go | 8 ++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/expr_test.go b/expr_test.go index fb805c762..1c01b74bb 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1180,6 +1180,10 @@ func TestExpr(t *testing.T) { `bitushr(-100, 5)`, 576460752303423484, }, + { + `"hello"[1:3]`, + "el", + }, } for _, tt := range tests { diff --git a/parser/parser.go b/parser/parser.go index 07c1be547..54ba07a59 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -369,9 +369,8 @@ func (p *parser) parseSecondary() Node { return node case String: p.next() - node := &StringNode{Value: token.Value} + node = &StringNode{Value: token.Value} node.SetLocation(token.Location) - return node default: if token.Is(Bracket, "[") { diff --git a/parser/parser_test.go b/parser/parser_test.go index 362c41fec..a6062eae1 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -523,6 +523,14 @@ world`}, Property: &IntegerNode{Value: 0}, }, }, + { + `"hello"[1:3]`, + &SliceNode{ + Node: &StringNode{Value: "hello"}, + From: &IntegerNode{Value: 1}, + To: &IntegerNode{Value: 3}, + }, + }, } for _, test := range tests { t.Run(test.input, func(t *testing.T) { From 89478f3e4cad773adf03ab7947fd4b2531d18838 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 3 Feb 2024 01:37:21 +0700 Subject: [PATCH 252/506] Optimize jump opcodes (#545) --- compiler/compiler.go | 16 ++++ compiler/compiler_test.go | 172 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 188 insertions(+) diff --git a/compiler/compiler.go b/compiler/compiler.go index ac11805e0..5c7f3603f 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -45,6 +45,9 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro case reflect.Float64: c.emit(OpCast, 2) } + if c.config.Optimize { + c.optimize() + } } program = NewProgram( @@ -1050,6 +1053,19 @@ func (c *compiler) derefInNeeded(node ast.Node) { } } +func (c *compiler) optimize() { + for i, op := range c.bytecode { + switch op { + case OpJumpIfTrue, OpJumpIfFalse, OpJumpIfNil, OpJumpIfNotNil: + target := i + c.arguments[i] + 1 + for target < len(c.bytecode) && c.bytecode[target] == op { + target += c.arguments[target] + 1 + } + c.arguments[i] = target - i - 1 + } + } +} + func kind(node ast.Node) reflect.Kind { t := node.Type() if t == nil { diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index ed11a9dd7..b7bbfcfb4 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -384,3 +384,175 @@ func TestCompile_OpCallFast(t *testing.T) { require.Equal(t, vm.OpCallFast, program.Bytecode[4]) require.Equal(t, 3, program.Arguments[4]) } + +func TestCompile_optimizes_jumps(t *testing.T) { + env := map[string]any{ + "a": true, + "b": true, + "c": true, + "d": true, + } + type op struct { + Bytecode vm.Opcode + Arg int + } + tests := []struct { + code string + want []op + }{ + { + `let foo = true; let bar = false; let baz = true; foo || bar || baz`, + []op{ + {vm.OpTrue, 0}, + {vm.OpStore, 0}, + {vm.OpFalse, 0}, + {vm.OpStore, 1}, + {vm.OpTrue, 0}, + {vm.OpStore, 2}, + {vm.OpLoadVar, 0}, + {vm.OpJumpIfTrue, 5}, + {vm.OpPop, 0}, + {vm.OpLoadVar, 1}, + {vm.OpJumpIfTrue, 2}, + {vm.OpPop, 0}, + {vm.OpLoadVar, 2}, + }, + }, + { + `a && b && c`, + []op{ + {vm.OpLoadFast, 0}, + {vm.OpJumpIfFalse, 5}, + {vm.OpPop, 0}, + {vm.OpLoadFast, 1}, + {vm.OpJumpIfFalse, 2}, + {vm.OpPop, 0}, + {vm.OpLoadFast, 2}, + }, + }, + { + `a && b || c && d`, + []op{ + {vm.OpLoadFast, 0}, + {vm.OpJumpIfFalse, 2}, + {vm.OpPop, 0}, + {vm.OpLoadFast, 1}, + {vm.OpJumpIfTrue, 5}, + {vm.OpPop, 0}, + {vm.OpLoadFast, 2}, + {vm.OpJumpIfFalse, 2}, + {vm.OpPop, 0}, + {vm.OpLoadFast, 3}, + }, + }, + { + `filter([1, 2, 3, 4, 5], # > 3 && # != 4 && # != 5)`, + []op{ + {vm.OpPush, 0}, + {vm.OpBegin, 0}, + {vm.OpJumpIfEnd, 26}, + {vm.OpPointer, 0}, + {vm.OpDeref, 0}, + {vm.OpPush, 1}, + {vm.OpMore, 0}, + {vm.OpJumpIfFalse, 18}, + {vm.OpPop, 0}, + {vm.OpPointer, 0}, + {vm.OpDeref, 0}, + {vm.OpPush, 2}, + {vm.OpEqual, 0}, + {vm.OpNot, 0}, + {vm.OpJumpIfFalse, 11}, + {vm.OpPop, 0}, + {vm.OpPointer, 0}, + {vm.OpDeref, 0}, + {vm.OpPush, 3}, + {vm.OpEqual, 0}, + {vm.OpNot, 0}, + {vm.OpJumpIfFalse, 4}, + {vm.OpPop, 0}, + {vm.OpIncrementCount, 0}, + {vm.OpPointer, 0}, + {vm.OpJump, 1}, + {vm.OpPop, 0}, + {vm.OpIncrementIndex, 0}, + {vm.OpJumpBackward, 27}, + {vm.OpGetCount, 0}, + {vm.OpEnd, 0}, + {vm.OpArray, 0}, + }, + }, + { + `let foo = true; let bar = false; let baz = true; foo && bar || baz`, + []op{ + {vm.OpTrue, 0}, + {vm.OpStore, 0}, + {vm.OpFalse, 0}, + {vm.OpStore, 1}, + {vm.OpTrue, 0}, + {vm.OpStore, 2}, + {vm.OpLoadVar, 0}, + {vm.OpJumpIfFalse, 2}, + {vm.OpPop, 0}, + {vm.OpLoadVar, 1}, + {vm.OpJumpIfTrue, 2}, + {vm.OpPop, 0}, + {vm.OpLoadVar, 2}, + }, + }, + { + `true ?? nil ?? nil ?? nil`, + []op{ + {vm.OpTrue, 0}, + {vm.OpJumpIfNotNil, 8}, + {vm.OpPop, 0}, + {vm.OpNil, 0}, + {vm.OpJumpIfNotNil, 5}, + {vm.OpPop, 0}, + {vm.OpNil, 0}, + {vm.OpJumpIfNotNil, 2}, + {vm.OpPop, 0}, + {vm.OpNil, 0}, + }, + }, + { + `let m = {"a": {"b": {"c": 1}}}; m?.a?.b?.c`, + []op{ + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpPush, 2}, + {vm.OpPush, 3}, + {vm.OpPush, 3}, + {vm.OpMap, 0}, + {vm.OpPush, 3}, + {vm.OpMap, 0}, + {vm.OpPush, 3}, + {vm.OpMap, 0}, + {vm.OpStore, 0}, + {vm.OpLoadVar, 0}, + {vm.OpJumpIfNil, 8}, + {vm.OpPush, 0}, + {vm.OpFetch, 0}, + {vm.OpJumpIfNil, 5}, + {vm.OpPush, 1}, + {vm.OpFetch, 0}, + {vm.OpJumpIfNil, 2}, + {vm.OpPush, 2}, + {vm.OpFetch, 0}, + }, + }, + } + + for _, test := range tests { + t.Run(test.code, func(t *testing.T) { + program, err := expr.Compile(test.code, expr.Env(env)) + require.NoError(t, err) + + require.Equal(t, len(test.want), len(program.Bytecode)) + for i, op := range test.want { + require.Equal(t, op.Bytecode, program.Bytecode[i]) + require.Equalf(t, op.Arg, program.Arguments[i], "at %d", i) + } + }) + } +} From c7658ac65da183e42d5d4046ede18edef735d60d Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 8 Feb 2024 18:20:20 +0700 Subject: [PATCH 253/506] Add optional array access like `foo?.[42]` (#550) --- expr_test.go | 22 ++++++++++++++++++++++ parser/parser.go | 10 ++++++++++ parser/parser_test.go | 13 +++++++++++++ 3 files changed, 45 insertions(+) diff --git a/expr_test.go b/expr_test.go index 1c01b74bb..52aff7fd1 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1184,6 +1184,18 @@ func TestExpr(t *testing.T) { `"hello"[1:3]`, "el", }, + { + `[1, 2, 3]?.[0]`, + 1, + }, + { + `[[1, 2], 3, 4]?.[0]?.[1]`, + 2, + }, + { + `[nil, 3, 4]?.[0]?.[1]`, + nil, + }, } for _, tt := range tests { @@ -1281,6 +1293,16 @@ func TestExpr_optional_chaining_nested_chains(t *testing.T) { assert.Equal(t, "baz", got) } +func TestExpr_optional_chaining_array(t *testing.T) { + env := map[string]any{} + program, err := expr.Compile("foo?.[1]?.[2]?.[3]", expr.Env(env), expr.AllowUndefinedVariables()) + require.NoError(t, err) + + got, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, nil, got) +} + func TestExpr_eval_with_env(t *testing.T) { _, err := expr.Eval("true", expr.Env(map[string]any{})) assert.Error(t, err) diff --git a/parser/parser.go b/parser/parser.go index 54ba07a59..bc620ac68 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -575,10 +575,16 @@ end: func (p *parser) parsePostfixExpression(node Node) Node { postfixToken := p.current for (postfixToken.Is(Operator) || postfixToken.Is(Bracket)) && p.err == nil { + optional := postfixToken.Value == "?." + parseToken: if postfixToken.Value == "." || postfixToken.Value == "?." { p.next() propertyToken := p.current + if optional && propertyToken.Is(Bracket, "[") { + postfixToken = propertyToken + goto parseToken + } p.next() if propertyToken.Kind != Identifier && @@ -662,8 +668,12 @@ func (p *parser) parsePostfixExpression(node Node) Node { node = &MemberNode{ Node: node, Property: from, + Optional: optional, } node.SetLocation(postfixToken.Location) + if optional { + node = &ChainNode{Node: node} + } p.expect(Bracket, "]") } } diff --git a/parser/parser_test.go b/parser/parser_test.go index a6062eae1..b633bd52e 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -747,6 +747,19 @@ func TestParse_optional_chaining(t *testing.T) { }, }, }, + { + "foo.bar?.[0]", + &ChainNode{ + Node: &MemberNode{ + Node: &MemberNode{ + Node: &IdentifierNode{Value: "foo"}, + Property: &StringNode{Value: "bar"}, + }, + Property: &IntegerNode{Value: 0}, + Optional: true, + }, + }, + }, } for _, test := range parseTests { actual, err := parser.Parse(test.input) From 013c32fe5294be0394deb11d0ee97bdb2c7c51fa Mon Sep 17 00:00:00 2001 From: Vladimir Fetisov Date: Thu, 8 Feb 2024 21:07:58 +0100 Subject: [PATCH 254/506] Fix operator overloading (#554) --- conf/operators.go | 3 ++- expr_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/conf/operators.go b/conf/operators.go index ca6606274..ced209fdc 100644 --- a/conf/operators.go +++ b/conf/operators.go @@ -48,12 +48,13 @@ func (p *OperatorPatcher) Visit(node *ast.Node) { leftType := binaryNode.Left.Type() rightType := binaryNode.Right.Type() - _, fn, ok := FindSuitableOperatorOverload(fns, p.Types, leftType, rightType) + ret, fn, ok := FindSuitableOperatorOverload(fns, p.Types, leftType, rightType) if ok { newNode := &ast.CallNode{ Callee: &ast.IdentifierNode{Value: fn}, Arguments: []ast.Node{binaryNode.Left, binaryNode.Right}, } + newNode.SetType(ret) ast.Patch(node, newNode) } } diff --git a/expr_test.go b/expr_test.go index 52aff7fd1..7c20e4899 100644 --- a/expr_test.go +++ b/expr_test.go @@ -311,6 +311,47 @@ func ExampleOperator() { // Output: true } +func ExampleOperator_Decimal() { + type Decimal struct{ N float64 } + code := `A + B - C` + + type Env struct { + A, B, C Decimal + Sub func(a, b Decimal) Decimal + Add func(a, b Decimal) Decimal + } + + options := []expr.Option{ + expr.Env(Env{}), + expr.Operator("+", "Add"), + expr.Operator("-", "Sub"), + } + + program, err := expr.Compile(code, options...) + if err != nil { + fmt.Printf("Compile error: %v", err) + return + } + + env := Env{ + A: Decimal{3}, + B: Decimal{2}, + C: Decimal{1}, + Sub: func(a, b Decimal) Decimal { return Decimal{a.N - b.N} }, + Add: func(a, b Decimal) Decimal { return Decimal{a.N + b.N} }, + } + + output, err := expr.Run(program, env) + if err != nil { + fmt.Printf("%v", err) + return + } + + fmt.Printf("%v", output) + + // Output: {4} +} + func fib(n int) int { if n <= 1 { return n From 83b8df3a4a5324b174e552c5139bf1a352866b7c Mon Sep 17 00:00:00 2001 From: Yuriy Panarin Date: Sun, 11 Feb 2024 22:21:49 +0100 Subject: [PATCH 255/506] code(builtin) - add reverse function (#553) * code(builtin) - add reverse function * docs(language-definition.md) - add reverse function --- builtin/builtin.go | 34 ++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 32 ++++++++++++++++++++++++++++++++ docs/language-definition.md | 9 +++++++++ 3 files changed, 75 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index 14fc8a4b7..beeb94e91 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -868,6 +868,40 @@ var Builtins = []*Function{ return anyType, fmt.Errorf("cannot transform %s from pairs", args[0]) }, }, + { + Name: "reverse", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot reverse %s", v.Kind()) + } + + size := v.Len() + arr := make([]any, size) + + for i := 0; i < size; i++ { + arr[i] = v.Index(size - i - 1).Interface() + } + + return arr, nil + + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + return arrayType, nil + default: + return anyType, fmt.Errorf("cannot reverse %s", args[0]) + } + }, + }, { Name: "sort", Func: func(args ...any) (any, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index e302d719d..d6b967d13 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -483,6 +483,38 @@ func TestBuiltin_type(t *testing.T) { } } +func TestBuiltin_reverse(t *testing.T) { + env := map[string]any{ + "ArrayOfString": []string{"foo", "bar", "baz"}, + "ArrayOfInt": []int{2, 1, 3}, + "ArrayOfFloat": []float64{3.0, 2.0, 1.0}, + "ArrayOfFoo": []mock.Foo{{Value: "c"}, {Value: "a"}, {Value: "b"}}, + } + tests := []struct { + input string + want any + }{ + {`reverse([])`, []any{}}, + {`reverse(ArrayOfInt)`, []any{3, 1, 2}}, + {`reverse(ArrayOfFloat)`, []any{1.0, 2.0, 3.0}}, + {`reverse(ArrayOfFoo)`, []any{mock.Foo{Value: "b"}, mock.Foo{Value: "a"}, mock.Foo{Value: "c"}}}, + {`reverse([[1,2], [2,2]])`, []any{[]any{2, 2}, []any{1, 2}}}, + {`reverse(reverse([[1,2], [2,2]]))`, []any{[]any{1, 2}, []any{2, 2}}}, + {`reverse([{"test": true}, {id:4}, {name: "value"}])`, []any{map[string]any{"name": "value"}, map[string]any{"id": 4}, map[string]any{"test": true}}}, + } + + for _, test := range tests { + t.Run(test.input, func(t *testing.T) { + program, err := expr.Compile(test.input, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, test.want, out) + }) + } +} + func TestBuiltin_sort(t *testing.T) { env := map[string]any{ "ArrayOfString": []string{"foo", "bar", "baz"}, diff --git a/docs/language-definition.md b/docs/language-definition.md index 3b72c0832..e5267f9a8 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -713,6 +713,15 @@ Returns the first `n` elements from an array. If the array has fewer than `n` el take([1, 2, 3, 4], 2) == [1, 2] ``` +### reverse(array) {#reverse} + +Return new reversed copy of the array. + +```expr +reverse([3, 1, 4]) == [4, 1, 3] +reverse(reverse([3, 1, 4])) == [3, 1, 4] +``` + ### sort(array[, order]) {#sort} Sorts an array in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc` From 3c03e5965172519f7bc12100db6607d6a9fae031 Mon Sep 17 00:00:00 2001 From: Sergey Date: Mon, 12 Feb 2024 04:23:48 +0700 Subject: [PATCH 256/506] Optimize boolean operations between all, any, one, none functions (#555) --- optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 122 +++++++++++++++++++++++++++++ optimizer/predicate_combination.go | 51 ++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 optimizer/predicate_combination.go diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index a9c0fa3d3..6d1fb0b54 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -36,5 +36,6 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLen{}) Walk(node, &filterLast{}) Walk(node, &filterFirst{}) + Walk(node, &predicateCombination{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index e45de763b..703bd1ceb 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -1,6 +1,7 @@ package optimizer_test import ( + "fmt" "reflect" "strings" "testing" @@ -339,3 +340,124 @@ func TestOptimize_filter_map_first(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_predicate_combination(t *testing.T) { + tests := []struct { + op string + fn string + wantOp string + }{ + {"and", "all", "and"}, + {"&&", "all", "&&"}, + {"or", "all", "or"}, + {"||", "all", "||"}, + {"and", "any", "and"}, + {"&&", "any", "&&"}, + {"or", "any", "or"}, + {"||", "any", "||"}, + {"and", "none", "or"}, + {"&&", "none", "||"}, + {"and", "one", "or"}, + {"&&", "one", "||"}, + } + + for _, tt := range tests { + rule := fmt.Sprintf(`%s(users, .Age > 18 and .Name != "Bob") %s %s(users, .Age < 30)`, tt.fn, tt.op, tt.fn) + t.Run(rule, func(t *testing.T) { + tree, err := parser.Parse(rule) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: tt.fn, + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: tt.wantOp, + Left: &ast.BinaryNode{ + Operator: "and", + Left: &ast.BinaryNode{ + Operator: ">", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 18}, + }, + Right: &ast.BinaryNode{ + Operator: "!=", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + Right: &ast.BinaryNode{ + Operator: "<", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 30}, + }, + }, + }, + }, + } + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) + }) + } +} + +func TestOptimize_predicate_combination_nested(t *testing.T) { + tree, err := parser.Parse(`any(users, {all(.Friends, {.Age == 18 })}) && any(users, {all(.Friends, {.Name != "Bob" })})`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "any", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BuiltinNode{ + Name: "all", + Arguments: []ast.Node{ + &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Friends"}, + }, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "&&", + Left: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 18}, + }, + Right: &ast.BinaryNode{ + Operator: "!=", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + }, + }, + }, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} diff --git a/optimizer/predicate_combination.go b/optimizer/predicate_combination.go new file mode 100644 index 000000000..2733781df --- /dev/null +++ b/optimizer/predicate_combination.go @@ -0,0 +1,51 @@ +package optimizer + +import ( + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser/operator" +) + +type predicateCombination struct{} + +func (v *predicateCombination) Visit(node *Node) { + if op, ok := (*node).(*BinaryNode); ok && operator.IsBoolean(op.Operator) { + if left, ok := op.Left.(*BuiltinNode); ok { + if combinedOp, ok := combinedOperator(left.Name, op.Operator); ok { + if right, ok := op.Right.(*BuiltinNode); ok && right.Name == left.Name { + if left.Arguments[0].Type() == right.Arguments[0].Type() && left.Arguments[0].String() == right.Arguments[0].String() { + closure := &ClosureNode{ + Node: &BinaryNode{ + Operator: combinedOp, + Left: left.Arguments[1].(*ClosureNode).Node, + Right: right.Arguments[1].(*ClosureNode).Node, + }, + } + v.Visit(&closure.Node) + Patch(node, &BuiltinNode{ + Name: left.Name, + Arguments: []Node{ + left.Arguments[0], + closure, + }, + }) + } + } + } + } + } +} + +func combinedOperator(fn, op string) (string, bool) { + switch fn { + case "all", "any": + return op, true + case "one", "none": + switch op { + case "and": + return "or", true + case "&&": + return "||", true + } + } + return "", false +} From 4354d88e824e96163f86f9af03f70682dc978cce Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 11 Feb 2024 22:48:38 +0100 Subject: [PATCH 257/506] Code style --- builtin/lib.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/builtin/lib.go b/builtin/lib.go index 228a74893..4671c93b0 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -57,8 +57,9 @@ func Type(arg any) any { return "func" case reflect.Struct: return "struct" + default: + return "unknown" } - return "unknown" } func Abs(x any) any { From 894cea150a6adc0f3cb95b9328ee0e1785886615 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 11 Feb 2024 22:49:25 +0100 Subject: [PATCH 258/506] Move bitFunc to utils.go --- builtin/lib.go | 21 --------------------- builtin/utils.go | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/builtin/lib.go b/builtin/lib.go index 4671c93b0..00b4c9210 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -273,24 +273,3 @@ func Min(args ...any) (any, error) { } return min, nil } - -func bitFunc(name string, fn func(x, y int) (any, error)) *Function { - return &Function{ - Name: name, - Func: func(args ...any) (any, error) { - if len(args) != 2 { - return nil, fmt.Errorf("invalid number of arguments for %s (expected 2, got %d)", name, len(args)) - } - x, err := toInt(args[0]) - if err != nil { - return nil, fmt.Errorf("%v to call %s", err, name) - } - y, err := toInt(args[1]) - if err != nil { - return nil, fmt.Errorf("%v to call %s", err, name) - } - return fn(x, y) - }, - Types: types(new(func(int, int) int)), - } -} diff --git a/builtin/utils.go b/builtin/utils.go index f831e95b6..70b612b04 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -90,3 +90,24 @@ func toInt(val any) (int, error) { return 0, fmt.Errorf("cannot use %T as argument (type int)", val) } } + +func bitFunc(name string, fn func(x, y int) (any, error)) *Function { + return &Function{ + Name: name, + Func: func(args ...any) (any, error) { + if len(args) != 2 { + return nil, fmt.Errorf("invalid number of arguments for %s (expected 2, got %d)", name, len(args)) + } + x, err := toInt(args[0]) + if err != nil { + return nil, fmt.Errorf("%v to call %s", err, name) + } + y, err := toInt(args[1]) + if err != nil { + return nil, fmt.Errorf("%v to call %s", err, name) + } + return fn(x, y) + }, + Types: types(new(func(int, int) int)), + } +} From e53cefe2ef29c793f3867e4568e1c81dc76a50ad Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 11 Feb 2024 22:58:31 +0100 Subject: [PATCH 259/506] Add program.Locations() --- vm/program.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vm/program.go b/vm/program.go index 041cab51d..e410bef65 100644 --- a/vm/program.go +++ b/vm/program.go @@ -64,6 +64,11 @@ func (program *Program) Node() ast.Node { return program.node } +// Locations returns a slice of bytecode's locations. +func (program *Program) Locations() []file.Location { + return program.locations +} + // Disassemble returns opcodes as a string. func (program *Program) Disassemble() string { var buf bytes.Buffer From 84ac0b84b58fc608ffe9648c8b76debdbdc382ba Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 11 Feb 2024 23:25:04 +0100 Subject: [PATCH 260/506] Add OpCallSafe --- builtin/builtin.go | 13 +++++++------ builtin/function.go | 14 +++++++------- compiler/compiler.go | 10 ++++------ vm/opcodes.go | 2 +- vm/program.go | 6 +++--- vm/utils.go | 6 +++++- vm/vm.go | 22 ++++++++++++++-------- 7 files changed, 41 insertions(+), 32 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index beeb94e91..f7b7bdeb1 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -316,15 +316,16 @@ var Builtins = []*Function{ }, { Name: "repeat", - ValidateArgs: func(args ...any) (any, error) { + Safe: func(args ...any) (any, uint, error) { + s := args[0].(string) n := runtime.ToInt(args[1]) if n < 0 { - panic(fmt.Errorf("invalid argument for repeat (expected positive integer, got %d)", n)) + return nil, 0, fmt.Errorf("invalid argument for repeat (expected positive integer, got %d)", n) } - return uint(n), nil - }, - Func: func(args ...any) (any, error) { - return strings.Repeat(args[0].(string), runtime.ToInt(args[1])), nil + if n > 1e6 { + return nil, 0, fmt.Errorf("memory budget exceeded") + } + return strings.Repeat(s, n), uint(len(s) * n), nil }, Types: types(strings.Repeat), }, diff --git a/builtin/function.go b/builtin/function.go index e6d882340..d4d78b1ce 100644 --- a/builtin/function.go +++ b/builtin/function.go @@ -5,13 +5,13 @@ import ( ) type Function struct { - Name string - Func func(args ...any) (any, error) - Fast func(arg any) any - ValidateArgs func(args ...any) (any, error) - Types []reflect.Type - Validate func(args []reflect.Type) (reflect.Type, error) - Predicate bool + Name string + Fast func(arg any) any + Func func(args ...any) (any, error) + Safe func(args ...any) (any, uint, error) + Types []reflect.Type + Validate func(args []reflect.Type) (reflect.Type, error) + Predicate bool } func (f *Function) Type() reflect.Type { diff --git a/compiler/compiler.go b/compiler/compiler.go index 5c7f3603f..252699859 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -116,7 +116,7 @@ func (c *compiler) addConstant(constant any) int { indexable := true hash := constant switch reflect.TypeOf(constant).Kind() { - case reflect.Slice, reflect.Map, reflect.Struct: + case reflect.Slice, reflect.Map, reflect.Struct, reflect.Func: indexable = false } if field, ok := constant.(*runtime.Field); ok { @@ -908,13 +908,11 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.compile(arg) } - if f.ValidateArgs != nil { - c.emit(OpLoadFunc, c.addFunction("$_validate_args_"+f.Name, f.ValidateArgs)) - c.emit(OpValidateArgs, len(node.Arguments)) - } - if f.Fast != nil { c.emit(OpCallBuiltin1, id) + } else if f.Safe != nil { + c.emit(OpPush, c.addConstant(f.Safe)) + c.emit(OpCallSafe, len(node.Arguments)) } else if f.Func != nil { c.emitFunction(f, len(node.Arguments)) } diff --git a/vm/opcodes.go b/vm/opcodes.go index 57b840507..dc3c97d0c 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -58,9 +58,9 @@ const ( OpCall3 OpCallN OpCallFast + OpCallSafe OpCallTyped OpCallBuiltin1 - OpValidateArgs OpArray OpMap OpLen diff --git a/vm/program.go b/vm/program.go index e410bef65..fa9fefd8f 100644 --- a/vm/program.go +++ b/vm/program.go @@ -290,6 +290,9 @@ func (program *Program) DisassembleWriter(w io.Writer) { case OpCallFast: argument("OpCallFast") + case OpCallSafe: + argument("OpCallSafe") + case OpCallTyped: signature := reflect.TypeOf(FuncTypes[arg]).Elem().String() _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, "OpCallTyped", arg, signature) @@ -297,9 +300,6 @@ func (program *Program) DisassembleWriter(w io.Writer) { case OpCallBuiltin1: builtinArg("OpCallBuiltin1") - case OpValidateArgs: - argument("OpValidateArgs") - case OpArray: code("OpArray") diff --git a/vm/utils.go b/vm/utils.go index f9ec81a8c..dc7f56944 100644 --- a/vm/utils.go +++ b/vm/utils.go @@ -4,8 +4,12 @@ import ( "reflect" ) -type Function = func(params ...any) (any, error) +type ( + Function = func(params ...any) (any, error) + SafeFunction = func(params ...any) (any, uint, error) +) +// MemoryBudget represents an upper limit of memory usage. var MemoryBudget uint = 1e6 var errorType = reflect.TypeOf((*error)(nil)).Elem() diff --git a/vm/vm.go b/vm/vm.go index 0bde66634..f3dc4ab15 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -389,20 +389,26 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { } vm.push(fn(in...)) + case OpCallSafe: + fn := vm.pop().(SafeFunction) + size := arg + in := make([]any, size) + for i := int(size) - 1; i >= 0; i-- { + in[i] = vm.pop() + } + out, mem, err := fn(in...) + if err != nil { + panic(err) + } + vm.memGrow(mem) + vm.push(out) + case OpCallTyped: vm.push(vm.call(vm.pop(), arg)) case OpCallBuiltin1: vm.push(builtin.Builtins[arg].Fast(vm.pop())) - case OpValidateArgs: - fn := vm.pop().(Function) - mem, err := fn(vm.Stack[len(vm.Stack)-arg:]...) - if err != nil { - panic(err) - } - vm.memGrow(mem.(uint)) - case OpArray: size := vm.pop().(int) vm.memGrow(uint(size)) From ffaec9e78a6e4cbd418620588567695eaad2925c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 12 Feb 2024 22:09:41 +0100 Subject: [PATCH 261/506] Fix ast printing of ?.[ --- ast/print.go | 2 +- ast/print_test.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ast/print.go b/ast/print.go index 7ecb1c04c..fa593ae28 100644 --- a/ast/print.go +++ b/ast/print.go @@ -112,7 +112,7 @@ func (n *MemberNode) String() string { if str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) { return fmt.Sprintf("%s?.%s", n.Node.String(), str.Value) } else { - return fmt.Sprintf("get(%s, %s)", n.Node.String(), n.Property.String()) + return fmt.Sprintf("%s?.[%s]", n.Node.String(), n.Property.String()) } } if str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) { diff --git a/ast/print_test.go b/ast/print_test.go index 2ecff147c..16d64357b 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -28,6 +28,8 @@ func TestPrint(t *testing.T) { {`a["the b"]`, `a["the b"]`}, {`a.b[0]`, `a.b[0]`}, {`a?.b`, `a?.b`}, + {`x[0][1]`, `x[0][1]`}, + {`x?.[0]?.[1]`, `x?.[0]?.[1]`}, {`-a`, `-a`}, {`!a`, `!a`}, {`not a`, `not a`}, @@ -88,7 +90,7 @@ func TestPrint_MemberNode(t *testing.T) { Property: &ast.StringNode{Value: "b c"}, Optional: true, } - require.Equal(t, `get(a, "b c")`, node.String()) + require.Equal(t, `a?.["b c"]`, node.String()) } func TestPrint_ConstantNode(t *testing.T) { From 0bc9d995efba166c17f20b0fc6bd6b7d28632b7f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Mon, 12 Feb 2024 22:58:19 +0100 Subject: [PATCH 262/506] Update SECURITY.md --- SECURITY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 6e343ee36..8d692a398 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,11 +11,11 @@ unless this is not possible or feasible with a reasonable effort. | Version | Supported | |---------|--------------------| +| 1.16 | :white_check_mark: | | 1.15 | :white_check_mark: | | 1.14 | :white_check_mark: | | 1.13 | :white_check_mark: | -| 1.12 | :white_check_mark: | -| < 1.12 | :x: | +| < 1.13 | :x: | ## Reporting a Vulnerability From 36f9adb32bf638876b4d3f4f45449b33799f3510 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 15 Feb 2024 19:53:35 +0100 Subject: [PATCH 263/506] Refactor groupBy and sortBy (#562) * Rearrange opcodes * Refactor groupBy * Fix tests * Super opcodes for GroupBy * Refactor sortBy builtin * Fix sortBy bench --- bench_test.go | 2 +- builtin/builtin.go | 137 ++++++++++++++-------------------------- builtin/builtin_test.go | 18 +++++- builtin/sort.go | 96 ---------------------------- checker/checker.go | 26 +++++++- checker/checker_test.go | 10 --- compiler/compiler.go | 22 ++++++- debug/debugger.go | 3 - parser/parser.go | 1 + vm/opcodes.go | 8 ++- vm/program.go | 22 ++++--- vm/runtime/sort.go | 45 +++++++++++++ vm/utils.go | 18 +++++- vm/vm.go | 67 ++++++++++++++------ 14 files changed, 237 insertions(+), 238 deletions(-) delete mode 100644 builtin/sort.go create mode 100644 vm/runtime/sort.go diff --git a/bench_test.go b/bench_test.go index 601be77a2..ebeed5d18 100644 --- a/bench_test.go +++ b/bench_test.go @@ -486,7 +486,7 @@ func Benchmark_sortBy(b *testing.B) { env["arr"].([]Foo)[i] = Foo{Value: v.(int)} } - program, err := expr.Compile(`sortBy(arr, "Value")`, expr.Env(env)) + program, err := expr.Compile(`sortBy(arr, .Value)`, expr.Env(env)) require.NoError(b, err) var out any diff --git a/builtin/builtin.go b/builtin/builtin.go index f7b7bdeb1..70a8c09c7 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -87,6 +87,11 @@ var Builtins = []*Function{ Predicate: true, Types: types(new(func([]any, func(any) any) map[any][]any)), }, + { + Name: "sortBy", + Predicate: true, + Types: types(new(func([]any, func(any) bool, string) []any)), + }, { Name: "reduce", Predicate: true, @@ -905,109 +910,65 @@ var Builtins = []*Function{ }, { Name: "sort", - Func: func(args ...any) (any, error) { + Safe: func(args ...any) (any, uint, error) { if len(args) != 1 && len(args) != 2 { - return nil, fmt.Errorf("invalid number of arguments (expected 1 or 2, got %d)", len(args)) + return nil, 0, fmt.Errorf("invalid number of arguments (expected 1 or 2, got %d)", len(args)) } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot sort %s", v.Kind()) - } + var array []any - orderBy := OrderBy{} - if len(args) == 2 { - dir, err := ascOrDesc(args[1]) - if err != nil { - return nil, err + switch in := args[0].(type) { + case []any: + array = make([]any, len(in)) + copy(array, in) + case []int: + array = make([]any, len(in)) + for i, v := range in { + array[i] = v + } + case []float64: + array = make([]any, len(in)) + for i, v := range in { + array[i] = v + } + case []string: + array = make([]any, len(in)) + for i, v := range in { + array[i] = v } - orderBy.Desc = dir } - sortable, err := copyArray(v, orderBy) - if err != nil { - return nil, err - } - sort.Sort(sortable) - return sortable.Array, nil - }, - Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 && len(args) != 2 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1 or 2, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot sort %s", args[0]) - } + var desc bool if len(args) == 2 { - switch kind(args[1]) { - case reflect.String, reflect.Interface: + switch args[1].(string) { + case "asc": + desc = false + case "desc": + desc = true default: - return anyType, fmt.Errorf("invalid argument for sort (expected string, got %s)", args[1]) + return nil, 0, fmt.Errorf("invalid order %s, expected asc or desc", args[1]) } } - return arrayType, nil - }, - }, - { - Name: "sortBy", - Func: func(args ...any) (any, error) { - if len(args) != 2 && len(args) != 3 { - return nil, fmt.Errorf("invalid number of arguments (expected 2 or 3, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot sort %s", v.Kind()) - } - - orderBy := OrderBy{} - - field, ok := args[1].(string) - if !ok { - return nil, fmt.Errorf("invalid argument for sort (expected string, got %s)", reflect.TypeOf(args[1])) - } - orderBy.Field = field - - if len(args) == 3 { - dir, err := ascOrDesc(args[2]) - if err != nil { - return nil, err - } - orderBy.Desc = dir - } - - sortable, err := copyArray(v, orderBy) - if err != nil { - return nil, err + sortable := &runtime.Sort{ + Desc: desc, + Array: array, } sort.Sort(sortable) - return sortable.Array, nil - }, - Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 2 && len(args) != 3 { - return anyType, fmt.Errorf("invalid number of arguments (expected 2 or 3, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot sort %s", args[0]) - } - switch kind(args[1]) { - case reflect.String, reflect.Interface: - default: - return anyType, fmt.Errorf("invalid argument for sort (expected string, got %s)", args[1]) - } - if len(args) == 3 { - switch kind(args[2]) { - case reflect.String, reflect.Interface: - default: - return anyType, fmt.Errorf("invalid argument for sort (expected string, got %s)", args[1]) - } - } - return arrayType, nil + + return sortable.Array, uint(len(array)), nil }, + Types: types( + new(func([]any, string) []any), + new(func([]int, string) []any), + new(func([]float64, string) []any), + new(func([]string, string) []any), + + new(func([]any) []any), + new(func([]float64) []any), + new(func([]string) []any), + new(func([]int) []any), + ), }, bitFunc("bitand", func(x, y int) (any, error) { return x & y, nil diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index d6b967d13..87e2a7c9d 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -530,8 +530,8 @@ func TestBuiltin_sort(t *testing.T) { {`sort(ArrayOfInt)`, []any{1, 2, 3}}, {`sort(ArrayOfFloat)`, []any{1.0, 2.0, 3.0}}, {`sort(ArrayOfInt, 'desc')`, []any{3, 2, 1}}, - {`sortBy(ArrayOfFoo, 'Value')`, []any{mock.Foo{Value: "a"}, mock.Foo{Value: "b"}, mock.Foo{Value: "c"}}}, - {`sortBy([{id: "a"}, {id: "b"}], "id", "desc")`, []any{map[string]any{"id": "b"}, map[string]any{"id": "a"}}}, + {`sortBy(ArrayOfFoo, .Value)`, []any{mock.Foo{Value: "a"}, mock.Foo{Value: "b"}, mock.Foo{Value: "c"}}}, + {`sortBy([{id: "a"}, {id: "b"}], .id, "desc")`, []any{map[string]any{"id": "b"}, map[string]any{"id": "a"}}}, } for _, test := range tests { @@ -546,6 +546,20 @@ func TestBuiltin_sort(t *testing.T) { } } +func TestBuiltin_sort_i64(t *testing.T) { + env := map[string]any{ + "array": []int{1, 2, 3}, + "i64": int64(1), + } + + program, err := expr.Compile(`sort(map(array, i64))`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, []any{int64(1), int64(1), int64(1)}, out) +} + func TestBuiltin_bitOpsFunc(t *testing.T) { tests := []struct { input string diff --git a/builtin/sort.go b/builtin/sort.go deleted file mode 100644 index 9b9ddc165..000000000 --- a/builtin/sort.go +++ /dev/null @@ -1,96 +0,0 @@ -package builtin - -import ( - "fmt" - "reflect" -) - -type Sortable struct { - Array []any - Values []reflect.Value - OrderBy -} - -type OrderBy struct { - Field string - Desc bool -} - -func (s *Sortable) Len() int { - return len(s.Array) -} - -func (s *Sortable) Swap(i, j int) { - s.Array[i], s.Array[j] = s.Array[j], s.Array[i] - s.Values[i], s.Values[j] = s.Values[j], s.Values[i] -} - -func (s *Sortable) Less(i, j int) bool { - a, b := s.Values[i], s.Values[j] - switch a.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if s.Desc { - return a.Int() > b.Int() - } - return a.Int() < b.Int() - case reflect.Float64, reflect.Float32: - if s.Desc { - return a.Float() > b.Float() - } - return a.Float() < b.Float() - case reflect.String: - if s.Desc { - return a.String() > b.String() - } - return a.String() < b.String() - default: - panic(fmt.Sprintf("sort: unsupported type %s", a.Kind())) - } -} - -func copyArray(v reflect.Value, orderBy OrderBy) (*Sortable, error) { - s := &Sortable{ - Array: make([]any, v.Len()), - Values: make([]reflect.Value, v.Len()), - OrderBy: orderBy, - } - var prev reflect.Value - for i := 0; i < s.Len(); i++ { - elem := deref(v.Index(i)) - var value reflect.Value - switch elem.Kind() { - case reflect.Struct: - value = elem.FieldByName(s.Field) - case reflect.Map: - value = elem.MapIndex(reflect.ValueOf(s.Field)) - default: - value = elem - } - value = deref(value) - - s.Array[i] = elem.Interface() - s.Values[i] = value - - if i == 0 { - prev = value - } else if value.Type() != prev.Type() { - return nil, fmt.Errorf("cannot sort array of different types (%s and %s)", value.Type(), prev.Type()) - } - } - return s, nil -} - -func ascOrDesc(arg any) (bool, error) { - dir, ok := arg.(string) - if !ok { - return false, fmt.Errorf("invalid argument for sort (expected string, got %s)", reflect.TypeOf(arg)) - } - switch dir { - case "desc": - return true, nil - case "asc": - return false, nil - default: - return false, fmt.Errorf(`invalid argument for sort (expected "asc" or "desc", got %q)`, dir) - } -} diff --git a/checker/checker.go b/checker/checker.go index 3dc4e95ad..11e4eee3c 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -633,7 +633,7 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { if isAny(collection) { return arrayType, info{} } - return reflect.SliceOf(collection.Elem()), info{} + return arrayType, info{} } return v.error(node.Arguments[1], "predicate should has one input and one output param") @@ -651,7 +651,7 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { closure.NumOut() == 1 && closure.NumIn() == 1 && isAny(closure.In(0)) { - return reflect.SliceOf(closure.Out(0)), info{} + return arrayType, info{} } return v.error(node.Arguments[1], "predicate should has one input and one output param") @@ -739,6 +739,28 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { } return v.error(node.Arguments[1], "predicate should has one input and one output param") + case "sortBy": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + v.begin(collection) + closure, _ := v.visit(node.Arguments[1]) + v.end() + + if len(node.Arguments) == 3 { + _, _ = v.visit(node.Arguments[2]) + } + + if isFunc(closure) && + closure.NumOut() == 1 && + closure.NumIn() == 1 && isAny(closure.In(0)) { + + return reflect.TypeOf([]any{}), info{} + } + return v.error(node.Arguments[1], "predicate should has one input and one output param") + case "reduce": collection, _ := v.visit(node.Arguments[0]) if !isArray(collection) && !isAny(collection) { diff --git a/checker/checker_test.go b/checker/checker_test.go index 2bf5ec864..bab9a0a67 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -400,11 +400,6 @@ invalid operation: < (mismatched types mock.Bar and int) (1:29) | all(ArrayOfFoo, {#.Method() < 0}) | ............................^ -map(Any, {0})[0] + "str" -invalid operation: + (mismatched types int and string) (1:18) - | map(Any, {0})[0] + "str" - | .................^ - Variadic() not enough arguments to call Variadic (1:1) | Variadic() @@ -445,11 +440,6 @@ builtin map takes only array (got int) (1:5) | map(1, {2}) | ....^ -map(filter(ArrayOfFoo, {true}), {.Not}) -type mock.Foo has no field Not (1:35) - | map(filter(ArrayOfFoo, {true}), {.Not}) - | ..................................^ - ArrayOfFoo[Foo] array elements can only be selected using an integer (got mock.Foo) (1:12) | ArrayOfFoo[Foo] diff --git a/compiler/compiler.go b/compiler/compiler.go index 252699859..a4f189e6b 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -873,11 +873,31 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { case "groupBy": c.compile(node.Arguments[0]) c.emit(OpBegin) + c.emit(OpCreate, 1) + c.emit(OpSetAcc) c.emitLoop(func() { c.compile(node.Arguments[1]) c.emit(OpGroupBy) }) - c.emit(OpGetGroupBy) + c.emit(OpGetAcc) + c.emit(OpEnd) + return + + case "sortBy": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + if len(node.Arguments) == 3 { + c.compile(node.Arguments[2]) + } else { + c.emit(OpPush, c.addConstant("asc")) + } + c.emit(OpCreate, 2) + c.emit(OpSetAcc) + c.emitLoop(func() { + c.compile(node.Arguments[1]) + c.emit(OpSortBy) + }) + c.emit(OpSort) c.emit(OpEnd) return diff --git a/debug/debugger.go b/debug/debugger.go index 6f341e30e..5676fc1b9 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -134,9 +134,6 @@ func StartDebugger(program *Program, env any) { keys = append(keys, pair{"Index", s.Index}) keys = append(keys, pair{"Len", s.Len}) keys = append(keys, pair{"Count", s.Count}) - if s.GroupBy != nil { - keys = append(keys, pair{"GroupBy", s.GroupBy}) - } if s.Acc != nil { keys = append(keys, pair{"Acc", s.Acc}) } diff --git a/parser/parser.go b/parser/parser.go index bc620ac68..1eabdebe2 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -39,6 +39,7 @@ var predicates = map[string]struct { "findLast": {[]arg{expr, closure}}, "findLastIndex": {[]arg{expr, closure}}, "groupBy": {[]arg{expr, closure}}, + "sortBy": {[]arg{expr, closure, expr | optional}}, "reduce": {[]arg{expr, closure, expr | optional}}, } diff --git a/vm/opcodes.go b/vm/opcodes.go index dc3c97d0c..0417dab61 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -70,15 +70,17 @@ const ( OpDecrementIndex OpIncrementCount OpGetIndex - OpSetIndex OpGetCount OpGetLen - OpGetGroupBy OpGetAcc + OpSetAcc + OpSetIndex OpPointer OpThrow + OpCreate OpGroupBy - OpSetAcc + OpSortBy + OpSort OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index fa9fefd8f..4a878267b 100644 --- a/vm/program.go +++ b/vm/program.go @@ -327,32 +327,38 @@ func (program *Program) DisassembleWriter(w io.Writer) { case OpGetIndex: code("OpGetIndex") - case OpSetIndex: - code("OpSetIndex") - case OpGetCount: code("OpGetCount") case OpGetLen: code("OpGetLen") - case OpGetGroupBy: - code("OpGetGroupBy") - case OpGetAcc: code("OpGetAcc") + case OpSetAcc: + code("OpSetAcc") + + case OpSetIndex: + code("OpSetIndex") + case OpPointer: code("OpPointer") case OpThrow: code("OpThrow") + case OpCreate: + argument("OpCreate") + case OpGroupBy: code("OpGroupBy") - case OpSetAcc: - code("OpSetAcc") + case OpSortBy: + code("OpSortBy") + + case OpSort: + code("OpSort") case OpBegin: code("OpBegin") diff --git a/vm/runtime/sort.go b/vm/runtime/sort.go new file mode 100644 index 000000000..fb1f340d7 --- /dev/null +++ b/vm/runtime/sort.go @@ -0,0 +1,45 @@ +package runtime + +type SortBy struct { + Desc bool + Array []any + Values []any +} + +func (s *SortBy) Len() int { + return len(s.Array) +} + +func (s *SortBy) Swap(i, j int) { + s.Array[i], s.Array[j] = s.Array[j], s.Array[i] + s.Values[i], s.Values[j] = s.Values[j], s.Values[i] +} + +func (s *SortBy) Less(i, j int) bool { + a, b := s.Values[i], s.Values[j] + if s.Desc { + return Less(b, a) + } + return Less(a, b) +} + +type Sort struct { + Desc bool + Array []any +} + +func (s *Sort) Len() int { + return len(s.Array) +} + +func (s *Sort) Swap(i, j int) { + s.Array[i], s.Array[j] = s.Array[j], s.Array[i] +} + +func (s *Sort) Less(i, j int) bool { + a, b := s.Array[i], s.Array[j] + if s.Desc { + return Less(b, a) + } + return Less(a, b) +} diff --git a/vm/utils.go b/vm/utils.go index dc7f56944..d7db2a52a 100644 --- a/vm/utils.go +++ b/vm/utils.go @@ -9,7 +9,19 @@ type ( SafeFunction = func(params ...any) (any, uint, error) ) -// MemoryBudget represents an upper limit of memory usage. -var MemoryBudget uint = 1e6 +var ( + // MemoryBudget represents an upper limit of memory usage. + MemoryBudget uint = 1e6 -var errorType = reflect.TypeOf((*error)(nil)).Elem() + errorType = reflect.TypeOf((*error)(nil)).Elem() +) + +type Scope struct { + Array reflect.Value + Index int + Len int + Count int + Acc any +} + +type groupBy = map[any][]any diff --git a/vm/vm.go b/vm/vm.go index f3dc4ab15..56d5fc2ee 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -6,6 +6,7 @@ import ( "fmt" "reflect" "regexp" + "sort" "strings" "github.com/expr-lang/expr/builtin" @@ -43,15 +44,6 @@ type VM struct { curr chan int } -type Scope struct { - Array reflect.Value - Index int - Len int - Count int - GroupBy map[any][]any - Acc any -} - func (vm *VM) Run(program *Program, env any) (_ any, err error) { defer func() { if r := recover(); r != nil { @@ -460,10 +452,6 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpGetIndex: vm.push(vm.scope().Index) - case OpSetIndex: - scope := vm.scope() - scope.Index = vm.pop().(int) - case OpGetCount: scope := vm.scope() vm.push(scope.Count) @@ -472,15 +460,16 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { scope := vm.scope() vm.push(scope.Len) - case OpGetGroupBy: - vm.push(vm.scope().GroupBy) - case OpGetAcc: vm.push(vm.scope().Acc) case OpSetAcc: vm.scope().Acc = vm.pop() + case OpSetIndex: + scope := vm.scope() + scope.Index = vm.pop().(int) + case OpPointer: scope := vm.scope() vm.push(scope.Array.Index(scope.Index).Interface()) @@ -488,14 +477,50 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpThrow: panic(vm.pop().(error)) + case OpCreate: + switch arg { + case 1: + vm.push(make(groupBy)) + case 2: + scope := vm.scope() + var desc bool + switch vm.pop().(string) { + case "asc": + desc = false + case "desc": + desc = true + default: + panic("unknown order, use asc or desc") + } + vm.push(&runtime.SortBy{ + Desc: desc, + Array: make([]any, 0, scope.Len), + Values: make([]any, 0, scope.Len), + }) + default: + panic(fmt.Sprintf("unknown OpCreate argument %v", arg)) + } + case OpGroupBy: scope := vm.scope() - if scope.GroupBy == nil { - scope.GroupBy = make(map[any][]any) - } - it := scope.Array.Index(scope.Index).Interface() key := vm.pop() - scope.GroupBy[key] = append(scope.GroupBy[key], it) + item := scope.Array.Index(scope.Index).Interface() + scope.Acc.(groupBy)[key] = append(scope.Acc.(groupBy)[key], item) + + case OpSortBy: + scope := vm.scope() + value := vm.pop() + item := scope.Array.Index(scope.Index).Interface() + sortable := scope.Acc.(*runtime.SortBy) + sortable.Array = append(sortable.Array, item) + sortable.Values = append(sortable.Values, value) + + case OpSort: + scope := vm.scope() + sortable := scope.Acc.(*runtime.SortBy) + sort.Sort(sortable) + vm.memGrow(uint(scope.Len)) + vm.push(sortable.Array) case OpBegin: a := vm.pop() From b9f96a0fd1bb029f28b04557707980526101974d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 16 Feb 2024 22:32:35 +0100 Subject: [PATCH 264/506] Add concat() builtin (#565) * Add concat() builtin * Use pkg deref in builtin * Use pkg deref in checker * Use pkg deref in types_table.go * Use pkg deref in docgen.go * Use pkg deref in vm --- builtin/builtin.go | 54 +++++++++++++++-- builtin/builtin_test.go | 12 ++-- builtin/utils.go | 29 --------- checker/checker.go | 8 +-- checker/types.go | 19 ------ conf/types_table.go | 21 +------ docgen/docgen.go | 15 +---- expr_test.go | 29 +++------ internal/deref/deref.go | 47 +++++++++++++++ internal/deref/deref_test.go | 111 +++++++++++++++++++++++++++++++++++ test/deref/deref_test.go | 16 +++++ vm/runtime/runtime.go | 40 ++----------- vm/vm.go | 3 +- 13 files changed, 255 insertions(+), 149 deletions(-) create mode 100644 internal/deref/deref.go create mode 100644 internal/deref/deref_test.go diff --git a/builtin/builtin.go b/builtin/builtin.go index 70a8c09c7..4aad6aa9c 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "github.com/expr-lang/expr/internal/deref" "github.com/expr-lang/expr/vm/runtime" ) @@ -440,7 +441,7 @@ var Builtins = []*Function{ sum := int64(0) i := 0 for ; i < v.Len(); i++ { - it := deref(v.Index(i)) + it := deref.Value(v.Index(i)) if it.CanInt() { sum += it.Int() } else if it.CanFloat() { @@ -453,7 +454,7 @@ var Builtins = []*Function{ float: fSum := float64(sum) for ; i < v.Len(); i++ { - it := deref(v.Index(i)) + it := deref.Value(v.Index(i)) if it.CanInt() { fSum += float64(it.Int()) } else if it.CanFloat() { @@ -492,7 +493,7 @@ var Builtins = []*Function{ sum := float64(0) i := 0 for ; i < v.Len(); i++ { - it := deref(v.Index(i)) + it := deref.Value(v.Index(i)) if it.CanInt() { sum += float64(it.Int()) } else if it.CanFloat() { @@ -530,7 +531,7 @@ var Builtins = []*Function{ } s := make([]float64, v.Len()) for i := 0; i < v.Len(); i++ { - it := deref(v.Index(i)) + it := deref.Value(v.Index(i)) if it.CanInt() { s[i] = float64(it.Int()) } else if it.CanFloat() { @@ -850,7 +851,7 @@ var Builtins = []*Function{ } out := reflect.MakeMap(mapType) for i := 0; i < v.Len(); i++ { - pair := deref(v.Index(i)) + pair := deref.Value(v.Index(i)) if pair.Kind() != reflect.Array && pair.Kind() != reflect.Slice { return nil, fmt.Errorf("invalid pair %v", pair) } @@ -908,6 +909,49 @@ var Builtins = []*Function{ } }, }, + { + Name: "concat", + Safe: func(args ...any) (any, uint, error) { + if len(args) == 0 { + return nil, 0, fmt.Errorf("invalid number of arguments (expected at least 1, got 0)") + } + + var size uint + var arr []any + + for _, arg := range args { + v := reflect.ValueOf(deref.Deref(arg)) + + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, 0, fmt.Errorf("cannot concat %s", v.Kind()) + } + + size += uint(v.Len()) + + for i := 0; i < v.Len(); i++ { + item := v.Index(i) + arr = append(arr, item.Interface()) + } + } + + return arr, size, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) == 0 { + return anyType, fmt.Errorf("invalid number of arguments (expected at least 1, got 0)") + } + + for _, arg := range args { + switch kind(deref.Type(arg)) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot concat %s", arg) + } + } + + return arrayType, nil + }, + }, { Name: "sort", Safe: func(args ...any) (any, uint, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 87e2a7c9d..3a2850071 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -19,11 +19,13 @@ import ( ) func TestBuiltin(t *testing.T) { + ArrayWithNil := []any{42} env := map[string]any{ - "ArrayOfString": []string{"foo", "bar", "baz"}, - "ArrayOfInt": []int{1, 2, 3}, - "ArrayOfAny": []any{1, "2", true}, - "ArrayOfFoo": []mock.Foo{{Value: "a"}, {Value: "b"}, {Value: "c"}}, + "ArrayOfString": []string{"foo", "bar", "baz"}, + "ArrayOfInt": []int{1, 2, 3}, + "ArrayOfAny": []any{1, "2", true}, + "ArrayOfFoo": []mock.Foo{{Value: "a"}, {Value: "b"}, {Value: "c"}}, + "PtrArrayWithNil": &ArrayWithNil, } var tests = []struct { @@ -130,6 +132,8 @@ func TestBuiltin(t *testing.T) { {`reduce(1..9, # + #acc)`, 45}, {`reduce([.5, 1.5, 2.5], # + #acc, 0)`, 4.5}, {`reduce([], 5, 0)`, 0}, + {`concat(ArrayOfString, ArrayOfInt)`, []any{"foo", "bar", "baz", 1, 2, 3}}, + {`concat(PtrArrayWithNil, [nil])`, []any{42, nil}}, } for _, test := range tests { diff --git a/builtin/utils.go b/builtin/utils.go index 70b612b04..7d3b6ee8e 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -35,35 +35,6 @@ func types(types ...any) []reflect.Type { return ts } -func deref(v reflect.Value) reflect.Value { - if v.Kind() == reflect.Interface { - if v.IsNil() { - return v - } - v = v.Elem() - } - -loop: - for v.Kind() == reflect.Ptr { - if v.IsNil() { - return v - } - indirect := reflect.Indirect(v) - switch indirect.Kind() { - case reflect.Struct, reflect.Map, reflect.Array, reflect.Slice: - break loop - default: - v = v.Elem() - } - } - - if v.IsValid() { - return v - } - - panic(fmt.Sprintf("cannot deref %s", v)) -} - func toInt(val any) (int, error) { switch v := val.(type) { case int: diff --git a/checker/checker.go b/checker/checker.go index 11e4eee3c..c845dd78a 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -9,6 +9,7 @@ import ( "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/conf" "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/internal/deref" "github.com/expr-lang/expr/parser" ) @@ -203,8 +204,7 @@ func (v *checker) ConstantNode(node *ast.ConstantNode) (reflect.Type, info) { func (v *checker) UnaryNode(node *ast.UnaryNode) (reflect.Type, info) { t, _ := v.visit(node.Node) - - t = deref(t) + t = deref.Type(t) switch node.Operator { @@ -235,8 +235,8 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { l, _ := v.visit(node.Left) r, ri := v.visit(node.Right) - l = deref(l) - r = deref(r) + l = deref.Type(l) + r = deref.Type(r) // check operator overloading if fns, ok := v.config.Operators[node.Operator]; ok { diff --git a/checker/types.go b/checker/types.go index 8c0805049..d10736a77 100644 --- a/checker/types.go +++ b/checker/types.go @@ -205,25 +205,6 @@ func fetchField(t reflect.Type, name string) (reflect.StructField, bool) { return reflect.StructField{}, false } -func deref(t reflect.Type) reflect.Type { - if t == nil { - return nil - } - if t.Kind() == reflect.Interface { - return t - } - for t != nil && t.Kind() == reflect.Ptr { - e := t.Elem() - switch e.Kind() { - case reflect.Struct, reflect.Map, reflect.Array, reflect.Slice: - return t - default: - t = e - } - } - return t -} - func kind(t reflect.Type) reflect.Kind { if t == nil { return reflect.Invalid diff --git a/conf/types_table.go b/conf/types_table.go index 8ebb76c35..738eee840 100644 --- a/conf/types_table.go +++ b/conf/types_table.go @@ -2,6 +2,8 @@ package conf import ( "reflect" + + "github.com/expr-lang/expr/internal/deref" ) type Tag struct { @@ -77,7 +79,7 @@ func CreateTypesTable(i any) TypesTable { func FieldsFromStruct(t reflect.Type) TypesTable { types := make(TypesTable) - t = dereference(t) + t = deref.Type(t) if t == nil { return types } @@ -111,23 +113,6 @@ func FieldsFromStruct(t reflect.Type) TypesTable { return types } -func dereference(t reflect.Type) reflect.Type { - if t == nil { - return nil - } - if t.Kind() == reflect.Ptr { - t = dereference(t.Elem()) - } - return t -} - -func kind(t reflect.Type) reflect.Kind { - if t == nil { - return reflect.Invalid - } - return t.Kind() -} - func FieldName(field reflect.StructField) string { if taggedName := field.Tag.Get("expr"); taggedName != "" { return taggedName diff --git a/docgen/docgen.go b/docgen/docgen.go index e9a542b8c..aed0f48f0 100644 --- a/docgen/docgen.go +++ b/docgen/docgen.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/expr-lang/expr/conf" + "github.com/expr-lang/expr/internal/deref" ) // Kind can be any of array, map, struct, func, string, int, float, bool or any. @@ -80,7 +81,7 @@ func CreateDoc(i any) *Context { c := &Context{ Variables: make(map[Identifier]*Type), Types: make(map[TypeName]*Type), - PkgPath: dereference(reflect.TypeOf(i)).PkgPath(), + PkgPath: deref.Type(reflect.TypeOf(i)).PkgPath(), } for name, t := range conf.CreateTypesTable(i) { @@ -134,7 +135,7 @@ func (c *Context) use(t reflect.Type, ops ...option) *Type { methods = append(methods, m) } - t = dereference(t) + t = deref.Type(t) // Only named types will have methods defined on them. // It maybe not even struct, but we gonna call then @@ -253,13 +254,3 @@ func isPrivate(s string) bool { func isProtobuf(s string) bool { return strings.HasPrefix(s, "XXX_") } - -func dereference(t reflect.Type) reflect.Type { - if t == nil { - return nil - } - if t.Kind() == reflect.Ptr { - t = dereference(t.Elem()) - } - return t -} diff --git a/expr_test.go b/expr_test.go index 7c20e4899..ed08cae53 100644 --- a/expr_test.go +++ b/expr_test.go @@ -316,9 +316,9 @@ func ExampleOperator_Decimal() { code := `A + B - C` type Env struct { - A, B, C Decimal - Sub func(a, b Decimal) Decimal - Add func(a, b Decimal) Decimal + A, B, C Decimal + Sub func(a, b Decimal) Decimal + Add func(a, b Decimal) Decimal } options := []expr.Option{ @@ -334,11 +334,11 @@ func ExampleOperator_Decimal() { } env := Env{ - A: Decimal{3}, - B: Decimal{2}, - C: Decimal{1}, + A: Decimal{3}, + B: Decimal{2}, + C: Decimal{1}, Sub: func(a, b Decimal) Decimal { return Decimal{a.N - b.N} }, - Add: func(a, b Decimal) Decimal { return Decimal{a.N + b.N} }, + Add: func(a, b Decimal) Decimal { return Decimal{a.N + b.N} }, } output, err := expr.Run(program, env) @@ -1358,21 +1358,6 @@ func TestExpr_fetch_from_func(t *testing.T) { assert.Contains(t, err.Error(), "cannot fetch Value from func()") } -func TestExpr_fetch_from_interface(t *testing.T) { - type FooBar struct { - Value string - } - foobar := &FooBar{"waldo"} - var foobarAny any = foobar - var foobarPtrAny any = &foobarAny - - res, err := expr.Eval("foo.Value", map[string]any{ - "foo": foobarPtrAny, - }) - assert.NoError(t, err) - assert.Equal(t, "waldo", res) -} - func TestExpr_map_default_values(t *testing.T) { env := map[string]any{ "foo": map[string]string{}, diff --git a/internal/deref/deref.go b/internal/deref/deref.go new file mode 100644 index 000000000..acdc89811 --- /dev/null +++ b/internal/deref/deref.go @@ -0,0 +1,47 @@ +package deref + +import ( + "fmt" + "reflect" +) + +func Deref(p any) any { + if p == nil { + return nil + } + + v := reflect.ValueOf(p) + + for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { + if v.IsNil() { + return nil + } + v = v.Elem() + } + + if v.IsValid() { + return v.Interface() + } + + panic(fmt.Sprintf("cannot dereference %v", p)) +} + +func Type(t reflect.Type) reflect.Type { + if t == nil { + return nil + } + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t +} + +func Value(v reflect.Value) reflect.Value { + for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { + if v.IsNil() { + return v + } + v = v.Elem() + } + return v +} diff --git a/internal/deref/deref_test.go b/internal/deref/deref_test.go new file mode 100644 index 000000000..554455f6d --- /dev/null +++ b/internal/deref/deref_test.go @@ -0,0 +1,111 @@ +package deref_test + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/expr-lang/expr/internal/deref" +) + +func TestDeref(t *testing.T) { + a := uint(42) + b := &a + c := &b + d := &c + + got := deref.Deref(d) + assert.Equal(t, uint(42), got) +} + +func TestDeref_mix_ptr_with_interface(t *testing.T) { + a := uint(42) + var b any = &a + var c any = &b + d := &c + + got := deref.Deref(d) + assert.Equal(t, uint(42), got) +} + +func TestDeref_nil(t *testing.T) { + var a *int + assert.Nil(t, deref.Deref(a)) + assert.Nil(t, deref.Deref(nil)) +} + +func TestType(t *testing.T) { + a := uint(42) + b := &a + c := &b + d := &c + + dt := deref.Type(reflect.TypeOf(d)) + assert.Equal(t, reflect.Uint, dt.Kind()) +} + +func TestType_two_ptr_with_interface(t *testing.T) { + a := uint(42) + var b any = &a + + dt := deref.Type(reflect.TypeOf(b)) + assert.Equal(t, reflect.Uint, dt.Kind()) + +} + +func TestType_three_ptr_with_interface(t *testing.T) { + a := uint(42) + var b any = &a + var c any = &b + + dt := deref.Type(reflect.TypeOf(c)) + assert.Equal(t, reflect.Interface, dt.Kind()) +} + +func TestType_nil(t *testing.T) { + assert.Nil(t, deref.Type(nil)) +} + +func TestValue(t *testing.T) { + a := uint(42) + b := &a + c := &b + d := &c + + got := deref.Value(reflect.ValueOf(d)) + assert.Equal(t, uint(42), got.Interface()) +} + +func TestValue_two_ptr_with_interface(t *testing.T) { + a := uint(42) + var b any = &a + + got := deref.Value(reflect.ValueOf(b)) + assert.Equal(t, uint(42), got.Interface()) +} + +func TestValue_three_ptr_with_interface(t *testing.T) { + a := uint(42) + var b any = &a + c := &b + + got := deref.Value(reflect.ValueOf(c)) + assert.Equal(t, uint(42), got.Interface()) +} + +func TestValue_nil(t *testing.T) { + got := deref.Value(reflect.ValueOf(nil)) + assert.False(t, got.IsValid()) +} + +func TestValue_nil_in_chain(t *testing.T) { + var a any = nil + var b any = &a + c := &b + + got := deref.Value(reflect.ValueOf(c)) + assert.True(t, got.IsValid()) + assert.True(t, got.IsNil()) + assert.Nil(t, got.Interface()) +} diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index 684794a01..2911e8e26 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/expr-lang/expr" @@ -237,3 +238,18 @@ func TestDeref_сommutative(t *testing.T) { }) } } + +func TestDeref_fetch_from_interface_mix_pointer(t *testing.T) { + type FooBar struct { + Value string + } + foobar := &FooBar{"waldo"} + var foobarAny any = foobar + var foobarPtrAny any = &foobarAny + + res, err := expr.Eval("foo.Value", map[string]any{ + "foo": foobarPtrAny, + }) + assert.NoError(t, err) + assert.Equal(t, "waldo", res) +} diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 09c58bdf7..d54152117 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -6,20 +6,13 @@ import ( "fmt" "math" "reflect" -) -func deref(kind reflect.Kind, value reflect.Value) (reflect.Kind, reflect.Value) { - for kind == reflect.Ptr || kind == reflect.Interface { - value = value.Elem() - kind = value.Kind() - } - return kind, value -} + "github.com/expr-lang/expr/internal/deref" +) func Fetch(from, i any) any { v := reflect.ValueOf(from) - kind := v.Kind() - if kind == reflect.Invalid { + if v.Kind() == reflect.Invalid { panic(fmt.Sprintf("cannot fetch %v from %T", i, from)) } @@ -37,11 +30,9 @@ func Fetch(from, i any) any { // a value, when they are accessed through a pointer we don't want to // copy them to a value. // De-reference everything if necessary (interface and pointers) - kind, v = deref(kind, v) + v = deref.Value(v) - // TODO: We can create separate opcodes for each of the cases below to make - // the little bit faster. - switch kind { + switch v.Kind() { case reflect.Array, reflect.Slice, reflect.String: index := ToInt(i) if index < 0 { @@ -144,27 +135,6 @@ func FetchMethod(from any, method *Method) any { panic(fmt.Sprintf("cannot fetch %v from %T", method.Name, from)) } -func Deref(i any) any { - if i == nil { - return nil - } - - v := reflect.ValueOf(i) - - for v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface { - if v.IsNil() { - return nil - } - v = v.Elem() - } - - if v.IsValid() { - return v.Interface() - } - - panic(fmt.Sprintf("cannot dereference %v", i)) -} - func Slice(array, from, to any) any { v := reflect.ValueOf(array) diff --git a/vm/vm.go b/vm/vm.go index 56d5fc2ee..1e85893b0 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -11,6 +11,7 @@ import ( "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/file" + "github.com/expr-lang/expr/internal/deref" "github.com/expr-lang/expr/vm/runtime" ) @@ -436,7 +437,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpDeref: a := vm.pop() - vm.push(runtime.Deref(a)) + vm.push(deref.Deref(a)) case OpIncrementIndex: vm.scope().Index++ From 694aab2ba48069d54c74f811f3caf7f3fa1eac41 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 16 Feb 2024 23:01:03 +0100 Subject: [PATCH 265/506] Update real_world example --- .gitignore | 1 + test/real_world/README.md | 119 -------------------------- test/real_world/real_docs/generate.go | 14 --- test/real_world/real_world.go | 116 ------------------------- 4 files changed, 1 insertion(+), 249 deletions(-) delete mode 100644 test/real_world/README.md delete mode 100644 test/real_world/real_docs/generate.go delete mode 100644 test/real_world/real_world.go diff --git a/.gitignore b/.gitignore index da1a8182f..9d3410bdf 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ *.html custom_tests.json pro/ +test/avs/ diff --git a/test/real_world/README.md b/test/real_world/README.md deleted file mode 100644 index ba79e808d..000000000 --- a/test/real_world/README.md +++ /dev/null @@ -1,119 +0,0 @@ -### Variables -| Name | Type | -|------|------| -| AppVersion | `string` | -| CleanMarker | `string` | -| CountryCode | `string` | -| CurrencyCode | `string` | -| DestinationCountry | `string` | -| Features | [UserAgentFeatures](#UserAgentFeatures) | -| GateID | `int` | -| InitializedAt | `int` | -| IsAffiliate | `bool` | -| IsDesktop | `bool` | -| IsMobile | `bool` | -| IsOpenJaw | `bool` | -| KnowEnglish | `bool` | -| Locale | `string` | -| Marker | `string` | -| Market | `string` | -| OriginCountry | `string` | -| Os | `string` | -| OsVersion | `string` | -| Passengers | [Passengers](#Passengers) | -| Random | `float` | -| ReferrerHost | `string` | -| SearchDepth | `int` | -| SearchParamsEnv | [SearchParamsEnv](#SearchParamsEnv) | -| Segments | array([RouteSegment](#RouteSegment)) | -| TravelPayoutsAPI | `bool` | -| TripClass | `string` | -| UserAgentDevice | `string` | -| UserAgentType | `string` | -| UserIP | `string` | -| false | `bool` | -| true | `bool` | - -### Functions -| Name | Return type | -|------|-------------| -| all(array(`any`), `func`) | `bool` | -| any(array(`any`), `func`) | `bool` | -| count(array(`any`), `func`) | `int` | -| filter(array(`any`), `func`) | array(`any`) | -| len(array(`any`)) | `int` | -| map(array(`any`), `func`) | array(`any`) | -| none(array(`any`), `func`) | `bool` | -| one(array(`any`), `func`) | `bool` | - -### Types -#### DirectFlightsDays -| Field | Type | -|---|---| -| Days | `string` | -| Start | `string` | - -#### Passengers -| Field | Type | -|---|---| -| Adults | `int` | -| Children | `int` | -| Infants | `int` | - -#### RouteSegment -| Field | Type | -|---|---| -| Date | `string` | -| Destination | `string` | -| DestinationCountry | `string` | -| DestinationName | `string` | -| DirectFlightsDays | [DirectFlightsDays](#DirectFlightsDays) | -| Origin | `string` | -| OriginCountry | `string` | -| OriginName | `string` | -| TranslatedDestination | `string` | -| TranslatedOrigin | `string` | -| UserDestination | `string` | -| UserOrigin | `string` | - -#### SearchParamsEnv -| Field | Type | -|---|---| -| AppVersion | `string` | -| CleanMarker | `string` | -| CountryCode | `string` | -| CurrencyCode | `string` | -| DestinationCountry | `string` | -| Features | [UserAgentFeatures](#UserAgentFeatures) | -| GateID | `int` | -| InitializedAt | `int` | -| IsAffiliate | `bool` | -| IsDesktop | `bool` | -| IsMobile | `bool` | -| IsOpenJaw | `bool` | -| KnowEnglish | `bool` | -| Locale | `string` | -| Marker | `string` | -| Market | `string` | -| OriginCountry | `string` | -| Os | `string` | -| OsVersion | `string` | -| Passengers | [Passengers](#Passengers) | -| Random | `float` | -| ReferrerHost | `string` | -| SearchDepth | `int` | -| Segments | array([RouteSegment](#RouteSegment)) | -| TravelPayoutsAPI | `bool` | -| TripClass | `string` | -| UserAgentDevice | `string` | -| UserAgentType | `string` | -| UserIP | `string` | - -#### UserAgentFeatures -| Field | Type | -|---|---| -| Assisted | `bool` | -| TopPlacement | `bool` | -| TourTickets | `bool` | - - diff --git a/test/real_world/real_docs/generate.go b/test/real_world/real_docs/generate.go deleted file mode 100644 index 51030e2c5..000000000 --- a/test/real_world/real_docs/generate.go +++ /dev/null @@ -1,14 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/expr-lang/expr/docgen" - "github.com/expr-lang/expr/test/real_world" -) - -func main() { - doc := docgen.CreateDoc(real_world.NewEnv()) - - fmt.Println(doc.Markdown()) -} diff --git a/test/real_world/real_world.go b/test/real_world/real_world.go deleted file mode 100644 index 445e0a4ce..000000000 --- a/test/real_world/real_world.go +++ /dev/null @@ -1,116 +0,0 @@ -package real_world - -//go:generate sh -c "go run ./real_docs/generate.go > README.md" - -type DirectFlightsDays struct { - Start string - Days string -} - -type RouteSegment struct { - Origin string - OriginName string - Destination string - DestinationName string - Date string - OriginCountry string - DestinationCountry string - TranslatedOrigin string - TranslatedDestination string - UserOrigin string - UserDestination string - DirectFlightsDays *DirectFlightsDays -} - -type Passengers struct { - Adults uint32 - Children uint32 - Infants uint32 -} - -type UserAgentFeatures struct { - Assisted bool - TopPlacement bool - TourTickets bool -} - -type SearchParamsEnv struct { - Segments []*RouteSegment - OriginCountry string - DestinationCountry string - SearchDepth int - Passengers *Passengers - TripClass string - UserIP string - KnowEnglish bool - Market string - Marker string - CleanMarker string - Locale string - ReferrerHost string - CountryCode string - CurrencyCode string - IsOpenJaw bool - Os string - OsVersion string - AppVersion string - IsAffiliate bool - InitializedAt int64 - Random float32 - TravelPayoutsAPI bool - Features *UserAgentFeatures - GateID int32 - UserAgentDevice string - UserAgentType string - IsDesktop bool - IsMobile bool -} - -type Env struct { - SearchParamsEnv -} - -func NewEnv() Env { - return Env{ - SearchParamsEnv: SearchParamsEnv{ - Segments: []*RouteSegment{ - { - Origin: "VOG", - Destination: "SHJ", - }, - { - Origin: "SHJ", - Destination: "VOG", - }, - }, - OriginCountry: "RU", - DestinationCountry: "RU", - SearchDepth: 44, - Passengers: &Passengers{1, 0, 0}, - TripClass: "Y", - UserIP: "::1", - KnowEnglish: true, - Market: "ru", - Marker: "123456.direct", - CleanMarker: "123456", - Locale: "ru", - ReferrerHost: "www.aviasales.ru", - CountryCode: "", - CurrencyCode: "usd", - IsOpenJaw: false, - Os: "", - OsVersion: "", - AppVersion: "", - IsAffiliate: true, - InitializedAt: 1570788719, - Random: 0.13497187, - TravelPayoutsAPI: false, - Features: &UserAgentFeatures{}, - GateID: 421, - UserAgentDevice: "DESKTOP", - UserAgentType: "WEB", - IsDesktop: true, - IsMobile: false, - }, - } -} From c330a39253d4ba18f04c1123910cc50bbaafb3e0 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 16 Feb 2024 23:32:07 +0100 Subject: [PATCH 266/506] Sort func_types --- vm/func_types/main.go | 34 ++--- vm/func_types[generated].go | 266 +++++++++++++++++++----------------- 2 files changed, 155 insertions(+), 145 deletions(-) diff --git a/vm/func_types/main.go b/vm/func_types/main.go index 286a1f053..fe9802aae 100644 --- a/vm/func_types/main.go +++ b/vm/func_types/main.go @@ -17,14 +17,14 @@ var types = []any{ new(func() Month), new(func() Time), new(func() Weekday), - new(func() []byte), new(func() []any), + new(func() []byte), + new(func() any), new(func() bool), new(func() byte), new(func() float64), new(func() int), new(func() int64), - new(func() any), new(func() map[string]any), new(func() rune), new(func() string), @@ -34,8 +34,22 @@ var types = []any{ new(func(Duration) Time), new(func(Time) Duration), new(func(Time) bool), + new(func([]any) []any), + new(func([]any) any), + new(func([]any) map[string]any), new(func([]any, string) string), new(func([]string, string) string), + new(func(any) []any), + new(func(any) any), + new(func(any) bool), + new(func(any) float64), + new(func(any) int), + new(func(any) map[string]any), + new(func(any) string), + new(func(any, any) []any), + new(func(any, any) any), + new(func(any, any) bool), + new(func(any, any) string), new(func(bool) bool), new(func(bool) float64), new(func(bool) int), @@ -50,9 +64,11 @@ var types = []any{ new(func(int) string), new(func(int, int) int), new(func(int, int) string), + new(func(int32) float64), new(func(int64) Time), new(func(string) []string), new(func(string) bool), + new(func(string) bool), new(func(string) float64), new(func(string) int), new(func(string) string), @@ -61,20 +77,6 @@ var types = []any{ new(func(string, rune) int), new(func(string, string) bool), new(func(string, string) string), - new(func(any) bool), - new(func(any) float64), - new(func(any) int), - new(func(any) string), - new(func(any) any), - new(func(any) []any), - new(func(any) map[string]any), - new(func([]any) any), - new(func([]any) []any), - new(func([]any) map[string]any), - new(func(any, any) bool), - new(func(any, any) string), - new(func(any, any) any), - new(func(any, any) []any), } func main() { diff --git a/vm/func_types[generated].go b/vm/func_types[generated].go index 1375f22f2..7cb9c8c60 100644 --- a/vm/func_types[generated].go +++ b/vm/func_types[generated].go @@ -12,14 +12,14 @@ var FuncTypes = []any{ 2: new(func() time.Month), 3: new(func() time.Time), 4: new(func() time.Weekday), - 5: new(func() []uint8), - 6: new(func() []interface{}), - 7: new(func() bool), - 8: new(func() uint8), - 9: new(func() float64), - 10: new(func() int), - 11: new(func() int64), - 12: new(func() interface{}), + 5: new(func() []interface{}), + 6: new(func() []uint8), + 7: new(func() interface{}), + 8: new(func() bool), + 9: new(func() uint8), + 10: new(func() float64), + 11: new(func() int), + 12: new(func() int64), 13: new(func() map[string]interface{}), 14: new(func() int32), 15: new(func() string), @@ -29,47 +29,49 @@ var FuncTypes = []any{ 19: new(func(time.Duration) time.Time), 20: new(func(time.Time) time.Duration), 21: new(func(time.Time) bool), - 22: new(func([]interface{}, string) string), - 23: new(func([]string, string) string), - 24: new(func(bool) bool), - 25: new(func(bool) float64), - 26: new(func(bool) int), - 27: new(func(bool) string), - 28: new(func(float64) bool), - 29: new(func(float64) float64), - 30: new(func(float64) int), - 31: new(func(float64) string), - 32: new(func(int) bool), - 33: new(func(int) float64), - 34: new(func(int) int), - 35: new(func(int) string), - 36: new(func(int, int) int), - 37: new(func(int, int) string), - 38: new(func(int64) time.Time), - 39: new(func(string) []string), - 40: new(func(string) bool), - 41: new(func(string) float64), - 42: new(func(string) int), - 43: new(func(string) string), - 44: new(func(string, uint8) int), - 45: new(func(string, int) int), - 46: new(func(string, int32) int), - 47: new(func(string, string) bool), - 48: new(func(string, string) string), - 49: new(func(interface{}) bool), - 50: new(func(interface{}) float64), - 51: new(func(interface{}) int), - 52: new(func(interface{}) string), - 53: new(func(interface{}) interface{}), - 54: new(func(interface{}) []interface{}), - 55: new(func(interface{}) map[string]interface{}), - 56: new(func([]interface{}) interface{}), - 57: new(func([]interface{}) []interface{}), - 58: new(func([]interface{}) map[string]interface{}), - 59: new(func(interface{}, interface{}) bool), - 60: new(func(interface{}, interface{}) string), - 61: new(func(interface{}, interface{}) interface{}), - 62: new(func(interface{}, interface{}) []interface{}), + 22: new(func([]interface{}) []interface{}), + 23: new(func([]interface{}) interface{}), + 24: new(func([]interface{}) map[string]interface{}), + 25: new(func([]interface{}, string) string), + 26: new(func([]string, string) string), + 27: new(func(interface{}) []interface{}), + 28: new(func(interface{}) interface{}), + 29: new(func(interface{}) bool), + 30: new(func(interface{}) float64), + 31: new(func(interface{}) int), + 32: new(func(interface{}) map[string]interface{}), + 33: new(func(interface{}) string), + 34: new(func(interface{}, interface{}) []interface{}), + 35: new(func(interface{}, interface{}) interface{}), + 36: new(func(interface{}, interface{}) bool), + 37: new(func(interface{}, interface{}) string), + 38: new(func(bool) bool), + 39: new(func(bool) float64), + 40: new(func(bool) int), + 41: new(func(bool) string), + 42: new(func(float64) bool), + 43: new(func(float64) float64), + 44: new(func(float64) int), + 45: new(func(float64) string), + 46: new(func(int) bool), + 47: new(func(int) float64), + 48: new(func(int) int), + 49: new(func(int) string), + 50: new(func(int, int) int), + 51: new(func(int, int) string), + 52: new(func(int32) float64), + 53: new(func(int64) time.Time), + 54: new(func(string) []string), + 55: new(func(string) bool), + 56: new(func(string) bool), + 57: new(func(string) float64), + 58: new(func(string) int), + 59: new(func(string) string), + 60: new(func(string, uint8) int), + 61: new(func(string, int) int), + 62: new(func(string, int32) int), + 63: new(func(string, string) bool), + 64: new(func(string, string) string), } func (vm *VM) call(fn any, kind int) any { @@ -83,21 +85,21 @@ func (vm *VM) call(fn any, kind int) any { case 4: return fn.(func() time.Weekday)() case 5: - return fn.(func() []uint8)() - case 6: return fn.(func() []interface{})() + case 6: + return fn.(func() []uint8)() case 7: - return fn.(func() bool)() + return fn.(func() interface{})() case 8: - return fn.(func() uint8)() + return fn.(func() bool)() case 9: - return fn.(func() float64)() + return fn.(func() uint8)() case 10: - return fn.(func() int)() + return fn.(func() float64)() case 11: - return fn.(func() int64)() + return fn.(func() int)() case 12: - return fn.(func() interface{})() + return fn.(func() int64)() case 13: return fn.(func() map[string]interface{})() case 14: @@ -121,141 +123,147 @@ func (vm *VM) call(fn any, kind int) any { arg1 := vm.pop().(time.Time) return fn.(func(time.Time) bool)(arg1) case 22: + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}) []interface{})(arg1) + case 23: + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}) interface{})(arg1) + case 24: + arg1 := vm.pop().([]interface{}) + return fn.(func([]interface{}) map[string]interface{})(arg1) + case 25: arg2 := vm.pop().(string) arg1 := vm.pop().([]interface{}) return fn.(func([]interface{}, string) string)(arg1, arg2) - case 23: + case 26: arg2 := vm.pop().(string) arg1 := vm.pop().([]string) return fn.(func([]string, string) string)(arg1, arg2) - case 24: + case 27: + arg1 := vm.pop() + return fn.(func(interface{}) []interface{})(arg1) + case 28: + arg1 := vm.pop() + return fn.(func(interface{}) interface{})(arg1) + case 29: + arg1 := vm.pop() + return fn.(func(interface{}) bool)(arg1) + case 30: + arg1 := vm.pop() + return fn.(func(interface{}) float64)(arg1) + case 31: + arg1 := vm.pop() + return fn.(func(interface{}) int)(arg1) + case 32: + arg1 := vm.pop() + return fn.(func(interface{}) map[string]interface{})(arg1) + case 33: + arg1 := vm.pop() + return fn.(func(interface{}) string)(arg1) + case 34: + arg2 := vm.pop() + arg1 := vm.pop() + return fn.(func(interface{}, interface{}) []interface{})(arg1, arg2) + case 35: + arg2 := vm.pop() + arg1 := vm.pop() + return fn.(func(interface{}, interface{}) interface{})(arg1, arg2) + case 36: + arg2 := vm.pop() + arg1 := vm.pop() + return fn.(func(interface{}, interface{}) bool)(arg1, arg2) + case 37: + arg2 := vm.pop() + arg1 := vm.pop() + return fn.(func(interface{}, interface{}) string)(arg1, arg2) + case 38: arg1 := vm.pop().(bool) return fn.(func(bool) bool)(arg1) - case 25: + case 39: arg1 := vm.pop().(bool) return fn.(func(bool) float64)(arg1) - case 26: + case 40: arg1 := vm.pop().(bool) return fn.(func(bool) int)(arg1) - case 27: + case 41: arg1 := vm.pop().(bool) return fn.(func(bool) string)(arg1) - case 28: + case 42: arg1 := vm.pop().(float64) return fn.(func(float64) bool)(arg1) - case 29: + case 43: arg1 := vm.pop().(float64) return fn.(func(float64) float64)(arg1) - case 30: + case 44: arg1 := vm.pop().(float64) return fn.(func(float64) int)(arg1) - case 31: + case 45: arg1 := vm.pop().(float64) return fn.(func(float64) string)(arg1) - case 32: + case 46: arg1 := vm.pop().(int) return fn.(func(int) bool)(arg1) - case 33: + case 47: arg1 := vm.pop().(int) return fn.(func(int) float64)(arg1) - case 34: + case 48: arg1 := vm.pop().(int) return fn.(func(int) int)(arg1) - case 35: + case 49: arg1 := vm.pop().(int) return fn.(func(int) string)(arg1) - case 36: + case 50: arg2 := vm.pop().(int) arg1 := vm.pop().(int) return fn.(func(int, int) int)(arg1, arg2) - case 37: + case 51: arg2 := vm.pop().(int) arg1 := vm.pop().(int) return fn.(func(int, int) string)(arg1, arg2) - case 38: + case 52: + arg1 := vm.pop().(int32) + return fn.(func(int32) float64)(arg1) + case 53: arg1 := vm.pop().(int64) return fn.(func(int64) time.Time)(arg1) - case 39: + case 54: arg1 := vm.pop().(string) return fn.(func(string) []string)(arg1) - case 40: + case 55: arg1 := vm.pop().(string) return fn.(func(string) bool)(arg1) - case 41: + case 56: + arg1 := vm.pop().(string) + return fn.(func(string) bool)(arg1) + case 57: arg1 := vm.pop().(string) return fn.(func(string) float64)(arg1) - case 42: + case 58: arg1 := vm.pop().(string) return fn.(func(string) int)(arg1) - case 43: + case 59: arg1 := vm.pop().(string) return fn.(func(string) string)(arg1) - case 44: + case 60: arg2 := vm.pop().(uint8) arg1 := vm.pop().(string) return fn.(func(string, uint8) int)(arg1, arg2) - case 45: + case 61: arg2 := vm.pop().(int) arg1 := vm.pop().(string) return fn.(func(string, int) int)(arg1, arg2) - case 46: + case 62: arg2 := vm.pop().(int32) arg1 := vm.pop().(string) return fn.(func(string, int32) int)(arg1, arg2) - case 47: + case 63: arg2 := vm.pop().(string) arg1 := vm.pop().(string) return fn.(func(string, string) bool)(arg1, arg2) - case 48: + case 64: arg2 := vm.pop().(string) arg1 := vm.pop().(string) return fn.(func(string, string) string)(arg1, arg2) - case 49: - arg1 := vm.pop() - return fn.(func(interface{}) bool)(arg1) - case 50: - arg1 := vm.pop() - return fn.(func(interface{}) float64)(arg1) - case 51: - arg1 := vm.pop() - return fn.(func(interface{}) int)(arg1) - case 52: - arg1 := vm.pop() - return fn.(func(interface{}) string)(arg1) - case 53: - arg1 := vm.pop() - return fn.(func(interface{}) interface{})(arg1) - case 54: - arg1 := vm.pop() - return fn.(func(interface{}) []interface{})(arg1) - case 55: - arg1 := vm.pop() - return fn.(func(interface{}) map[string]interface{})(arg1) - case 56: - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}) interface{})(arg1) - case 57: - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}) []interface{})(arg1) - case 58: - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}) map[string]interface{})(arg1) - case 59: - arg2 := vm.pop() - arg1 := vm.pop() - return fn.(func(interface{}, interface{}) bool)(arg1, arg2) - case 60: - arg2 := vm.pop() - arg1 := vm.pop() - return fn.(func(interface{}, interface{}) string)(arg1, arg2) - case 61: - arg2 := vm.pop() - arg1 := vm.pop() - return fn.(func(interface{}, interface{}) interface{})(arg1, arg2) - case 62: - arg2 := vm.pop() - arg1 := vm.pop() - return fn.(func(interface{}, interface{}) []interface{})(arg1, arg2) } panic(fmt.Sprintf("unknown function kind (%v)", kind)) From ed89647e7829c81a73cc75f2d8ed39e3f833b51d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 16 Feb 2024 23:40:23 +0100 Subject: [PATCH 267/506] Add more func_types --- vm/func_types/main.go | 28 +++- vm/func_types[generated].go | 318 ++++++++++++++++++++++++------------ 2 files changed, 236 insertions(+), 110 deletions(-) diff --git a/vm/func_types/main.go b/vm/func_types/main.go index fe9802aae..cb4debd3a 100644 --- a/vm/func_types/main.go +++ b/vm/func_types/main.go @@ -22,14 +22,21 @@ var types = []any{ new(func() any), new(func() bool), new(func() byte), + new(func() float32), new(func() float64), new(func() int), + new(func() int16), + new(func() int32), new(func() int64), + new(func() int8), new(func() map[string]any), new(func() rune), new(func() string), new(func() uint), + new(func() uint16), + new(func() uint32), new(func() uint64), + new(func() uint8), new(func(Duration) Duration), new(func(Duration) Time), new(func(Time) Duration), @@ -38,6 +45,7 @@ var types = []any{ new(func([]any) any), new(func([]any) map[string]any), new(func([]any, string) string), + new(func([]byte) string), new(func([]string, string) string), new(func(any) []any), new(func(any) any), @@ -54,21 +62,31 @@ var types = []any{ new(func(bool) float64), new(func(bool) int), new(func(bool) string), + new(func(bool, bool) bool), + new(func(float32) float64), new(func(float64) bool), + new(func(float64) float32), new(func(float64) float64), new(func(float64) int), new(func(float64) string), + new(func(float64, float64) bool), new(func(int) bool), new(func(int) float64), new(func(int) int), new(func(int) string), + new(func(int, int) bool), new(func(int, int) int), new(func(int, int) string), + new(func(int16) int32), new(func(int32) float64), + new(func(int32) int), + new(func(int32) int64), new(func(int64) Time), + new(func(int8) int), + new(func(int8) int16), + new(func(string) []byte), new(func(string) []string), new(func(string) bool), - new(func(string) bool), new(func(string) float64), new(func(string) int), new(func(string) string), @@ -77,6 +95,14 @@ var types = []any{ new(func(string, rune) int), new(func(string, string) bool), new(func(string, string) string), + new(func(uint) float64), + new(func(uint) int), + new(func(uint) uint), + new(func(uint16) uint), + new(func(uint32) uint64), + new(func(uint64) float64), + new(func(uint64) int64), + new(func(uint8) byte), } func main() { diff --git a/vm/func_types[generated].go b/vm/func_types[generated].go index 7cb9c8c60..610b41520 100644 --- a/vm/func_types[generated].go +++ b/vm/func_types[generated].go @@ -17,61 +17,87 @@ var FuncTypes = []any{ 7: new(func() interface{}), 8: new(func() bool), 9: new(func() uint8), - 10: new(func() float64), - 11: new(func() int), - 12: new(func() int64), - 13: new(func() map[string]interface{}), + 10: new(func() float32), + 11: new(func() float64), + 12: new(func() int), + 13: new(func() int16), 14: new(func() int32), - 15: new(func() string), - 16: new(func() uint), - 17: new(func() uint64), - 18: new(func(time.Duration) time.Duration), - 19: new(func(time.Duration) time.Time), - 20: new(func(time.Time) time.Duration), - 21: new(func(time.Time) bool), - 22: new(func([]interface{}) []interface{}), - 23: new(func([]interface{}) interface{}), - 24: new(func([]interface{}) map[string]interface{}), - 25: new(func([]interface{}, string) string), - 26: new(func([]string, string) string), - 27: new(func(interface{}) []interface{}), - 28: new(func(interface{}) interface{}), - 29: new(func(interface{}) bool), - 30: new(func(interface{}) float64), - 31: new(func(interface{}) int), - 32: new(func(interface{}) map[string]interface{}), - 33: new(func(interface{}) string), - 34: new(func(interface{}, interface{}) []interface{}), - 35: new(func(interface{}, interface{}) interface{}), - 36: new(func(interface{}, interface{}) bool), - 37: new(func(interface{}, interface{}) string), - 38: new(func(bool) bool), - 39: new(func(bool) float64), - 40: new(func(bool) int), - 41: new(func(bool) string), - 42: new(func(float64) bool), - 43: new(func(float64) float64), - 44: new(func(float64) int), - 45: new(func(float64) string), - 46: new(func(int) bool), - 47: new(func(int) float64), - 48: new(func(int) int), - 49: new(func(int) string), - 50: new(func(int, int) int), - 51: new(func(int, int) string), - 52: new(func(int32) float64), - 53: new(func(int64) time.Time), - 54: new(func(string) []string), - 55: new(func(string) bool), - 56: new(func(string) bool), - 57: new(func(string) float64), - 58: new(func(string) int), - 59: new(func(string) string), - 60: new(func(string, uint8) int), - 61: new(func(string, int) int), - 62: new(func(string, int32) int), - 63: new(func(string, string) bool), - 64: new(func(string, string) string), + 15: new(func() int64), + 16: new(func() int8), + 17: new(func() map[string]interface{}), + 18: new(func() int32), + 19: new(func() string), + 20: new(func() uint), + 21: new(func() uint16), + 22: new(func() uint32), + 23: new(func() uint64), + 24: new(func() uint8), + 25: new(func(time.Duration) time.Duration), + 26: new(func(time.Duration) time.Time), + 27: new(func(time.Time) time.Duration), + 28: new(func(time.Time) bool), + 29: new(func([]interface{}) []interface{}), + 30: new(func([]interface{}) interface{}), + 31: new(func([]interface{}) map[string]interface{}), + 32: new(func([]interface{}, string) string), + 33: new(func([]uint8) string), + 34: new(func([]string, string) string), + 35: new(func(interface{}) []interface{}), + 36: new(func(interface{}) interface{}), + 37: new(func(interface{}) bool), + 38: new(func(interface{}) float64), + 39: new(func(interface{}) int), + 40: new(func(interface{}) map[string]interface{}), + 41: new(func(interface{}) string), + 42: new(func(interface{}, interface{}) []interface{}), + 43: new(func(interface{}, interface{}) interface{}), + 44: new(func(interface{}, interface{}) bool), + 45: new(func(interface{}, interface{}) string), + 46: new(func(bool) bool), + 47: new(func(bool) float64), + 48: new(func(bool) int), + 49: new(func(bool) string), + 50: new(func(bool, bool) bool), + 51: new(func(float32) float64), + 52: new(func(float64) bool), + 53: new(func(float64) float32), + 54: new(func(float64) float64), + 55: new(func(float64) int), + 56: new(func(float64) string), + 57: new(func(float64, float64) bool), + 58: new(func(int) bool), + 59: new(func(int) float64), + 60: new(func(int) int), + 61: new(func(int) string), + 62: new(func(int, int) bool), + 63: new(func(int, int) int), + 64: new(func(int, int) string), + 65: new(func(int16) int32), + 66: new(func(int32) float64), + 67: new(func(int32) int), + 68: new(func(int32) int64), + 69: new(func(int64) time.Time), + 70: new(func(int8) int), + 71: new(func(int8) int16), + 72: new(func(string) []uint8), + 73: new(func(string) []string), + 74: new(func(string) bool), + 75: new(func(string) float64), + 76: new(func(string) int), + 77: new(func(string) string), + 78: new(func(string, uint8) int), + 79: new(func(string, int) int), + 80: new(func(string, int32) int), + 81: new(func(string, string) bool), + 82: new(func(string, string) string), + 83: new(func(uint) float64), + 84: new(func(uint) int), + 85: new(func(uint) uint), + 86: new(func(uint16) uint), + 87: new(func(uint32) uint64), + 88: new(func(uint64) float64), + 89: new(func(uint64) int64), + 90: new(func(uint8) uint8), } func (vm *VM) call(fn any, kind int) any { @@ -95,175 +121,249 @@ func (vm *VM) call(fn any, kind int) any { case 9: return fn.(func() uint8)() case 10: - return fn.(func() float64)() + return fn.(func() float32)() case 11: - return fn.(func() int)() + return fn.(func() float64)() case 12: - return fn.(func() int64)() + return fn.(func() int)() case 13: - return fn.(func() map[string]interface{})() + return fn.(func() int16)() case 14: return fn.(func() int32)() case 15: - return fn.(func() string)() + return fn.(func() int64)() case 16: - return fn.(func() uint)() + return fn.(func() int8)() case 17: - return fn.(func() uint64)() + return fn.(func() map[string]interface{})() case 18: + return fn.(func() int32)() + case 19: + return fn.(func() string)() + case 20: + return fn.(func() uint)() + case 21: + return fn.(func() uint16)() + case 22: + return fn.(func() uint32)() + case 23: + return fn.(func() uint64)() + case 24: + return fn.(func() uint8)() + case 25: arg1 := vm.pop().(time.Duration) return fn.(func(time.Duration) time.Duration)(arg1) - case 19: + case 26: arg1 := vm.pop().(time.Duration) return fn.(func(time.Duration) time.Time)(arg1) - case 20: + case 27: arg1 := vm.pop().(time.Time) return fn.(func(time.Time) time.Duration)(arg1) - case 21: + case 28: arg1 := vm.pop().(time.Time) return fn.(func(time.Time) bool)(arg1) - case 22: + case 29: arg1 := vm.pop().([]interface{}) return fn.(func([]interface{}) []interface{})(arg1) - case 23: + case 30: arg1 := vm.pop().([]interface{}) return fn.(func([]interface{}) interface{})(arg1) - case 24: + case 31: arg1 := vm.pop().([]interface{}) return fn.(func([]interface{}) map[string]interface{})(arg1) - case 25: + case 32: arg2 := vm.pop().(string) arg1 := vm.pop().([]interface{}) return fn.(func([]interface{}, string) string)(arg1, arg2) - case 26: + case 33: + arg1 := vm.pop().([]uint8) + return fn.(func([]uint8) string)(arg1) + case 34: arg2 := vm.pop().(string) arg1 := vm.pop().([]string) return fn.(func([]string, string) string)(arg1, arg2) - case 27: + case 35: arg1 := vm.pop() return fn.(func(interface{}) []interface{})(arg1) - case 28: + case 36: arg1 := vm.pop() return fn.(func(interface{}) interface{})(arg1) - case 29: + case 37: arg1 := vm.pop() return fn.(func(interface{}) bool)(arg1) - case 30: + case 38: arg1 := vm.pop() return fn.(func(interface{}) float64)(arg1) - case 31: + case 39: arg1 := vm.pop() return fn.(func(interface{}) int)(arg1) - case 32: + case 40: arg1 := vm.pop() return fn.(func(interface{}) map[string]interface{})(arg1) - case 33: + case 41: arg1 := vm.pop() return fn.(func(interface{}) string)(arg1) - case 34: + case 42: arg2 := vm.pop() arg1 := vm.pop() return fn.(func(interface{}, interface{}) []interface{})(arg1, arg2) - case 35: + case 43: arg2 := vm.pop() arg1 := vm.pop() return fn.(func(interface{}, interface{}) interface{})(arg1, arg2) - case 36: + case 44: arg2 := vm.pop() arg1 := vm.pop() return fn.(func(interface{}, interface{}) bool)(arg1, arg2) - case 37: + case 45: arg2 := vm.pop() arg1 := vm.pop() return fn.(func(interface{}, interface{}) string)(arg1, arg2) - case 38: + case 46: arg1 := vm.pop().(bool) return fn.(func(bool) bool)(arg1) - case 39: + case 47: arg1 := vm.pop().(bool) return fn.(func(bool) float64)(arg1) - case 40: + case 48: arg1 := vm.pop().(bool) return fn.(func(bool) int)(arg1) - case 41: + case 49: arg1 := vm.pop().(bool) return fn.(func(bool) string)(arg1) - case 42: + case 50: + arg2 := vm.pop().(bool) + arg1 := vm.pop().(bool) + return fn.(func(bool, bool) bool)(arg1, arg2) + case 51: + arg1 := vm.pop().(float32) + return fn.(func(float32) float64)(arg1) + case 52: arg1 := vm.pop().(float64) return fn.(func(float64) bool)(arg1) - case 43: + case 53: + arg1 := vm.pop().(float64) + return fn.(func(float64) float32)(arg1) + case 54: arg1 := vm.pop().(float64) return fn.(func(float64) float64)(arg1) - case 44: + case 55: arg1 := vm.pop().(float64) return fn.(func(float64) int)(arg1) - case 45: + case 56: arg1 := vm.pop().(float64) return fn.(func(float64) string)(arg1) - case 46: + case 57: + arg2 := vm.pop().(float64) + arg1 := vm.pop().(float64) + return fn.(func(float64, float64) bool)(arg1, arg2) + case 58: arg1 := vm.pop().(int) return fn.(func(int) bool)(arg1) - case 47: + case 59: arg1 := vm.pop().(int) return fn.(func(int) float64)(arg1) - case 48: + case 60: arg1 := vm.pop().(int) return fn.(func(int) int)(arg1) - case 49: + case 61: arg1 := vm.pop().(int) return fn.(func(int) string)(arg1) - case 50: + case 62: + arg2 := vm.pop().(int) + arg1 := vm.pop().(int) + return fn.(func(int, int) bool)(arg1, arg2) + case 63: arg2 := vm.pop().(int) arg1 := vm.pop().(int) return fn.(func(int, int) int)(arg1, arg2) - case 51: + case 64: arg2 := vm.pop().(int) arg1 := vm.pop().(int) return fn.(func(int, int) string)(arg1, arg2) - case 52: + case 65: + arg1 := vm.pop().(int16) + return fn.(func(int16) int32)(arg1) + case 66: arg1 := vm.pop().(int32) return fn.(func(int32) float64)(arg1) - case 53: + case 67: + arg1 := vm.pop().(int32) + return fn.(func(int32) int)(arg1) + case 68: + arg1 := vm.pop().(int32) + return fn.(func(int32) int64)(arg1) + case 69: arg1 := vm.pop().(int64) return fn.(func(int64) time.Time)(arg1) - case 54: + case 70: + arg1 := vm.pop().(int8) + return fn.(func(int8) int)(arg1) + case 71: + arg1 := vm.pop().(int8) + return fn.(func(int8) int16)(arg1) + case 72: arg1 := vm.pop().(string) - return fn.(func(string) []string)(arg1) - case 55: + return fn.(func(string) []uint8)(arg1) + case 73: arg1 := vm.pop().(string) - return fn.(func(string) bool)(arg1) - case 56: + return fn.(func(string) []string)(arg1) + case 74: arg1 := vm.pop().(string) return fn.(func(string) bool)(arg1) - case 57: + case 75: arg1 := vm.pop().(string) return fn.(func(string) float64)(arg1) - case 58: + case 76: arg1 := vm.pop().(string) return fn.(func(string) int)(arg1) - case 59: + case 77: arg1 := vm.pop().(string) return fn.(func(string) string)(arg1) - case 60: + case 78: arg2 := vm.pop().(uint8) arg1 := vm.pop().(string) return fn.(func(string, uint8) int)(arg1, arg2) - case 61: + case 79: arg2 := vm.pop().(int) arg1 := vm.pop().(string) return fn.(func(string, int) int)(arg1, arg2) - case 62: + case 80: arg2 := vm.pop().(int32) arg1 := vm.pop().(string) return fn.(func(string, int32) int)(arg1, arg2) - case 63: + case 81: arg2 := vm.pop().(string) arg1 := vm.pop().(string) return fn.(func(string, string) bool)(arg1, arg2) - case 64: + case 82: arg2 := vm.pop().(string) arg1 := vm.pop().(string) return fn.(func(string, string) string)(arg1, arg2) + case 83: + arg1 := vm.pop().(uint) + return fn.(func(uint) float64)(arg1) + case 84: + arg1 := vm.pop().(uint) + return fn.(func(uint) int)(arg1) + case 85: + arg1 := vm.pop().(uint) + return fn.(func(uint) uint)(arg1) + case 86: + arg1 := vm.pop().(uint16) + return fn.(func(uint16) uint)(arg1) + case 87: + arg1 := vm.pop().(uint32) + return fn.(func(uint32) uint64)(arg1) + case 88: + arg1 := vm.pop().(uint64) + return fn.(func(uint64) float64)(arg1) + case 89: + arg1 := vm.pop().(uint64) + return fn.(func(uint64) int64)(arg1) + case 90: + arg1 := vm.pop().(uint8) + return fn.(func(uint8) uint8)(arg1) } panic(fmt.Sprintf("unknown function kind (%v)", kind)) From 1719809852028076d69912155b00c9dd80818a2a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 17 Feb 2024 11:15:54 +0100 Subject: [PATCH 268/506] Fix tests --- checker/info_test.go | 7 ++++--- compiler/compiler_test.go | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/checker/info_test.go b/checker/info_test.go index c91a55ad6..6b0a042c2 100644 --- a/checker/info_test.go +++ b/checker/info_test.go @@ -3,6 +3,7 @@ package checker_test import ( "reflect" "testing" + "time" "github.com/stretchr/testify/require" @@ -11,12 +12,12 @@ import ( ) func TestTypedFuncIndex(t *testing.T) { - fn := func([]any, string) string { - return "foo" + fn := func() time.Duration { + return 1 * time.Second } index, ok := checker.TypedFuncIndex(reflect.TypeOf(fn), false) require.True(t, ok) - require.Equal(t, 22, index) + require.Equal(t, 1, index) } func TestTypedFuncIndex_excludes_named_functions(t *testing.T) { diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index b7bbfcfb4..741142a77 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -319,7 +319,7 @@ func TestCompile(t *testing.T) { vm.OpMethod, vm.OpCallTyped, }, - Arguments: []int{0, 0, 1, 10}, + Arguments: []int{0, 0, 1, 12}, }, }, } @@ -358,7 +358,7 @@ func TestCompile_FuncTypes(t *testing.T) { program, err := expr.Compile("fn([1, 2], 'bar')", expr.Env(env)) require.NoError(t, err) require.Equal(t, vm.OpCallTyped, program.Bytecode[3]) - require.Equal(t, 22, program.Arguments[3]) + require.Equal(t, 32, program.Arguments[3]) } func TestCompile_FuncTypes_with_Method(t *testing.T) { @@ -366,7 +366,7 @@ func TestCompile_FuncTypes_with_Method(t *testing.T) { program, err := expr.Compile("FuncTyped('bar')", expr.Env(env)) require.NoError(t, err) require.Equal(t, vm.OpCallTyped, program.Bytecode[2]) - require.Equal(t, 42, program.Arguments[2]) + require.Equal(t, 76, program.Arguments[2]) } func TestCompile_FuncTypes_excludes_named_functions(t *testing.T) { From 4cac5f684e8898516dba520a1e9941f1cb34161f Mon Sep 17 00:00:00 2001 From: Nikolay Matrosov Date: Sat, 17 Feb 2024 14:33:07 +0100 Subject: [PATCH 269/506] feat: Operator overload from Function (#408) * feat: rewritten Operator overload from Function * fix: add test --- checker/checker.go | 2 +- conf/config.go | 38 ++++++-- conf/operators.go | 55 +++++++++-- expr.go | 1 + test/operator/operator_test.go | 167 +++++++++++++++++++++++++++++++++ 5 files changed, 246 insertions(+), 17 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index c845dd78a..b8808441f 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -240,7 +240,7 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { // check operator overloading if fns, ok := v.config.Operators[node.Operator]; ok { - t, _, ok := conf.FindSuitableOperatorOverload(fns, v.config.Types, l, r) + t, _, ok := conf.FindSuitableOperatorOverload(fns, v.config.Types, v.config.Functions, l, r) if ok { return t, info{} } diff --git a/conf/config.go b/conf/config.go index baf5dee05..f34dd0348 100644 --- a/conf/config.go +++ b/conf/config.go @@ -9,6 +9,8 @@ import ( "github.com/expr-lang/expr/vm/runtime" ) +type FunctionTable map[string]*builtin.Function + type Config struct { Env any Types TypesTable @@ -85,21 +87,43 @@ func (c *Config) ConstExpr(name string) { func (c *Config) Check() { for operator, fns := range c.Operators { for _, fn := range fns { - fnType, ok := c.Types[fn] - if !ok || fnType.Type.Kind() != reflect.Func { + fnType, foundType := c.Types[fn] + fnFunc, foundFunc := c.Functions[fn] + if !foundFunc && (!foundType || fnType.Type.Kind() != reflect.Func) { panic(fmt.Errorf("function %s for %s operator does not exist in the environment", fn, operator)) } - requiredNumIn := 2 - if fnType.Method { - requiredNumIn = 3 // As first argument of method is receiver. + + if foundType { + checkType(fnType, fn, operator) } - if fnType.Type.NumIn() != requiredNumIn || fnType.Type.NumOut() != 1 { - panic(fmt.Errorf("function %s for %s operator does not have a correct signature", fn, operator)) + if foundFunc { + checkFunc(fnFunc, fn, operator) } } } } +func checkType(fnType Tag, fn string, operator string) { + requiredNumIn := 2 + if fnType.Method { + requiredNumIn = 3 // As first argument of method is receiver. + } + if fnType.Type.NumIn() != requiredNumIn || fnType.Type.NumOut() != 1 { + panic(fmt.Errorf("function %s for %s operator does not have a correct signature", fn, operator)) + } +} + +func checkFunc(fn *builtin.Function, name string, operator string) { + if len(fn.Types) == 0 { + panic(fmt.Errorf("function %s for %s operator misses types", name, operator)) + } + for _, t := range fn.Types { + if t.NumIn() != 2 || t.NumOut() != 1 { + panic(fmt.Errorf("function %s for %s operator does not have a correct signature", name, operator)) + } + } +} + func (c *Config) IsOverridden(name string) bool { if _, ok := c.Functions[name]; ok { return true diff --git a/conf/operators.go b/conf/operators.go index ced209fdc..646153cb3 100644 --- a/conf/operators.go +++ b/conf/operators.go @@ -10,28 +10,65 @@ import ( // Functions should be provided in the environment to allow operator overloading. type OperatorsTable map[string][]string -func FindSuitableOperatorOverload(fns []string, types TypesTable, l, r reflect.Type) (reflect.Type, string, bool) { +func FindSuitableOperatorOverload(fns []string, types TypesTable, funcs FunctionTable, l, r reflect.Type) (reflect.Type, string, bool) { + t, fn, ok := FindSuitableOperatorOverloadInFunctions(fns, funcs, l, r) + if !ok { + t, fn, ok = FindSuitableOperatorOverloadInTypes(fns, types, l, r) + } + return t, fn, ok +} + +func FindSuitableOperatorOverloadInTypes(fns []string, types TypesTable, l, r reflect.Type) (reflect.Type, string, bool) { for _, fn := range fns { - fnType := types[fn] + fnType, ok := types[fn] + if !ok { + continue + } firstInIndex := 0 if fnType.Method { firstInIndex = 1 // As first argument to method is receiver. } - firstArgType := fnType.Type.In(firstInIndex) - secondArgType := fnType.Type.In(firstInIndex + 1) + ret, done := checkTypeSuits(fnType.Type, l, r, firstInIndex) + if done { + return ret, fn, true + } + } + return nil, "", false +} - firstArgumentFit := l == firstArgType || (firstArgType.Kind() == reflect.Interface && (l == nil || l.Implements(firstArgType))) - secondArgumentFit := r == secondArgType || (secondArgType.Kind() == reflect.Interface && (r == nil || r.Implements(secondArgType))) - if firstArgumentFit && secondArgumentFit { - return fnType.Type.Out(0), fn, true +func FindSuitableOperatorOverloadInFunctions(fns []string, funcs FunctionTable, l, r reflect.Type) (reflect.Type, string, bool) { + for _, fn := range fns { + fnType, ok := funcs[fn] + if !ok { + continue + } + firstInIndex := 0 + for _, overload := range fnType.Types { + ret, done := checkTypeSuits(overload, l, r, firstInIndex) + if done { + return ret, fn, true + } } } return nil, "", false } +func checkTypeSuits(t reflect.Type, l reflect.Type, r reflect.Type, firstInIndex int) (reflect.Type, bool) { + firstArgType := t.In(firstInIndex) + secondArgType := t.In(firstInIndex + 1) + + firstArgumentFit := l == firstArgType || (firstArgType.Kind() == reflect.Interface && (l == nil || l.Implements(firstArgType))) + secondArgumentFit := r == secondArgType || (secondArgType.Kind() == reflect.Interface && (r == nil || r.Implements(secondArgType))) + if firstArgumentFit && secondArgumentFit { + return t.Out(0), true + } + return nil, false +} + type OperatorPatcher struct { Operators OperatorsTable Types TypesTable + Functions FunctionTable } func (p *OperatorPatcher) Visit(node *ast.Node) { @@ -48,7 +85,7 @@ func (p *OperatorPatcher) Visit(node *ast.Node) { leftType := binaryNode.Left.Type() rightType := binaryNode.Right.Type() - ret, fn, ok := FindSuitableOperatorOverload(fns, p.Types, leftType, rightType) + ret, fn, ok := FindSuitableOperatorOverload(fns, p.Types, p.Functions, leftType, rightType) if ok { newNode := &ast.CallNode{ Callee: &ast.IdentifierNode{Value: fn}, diff --git a/expr.go b/expr.go index f32df1d3c..e43abaafd 100644 --- a/expr.go +++ b/expr.go @@ -192,6 +192,7 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { config.Visitors = append(config.Visitors, &conf.OperatorPatcher{ Operators: config.Operators, Types: config.Types, + Functions: config.Functions, }) } diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index af50a24eb..59bc73f2b 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -1,6 +1,7 @@ package operator_test import ( + "fmt" "testing" "time" @@ -55,3 +56,169 @@ func TestOperator_interface(t *testing.T) { require.NoError(t, err) require.Equal(t, true, output) } + +type Value struct { + Int int +} + +func TestOperator_Function(t *testing.T) { + env := map[string]interface{}{ + "foo": Value{1}, + "bar": Value{2}, + } + + tests := []struct { + input string + want int + }{ + { + input: `foo + bar`, + want: 3, + }, + { + input: `2 + 4`, + want: 6, + }, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf(`opertor function helper test %s`, tt.input), func(t *testing.T) { + program, err := expr.Compile( + tt.input, + expr.Env(env), + expr.Operator("+", "Add", "AddInt"), + expr.Function("Add", func(args ...interface{}) (interface{}, error) { + return args[0].(Value).Int + args[1].(Value).Int, nil + }, + new(func(_ Value, __ Value) int), + ), + expr.Function("AddInt", func(args ...interface{}) (interface{}, error) { + return args[0].(int) + args[1].(int), nil + }, + new(func(_ int, __ int) int), + ), + ) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, tt.want, output) + }) + } + +} + +func TestOperator_Function_WithTypes(t *testing.T) { + env := map[string]interface{}{ + "foo": Value{1}, + "bar": Value{2}, + } + + require.PanicsWithError(t, `function Add for + operator misses types`, func() { + _, _ = expr.Compile( + `foo + bar`, + expr.Env(env), + expr.Operator("+", "Add", "AddInt"), + expr.Function("Add", func(args ...interface{}) (interface{}, error) { + return args[0].(Value).Int + args[1].(Value).Int, nil + }), + ) + }) + + require.PanicsWithError(t, `function Add for + operator does not have a correct signature`, func() { + _, _ = expr.Compile( + `foo + bar`, + expr.Env(env), + expr.Operator("+", "Add", "AddInt"), + expr.Function("Add", func(args ...interface{}) (interface{}, error) { + return args[0].(Value).Int + args[1].(Value).Int, nil + }, + new(func(_ Value) int), + ), + ) + }) + +} + +func TestOperator_FunctionOverTypesPrecedence(t *testing.T) { + env := struct { + Add func(a, b int) int + }{ + Add: func(a, b int) int { + return a + b + }, + } + + program, err := expr.Compile( + `1 + 2`, + expr.Env(env), + expr.Operator("+", "Add"), + expr.Function("Add", func(args ...interface{}) (interface{}, error) { + // Wierd function that returns 100 + a + b in testing purposes. + return args[0].(int) + args[1].(int) + 100, nil + }, + new(func(_ int, __ int) int), + ), + ) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 103, output) +} + +func TestOperator_CanBeDefinedEitherInTypesOrInFunctions(t *testing.T) { + env := struct { + Add func(a, b int) int + }{ + Add: func(a, b int) int { + return a + b + }, + } + + program, err := expr.Compile( + `1 + 2`, + expr.Env(env), + expr.Operator("+", "Add", "AddValues"), + expr.Function("AddValues", func(args ...interface{}) (interface{}, error) { + return args[0].(Value).Int + args[1].(Value).Int, nil + }, + new(func(_ Value, __ Value) int), + ), + ) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 3, output) +} + +func TestOperator_Polymorphic(t *testing.T) { + env := struct { + Add func(a, b int) int + Foo Value + Bar Value + }{ + Add: func(a, b int) int { + return a + b + }, + Foo: Value{1}, + Bar: Value{2}, + } + + program, err := expr.Compile( + `1 + 2 + (Foo + Bar)`, + expr.Env(env), + expr.Operator("+", "Add", "AddValues"), + expr.Function("AddValues", func(args ...interface{}) (interface{}, error) { + return args[0].(Value).Int + args[1].(Value).Int, nil + }, + new(func(_ Value, __ Value) int), + ), + ) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 6, output) +} From 9569d4b3d96dde0b3fc30cf8f19683424b3f201c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 17 Feb 2024 19:04:31 +0100 Subject: [PATCH 270/506] Update doc --- docs/language-definition.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/language-definition.md b/docs/language-definition.md index e5267f9a8..a4e1a7cb0 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -638,6 +638,14 @@ Equivalent to: len(filter(array, predicate)) ``` +### concat(array1, array2[, ...]) {#concat} + +Concatenates two or more arrays. + +```expr +concat([1, 2], [3, 4]) == [1, 2, 3, 4] +``` + ### join(array[, delimiter]) {#join} Joins an array of strings into a single string with the given delimiter. From 8ecb18a3c8184b591e89f1bd69cf7fd66ec30d61 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 17 Feb 2024 19:17:27 +0100 Subject: [PATCH 271/506] Move operator override patcher to correct pkg --- conf/config.go | 4 ++++ conf/operators.go | 37 ------------------------------------ conf/types_table.go | 4 ++-- expr.go | 2 +- patcher/operator_override.go | 37 ++++++++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 40 deletions(-) create mode 100644 patcher/operator_override.go diff --git a/conf/config.go b/conf/config.go index f34dd0348..a2f571efb 100644 --- a/conf/config.go +++ b/conf/config.go @@ -11,6 +11,10 @@ import ( type FunctionTable map[string]*builtin.Function +// OperatorsTable maps binary operators to corresponding list of functions. +// Functions should be provided in the environment to allow operator overloading. +type OperatorsTable map[string][]string + type Config struct { Env any Types TypesTable diff --git a/conf/operators.go b/conf/operators.go index 646153cb3..90cbf4fea 100644 --- a/conf/operators.go +++ b/conf/operators.go @@ -2,14 +2,8 @@ package conf import ( "reflect" - - "github.com/expr-lang/expr/ast" ) -// OperatorsTable maps binary operators to corresponding list of functions. -// Functions should be provided in the environment to allow operator overloading. -type OperatorsTable map[string][]string - func FindSuitableOperatorOverload(fns []string, types TypesTable, funcs FunctionTable, l, r reflect.Type) (reflect.Type, string, bool) { t, fn, ok := FindSuitableOperatorOverloadInFunctions(fns, funcs, l, r) if !ok { @@ -64,34 +58,3 @@ func checkTypeSuits(t reflect.Type, l reflect.Type, r reflect.Type, firstInIndex } return nil, false } - -type OperatorPatcher struct { - Operators OperatorsTable - Types TypesTable - Functions FunctionTable -} - -func (p *OperatorPatcher) Visit(node *ast.Node) { - binaryNode, ok := (*node).(*ast.BinaryNode) - if !ok { - return - } - - fns, ok := p.Operators[binaryNode.Operator] - if !ok { - return - } - - leftType := binaryNode.Left.Type() - rightType := binaryNode.Right.Type() - - ret, fn, ok := FindSuitableOperatorOverload(fns, p.Types, p.Functions, leftType, rightType) - if ok { - newNode := &ast.CallNode{ - Callee: &ast.IdentifierNode{Value: fn}, - Arguments: []ast.Node{binaryNode.Left, binaryNode.Right}, - } - newNode.SetType(ret) - ast.Patch(node, newNode) - } -} diff --git a/conf/types_table.go b/conf/types_table.go index 738eee840..a42a42874 100644 --- a/conf/types_table.go +++ b/conf/types_table.go @@ -6,6 +6,8 @@ import ( "github.com/expr-lang/expr/internal/deref" ) +type TypesTable map[string]Tag + type Tag struct { Type reflect.Type Ambiguous bool @@ -14,8 +16,6 @@ type Tag struct { MethodIndex int } -type TypesTable map[string]Tag - // CreateTypesTable creates types table for type checks during parsing. // If struct is passed, all fields will be treated as variables, // as well as all fields of embedded structs and struct itself. diff --git a/expr.go b/expr.go index e43abaafd..2802b4d1b 100644 --- a/expr.go +++ b/expr.go @@ -189,7 +189,7 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { config.Check() if len(config.Operators) > 0 { - config.Visitors = append(config.Visitors, &conf.OperatorPatcher{ + config.Visitors = append(config.Visitors, &patcher.Operator{ Operators: config.Operators, Types: config.Types, Functions: config.Functions, diff --git a/patcher/operator_override.go b/patcher/operator_override.go new file mode 100644 index 000000000..e84331bc3 --- /dev/null +++ b/patcher/operator_override.go @@ -0,0 +1,37 @@ +package patcher + +import ( + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/conf" +) + +type Operator struct { + Operators conf.OperatorsTable + Types conf.TypesTable + Functions conf.FunctionTable +} + +func (p *Operator) Visit(node *ast.Node) { + binaryNode, ok := (*node).(*ast.BinaryNode) + if !ok { + return + } + + fns, ok := p.Operators[binaryNode.Operator] + if !ok { + return + } + + leftType := binaryNode.Left.Type() + rightType := binaryNode.Right.Type() + + ret, fn, ok := conf.FindSuitableOperatorOverload(fns, p.Types, p.Functions, leftType, rightType) + if ok { + newNode := &ast.CallNode{ + Callee: &ast.IdentifierNode{Value: fn}, + Arguments: []ast.Node{binaryNode.Left, binaryNode.Right}, + } + newNode.SetType(ret) + ast.Patch(node, newNode) + } +} From 95084fb18e9d09dc3f06449f8298674e10331767 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 17 Feb 2024 19:20:53 +0100 Subject: [PATCH 272/506] Remove redundant operator override check --- checker/checker.go | 8 -------- checker/checker_test.go | 24 ------------------------ 2 files changed, 32 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index b8808441f..b46178d43 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -238,14 +238,6 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { l = deref.Type(l) r = deref.Type(r) - // check operator overloading - if fns, ok := v.config.Operators[node.Operator]; ok { - t, _, ok := conf.FindSuitableOperatorOverload(fns, v.config.Types, v.config.Functions, l, r) - if ok { - return t, info{} - } - } - switch node.Operator { case "==", "!=": if isComparable(l, r) { diff --git a/checker/checker_test.go b/checker/checker_test.go index bab9a0a67..d6a84abc5 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -714,30 +714,6 @@ func TestCheck_AllowUndefinedVariables_OptionalChaining(t *testing.T) { assert.NoError(t, err) } -func TestCheck_OperatorOverload(t *testing.T) { - type Date struct{} - env := map[string]any{ - "a": Date{}, - "b": Date{}, - "add": func(a, b Date) bool { - return true - }, - } - tree, err := parser.Parse(`a + b`) - require.NoError(t, err) - - config := conf.New(env) - expr.AsBool()(config) - - _, err = checker.Check(tree, config) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid operation: + (mismatched types checker_test.Date and checker_test.Date)") - - expr.Operator("+", "add")(config) - _, err = checker.Check(tree, config) - require.NoError(t, err) -} - func TestCheck_PointerNode(t *testing.T) { _, err := checker.Check(&parser.Tree{Node: &ast.PointerNode{}}, nil) assert.Error(t, err) From 62cdd42240f5f9ad243ca8b09e9253c59eef12bf Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 17 Feb 2024 19:56:28 +0100 Subject: [PATCH 273/506] Refactor operator override to be purely patcher pkg --- conf/config.go | 56 +++------------- conf/functions.go | 1 - conf/operators.go | 60 ----------------- expr.go | 16 ++--- patcher/operator_override.go | 114 ++++++++++++++++++++++++++++++--- test/operator/operator_test.go | 6 -- 6 files changed, 122 insertions(+), 131 deletions(-) delete mode 100644 conf/functions.go delete mode 100644 conf/operators.go diff --git a/conf/config.go b/conf/config.go index a2f571efb..e543732ce 100644 --- a/conf/config.go +++ b/conf/config.go @@ -9,26 +9,21 @@ import ( "github.com/expr-lang/expr/vm/runtime" ) -type FunctionTable map[string]*builtin.Function - -// OperatorsTable maps binary operators to corresponding list of functions. -// Functions should be provided in the environment to allow operator overloading. -type OperatorsTable map[string][]string +type FunctionsTable map[string]*builtin.Function type Config struct { Env any Types TypesTable MapEnv bool DefaultType reflect.Type - Operators OperatorsTable Expect reflect.Kind ExpectAny bool Optimize bool Strict bool ConstFns map[string]reflect.Value Visitors []ast.Visitor - Functions map[string]*builtin.Function - Builtins map[string]*builtin.Function + Functions FunctionsTable + Builtins FunctionsTable Disabled map[string]bool // disabled builtins } @@ -36,7 +31,6 @@ type Config struct { func CreateNew() *Config { c := &Config{ Optimize: true, - Operators: make(map[string][]string), ConstFns: make(map[string]reflect.Value), Functions: make(map[string]*builtin.Function), Builtins: make(map[string]*builtin.Function), @@ -73,10 +67,6 @@ func (c *Config) WithEnv(env any) { c.Strict = true } -func (c *Config) Operator(operator string, fns ...string) { - c.Operators[operator] = append(c.Operators[operator], fns...) -} - func (c *Config) ConstExpr(name string) { if c.Env == nil { panic("no environment is specified for ConstExpr()") @@ -88,42 +78,14 @@ func (c *Config) ConstExpr(name string) { c.ConstFns[name] = fn } -func (c *Config) Check() { - for operator, fns := range c.Operators { - for _, fn := range fns { - fnType, foundType := c.Types[fn] - fnFunc, foundFunc := c.Functions[fn] - if !foundFunc && (!foundType || fnType.Type.Kind() != reflect.Func) { - panic(fmt.Errorf("function %s for %s operator does not exist in the environment", fn, operator)) - } - - if foundType { - checkType(fnType, fn, operator) - } - if foundFunc { - checkFunc(fnFunc, fn, operator) - } - } - } +type Checker interface { + Check() } -func checkType(fnType Tag, fn string, operator string) { - requiredNumIn := 2 - if fnType.Method { - requiredNumIn = 3 // As first argument of method is receiver. - } - if fnType.Type.NumIn() != requiredNumIn || fnType.Type.NumOut() != 1 { - panic(fmt.Errorf("function %s for %s operator does not have a correct signature", fn, operator)) - } -} - -func checkFunc(fn *builtin.Function, name string, operator string) { - if len(fn.Types) == 0 { - panic(fmt.Errorf("function %s for %s operator misses types", name, operator)) - } - for _, t := range fn.Types { - if t.NumIn() != 2 || t.NumOut() != 1 { - panic(fmt.Errorf("function %s for %s operator does not have a correct signature", name, operator)) +func (c *Config) Check() { + for _, v := range c.Visitors { + if c, ok := v.(Checker); ok { + c.Check() } } } diff --git a/conf/functions.go b/conf/functions.go deleted file mode 100644 index 8f52a9557..000000000 --- a/conf/functions.go +++ /dev/null @@ -1 +0,0 @@ -package conf diff --git a/conf/operators.go b/conf/operators.go deleted file mode 100644 index 90cbf4fea..000000000 --- a/conf/operators.go +++ /dev/null @@ -1,60 +0,0 @@ -package conf - -import ( - "reflect" -) - -func FindSuitableOperatorOverload(fns []string, types TypesTable, funcs FunctionTable, l, r reflect.Type) (reflect.Type, string, bool) { - t, fn, ok := FindSuitableOperatorOverloadInFunctions(fns, funcs, l, r) - if !ok { - t, fn, ok = FindSuitableOperatorOverloadInTypes(fns, types, l, r) - } - return t, fn, ok -} - -func FindSuitableOperatorOverloadInTypes(fns []string, types TypesTable, l, r reflect.Type) (reflect.Type, string, bool) { - for _, fn := range fns { - fnType, ok := types[fn] - if !ok { - continue - } - firstInIndex := 0 - if fnType.Method { - firstInIndex = 1 // As first argument to method is receiver. - } - ret, done := checkTypeSuits(fnType.Type, l, r, firstInIndex) - if done { - return ret, fn, true - } - } - return nil, "", false -} - -func FindSuitableOperatorOverloadInFunctions(fns []string, funcs FunctionTable, l, r reflect.Type) (reflect.Type, string, bool) { - for _, fn := range fns { - fnType, ok := funcs[fn] - if !ok { - continue - } - firstInIndex := 0 - for _, overload := range fnType.Types { - ret, done := checkTypeSuits(overload, l, r, firstInIndex) - if done { - return ret, fn, true - } - } - } - return nil, "", false -} - -func checkTypeSuits(t reflect.Type, l reflect.Type, r reflect.Type, firstInIndex int) (reflect.Type, bool) { - firstArgType := t.In(firstInIndex) - secondArgType := t.In(firstInIndex + 1) - - firstArgumentFit := l == firstArgType || (firstArgType.Kind() == reflect.Interface && (l == nil || l.Implements(firstArgType))) - secondArgumentFit := r == secondArgType || (secondArgType.Kind() == reflect.Interface && (r == nil || r.Implements(secondArgType))) - if firstArgumentFit && secondArgumentFit { - return t.Out(0), true - } - return nil, false -} diff --git a/expr.go b/expr.go index 2802b4d1b..7d76a80ba 100644 --- a/expr.go +++ b/expr.go @@ -42,7 +42,13 @@ func AllowUndefinedVariables() Option { // Operator allows to replace a binary operator with a function. func Operator(operator string, fn ...string) Option { return func(c *conf.Config) { - c.Operator(operator, fn...) + p := &patcher.OperatorOverride{ + Operator: operator, + Overrides: fn, + Types: c.Types, + Functions: c.Functions, + } + c.Visitors = append(c.Visitors, p) } } @@ -188,14 +194,6 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { } config.Check() - if len(config.Operators) > 0 { - config.Visitors = append(config.Visitors, &patcher.Operator{ - Operators: config.Operators, - Types: config.Types, - Functions: config.Functions, - }) - } - tree, err := parser.ParseWithConfig(input, config) if err != nil { return nil, err diff --git a/patcher/operator_override.go b/patcher/operator_override.go index e84331bc3..38b3558bd 100644 --- a/patcher/operator_override.go +++ b/patcher/operator_override.go @@ -1,31 +1,35 @@ package patcher import ( + "fmt" + "reflect" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/conf" ) -type Operator struct { - Operators conf.OperatorsTable - Types conf.TypesTable - Functions conf.FunctionTable +type OperatorOverride struct { + Operator string // Operator token to override. + Overrides []string // List of function names to override operator with. + Types conf.TypesTable // Env types. + Functions conf.FunctionsTable // Env functions. } -func (p *Operator) Visit(node *ast.Node) { +func (p *OperatorOverride) Visit(node *ast.Node) { binaryNode, ok := (*node).(*ast.BinaryNode) if !ok { return } - fns, ok := p.Operators[binaryNode.Operator] - if !ok { + if binaryNode.Operator != p.Operator { return } leftType := binaryNode.Left.Type() rightType := binaryNode.Right.Type() - ret, fn, ok := conf.FindSuitableOperatorOverload(fns, p.Types, p.Functions, leftType, rightType) + ret, fn, ok := p.FindSuitableOperatorOverload(leftType, rightType) if ok { newNode := &ast.CallNode{ Callee: &ast.IdentifierNode{Value: fn}, @@ -35,3 +39,97 @@ func (p *Operator) Visit(node *ast.Node) { ast.Patch(node, newNode) } } + +func (p *OperatorOverride) FindSuitableOperatorOverload(l, r reflect.Type) (reflect.Type, string, bool) { + t, fn, ok := p.findSuitableOperatorOverloadInFunctions(l, r) + if !ok { + t, fn, ok = p.findSuitableOperatorOverloadInTypes(l, r) + } + return t, fn, ok +} + +func (p *OperatorOverride) findSuitableOperatorOverloadInTypes(l, r reflect.Type) (reflect.Type, string, bool) { + for _, fn := range p.Overrides { + fnType, ok := p.Types[fn] + if !ok { + continue + } + firstInIndex := 0 + if fnType.Method { + firstInIndex = 1 // As first argument to method is receiver. + } + ret, done := checkTypeSuits(fnType.Type, l, r, firstInIndex) + if done { + return ret, fn, true + } + } + return nil, "", false +} + +func (p *OperatorOverride) findSuitableOperatorOverloadInFunctions(l, r reflect.Type) (reflect.Type, string, bool) { + for _, fn := range p.Overrides { + fnType, ok := p.Functions[fn] + if !ok { + continue + } + firstInIndex := 0 + for _, overload := range fnType.Types { + ret, done := checkTypeSuits(overload, l, r, firstInIndex) + if done { + return ret, fn, true + } + } + } + return nil, "", false +} + +func checkTypeSuits(t reflect.Type, l reflect.Type, r reflect.Type, firstInIndex int) (reflect.Type, bool) { + firstArgType := t.In(firstInIndex) + secondArgType := t.In(firstInIndex + 1) + + firstArgumentFit := l == firstArgType || (firstArgType.Kind() == reflect.Interface && (l == nil || l.Implements(firstArgType))) + secondArgumentFit := r == secondArgType || (secondArgType.Kind() == reflect.Interface && (r == nil || r.Implements(secondArgType))) + if firstArgumentFit && secondArgumentFit { + return t.Out(0), true + } + return nil, false +} + +func (p *OperatorOverride) Check() { + for _, fn := range p.Overrides { + fnType, foundType := p.Types[fn] + fnFunc, foundFunc := p.Functions[fn] + if !foundFunc && (!foundType || fnType.Type.Kind() != reflect.Func) { + panic(fmt.Errorf("function %s for %s operator does not exist in the environment", fn, p.Operator)) + } + + if foundType { + checkType(fnType, fn, p.Operator) + } + + if foundFunc { + checkFunc(fnFunc, fn, p.Operator) + } + } +} + +func checkType(fnType conf.Tag, fn string, operator string) { + requiredNumIn := 2 + if fnType.Method { + requiredNumIn = 3 // As first argument of method is receiver. + } + if fnType.Type.NumIn() != requiredNumIn || fnType.Type.NumOut() != 1 { + panic(fmt.Errorf("function %s for %s operator does not have a correct signature", fn, operator)) + } +} + +func checkFunc(fn *builtin.Function, name string, operator string) { + if len(fn.Types) == 0 { + panic(fmt.Errorf("function %s for %s operator misses types", name, operator)) + } + for _, t := range fn.Types { + if t.NumIn() != 2 || t.NumOut() != 1 { + panic(fmt.Errorf("function %s for %s operator does not have a correct signature", name, operator)) + } + } +} diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index 59bc73f2b..e17c5fd66 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -26,12 +26,6 @@ func TestOperator_struct(t *testing.T) { require.Equal(t, true, output) } -func TestOperator_options_another_order(t *testing.T) { - code := `Time == "2017-10-23"` - _, err := expr.Compile(code, expr.Operator("==", "TimeEqualString"), expr.Env(mock.Env{})) - require.NoError(t, err) -} - func TestOperator_no_env(t *testing.T) { code := `Time == "2017-10-23"` require.Panics(t, func() { From 3da85278439a5e8ef5dc0d73f321f76742e2cecc Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 18 Feb 2024 00:15:39 +0100 Subject: [PATCH 274/506] Fix operator overloading recursive Fixes #548 --- expr.go | 23 +++++-- patcher/operator_override.go | 6 ++ test/operator/issues584/issues584_test.go | 73 +++++++++++++++++++++++ test/operator/operator_test.go | 37 ++++++++++++ 4 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 test/operator/issues584/issues584_test.go diff --git a/expr.go b/expr.go index 7d76a80ba..d9f7c0dc3 100644 --- a/expr.go +++ b/expr.go @@ -200,11 +200,24 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { } if len(config.Visitors) > 0 { - for _, v := range config.Visitors { - // We need to perform types check, because some visitors may rely on - // types information available in the tree. - _, _ = checker.Check(tree, config) - ast.Walk(&tree.Node, v) + for i := 0; i < 1000; i++ { + more := false + for _, v := range config.Visitors { + // We need to perform types check, because some visitors may rely on + // types information available in the tree. + _, _ = checker.Check(tree, config) + + ast.Walk(&tree.Node, v) + + if v, ok := v.(interface { + ShouldRepeat() bool + }); ok { + more = more || v.ShouldRepeat() + } + } + if !more { + break + } } } _, err = checker.Check(tree, config) diff --git a/patcher/operator_override.go b/patcher/operator_override.go index 38b3558bd..96e6894cc 100644 --- a/patcher/operator_override.go +++ b/patcher/operator_override.go @@ -14,6 +14,7 @@ type OperatorOverride struct { Overrides []string // List of function names to override operator with. Types conf.TypesTable // Env types. Functions conf.FunctionsTable // Env functions. + applied bool // Flag to indicate if any override was applied. } func (p *OperatorOverride) Visit(node *ast.Node) { @@ -37,9 +38,14 @@ func (p *OperatorOverride) Visit(node *ast.Node) { } newNode.SetType(ret) ast.Patch(node, newNode) + p.applied = true } } +func (p *OperatorOverride) ShouldRepeat() bool { + return p.applied +} + func (p *OperatorOverride) FindSuitableOperatorOverload(l, r reflect.Type) (reflect.Type, string, bool) { t, fn, ok := p.findSuitableOperatorOverloadInFunctions(l, r) if !ok { diff --git a/test/operator/issues584/issues584_test.go b/test/operator/issues584/issues584_test.go new file mode 100644 index 000000000..13c9c66f3 --- /dev/null +++ b/test/operator/issues584/issues584_test.go @@ -0,0 +1,73 @@ +package issues584_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/expr-lang/expr" +) + +type Env struct{} + +type Program struct { +} + +func (p *Program) Foo() Value { + return func(e *Env) float64 { + return 5 + } +} + +func (p *Program) Bar() Value { + return func(e *Env) float64 { + return 100 + } +} + +func (p *Program) AndCondition(a, b Condition) Conditions { + return Conditions{a, b} +} + +func (p *Program) AndConditions(a Conditions, b Condition) Conditions { + return append(a, b) +} + +func (p *Program) ValueGreaterThan_float(v Value, i float64) Condition { + return func(e *Env) bool { + realized := v(e) + return realized > i + } +} + +func (p *Program) ValueLessThan_float(v Value, i float64) Condition { + return func(e *Env) bool { + realized := v(e) + return realized < i + } +} + +type Condition func(e *Env) bool +type Conditions []Condition + +type Value func(e *Env) float64 + +func TestIssue584(t *testing.T) { + code := `Foo() > 1.5 and Bar() < 200.0` + + p := &Program{} + + opt := []expr.Option{ + expr.Env(p), + expr.Operator("and", "AndCondition", "AndConditions"), + expr.Operator(">", "ValueGreaterThan_float"), + expr.Operator("<", "ValueLessThan_float"), + } + + program, err := expr.Compile(code, opt...) + assert.Nil(t, err) + + state, err := expr.Run(program, p) + assert.Nil(t, err) + assert.NotNil(t, state) +} diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index e17c5fd66..99817effb 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -216,3 +216,40 @@ func TestOperator_Polymorphic(t *testing.T) { require.NoError(t, err) require.Equal(t, 6, output) } + +func TestOperator_recursive_apply(t *testing.T) { + type Decimal struct { + Int int + } + + env := map[string]any{ + "add": func(a, b Decimal) Decimal { + return Decimal{ + Int: a.Int + b.Int, + } + }, + "addInt": func(a Decimal, b int) Decimal { + return Decimal{ + Int: a.Int + b, + } + }, + "a": Decimal{1}, + "b": Decimal{2}, + "c": Decimal{3}, + "d": Decimal{4}, + "e": Decimal{5}, + } + + program, err := expr.Compile( + `a + b + 100 + c + d + e`, + expr.Env(env), + expr.Operator("+", "add"), + expr.Operator("+", "addInt"), + ) + require.NoError(t, err) + require.Equal(t, `add(add(add(addInt(add(a, b), 100), c), d), e)`, program.Node().String()) + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 115, output.(Decimal).Int) +} From 323873a0f4b71f3d799a1626ba07f148bcb140cd Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 18 Feb 2024 09:45:39 +0100 Subject: [PATCH 275/506] Add quotes to error message --- patcher/operator_override.go | 4 ++-- test/operator/operator_test.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/patcher/operator_override.go b/patcher/operator_override.go index 96e6894cc..428454f5b 100644 --- a/patcher/operator_override.go +++ b/patcher/operator_override.go @@ -131,11 +131,11 @@ func checkType(fnType conf.Tag, fn string, operator string) { func checkFunc(fn *builtin.Function, name string, operator string) { if len(fn.Types) == 0 { - panic(fmt.Errorf("function %s for %s operator misses types", name, operator)) + panic(fmt.Errorf("function %q for %q operator misses types", name, operator)) } for _, t := range fn.Types { if t.NumIn() != 2 || t.NumOut() != 1 { - panic(fmt.Errorf("function %s for %s operator does not have a correct signature", name, operator)) + panic(fmt.Errorf("function %q for %q operator does not have a correct signature", name, operator)) } } } diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index 99817effb..a19c191dc 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/expr-lang/expr" @@ -108,7 +109,7 @@ func TestOperator_Function_WithTypes(t *testing.T) { "bar": Value{2}, } - require.PanicsWithError(t, `function Add for + operator misses types`, func() { + assert.PanicsWithError(t, `function "Add" for "+" operator misses types`, func() { _, _ = expr.Compile( `foo + bar`, expr.Env(env), @@ -119,7 +120,7 @@ func TestOperator_Function_WithTypes(t *testing.T) { ) }) - require.PanicsWithError(t, `function Add for + operator does not have a correct signature`, func() { + assert.PanicsWithError(t, `function "Add" for "+" operator does not have a correct signature`, func() { _, _ = expr.Compile( `foo + bar`, expr.Env(env), @@ -131,7 +132,6 @@ func TestOperator_Function_WithTypes(t *testing.T) { ), ) }) - } func TestOperator_FunctionOverTypesPrecedence(t *testing.T) { From 3196510a3db4568803e37d1447832c16a40821a4 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 18 Feb 2024 09:55:10 +0100 Subject: [PATCH 276/506] Fix naming --- expr.go | 4 ++-- patcher/operator_override.go | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/expr.go b/expr.go index d9f7c0dc3..ba786c017 100644 --- a/expr.go +++ b/expr.go @@ -42,9 +42,9 @@ func AllowUndefinedVariables() Option { // Operator allows to replace a binary operator with a function. func Operator(operator string, fn ...string) Option { return func(c *conf.Config) { - p := &patcher.OperatorOverride{ + p := &patcher.OperatorOverloading{ Operator: operator, - Overrides: fn, + Overloads: fn, Types: c.Types, Functions: c.Functions, } diff --git a/patcher/operator_override.go b/patcher/operator_override.go index 428454f5b..551fe09bb 100644 --- a/patcher/operator_override.go +++ b/patcher/operator_override.go @@ -9,15 +9,15 @@ import ( "github.com/expr-lang/expr/conf" ) -type OperatorOverride struct { - Operator string // Operator token to override. - Overrides []string // List of function names to override operator with. +type OperatorOverloading struct { + Operator string // Operator token to overload. + Overloads []string // List of function names to replace operator with. Types conf.TypesTable // Env types. Functions conf.FunctionsTable // Env functions. - applied bool // Flag to indicate if any override was applied. + applied bool // Flag to indicate if any changes were made to the tree. } -func (p *OperatorOverride) Visit(node *ast.Node) { +func (p *OperatorOverloading) Visit(node *ast.Node) { binaryNode, ok := (*node).(*ast.BinaryNode) if !ok { return @@ -42,11 +42,11 @@ func (p *OperatorOverride) Visit(node *ast.Node) { } } -func (p *OperatorOverride) ShouldRepeat() bool { +func (p *OperatorOverloading) ShouldRepeat() bool { return p.applied } -func (p *OperatorOverride) FindSuitableOperatorOverload(l, r reflect.Type) (reflect.Type, string, bool) { +func (p *OperatorOverloading) FindSuitableOperatorOverload(l, r reflect.Type) (reflect.Type, string, bool) { t, fn, ok := p.findSuitableOperatorOverloadInFunctions(l, r) if !ok { t, fn, ok = p.findSuitableOperatorOverloadInTypes(l, r) @@ -54,8 +54,8 @@ func (p *OperatorOverride) FindSuitableOperatorOverload(l, r reflect.Type) (refl return t, fn, ok } -func (p *OperatorOverride) findSuitableOperatorOverloadInTypes(l, r reflect.Type) (reflect.Type, string, bool) { - for _, fn := range p.Overrides { +func (p *OperatorOverloading) findSuitableOperatorOverloadInTypes(l, r reflect.Type) (reflect.Type, string, bool) { + for _, fn := range p.Overloads { fnType, ok := p.Types[fn] if !ok { continue @@ -72,8 +72,8 @@ func (p *OperatorOverride) findSuitableOperatorOverloadInTypes(l, r reflect.Type return nil, "", false } -func (p *OperatorOverride) findSuitableOperatorOverloadInFunctions(l, r reflect.Type) (reflect.Type, string, bool) { - for _, fn := range p.Overrides { +func (p *OperatorOverloading) findSuitableOperatorOverloadInFunctions(l, r reflect.Type) (reflect.Type, string, bool) { + for _, fn := range p.Overloads { fnType, ok := p.Functions[fn] if !ok { continue @@ -101,8 +101,8 @@ func checkTypeSuits(t reflect.Type, l reflect.Type, r reflect.Type, firstInIndex return nil, false } -func (p *OperatorOverride) Check() { - for _, fn := range p.Overrides { +func (p *OperatorOverloading) Check() { + for _, fn := range p.Overloads { fnType, foundType := p.Types[fn] fnFunc, foundFunc := p.Functions[fn] if !foundFunc && (!foundType || fnType.Type.Kind() != reflect.Func) { From 6cc56e7068129ed927c1f7eeca7d780f66f04a92 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 21 Feb 2024 00:07:51 +0100 Subject: [PATCH 277/506] Remove redundant checks --- vm/runtime/runtime.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index d54152117..7da1320de 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -80,11 +80,9 @@ type Field struct { func FetchField(from any, field *Field) any { v := reflect.ValueOf(from) - kind := v.Kind() - if kind != reflect.Invalid { - if kind == reflect.Ptr { - v = reflect.Indirect(v) - } + if v.Kind() != reflect.Invalid { + v = reflect.Indirect(v) + // We can use v.FieldByIndex here, but it will panic if the field // is not exists. And we need to recover() to generate a more // user-friendly error message. From ae180c8f7deaab0ce41bbea10dccc1d17737abe2 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Sun, 25 Feb 2024 01:42:51 +0530 Subject: [PATCH 278/506] Enhanced min and max built-in functions to Support Arrays of Integers and Floats (#576) * Enhanced min and max built-in functions to Support Arrays of Integers and Floats * Enhanced min and max built-in functions to Support Arrays of Integers and Floats --- builtin/builtin.go | 51 ++++++++++++++++++++++++++--------------- builtin/builtin_test.go | 8 +++++++ builtin/lib.go | 45 +++++++++++++++++++++++++++--------- expr_test.go | 16 +++++++++++++ testdata/examples.txt | 2 +- 5 files changed, 92 insertions(+), 30 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 4aad6aa9c..fc48e111a 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -394,38 +394,53 @@ var Builtins = []*Function{ Name: "max", Func: Max, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) == 0 { + switch len(args) { + case 0: return anyType, fmt.Errorf("not enough arguments to call max") - } - for _, arg := range args { - switch kind(arg) { - case reflect.Interface: + case 1: + if kindName := kind(args[0]); kindName == reflect.Array || kindName == reflect.Slice { return anyType, nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - default: - return anyType, fmt.Errorf("invalid argument for max (type %s)", arg) } + fallthrough + default: + for _, arg := range args { + switch kind(arg) { + case reflect.Interface, reflect.Array, reflect.Slice: + return anyType, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: + default: + return anyType, fmt.Errorf("invalid argument for max (type %s)", arg) + } + } + return args[0], nil } - return args[0], nil }, }, { Name: "min", Func: Min, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) == 0 { + switch len(args) { + case 0: return anyType, fmt.Errorf("not enough arguments to call min") - } - for _, arg := range args { - switch kind(arg) { - case reflect.Interface: + case 1: + if kindName := kind(args[0]); kindName == reflect.Array || kindName == reflect.Slice { return anyType, nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - default: - return anyType, fmt.Errorf("invalid argument for min (type %s)", arg) } + fallthrough + default: + for _, arg := range args { + switch kind(arg) { + case reflect.Interface, reflect.Array, reflect.Slice: + return anyType, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: + default: + return anyType, fmt.Errorf("invalid argument for min (type %s)", arg) + } + } + return args[0], nil + } - return args[0], nil }, }, { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 3a2850071..bc1a2e149 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -77,8 +77,14 @@ func TestBuiltin(t *testing.T) { {`hasSuffix("foo,bar,baz", "baz")`, true}, {`max(1, 2, 3)`, 3}, {`max(1.5, 2.5, 3.5)`, 3.5}, + {`max([1, 2, 3])`, 3}, + {`max([1.5, 2.5, 3.5])`, 3.5}, + {`max([1, 2, 4, 10], 20, [29, 23, -19])`, 29}, + {`min([1, 2, 4, 10], 20, [29, 23, -19])`, -19}, {`min(1, 2, 3)`, 1}, {`min(1.5, 2.5, 3.5)`, 1.5}, + {`min([1, 2, 3])`, 1}, + {`min([1.5, 2.5, 3.5])`, 1.5}, {`sum(1..9)`, 45}, {`sum([.5, 1.5, 2.5])`, 4.5}, {`sum([])`, 0}, @@ -197,8 +203,10 @@ func TestBuiltin_errors(t *testing.T) { {`trim()`, `not enough arguments to call trim`}, {`max()`, `not enough arguments to call max`}, {`max(1, "2")`, `invalid argument for max (type string)`}, + {`max([1, "2"])`, `invalid argument for max (type string)`}, {`min()`, `not enough arguments to call min`}, {`min(1, "2")`, `invalid argument for min (type string)`}, + {`min([1, "2"])`, `invalid argument for min (type string)`}, {`duration("error")`, `invalid duration`}, {`date("error")`, `invalid date`}, {`get()`, `invalid number of arguments (expected 2, got 0)`}, diff --git a/builtin/lib.go b/builtin/lib.go index 00b4c9210..b08c2ed2b 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -255,21 +255,44 @@ func String(arg any) any { } func Max(args ...any) (any, error) { - var max any - for _, arg := range args { - if max == nil || runtime.Less(max, arg) { - max = arg - } - } - return max, nil + return minMaxFunc("max", runtime.Less, args) } func Min(args ...any) (any, error) { - var min any + return minMaxFunc("min", runtime.More, args) +} + +func minMaxFunc(name string, fn func(any, any) bool, args []any) (any, error) { + var val any for _, arg := range args { - if min == nil || runtime.More(min, arg) { - min = arg + switch v := arg.(type) { + case []float32, []float64, []uint, []uint8, []uint16, []uint32, []uint64, []int, []int8, []int16, []int32, []int64: + rv := reflect.ValueOf(v) + if rv.Len() == 0 { + return nil, fmt.Errorf("not enough arguments to call %s", name) + } + arg = rv.Index(0).Interface() + for i := 1; i < rv.Len(); i++ { + elem := rv.Index(i).Interface() + if fn(arg, elem) { + arg = elem + } + } + case []any: + var err error + if arg, err = minMaxFunc(name, fn, v); err != nil { + return nil, err + } + case float32, float64, uint, uint8, uint16, uint32, uint64, int, int8, int16, int32, int64: + default: + if len(args) == 1 { + return arg, nil + } + return nil, fmt.Errorf("invalid argument for %s (type %T)", name, v) + } + if val == nil || fn(val, arg) { + val = arg } } - return min, nil + return val, nil } diff --git a/expr_test.go b/expr_test.go index ed08cae53..74975362b 100644 --- a/expr_test.go +++ b/expr_test.go @@ -853,6 +853,22 @@ func TestExpr(t *testing.T) { `len({a: 1, b: 2, c: 2})`, 3, }, + { + `max([1, 2, 3])`, + 3, + }, + { + `max(1, 2, 3)`, + 3, + }, + { + `min([1, 2, 3])`, + 1, + }, + { + `min(1, 2, 3)`, + 1, + }, { `{foo: 0, bar: 1}`, map[string]any{"foo": 0, "bar": 1}, diff --git a/testdata/examples.txt b/testdata/examples.txt index 9abe85327..712aa91c0 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -13822,7 +13822,7 @@ min(ok ? array : false) min(ok ? f64 : i) min(ok ? half : ok) min(ok ? i : f32) -min(ok ? list : score) +min(ok ? array : score) min(ok ? true : div) min(reduce(array, #)) min(reduce(array, 0.5)) From 2347a4e3f2ca6349d3154c135a090a6834023b22 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 27 Feb 2024 20:23:49 +0700 Subject: [PATCH 279/506] Support chzained comparisonc`1 < 2 < 3` (#581) --- expr_test.go | 20 +++++++++++++ parser/operator/operator.go | 4 +++ parser/parser.go | 36 ++++++++++++++++++++++ parser/parser_test.go | 60 +++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+) diff --git a/expr_test.go b/expr_test.go index 74975362b..9d9d88af9 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1253,6 +1253,26 @@ func TestExpr(t *testing.T) { `[nil, 3, 4]?.[0]?.[1]`, nil, }, + { + `1 > 2 < 3`, + false, + }, + { + `1 < 2 < 3`, + true, + }, + { + `1 < 2 < 3 > 4`, + false, + }, + { + `1 < 2 < 3 > 2`, + true, + }, + { + `1 < 2 < 3 == true`, + true, + }, } for _, tt := range tests { diff --git a/parser/operator/operator.go b/parser/operator/operator.go index 8d804c7b3..411a0e2bc 100644 --- a/parser/operator/operator.go +++ b/parser/operator/operator.go @@ -54,3 +54,7 @@ var Binary = map[string]Operator{ "^": {100, Right}, "??": {500, Left}, } + +func IsComparison(op string) bool { + return op == "<" || op == ">" || op == ">=" || op == "<=" +} diff --git a/parser/parser.go b/parser/parser.go index 1eabdebe2..9114bc0c9 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -164,6 +164,11 @@ func (p *parser) parseExpression(precedence int) Node { break } + if operator.IsComparison(opToken.Value) { + nodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence) + goto next + } + var nodeRight Node if op.Associativity == operator.Left { nodeRight = p.parseExpression(op.Precedence + 1) @@ -685,3 +690,34 @@ func (p *parser) parsePostfixExpression(node Node) Node { } return node } + +func (p *parser) parseComparison(left Node, token Token, precedence int) Node { + var rootNode Node + for { + comparator := p.parseExpression(precedence + 1) + cmpNode := &BinaryNode{ + Operator: token.Value, + Left: left, + Right: comparator, + } + cmpNode.SetLocation(token.Location) + if rootNode == nil { + rootNode = cmpNode + } else { + rootNode = &BinaryNode{ + Operator: "&&", + Left: rootNode, + Right: cmpNode, + } + rootNode.SetLocation(token.Location) + } + + left = comparator + token = p.current + if !(token.Is(Operator) && operator.IsComparison(token.Value) && p.err == nil) { + break + } + p.next() + } + return rootNode +} diff --git a/parser/parser_test.go b/parser/parser_test.go index b633bd52e..9225e1028 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -531,6 +531,66 @@ world`}, To: &IntegerNode{Value: 3}, }, }, + { + `1 < 2 > 3`, + &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 2}, + }, + Right: &BinaryNode{ + Operator: ">", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 3}, + }, + }, + }, + { + `1 < 2 < 3 < 4`, + &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 2}, + }, + Right: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 3}, + }, + }, + Right: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 3}, + Right: &IntegerNode{Value: 4}, + }, + }, + }, + { + `1 < 2 < 3 == true`, + &BinaryNode{ + Operator: "==", + Left: &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 2}, + }, + Right: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 3}, + }, + }, + Right: &BoolNode{Value: true}, + }, + }, } for _, test := range tests { t.Run(test.input, func(t *testing.T) { From f1b68c877d52fe7e5ca985055e113c9a519bb57c Mon Sep 17 00:00:00 2001 From: bizy Date: Wed, 28 Feb 2024 00:30:33 +0700 Subject: [PATCH 280/506] Compare `any` arrays --- expr_test.go | 26 +++ vm/runtime/helpers/main.go | 46 +++++ vm/runtime/helpers[generated].go | 343 +++++++++++++++++++++++++++++++ 3 files changed, 415 insertions(+) diff --git a/expr_test.go b/expr_test.go index 74975362b..ea9213be2 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2482,3 +2482,29 @@ func TestRaceCondition_variables(t *testing.T) { wg.Wait() } + +func TestArrayComparison(t *testing.T) { + tests := []struct { + env any + code string + }{ + {[]string{"A", "B"}, "foo == ['A', 'B']"}, + {[]int{1, 2}, "foo == [1, 2]"}, + {[]uint8{1, 2}, "foo == [1, 2]"}, + {[]float64{1.1, 2.2}, "foo == [1.1, 2.2]"}, + {[]any{"A", 1, 1.1, true}, "foo == ['A', 1, 1.1, true]"}, + {[]string{"A", "B"}, "foo != [1, 2]"}, + } + + for _, tt := range tests { + t.Run(tt.code, func(t *testing.T) { + env := map[string]any{"foo": tt.env} + program, err := expr.Compile(tt.code, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, true, out) + }) + } +} diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index b3f598a43..54a4fc235 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -19,6 +19,7 @@ func main() { "cases_with_duration": func(op string) string { return cases(op, uints, ints, floats, []string{"time.Duration"}) }, + "array_equal_cases": func() string { return arrayEqualCases([]string{"string"}, uints, ints, floats) }, }). Parse(helpers), ).Execute(&b, nil) @@ -89,6 +90,45 @@ func cases(op string, xs ...[]string) string { return strings.TrimRight(out, "\n") } +func arrayEqualCases(xs ...[]string) string { + var types []string + for _, x := range xs { + types = append(types, x...) + } + + _, _ = fmt.Fprintf(os.Stderr, "Generating array equal cases for %v\n", types) + + var out string + echo := func(s string, xs ...any) { + out += fmt.Sprintf(s, xs...) + "\n" + } + echo(`case []any:`) + echo(`switch y := b.(type) {`) + for _, a := range append(types, "any") { + echo(`case []%v:`, a) + echo(`if len(x) != len(y) { return false }`) + echo(`for i := range x {`) + echo(`if !Equal(x[i], y[i]) { return false }`) + echo(`}`) + echo("return true") + } + echo(`}`) + for _, a := range types { + echo(`case []%v:`, a) + echo(`switch y := b.(type) {`) + echo(`case []any:`) + echo(`return Equal(y, x)`) + echo(`case []%v:`, a) + echo(`if len(x) != len(y) { return false }`) + echo(`for i := range x {`) + echo(`if x[i] != y[i] { return false }`) + echo(`}`) + echo("return true") + echo(`}`) + } + return strings.TrimRight(out, "\n") +} + func isFloat(t string) bool { return strings.HasPrefix(t, "float") } @@ -110,6 +150,7 @@ import ( func Equal(a, b interface{}) bool { switch x := a.(type) { {{ cases "==" }} + {{ array_equal_cases }} case string: switch y := b.(type) { case string: @@ -125,6 +166,11 @@ func Equal(a, b interface{}) bool { case time.Duration: return x == y } + case bool: + switch y := b.(type) { + case bool: + return x == y + } } if IsNil(a) && IsNil(b) { return true diff --git a/vm/runtime/helpers[generated].go b/vm/runtime/helpers[generated].go index 720feb455..d950f1111 100644 --- a/vm/runtime/helpers[generated].go +++ b/vm/runtime/helpers[generated].go @@ -334,6 +334,344 @@ func Equal(a, b interface{}) bool { case float64: return float64(x) == float64(y) } + case []any: + switch y := b.(type) { + case []string: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []uint: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []uint8: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []uint16: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []uint32: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []uint64: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []int: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []int8: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []int16: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []int32: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []int64: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []float32: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []float64: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + case []any: + if len(x) != len(y) { + return false + } + for i := range x { + if !Equal(x[i], y[i]) { + return false + } + } + return true + } + case []string: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []string: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []uint: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []uint: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []uint8: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []uint8: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []uint16: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []uint16: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []uint32: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []uint32: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []uint64: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []uint64: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []int: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []int: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []int8: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []int8: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []int16: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []int16: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []int32: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []int32: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []int64: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []int64: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []float32: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []float32: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } + case []float64: + switch y := b.(type) { + case []any: + return Equal(y, x) + case []float64: + if len(x) != len(y) { + return false + } + for i := range x { + if x[i] != y[i] { + return false + } + } + return true + } case string: switch y := b.(type) { case string: @@ -349,6 +687,11 @@ func Equal(a, b interface{}) bool { case time.Duration: return x == y } + case bool: + switch y := b.(type) { + case bool: + return x == y + } } if IsNil(a) && IsNil(b) { return true From 7795708ed42d7787f2adc172fdcfe43fd7afcda6 Mon Sep 17 00:00:00 2001 From: Sergey Date: Wed, 28 Feb 2024 16:39:01 +0700 Subject: [PATCH 281/506] Equal bools without `reflect.DeepEqual` (#585) --- vm/runtime/helpers/main.go | 5 +++++ vm/runtime/helpers[generated].go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index b3f598a43..d3b647c4a 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -125,6 +125,11 @@ func Equal(a, b interface{}) bool { case time.Duration: return x == y } + case bool: + switch y := b.(type) { + case bool: + return x == y + } } if IsNil(a) && IsNil(b) { return true diff --git a/vm/runtime/helpers[generated].go b/vm/runtime/helpers[generated].go index 720feb455..3529fdd58 100644 --- a/vm/runtime/helpers[generated].go +++ b/vm/runtime/helpers[generated].go @@ -349,6 +349,11 @@ func Equal(a, b interface{}) bool { case time.Duration: return x == y } + case bool: + switch y := b.(type) { + case bool: + return x == y + } } if IsNil(a) && IsNil(b) { return true From adb139a4fd62f8bcebab9ba9c7d4d7d6e61e13ca Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 29 Feb 2024 20:51:34 +0100 Subject: [PATCH 282/506] Add spans --- compiler/compiler.go | 29 +++++++++++++++++++++++++++++ conf/config.go | 1 + vm/opcodes.go | 2 ++ vm/program.go | 9 +++++++++ vm/utils.go | 13 +++++++++++++ vm/vm.go | 9 +++++++++ 6 files changed, 63 insertions(+) diff --git a/compiler/compiler.go b/compiler/compiler.go index a4f189e6b..808b53c9b 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -50,6 +50,11 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro } } + var span *Span + if len(c.spans) > 0 { + span = c.spans[0] + } + program = NewProgram( tree.Source, tree.Node, @@ -60,6 +65,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro c.arguments, c.functions, c.debugInfo, + span, ) return } @@ -76,6 +82,7 @@ type compiler struct { functionsIndex map[string]int debugInfo map[string]string nodes []ast.Node + spans []*Span chains [][]int arguments []int } @@ -193,6 +200,28 @@ func (c *compiler) compile(node ast.Node) { c.nodes = c.nodes[:len(c.nodes)-1] }() + if c.config != nil && c.config.Profile { + span := &Span{ + Name: reflect.TypeOf(node).String(), + Expression: node.String(), + } + if len(c.spans) > 0 { + prev := c.spans[len(c.spans)-1] + prev.Children = append(prev.Children, span) + } + c.spans = append(c.spans, span) + defer func() { + if len(c.spans) > 1 { + c.spans = c.spans[:len(c.spans)-1] + } + }() + + c.emit(OpProfileStart, c.addConstant(span)) + defer func() { + c.emit(OpProfileEnd, c.addConstant(span)) + }() + } + switch n := node.(type) { case *ast.NilNode: c.NilNode(n) diff --git a/conf/config.go b/conf/config.go index e543732ce..799898109 100644 --- a/conf/config.go +++ b/conf/config.go @@ -20,6 +20,7 @@ type Config struct { ExpectAny bool Optimize bool Strict bool + Profile bool ConstFns map[string]reflect.Value Visitors []ast.Visitor Functions FunctionsTable diff --git a/vm/opcodes.go b/vm/opcodes.go index 0417dab61..84d751d6b 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -81,6 +81,8 @@ const ( OpGroupBy OpSortBy OpSort + OpProfileStart + OpProfileEnd OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index 4a878267b..989546744 100644 --- a/vm/program.go +++ b/vm/program.go @@ -27,6 +27,7 @@ type Program struct { variables int functions []Function debugInfo map[string]string + span *Span } // NewProgram returns a new Program. It's used by the compiler. @@ -40,6 +41,7 @@ func NewProgram( arguments []int, functions []Function, debugInfo map[string]string, + span *Span, ) *Program { return &Program{ source: source, @@ -51,6 +53,7 @@ func NewProgram( Arguments: arguments, functions: functions, debugInfo: debugInfo, + span: span, } } @@ -360,6 +363,12 @@ func (program *Program) DisassembleWriter(w io.Writer) { case OpSort: code("OpSort") + case OpProfileStart: + code("OpProfileStart") + + case OpProfileEnd: + code("OpProfileEnd") + case OpBegin: code("OpBegin") diff --git a/vm/utils.go b/vm/utils.go index d7db2a52a..fc2f5e7b8 100644 --- a/vm/utils.go +++ b/vm/utils.go @@ -2,6 +2,7 @@ package vm import ( "reflect" + "time" ) type ( @@ -25,3 +26,15 @@ type Scope struct { } type groupBy = map[any][]any + +type Span struct { + Name string `json:"name"` + Expression string `json:"expression"` + Duration int64 `json:"duration"` + Children []*Span `json:"children"` + start time.Time +} + +func GetSpan(program *Program) *Span { + return program.span +} diff --git a/vm/vm.go b/vm/vm.go index 1e85893b0..7e933ce74 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -8,6 +8,7 @@ import ( "regexp" "sort" "strings" + "time" "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/file" @@ -523,6 +524,14 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.memGrow(uint(scope.Len)) vm.push(sortable.Array) + case OpProfileStart: + span := program.Constants[arg].(*Span) + span.start = time.Now() + + case OpProfileEnd: + span := program.Constants[arg].(*Span) + span.Duration += time.Since(span.start).Nanoseconds() + case OpBegin: a := vm.pop() array := reflect.ValueOf(a) From 4cdfd385dd0407717198c893913df744c5d1a744 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Sun, 3 Mar 2024 21:14:32 +0530 Subject: [PATCH 283/506] Enable Support for Arrays in Sum, Mean, and Median Functions (#580) --- builtin/builtin.go | 201 ++++++---------------------------------- builtin/builtin_test.go | 13 +++ builtin/lib.go | 154 ++++++++++++++++++++++++------ builtin/validation.go | 38 ++++++++ 4 files changed, 206 insertions(+), 200 deletions(-) create mode 100644 builtin/validation.go diff --git a/builtin/builtin.go b/builtin/builtin.go index fc48e111a..7bf377df2 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -135,42 +135,21 @@ var Builtins = []*Function{ Name: "ceil", Fast: Ceil, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: - return floatType, nil - } - return anyType, fmt.Errorf("invalid argument for ceil (type %s)", args[0]) + return validateRoundFunc("ceil", args) }, }, { Name: "floor", Fast: Floor, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: - return floatType, nil - } - return anyType, fmt.Errorf("invalid argument for floor (type %s)", args[0]) + return validateRoundFunc("floor", args) }, }, { Name: "round", Fast: Round, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: - return floatType, nil - } - return anyType, fmt.Errorf("invalid argument for floor (type %s)", args[0]) + return validateRoundFunc("round", args) }, }, { @@ -392,185 +371,63 @@ var Builtins = []*Function{ }, { Name: "max", - Func: Max, + Func: func(args ...any) (any, error) { + return minMax("max", runtime.Less, args...) + }, Validate: func(args []reflect.Type) (reflect.Type, error) { - switch len(args) { - case 0: - return anyType, fmt.Errorf("not enough arguments to call max") - case 1: - if kindName := kind(args[0]); kindName == reflect.Array || kindName == reflect.Slice { - return anyType, nil - } - fallthrough - default: - for _, arg := range args { - switch kind(arg) { - case reflect.Interface, reflect.Array, reflect.Slice: - return anyType, nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - default: - return anyType, fmt.Errorf("invalid argument for max (type %s)", arg) - } - } - return args[0], nil - } + return validateAggregateFunc("max", args) }, }, { Name: "min", - Func: Min, + Func: func(args ...any) (any, error) { + return minMax("min", runtime.More, args...) + }, Validate: func(args []reflect.Type) (reflect.Type, error) { - switch len(args) { - case 0: - return anyType, fmt.Errorf("not enough arguments to call min") - case 1: - if kindName := kind(args[0]); kindName == reflect.Array || kindName == reflect.Slice { - return anyType, nil - } - fallthrough - default: - for _, arg := range args { - switch kind(arg) { - case reflect.Interface, reflect.Array, reflect.Slice: - return anyType, nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - default: - return anyType, fmt.Errorf("invalid argument for min (type %s)", arg) - } - } - return args[0], nil - - } + return validateAggregateFunc("min", args) }, }, { Name: "sum", - Func: func(args ...any) (any, error) { - if len(args) != 1 { - return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot sum %s", v.Kind()) - } - sum := int64(0) - i := 0 - for ; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - sum += it.Int() - } else if it.CanFloat() { - goto float - } else { - return nil, fmt.Errorf("cannot sum %s", it.Kind()) - } - } - return int(sum), nil - float: - fSum := float64(sum) - for ; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - fSum += float64(it.Int()) - } else if it.CanFloat() { - fSum += it.Float() - } else { - return nil, fmt.Errorf("cannot sum %s", it.Kind()) - } - } - return fSum, nil - }, + Func: sum, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot sum %s", args[0]) - } - return anyType, nil + return validateAggregateFunc("sum", args) }, }, { Name: "mean", Func: func(args ...any) (any, error) { - if len(args) != 1 { - return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot mean %s", v.Kind()) + count, sum, err := mean(args...) + if err != nil { + return nil, err } - if v.Len() == 0 { + if count == 0 { return 0.0, nil } - sum := float64(0) - i := 0 - for ; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - sum += float64(it.Int()) - } else if it.CanFloat() { - sum += it.Float() - } else { - return nil, fmt.Errorf("cannot mean %s", it.Kind()) - } - } - return sum / float64(i), nil + return sum / float64(count), nil }, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot avg %s", args[0]) - } - return floatType, nil + return validateAggregateFunc("mean", args) }, }, { Name: "median", Func: func(args ...any) (any, error) { - if len(args) != 1 { - return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot median %s", v.Kind()) - } - if v.Len() == 0 { - return 0.0, nil + values, err := median(args...) + if err != nil { + return nil, err } - s := make([]float64, v.Len()) - for i := 0; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - s[i] = float64(it.Int()) - } else if it.CanFloat() { - s[i] = it.Float() - } else { - return nil, fmt.Errorf("cannot median %s", it.Kind()) + if n := len(values); n > 0 { + sort.Float64s(values) + if n%2 == 1 { + return values[n/2], nil } + return (values[n/2-1] + values[n/2]) / 2, nil } - sort.Float64s(s) - if len(s)%2 == 0 { - return (s[len(s)/2-1] + s[len(s)/2]) / 2, nil - } - return s[len(s)/2], nil + return 0.0, nil }, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot median %s", args[0]) - } - return floatType, nil + return validateAggregateFunc("median", args) }, }, { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index bc1a2e149..aa324c9be 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -85,19 +85,29 @@ func TestBuiltin(t *testing.T) { {`min(1.5, 2.5, 3.5)`, 1.5}, {`min([1, 2, 3])`, 1}, {`min([1.5, 2.5, 3.5])`, 1.5}, + {`min(-1, [1.5, 2.5, 3.5])`, -1}, {`sum(1..9)`, 45}, {`sum([.5, 1.5, 2.5])`, 4.5}, {`sum([])`, 0}, {`sum([1, 2, 3.0, 4])`, 10.0}, + {`sum(10, [1, 2, 3], 1..9)`, 61}, + {`sum(-10, [1, 2, 3, 4])`, 0}, + {`sum(-10.9, [1, 2, 3, 4, 9])`, 8.1}, {`mean(1..9)`, 5.0}, {`mean([.5, 1.5, 2.5])`, 1.5}, {`mean([])`, 0.0}, {`mean([1, 2, 3.0, 4])`, 2.5}, + {`mean(10, [1, 2, 3], 1..9)`, 4.6923076923076925}, + {`mean(-10, [1, 2, 3, 4])`, 0.0}, + {`mean(10.9, 1..9)`, 5.59}, {`median(1..9)`, 5.0}, {`median([.5, 1.5, 2.5])`, 1.5}, {`median([])`, 0.0}, {`median([1, 2, 3])`, 2.0}, {`median([1, 2, 3, 4])`, 2.5}, + {`median(10, [1, 2, 3], 1..9)`, 4.0}, + {`median(-10, [1, 2, 3, 4])`, 2.0}, + {`median(1..5, 4.9)`, 3.5}, {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, {`fromJSON("[1, 2, 3]")`, []any{1.0, 2.0, 3.0}}, {`toBase64("hello")`, "aGVsbG8="}, @@ -207,6 +217,9 @@ func TestBuiltin_errors(t *testing.T) { {`min()`, `not enough arguments to call min`}, {`min(1, "2")`, `invalid argument for min (type string)`}, {`min([1, "2"])`, `invalid argument for min (type string)`}, + {`median(1..9, "t")`, "invalid argument for median (type string)"}, + {`mean("s", 1..9)`, "invalid argument for mean (type string)"}, + {`sum("s", "h")`, "invalid argument for sum (type string)"}, {`duration("error")`, `invalid duration`}, {`date("error")`, `invalid date`}, {`get()`, `invalid number of arguments (expected 2, got 0)`}, diff --git a/builtin/lib.go b/builtin/lib.go index b08c2ed2b..9ff9478aa 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -6,7 +6,7 @@ import ( "reflect" "strconv" - "github.com/expr-lang/expr/vm/runtime" + "github.com/expr-lang/expr/internal/deref" ) func Len(x any) any { @@ -254,45 +254,143 @@ func String(arg any) any { return fmt.Sprintf("%v", arg) } -func Max(args ...any) (any, error) { - return minMaxFunc("max", runtime.Less, args) -} +func sum(args ...any) (any, error) { + var total int + var fTotal float64 + + for _, arg := range args { + rv := reflect.ValueOf(deref.Deref(arg)) -func Min(args ...any) (any, error) { - return minMaxFunc("min", runtime.More, args) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elemSum, err := sum(rv.Index(i).Interface()) + if err != nil { + return nil, err + } + switch elemSum := elemSum.(type) { + case int: + total += elemSum + case float64: + fTotal += elemSum + } + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + total += int(rv.Int()) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + total += int(rv.Uint()) + case reflect.Float32, reflect.Float64: + fTotal += rv.Float() + default: + return nil, fmt.Errorf("invalid argument for sum (type %T)", arg) + } + } + + if fTotal != 0.0 { + return fTotal + float64(total), nil + } + return total, nil } -func minMaxFunc(name string, fn func(any, any) bool, args []any) (any, error) { +func minMax(name string, fn func(any, any) bool, args ...any) (any, error) { var val any for _, arg := range args { - switch v := arg.(type) { - case []float32, []float64, []uint, []uint8, []uint16, []uint32, []uint64, []int, []int8, []int16, []int32, []int64: - rv := reflect.ValueOf(v) - if rv.Len() == 0 { - return nil, fmt.Errorf("not enough arguments to call %s", name) - } - arg = rv.Index(0).Interface() - for i := 1; i < rv.Len(); i++ { - elem := rv.Index(i).Interface() - if fn(arg, elem) { - arg = elem + rv := reflect.ValueOf(deref.Deref(arg)) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elemVal, err := minMax(name, fn, rv.Index(i).Interface()) + if err != nil { + return nil, err + } + switch elemVal.(type) { + case int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, + float32, float64: + if elemVal != nil && (val == nil || fn(val, elemVal)) { + val = elemVal + } + default: + return nil, fmt.Errorf("invalid argument for %s (type %T)", name, elemVal) } + } - case []any: - var err error - if arg, err = minMaxFunc(name, fn, v); err != nil { - return nil, err + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + elemVal := rv.Interface() + if val == nil || fn(val, elemVal) { + val = elemVal } - case float32, float64, uint, uint8, uint16, uint32, uint64, int, int8, int16, int32, int64: default: if len(args) == 1 { - return arg, nil + return args[0], nil } - return nil, fmt.Errorf("invalid argument for %s (type %T)", name, v) - } - if val == nil || fn(val, arg) { - val = arg + return nil, fmt.Errorf("invalid argument for %s (type %T)", name, arg) } } return val, nil } + +func mean(args ...any) (int, float64, error) { + var total float64 + var count int + + for _, arg := range args { + rv := reflect.ValueOf(deref.Deref(arg)) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elemCount, elemSum, err := mean(rv.Index(i).Interface()) + if err != nil { + return 0, 0, err + } + total += elemSum + count += elemCount + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + total += float64(rv.Int()) + count++ + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + total += float64(rv.Uint()) + count++ + case reflect.Float32, reflect.Float64: + total += rv.Float() + count++ + default: + return 0, 0, fmt.Errorf("invalid argument for mean (type %T)", arg) + } + } + return count, total, nil +} + +func median(args ...any) ([]float64, error) { + var values []float64 + + for _, arg := range args { + rv := reflect.ValueOf(deref.Deref(arg)) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elems, err := median(rv.Index(i).Interface()) + if err != nil { + return nil, err + } + values = append(values, elems...) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + values = append(values, float64(rv.Int())) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + values = append(values, float64(rv.Uint())) + case reflect.Float32, reflect.Float64: + values = append(values, rv.Float()) + default: + return nil, fmt.Errorf("invalid argument for median (type %T)", arg) + } + } + return values, nil +} diff --git a/builtin/validation.go b/builtin/validation.go new file mode 100644 index 000000000..057f247e9 --- /dev/null +++ b/builtin/validation.go @@ -0,0 +1,38 @@ +package builtin + +import ( + "fmt" + "reflect" + + "github.com/expr-lang/expr/internal/deref" +) + +func validateAggregateFunc(name string, args []reflect.Type) (reflect.Type, error) { + switch len(args) { + case 0: + return anyType, fmt.Errorf("not enough arguments to call %s", name) + default: + for _, arg := range args { + switch kind(deref.Type(arg)) { + case reflect.Interface, reflect.Array, reflect.Slice: + return anyType, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: + default: + return anyType, fmt.Errorf("invalid argument for %s (type %s)", name, arg) + } + } + return args[0], nil + } +} + +func validateRoundFunc(name string, args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: + return floatType, nil + default: + return anyType, fmt.Errorf("invalid argument for %s (type %s)", name, args[0]) + } +} From 85b178c3dfa2ded602d1319f13729f5c5041345a Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Mon, 4 Mar 2024 19:10:33 +0530 Subject: [PATCH 284/506] Fix `-1 not in []` expressions (#590) --- compiler/compiler_test.go | 33 +++++++++++++ expr_test.go | 8 +++ parser/operator/operator.go | 9 ++++ parser/parser.go | 99 ++++++++++++++++++++----------------- parser/parser_test.go | 61 +++++++++++++++++++++++ 5 files changed, 164 insertions(+), 46 deletions(-) diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 741142a77..fbd83ec86 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -541,6 +541,39 @@ func TestCompile_optimizes_jumps(t *testing.T) { {vm.OpFetch, 0}, }, }, + { + `-1 not in [1, 2, 5]`, + []op{ + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpIn, 0}, + {vm.OpNot, 0}, + }, + }, + { + `1 + 8 not in [1, 2, 5]`, + []op{ + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpIn, 0}, + {vm.OpNot, 0}, + }, + }, + { + `true ? false : 8 not in [1, 2, 5]`, + []op{ + {vm.OpTrue, 0}, + {vm.OpJumpIfFalse, 3}, + {vm.OpPop, 0}, + {vm.OpFalse, 0}, + {vm.OpJump, 5}, + {vm.OpPop, 0}, + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpIn, 0}, + {vm.OpNot, 0}, + }, + }, } for _, test := range tests { diff --git a/expr_test.go b/expr_test.go index 9d9d88af9..92343e22e 100644 --- a/expr_test.go +++ b/expr_test.go @@ -785,6 +785,10 @@ func TestExpr(t *testing.T) { `Two not in 0..1`, true, }, + { + `-1 not in [1]`, + true, + }, { `Int32 in [10, 20]`, false, @@ -797,6 +801,10 @@ func TestExpr(t *testing.T) { `String matches ("^" + String + "$")`, true, }, + { + `'foo' + 'bar' not matches 'foobar'`, + false, + }, { `"foobar" contains "bar"`, true, diff --git a/parser/operator/operator.go b/parser/operator/operator.go index 411a0e2bc..4eeaf80ed 100644 --- a/parser/operator/operator.go +++ b/parser/operator/operator.go @@ -20,6 +20,15 @@ func IsBoolean(op string) bool { return op == "and" || op == "or" || op == "&&" || op == "||" } +func AllowedNegateSuffix(op string) bool { + switch op { + case "contains", "matches", "startsWith", "endsWith", "in": + return true + default: + return false + } +} + var Unary = map[string]Operator{ "not": {50, Left}, "!": {50, Left}, diff --git a/parser/parser.go b/parser/parser.go index 9114bc0c9..9cb79cbbb 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -126,10 +126,8 @@ func (p *parser) expect(kind Kind, values ...string) { // parse functions func (p *parser) parseExpression(precedence int) Node { - if precedence == 0 { - if p.current.Is(Operator, "let") { - return p.parseVariableDeclaration() - } + if precedence == 0 && p.current.Is(Operator, "let") { + return p.parseVariableDeclaration() } nodeLeft := p.parsePrimary() @@ -137,62 +135,71 @@ func (p *parser) parseExpression(precedence int) Node { prevOperator := "" opToken := p.current for opToken.Is(Operator) && p.err == nil { - negate := false + negate := opToken.Is(Operator, "not") var notToken Token // Handle "not *" operator, like "not in" or "not contains". - if opToken.Is(Operator, "not") { + if negate { + currentPos := p.pos p.next() - notToken = p.current - negate = true - opToken = p.current + if operator.AllowedNegateSuffix(p.current.Value) { + if op, ok := operator.Binary[p.current.Value]; ok && op.Precedence >= precedence { + notToken = p.current + opToken = p.current + } else { + p.pos = currentPos + p.current = opToken + break + } + } else { + p.error("unexpected token %v", p.current) + break + } } - if op, ok := operator.Binary[opToken.Value]; ok { - if op.Precedence >= precedence { - p.next() + if op, ok := operator.Binary[opToken.Value]; ok && op.Precedence >= precedence { + p.next() - if opToken.Value == "|" { - identToken := p.current - p.expect(Identifier) - nodeLeft = p.parseCall(identToken, []Node{nodeLeft}, true) - goto next - } + if opToken.Value == "|" { + identToken := p.current + p.expect(Identifier) + nodeLeft = p.parseCall(identToken, []Node{nodeLeft}, true) + goto next + } - if prevOperator == "??" && opToken.Value != "??" && !opToken.Is(Bracket, "(") { - p.errorAt(opToken, "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses.", opToken.Value) - break - } + if prevOperator == "??" && opToken.Value != "??" && !opToken.Is(Bracket, "(") { + p.errorAt(opToken, "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses.", opToken.Value) + break + } - if operator.IsComparison(opToken.Value) { - nodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence) - goto next - } + if operator.IsComparison(opToken.Value) { + nodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence) + goto next + } - var nodeRight Node - if op.Associativity == operator.Left { - nodeRight = p.parseExpression(op.Precedence + 1) - } else { - nodeRight = p.parseExpression(op.Precedence) - } + var nodeRight Node + if op.Associativity == operator.Left { + nodeRight = p.parseExpression(op.Precedence + 1) + } else { + nodeRight = p.parseExpression(op.Precedence) + } - nodeLeft = &BinaryNode{ - Operator: opToken.Value, - Left: nodeLeft, - Right: nodeRight, - } - nodeLeft.SetLocation(opToken.Location) + nodeLeft = &BinaryNode{ + Operator: opToken.Value, + Left: nodeLeft, + Right: nodeRight, + } + nodeLeft.SetLocation(opToken.Location) - if negate { - nodeLeft = &UnaryNode{ - Operator: "not", - Node: nodeLeft, - } - nodeLeft.SetLocation(notToken.Location) + if negate { + nodeLeft = &UnaryNode{ + Operator: "not", + Node: nodeLeft, } - - goto next + nodeLeft.SetLocation(notToken.Location) } + + goto next } break diff --git a/parser/parser_test.go b/parser/parser_test.go index 9225e1028..2a30787a0 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -365,6 +365,62 @@ world`}, &UnaryNode{Operator: "not", Node: &IdentifierNode{Value: "in_var"}}, }, + { + "-1 not in [1, 2, 3, 4]", + &UnaryNode{Operator: "not", + Node: &BinaryNode{Operator: "in", + Left: &UnaryNode{Operator: "-", Node: &IntegerNode{Value: 1}}, + Right: &ArrayNode{Nodes: []Node{ + &IntegerNode{Value: 1}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 3}, + &IntegerNode{Value: 4}, + }}}}, + }, + { + "1*8 not in [1, 2, 3, 4]", + &UnaryNode{Operator: "not", + Node: &BinaryNode{Operator: "in", + Left: &BinaryNode{Operator: "*", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 8}, + }, + Right: &ArrayNode{Nodes: []Node{ + &IntegerNode{Value: 1}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 3}, + &IntegerNode{Value: 4}, + }}}}, + }, + { + "2==2 ? false : 3 not in [1, 2, 5]", + &ConditionalNode{ + Cond: &BinaryNode{ + Operator: "==", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 2}, + }, + Exp1: &BoolNode{Value: false}, + Exp2: &UnaryNode{ + Operator: "not", + Node: &BinaryNode{ + Operator: "in", + Left: &IntegerNode{Value: 3}, + Right: &ArrayNode{Nodes: []Node{ + &IntegerNode{Value: 1}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 5}, + }}}}}, + }, + { + "'foo' + 'bar' not matches 'foobar'", + &UnaryNode{Operator: "not", + Node: &BinaryNode{Operator: "matches", + Left: &BinaryNode{Operator: "+", + Left: &StringNode{Value: "foo"}, + Right: &StringNode{Value: "bar"}}, + Right: &StringNode{Value: "foobar"}}}, + }, { "all(Tickets, #)", &BuiltinNode{ @@ -706,6 +762,11 @@ invalid float literal: strconv.ParseFloat: parsing "0o1E+1": invalid syntax (1:6 invalid float literal: strconv.ParseFloat: parsing "1E": invalid syntax (1:2) | 1E | .^ + +1 not == [1, 2, 5] +unexpected token Operator("==") (1:7) + | 1 not == [1, 2, 5] + | ......^ ` func TestParse_error(t *testing.T) { From ef57900b163f64429fa82a542fe5662e3b41ef1e Mon Sep 17 00:00:00 2001 From: bizy Date: Tue, 5 Mar 2024 01:11:10 +0700 Subject: [PATCH 285/506] Add bench and tests for `runtime.Equal` --- vm/runtime/helpers_test.go | 57 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 vm/runtime/helpers_test.go diff --git a/vm/runtime/helpers_test.go b/vm/runtime/helpers_test.go new file mode 100644 index 000000000..42a0aece0 --- /dev/null +++ b/vm/runtime/helpers_test.go @@ -0,0 +1,57 @@ +package runtime_test + +import ( + "testing" + + "github.com/expr-lang/expr/vm/runtime" + "github.com/stretchr/testify/assert" +) + +var tests = []struct { + name string + a, b any + want bool +}{ + {"int == int", 42, 42, true}, + {"int != int", 42, 33, false}, + {"int == int8", 42, int8(42), true}, + {"int == int16", 42, int16(42), true}, + {"int == int32", 42, int32(42), true}, + {"int == int64", 42, int64(42), true}, + {"float == float", 42.0, 42.0, true}, + {"float != float", 42.0, 33.0, false}, + {"float == int", 42.0, 42, true}, + {"float != int", 42.0, 33, false}, + {"string == string", "foo", "foo", true}, + {"string != string", "foo", "bar", false}, + {"bool == bool", true, true, true}, + {"bool != bool", true, false, false}, + {"[]any == []int", []any{1, 2, 3}, []int{1, 2, 3}, true}, + {"[]any != []int", []any{1, 2, 3}, []int{1, 2, 99}, false}, + {"deep []any == []any", []any{[]int{1}, 2, []any{"3"}}, []any{[]any{1}, 2, []string{"3"}}, true}, + {"deep []any != []any", []any{[]int{1}, 2, []any{"3", "42"}}, []any{[]any{1}, 2, []string{"3"}}, false}, + {"map[string]any == map[string]any", map[string]any{"a": 1}, map[string]any{"a": 1}, true}, + {"map[string]any != map[string]any", map[string]any{"a": 1}, map[string]any{"a": 1, "b": 2}, false}, +} + +func TestEqual(t *testing.T) { + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := runtime.Equal(tt.a, tt.b) + assert.Equal(t, tt.want, got, "Equal(%v, %v) = %v; want %v", tt.a, tt.b, got, tt.want) + got = runtime.Equal(tt.b, tt.a) + assert.Equal(t, tt.want, got, "Equal(%v, %v) = %v; want %v", tt.b, tt.a, got, tt.want) + }) + } + +} + +func BenchmarkEqual(b *testing.B) { + for _, tt := range tests { + b.Run(tt.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + runtime.Equal(tt.a, tt.b) + } + }) + } +} From cfe9787745e1aed0d3967047389e5d8462eba450 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 17 Mar 2024 14:51:53 +0700 Subject: [PATCH 286/506] `expr.Operator` passes before `expr.Env` caused error (#606) --- checker/checker_test.go | 2 +- conf/config.go | 6 +++++- expr_test.go | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/checker/checker_test.go b/checker/checker_test.go index d6a84abc5..29c50807e 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -632,7 +632,7 @@ func TestCheck_TaggedFieldName(t *testing.T) { tree, err := parser.Parse(`foo.bar`) require.NoError(t, err) - config := &conf.Config{} + config := conf.CreateNew() expr.Env(struct { x struct { y bool `expr:"bar"` diff --git a/conf/config.go b/conf/config.go index 799898109..01a407a10 100644 --- a/conf/config.go +++ b/conf/config.go @@ -32,6 +32,7 @@ type Config struct { func CreateNew() *Config { c := &Config{ Optimize: true, + Types: make(TypesTable), ConstFns: make(map[string]reflect.Value), Functions: make(map[string]*builtin.Function), Builtins: make(map[string]*builtin.Function), @@ -62,7 +63,10 @@ func (c *Config) WithEnv(env any) { } c.Env = env - c.Types = CreateTypesTable(env) + types := CreateTypesTable(env) + for name, t := range types { + c.Types[name] = t + } c.MapEnv = mapEnv c.DefaultType = mapValueType c.Strict = true diff --git a/expr_test.go b/expr_test.go index 92343e22e..5128ea51d 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2510,3 +2510,17 @@ func TestRaceCondition_variables(t *testing.T) { wg.Wait() } + +func TestOperatorDependsOnEnv(t *testing.T) { + env := map[string]any{ + "plus": func(a, b int) int { + return 42 + }, + } + program, err := expr.Compile(`1 + 2`, expr.Operator("+", "plus"), expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, 42, out) +} From 3452f5be95fd5845fa45c77b8ebaaee6a3e6b586 Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 21 Mar 2024 02:06:04 +0700 Subject: [PATCH 287/506] builtin `int` unwraps underlying int value (#611) --- builtin/builtin_test.go | 14 ++++++++++++++ builtin/lib.go | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index aa324c9be..7f5045f41 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -612,3 +612,17 @@ func TestBuiltin_bitOpsFunc(t *testing.T) { }) } } + +type customInt int + +func Test_int_unwraps_underlying_value(t *testing.T) { + env := map[string]any{ + "customInt": customInt(42), + } + program, err := expr.Compile(`int(customInt) == 42`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, true, out) +} diff --git a/builtin/lib.go b/builtin/lib.go index 9ff9478aa..e3a6c0aef 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -209,6 +209,10 @@ func Int(x any) any { } return i default: + val := reflect.ValueOf(x) + if val.CanConvert(integerType) { + return val.Convert(integerType).Interface() + } panic(fmt.Sprintf("invalid operation: int(%T)", x)) } } From d5231073da6742e42f5c026eb49c0d493da1274c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 27 Mar 2024 09:26:56 +0100 Subject: [PATCH 288/506] Better map ast printing --- ast/print.go | 8 +++++++- ast/print_test.go | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ast/print.go b/ast/print.go index fa593ae28..063e9eb27 100644 --- a/ast/print.go +++ b/ast/print.go @@ -202,5 +202,11 @@ func (n *MapNode) String() string { } func (n *PairNode) String() string { - return fmt.Sprintf("%s: %s", n.Key.String(), n.Value.String()) + if str, ok := n.Key.(*StringNode); ok { + if utils.IsValidIdentifier(str.Value) { + return fmt.Sprintf("%s: %s", str.Value, n.Value.String()) + } + return fmt.Sprintf("%q: %s", str.String(), n.Value.String()) + } + return fmt.Sprintf("(%s): %s", n.Key.String(), n.Value.String()) } diff --git a/ast/print_test.go b/ast/print_test.go index 16d64357b..d9e55c2ea 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -55,8 +55,8 @@ func TestPrint(t *testing.T) { {`func(a)`, `func(a)`}, {`func(a, b)`, `func(a, b)`}, {`{}`, `{}`}, - {`{a: b}`, `{"a": b}`}, - {`{a: b, c: d}`, `{"a": b, "c": d}`}, + {`{a: b}`, `{a: b}`}, + {`{a: b, c: d}`, `{a: b, c: d}`}, {`[]`, `[]`}, {`[a]`, `[a]`}, {`[a, b]`, `[a, b]`}, @@ -71,6 +71,7 @@ func TestPrint(t *testing.T) { {`a[1:]`, `a[1:]`}, {`a[:]`, `a[:]`}, {`(nil ?? 1) > 0`, `(nil ?? 1) > 0`}, + {`{("a" + "b"): 42}`, `{("a" + "b"): 42}`}, } for _, tt := range tests { From 7772ea0fee5c9b153439a0ad5ee2e2b1a764f453 Mon Sep 17 00:00:00 2001 From: zhuliquan Date: Thu, 28 Mar 2024 21:37:51 +0800 Subject: [PATCH 289/506] feat: extract code for compiling equal operator (#614) --- compiler/compiler.go | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 808b53c9b..a38d977d5 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -395,34 +395,12 @@ func (c *compiler) UnaryNode(node *ast.UnaryNode) { } func (c *compiler) BinaryNode(node *ast.BinaryNode) { - l := kind(node.Left) - r := kind(node.Right) - - leftIsSimple := isSimpleType(node.Left) - rightIsSimple := isSimpleType(node.Right) - leftAndRightAreSimple := leftIsSimple && rightIsSimple - switch node.Operator { case "==": - c.compile(node.Left) - c.derefInNeeded(node.Left) - c.compile(node.Right) - c.derefInNeeded(node.Right) - - if l == r && l == reflect.Int && leftAndRightAreSimple { - c.emit(OpEqualInt) - } else if l == r && l == reflect.String && leftAndRightAreSimple { - c.emit(OpEqualString) - } else { - c.emit(OpEqual) - } + c.equalBinaryNode(node) case "!=": - c.compile(node.Left) - c.derefInNeeded(node.Left) - c.compile(node.Right) - c.derefInNeeded(node.Right) - c.emit(OpEqual) + c.equalBinaryNode(node) c.emit(OpNot) case "or", "||": @@ -580,6 +558,28 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { } } +func (c *compiler) equalBinaryNode(node *ast.BinaryNode) { + l := kind(node.Left) + r := kind(node.Right) + + leftIsSimple := isSimpleType(node.Left) + rightIsSimple := isSimpleType(node.Right) + leftAndRightAreSimple := leftIsSimple && rightIsSimple + + c.compile(node.Left) + c.derefInNeeded(node.Left) + c.compile(node.Right) + c.derefInNeeded(node.Right) + + if l == r && l == reflect.Int && leftAndRightAreSimple { + c.emit(OpEqualInt) + } else if l == r && l == reflect.String && leftAndRightAreSimple { + c.emit(OpEqualString) + } else { + c.emit(OpEqual) + } +} + func isSimpleType(node ast.Node) bool { if node == nil { return false From 852d47f3ecc7802acb7fbe1fc91a56b26df30999 Mon Sep 17 00:00:00 2001 From: Richard Wooding Date: Mon, 8 Apr 2024 09:00:54 +0200 Subject: [PATCH 290/506] Update README.md (#619) Add SPAN Digital as an user of expr --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bd34c7d24..1475fe2f5 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ func main() { * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. * [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling. +* [SPAN Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products [Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) From 0b2a08654939f5529f9186d8893307aa0c3d1178 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 9 Apr 2024 09:47:41 +0200 Subject: [PATCH 291/506] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1475fe2f5..1a2d7dc83 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ func main() { * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. * [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling. -* [SPAN Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products +* [Span Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products. [Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) From d9b1093c6e483aabd3194bfed9d4816656e3872b Mon Sep 17 00:00:00 2001 From: needsure <166317845+needsure@users.noreply.github.com> Date: Tue, 9 Apr 2024 19:13:55 +0800 Subject: [PATCH 292/506] chore: fix some typos in conments (#622) Signed-off-by: needsure --- patcher/value/value.go | 4 ++-- test/operator/operator_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/patcher/value/value.go b/patcher/value/value.go index 59351be6b..28f52be27 100644 --- a/patcher/value/value.go +++ b/patcher/value/value.go @@ -13,9 +13,9 @@ import ( // ValueGetter is a Patcher that allows custom types to be represented as standard go values for use with expr. // It also adds the `$patcher_value_getter` function to the program for efficiently calling matching interfaces. // -// The purpose of this Patcher is to make it seemless to use custom types in expressions without the need to +// The purpose of this Patcher is to make it seamless to use custom types in expressions without the need to // first convert them to standard go values. It may also facilitate using already existing structs or maps as -// environments when they contain compatabile types. +// environments when they contain compatible types. // // An example usage may be modeling a database record with columns that have varying data types and constraints. // In such an example you may have custom types that, beyond storing a simple value, such as an integer, may diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index a19c191dc..b49d91cc6 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -77,7 +77,7 @@ func TestOperator_Function(t *testing.T) { } for _, tt := range tests { - t.Run(fmt.Sprintf(`opertor function helper test %s`, tt.input), func(t *testing.T) { + t.Run(fmt.Sprintf(`operator function helper test %s`, tt.input), func(t *testing.T) { program, err := expr.Compile( tt.input, expr.Env(env), From e7e72b9a06044715e23f9ae9175b5141fff178bc Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 10 Apr 2024 10:58:17 +0200 Subject: [PATCH 293/506] Revert "Optimize boolean operations between all, any, one, none functions (#555)" (#625) This reverts commit 3c03e5965172519f7bc12100db6607d6a9fae031. --- optimizer/optimizer.go | 1 - optimizer/optimizer_test.go | 122 ----------------------------- optimizer/predicate_combination.go | 51 ------------ 3 files changed, 174 deletions(-) delete mode 100644 optimizer/predicate_combination.go diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index 6d1fb0b54..a9c0fa3d3 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -36,6 +36,5 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLen{}) Walk(node, &filterLast{}) Walk(node, &filterFirst{}) - Walk(node, &predicateCombination{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 703bd1ceb..e45de763b 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -1,7 +1,6 @@ package optimizer_test import ( - "fmt" "reflect" "strings" "testing" @@ -340,124 +339,3 @@ func TestOptimize_filter_map_first(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } - -func TestOptimize_predicate_combination(t *testing.T) { - tests := []struct { - op string - fn string - wantOp string - }{ - {"and", "all", "and"}, - {"&&", "all", "&&"}, - {"or", "all", "or"}, - {"||", "all", "||"}, - {"and", "any", "and"}, - {"&&", "any", "&&"}, - {"or", "any", "or"}, - {"||", "any", "||"}, - {"and", "none", "or"}, - {"&&", "none", "||"}, - {"and", "one", "or"}, - {"&&", "one", "||"}, - } - - for _, tt := range tests { - rule := fmt.Sprintf(`%s(users, .Age > 18 and .Name != "Bob") %s %s(users, .Age < 30)`, tt.fn, tt.op, tt.fn) - t.Run(rule, func(t *testing.T) { - tree, err := parser.Parse(rule) - require.NoError(t, err) - - err = optimizer.Optimize(&tree.Node, nil) - require.NoError(t, err) - - expected := &ast.BuiltinNode{ - Name: tt.fn, - Arguments: []ast.Node{ - &ast.IdentifierNode{Value: "users"}, - &ast.ClosureNode{ - Node: &ast.BinaryNode{ - Operator: tt.wantOp, - Left: &ast.BinaryNode{ - Operator: "and", - Left: &ast.BinaryNode{ - Operator: ">", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Age"}, - }, - Right: &ast.IntegerNode{Value: 18}, - }, - Right: &ast.BinaryNode{ - Operator: "!=", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Name"}, - }, - Right: &ast.StringNode{Value: "Bob"}, - }, - }, - Right: &ast.BinaryNode{ - Operator: "<", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Age"}, - }, - Right: &ast.IntegerNode{Value: 30}, - }, - }, - }, - }, - } - assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) - }) - } -} - -func TestOptimize_predicate_combination_nested(t *testing.T) { - tree, err := parser.Parse(`any(users, {all(.Friends, {.Age == 18 })}) && any(users, {all(.Friends, {.Name != "Bob" })})`) - require.NoError(t, err) - - err = optimizer.Optimize(&tree.Node, nil) - require.NoError(t, err) - - expected := &ast.BuiltinNode{ - Name: "any", - Arguments: []ast.Node{ - &ast.IdentifierNode{Value: "users"}, - &ast.ClosureNode{ - Node: &ast.BuiltinNode{ - Name: "all", - Arguments: []ast.Node{ - &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Friends"}, - }, - &ast.ClosureNode{ - Node: &ast.BinaryNode{ - Operator: "&&", - Left: &ast.BinaryNode{ - Operator: "==", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Age"}, - }, - Right: &ast.IntegerNode{Value: 18}, - }, - Right: &ast.BinaryNode{ - Operator: "!=", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Name"}, - }, - Right: &ast.StringNode{Value: "Bob"}, - }, - }, - }, - }, - }, - }, - }, - } - - assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) -} diff --git a/optimizer/predicate_combination.go b/optimizer/predicate_combination.go deleted file mode 100644 index 2733781df..000000000 --- a/optimizer/predicate_combination.go +++ /dev/null @@ -1,51 +0,0 @@ -package optimizer - -import ( - . "github.com/expr-lang/expr/ast" - "github.com/expr-lang/expr/parser/operator" -) - -type predicateCombination struct{} - -func (v *predicateCombination) Visit(node *Node) { - if op, ok := (*node).(*BinaryNode); ok && operator.IsBoolean(op.Operator) { - if left, ok := op.Left.(*BuiltinNode); ok { - if combinedOp, ok := combinedOperator(left.Name, op.Operator); ok { - if right, ok := op.Right.(*BuiltinNode); ok && right.Name == left.Name { - if left.Arguments[0].Type() == right.Arguments[0].Type() && left.Arguments[0].String() == right.Arguments[0].String() { - closure := &ClosureNode{ - Node: &BinaryNode{ - Operator: combinedOp, - Left: left.Arguments[1].(*ClosureNode).Node, - Right: right.Arguments[1].(*ClosureNode).Node, - }, - } - v.Visit(&closure.Node) - Patch(node, &BuiltinNode{ - Name: left.Name, - Arguments: []Node{ - left.Arguments[0], - closure, - }, - }) - } - } - } - } - } -} - -func combinedOperator(fn, op string) (string, bool) { - switch fn { - case "all", "any": - return op, true - case "one", "none": - switch op { - case "and": - return "or", true - case "&&": - return "||", true - } - } - return "", false -} From 2aee5239cd553541258fba3b0785b2ede585aede Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 12 Apr 2024 23:49:41 +0700 Subject: [PATCH 294/506] Optimize boolean operations between all, any, none functions (#626) --- expr_test.go | 189 +++++++++++++++++++++++++++++ optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 116 ++++++++++++++++++ optimizer/predicate_combination.go | 61 ++++++++++ 4 files changed, 367 insertions(+) create mode 100644 optimizer/predicate_combination.go diff --git a/expr_test.go b/expr_test.go index 5128ea51d..db2541306 100644 --- a/expr_test.go +++ b/expr_test.go @@ -901,18 +901,147 @@ func TestExpr(t *testing.T) { `all(1..3, {# > 0})`, true, }, + { + `all(1..3, {# > 0}) && all(1..3, {# < 4})`, + true, + }, + { + `all(1..3, {# > 2}) && all(1..3, {# < 4})`, + false, + }, + { + `all(1..3, {# > 0}) && all(1..3, {# < 2})`, + false, + }, + { + `all(1..3, {# > 2}) && all(1..3, {# < 2})`, + false, + }, + { + `all(1..3, {# > 0}) || all(1..3, {# < 4})`, + true, + }, + { + `all(1..3, {# > 0}) || all(1..3, {# != 2})`, + true, + }, + { + `all(1..3, {# != 3}) || all(1..3, {# < 4})`, + true, + }, + { + `all(1..3, {# != 3}) || all(1..3, {# != 2})`, + false, + }, { `none(1..3, {# == 0})`, true, }, + { + `none(1..3, {# == 0}) && none(1..3, {# == 4})`, + true, + }, + { + `none(1..3, {# == 0}) && none(1..3, {# == 3})`, + false, + }, + { + `none(1..3, {# == 1}) && none(1..3, {# == 4})`, + false, + }, + { + `none(1..3, {# == 1}) && none(1..3, {# == 3})`, + false, + }, + { + `none(1..3, {# == 0}) || none(1..3, {# == 4})`, + true, + }, + { + `none(1..3, {# == 0}) || none(1..3, {# == 3})`, + true, + }, + { + `none(1..3, {# == 1}) || none(1..3, {# == 4})`, + true, + }, + { + `none(1..3, {# == 1}) || none(1..3, {# == 3})`, + false, + }, { `any([1,1,0,1], {# == 0})`, true, }, + { + `any(1..3, {# == 1}) && any(1..3, {# == 2})`, + true, + }, + { + `any(1..3, {# == 0}) && any(1..3, {# == 2})`, + false, + }, + { + `any(1..3, {# == 1}) && any(1..3, {# == 4})`, + false, + }, + { + `any(1..3, {# == 0}) && any(1..3, {# == 4})`, + false, + }, + { + `any(1..3, {# == 1}) || any(1..3, {# == 2})`, + true, + }, + { + `any(1..3, {# == 0}) || any(1..3, {# == 2})`, + true, + }, + { + `any(1..3, {# == 1}) || any(1..3, {# == 4})`, + true, + }, + { + `any(1..3, {# == 0}) || any(1..3, {# == 4})`, + false, + }, { `one([1,1,0,1], {# == 0}) and not one([1,0,0,1], {# == 0})`, true, }, + { + `one(1..3, {# == 1}) and one(1..3, {# == 2})`, + true, + }, + { + `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2})`, + false, + }, + { + `one(1..3, {# == 1}) and one(1..3, {# == 2 || # == 3})`, + false, + }, + { + `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2 || # == 3})`, + false, + }, + { + `one(1..3, {# == 1}) or one(1..3, {# == 2})`, + true, + }, + { + `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2})`, + true, + }, + { + `one(1..3, {# == 1}) or one(1..3, {# == 2 || # == 3})`, + true, + }, + { + `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2 || # == 3})`, + false, + }, + { `count(1..30, {# % 3 == 0})`, 10, @@ -2524,3 +2653,63 @@ func TestOperatorDependsOnEnv(t *testing.T) { require.NoError(t, err) assert.Equal(t, 42, out) } + +func TestIssue624(t *testing.T) { + type tag struct { + Name string + } + + type item struct { + Tags []tag + } + + i := item{ + Tags: []tag{ + {Name: "one"}, + {Name: "two"}, + }, + } + + rule := `[ +true && true, +one(Tags, .Name in ["one"]), +one(Tags, .Name in ["two"]), +one(Tags, .Name in ["one"]) && one(Tags, .Name in ["two"]) +]` + resp, err := expr.Eval(rule, i) + require.NoError(t, err) + require.Equal(t, []interface{}{true, true, true, true}, resp) +} + +func TestPredicateCombination(t *testing.T) { + tests := []struct { + code1 string + code2 string + }{ + {"all(1..3, {# > 0}) && all(1..3, {# < 4})", "all(1..3, {# > 0 && # < 4})"}, + {"all(1..3, {# > 1}) && all(1..3, {# < 4})", "all(1..3, {# > 1 && # < 4})"}, + {"all(1..3, {# > 0}) && all(1..3, {# < 2})", "all(1..3, {# > 0 && # < 2})"}, + {"all(1..3, {# > 1}) && all(1..3, {# < 2})", "all(1..3, {# > 1 && # < 2})"}, + + {"any(1..3, {# > 0}) || any(1..3, {# < 4})", "any(1..3, {# > 0 || # < 4})"}, + {"any(1..3, {# > 1}) || any(1..3, {# < 4})", "any(1..3, {# > 1 || # < 4})"}, + {"any(1..3, {# > 0}) || any(1..3, {# < 2})", "any(1..3, {# > 0 || # < 2})"}, + {"any(1..3, {# > 1}) || any(1..3, {# < 2})", "any(1..3, {# > 1 || # < 2})"}, + + {"none(1..3, {# > 0}) && none(1..3, {# < 4})", "none(1..3, {# > 0 || # < 4})"}, + {"none(1..3, {# > 1}) && none(1..3, {# < 4})", "none(1..3, {# > 1 || # < 4})"}, + {"none(1..3, {# > 0}) && none(1..3, {# < 2})", "none(1..3, {# > 0 || # < 2})"}, + {"none(1..3, {# > 1}) && none(1..3, {# < 2})", "none(1..3, {# > 1 || # < 2})"}, + } + for _, tt := range tests { + t.Run(tt.code1, func(t *testing.T) { + out1, err := expr.Eval(tt.code1, nil) + require.NoError(t, err) + + out2, err := expr.Eval(tt.code2, nil) + require.NoError(t, err) + + require.Equal(t, out1, out2) + }) + } +} diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index a9c0fa3d3..6d1fb0b54 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -36,5 +36,6 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLen{}) Walk(node, &filterLast{}) Walk(node, &filterFirst{}) + Walk(node, &predicateCombination{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index e45de763b..316b17182 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -1,6 +1,7 @@ package optimizer_test import ( + "fmt" "reflect" "strings" "testing" @@ -339,3 +340,118 @@ func TestOptimize_filter_map_first(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_predicate_combination(t *testing.T) { + tests := []struct { + op string + fn string + wantOp string + }{ + {"and", "all", "and"}, + {"&&", "all", "&&"}, + {"or", "any", "or"}, + {"||", "any", "||"}, + {"and", "none", "or"}, + {"&&", "none", "||"}, + } + + for _, tt := range tests { + rule := fmt.Sprintf(`%s(users, .Age > 18 and .Name != "Bob") %s %s(users, .Age < 30)`, tt.fn, tt.op, tt.fn) + t.Run(rule, func(t *testing.T) { + tree, err := parser.Parse(rule) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: tt.fn, + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: tt.wantOp, + Left: &ast.BinaryNode{ + Operator: "and", + Left: &ast.BinaryNode{ + Operator: ">", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 18}, + }, + Right: &ast.BinaryNode{ + Operator: "!=", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + Right: &ast.BinaryNode{ + Operator: "<", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 30}, + }, + }, + }, + }, + } + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) + }) + } +} + +func TestOptimize_predicate_combination_nested(t *testing.T) { + tree, err := parser.Parse(`all(users, {all(.Friends, {.Age == 18 })}) && all(users, {all(.Friends, {.Name != "Bob" })})`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "all", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BuiltinNode{ + Name: "all", + Arguments: []ast.Node{ + &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Friends"}, + }, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "&&", + Left: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 18}, + }, + Right: &ast.BinaryNode{ + Operator: "!=", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + }, + }, + }, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} diff --git a/optimizer/predicate_combination.go b/optimizer/predicate_combination.go new file mode 100644 index 000000000..6e8a7f7cf --- /dev/null +++ b/optimizer/predicate_combination.go @@ -0,0 +1,61 @@ +package optimizer + +import ( + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser/operator" +) + +/* +predicateCombination is a visitor that combines multiple predicate calls into a single call. +For example, the following expression: + + all(x, x > 1) && all(x, x < 10) -> all(x, x > 1 && x < 10) + any(x, x > 1) || any(x, x < 10) -> any(x, x > 1 || x < 10) + none(x, x > 1) && none(x, x < 10) -> none(x, x > 1 || x < 10) +*/ +type predicateCombination struct{} + +func (v *predicateCombination) Visit(node *Node) { + if op, ok := (*node).(*BinaryNode); ok && operator.IsBoolean(op.Operator) { + if left, ok := op.Left.(*BuiltinNode); ok { + if combinedOp, ok := combinedOperator(left.Name, op.Operator); ok { + if right, ok := op.Right.(*BuiltinNode); ok && right.Name == left.Name { + if left.Arguments[0].Type() == right.Arguments[0].Type() && left.Arguments[0].String() == right.Arguments[0].String() { + closure := &ClosureNode{ + Node: &BinaryNode{ + Operator: combinedOp, + Left: left.Arguments[1].(*ClosureNode).Node, + Right: right.Arguments[1].(*ClosureNode).Node, + }, + } + v.Visit(&closure.Node) + Patch(node, &BuiltinNode{ + Name: left.Name, + Arguments: []Node{ + left.Arguments[0], + closure, + }, + }) + } + } + } + } + } +} + +func combinedOperator(fn, op string) (string, bool) { + switch { + case fn == "all" && (op == "and" || op == "&&"): + return op, true + case fn == "any" && (op == "or" || op == "||"): + return op, true + case fn == "none" && (op == "and" || op == "&&"): + switch op { + case "and": + return "or", true + case "&&": + return "||", true + } + } + return "", false +} From c0ad2d4f82606e5bebe18cc8c99c27d501fdf0ea Mon Sep 17 00:00:00 2001 From: Daenney Date: Fri, 12 Apr 2024 22:54:01 +0200 Subject: [PATCH 295/506] Make WithContext work for methods on env struct (#602) This makes the WithContext patcher work when passing in a struct for an env that has methods that take a context. This is a bit fiddly because we can't quite detect the difference of function vs. method on a struct, so we have to check both the first and the second param. Since it's highly unusual to pass the context as anything other than the first parameter, this should work out just fine in practice. Fixes #600. --- patcher/with_context.go | 15 +++++++++++---- patcher/with_context_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/patcher/with_context.go b/patcher/with_context.go index 55b604261..f9861a2c2 100644 --- a/patcher/with_context.go +++ b/patcher/with_context.go @@ -22,11 +22,18 @@ func (w WithContext) Visit(node *ast.Node) { if fn.Kind() != reflect.Func { return } - if fn.NumIn() == 0 { - return - } - if fn.In(0).String() != "context.Context" { + switch fn.NumIn() { + case 0: return + case 1: + if fn.In(0).String() != "context.Context" { + return + } + default: + if fn.In(0).String() != "context.Context" && + fn.In(1).String() != "context.Context" { + return + } } ast.Patch(node, &ast.CallNode{ Callee: call.Callee, diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index afad4e6f0..5ce64191f 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -62,6 +62,30 @@ func TestWithContext_with_env_Function(t *testing.T) { require.Equal(t, 42, output) } +type testEnvContext struct { + Context context.Context `expr:"ctx"` +} + +func (testEnvContext) Fn(ctx context.Context, a int) int { + return ctx.Value("value").(int) + a +} + +func TestWithContext_env_struct(t *testing.T) { + withContext := patcher.WithContext{Name: "ctx"} + + program, err := expr.Compile(`Fn(40)`, expr.Env(testEnvContext{}), expr.Patch(withContext)) + require.NoError(t, err) + + ctx := context.WithValue(context.Background(), "value", 2) + env := testEnvContext{ + Context: ctx, + } + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 42, output) +} + type TestFoo struct { contextValue int } From eb8fb13de1f73785d40d97b1dab8be2f7063b7ff Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 27 Feb 2024 20:23:49 +0700 Subject: [PATCH 296/506] Support chzained comparisonc`1 < 2 < 3` (#581) --- expr_test.go | 20 +++++++++++++ parser/operator/operator.go | 4 +++ parser/parser.go | 36 ++++++++++++++++++++++ parser/parser_test.go | 60 +++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+) diff --git a/expr_test.go b/expr_test.go index ea9213be2..a4321c575 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1253,6 +1253,26 @@ func TestExpr(t *testing.T) { `[nil, 3, 4]?.[0]?.[1]`, nil, }, + { + `1 > 2 < 3`, + false, + }, + { + `1 < 2 < 3`, + true, + }, + { + `1 < 2 < 3 > 4`, + false, + }, + { + `1 < 2 < 3 > 2`, + true, + }, + { + `1 < 2 < 3 == true`, + true, + }, } for _, tt := range tests { diff --git a/parser/operator/operator.go b/parser/operator/operator.go index 8d804c7b3..411a0e2bc 100644 --- a/parser/operator/operator.go +++ b/parser/operator/operator.go @@ -54,3 +54,7 @@ var Binary = map[string]Operator{ "^": {100, Right}, "??": {500, Left}, } + +func IsComparison(op string) bool { + return op == "<" || op == ">" || op == ">=" || op == "<=" +} diff --git a/parser/parser.go b/parser/parser.go index 1eabdebe2..9114bc0c9 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -164,6 +164,11 @@ func (p *parser) parseExpression(precedence int) Node { break } + if operator.IsComparison(opToken.Value) { + nodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence) + goto next + } + var nodeRight Node if op.Associativity == operator.Left { nodeRight = p.parseExpression(op.Precedence + 1) @@ -685,3 +690,34 @@ func (p *parser) parsePostfixExpression(node Node) Node { } return node } + +func (p *parser) parseComparison(left Node, token Token, precedence int) Node { + var rootNode Node + for { + comparator := p.parseExpression(precedence + 1) + cmpNode := &BinaryNode{ + Operator: token.Value, + Left: left, + Right: comparator, + } + cmpNode.SetLocation(token.Location) + if rootNode == nil { + rootNode = cmpNode + } else { + rootNode = &BinaryNode{ + Operator: "&&", + Left: rootNode, + Right: cmpNode, + } + rootNode.SetLocation(token.Location) + } + + left = comparator + token = p.current + if !(token.Is(Operator) && operator.IsComparison(token.Value) && p.err == nil) { + break + } + p.next() + } + return rootNode +} diff --git a/parser/parser_test.go b/parser/parser_test.go index b633bd52e..9225e1028 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -531,6 +531,66 @@ world`}, To: &IntegerNode{Value: 3}, }, }, + { + `1 < 2 > 3`, + &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 2}, + }, + Right: &BinaryNode{ + Operator: ">", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 3}, + }, + }, + }, + { + `1 < 2 < 3 < 4`, + &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 2}, + }, + Right: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 3}, + }, + }, + Right: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 3}, + Right: &IntegerNode{Value: 4}, + }, + }, + }, + { + `1 < 2 < 3 == true`, + &BinaryNode{ + Operator: "==", + Left: &BinaryNode{ + Operator: "&&", + Left: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 2}, + }, + Right: &BinaryNode{ + Operator: "<", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 3}, + }, + }, + Right: &BoolNode{Value: true}, + }, + }, } for _, test := range tests { t.Run(test.input, func(t *testing.T) { From 355fb28bafa40cbf11ea3cee95bb102c1a8ac64d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Thu, 29 Feb 2024 20:51:34 +0100 Subject: [PATCH 297/506] Add spans --- compiler/compiler.go | 29 +++++++++++++++++++++++++++++ conf/config.go | 1 + vm/opcodes.go | 2 ++ vm/program.go | 9 +++++++++ vm/utils.go | 13 +++++++++++++ vm/vm.go | 9 +++++++++ 6 files changed, 63 insertions(+) diff --git a/compiler/compiler.go b/compiler/compiler.go index a4f189e6b..808b53c9b 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -50,6 +50,11 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro } } + var span *Span + if len(c.spans) > 0 { + span = c.spans[0] + } + program = NewProgram( tree.Source, tree.Node, @@ -60,6 +65,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro c.arguments, c.functions, c.debugInfo, + span, ) return } @@ -76,6 +82,7 @@ type compiler struct { functionsIndex map[string]int debugInfo map[string]string nodes []ast.Node + spans []*Span chains [][]int arguments []int } @@ -193,6 +200,28 @@ func (c *compiler) compile(node ast.Node) { c.nodes = c.nodes[:len(c.nodes)-1] }() + if c.config != nil && c.config.Profile { + span := &Span{ + Name: reflect.TypeOf(node).String(), + Expression: node.String(), + } + if len(c.spans) > 0 { + prev := c.spans[len(c.spans)-1] + prev.Children = append(prev.Children, span) + } + c.spans = append(c.spans, span) + defer func() { + if len(c.spans) > 1 { + c.spans = c.spans[:len(c.spans)-1] + } + }() + + c.emit(OpProfileStart, c.addConstant(span)) + defer func() { + c.emit(OpProfileEnd, c.addConstant(span)) + }() + } + switch n := node.(type) { case *ast.NilNode: c.NilNode(n) diff --git a/conf/config.go b/conf/config.go index e543732ce..799898109 100644 --- a/conf/config.go +++ b/conf/config.go @@ -20,6 +20,7 @@ type Config struct { ExpectAny bool Optimize bool Strict bool + Profile bool ConstFns map[string]reflect.Value Visitors []ast.Visitor Functions FunctionsTable diff --git a/vm/opcodes.go b/vm/opcodes.go index 0417dab61..84d751d6b 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -81,6 +81,8 @@ const ( OpGroupBy OpSortBy OpSort + OpProfileStart + OpProfileEnd OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index 4a878267b..989546744 100644 --- a/vm/program.go +++ b/vm/program.go @@ -27,6 +27,7 @@ type Program struct { variables int functions []Function debugInfo map[string]string + span *Span } // NewProgram returns a new Program. It's used by the compiler. @@ -40,6 +41,7 @@ func NewProgram( arguments []int, functions []Function, debugInfo map[string]string, + span *Span, ) *Program { return &Program{ source: source, @@ -51,6 +53,7 @@ func NewProgram( Arguments: arguments, functions: functions, debugInfo: debugInfo, + span: span, } } @@ -360,6 +363,12 @@ func (program *Program) DisassembleWriter(w io.Writer) { case OpSort: code("OpSort") + case OpProfileStart: + code("OpProfileStart") + + case OpProfileEnd: + code("OpProfileEnd") + case OpBegin: code("OpBegin") diff --git a/vm/utils.go b/vm/utils.go index d7db2a52a..fc2f5e7b8 100644 --- a/vm/utils.go +++ b/vm/utils.go @@ -2,6 +2,7 @@ package vm import ( "reflect" + "time" ) type ( @@ -25,3 +26,15 @@ type Scope struct { } type groupBy = map[any][]any + +type Span struct { + Name string `json:"name"` + Expression string `json:"expression"` + Duration int64 `json:"duration"` + Children []*Span `json:"children"` + start time.Time +} + +func GetSpan(program *Program) *Span { + return program.span +} diff --git a/vm/vm.go b/vm/vm.go index 1e85893b0..7e933ce74 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -8,6 +8,7 @@ import ( "regexp" "sort" "strings" + "time" "github.com/expr-lang/expr/builtin" "github.com/expr-lang/expr/file" @@ -523,6 +524,14 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.memGrow(uint(scope.Len)) vm.push(sortable.Array) + case OpProfileStart: + span := program.Constants[arg].(*Span) + span.start = time.Now() + + case OpProfileEnd: + span := program.Constants[arg].(*Span) + span.Duration += time.Since(span.start).Nanoseconds() + case OpBegin: a := vm.pop() array := reflect.ValueOf(a) From ded019d21ec180b7018641732617c59e8932da32 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Sun, 3 Mar 2024 21:14:32 +0530 Subject: [PATCH 298/506] Enable Support for Arrays in Sum, Mean, and Median Functions (#580) --- builtin/builtin.go | 201 ++++++---------------------------------- builtin/builtin_test.go | 13 +++ builtin/lib.go | 154 ++++++++++++++++++++++++------ builtin/validation.go | 38 ++++++++ 4 files changed, 206 insertions(+), 200 deletions(-) create mode 100644 builtin/validation.go diff --git a/builtin/builtin.go b/builtin/builtin.go index fc48e111a..7bf377df2 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -135,42 +135,21 @@ var Builtins = []*Function{ Name: "ceil", Fast: Ceil, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: - return floatType, nil - } - return anyType, fmt.Errorf("invalid argument for ceil (type %s)", args[0]) + return validateRoundFunc("ceil", args) }, }, { Name: "floor", Fast: Floor, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: - return floatType, nil - } - return anyType, fmt.Errorf("invalid argument for floor (type %s)", args[0]) + return validateRoundFunc("floor", args) }, }, { Name: "round", Fast: Round, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: - return floatType, nil - } - return anyType, fmt.Errorf("invalid argument for floor (type %s)", args[0]) + return validateRoundFunc("round", args) }, }, { @@ -392,185 +371,63 @@ var Builtins = []*Function{ }, { Name: "max", - Func: Max, + Func: func(args ...any) (any, error) { + return minMax("max", runtime.Less, args...) + }, Validate: func(args []reflect.Type) (reflect.Type, error) { - switch len(args) { - case 0: - return anyType, fmt.Errorf("not enough arguments to call max") - case 1: - if kindName := kind(args[0]); kindName == reflect.Array || kindName == reflect.Slice { - return anyType, nil - } - fallthrough - default: - for _, arg := range args { - switch kind(arg) { - case reflect.Interface, reflect.Array, reflect.Slice: - return anyType, nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - default: - return anyType, fmt.Errorf("invalid argument for max (type %s)", arg) - } - } - return args[0], nil - } + return validateAggregateFunc("max", args) }, }, { Name: "min", - Func: Min, + Func: func(args ...any) (any, error) { + return minMax("min", runtime.More, args...) + }, Validate: func(args []reflect.Type) (reflect.Type, error) { - switch len(args) { - case 0: - return anyType, fmt.Errorf("not enough arguments to call min") - case 1: - if kindName := kind(args[0]); kindName == reflect.Array || kindName == reflect.Slice { - return anyType, nil - } - fallthrough - default: - for _, arg := range args { - switch kind(arg) { - case reflect.Interface, reflect.Array, reflect.Slice: - return anyType, nil - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - default: - return anyType, fmt.Errorf("invalid argument for min (type %s)", arg) - } - } - return args[0], nil - - } + return validateAggregateFunc("min", args) }, }, { Name: "sum", - Func: func(args ...any) (any, error) { - if len(args) != 1 { - return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot sum %s", v.Kind()) - } - sum := int64(0) - i := 0 - for ; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - sum += it.Int() - } else if it.CanFloat() { - goto float - } else { - return nil, fmt.Errorf("cannot sum %s", it.Kind()) - } - } - return int(sum), nil - float: - fSum := float64(sum) - for ; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - fSum += float64(it.Int()) - } else if it.CanFloat() { - fSum += it.Float() - } else { - return nil, fmt.Errorf("cannot sum %s", it.Kind()) - } - } - return fSum, nil - }, + Func: sum, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot sum %s", args[0]) - } - return anyType, nil + return validateAggregateFunc("sum", args) }, }, { Name: "mean", Func: func(args ...any) (any, error) { - if len(args) != 1 { - return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot mean %s", v.Kind()) + count, sum, err := mean(args...) + if err != nil { + return nil, err } - if v.Len() == 0 { + if count == 0 { return 0.0, nil } - sum := float64(0) - i := 0 - for ; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - sum += float64(it.Int()) - } else if it.CanFloat() { - sum += it.Float() - } else { - return nil, fmt.Errorf("cannot mean %s", it.Kind()) - } - } - return sum / float64(i), nil + return sum / float64(count), nil }, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot avg %s", args[0]) - } - return floatType, nil + return validateAggregateFunc("mean", args) }, }, { Name: "median", Func: func(args ...any) (any, error) { - if len(args) != 1 { - return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - v := reflect.ValueOf(args[0]) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - return nil, fmt.Errorf("cannot median %s", v.Kind()) - } - if v.Len() == 0 { - return 0.0, nil + values, err := median(args...) + if err != nil { + return nil, err } - s := make([]float64, v.Len()) - for i := 0; i < v.Len(); i++ { - it := deref.Value(v.Index(i)) - if it.CanInt() { - s[i] = float64(it.Int()) - } else if it.CanFloat() { - s[i] = it.Float() - } else { - return nil, fmt.Errorf("cannot median %s", it.Kind()) + if n := len(values); n > 0 { + sort.Float64s(values) + if n%2 == 1 { + return values[n/2], nil } + return (values[n/2-1] + values[n/2]) / 2, nil } - sort.Float64s(s) - if len(s)%2 == 0 { - return (s[len(s)/2-1] + s[len(s)/2]) / 2, nil - } - return s[len(s)/2], nil + return 0.0, nil }, Validate: func(args []reflect.Type) (reflect.Type, error) { - if len(args) != 1 { - return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) - } - switch kind(args[0]) { - case reflect.Interface, reflect.Slice, reflect.Array: - default: - return anyType, fmt.Errorf("cannot median %s", args[0]) - } - return floatType, nil + return validateAggregateFunc("median", args) }, }, { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index bc1a2e149..aa324c9be 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -85,19 +85,29 @@ func TestBuiltin(t *testing.T) { {`min(1.5, 2.5, 3.5)`, 1.5}, {`min([1, 2, 3])`, 1}, {`min([1.5, 2.5, 3.5])`, 1.5}, + {`min(-1, [1.5, 2.5, 3.5])`, -1}, {`sum(1..9)`, 45}, {`sum([.5, 1.5, 2.5])`, 4.5}, {`sum([])`, 0}, {`sum([1, 2, 3.0, 4])`, 10.0}, + {`sum(10, [1, 2, 3], 1..9)`, 61}, + {`sum(-10, [1, 2, 3, 4])`, 0}, + {`sum(-10.9, [1, 2, 3, 4, 9])`, 8.1}, {`mean(1..9)`, 5.0}, {`mean([.5, 1.5, 2.5])`, 1.5}, {`mean([])`, 0.0}, {`mean([1, 2, 3.0, 4])`, 2.5}, + {`mean(10, [1, 2, 3], 1..9)`, 4.6923076923076925}, + {`mean(-10, [1, 2, 3, 4])`, 0.0}, + {`mean(10.9, 1..9)`, 5.59}, {`median(1..9)`, 5.0}, {`median([.5, 1.5, 2.5])`, 1.5}, {`median([])`, 0.0}, {`median([1, 2, 3])`, 2.0}, {`median([1, 2, 3, 4])`, 2.5}, + {`median(10, [1, 2, 3], 1..9)`, 4.0}, + {`median(-10, [1, 2, 3, 4])`, 2.0}, + {`median(1..5, 4.9)`, 3.5}, {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, {`fromJSON("[1, 2, 3]")`, []any{1.0, 2.0, 3.0}}, {`toBase64("hello")`, "aGVsbG8="}, @@ -207,6 +217,9 @@ func TestBuiltin_errors(t *testing.T) { {`min()`, `not enough arguments to call min`}, {`min(1, "2")`, `invalid argument for min (type string)`}, {`min([1, "2"])`, `invalid argument for min (type string)`}, + {`median(1..9, "t")`, "invalid argument for median (type string)"}, + {`mean("s", 1..9)`, "invalid argument for mean (type string)"}, + {`sum("s", "h")`, "invalid argument for sum (type string)"}, {`duration("error")`, `invalid duration`}, {`date("error")`, `invalid date`}, {`get()`, `invalid number of arguments (expected 2, got 0)`}, diff --git a/builtin/lib.go b/builtin/lib.go index b08c2ed2b..9ff9478aa 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -6,7 +6,7 @@ import ( "reflect" "strconv" - "github.com/expr-lang/expr/vm/runtime" + "github.com/expr-lang/expr/internal/deref" ) func Len(x any) any { @@ -254,45 +254,143 @@ func String(arg any) any { return fmt.Sprintf("%v", arg) } -func Max(args ...any) (any, error) { - return minMaxFunc("max", runtime.Less, args) -} +func sum(args ...any) (any, error) { + var total int + var fTotal float64 + + for _, arg := range args { + rv := reflect.ValueOf(deref.Deref(arg)) -func Min(args ...any) (any, error) { - return minMaxFunc("min", runtime.More, args) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elemSum, err := sum(rv.Index(i).Interface()) + if err != nil { + return nil, err + } + switch elemSum := elemSum.(type) { + case int: + total += elemSum + case float64: + fTotal += elemSum + } + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + total += int(rv.Int()) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + total += int(rv.Uint()) + case reflect.Float32, reflect.Float64: + fTotal += rv.Float() + default: + return nil, fmt.Errorf("invalid argument for sum (type %T)", arg) + } + } + + if fTotal != 0.0 { + return fTotal + float64(total), nil + } + return total, nil } -func minMaxFunc(name string, fn func(any, any) bool, args []any) (any, error) { +func minMax(name string, fn func(any, any) bool, args ...any) (any, error) { var val any for _, arg := range args { - switch v := arg.(type) { - case []float32, []float64, []uint, []uint8, []uint16, []uint32, []uint64, []int, []int8, []int16, []int32, []int64: - rv := reflect.ValueOf(v) - if rv.Len() == 0 { - return nil, fmt.Errorf("not enough arguments to call %s", name) - } - arg = rv.Index(0).Interface() - for i := 1; i < rv.Len(); i++ { - elem := rv.Index(i).Interface() - if fn(arg, elem) { - arg = elem + rv := reflect.ValueOf(deref.Deref(arg)) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elemVal, err := minMax(name, fn, rv.Index(i).Interface()) + if err != nil { + return nil, err + } + switch elemVal.(type) { + case int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, + float32, float64: + if elemVal != nil && (val == nil || fn(val, elemVal)) { + val = elemVal + } + default: + return nil, fmt.Errorf("invalid argument for %s (type %T)", name, elemVal) } + } - case []any: - var err error - if arg, err = minMaxFunc(name, fn, v); err != nil { - return nil, err + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + elemVal := rv.Interface() + if val == nil || fn(val, elemVal) { + val = elemVal } - case float32, float64, uint, uint8, uint16, uint32, uint64, int, int8, int16, int32, int64: default: if len(args) == 1 { - return arg, nil + return args[0], nil } - return nil, fmt.Errorf("invalid argument for %s (type %T)", name, v) - } - if val == nil || fn(val, arg) { - val = arg + return nil, fmt.Errorf("invalid argument for %s (type %T)", name, arg) } } return val, nil } + +func mean(args ...any) (int, float64, error) { + var total float64 + var count int + + for _, arg := range args { + rv := reflect.ValueOf(deref.Deref(arg)) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elemCount, elemSum, err := mean(rv.Index(i).Interface()) + if err != nil { + return 0, 0, err + } + total += elemSum + count += elemCount + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + total += float64(rv.Int()) + count++ + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + total += float64(rv.Uint()) + count++ + case reflect.Float32, reflect.Float64: + total += rv.Float() + count++ + default: + return 0, 0, fmt.Errorf("invalid argument for mean (type %T)", arg) + } + } + return count, total, nil +} + +func median(args ...any) ([]float64, error) { + var values []float64 + + for _, arg := range args { + rv := reflect.ValueOf(deref.Deref(arg)) + switch rv.Kind() { + case reflect.Array, reflect.Slice: + size := rv.Len() + for i := 0; i < size; i++ { + elems, err := median(rv.Index(i).Interface()) + if err != nil { + return nil, err + } + values = append(values, elems...) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + values = append(values, float64(rv.Int())) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + values = append(values, float64(rv.Uint())) + case reflect.Float32, reflect.Float64: + values = append(values, rv.Float()) + default: + return nil, fmt.Errorf("invalid argument for median (type %T)", arg) + } + } + return values, nil +} diff --git a/builtin/validation.go b/builtin/validation.go new file mode 100644 index 000000000..057f247e9 --- /dev/null +++ b/builtin/validation.go @@ -0,0 +1,38 @@ +package builtin + +import ( + "fmt" + "reflect" + + "github.com/expr-lang/expr/internal/deref" +) + +func validateAggregateFunc(name string, args []reflect.Type) (reflect.Type, error) { + switch len(args) { + case 0: + return anyType, fmt.Errorf("not enough arguments to call %s", name) + default: + for _, arg := range args { + switch kind(deref.Type(arg)) { + case reflect.Interface, reflect.Array, reflect.Slice: + return anyType, nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: + default: + return anyType, fmt.Errorf("invalid argument for %s (type %s)", name, arg) + } + } + return args[0], nil + } +} + +func validateRoundFunc(name string, args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Interface: + return floatType, nil + default: + return anyType, fmt.Errorf("invalid argument for %s (type %s)", name, args[0]) + } +} From 0e9136ef319565b80ca63ef4b35780d329d0dfff Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Mon, 4 Mar 2024 19:10:33 +0530 Subject: [PATCH 299/506] Fix `-1 not in []` expressions (#590) --- compiler/compiler_test.go | 33 +++++++++++++ expr_test.go | 8 +++ parser/operator/operator.go | 9 ++++ parser/parser.go | 99 ++++++++++++++++++++----------------- parser/parser_test.go | 61 +++++++++++++++++++++++ 5 files changed, 164 insertions(+), 46 deletions(-) diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 741142a77..fbd83ec86 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -541,6 +541,39 @@ func TestCompile_optimizes_jumps(t *testing.T) { {vm.OpFetch, 0}, }, }, + { + `-1 not in [1, 2, 5]`, + []op{ + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpIn, 0}, + {vm.OpNot, 0}, + }, + }, + { + `1 + 8 not in [1, 2, 5]`, + []op{ + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpIn, 0}, + {vm.OpNot, 0}, + }, + }, + { + `true ? false : 8 not in [1, 2, 5]`, + []op{ + {vm.OpTrue, 0}, + {vm.OpJumpIfFalse, 3}, + {vm.OpPop, 0}, + {vm.OpFalse, 0}, + {vm.OpJump, 5}, + {vm.OpPop, 0}, + {vm.OpPush, 0}, + {vm.OpPush, 1}, + {vm.OpIn, 0}, + {vm.OpNot, 0}, + }, + }, } for _, test := range tests { diff --git a/expr_test.go b/expr_test.go index a4321c575..46cb8fe89 100644 --- a/expr_test.go +++ b/expr_test.go @@ -785,6 +785,10 @@ func TestExpr(t *testing.T) { `Two not in 0..1`, true, }, + { + `-1 not in [1]`, + true, + }, { `Int32 in [10, 20]`, false, @@ -797,6 +801,10 @@ func TestExpr(t *testing.T) { `String matches ("^" + String + "$")`, true, }, + { + `'foo' + 'bar' not matches 'foobar'`, + false, + }, { `"foobar" contains "bar"`, true, diff --git a/parser/operator/operator.go b/parser/operator/operator.go index 411a0e2bc..4eeaf80ed 100644 --- a/parser/operator/operator.go +++ b/parser/operator/operator.go @@ -20,6 +20,15 @@ func IsBoolean(op string) bool { return op == "and" || op == "or" || op == "&&" || op == "||" } +func AllowedNegateSuffix(op string) bool { + switch op { + case "contains", "matches", "startsWith", "endsWith", "in": + return true + default: + return false + } +} + var Unary = map[string]Operator{ "not": {50, Left}, "!": {50, Left}, diff --git a/parser/parser.go b/parser/parser.go index 9114bc0c9..9cb79cbbb 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -126,10 +126,8 @@ func (p *parser) expect(kind Kind, values ...string) { // parse functions func (p *parser) parseExpression(precedence int) Node { - if precedence == 0 { - if p.current.Is(Operator, "let") { - return p.parseVariableDeclaration() - } + if precedence == 0 && p.current.Is(Operator, "let") { + return p.parseVariableDeclaration() } nodeLeft := p.parsePrimary() @@ -137,62 +135,71 @@ func (p *parser) parseExpression(precedence int) Node { prevOperator := "" opToken := p.current for opToken.Is(Operator) && p.err == nil { - negate := false + negate := opToken.Is(Operator, "not") var notToken Token // Handle "not *" operator, like "not in" or "not contains". - if opToken.Is(Operator, "not") { + if negate { + currentPos := p.pos p.next() - notToken = p.current - negate = true - opToken = p.current + if operator.AllowedNegateSuffix(p.current.Value) { + if op, ok := operator.Binary[p.current.Value]; ok && op.Precedence >= precedence { + notToken = p.current + opToken = p.current + } else { + p.pos = currentPos + p.current = opToken + break + } + } else { + p.error("unexpected token %v", p.current) + break + } } - if op, ok := operator.Binary[opToken.Value]; ok { - if op.Precedence >= precedence { - p.next() + if op, ok := operator.Binary[opToken.Value]; ok && op.Precedence >= precedence { + p.next() - if opToken.Value == "|" { - identToken := p.current - p.expect(Identifier) - nodeLeft = p.parseCall(identToken, []Node{nodeLeft}, true) - goto next - } + if opToken.Value == "|" { + identToken := p.current + p.expect(Identifier) + nodeLeft = p.parseCall(identToken, []Node{nodeLeft}, true) + goto next + } - if prevOperator == "??" && opToken.Value != "??" && !opToken.Is(Bracket, "(") { - p.errorAt(opToken, "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses.", opToken.Value) - break - } + if prevOperator == "??" && opToken.Value != "??" && !opToken.Is(Bracket, "(") { + p.errorAt(opToken, "Operator (%v) and coalesce expressions (??) cannot be mixed. Wrap either by parentheses.", opToken.Value) + break + } - if operator.IsComparison(opToken.Value) { - nodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence) - goto next - } + if operator.IsComparison(opToken.Value) { + nodeLeft = p.parseComparison(nodeLeft, opToken, op.Precedence) + goto next + } - var nodeRight Node - if op.Associativity == operator.Left { - nodeRight = p.parseExpression(op.Precedence + 1) - } else { - nodeRight = p.parseExpression(op.Precedence) - } + var nodeRight Node + if op.Associativity == operator.Left { + nodeRight = p.parseExpression(op.Precedence + 1) + } else { + nodeRight = p.parseExpression(op.Precedence) + } - nodeLeft = &BinaryNode{ - Operator: opToken.Value, - Left: nodeLeft, - Right: nodeRight, - } - nodeLeft.SetLocation(opToken.Location) + nodeLeft = &BinaryNode{ + Operator: opToken.Value, + Left: nodeLeft, + Right: nodeRight, + } + nodeLeft.SetLocation(opToken.Location) - if negate { - nodeLeft = &UnaryNode{ - Operator: "not", - Node: nodeLeft, - } - nodeLeft.SetLocation(notToken.Location) + if negate { + nodeLeft = &UnaryNode{ + Operator: "not", + Node: nodeLeft, } - - goto next + nodeLeft.SetLocation(notToken.Location) } + + goto next } break diff --git a/parser/parser_test.go b/parser/parser_test.go index 9225e1028..2a30787a0 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -365,6 +365,62 @@ world`}, &UnaryNode{Operator: "not", Node: &IdentifierNode{Value: "in_var"}}, }, + { + "-1 not in [1, 2, 3, 4]", + &UnaryNode{Operator: "not", + Node: &BinaryNode{Operator: "in", + Left: &UnaryNode{Operator: "-", Node: &IntegerNode{Value: 1}}, + Right: &ArrayNode{Nodes: []Node{ + &IntegerNode{Value: 1}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 3}, + &IntegerNode{Value: 4}, + }}}}, + }, + { + "1*8 not in [1, 2, 3, 4]", + &UnaryNode{Operator: "not", + Node: &BinaryNode{Operator: "in", + Left: &BinaryNode{Operator: "*", + Left: &IntegerNode{Value: 1}, + Right: &IntegerNode{Value: 8}, + }, + Right: &ArrayNode{Nodes: []Node{ + &IntegerNode{Value: 1}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 3}, + &IntegerNode{Value: 4}, + }}}}, + }, + { + "2==2 ? false : 3 not in [1, 2, 5]", + &ConditionalNode{ + Cond: &BinaryNode{ + Operator: "==", + Left: &IntegerNode{Value: 2}, + Right: &IntegerNode{Value: 2}, + }, + Exp1: &BoolNode{Value: false}, + Exp2: &UnaryNode{ + Operator: "not", + Node: &BinaryNode{ + Operator: "in", + Left: &IntegerNode{Value: 3}, + Right: &ArrayNode{Nodes: []Node{ + &IntegerNode{Value: 1}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 5}, + }}}}}, + }, + { + "'foo' + 'bar' not matches 'foobar'", + &UnaryNode{Operator: "not", + Node: &BinaryNode{Operator: "matches", + Left: &BinaryNode{Operator: "+", + Left: &StringNode{Value: "foo"}, + Right: &StringNode{Value: "bar"}}, + Right: &StringNode{Value: "foobar"}}}, + }, { "all(Tickets, #)", &BuiltinNode{ @@ -706,6 +762,11 @@ invalid float literal: strconv.ParseFloat: parsing "0o1E+1": invalid syntax (1:6 invalid float literal: strconv.ParseFloat: parsing "1E": invalid syntax (1:2) | 1E | .^ + +1 not == [1, 2, 5] +unexpected token Operator("==") (1:7) + | 1 not == [1, 2, 5] + | ......^ ` func TestParse_error(t *testing.T) { From 5708180cb26fa2e6d25be8d1a59e40ab5dc8dd3e Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 17 Mar 2024 14:51:53 +0700 Subject: [PATCH 300/506] `expr.Operator` passes before `expr.Env` caused error (#606) --- checker/checker_test.go | 2 +- conf/config.go | 6 +++++- expr_test.go | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/checker/checker_test.go b/checker/checker_test.go index d6a84abc5..29c50807e 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -632,7 +632,7 @@ func TestCheck_TaggedFieldName(t *testing.T) { tree, err := parser.Parse(`foo.bar`) require.NoError(t, err) - config := &conf.Config{} + config := conf.CreateNew() expr.Env(struct { x struct { y bool `expr:"bar"` diff --git a/conf/config.go b/conf/config.go index 799898109..01a407a10 100644 --- a/conf/config.go +++ b/conf/config.go @@ -32,6 +32,7 @@ type Config struct { func CreateNew() *Config { c := &Config{ Optimize: true, + Types: make(TypesTable), ConstFns: make(map[string]reflect.Value), Functions: make(map[string]*builtin.Function), Builtins: make(map[string]*builtin.Function), @@ -62,7 +63,10 @@ func (c *Config) WithEnv(env any) { } c.Env = env - c.Types = CreateTypesTable(env) + types := CreateTypesTable(env) + for name, t := range types { + c.Types[name] = t + } c.MapEnv = mapEnv c.DefaultType = mapValueType c.Strict = true diff --git a/expr_test.go b/expr_test.go index 46cb8fe89..790fdd5d9 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2511,6 +2511,20 @@ func TestRaceCondition_variables(t *testing.T) { wg.Wait() } +func TestOperatorDependsOnEnv(t *testing.T) { + env := map[string]any{ + "plus": func(a, b int) int { + return 42 + }, + } + program, err := expr.Compile(`1 + 2`, expr.Operator("+", "plus"), expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, 42, out) +} + func TestArrayComparison(t *testing.T) { tests := []struct { env any From 9748859e10fef2bd8a6c3e07bfb54b95ac81631b Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 21 Mar 2024 02:06:04 +0700 Subject: [PATCH 301/506] builtin `int` unwraps underlying int value (#611) --- builtin/builtin_test.go | 14 ++++++++++++++ builtin/lib.go | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index aa324c9be..7f5045f41 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -612,3 +612,17 @@ func TestBuiltin_bitOpsFunc(t *testing.T) { }) } } + +type customInt int + +func Test_int_unwraps_underlying_value(t *testing.T) { + env := map[string]any{ + "customInt": customInt(42), + } + program, err := expr.Compile(`int(customInt) == 42`, expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, true, out) +} diff --git a/builtin/lib.go b/builtin/lib.go index 9ff9478aa..e3a6c0aef 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -209,6 +209,10 @@ func Int(x any) any { } return i default: + val := reflect.ValueOf(x) + if val.CanConvert(integerType) { + return val.Convert(integerType).Interface() + } panic(fmt.Sprintf("invalid operation: int(%T)", x)) } } From fcebdadc96f31afb134e2f31d056418e5a5a0f74 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 27 Mar 2024 09:26:56 +0100 Subject: [PATCH 302/506] Better map ast printing --- ast/print.go | 8 +++++++- ast/print_test.go | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ast/print.go b/ast/print.go index fa593ae28..063e9eb27 100644 --- a/ast/print.go +++ b/ast/print.go @@ -202,5 +202,11 @@ func (n *MapNode) String() string { } func (n *PairNode) String() string { - return fmt.Sprintf("%s: %s", n.Key.String(), n.Value.String()) + if str, ok := n.Key.(*StringNode); ok { + if utils.IsValidIdentifier(str.Value) { + return fmt.Sprintf("%s: %s", str.Value, n.Value.String()) + } + return fmt.Sprintf("%q: %s", str.String(), n.Value.String()) + } + return fmt.Sprintf("(%s): %s", n.Key.String(), n.Value.String()) } diff --git a/ast/print_test.go b/ast/print_test.go index 16d64357b..d9e55c2ea 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -55,8 +55,8 @@ func TestPrint(t *testing.T) { {`func(a)`, `func(a)`}, {`func(a, b)`, `func(a, b)`}, {`{}`, `{}`}, - {`{a: b}`, `{"a": b}`}, - {`{a: b, c: d}`, `{"a": b, "c": d}`}, + {`{a: b}`, `{a: b}`}, + {`{a: b, c: d}`, `{a: b, c: d}`}, {`[]`, `[]`}, {`[a]`, `[a]`}, {`[a, b]`, `[a, b]`}, @@ -71,6 +71,7 @@ func TestPrint(t *testing.T) { {`a[1:]`, `a[1:]`}, {`a[:]`, `a[:]`}, {`(nil ?? 1) > 0`, `(nil ?? 1) > 0`}, + {`{("a" + "b"): 42}`, `{("a" + "b"): 42}`}, } for _, tt := range tests { From 51156fa1ff9782b0318c0c38b1c4ff0e0a651f5b Mon Sep 17 00:00:00 2001 From: zhuliquan Date: Thu, 28 Mar 2024 21:37:51 +0800 Subject: [PATCH 303/506] feat: extract code for compiling equal operator (#614) --- compiler/compiler.go | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 808b53c9b..a38d977d5 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -395,34 +395,12 @@ func (c *compiler) UnaryNode(node *ast.UnaryNode) { } func (c *compiler) BinaryNode(node *ast.BinaryNode) { - l := kind(node.Left) - r := kind(node.Right) - - leftIsSimple := isSimpleType(node.Left) - rightIsSimple := isSimpleType(node.Right) - leftAndRightAreSimple := leftIsSimple && rightIsSimple - switch node.Operator { case "==": - c.compile(node.Left) - c.derefInNeeded(node.Left) - c.compile(node.Right) - c.derefInNeeded(node.Right) - - if l == r && l == reflect.Int && leftAndRightAreSimple { - c.emit(OpEqualInt) - } else if l == r && l == reflect.String && leftAndRightAreSimple { - c.emit(OpEqualString) - } else { - c.emit(OpEqual) - } + c.equalBinaryNode(node) case "!=": - c.compile(node.Left) - c.derefInNeeded(node.Left) - c.compile(node.Right) - c.derefInNeeded(node.Right) - c.emit(OpEqual) + c.equalBinaryNode(node) c.emit(OpNot) case "or", "||": @@ -580,6 +558,28 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { } } +func (c *compiler) equalBinaryNode(node *ast.BinaryNode) { + l := kind(node.Left) + r := kind(node.Right) + + leftIsSimple := isSimpleType(node.Left) + rightIsSimple := isSimpleType(node.Right) + leftAndRightAreSimple := leftIsSimple && rightIsSimple + + c.compile(node.Left) + c.derefInNeeded(node.Left) + c.compile(node.Right) + c.derefInNeeded(node.Right) + + if l == r && l == reflect.Int && leftAndRightAreSimple { + c.emit(OpEqualInt) + } else if l == r && l == reflect.String && leftAndRightAreSimple { + c.emit(OpEqualString) + } else { + c.emit(OpEqual) + } +} + func isSimpleType(node ast.Node) bool { if node == nil { return false From 32579115c7bdf1eaa416d1b9531dd8cea4a55a64 Mon Sep 17 00:00:00 2001 From: Richard Wooding Date: Mon, 8 Apr 2024 09:00:54 +0200 Subject: [PATCH 304/506] Update README.md (#619) Add SPAN Digital as an user of expr --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bd34c7d24..1475fe2f5 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ func main() { * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. * [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling. +* [SPAN Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products [Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) From e4f0e78896f5e5b99c567b83a546fabaeef9abf3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 9 Apr 2024 09:47:41 +0200 Subject: [PATCH 305/506] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1475fe2f5..1a2d7dc83 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ func main() { * [Visually.io](https://visually.io) employs Expr as a business rule engine for its personalization targeting algorithm. * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. * [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling. -* [SPAN Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products +* [Span Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products. [Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) From 4454efff153c868f9bbe3fdea362b39023298eb9 Mon Sep 17 00:00:00 2001 From: needsure <166317845+needsure@users.noreply.github.com> Date: Tue, 9 Apr 2024 19:13:55 +0800 Subject: [PATCH 306/506] chore: fix some typos in conments (#622) Signed-off-by: needsure --- patcher/value/value.go | 4 ++-- test/operator/operator_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/patcher/value/value.go b/patcher/value/value.go index 59351be6b..28f52be27 100644 --- a/patcher/value/value.go +++ b/patcher/value/value.go @@ -13,9 +13,9 @@ import ( // ValueGetter is a Patcher that allows custom types to be represented as standard go values for use with expr. // It also adds the `$patcher_value_getter` function to the program for efficiently calling matching interfaces. // -// The purpose of this Patcher is to make it seemless to use custom types in expressions without the need to +// The purpose of this Patcher is to make it seamless to use custom types in expressions without the need to // first convert them to standard go values. It may also facilitate using already existing structs or maps as -// environments when they contain compatabile types. +// environments when they contain compatible types. // // An example usage may be modeling a database record with columns that have varying data types and constraints. // In such an example you may have custom types that, beyond storing a simple value, such as an integer, may diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index a19c191dc..b49d91cc6 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -77,7 +77,7 @@ func TestOperator_Function(t *testing.T) { } for _, tt := range tests { - t.Run(fmt.Sprintf(`opertor function helper test %s`, tt.input), func(t *testing.T) { + t.Run(fmt.Sprintf(`operator function helper test %s`, tt.input), func(t *testing.T) { program, err := expr.Compile( tt.input, expr.Env(env), From 582fb32d9214f6ef7a4dfcf754cb466787e15a7c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 10 Apr 2024 10:58:17 +0200 Subject: [PATCH 307/506] Revert "Optimize boolean operations between all, any, one, none functions (#555)" (#625) This reverts commit 3c03e5965172519f7bc12100db6607d6a9fae031. --- optimizer/optimizer.go | 1 - optimizer/optimizer_test.go | 122 ----------------------------- optimizer/predicate_combination.go | 51 ------------ 3 files changed, 174 deletions(-) delete mode 100644 optimizer/predicate_combination.go diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index 6d1fb0b54..a9c0fa3d3 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -36,6 +36,5 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLen{}) Walk(node, &filterLast{}) Walk(node, &filterFirst{}) - Walk(node, &predicateCombination{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 703bd1ceb..e45de763b 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -1,7 +1,6 @@ package optimizer_test import ( - "fmt" "reflect" "strings" "testing" @@ -340,124 +339,3 @@ func TestOptimize_filter_map_first(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } - -func TestOptimize_predicate_combination(t *testing.T) { - tests := []struct { - op string - fn string - wantOp string - }{ - {"and", "all", "and"}, - {"&&", "all", "&&"}, - {"or", "all", "or"}, - {"||", "all", "||"}, - {"and", "any", "and"}, - {"&&", "any", "&&"}, - {"or", "any", "or"}, - {"||", "any", "||"}, - {"and", "none", "or"}, - {"&&", "none", "||"}, - {"and", "one", "or"}, - {"&&", "one", "||"}, - } - - for _, tt := range tests { - rule := fmt.Sprintf(`%s(users, .Age > 18 and .Name != "Bob") %s %s(users, .Age < 30)`, tt.fn, tt.op, tt.fn) - t.Run(rule, func(t *testing.T) { - tree, err := parser.Parse(rule) - require.NoError(t, err) - - err = optimizer.Optimize(&tree.Node, nil) - require.NoError(t, err) - - expected := &ast.BuiltinNode{ - Name: tt.fn, - Arguments: []ast.Node{ - &ast.IdentifierNode{Value: "users"}, - &ast.ClosureNode{ - Node: &ast.BinaryNode{ - Operator: tt.wantOp, - Left: &ast.BinaryNode{ - Operator: "and", - Left: &ast.BinaryNode{ - Operator: ">", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Age"}, - }, - Right: &ast.IntegerNode{Value: 18}, - }, - Right: &ast.BinaryNode{ - Operator: "!=", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Name"}, - }, - Right: &ast.StringNode{Value: "Bob"}, - }, - }, - Right: &ast.BinaryNode{ - Operator: "<", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Age"}, - }, - Right: &ast.IntegerNode{Value: 30}, - }, - }, - }, - }, - } - assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) - }) - } -} - -func TestOptimize_predicate_combination_nested(t *testing.T) { - tree, err := parser.Parse(`any(users, {all(.Friends, {.Age == 18 })}) && any(users, {all(.Friends, {.Name != "Bob" })})`) - require.NoError(t, err) - - err = optimizer.Optimize(&tree.Node, nil) - require.NoError(t, err) - - expected := &ast.BuiltinNode{ - Name: "any", - Arguments: []ast.Node{ - &ast.IdentifierNode{Value: "users"}, - &ast.ClosureNode{ - Node: &ast.BuiltinNode{ - Name: "all", - Arguments: []ast.Node{ - &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Friends"}, - }, - &ast.ClosureNode{ - Node: &ast.BinaryNode{ - Operator: "&&", - Left: &ast.BinaryNode{ - Operator: "==", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Age"}, - }, - Right: &ast.IntegerNode{Value: 18}, - }, - Right: &ast.BinaryNode{ - Operator: "!=", - Left: &ast.MemberNode{ - Node: &ast.PointerNode{}, - Property: &ast.StringNode{Value: "Name"}, - }, - Right: &ast.StringNode{Value: "Bob"}, - }, - }, - }, - }, - }, - }, - }, - } - - assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) -} diff --git a/optimizer/predicate_combination.go b/optimizer/predicate_combination.go deleted file mode 100644 index 2733781df..000000000 --- a/optimizer/predicate_combination.go +++ /dev/null @@ -1,51 +0,0 @@ -package optimizer - -import ( - . "github.com/expr-lang/expr/ast" - "github.com/expr-lang/expr/parser/operator" -) - -type predicateCombination struct{} - -func (v *predicateCombination) Visit(node *Node) { - if op, ok := (*node).(*BinaryNode); ok && operator.IsBoolean(op.Operator) { - if left, ok := op.Left.(*BuiltinNode); ok { - if combinedOp, ok := combinedOperator(left.Name, op.Operator); ok { - if right, ok := op.Right.(*BuiltinNode); ok && right.Name == left.Name { - if left.Arguments[0].Type() == right.Arguments[0].Type() && left.Arguments[0].String() == right.Arguments[0].String() { - closure := &ClosureNode{ - Node: &BinaryNode{ - Operator: combinedOp, - Left: left.Arguments[1].(*ClosureNode).Node, - Right: right.Arguments[1].(*ClosureNode).Node, - }, - } - v.Visit(&closure.Node) - Patch(node, &BuiltinNode{ - Name: left.Name, - Arguments: []Node{ - left.Arguments[0], - closure, - }, - }) - } - } - } - } - } -} - -func combinedOperator(fn, op string) (string, bool) { - switch fn { - case "all", "any": - return op, true - case "one", "none": - switch op { - case "and": - return "or", true - case "&&": - return "||", true - } - } - return "", false -} From 55dc4e80bc10639d13f4739ea8a767edb8b357f4 Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 12 Apr 2024 23:49:41 +0700 Subject: [PATCH 308/506] Optimize boolean operations between all, any, none functions (#626) --- expr_test.go | 189 +++++++++++++++++++++++++++++ optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 116 ++++++++++++++++++ optimizer/predicate_combination.go | 61 ++++++++++ 4 files changed, 367 insertions(+) create mode 100644 optimizer/predicate_combination.go diff --git a/expr_test.go b/expr_test.go index 790fdd5d9..ac8eecf48 100644 --- a/expr_test.go +++ b/expr_test.go @@ -901,18 +901,147 @@ func TestExpr(t *testing.T) { `all(1..3, {# > 0})`, true, }, + { + `all(1..3, {# > 0}) && all(1..3, {# < 4})`, + true, + }, + { + `all(1..3, {# > 2}) && all(1..3, {# < 4})`, + false, + }, + { + `all(1..3, {# > 0}) && all(1..3, {# < 2})`, + false, + }, + { + `all(1..3, {# > 2}) && all(1..3, {# < 2})`, + false, + }, + { + `all(1..3, {# > 0}) || all(1..3, {# < 4})`, + true, + }, + { + `all(1..3, {# > 0}) || all(1..3, {# != 2})`, + true, + }, + { + `all(1..3, {# != 3}) || all(1..3, {# < 4})`, + true, + }, + { + `all(1..3, {# != 3}) || all(1..3, {# != 2})`, + false, + }, { `none(1..3, {# == 0})`, true, }, + { + `none(1..3, {# == 0}) && none(1..3, {# == 4})`, + true, + }, + { + `none(1..3, {# == 0}) && none(1..3, {# == 3})`, + false, + }, + { + `none(1..3, {# == 1}) && none(1..3, {# == 4})`, + false, + }, + { + `none(1..3, {# == 1}) && none(1..3, {# == 3})`, + false, + }, + { + `none(1..3, {# == 0}) || none(1..3, {# == 4})`, + true, + }, + { + `none(1..3, {# == 0}) || none(1..3, {# == 3})`, + true, + }, + { + `none(1..3, {# == 1}) || none(1..3, {# == 4})`, + true, + }, + { + `none(1..3, {# == 1}) || none(1..3, {# == 3})`, + false, + }, { `any([1,1,0,1], {# == 0})`, true, }, + { + `any(1..3, {# == 1}) && any(1..3, {# == 2})`, + true, + }, + { + `any(1..3, {# == 0}) && any(1..3, {# == 2})`, + false, + }, + { + `any(1..3, {# == 1}) && any(1..3, {# == 4})`, + false, + }, + { + `any(1..3, {# == 0}) && any(1..3, {# == 4})`, + false, + }, + { + `any(1..3, {# == 1}) || any(1..3, {# == 2})`, + true, + }, + { + `any(1..3, {# == 0}) || any(1..3, {# == 2})`, + true, + }, + { + `any(1..3, {# == 1}) || any(1..3, {# == 4})`, + true, + }, + { + `any(1..3, {# == 0}) || any(1..3, {# == 4})`, + false, + }, { `one([1,1,0,1], {# == 0}) and not one([1,0,0,1], {# == 0})`, true, }, + { + `one(1..3, {# == 1}) and one(1..3, {# == 2})`, + true, + }, + { + `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2})`, + false, + }, + { + `one(1..3, {# == 1}) and one(1..3, {# == 2 || # == 3})`, + false, + }, + { + `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2 || # == 3})`, + false, + }, + { + `one(1..3, {# == 1}) or one(1..3, {# == 2})`, + true, + }, + { + `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2})`, + true, + }, + { + `one(1..3, {# == 1}) or one(1..3, {# == 2 || # == 3})`, + true, + }, + { + `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2 || # == 3})`, + false, + }, + { `count(1..30, {# % 3 == 0})`, 10, @@ -2525,6 +2654,66 @@ func TestOperatorDependsOnEnv(t *testing.T) { assert.Equal(t, 42, out) } +func TestIssue624(t *testing.T) { + type tag struct { + Name string + } + + type item struct { + Tags []tag + } + + i := item{ + Tags: []tag{ + {Name: "one"}, + {Name: "two"}, + }, + } + + rule := `[ +true && true, +one(Tags, .Name in ["one"]), +one(Tags, .Name in ["two"]), +one(Tags, .Name in ["one"]) && one(Tags, .Name in ["two"]) +]` + resp, err := expr.Eval(rule, i) + require.NoError(t, err) + require.Equal(t, []interface{}{true, true, true, true}, resp) +} + +func TestPredicateCombination(t *testing.T) { + tests := []struct { + code1 string + code2 string + }{ + {"all(1..3, {# > 0}) && all(1..3, {# < 4})", "all(1..3, {# > 0 && # < 4})"}, + {"all(1..3, {# > 1}) && all(1..3, {# < 4})", "all(1..3, {# > 1 && # < 4})"}, + {"all(1..3, {# > 0}) && all(1..3, {# < 2})", "all(1..3, {# > 0 && # < 2})"}, + {"all(1..3, {# > 1}) && all(1..3, {# < 2})", "all(1..3, {# > 1 && # < 2})"}, + + {"any(1..3, {# > 0}) || any(1..3, {# < 4})", "any(1..3, {# > 0 || # < 4})"}, + {"any(1..3, {# > 1}) || any(1..3, {# < 4})", "any(1..3, {# > 1 || # < 4})"}, + {"any(1..3, {# > 0}) || any(1..3, {# < 2})", "any(1..3, {# > 0 || # < 2})"}, + {"any(1..3, {# > 1}) || any(1..3, {# < 2})", "any(1..3, {# > 1 || # < 2})"}, + + {"none(1..3, {# > 0}) && none(1..3, {# < 4})", "none(1..3, {# > 0 || # < 4})"}, + {"none(1..3, {# > 1}) && none(1..3, {# < 4})", "none(1..3, {# > 1 || # < 4})"}, + {"none(1..3, {# > 0}) && none(1..3, {# < 2})", "none(1..3, {# > 0 || # < 2})"}, + {"none(1..3, {# > 1}) && none(1..3, {# < 2})", "none(1..3, {# > 1 || # < 2})"}, + } + for _, tt := range tests { + t.Run(tt.code1, func(t *testing.T) { + out1, err := expr.Eval(tt.code1, nil) + require.NoError(t, err) + + out2, err := expr.Eval(tt.code2, nil) + require.NoError(t, err) + + require.Equal(t, out1, out2) + }) + } +} + func TestArrayComparison(t *testing.T) { tests := []struct { env any diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index a9c0fa3d3..6d1fb0b54 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -36,5 +36,6 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLen{}) Walk(node, &filterLast{}) Walk(node, &filterFirst{}) + Walk(node, &predicateCombination{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index e45de763b..316b17182 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -1,6 +1,7 @@ package optimizer_test import ( + "fmt" "reflect" "strings" "testing" @@ -339,3 +340,118 @@ func TestOptimize_filter_map_first(t *testing.T) { assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) } + +func TestOptimize_predicate_combination(t *testing.T) { + tests := []struct { + op string + fn string + wantOp string + }{ + {"and", "all", "and"}, + {"&&", "all", "&&"}, + {"or", "any", "or"}, + {"||", "any", "||"}, + {"and", "none", "or"}, + {"&&", "none", "||"}, + } + + for _, tt := range tests { + rule := fmt.Sprintf(`%s(users, .Age > 18 and .Name != "Bob") %s %s(users, .Age < 30)`, tt.fn, tt.op, tt.fn) + t.Run(rule, func(t *testing.T) { + tree, err := parser.Parse(rule) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: tt.fn, + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: tt.wantOp, + Left: &ast.BinaryNode{ + Operator: "and", + Left: &ast.BinaryNode{ + Operator: ">", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 18}, + }, + Right: &ast.BinaryNode{ + Operator: "!=", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + Right: &ast.BinaryNode{ + Operator: "<", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 30}, + }, + }, + }, + }, + } + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) + }) + } +} + +func TestOptimize_predicate_combination_nested(t *testing.T) { + tree, err := parser.Parse(`all(users, {all(.Friends, {.Age == 18 })}) && all(users, {all(.Friends, {.Name != "Bob" })})`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "all", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.BuiltinNode{ + Name: "all", + Arguments: []ast.Node{ + &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Friends"}, + }, + &ast.ClosureNode{ + Node: &ast.BinaryNode{ + Operator: "&&", + Left: &ast.BinaryNode{ + Operator: "==", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + Right: &ast.IntegerNode{Value: 18}, + }, + Right: &ast.BinaryNode{ + Operator: "!=", + Left: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Name"}, + }, + Right: &ast.StringNode{Value: "Bob"}, + }, + }, + }, + }, + }, + }, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} diff --git a/optimizer/predicate_combination.go b/optimizer/predicate_combination.go new file mode 100644 index 000000000..6e8a7f7cf --- /dev/null +++ b/optimizer/predicate_combination.go @@ -0,0 +1,61 @@ +package optimizer + +import ( + . "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/parser/operator" +) + +/* +predicateCombination is a visitor that combines multiple predicate calls into a single call. +For example, the following expression: + + all(x, x > 1) && all(x, x < 10) -> all(x, x > 1 && x < 10) + any(x, x > 1) || any(x, x < 10) -> any(x, x > 1 || x < 10) + none(x, x > 1) && none(x, x < 10) -> none(x, x > 1 || x < 10) +*/ +type predicateCombination struct{} + +func (v *predicateCombination) Visit(node *Node) { + if op, ok := (*node).(*BinaryNode); ok && operator.IsBoolean(op.Operator) { + if left, ok := op.Left.(*BuiltinNode); ok { + if combinedOp, ok := combinedOperator(left.Name, op.Operator); ok { + if right, ok := op.Right.(*BuiltinNode); ok && right.Name == left.Name { + if left.Arguments[0].Type() == right.Arguments[0].Type() && left.Arguments[0].String() == right.Arguments[0].String() { + closure := &ClosureNode{ + Node: &BinaryNode{ + Operator: combinedOp, + Left: left.Arguments[1].(*ClosureNode).Node, + Right: right.Arguments[1].(*ClosureNode).Node, + }, + } + v.Visit(&closure.Node) + Patch(node, &BuiltinNode{ + Name: left.Name, + Arguments: []Node{ + left.Arguments[0], + closure, + }, + }) + } + } + } + } + } +} + +func combinedOperator(fn, op string) (string, bool) { + switch { + case fn == "all" && (op == "and" || op == "&&"): + return op, true + case fn == "any" && (op == "or" || op == "||"): + return op, true + case fn == "none" && (op == "and" || op == "&&"): + switch op { + case "and": + return "or", true + case "&&": + return "||", true + } + } + return "", false +} From 524efca4b271a8ac6d62f6271c885f4e3e91002a Mon Sep 17 00:00:00 2001 From: Daenney Date: Fri, 12 Apr 2024 22:54:01 +0200 Subject: [PATCH 309/506] Make WithContext work for methods on env struct (#602) This makes the WithContext patcher work when passing in a struct for an env that has methods that take a context. This is a bit fiddly because we can't quite detect the difference of function vs. method on a struct, so we have to check both the first and the second param. Since it's highly unusual to pass the context as anything other than the first parameter, this should work out just fine in practice. Fixes #600. --- patcher/with_context.go | 15 +++++++++++---- patcher/with_context_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/patcher/with_context.go b/patcher/with_context.go index 55b604261..f9861a2c2 100644 --- a/patcher/with_context.go +++ b/patcher/with_context.go @@ -22,11 +22,18 @@ func (w WithContext) Visit(node *ast.Node) { if fn.Kind() != reflect.Func { return } - if fn.NumIn() == 0 { - return - } - if fn.In(0).String() != "context.Context" { + switch fn.NumIn() { + case 0: return + case 1: + if fn.In(0).String() != "context.Context" { + return + } + default: + if fn.In(0).String() != "context.Context" && + fn.In(1).String() != "context.Context" { + return + } } ast.Patch(node, &ast.CallNode{ Callee: call.Callee, diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index afad4e6f0..5ce64191f 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -62,6 +62,30 @@ func TestWithContext_with_env_Function(t *testing.T) { require.Equal(t, 42, output) } +type testEnvContext struct { + Context context.Context `expr:"ctx"` +} + +func (testEnvContext) Fn(ctx context.Context, a int) int { + return ctx.Value("value").(int) + a +} + +func TestWithContext_env_struct(t *testing.T) { + withContext := patcher.WithContext{Name: "ctx"} + + program, err := expr.Compile(`Fn(40)`, expr.Env(testEnvContext{}), expr.Patch(withContext)) + require.NoError(t, err) + + ctx := context.WithValue(context.Background(), "value", 2) + env := testEnvContext{ + Context: ctx, + } + + output, err := expr.Run(program, env) + require.NoError(t, err) + require.Equal(t, 42, output) +} + type TestFoo struct { contextValue int } From 38f949658f8e27c1e9367487b4769b51128c36e9 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Apr 2024 15:37:02 +0200 Subject: [PATCH 310/506] Add predicate to sum() builtin (#592) * Add predicate to sum() builtin * go mod tidy --- builtin/builtin.go | 12 +++++------- builtin/builtin_test.go | 4 ---- builtin/lib.go | 39 --------------------------------------- checker/checker.go | 23 +++++++++++++++++++++++ compiler/compiler.go | 19 +++++++++++++++++++ parser/parser.go | 1 + test/fuzz/fuzz_corpus.txt | 1 - testdata/examples.txt | 14 -------------- 8 files changed, 48 insertions(+), 65 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 7bf377df2..efc01fc2f 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -83,6 +83,11 @@ var Builtins = []*Function{ Predicate: true, Types: types(new(func([]any, func(any) bool) int)), }, + { + Name: "sum", + Predicate: true, + Types: types(new(func([]any, func(any) bool) int)), + }, { Name: "groupBy", Predicate: true, @@ -387,13 +392,6 @@ var Builtins = []*Function{ return validateAggregateFunc("min", args) }, }, - { - Name: "sum", - Func: sum, - Validate: func(args []reflect.Type) (reflect.Type, error) { - return validateAggregateFunc("sum", args) - }, - }, { Name: "mean", Func: func(args ...any) (any, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 7f5045f41..307d4a86a 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -90,9 +90,6 @@ func TestBuiltin(t *testing.T) { {`sum([.5, 1.5, 2.5])`, 4.5}, {`sum([])`, 0}, {`sum([1, 2, 3.0, 4])`, 10.0}, - {`sum(10, [1, 2, 3], 1..9)`, 61}, - {`sum(-10, [1, 2, 3, 4])`, 0}, - {`sum(-10.9, [1, 2, 3, 4, 9])`, 8.1}, {`mean(1..9)`, 5.0}, {`mean([.5, 1.5, 2.5])`, 1.5}, {`mean([])`, 0.0}, @@ -219,7 +216,6 @@ func TestBuiltin_errors(t *testing.T) { {`min([1, "2"])`, `invalid argument for min (type string)`}, {`median(1..9, "t")`, "invalid argument for median (type string)"}, {`mean("s", 1..9)`, "invalid argument for mean (type string)"}, - {`sum("s", "h")`, "invalid argument for sum (type string)"}, {`duration("error")`, `invalid duration`}, {`date("error")`, `invalid date`}, {`get()`, `invalid number of arguments (expected 2, got 0)`}, diff --git a/builtin/lib.go b/builtin/lib.go index e3a6c0aef..e3cd61b96 100644 --- a/builtin/lib.go +++ b/builtin/lib.go @@ -258,45 +258,6 @@ func String(arg any) any { return fmt.Sprintf("%v", arg) } -func sum(args ...any) (any, error) { - var total int - var fTotal float64 - - for _, arg := range args { - rv := reflect.ValueOf(deref.Deref(arg)) - - switch rv.Kind() { - case reflect.Array, reflect.Slice: - size := rv.Len() - for i := 0; i < size; i++ { - elemSum, err := sum(rv.Index(i).Interface()) - if err != nil { - return nil, err - } - switch elemSum := elemSum.(type) { - case int: - total += elemSum - case float64: - fTotal += elemSum - } - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - total += int(rv.Int()) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - total += int(rv.Uint()) - case reflect.Float32, reflect.Float64: - fTotal += rv.Float() - default: - return nil, fmt.Errorf("invalid argument for sum (type %T)", arg) - } - } - - if fTotal != 0.0 { - return fTotal + float64(total), nil - } - return total, nil -} - func minMax(name string, fn func(any, any) bool, args ...any) (any, error) { var val any for _, arg := range args { diff --git a/checker/checker.go b/checker/checker.go index b46178d43..a6daa27b9 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -668,6 +668,29 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { } return v.error(node.Arguments[1], "predicate should has one input and one output param") + case "sum": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + if len(node.Arguments) == 2 { + v.begin(collection) + closure, _ := v.visit(node.Arguments[1]) + v.end() + + if isFunc(closure) && + closure.NumOut() == 1 && + closure.NumIn() == 1 && isAny(closure.In(0)) { + return closure.Out(0), info{} + } + } else { + if isAny(collection) { + return anyType, info{} + } + return collection.Elem(), info{} + } + case "find", "findLast": collection, _ := v.visit(node.Arguments[0]) if !isArray(collection) && !isAny(collection) { diff --git a/compiler/compiler.go b/compiler/compiler.go index a38d977d5..07bc58b87 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -809,6 +809,25 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpEnd) return + case "sum": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + c.emit(OpInt, 0) + c.emit(OpSetAcc) + c.emitLoop(func() { + if len(node.Arguments) == 2 { + c.compile(node.Arguments[1]) + } else { + c.emit(OpPointer) + } + c.emit(OpGetAcc) + c.emit(OpAdd) + c.emit(OpSetAcc) + }) + c.emit(OpGetAcc) + c.emit(OpEnd) + return + case "find": c.compile(node.Arguments[0]) c.emit(OpBegin) diff --git a/parser/parser.go b/parser/parser.go index 9cb79cbbb..641369b1a 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -34,6 +34,7 @@ var predicates = map[string]struct { "filter": {[]arg{expr, closure}}, "map": {[]arg{expr, closure}}, "count": {[]arg{expr, closure}}, + "sum": {[]arg{expr, closure | optional}}, "find": {[]arg{expr, closure}}, "findIndex": {[]arg{expr, closure}}, "findLast": {[]arg{expr, closure}}, diff --git a/test/fuzz/fuzz_corpus.txt b/test/fuzz/fuzz_corpus.txt index 2bb8ab7fb..166548632 100644 --- a/test/fuzz/fuzz_corpus.txt +++ b/test/fuzz/fuzz_corpus.txt @@ -10455,7 +10455,6 @@ max(f64, i64) max(false ? 1 : 0.5) max(false ? 1 : nil) max(false ? add : ok) -max(false ? half : list) max(false ? i : nil) max(false ? i32 : score) max(false ? true : 1) diff --git a/testdata/examples.txt b/testdata/examples.txt index 712aa91c0..5b9d2cdde 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -7419,12 +7419,6 @@ get(ok ? score : foo, String?.foo()) get(ok ? score : i64, foo) get(reduce(list, array), i32) get(sort(array), i32) -get(sum(array), Qux) -get(sum(array), String) -get(sum(array), f32) -get(sum(array), f64 == list) -get(sum(array), greet) -get(sum(array), i) get(take(list, i), i64) get(true ? "bar" : ok, score(i)) get(true ? "foo" : half, list) @@ -7460,7 +7454,6 @@ greet != nil ? list : false greet != score greet != score != false greet != score or ok -greet != sum(array) greet == add greet == add ? i : list greet == add or ok @@ -12200,7 +12193,6 @@ last(ok ? ok : 0.5) last(reduce(array, list)) last(reduce(list, array)) last(sort(array)) -last(sum(array)) last(true ? "bar" : half) last(true ? add : list) last(true ? foo : 1) @@ -14818,7 +14810,6 @@ ok != nil ? nil : array ok != not ok ok != ok ok != ok ? false : "bar" -ok != sum(array) ok && !false ok && !ok ok && "foo" matches "bar" @@ -16970,7 +16961,6 @@ string(groupBy(list, i)) string(half != nil) string(half != score) string(half == nil) -string(half == sum(array)) string(half(0.5)) string(half(1)) string(half(f64)) @@ -17297,18 +17287,14 @@ sum([0.5]) sum([f32]) sum(array) sum(array) != f32 -sum(array) != half -sum(array) != ok sum(array) % i sum(array) % i64 sum(array) - f32 sum(array) / -f64 sum(array) < i -sum(array) == div sum(array) == i64 - i sum(array) ^ f64 sum(array) not in array -sum(array) not in list sum(filter(array, ok)) sum(groupBy(array, i32).String) sum(groupBy(list, #)?.greet) From edb1b5aa991fa78f420099f2bebc86de56c56900 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Apr 2024 22:50:11 +0200 Subject: [PATCH 311/506] Add sum(map()) optimization --- optimizer/optimizer.go | 1 + optimizer/sum_map.go | 25 +++++++++++++++++++++++++ optimizer/sum_map_test.go | 35 +++++++++++++++++++++++++++++++++++ test/fuzz/fuzz_corpus.txt | 1 - 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 optimizer/sum_map.go create mode 100644 optimizer/sum_map_test.go diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index 6d1fb0b54..edb9c14f6 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -37,5 +37,6 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLast{}) Walk(node, &filterFirst{}) Walk(node, &predicateCombination{}) + Walk(node, &sumMap{}) return nil } diff --git a/optimizer/sum_map.go b/optimizer/sum_map.go new file mode 100644 index 000000000..a41a53732 --- /dev/null +++ b/optimizer/sum_map.go @@ -0,0 +1,25 @@ +package optimizer + +import ( + . "github.com/expr-lang/expr/ast" +) + +type sumMap struct{} + +func (*sumMap) Visit(node *Node) { + if sumBuiltin, ok := (*node).(*BuiltinNode); ok && + sumBuiltin.Name == "sum" && + len(sumBuiltin.Arguments) == 1 { + if mapBuiltin, ok := sumBuiltin.Arguments[0].(*BuiltinNode); ok && + mapBuiltin.Name == "map" && + len(mapBuiltin.Arguments) == 2 { + Patch(node, &BuiltinNode{ + Name: "sum", + Arguments: []Node{ + mapBuiltin.Arguments[0], + mapBuiltin.Arguments[1], + }, + }) + } + } +} diff --git a/optimizer/sum_map_test.go b/optimizer/sum_map_test.go new file mode 100644 index 000000000..0ce3203e2 --- /dev/null +++ b/optimizer/sum_map_test.go @@ -0,0 +1,35 @@ +package optimizer_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/optimizer" + "github.com/expr-lang/expr/parser" +) + +func TestOptimize_sum_map(t *testing.T) { + tree, err := parser.Parse(`sum(map(users, {.Age}))`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BuiltinNode{ + Name: "sum", + Arguments: []ast.Node{ + &ast.IdentifierNode{Value: "users"}, + &ast.ClosureNode{ + Node: &ast.MemberNode{ + Node: &ast.PointerNode{}, + Property: &ast.StringNode{Value: "Age"}, + }, + }, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} diff --git a/test/fuzz/fuzz_corpus.txt b/test/fuzz/fuzz_corpus.txt index 166548632..7b0174923 100644 --- a/test/fuzz/fuzz_corpus.txt +++ b/test/fuzz/fuzz_corpus.txt @@ -5608,7 +5608,6 @@ findLastIndex(list, f64 == f64) findLastIndex(list, false == false) findLastIndex(list, false and false) findLastIndex(list, false and ok) -findLastIndex(list, false) != i findLastIndex(list, foo != #) findLastIndex(list, foo == foo) findLastIndex(list, greet != half) From c2b609e99b5c2229c0954beaf0eba1ed6fa50e94 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Apr 2024 23:16:08 +0200 Subject: [PATCH 312/506] Add sum([]) optimization --- expr_test.go | 141 ------------------------------------ optimizer/optimizer.go | 1 + optimizer/optimizer_test.go | 73 +++++++++++++++++++ optimizer/sum_array.go | 37 ++++++++++ optimizer/sum_array_test.go | 73 +++++++++++++++++++ 5 files changed, 184 insertions(+), 141 deletions(-) create mode 100644 optimizer/sum_array.go create mode 100644 optimizer/sum_array_test.go diff --git a/expr_test.go b/expr_test.go index ac8eecf48..38b97eaa0 100644 --- a/expr_test.go +++ b/expr_test.go @@ -901,147 +901,6 @@ func TestExpr(t *testing.T) { `all(1..3, {# > 0})`, true, }, - { - `all(1..3, {# > 0}) && all(1..3, {# < 4})`, - true, - }, - { - `all(1..3, {# > 2}) && all(1..3, {# < 4})`, - false, - }, - { - `all(1..3, {# > 0}) && all(1..3, {# < 2})`, - false, - }, - { - `all(1..3, {# > 2}) && all(1..3, {# < 2})`, - false, - }, - { - `all(1..3, {# > 0}) || all(1..3, {# < 4})`, - true, - }, - { - `all(1..3, {# > 0}) || all(1..3, {# != 2})`, - true, - }, - { - `all(1..3, {# != 3}) || all(1..3, {# < 4})`, - true, - }, - { - `all(1..3, {# != 3}) || all(1..3, {# != 2})`, - false, - }, - { - `none(1..3, {# == 0})`, - true, - }, - { - `none(1..3, {# == 0}) && none(1..3, {# == 4})`, - true, - }, - { - `none(1..3, {# == 0}) && none(1..3, {# == 3})`, - false, - }, - { - `none(1..3, {# == 1}) && none(1..3, {# == 4})`, - false, - }, - { - `none(1..3, {# == 1}) && none(1..3, {# == 3})`, - false, - }, - { - `none(1..3, {# == 0}) || none(1..3, {# == 4})`, - true, - }, - { - `none(1..3, {# == 0}) || none(1..3, {# == 3})`, - true, - }, - { - `none(1..3, {# == 1}) || none(1..3, {# == 4})`, - true, - }, - { - `none(1..3, {# == 1}) || none(1..3, {# == 3})`, - false, - }, - { - `any([1,1,0,1], {# == 0})`, - true, - }, - { - `any(1..3, {# == 1}) && any(1..3, {# == 2})`, - true, - }, - { - `any(1..3, {# == 0}) && any(1..3, {# == 2})`, - false, - }, - { - `any(1..3, {# == 1}) && any(1..3, {# == 4})`, - false, - }, - { - `any(1..3, {# == 0}) && any(1..3, {# == 4})`, - false, - }, - { - `any(1..3, {# == 1}) || any(1..3, {# == 2})`, - true, - }, - { - `any(1..3, {# == 0}) || any(1..3, {# == 2})`, - true, - }, - { - `any(1..3, {# == 1}) || any(1..3, {# == 4})`, - true, - }, - { - `any(1..3, {# == 0}) || any(1..3, {# == 4})`, - false, - }, - { - `one([1,1,0,1], {# == 0}) and not one([1,0,0,1], {# == 0})`, - true, - }, - { - `one(1..3, {# == 1}) and one(1..3, {# == 2})`, - true, - }, - { - `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2})`, - false, - }, - { - `one(1..3, {# == 1}) and one(1..3, {# == 2 || # == 3})`, - false, - }, - { - `one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2 || # == 3})`, - false, - }, - { - `one(1..3, {# == 1}) or one(1..3, {# == 2})`, - true, - }, - { - `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2})`, - true, - }, - { - `one(1..3, {# == 1}) or one(1..3, {# == 2 || # == 3})`, - true, - }, - { - `one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2 || # == 3})`, - false, - }, - { `count(1..30, {# % 3 == 0})`, 10, diff --git a/optimizer/optimizer.go b/optimizer/optimizer.go index edb9c14f6..4ceb3fa43 100644 --- a/optimizer/optimizer.go +++ b/optimizer/optimizer.go @@ -37,6 +37,7 @@ func Optimize(node *Node, config *conf.Config) error { Walk(node, &filterLast{}) Walk(node, &filterFirst{}) Walk(node, &predicateCombination{}) + Walk(node, &sumArray{}) Walk(node, &sumMap{}) return nil } diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 316b17182..e59d2c65d 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -17,6 +17,79 @@ import ( "github.com/expr-lang/expr/parser" ) +func TestOptimize(t *testing.T) { + env := map[string]any{ + "a": 1, + "b": 2, + "c": 3, + } + + tests := []struct { + expr string + want any + }{ + {`1 + 2`, 3}, + {`sum([])`, 0}, + {`sum([a])`, 1}, + {`sum([a, b])`, 3}, + {`sum([a, b, c])`, 6}, + {`sum([a, b, c, 4])`, 10}, + {`all(1..3, {# > 0}) && all(1..3, {# < 4})`, true}, + {`all(1..3, {# > 2}) && all(1..3, {# < 4})`, false}, + {`all(1..3, {# > 0}) && all(1..3, {# < 2})`, false}, + {`all(1..3, {# > 2}) && all(1..3, {# < 2})`, false}, + {`all(1..3, {# > 0}) || all(1..3, {# < 4})`, true}, + {`all(1..3, {# > 0}) || all(1..3, {# != 2})`, true}, + {`all(1..3, {# != 3}) || all(1..3, {# < 4})`, true}, + {`all(1..3, {# != 3}) || all(1..3, {# != 2})`, false}, + {`none(1..3, {# == 0})`, true}, + {`none(1..3, {# == 0}) && none(1..3, {# == 4})`, true}, + {`none(1..3, {# == 0}) && none(1..3, {# == 3})`, false}, + {`none(1..3, {# == 1}) && none(1..3, {# == 4})`, false}, + {`none(1..3, {# == 1}) && none(1..3, {# == 3})`, false}, + {`none(1..3, {# == 0}) || none(1..3, {# == 4})`, true}, + {`none(1..3, {# == 0}) || none(1..3, {# == 3})`, true}, + {`none(1..3, {# == 1}) || none(1..3, {# == 4})`, true}, + {`none(1..3, {# == 1}) || none(1..3, {# == 3})`, false}, + {`any([1, 1, 0, 1], {# == 0})`, true}, + {`any(1..3, {# == 1}) && any(1..3, {# == 2})`, true}, + {`any(1..3, {# == 0}) && any(1..3, {# == 2})`, false}, + {`any(1..3, {# == 1}) && any(1..3, {# == 4})`, false}, + {`any(1..3, {# == 0}) && any(1..3, {# == 4})`, false}, + {`any(1..3, {# == 1}) || any(1..3, {# == 2})`, true}, + {`any(1..3, {# == 0}) || any(1..3, {# == 2})`, true}, + {`any(1..3, {# == 1}) || any(1..3, {# == 4})`, true}, + {`any(1..3, {# == 0}) || any(1..3, {# == 4})`, false}, + {`one([1, 1, 0, 1], {# == 0}) and not one([1, 0, 0, 1], {# == 0})`, true}, + {`one(1..3, {# == 1}) and one(1..3, {# == 2})`, true}, + {`one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2})`, false}, + {`one(1..3, {# == 1}) and one(1..3, {# == 2 || # == 3})`, false}, + {`one(1..3, {# == 1 || # == 2}) and one(1..3, {# == 2 || # == 3})`, false}, + {`one(1..3, {# == 1}) or one(1..3, {# == 2})`, true}, + {`one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2})`, true}, + {`one(1..3, {# == 1}) or one(1..3, {# == 2 || # == 3})`, true}, + {`one(1..3, {# == 1 || # == 2}) or one(1..3, {# == 2 || # == 3})`, false}, + } + + for _, tt := range tests { + t.Run(tt.expr, func(t *testing.T) { + program, err := expr.Compile(tt.expr, expr.Env(env)) + require.NoError(t, err) + + output, err := expr.Run(program, env) + require.NoError(t, err) + assert.Equal(t, tt.want, output) + + unoptimizedProgram, err := expr.Compile(tt.expr, expr.Env(env), expr.Optimize(false)) + require.NoError(t, err) + + unoptimizedOutput, err := expr.Run(unoptimizedProgram, env) + require.NoError(t, err) + assert.Equal(t, tt.want, unoptimizedOutput) + }) + } +} + func TestOptimize_constant_folding(t *testing.T) { tree, err := parser.Parse(`[1,2,3][5*5-25]`) require.NoError(t, err) diff --git a/optimizer/sum_array.go b/optimizer/sum_array.go new file mode 100644 index 000000000..0a05d1f2e --- /dev/null +++ b/optimizer/sum_array.go @@ -0,0 +1,37 @@ +package optimizer + +import ( + "fmt" + + . "github.com/expr-lang/expr/ast" +) + +type sumArray struct{} + +func (*sumArray) Visit(node *Node) { + if sumBuiltin, ok := (*node).(*BuiltinNode); ok && + sumBuiltin.Name == "sum" && + len(sumBuiltin.Arguments) == 1 { + if array, ok := sumBuiltin.Arguments[0].(*ArrayNode); ok && + len(array.Nodes) >= 2 { + Patch(node, sumArrayFold(array)) + } + } +} + +func sumArrayFold(array *ArrayNode) *BinaryNode { + if len(array.Nodes) > 2 { + return &BinaryNode{ + Operator: "+", + Left: array.Nodes[0], + Right: sumArrayFold(&ArrayNode{Nodes: array.Nodes[1:]}), + } + } else if len(array.Nodes) == 2 { + return &BinaryNode{ + Operator: "+", + Left: array.Nodes[0], + Right: array.Nodes[1], + } + } + panic(fmt.Errorf("sumArrayFold: invalid array length %d", len(array.Nodes))) +} diff --git a/optimizer/sum_array_test.go b/optimizer/sum_array_test.go new file mode 100644 index 000000000..e3dc83414 --- /dev/null +++ b/optimizer/sum_array_test.go @@ -0,0 +1,73 @@ +package optimizer_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/ast" + "github.com/expr-lang/expr/optimizer" + "github.com/expr-lang/expr/parser" + "github.com/expr-lang/expr/vm" +) + +func BenchmarkSumArray(b *testing.B) { + env := map[string]any{ + "a": 1, + "b": 2, + "c": 3, + "d": 4, + } + + program, err := expr.Compile(`sum([a, b, c, d])`, expr.Env(env)) + require.NoError(b, err) + + var out any + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, err = vm.Run(program, env) + } + b.StopTimer() + + require.NoError(b, err) + require.Equal(b, 10, out) + +} + +func TestOptimize_sum_array(t *testing.T) { + tree, err := parser.Parse(`sum([a, b])`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BinaryNode{ + Operator: "+", + Left: &ast.IdentifierNode{Value: "a"}, + Right: &ast.IdentifierNode{Value: "b"}, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} + +func TestOptimize_sum_array_3(t *testing.T) { + tree, err := parser.Parse(`sum([a, b, c])`) + require.NoError(t, err) + + err = optimizer.Optimize(&tree.Node, nil) + require.NoError(t, err) + + expected := &ast.BinaryNode{ + Operator: "+", + Left: &ast.IdentifierNode{Value: "a"}, + Right: &ast.BinaryNode{ + Operator: "+", + Left: &ast.IdentifierNode{Value: "b"}, + Right: &ast.IdentifierNode{Value: "c"}, + }, + } + + assert.Equal(t, ast.Dump(expected), ast.Dump(tree.Node)) +} From d236dcd5aebd19a53492aa8d4fbbca41aac171c8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Apr 2024 23:18:59 +0200 Subject: [PATCH 313/506] Code style --- optimizer/sum_array_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/optimizer/sum_array_test.go b/optimizer/sum_array_test.go index e3dc83414..09286c22b 100644 --- a/optimizer/sum_array_test.go +++ b/optimizer/sum_array_test.go @@ -33,7 +33,6 @@ func BenchmarkSumArray(b *testing.B) { require.NoError(b, err) require.Equal(b, 10, out) - } func TestOptimize_sum_array(t *testing.T) { From 725b7021c9f69b7aa6d37cd9502cab3d0ca2ab9d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Apr 2024 23:38:35 +0200 Subject: [PATCH 314/506] Make count() predicate optional --- checker/checker.go | 4 ++++ compiler/compiler.go | 6 +++++- docs/language-definition.md | 31 ++++++++++++++++++++++++++++--- expr_test.go | 4 ++++ parser/parser.go | 2 +- 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index a6daa27b9..ecf7a04d6 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -653,6 +653,10 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) } + if len(node.Arguments) == 1 { + return integerType, info{} + } + v.begin(collection) closure, _ := v.visit(node.Arguments[1]) v.end() diff --git a/compiler/compiler.go b/compiler/compiler.go index 07bc58b87..05a92f2fd 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -800,7 +800,11 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.compile(node.Arguments[0]) c.emit(OpBegin) c.emitLoop(func() { - c.compile(node.Arguments[1]) + if len(node.Arguments) == 2 { + c.compile(node.Arguments[1]) + } else { + c.emit(OpPointer) + } c.emitCond(func() { c.emit(OpIncrementCount) }) diff --git a/docs/language-definition.md b/docs/language-definition.md index a4e1a7cb0..0bc2bd0d2 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -628,14 +628,24 @@ Groups the elements of an array by the result of the [predicate](#predicate). groupBy(users, .Age) ``` -### count(array, predicate) {#count} +### count(array[, predicate]) {#count} Returns the number of elements what satisfies the [predicate](#predicate). +```expr +count(users, .Age > 18) +``` + Equivalent to: ```expr -len(filter(array, predicate)) +len(filter(users, .Age > 18)) +``` + +If the predicate is not given, returns the number of `true` elements in the array. + +```expr +count([true, false, true]) == 2 ``` ### concat(array1, array2[, ...]) {#concat} @@ -673,7 +683,7 @@ reduce(1..9, #acc + #) reduce(1..9, #acc + #, 0) ``` -### sum(array) {#sum} +### sum(array[, predicate]) {#sum} Returns the sum of all numbers in the array. @@ -681,6 +691,21 @@ Returns the sum of all numbers in the array. sum([1, 2, 3]) == 6 ``` +If the optional `predicate` argument is given, it is a predicate that is applied on each element +of the array before summing. + +```expr +sum(accounts, .Balance) +``` + +Equivalent to: + +```expr +reduce(accounts, #acc + .Balance, 0) +// or +sum(map(accounts, .Balance)) +``` + ### mean(array) {#mean} Returns the average of all numbers in the array. diff --git a/expr_test.go b/expr_test.go index 38b97eaa0..23f4c496f 100644 --- a/expr_test.go +++ b/expr_test.go @@ -905,6 +905,10 @@ func TestExpr(t *testing.T) { `count(1..30, {# % 3 == 0})`, 10, }, + { + `count([true, true, false])`, + 2, + }, { `"a" < "b"`, true, diff --git a/parser/parser.go b/parser/parser.go index 641369b1a..6d96561ad 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -33,7 +33,7 @@ var predicates = map[string]struct { "one": {[]arg{expr, closure}}, "filter": {[]arg{expr, closure}}, "map": {[]arg{expr, closure}}, - "count": {[]arg{expr, closure}}, + "count": {[]arg{expr, closure | optional}}, "sum": {[]arg{expr, closure | optional}}, "find": {[]arg{expr, closure}}, "findIndex": {[]arg{expr, closure}}, From b2a0c2aa070afd14706d9e200fb9c54e4e0578e5 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 13 Apr 2024 23:50:53 +0200 Subject: [PATCH 315/506] Add more optimizer tests --- optimizer/optimizer_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index e59d2c65d..3c7947c09 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -34,6 +34,8 @@ func TestOptimize(t *testing.T) { {`sum([a, b])`, 3}, {`sum([a, b, c])`, 6}, {`sum([a, b, c, 4])`, 10}, + {`sum(1..10, # * 1000)`, 55000}, + {`sum(map(1..10, # * 1000), # / 1000)`, float64(55)}, {`all(1..3, {# > 0}) && all(1..3, {# < 4})`, true}, {`all(1..3, {# > 2}) && all(1..3, {# < 4})`, false}, {`all(1..3, {# > 0}) && all(1..3, {# < 2})`, false}, From e6e376a17c1d38b24244697bdbfc9e8def035be3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 14 Apr 2024 08:56:31 +0200 Subject: [PATCH 316/506] Update sortBy docs --- docs/language-definition.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/language-definition.md b/docs/language-definition.md index 0bc2bd0d2..8e22d3b65 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -305,6 +305,7 @@ filter(posts, { any(.Comments, .Author == post.Author) }) ``` + ::: ## String Functions @@ -691,7 +692,7 @@ Returns the sum of all numbers in the array. sum([1, 2, 3]) == 6 ``` -If the optional `predicate` argument is given, it is a predicate that is applied on each element +If the optional `predicate` argument is given, it is a predicate that is applied on each element of the array before summing. ```expr @@ -765,14 +766,14 @@ sort([3, 1, 4]) == [1, 3, 4] sort([3, 1, 4], "desc") == [4, 3, 1] ``` -### sortBy(array, key[, order]) {#sortBy} +### sortBy(array[, predicate, order]) {#sortBy} -Sorts an array of maps by a specific key in ascending order. Optional `order` argument can be used to specify the order +Sorts an array by the result of the [predicate](#predicate). Optional `order` argument can be used to specify the order of sorting: `asc` or `desc`. ```expr -sortBy(users, "Age") -sortBy(users, "Age", "desc") +sortBy(users, .Age) +sortBy(users, .Age, "desc") ``` ## Map Functions From 5804ccb7188e1082fad1815c19d0d01cb876ee15 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 16 Apr 2024 23:11:01 +0200 Subject: [PATCH 317/506] Return proper nil from optional chain Fixes #570 --- compiler/compiler.go | 23 ++- compiler/compiler_test.go | 353 +++++++++++++++++++++----------------- expr_test.go | 17 ++ testdata/examples.txt | 37 +--- 4 files changed, 235 insertions(+), 195 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 05a92f2fd..1aa5ce188 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -92,6 +92,13 @@ type scope struct { index int } +func (c *compiler) nodeParent() ast.Node { + if len(c.nodes) > 1 { + return c.nodes[len(c.nodes)-2] + } + return nil +} + func (c *compiler) emitLocation(loc file.Location, op Opcode, arg int) int { c.bytecode = append(c.bytecode, op) current := len(c.bytecode) @@ -594,9 +601,21 @@ func isSimpleType(node ast.Node) bool { func (c *compiler) ChainNode(node *ast.ChainNode) { c.chains = append(c.chains, []int{}) c.compile(node.Node) - // Chain activate (got nit somewhere) for _, ph := range c.chains[len(c.chains)-1] { - c.patchJump(ph) + c.patchJump(ph) // If chain activated jump here (got nit somewhere). + } + parent := c.nodeParent() + if binary, ok := parent.(*ast.BinaryNode); ok && binary.Operator == "??" { + // If chain is used in nil coalescing operator, we can omit + // nil push at the end of the chain. The ?? operator will + // handle it. + } else { + // We need to put the nil on the stack, otherwise "typed" + // nil will be used as a result of the chain. + j := c.emit(OpJumpIfNotNil, placeholder) + c.emit(OpPop) + c.emit(OpNil) + c.patchJump(j) } c.chains = c.chains[:len(c.chains)-1] } diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index fbd83ec86..6fe58e930 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -198,8 +198,11 @@ func TestCompile(t *testing.T) { vm.OpLoadField, vm.OpJumpIfNil, vm.OpFetchField, + vm.OpJumpIfNotNil, + vm.OpPop, + vm.OpNil, }, - Arguments: []int{0, 1, 1}, + Arguments: []int{0, 1, 1, 2, 0, 0}, }, }, { @@ -219,8 +222,60 @@ func TestCompile(t *testing.T) { vm.OpLoadField, vm.OpJumpIfNil, vm.OpFetchField, + vm.OpJumpIfNotNil, + vm.OpPop, + vm.OpNil, + }, + Arguments: []int{0, 1, 1, 2, 0, 0}, + }, + }, + { + `A?.B`, + vm.Program{ + Constants: []any{ + &runtime.Field{ + Index: []int{0}, + Path: []string{"A"}, + }, + &runtime.Field{ + Index: []int{1}, + Path: []string{"B"}, + }, + }, + Bytecode: []vm.Opcode{ + vm.OpLoadField, + vm.OpJumpIfNil, + vm.OpFetchField, + vm.OpJumpIfNotNil, + vm.OpPop, + vm.OpNil, }, - Arguments: []int{0, 1, 1}, + Arguments: []int{0, 1, 1, 2, 0, 0}, + }, + }, + { + `A?.B ?? 42`, + vm.Program{ + Constants: []any{ + &runtime.Field{ + Index: []int{0}, + Path: []string{"A"}, + }, + &runtime.Field{ + Index: []int{1}, + Path: []string{"B"}, + }, + 42, + }, + Bytecode: []vm.Opcode{ + vm.OpLoadField, + vm.OpJumpIfNil, + vm.OpFetchField, + vm.OpJumpIfNotNil, + vm.OpPop, + vm.OpPush, + }, + Arguments: []int{0, 1, 1, 2, 0, 2}, }, }, { @@ -392,187 +447,176 @@ func TestCompile_optimizes_jumps(t *testing.T) { "c": true, "d": true, } - type op struct { - Bytecode vm.Opcode - Arg int - } tests := []struct { code string - want []op + want string }{ { `let foo = true; let bar = false; let baz = true; foo || bar || baz`, - []op{ - {vm.OpTrue, 0}, - {vm.OpStore, 0}, - {vm.OpFalse, 0}, - {vm.OpStore, 1}, - {vm.OpTrue, 0}, - {vm.OpStore, 2}, - {vm.OpLoadVar, 0}, - {vm.OpJumpIfTrue, 5}, - {vm.OpPop, 0}, - {vm.OpLoadVar, 1}, - {vm.OpJumpIfTrue, 2}, - {vm.OpPop, 0}, - {vm.OpLoadVar, 2}, - }, + `0 OpTrue +1 OpStore <0> foo +2 OpFalse +3 OpStore <1> bar +4 OpTrue +5 OpStore <2> baz +6 OpLoadVar <0> foo +7 OpJumpIfTrue <5> (13) +8 OpPop +9 OpLoadVar <1> bar +10 OpJumpIfTrue <2> (13) +11 OpPop +12 OpLoadVar <2> baz +`, }, { `a && b && c`, - []op{ - {vm.OpLoadFast, 0}, - {vm.OpJumpIfFalse, 5}, - {vm.OpPop, 0}, - {vm.OpLoadFast, 1}, - {vm.OpJumpIfFalse, 2}, - {vm.OpPop, 0}, - {vm.OpLoadFast, 2}, - }, + `0 OpLoadFast <0> a +1 OpJumpIfFalse <5> (7) +2 OpPop +3 OpLoadFast <1> b +4 OpJumpIfFalse <2> (7) +5 OpPop +6 OpLoadFast <2> c +`, }, { `a && b || c && d`, - []op{ - {vm.OpLoadFast, 0}, - {vm.OpJumpIfFalse, 2}, - {vm.OpPop, 0}, - {vm.OpLoadFast, 1}, - {vm.OpJumpIfTrue, 5}, - {vm.OpPop, 0}, - {vm.OpLoadFast, 2}, - {vm.OpJumpIfFalse, 2}, - {vm.OpPop, 0}, - {vm.OpLoadFast, 3}, - }, + `0 OpLoadFast <0> a +1 OpJumpIfFalse <2> (4) +2 OpPop +3 OpLoadFast <1> b +4 OpJumpIfTrue <5> (10) +5 OpPop +6 OpLoadFast <2> c +7 OpJumpIfFalse <2> (10) +8 OpPop +9 OpLoadFast <3> d +`, }, { `filter([1, 2, 3, 4, 5], # > 3 && # != 4 && # != 5)`, - []op{ - {vm.OpPush, 0}, - {vm.OpBegin, 0}, - {vm.OpJumpIfEnd, 26}, - {vm.OpPointer, 0}, - {vm.OpDeref, 0}, - {vm.OpPush, 1}, - {vm.OpMore, 0}, - {vm.OpJumpIfFalse, 18}, - {vm.OpPop, 0}, - {vm.OpPointer, 0}, - {vm.OpDeref, 0}, - {vm.OpPush, 2}, - {vm.OpEqual, 0}, - {vm.OpNot, 0}, - {vm.OpJumpIfFalse, 11}, - {vm.OpPop, 0}, - {vm.OpPointer, 0}, - {vm.OpDeref, 0}, - {vm.OpPush, 3}, - {vm.OpEqual, 0}, - {vm.OpNot, 0}, - {vm.OpJumpIfFalse, 4}, - {vm.OpPop, 0}, - {vm.OpIncrementCount, 0}, - {vm.OpPointer, 0}, - {vm.OpJump, 1}, - {vm.OpPop, 0}, - {vm.OpIncrementIndex, 0}, - {vm.OpJumpBackward, 27}, - {vm.OpGetCount, 0}, - {vm.OpEnd, 0}, - {vm.OpArray, 0}, - }, + `0 OpPush <0> [1 2 3 4 5] +1 OpBegin +2 OpJumpIfEnd <26> (29) +3 OpPointer +4 OpDeref +5 OpPush <1> 3 +6 OpMore +7 OpJumpIfFalse <18> (26) +8 OpPop +9 OpPointer +10 OpDeref +11 OpPush <2> 4 +12 OpEqual +13 OpNot +14 OpJumpIfFalse <11> (26) +15 OpPop +16 OpPointer +17 OpDeref +18 OpPush <3> 5 +19 OpEqual +20 OpNot +21 OpJumpIfFalse <4> (26) +22 OpPop +23 OpIncrementCount +24 OpPointer +25 OpJump <1> (27) +26 OpPop +27 OpIncrementIndex +28 OpJumpBackward <27> (2) +29 OpGetCount +30 OpEnd +31 OpArray +`, }, { `let foo = true; let bar = false; let baz = true; foo && bar || baz`, - []op{ - {vm.OpTrue, 0}, - {vm.OpStore, 0}, - {vm.OpFalse, 0}, - {vm.OpStore, 1}, - {vm.OpTrue, 0}, - {vm.OpStore, 2}, - {vm.OpLoadVar, 0}, - {vm.OpJumpIfFalse, 2}, - {vm.OpPop, 0}, - {vm.OpLoadVar, 1}, - {vm.OpJumpIfTrue, 2}, - {vm.OpPop, 0}, - {vm.OpLoadVar, 2}, - }, + `0 OpTrue +1 OpStore <0> foo +2 OpFalse +3 OpStore <1> bar +4 OpTrue +5 OpStore <2> baz +6 OpLoadVar <0> foo +7 OpJumpIfFalse <2> (10) +8 OpPop +9 OpLoadVar <1> bar +10 OpJumpIfTrue <2> (13) +11 OpPop +12 OpLoadVar <2> baz +`, }, { `true ?? nil ?? nil ?? nil`, - []op{ - {vm.OpTrue, 0}, - {vm.OpJumpIfNotNil, 8}, - {vm.OpPop, 0}, - {vm.OpNil, 0}, - {vm.OpJumpIfNotNil, 5}, - {vm.OpPop, 0}, - {vm.OpNil, 0}, - {vm.OpJumpIfNotNil, 2}, - {vm.OpPop, 0}, - {vm.OpNil, 0}, - }, + `0 OpTrue +1 OpJumpIfNotNil <8> (10) +2 OpPop +3 OpNil +4 OpJumpIfNotNil <5> (10) +5 OpPop +6 OpNil +7 OpJumpIfNotNil <2> (10) +8 OpPop +9 OpNil +`, }, { `let m = {"a": {"b": {"c": 1}}}; m?.a?.b?.c`, - []op{ - {vm.OpPush, 0}, - {vm.OpPush, 1}, - {vm.OpPush, 2}, - {vm.OpPush, 3}, - {vm.OpPush, 3}, - {vm.OpMap, 0}, - {vm.OpPush, 3}, - {vm.OpMap, 0}, - {vm.OpPush, 3}, - {vm.OpMap, 0}, - {vm.OpStore, 0}, - {vm.OpLoadVar, 0}, - {vm.OpJumpIfNil, 8}, - {vm.OpPush, 0}, - {vm.OpFetch, 0}, - {vm.OpJumpIfNil, 5}, - {vm.OpPush, 1}, - {vm.OpFetch, 0}, - {vm.OpJumpIfNil, 2}, - {vm.OpPush, 2}, - {vm.OpFetch, 0}, - }, + `0 OpPush <0> a +1 OpPush <1> b +2 OpPush <2> c +3 OpPush <3> 1 +4 OpPush <3> 1 +5 OpMap +6 OpPush <3> 1 +7 OpMap +8 OpPush <3> 1 +9 OpMap +10 OpStore <0> m +11 OpLoadVar <0> m +12 OpJumpIfNil <8> (21) +13 OpPush <0> a +14 OpFetch +15 OpJumpIfNil <5> (21) +16 OpPush <1> b +17 OpFetch +18 OpJumpIfNil <2> (21) +19 OpPush <2> c +20 OpFetch +21 OpJumpIfNotNil <2> (24) +22 OpPop +23 OpNil +`, }, { `-1 not in [1, 2, 5]`, - []op{ - {vm.OpPush, 0}, - {vm.OpPush, 1}, - {vm.OpIn, 0}, - {vm.OpNot, 0}, - }, + `0 OpPush <0> -1 +1 OpPush <1> map[1:{} 2:{} 5:{}] +2 OpIn +3 OpNot +`, }, { `1 + 8 not in [1, 2, 5]`, - []op{ - {vm.OpPush, 0}, - {vm.OpPush, 1}, - {vm.OpIn, 0}, - {vm.OpNot, 0}, - }, + `0 OpPush <0> 9 +1 OpPush <1> map[1:{} 2:{} 5:{}] +2 OpIn +3 OpNot +`, }, { `true ? false : 8 not in [1, 2, 5]`, - []op{ - {vm.OpTrue, 0}, - {vm.OpJumpIfFalse, 3}, - {vm.OpPop, 0}, - {vm.OpFalse, 0}, - {vm.OpJump, 5}, - {vm.OpPop, 0}, - {vm.OpPush, 0}, - {vm.OpPush, 1}, - {vm.OpIn, 0}, - {vm.OpNot, 0}, - }, + `0 OpTrue +1 OpJumpIfFalse <3> (5) +2 OpPop +3 OpFalse +4 OpJump <5> (10) +5 OpPop +6 OpPush <0> 8 +7 OpPush <1> map[1:{} 2:{} 5:{}] +8 OpIn +9 OpNot +`, }, } @@ -580,12 +624,7 @@ func TestCompile_optimizes_jumps(t *testing.T) { t.Run(test.code, func(t *testing.T) { program, err := expr.Compile(test.code, expr.Env(env)) require.NoError(t, err) - - require.Equal(t, len(test.want), len(program.Bytecode)) - for i, op := range test.want { - require.Equal(t, op.Bytecode, program.Bytecode[i]) - require.Equalf(t, op.Arg, program.Arguments[i], "at %d", i) - } + require.Equal(t, test.want, program.Disassemble()) }) } } diff --git a/expr_test.go b/expr_test.go index 23f4c496f..df4eba505 100644 --- a/expr_test.go +++ b/expr_test.go @@ -2602,3 +2602,20 @@ func TestArrayComparison(t *testing.T) { }) } } + +func TestIssue_570(t *testing.T) { + type Student struct { + Name string + } + + env := map[string]any{ + "student": (*Student)(nil), + } + + program, err := expr.Compile("student?.Name", expr.Env(env)) + require.NoError(t, err) + + out, err := expr.Run(program, env) + require.NoError(t, err) + require.IsType(t, nil, out) +} diff --git a/testdata/examples.txt b/testdata/examples.txt index 5b9d2cdde..b02094a7c 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -3070,11 +3070,8 @@ all(array, not true) all(array, ok) all(false ? add : "bar", ok) all(filter(array, true), ok) -all(groupBy(array, #)?.f32, #) all(groupBy(array, f32).score, 0.5 in #?.f64) -all(groupBy(array, foo)?.i64, none(.div, true == #)) all(groupBy(list, #).i, #?.half() not in # + #) -all(groupBy(list, #)?.add, #?.f64.i64(f32 startsWith #, div)) all(i32 .. 1, ok) all(list, !false) all(list, "bar" in #) @@ -3242,7 +3239,6 @@ any(array, one(array, ok)) any(array, score != add) any(array, score == half) any(array, score == nil) -any(groupBy(list, #)?.Bar, #) any(i32 .. i, half == half) any(list, !ok) any(list, !true) @@ -3992,9 +3988,7 @@ count(array, reduce(list, false)) count(array, true == ok) count(array, true) / f64 count(filter(list, true), ok) -count(groupBy(array, #)?.String, #) count(groupBy(list, #).String, .div?.array) -count(groupBy(list, #)?.list, #?.Qux) count(i .. 1, # == i) count(i .. i, ok) count(i32 .. i, # >= #) @@ -5652,12 +5646,7 @@ filter(array, true == true) filter(array, true and true) filter(false ? ok : array, # == nil) filter(filter(list, true), ok) -filter(groupBy(array, #).greet, # matches #?.score) -filter(groupBy(array, #)?.div, .Qux(#).array) -filter(groupBy(array, f64)?.f32, #) filter(groupBy(list, #).f64, # not matches #?.foo) -filter(groupBy(list, #)?.f64, .foo) -filter(groupBy(list, 0.5)?.i, #) filter(i .. i64, ok) filter(list, !ok) filter(list, !true) @@ -6033,13 +6022,9 @@ findIndex(filter(array, false), # > 1) findIndex(filter(array, true), # not in array) findIndex(filter(list, false), 1 <= i64) findIndex(groupBy(array, #).f64, .Bar(half(add, half, div, greet, f64))) -findIndex(groupBy(array, #)?.greet, .f64(foo(array, #), # != "bar")) findIndex(groupBy(array, false).String, #?.i64()) findIndex(groupBy(array, foo).String, #) findIndex(groupBy(list, #).Qux, #) -findIndex(groupBy(list, #)?.Qux, #) -findIndex(groupBy(list, #)?.i64, #) -findIndex(groupBy(list, true)?.list, get(false ? # : #, score(#, Bar, half, #))) findIndex(i32 .. 1, # >= #) findIndex(list, !false) findIndex(list, !ok) @@ -6198,13 +6183,9 @@ findLast(array, score != div) findLast(array, score != nil) findLast(array, true) % i64 findLast(groupBy(array, #).i32, #) -findLast(groupBy(array, f64)?.score, #) findLast(groupBy(list, "bar").div, #?.f32?.half()) findLast(groupBy(list, #)[ok], .ok) -findLast(groupBy(list, 0.5)?.String, #?.half(Bar)) -findLast(groupBy(list, 0.5)?.f32, ok) findLast(groupBy(list, f64).foo, .f32(#, #)?.Qux(#?.i64(add, nil))) -findLast(groupBy(list, f64)?.Bar, #) findLast(i .. 1, # < #) findLast(i .. i32, # != i64) findLast(i .. i32, ok) @@ -6379,12 +6360,7 @@ findLastIndex(array, true == false) findLastIndex(array, true) / f32 findLastIndex(array, true) not in array findLastIndex(filter(array, false), ok) -findLastIndex(groupBy(array, "foo")?.add, #[list]) -findLastIndex(groupBy(array, #)?.foo, #) -findLastIndex(groupBy(array, #)?.i32, not #) -findLastIndex(groupBy(array, #)?.score, #) findLastIndex(groupBy(list, #).ok, #) -findLastIndex(groupBy(list, #)?.String, # + #.add) findLastIndex(groupBy(list, 0.5).Bar, #?.String endsWith .f32(list)) findLastIndex(i32 .. i32, ok) findLastIndex(i64 .. 1, ok) @@ -7208,7 +7184,7 @@ fromJSON(toJSON(nil)) fromJSON(toJSON(true)) fromPairs(filter(array, false)) fromPairs(filter(list, false)) -fromPairs(groupBy(array, #)?.String) +fromPairs(groupBy(array, #).String) get(["foo"], i32) get(array, -1) get(array, -i32) @@ -8388,8 +8364,6 @@ groupBy(filter(array, true), f64) groupBy(filter(list, ok), #) groupBy(groupBy(array, "foo").list, #) groupBy(groupBy(array, #).i32, add) -groupBy(groupBy(array, 0.5)?.div, get(.foo(add, false), none(#, foo))) -groupBy(groupBy(array, f64)?.ok, .Bar()?.Bar) groupBy(groupBy(array, ok).Bar, #?.array not matches #) groupBy(groupBy(array, true).f64, #[#]) groupBy(i .. 1, !ok)?.f64 @@ -12816,8 +12790,6 @@ map(groupBy(array, #).String, i32) map(groupBy(array, #).greet, foo.Qux(.f32)) map(groupBy(array, #).greet, score) map(groupBy(array, #).score, #?.list()) -map(groupBy(array, 0.5)?.i64, .Qux()) -map(groupBy(array, f64)?.array, first(.div())) map(groupBy(list, i32).i, #) map(i .. 1, -#) map(i .. 1, 0.5 ^ #) @@ -13465,7 +13437,6 @@ mean(array) >= i64 mean(array) ^ i mean(array) ^ i32 mean(filter(array, true)) -mean(groupBy(array, #)?.half) mean(groupBy(array, i64).score) mean(i .. 1) mean(i .. i) @@ -13981,9 +13952,6 @@ none(array, ok) none(array, reduce(array, true)) none(filter(array, # >= f64), ok) none(groupBy(array, #).f64, # or #.Bar) -none(groupBy(array, #)?.array, fromJSON(#)) -none(groupBy(array, #)?.f32, #) -none(groupBy(array, #)?.greet, #) none(groupBy(list, #).div, ok) none(groupBy(list, #).greet, #) none(groupBy(list, 0.5).i, ok) @@ -15298,10 +15266,8 @@ one(array, true == nil) one(array, true) ? greet : add one(array, true) or 1 != nil one(false ? greet : "bar", f64 != #) -one(groupBy(array, 0.5)?.String, #) one(groupBy(array, f64).array, .i(nil).ok) one(groupBy(list, ok).foo, .add?.array) -one(groupBy(list, ok)?.score, .i64()) one(i32 .. 1, # == #) one(i32 .. i32, not ok) one(i64 .. 1, # >= 1) @@ -17297,7 +17263,6 @@ sum(array) ^ f64 sum(array) not in array sum(filter(array, ok)) sum(groupBy(array, i32).String) -sum(groupBy(list, #)?.greet) sum(i32 .. 1) sum(i64 .. i32) sum(i64 .. i64) From 61573950f69c945c0607828ea8fd01fff95dc54b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 16 Apr 2024 23:23:12 +0200 Subject: [PATCH 318/506] Fix printing on conditional/binary nodes Fixes #613 --- ast/print.go | 27 ++++++++++++++++++--------- ast/print_test.go | 1 + expr_test.go | 9 +++++++++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/ast/print.go b/ast/print.go index 063e9eb27..394e0c1ad 100644 --- a/ast/print.go +++ b/ast/print.go @@ -65,8 +65,7 @@ func (n *BinaryNode) String() string { var lhs, rhs string var lwrap, rwrap bool - lb, ok := n.Left.(*BinaryNode) - if ok { + if lb, ok := n.Left.(*BinaryNode); ok { if operator.Less(lb.Operator, n.Operator) { lwrap = true } @@ -77,9 +76,7 @@ func (n *BinaryNode) String() string { lwrap = true } } - - rb, ok := n.Right.(*BinaryNode) - if ok { + if rb, ok := n.Right.(*BinaryNode); ok { if operator.Less(rb.Operator, n.Operator) { rwrap = true } @@ -88,6 +85,13 @@ func (n *BinaryNode) String() string { } } + if _, ok := n.Left.(*ConditionalNode); ok { + lwrap = true + } + if _, ok := n.Right.(*ConditionalNode); ok { + rwrap = true + } + if lwrap { lhs = fmt.Sprintf("(%s)", n.Left.String()) } else { @@ -108,20 +112,25 @@ func (n *ChainNode) String() string { } func (n *MemberNode) String() string { + node := n.Node.String() + if _, ok := n.Node.(*BinaryNode); ok { + node = fmt.Sprintf("(%s)", node) + } + if n.Optional { if str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) { - return fmt.Sprintf("%s?.%s", n.Node.String(), str.Value) + return fmt.Sprintf("%s?.%s", node, str.Value) } else { - return fmt.Sprintf("%s?.[%s]", n.Node.String(), n.Property.String()) + return fmt.Sprintf("%s?.[%s]", node, n.Property.String()) } } if str, ok := n.Property.(*StringNode); ok && utils.IsValidIdentifier(str.Value) { if _, ok := n.Node.(*PointerNode); ok { return fmt.Sprintf(".%s", str.Value) } - return fmt.Sprintf("%s.%s", n.Node.String(), str.Value) + return fmt.Sprintf("%s.%s", node, str.Value) } - return fmt.Sprintf("%s[%s]", n.Node.String(), n.Property.String()) + return fmt.Sprintf("%s[%s]", node, n.Property.String()) } func (n *SliceNode) String() string { diff --git a/ast/print_test.go b/ast/print_test.go index d9e55c2ea..373030a4f 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -72,6 +72,7 @@ func TestPrint(t *testing.T) { {`a[:]`, `a[:]`}, {`(nil ?? 1) > 0`, `(nil ?? 1) > 0`}, {`{("a" + "b"): 42}`, `{("a" + "b"): 42}`}, + {`(One == 1 ? true : false) && Two == 2`, `(One == 1 ? true : false) && Two == 2`}, } for _, tt := range tests { diff --git a/expr_test.go b/expr_test.go index df4eba505..4b4e2edf1 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1298,6 +1298,15 @@ func TestExpr(t *testing.T) { require.NoError(t, err, "eval") assert.Equal(t, tt.want, got, "eval") } + { + program, err := expr.Compile(tt.code, expr.Env(mock.Env{}), expr.Optimize(false)) + require.NoError(t, err) + + code := program.Node().String() + got, err := expr.Eval(code, env) + require.NoError(t, err, code) + assert.Equal(t, tt.want, got, code) + } }) } } From ae2a9dfc6feec03664657729ffd7a79b91528fbf Mon Sep 17 00:00:00 2001 From: gnolizuh Date: Mon, 22 Apr 2024 18:05:36 +0800 Subject: [PATCH 319/506] New usage case: xiaohongshu.com (#631) add company usecase of xiaohongshu.com Signed-off-by: gnolizuh --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1a2d7dc83..5a587162c 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,7 @@ func main() { * [Akvorado](https://github.com/akvorado/akvorado) utilizes Expr to classify exporters and interfaces in network flows. * [keda.sh](https://keda.sh) uses Expr to allow customization of its Kubernetes-based event-driven autoscaling. * [Span Digital](https://spandigital.com/) uses Expr in it's Knowledge Management products. +* [Xiaohongshu](https://www.xiaohongshu.com/) combining yaml with Expr for dynamically policies delivery. [Add your company too](https://github.com/expr-lang/expr/edit/master/README.md) From e6dfb719a733a1751b0d4dc3ec21d93bacdff3e0 Mon Sep 17 00:00:00 2001 From: "Christian G. Warden" Date: Wed, 24 Apr 2024 07:08:49 -0500 Subject: [PATCH 320/506] Preserve The Specified Timezone In Parse (#633) * Preserve The Specified Timezone In Parse When parsing a string into a Time using the optional timezone parameter, set the location of the Time to the timezone's location so that Format uses that timezone. * Add More Tests for Preserving Timezone Add test when timezone is used to parse a date-time. Add test when timezone is irrelevant because it's a date. --- builtin/builtin.go | 1 + builtin/builtin_test.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index efc01fc2f..1199f59c5 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -502,6 +502,7 @@ var Builtins = []*Function{ if err != nil { return nil, err } + t = t.In(tz) return t, nil } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 307d4a86a..dca4bccfb 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -113,6 +113,9 @@ func TestBuiltin(t *testing.T) { {`duration("1h")`, time.Hour}, {`date("2006-01-02T15:04:05Z")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)}, {`date("2006.01.02", "2006.01.02")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)}, + {`date("2023-04-23T00:30:00.000+0100", "2006-01-02T15:04:05-0700", "America/Chicago").Format("2006-01-02")`, "2023-04-22"}, + {`date("2023-04-23T00:30:00", "2006-01-02T15:04:05", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, + {`date("2023-04-23", "2006-01-02", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, {`first(ArrayOfString)`, "foo"}, {`first(ArrayOfInt)`, 1}, {`first(ArrayOfAny)`, 1}, From 9207e712c128c85065a419dd6c7b01656ef63758 Mon Sep 17 00:00:00 2001 From: Ganesan Karuppasamy Date: Wed, 8 May 2024 00:37:12 +0530 Subject: [PATCH 321/506] Resolve double-escaping issue with pair node key (#640) * Resolve double-escaping issue with pair node key * Resolve double-escaping issue with pair node key * Added test cases for pair node key --- ast/print.go | 2 +- ast/print_test.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ast/print.go b/ast/print.go index 394e0c1ad..6a7d698a9 100644 --- a/ast/print.go +++ b/ast/print.go @@ -215,7 +215,7 @@ func (n *PairNode) String() string { if utils.IsValidIdentifier(str.Value) { return fmt.Sprintf("%s: %s", str.Value, n.Value.String()) } - return fmt.Sprintf("%q: %s", str.String(), n.Value.String()) + return fmt.Sprintf("%s: %s", str.String(), n.Value.String()) } return fmt.Sprintf("(%s): %s", n.Key.String(), n.Value.String()) } diff --git a/ast/print_test.go b/ast/print_test.go index 373030a4f..4ad49714c 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -57,6 +57,10 @@ func TestPrint(t *testing.T) { {`{}`, `{}`}, {`{a: b}`, `{a: b}`}, {`{a: b, c: d}`, `{a: b, c: d}`}, + {`{"a": b, 'c': d}`, `{a: b, c: d}`}, + {`{"a": b, c: d}`, `{a: b, c: d}`}, + {`{"a": b, 8: 8}`, `{a: b, "8": 8}`}, + {`{"9": 9, '8': 8, "foo": d}`, `{"9": 9, "8": 8, foo: d}`}, {`[]`, `[]`}, {`[a]`, `[a]`}, {`[a, b]`, `[a, b]`}, From 1f31cc5a5e412d6444fc95a2aa414a8e2d2f3f8d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 7 May 2024 21:36:22 +0200 Subject: [PATCH 322/506] Add timezone() builtin --- builtin/builtin.go | 11 +++++++++++ builtin/builtin_test.go | 2 ++ docs/language-definition.md | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index 1199f59c5..4995e75c7 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -529,6 +529,17 @@ var Builtins = []*Function{ new(func(string, string, string) time.Time), ), }, + { + Name: "timezone", + Func: func(args ...any) (any, error) { + tz, err := time.LoadLocation(args[0].(string)) + if err != nil { + return nil, err + } + return tz, nil + }, + Types: types(time.LoadLocation), + }, { Name: "first", Func: func(args ...any) (any, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index dca4bccfb..fc2395f7c 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -116,6 +116,8 @@ func TestBuiltin(t *testing.T) { {`date("2023-04-23T00:30:00.000+0100", "2006-01-02T15:04:05-0700", "America/Chicago").Format("2006-01-02")`, "2023-04-22"}, {`date("2023-04-23T00:30:00", "2006-01-02T15:04:05", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, {`date("2023-04-23", "2006-01-02", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, + {`timezone("UTC").String()`, "UTC"}, + {`timezone("Europe/Moscow").String()`, "Europe/Moscow"}, {`first(ArrayOfString)`, "foo"}, {`first(ArrayOfInt)`, 1}, {`first(ArrayOfAny)`, 1}, diff --git a/docs/language-definition.md b/docs/language-definition.md index 8e22d3b65..251f84552 100644 --- a/docs/language-definition.md +++ b/docs/language-definition.md @@ -484,6 +484,38 @@ date("2023-08-14T00:00:00Z") date("2023-08-14 00:00:00", "2006-01-02 15:04:05", "Europe/Zurich") ``` +Available methods on the date: + +- `Year()` - returns the year +- `Month()` - returns the month (starting from 1) +- `Day()` - returns the day of the month +- `Hour()` - returns the hour +- `Minute()` - returns the minute +- `Second()` - returns the second +- `Weekday()` - returns the day of the week +- `YearDay()` - returns the day of the year +- and [more](https://pkg.go.dev/time#Time). + +```expr +date("2023-08-14").Year() == 2023 +``` + +### timezone(str) {#timezone} + +Returns the timezone of the given string `str`. List of available timezones can be +found [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). + +```expr +timezone("Europe/Zurich") +timezone("UTC") +``` + +To convert a date to a different timezone, use the [`In()`](https://pkg.go.dev/time#Time.In) method: + +```expr +date("2023-08-14 00:00:00").In(timezone("Europe/Zurich")) +``` + ## Number Functions ### max(n1, n2) {#max} From 5b538a702257cf354bf175eb9f2f3905bb8bf118 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 7 May 2024 23:19:39 +0200 Subject: [PATCH 323/506] Add default timezone option expr.Timezone() --- builtin/builtin.go | 60 +++++++++++++++++++++++++++++------ builtin/builtin_test.go | 1 + builtin/utils.go | 13 +++++--- expr.go | 12 +++++++ expr_test.go | 17 ++++++++++ patcher/with_timezone.go | 25 +++++++++++++++ patcher/with_timezone_test.go | 28 ++++++++++++++++ testdata/examples.txt | 1 - 8 files changed, 141 insertions(+), 16 deletions(-) create mode 100644 patcher/with_timezone.go create mode 100644 patcher/with_timezone_test.go diff --git a/builtin/builtin.go b/builtin/builtin.go index 4995e75c7..38a6f2f3f 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -472,9 +472,27 @@ var Builtins = []*Function{ { Name: "now", Func: func(args ...any) (any, error) { - return time.Now(), nil + if len(args) == 0 { + return time.Now(), nil + } + if len(args) == 1 { + if tz, ok := args[0].(*time.Location); ok { + return time.Now().In(tz), nil + } + } + return nil, fmt.Errorf("invalid number of arguments (expected 0, got %d)", len(args)) + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) == 0 { + return timeType, nil + } + if len(args) == 1 { + if args[0].AssignableTo(locationType) { + return timeType, nil + } + } + return anyType, fmt.Errorf("invalid number of arguments (expected 0, got %d)", len(args)) }, - Types: types(new(func() time.Time)), }, { Name: "duration", @@ -486,9 +504,17 @@ var Builtins = []*Function{ { Name: "date", Func: func(args ...any) (any, error) { + tz, ok := args[0].(*time.Location) + if ok { + args = args[1:] + } + date := args[0].(string) if len(args) == 2 { layout := args[1].(string) + if tz != nil { + return time.ParseInLocation(layout, date, tz) + } return time.Parse(layout, date) } if len(args) == 3 { @@ -516,18 +542,32 @@ var Builtins = []*Function{ time.RFC1123, } for _, layout := range layouts { - t, err := time.Parse(layout, date) - if err == nil { - return t, nil + if tz == nil { + t, err := time.Parse(layout, date) + if err == nil { + return t, nil + } + } else { + t, err := time.ParseInLocation(layout, date, tz) + if err == nil { + return t, nil + } } } return nil, fmt.Errorf("invalid date %s", date) }, - Types: types( - new(func(string) time.Time), - new(func(string, string) time.Time), - new(func(string, string, string) time.Time), - ), + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) < 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected at least 1, got %d)", len(args)) + } + if args[0].AssignableTo(locationType) { + args = args[1:] + } + if len(args) > 3 { + return anyType, fmt.Errorf("invalid number of arguments (expected at most 3, got %d)", len(args)) + } + return timeType, nil + }, }, { Name: "timezone", diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index fc2395f7c..09a13b9f8 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -170,6 +170,7 @@ func TestBuiltin_works_with_any(t *testing.T) { config := map[string]struct { arity int }{ + "now": {0}, "get": {2}, "take": {2}, "sortBy": {2}, diff --git a/builtin/utils.go b/builtin/utils.go index 7d3b6ee8e..29a95731a 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -3,14 +3,17 @@ package builtin import ( "fmt" "reflect" + "time" ) var ( - anyType = reflect.TypeOf(new(any)).Elem() - integerType = reflect.TypeOf(0) - floatType = reflect.TypeOf(float64(0)) - arrayType = reflect.TypeOf([]any{}) - mapType = reflect.TypeOf(map[any]any{}) + anyType = reflect.TypeOf(new(any)).Elem() + integerType = reflect.TypeOf(0) + floatType = reflect.TypeOf(float64(0)) + arrayType = reflect.TypeOf([]any{}) + mapType = reflect.TypeOf(map[any]any{}) + timeType = reflect.TypeOf(new(time.Time)).Elem() + locationType = reflect.TypeOf(new(time.Location)) ) func kind(t reflect.Type) reflect.Kind { diff --git a/expr.go b/expr.go index ba786c017..83e0a167e 100644 --- a/expr.go +++ b/expr.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "reflect" + "time" "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/builtin" @@ -183,6 +184,17 @@ func WithContext(name string) Option { }) } +// Timezone sets default timezone for date() and now() builtin functions. +func Timezone(name string) Option { + tz, err := time.LoadLocation(name) + if err != nil { + panic(err) + } + return Patch(patcher.WithTimezone{ + Location: tz, + }) +} + // Compile parses and compiles given input expression to bytecode program. func Compile(input string, ops ...Option) (*vm.Program, error) { config := conf.CreateNew() diff --git a/expr_test.go b/expr_test.go index 4b4e2edf1..889d82b32 100644 --- a/expr_test.go +++ b/expr_test.go @@ -584,6 +584,23 @@ func ExampleWithContext() { // Output: 42 } +func ExampleWithTimezone() { + program, err := expr.Compile(`now().Location().String()`, expr.Timezone("Asia/Kamchatka")) + if err != nil { + fmt.Printf("%v", err) + return + } + + output, err := expr.Run(program, nil) + if err != nil { + fmt.Printf("%v", err) + return + } + + fmt.Printf("%v", output) + // Output: Asia/Kamchatka +} + func TestExpr_readme_example(t *testing.T) { env := map[string]any{ "greet": "Hello, %v!", diff --git a/patcher/with_timezone.go b/patcher/with_timezone.go new file mode 100644 index 000000000..83eb28e95 --- /dev/null +++ b/patcher/with_timezone.go @@ -0,0 +1,25 @@ +package patcher + +import ( + "time" + + "github.com/expr-lang/expr/ast" +) + +// WithTimezone passes Location to date() and now() functions. +type WithTimezone struct { + Location *time.Location +} + +func (t WithTimezone) Visit(node *ast.Node) { + if btin, ok := (*node).(*ast.BuiltinNode); ok { + switch btin.Name { + case "date", "now": + loc := &ast.ConstantNode{Value: t.Location} + ast.Patch(node, &ast.BuiltinNode{ + Name: btin.Name, + Arguments: append([]ast.Node{loc}, btin.Arguments...), + }) + } + } +} diff --git a/patcher/with_timezone_test.go b/patcher/with_timezone_test.go new file mode 100644 index 000000000..2cd099f20 --- /dev/null +++ b/patcher/with_timezone_test.go @@ -0,0 +1,28 @@ +package patcher_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/expr-lang/expr" +) + +func TestWithTimezone_date(t *testing.T) { + program, err := expr.Compile(`date("2024-05-07 23:00:00")`, expr.Timezone("Europe/Zurich")) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + require.NoError(t, err) + require.Equal(t, "2024-05-07T23:00:00+02:00", out.(time.Time).Format(time.RFC3339)) +} + +func TestWithTimezone_now(t *testing.T) { + program, err := expr.Compile(`now()`, expr.Timezone("Asia/Kamchatka")) + require.NoError(t, err) + + out, err := expr.Run(program, nil) + require.NoError(t, err) + require.Equal(t, "Asia/Kamchatka", out.(time.Time).Location().String()) +} diff --git a/testdata/examples.txt b/testdata/examples.txt index b02094a7c..9c18442e4 100644 --- a/testdata/examples.txt +++ b/testdata/examples.txt @@ -7231,7 +7231,6 @@ get(false ? f64 : 1, ok) get(false ? f64 : score, add) get(false ? false : f32, i) get(false ? i32 : list, i64) -get(false ? i32 : ok, now(div, array)) get(false ? i64 : foo, Bar) get(false ? i64 : true, f64) get(false ? score : ok, trimSuffix("bar", "bar")) From 9a4b529a9d84664b70e6c28ec882acfe90b8fa21 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 8 May 2024 00:24:35 +0200 Subject: [PATCH 324/506] Vendor testify (#642) --- ast/print_test.go | 4 +- ast/visitor_test.go | 3 +- bench_test.go | 2 +- builtin/builtin_test.go | 4 +- checker/checker_test.go | 4 +- checker/info_test.go | 2 +- compiler/compiler_test.go | 4 +- debug/go.sum | 4 - docgen/docgen_test.go | 5 +- expr_test.go | 4 +- file/source_test.go | 2 +- go.mod | 8 - go.sum | 10 - internal/deref/deref_test.go | 2 +- internal/difflib/difflib.go | 775 ++++ internal/difflib/difflib_test.go | 426 +++ internal/spew/bypass.go | 146 + internal/spew/bypasssafe.go | 39 + internal/spew/common.go | 341 ++ internal/spew/common_test.go | 298 ++ internal/spew/config.go | 306 ++ internal/spew/doc.go | 217 ++ internal/spew/dump.go | 509 +++ internal/spew/dump_test.go | 1042 ++++++ internal/spew/dumpcgo_test.go | 102 + internal/spew/dumpnocgo_test.go | 27 + internal/spew/example_test.go | 226 ++ internal/spew/format.go | 419 +++ internal/spew/format_test.go | 1558 ++++++++ internal/spew/internal_test.go | 84 + internal/spew/internalunsafe_test.go | 102 + internal/spew/spew.go | 148 + internal/spew/spew_test.go | 320 ++ internal/spew/testdata/dumpcgo.go | 83 + internal/testify/assert/assertion_compare.go | 489 +++ .../testify/assert/assertion_compare_test.go | 472 +++ internal/testify/assert/assertion_format.go | 807 +++++ .../testify/assert/assertion_format.go.tmpl | 5 + internal/testify/assert/assertion_forward.go | 1605 +++++++++ .../testify/assert/assertion_forward.go.tmpl | 5 + internal/testify/assert/assertion_order.go | 81 + .../testify/assert/assertion_order_test.go | 203 ++ internal/testify/assert/assertions.go | 2091 +++++++++++ internal/testify/assert/assertions_test.go | 3155 +++++++++++++++++ internal/testify/assert/doc.go | 46 + internal/testify/assert/errors.go | 10 + internal/testify/assert/forward_assertions.go | 16 + .../testify/assert/forward_assertions_test.go | 654 ++++ internal/testify/assert/http_assertions.go | 165 + .../testify/assert/http_assertions_test.go | 214 ++ .../assert/internal/unsafetests/doc.go | 4 + .../internal/unsafetests/unsafetests_test.go | 34 + internal/testify/require/doc.go | 29 + .../testify/require/forward_requirements.go | 16 + .../require/forward_requirements_test.go | 397 +++ internal/testify/require/require.go | 2039 +++++++++++ internal/testify/require/require.go.tmpl | 6 + internal/testify/require/require_forward.go | 1607 +++++++++ .../testify/require/require_forward.go.tmpl | 5 + internal/testify/require/requirements.go | 29 + internal/testify/require/requirements_test.go | 578 +++ optimizer/optimizer_test.go | 4 +- optimizer/sum_array_test.go | 4 +- optimizer/sum_map_test.go | 4 +- parser/lexer/lexer_test.go | 4 +- parser/parser_test.go | 4 +- patcher/value/bench_test.go | 2 +- patcher/value/value_test.go | 2 +- patcher/with_context_test.go | 2 +- patcher/with_timezone_test.go | 2 +- repl/go.mod | 2 +- repl/go.sum | 4 - test/coredns/coredns_test.go | 3 +- test/crowdsec/crowdsec_test.go | 3 +- test/deref/deref_test.go | 4 +- test/gen/gen_test.go | 3 +- .../interface_method/interface_method_test.go | 4 +- test/operator/issues584/issues584_test.go | 2 +- test/operator/operator_test.go | 4 +- test/patch/change_ident_test.go | 2 +- test/patch/patch_test.go | 3 +- test/patch/set_type/set_type_test.go | 2 +- test/pipes/pipes_test.go | 3 +- test/time/time_test.go | 3 +- vm/debug_test.go | 2 +- vm/runtime/helpers_test.go | 3 +- vm/vm_test.go | 2 +- 87 files changed, 21989 insertions(+), 76 deletions(-) delete mode 100644 go.sum create mode 100644 internal/difflib/difflib.go create mode 100644 internal/difflib/difflib_test.go create mode 100644 internal/spew/bypass.go create mode 100644 internal/spew/bypasssafe.go create mode 100644 internal/spew/common.go create mode 100644 internal/spew/common_test.go create mode 100644 internal/spew/config.go create mode 100644 internal/spew/doc.go create mode 100644 internal/spew/dump.go create mode 100644 internal/spew/dump_test.go create mode 100644 internal/spew/dumpcgo_test.go create mode 100644 internal/spew/dumpnocgo_test.go create mode 100644 internal/spew/example_test.go create mode 100644 internal/spew/format.go create mode 100644 internal/spew/format_test.go create mode 100644 internal/spew/internal_test.go create mode 100644 internal/spew/internalunsafe_test.go create mode 100644 internal/spew/spew.go create mode 100644 internal/spew/spew_test.go create mode 100644 internal/spew/testdata/dumpcgo.go create mode 100644 internal/testify/assert/assertion_compare.go create mode 100644 internal/testify/assert/assertion_compare_test.go create mode 100644 internal/testify/assert/assertion_format.go create mode 100644 internal/testify/assert/assertion_format.go.tmpl create mode 100644 internal/testify/assert/assertion_forward.go create mode 100644 internal/testify/assert/assertion_forward.go.tmpl create mode 100644 internal/testify/assert/assertion_order.go create mode 100644 internal/testify/assert/assertion_order_test.go create mode 100644 internal/testify/assert/assertions.go create mode 100644 internal/testify/assert/assertions_test.go create mode 100644 internal/testify/assert/doc.go create mode 100644 internal/testify/assert/errors.go create mode 100644 internal/testify/assert/forward_assertions.go create mode 100644 internal/testify/assert/forward_assertions_test.go create mode 100644 internal/testify/assert/http_assertions.go create mode 100644 internal/testify/assert/http_assertions_test.go create mode 100644 internal/testify/assert/internal/unsafetests/doc.go create mode 100644 internal/testify/assert/internal/unsafetests/unsafetests_test.go create mode 100644 internal/testify/require/doc.go create mode 100644 internal/testify/require/forward_requirements.go create mode 100644 internal/testify/require/forward_requirements_test.go create mode 100644 internal/testify/require/require.go create mode 100644 internal/testify/require/require.go.tmpl create mode 100644 internal/testify/require/require_forward.go create mode 100644 internal/testify/require/require_forward.go.tmpl create mode 100644 internal/testify/require/requirements.go create mode 100644 internal/testify/require/requirements_test.go diff --git a/ast/print_test.go b/ast/print_test.go index 4ad49714c..51edd63f5 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -3,8 +3,8 @@ package ast_test import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/parser" diff --git a/ast/visitor_test.go b/ast/visitor_test.go index af0a17b22..4fd8d825c 100644 --- a/ast/visitor_test.go +++ b/ast/visitor_test.go @@ -3,8 +3,9 @@ package ast_test import ( "testing" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/ast" - "github.com/stretchr/testify/assert" ) type visitor struct { diff --git a/bench_test.go b/bench_test.go index ebeed5d18..de159bed9 100644 --- a/bench_test.go +++ b/bench_test.go @@ -3,7 +3,7 @@ package expr_test import ( "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/vm" diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 09a13b9f8..334910afb 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/builtin" diff --git a/checker/checker_test.go b/checker/checker_test.go index 29c50807e..1509045e3 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" diff --git a/checker/info_test.go b/checker/info_test.go index 6b0a042c2..d10476b52 100644 --- a/checker/info_test.go +++ b/checker/info_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/test/mock" diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 6fe58e930..eb7f3d323 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -4,8 +4,8 @@ import ( "math" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/test/mock" diff --git a/debug/go.sum b/debug/go.sum index 1078cbe99..01470e9e4 100644 --- a/debug/go.sum +++ b/debug/go.sum @@ -1,4 +1,3 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= @@ -8,14 +7,12 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -48,4 +45,3 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/docgen/docgen_test.go b/docgen/docgen_test.go index 3ffb64ff8..26cf4f7a9 100644 --- a/docgen/docgen_test.go +++ b/docgen/docgen_test.go @@ -5,9 +5,10 @@ import ( "testing" "time" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" + . "github.com/expr-lang/expr/docgen" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) type Tweet struct { diff --git a/expr_test.go b/expr_test.go index 889d82b32..2c8ab461c 100644 --- a/expr_test.go +++ b/expr_test.go @@ -10,8 +10,8 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" diff --git a/file/source_test.go b/file/source_test.go index 929ea4870..d380c22d0 100644 --- a/file/source_test.go +++ b/file/source_test.go @@ -4,7 +4,7 @@ import ( "encoding/json" "testing" - "github.com/stretchr/testify/assert" + "github.com/expr-lang/expr/internal/testify/assert" ) const ( diff --git a/go.mod b/go.mod index 0d2d47190..348e7cfd6 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,3 @@ module github.com/expr-lang/expr go 1.18 - -require github.com/stretchr/testify v1.8.4 - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index fa4b6e682..000000000 --- a/go.sum +++ /dev/null @@ -1,10 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/deref/deref_test.go b/internal/deref/deref_test.go index 554455f6d..5f812bee5 100644 --- a/internal/deref/deref_test.go +++ b/internal/deref/deref_test.go @@ -4,7 +4,7 @@ import ( "reflect" "testing" - "github.com/stretchr/testify/assert" + "github.com/expr-lang/expr/internal/testify/assert" "github.com/expr-lang/expr/internal/deref" ) diff --git a/internal/difflib/difflib.go b/internal/difflib/difflib.go new file mode 100644 index 000000000..2a73737af --- /dev/null +++ b/internal/difflib/difflib.go @@ -0,0 +1,775 @@ +// Package difflib is a partial port of Python difflib module. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// The following class and functions have been ported: +// +// - SequenceMatcher +// +// - unified_diff +// +// - context_diff +// +// Getting unified diffs was the main goal of the port. Keep in mind this code +// is mostly suitable to output text differences in a human friendly way, there +// are no guarantees generated diffs are consumable by patch(1). +package difflib + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "

    " lines in HTML files). That may be +// because this is the only method of the 3 that has a *concept* of +// "junk" . +// +// Timing: Basic R-O is cubic time worst case and quadratic time expected +// case. SequenceMatcher is quadratic time for the worst case and has +// expected-case behavior dependent in a complicated way on how many +// elements the sequences have in common; best case time is linear. +type SequenceMatcher struct { + a []string + b []string + b2j map[string][]int + IsJunk func(string) bool + autoJunk bool + bJunk map[string]struct{} + matchingBlocks []Match + fullBCount map[string]int + bPopular map[string]struct{} + opCodes []OpCode +} + +func NewMatcher(a, b []string) *SequenceMatcher { + m := SequenceMatcher{autoJunk: true} + m.SetSeqs(a, b) + return &m +} + +func NewMatcherWithJunk(a, b []string, autoJunk bool, + isJunk func(string) bool) *SequenceMatcher { + + m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} + m.SetSeqs(a, b) + return &m +} + +// Set two sequences to be compared. +func (m *SequenceMatcher) SetSeqs(a, b []string) { + m.SetSeq1(a) + m.SetSeq2(b) +} + +// Set the first sequence to be compared. The second sequence to be compared is +// not changed. +// +// SequenceMatcher computes and caches detailed information about the second +// sequence, so if you want to compare one sequence S against many sequences, +// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other +// sequences. +// +// See also SetSeqs() and SetSeq2(). +func (m *SequenceMatcher) SetSeq1(a []string) { + if &a == &m.a { + return + } + m.a = a + m.matchingBlocks = nil + m.opCodes = nil +} + +// Set the second sequence to be compared. The first sequence to be compared is +// not changed. +func (m *SequenceMatcher) SetSeq2(b []string) { + if &b == &m.b { + return + } + m.b = b + m.matchingBlocks = nil + m.opCodes = nil + m.fullBCount = nil + m.chainB() +} + +func (m *SequenceMatcher) chainB() { + // Populate line -> index mapping + b2j := map[string][]int{} + for i, s := range m.b { + indices := b2j[s] + indices = append(indices, i) + b2j[s] = indices + } + + // Purge junk elements + m.bJunk = map[string]struct{}{} + if m.IsJunk != nil { + junk := m.bJunk + for s, _ := range b2j { + if m.IsJunk(s) { + junk[s] = struct{}{} + } + } + for s, _ := range junk { + delete(b2j, s) + } + } + + // Purge remaining popular elements + popular := map[string]struct{}{} + n := len(m.b) + if m.autoJunk && n >= 200 { + ntest := n/100 + 1 + for s, indices := range b2j { + if len(indices) > ntest { + popular[s] = struct{}{} + } + } + for s, _ := range popular { + delete(b2j, s) + } + } + m.bPopular = popular + m.b2j = b2j +} + +func (m *SequenceMatcher) isBJunk(s string) bool { + _, ok := m.bJunk[s] + return ok +} + +// Find longest matching block in a[alo:ahi] and b[blo:bhi]. +// +// If IsJunk is not defined: +// +// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where +// +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi +// +// and for all (i',j',k') meeting those conditions, +// +// k >= k' +// i <= i' +// and if i == i', j <= j' +// +// In other words, of all maximal matching blocks, return one that +// starts earliest in a, and of all those maximal matching blocks that +// start earliest in a, return the one that starts earliest in b. +// +// If IsJunk is defined, first the longest matching block is +// determined as above, but with the additional restriction that no +// junk element appears in the block. Then that block is extended as +// far as possible by matching (only) junk elements on both sides. So +// the resulting block never matches on junk except as identical junk +// happens to be adjacent to an "interesting" match. +// +// If no blocks match, return (alo, blo, 0). +func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { + // CAUTION: stripping common prefix or suffix would be incorrect. + // E.g., + // ab + // acab + // Longest matching block is "ab", but if common prefix is + // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + // strip, so ends up claiming that ab is changed to acab by + // inserting "ca" in the middle. That's minimal but unintuitive: + // "it's obvious" that someone inserted "ac" at the front. + // Windiff ends up at the same place as diff, but by pairing up + // the unique 'b's and then matching the first two 'a's. + besti, bestj, bestsize := alo, blo, 0 + + // find longest junk-free match + // during an iteration of the loop, j2len[j] = length of longest + // junk-free match ending with a[i-1] and b[j] + j2len := map[int]int{} + for i := alo; i != ahi; i++ { + // look at all instances of a[i] in b; note that because + // b2j has no junk keys, the loop is skipped if a[i] is junk + newj2len := map[int]int{} + for _, j := range m.b2j[m.a[i]] { + // a[i] matches b[j] + if j < blo { + continue + } + if j >= bhi { + break + } + k := j2len[j-1] + 1 + newj2len[j] = k + if k > bestsize { + besti, bestj, bestsize = i-k+1, j-k+1, k + } + } + j2len = newj2len + } + + // Extend the best by non-junk elements on each end. In particular, + // "popular" non-junk elements aren't in b2j, which greatly speeds + // the inner loop above, but also means "the best" match so far + // doesn't contain any junk *or* popular non-junk elements. + for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + !m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + // Now that we have a wholly interesting match (albeit possibly + // empty!), we may as well suck up the matching junk on each + // side of it too. Can't think of a good reason not to, and it + // saves post-processing the (possibly considerable) expense of + // figuring out what to do with it. In the case of an empty + // interesting match, this is clearly the right thing to do, + // because no other kind of match is possible in the regions. + for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + return Match{A: besti, B: bestj, Size: bestsize} +} + +// Return list of triples describing matching subsequences. +// +// Each triple is of the form (i, j, n), and means that +// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in +// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are +// adjacent triples in the list, and the second is not the last triple in the +// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe +// adjacent equal blocks. +// +// The last triple is a dummy, (len(a), len(b), 0), and is the only +// triple with n==0. +func (m *SequenceMatcher) GetMatchingBlocks() []Match { + if m.matchingBlocks != nil { + return m.matchingBlocks + } + + var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match + matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { + match := m.findLongestMatch(alo, ahi, blo, bhi) + i, j, k := match.A, match.B, match.Size + if match.Size > 0 { + if alo < i && blo < j { + matched = matchBlocks(alo, i, blo, j, matched) + } + matched = append(matched, match) + if i+k < ahi && j+k < bhi { + matched = matchBlocks(i+k, ahi, j+k, bhi, matched) + } + } + return matched + } + matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) + + // It's possible that we have adjacent equal blocks in the + // matching_blocks list now. + nonAdjacent := []Match{} + i1, j1, k1 := 0, 0, 0 + for _, b := range matched { + // Is this block adjacent to i1, j1, k1? + i2, j2, k2 := b.A, b.B, b.Size + if i1+k1 == i2 && j1+k1 == j2 { + // Yes, so collapse them -- this just increases the length of + // the first block by the length of the second, and the first + // block so lengthened remains the block to compare against. + k1 += k2 + } else { + // Not adjacent. Remember the first block (k1==0 means it's + // the dummy we started with), and make the second block the + // new block to compare against. + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + i1, j1, k1 = i2, j2, k2 + } + } + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + + nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) + m.matchingBlocks = nonAdjacent + return m.matchingBlocks +} + +// Return list of 5-tuples describing how to turn a into b. +// +// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple +// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the +// tuple preceding it, and likewise for j1 == the previous j2. +// +// The tags are characters, with these meanings: +// +// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] +// +// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. +// +// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. +// +// 'e' (equal): a[i1:i2] == b[j1:j2] +func (m *SequenceMatcher) GetOpCodes() []OpCode { + if m.opCodes != nil { + return m.opCodes + } + i, j := 0, 0 + matching := m.GetMatchingBlocks() + opCodes := make([]OpCode, 0, len(matching)) + for _, m := range matching { + // invariant: we've pumped out correct diffs to change + // a[:i] into b[:j], and the next matching block is + // a[ai:ai+size] == b[bj:bj+size]. So we need to pump + // out a diff to change a[i:ai] into b[j:bj], pump out + // the matching block, and move (i,j) beyond the match + ai, bj, size := m.A, m.B, m.Size + tag := byte(0) + if i < ai && j < bj { + tag = 'r' + } else if i < ai { + tag = 'd' + } else if j < bj { + tag = 'i' + } + if tag > 0 { + opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) + } + i, j = ai+size, bj+size + // the list of matching blocks is terminated by a + // sentinel with size 0 + if size > 0 { + opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) + } + } + m.opCodes = opCodes + return m.opCodes +} + +// Isolate change clusters by eliminating ranges with no changes. +// +// Return a generator of groups with up to n lines of context. +// Each group is in the same format as returned by GetOpCodes(). +func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { + if n < 0 { + n = 3 + } + codes := m.GetOpCodes() + if len(codes) == 0 { + codes = []OpCode{OpCode{'e', 0, 1, 0, 1}} + } + // Fixup leading and trailing groups if they show no changes. + if codes[0].Tag == 'e' { + c := codes[0] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} + } + if codes[len(codes)-1].Tag == 'e' { + c := codes[len(codes)-1] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} + } + nn := n + n + groups := [][]OpCode{} + group := []OpCode{} + for _, c := range codes { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + // End the current group and start a new one whenever + // there is a large range with no changes. + if c.Tag == 'e' && i2-i1 > nn { + group = append(group, OpCode{c.Tag, i1, min(i2, i1+n), + j1, min(j2, j1+n)}) + groups = append(groups, group) + group = []OpCode{} + i1, j1 = max(i1, i2-n), max(j1, j2-n) + } + group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) + } + if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { + groups = append(groups, group) + } + return groups +} + +// Return a measure of the sequences' similarity (float in [0,1]). +// +// Where T is the total number of elements in both sequences, and +// M is the number of matches, this is 2.0*M / T. +// Note that this is 1 if the sequences are identical, and 0 if +// they have nothing in common. +// +// .Ratio() is expensive to compute if you haven't already computed +// .GetMatchingBlocks() or .GetOpCodes(), in which case you may +// want to try .QuickRatio() or .RealQuickRation() first to get an +// upper bound. +func (m *SequenceMatcher) Ratio() float64 { + matches := 0 + for _, m := range m.GetMatchingBlocks() { + matches += m.Size + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() relatively quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute. +func (m *SequenceMatcher) QuickRatio() float64 { + // viewing a and b as multisets, set matches to the cardinality + // of their intersection; this counts the number of matches + // without regard to order, so is clearly an upper bound + if m.fullBCount == nil { + m.fullBCount = map[string]int{} + for _, s := range m.b { + m.fullBCount[s] = m.fullBCount[s] + 1 + } + } + + // avail[x] is the number of times x appears in 'b' less the + // number of times we've seen it in 'a' so far ... kinda + avail := map[string]int{} + matches := 0 + for _, s := range m.a { + n, ok := avail[s] + if !ok { + n = m.fullBCount[s] + } + avail[s] = n - 1 + if n > 0 { + matches += 1 + } + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() very quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute than either .Ratio() or .QuickRatio(). +func (m *SequenceMatcher) RealQuickRatio() float64 { + la, lb := len(m.a), len(m.b) + return calculateRatio(min(la, lb), la+lb) +} + +// Convert range to the "ed" format +func formatRangeUnified(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 1 { + return fmt.Sprintf("%d", beginning) + } + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + return fmt.Sprintf("%d,%d", beginning, length) +} + +// Unified diff parameters +type UnifiedDiff struct { + A []string // First sequence lines + FromFile string // First file name + FromDate string // First file time + B []string // Second sequence lines + ToFile string // Second file name + ToDate string // Second file time + Eol string // Headers end of line, defaults to LF + Context int // Number of context lines +} + +// Compare two sequences of lines; generate the delta as a unified diff. +// +// Unified diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by 'n' which +// defaults to three. +// +// By default, the diff control lines (those with ---, +++, or @@) are +// created with a trailing newline. This is helpful so that inputs +// created from file.readlines() result in diffs that are suitable for +// file.writelines() since both the inputs and outputs have trailing +// newlines. +// +// For inputs that do not have trailing newlines, set the lineterm +// argument to "" so that the output will be uniformly newline free. +// +// The unidiff format normally has a header for filenames and modification +// times. Any or all of these may be specified using strings for +// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. +// The modification times are normally expressed in the ISO 8601 format. +func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + wf := func(format string, args ...interface{}) error { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + return err + } + ws := func(s string) error { + _, err := buf.WriteString(s) + return err + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) + if err != nil { + return err + } + err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) + if err != nil { + return err + } + } + } + first, last := g[0], g[len(g)-1] + range1 := formatRangeUnified(first.I1, last.I2) + range2 := formatRangeUnified(first.J1, last.J2) + if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { + return err + } + for _, c := range g { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + if c.Tag == 'e' { + for _, line := range diff.A[i1:i2] { + if err := ws(" " + line); err != nil { + return err + } + } + continue + } + if c.Tag == 'r' || c.Tag == 'd' { + for _, line := range diff.A[i1:i2] { + if err := ws("-" + line); err != nil { + return err + } + } + } + if c.Tag == 'r' || c.Tag == 'i' { + for _, line := range diff.B[j1:j2] { + if err := ws("+" + line); err != nil { + return err + } + } + } + } + } + return nil +} + +// Like WriteUnifiedDiff but returns the diff a string. +func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteUnifiedDiff(w, diff) + return string(w.Bytes()), err +} + +// Convert range to the "ed" format. +func formatRangeContext(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + if length <= 1 { + return fmt.Sprintf("%d", beginning) + } + return fmt.Sprintf("%d,%d", beginning, beginning+length-1) +} + +type ContextDiff UnifiedDiff + +// Compare two sequences of lines; generate the delta as a context diff. +// +// Context diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by diff.Context +// which defaults to three. +// +// By default, the diff control lines (those with *** or ---) are +// created with a trailing newline. +// +// For inputs that do not have trailing newlines, set the diff.Eol +// argument to "" so that the output will be uniformly newline free. +// +// The context diff format normally has a header for filenames and +// modification times. Any or all of these may be specified using +// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate. +// The modification times are normally expressed in the ISO 8601 format. +// If not specified, the strings default to blanks. +func WriteContextDiff(writer io.Writer, diff ContextDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + var diffErr error + wf := func(format string, args ...interface{}) { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + if diffErr == nil && err != nil { + diffErr = err + } + } + ws := func(s string) { + _, err := buf.WriteString(s) + if diffErr == nil && err != nil { + diffErr = err + } + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + prefix := map[byte]string{ + 'i': "+ ", + 'd': "- ", + 'r': "! ", + 'e': " ", + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol) + wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol) + } + } + + first, last := g[0], g[len(g)-1] + ws("***************" + diff.Eol) + + range1 := formatRangeContext(first.I1, last.I2) + wf("*** %s ****%s", range1, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'd' { + for _, cc := range g { + if cc.Tag == 'i' { + continue + } + for _, line := range diff.A[cc.I1:cc.I2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + + range2 := formatRangeContext(first.J1, last.J2) + wf("--- %s ----%s", range2, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'i' { + for _, cc := range g { + if cc.Tag == 'd' { + continue + } + for _, line := range diff.B[cc.J1:cc.J2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + } + return diffErr +} + +// Like WriteContextDiff but returns the diff a string. +func GetContextDiffString(diff ContextDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteContextDiff(w, diff) + return string(w.Bytes()), err +} + +// Split a string on "\n" while preserving them. The output can be used +// as input for UnifiedDiff and ContextDiff structures. +func SplitLines(s string) []string { + lines := strings.SplitAfter(s, "\n") + lines[len(lines)-1] += "\n" + return lines +} diff --git a/internal/difflib/difflib_test.go b/internal/difflib/difflib_test.go new file mode 100644 index 000000000..d72511962 --- /dev/null +++ b/internal/difflib/difflib_test.go @@ -0,0 +1,426 @@ +package difflib + +import ( + "bytes" + "fmt" + "math" + "reflect" + "strings" + "testing" +) + +func assertAlmostEqual(t *testing.T, a, b float64, places int) { + if math.Abs(a-b) > math.Pow10(-places) { + t.Errorf("%.7f != %.7f", a, b) + } +} + +func assertEqual(t *testing.T, a, b interface{}) { + if !reflect.DeepEqual(a, b) { + t.Errorf("%v != %v", a, b) + } +} + +func splitChars(s string) []string { + chars := make([]string, 0, len(s)) + // Assume ASCII inputs + for i := 0; i != len(s); i++ { + chars = append(chars, string(s[i])) + } + return chars +} + +func TestSequenceMatcherRatio(t *testing.T) { + s := NewMatcher(splitChars("abcd"), splitChars("bcde")) + assertEqual(t, s.Ratio(), 0.75) + assertEqual(t, s.QuickRatio(), 0.75) + assertEqual(t, s.RealQuickRatio(), 1.0) +} + +func TestGetOptCodes(t *testing.T) { + a := "qabxcd" + b := "abycdf" + s := NewMatcher(splitChars(a), splitChars(b)) + w := &bytes.Buffer{} + for _, op := range s.GetOpCodes() { + fmt.Fprintf(w, "%s a[%d:%d], (%s) b[%d:%d] (%s)\n", string(op.Tag), + op.I1, op.I2, a[op.I1:op.I2], op.J1, op.J2, b[op.J1:op.J2]) + } + result := string(w.Bytes()) + expected := `d a[0:1], (q) b[0:0] () +e a[1:3], (ab) b[0:2] (ab) +r a[3:4], (x) b[2:3] (y) +e a[4:6], (cd) b[3:5] (cd) +i a[6:6], () b[5:6] (f) +` + if expected != result { + t.Errorf("unexpected op codes: \n%s", result) + } +} + +func TestGroupedOpCodes(t *testing.T) { + a := []string{} + for i := 0; i != 39; i++ { + a = append(a, fmt.Sprintf("%02d", i)) + } + b := []string{} + b = append(b, a[:8]...) + b = append(b, " i") + b = append(b, a[8:19]...) + b = append(b, " x") + b = append(b, a[20:22]...) + b = append(b, a[27:34]...) + b = append(b, " y") + b = append(b, a[35:]...) + s := NewMatcher(a, b) + w := &bytes.Buffer{} + for _, g := range s.GetGroupedOpCodes(-1) { + fmt.Fprintf(w, "group\n") + for _, op := range g { + fmt.Fprintf(w, " %s, %d, %d, %d, %d\n", string(op.Tag), + op.I1, op.I2, op.J1, op.J2) + } + } + result := string(w.Bytes()) + expected := `group + e, 5, 8, 5, 8 + i, 8, 8, 8, 9 + e, 8, 11, 9, 12 +group + e, 16, 19, 17, 20 + r, 19, 20, 20, 21 + e, 20, 22, 21, 23 + d, 22, 27, 23, 23 + e, 27, 30, 23, 26 +group + e, 31, 34, 27, 30 + r, 34, 35, 30, 31 + e, 35, 38, 31, 34 +` + if expected != result { + t.Errorf("unexpected op codes: \n%s", result) + } +} + +func ExampleGetUnifiedDiffCode() { + a := `one +two +three +four +fmt.Printf("%s,%T",a,b)` + b := `zero +one +three +four` + diff := UnifiedDiff{ + A: SplitLines(a), + B: SplitLines(b), + FromFile: "Original", + FromDate: "2005-01-26 23:30:50", + ToFile: "Current", + ToDate: "2010-04-02 10:20:52", + Context: 3, + } + result, _ := GetUnifiedDiffString(diff) + fmt.Println(strings.Replace(result, "\t", " ", -1)) + // Output: + // --- Original 2005-01-26 23:30:50 + // +++ Current 2010-04-02 10:20:52 + // @@ -1,5 +1,4 @@ + // +zero + // one + // -two + // three + // four + // -fmt.Printf("%s,%T",a,b) +} + +func ExampleGetContextDiffCode() { + a := `one +two +three +four +fmt.Printf("%s,%T",a,b)` + b := `zero +one +tree +four` + diff := ContextDiff{ + A: SplitLines(a), + B: SplitLines(b), + FromFile: "Original", + ToFile: "Current", + Context: 3, + Eol: "\n", + } + result, _ := GetContextDiffString(diff) + fmt.Print(strings.Replace(result, "\t", " ", -1)) + // Output: + // *** Original + // --- Current + // *************** + // *** 1,5 **** + // one + // ! two + // ! three + // four + // - fmt.Printf("%s,%T",a,b) + // --- 1,4 ---- + // + zero + // one + // ! tree + // four +} + +func ExampleGetContextDiffString() { + a := `one +two +three +four` + b := `zero +one +tree +four` + diff := ContextDiff{ + A: SplitLines(a), + B: SplitLines(b), + FromFile: "Original", + ToFile: "Current", + Context: 3, + Eol: "\n", + } + result, _ := GetContextDiffString(diff) + fmt.Printf(strings.Replace(result, "\t", " ", -1)) + // Output: + // *** Original + // --- Current + // *************** + // *** 1,4 **** + // one + // ! two + // ! three + // four + // --- 1,4 ---- + // + zero + // one + // ! tree + // four +} + +func rep(s string, count int) string { + return strings.Repeat(s, count) +} + +func TestWithAsciiOneInsert(t *testing.T) { + sm := NewMatcher(splitChars(rep("b", 100)), + splitChars("a"+rep("b", 100))) + assertAlmostEqual(t, sm.Ratio(), 0.995, 3) + assertEqual(t, sm.GetOpCodes(), + []OpCode{{'i', 0, 0, 0, 1}, {'e', 0, 100, 1, 101}}) + assertEqual(t, len(sm.bPopular), 0) + + sm = NewMatcher(splitChars(rep("b", 100)), + splitChars(rep("b", 50)+"a"+rep("b", 50))) + assertAlmostEqual(t, sm.Ratio(), 0.995, 3) + assertEqual(t, sm.GetOpCodes(), + []OpCode{{'e', 0, 50, 0, 50}, {'i', 50, 50, 50, 51}, {'e', 50, 100, 51, 101}}) + assertEqual(t, len(sm.bPopular), 0) +} + +func TestWithAsciiOnDelete(t *testing.T) { + sm := NewMatcher(splitChars(rep("a", 40)+"c"+rep("b", 40)), + splitChars(rep("a", 40)+rep("b", 40))) + assertAlmostEqual(t, sm.Ratio(), 0.994, 3) + assertEqual(t, sm.GetOpCodes(), + []OpCode{{'e', 0, 40, 0, 40}, {'d', 40, 41, 40, 40}, {'e', 41, 81, 40, 80}}) +} + +func TestWithAsciiBJunk(t *testing.T) { + isJunk := func(s string) bool { + return s == " " + } + sm := NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), + splitChars(rep("a", 44)+rep("b", 40)), true, isJunk) + assertEqual(t, sm.bJunk, map[string]struct{}{}) + + sm = NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), + splitChars(rep("a", 44)+rep("b", 40)+rep(" ", 20)), false, isJunk) + assertEqual(t, sm.bJunk, map[string]struct{}{" ": struct{}{}}) + + isJunk = func(s string) bool { + return s == " " || s == "b" + } + sm = NewMatcherWithJunk(splitChars(rep("a", 40)+rep("b", 40)), + splitChars(rep("a", 44)+rep("b", 40)+rep(" ", 20)), false, isJunk) + assertEqual(t, sm.bJunk, map[string]struct{}{" ": struct{}{}, "b": struct{}{}}) +} + +func TestSFBugsRatioForNullSeqn(t *testing.T) { + sm := NewMatcher(nil, nil) + assertEqual(t, sm.Ratio(), 1.0) + assertEqual(t, sm.QuickRatio(), 1.0) + assertEqual(t, sm.RealQuickRatio(), 1.0) +} + +func TestSFBugsComparingEmptyLists(t *testing.T) { + groups := NewMatcher(nil, nil).GetGroupedOpCodes(-1) + assertEqual(t, len(groups), 0) + diff := UnifiedDiff{ + FromFile: "Original", + ToFile: "Current", + Context: 3, + } + result, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, result, "") +} + +func TestOutputFormatRangeFormatUnified(t *testing.T) { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + // + // Each field shall be of the form: + // %1d", if the range contains exactly one line, + // and: + // "%1d,%1d", , otherwise. + // If a range is empty, its beginning line number shall be the number of + // the line just before the range, or 0 if the empty range starts the file. + fm := formatRangeUnified + assertEqual(t, fm(3, 3), "3,0") + assertEqual(t, fm(3, 4), "4") + assertEqual(t, fm(3, 5), "4,2") + assertEqual(t, fm(3, 6), "4,3") + assertEqual(t, fm(0, 0), "0,0") +} + +func TestOutputFormatRangeFormatContext(t *testing.T) { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + // + // The range of lines in file1 shall be written in the following format + // if the range contains two or more lines: + // "*** %d,%d ****\n", , + // and the following format otherwise: + // "*** %d ****\n", + // The ending line number of an empty range shall be the number of the preceding line, + // or 0 if the range is at the start of the file. + // + // Next, the range of lines in file2 shall be written in the following format + // if the range contains two or more lines: + // "--- %d,%d ----\n", , + // and the following format otherwise: + // "--- %d ----\n", + fm := formatRangeContext + assertEqual(t, fm(3, 3), "3") + assertEqual(t, fm(3, 4), "4") + assertEqual(t, fm(3, 5), "4,5") + assertEqual(t, fm(3, 6), "4,6") + assertEqual(t, fm(0, 0), "0") +} + +func TestOutputFormatTabDelimiter(t *testing.T) { + diff := UnifiedDiff{ + A: splitChars("one"), + B: splitChars("two"), + FromFile: "Original", + FromDate: "2005-01-26 23:30:50", + ToFile: "Current", + ToDate: "2010-04-12 10:20:52", + Eol: "\n", + } + ud, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(ud)[:2], []string{ + "--- Original\t2005-01-26 23:30:50\n", + "+++ Current\t2010-04-12 10:20:52\n", + }) + cd, err := GetContextDiffString(ContextDiff(diff)) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(cd)[:2], []string{ + "*** Original\t2005-01-26 23:30:50\n", + "--- Current\t2010-04-12 10:20:52\n", + }) +} + +func TestOutputFormatNoTrailingTabOnEmptyFiledate(t *testing.T) { + diff := UnifiedDiff{ + A: splitChars("one"), + B: splitChars("two"), + FromFile: "Original", + ToFile: "Current", + Eol: "\n", + } + ud, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(ud)[:2], []string{"--- Original\n", "+++ Current\n"}) + + cd, err := GetContextDiffString(ContextDiff(diff)) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(cd)[:2], []string{"*** Original\n", "--- Current\n"}) +} + +func TestOmitFilenames(t *testing.T) { + diff := UnifiedDiff{ + A: SplitLines("o\nn\ne\n"), + B: SplitLines("t\nw\no\n"), + Eol: "\n", + } + ud, err := GetUnifiedDiffString(diff) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(ud), []string{ + "@@ -0,0 +1,2 @@\n", + "+t\n", + "+w\n", + "@@ -2,2 +3,0 @@\n", + "-n\n", + "-e\n", + "\n", + }) + + cd, err := GetContextDiffString(ContextDiff(diff)) + assertEqual(t, err, nil) + assertEqual(t, SplitLines(cd), []string{ + "***************\n", + "*** 0 ****\n", + "--- 1,2 ----\n", + "+ t\n", + "+ w\n", + "***************\n", + "*** 2,3 ****\n", + "- n\n", + "- e\n", + "--- 3 ----\n", + "\n", + }) +} + +func TestSplitLines(t *testing.T) { + allTests := []struct { + input string + want []string + }{ + {"foo", []string{"foo\n"}}, + {"foo\nbar", []string{"foo\n", "bar\n"}}, + {"foo\nbar\n", []string{"foo\n", "bar\n", "\n"}}, + } + for _, test := range allTests { + assertEqual(t, SplitLines(test.input), test.want) + } +} + +func benchmarkSplitLines(b *testing.B, count int) { + str := strings.Repeat("foo\n", count) + + b.ResetTimer() + + n := 0 + for i := 0; i < b.N; i++ { + n += len(SplitLines(str)) + } +} + +func BenchmarkSplitLines100(b *testing.B) { + benchmarkSplitLines(b, 100) +} + +func BenchmarkSplitLines10000(b *testing.B) { + benchmarkSplitLines(b, 10000) +} diff --git a/internal/spew/bypass.go b/internal/spew/bypass.go new file mode 100644 index 000000000..70ddeaad3 --- /dev/null +++ b/internal/spew/bypass.go @@ -0,0 +1,146 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// Go versions prior to 1.4 are disabled because they use a different layout +// for interfaces which make the implementation of unsafeReflectValue more complex. +//go:build !js && !appengine && !safe && !disableunsafe && go1.4 +// +build !js,!appengine,!safe,!disableunsafe,go1.4 + +package spew + +import ( + "reflect" + "unsafe" +) + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = false + + // ptrSize is the size of a pointer on the current arch. + ptrSize = unsafe.Sizeof((*byte)(nil)) +) + +type flag uintptr + +var ( + // flagRO indicates whether the value field of a reflect.Value + // is read-only. + flagRO flag + + // flagAddr indicates whether the address of the reflect.Value's + // value may be taken. + flagAddr flag +) + +// flagKindMask holds the bits that make up the kind +// part of the flags field. In all the supported versions, +// it is in the lower 5 bits. +const flagKindMask = flag(0x1f) + +// Different versions of Go have used different +// bit layouts for the flags type. This table +// records the known combinations. +var okFlags = []struct { + ro, addr flag +}{{ + // From Go 1.4 to 1.5 + ro: 1 << 5, + addr: 1 << 7, +}, { + // Up to Go tip. + ro: 1<<5 | 1<<6, + addr: 1 << 8, +}} + +var flagValOffset = func() uintptr { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + return field.Offset +}() + +// flagField returns a pointer to the flag field of a reflect.Value. +func flagField(v *reflect.Value) *flag { + return (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset)) +} + +// unsafeReflectValue converts the passed reflect.Value into a one that bypasses +// the typical safety restrictions preventing access to unaddressable and +// unexported data. It works by digging the raw pointer to the underlying +// value out of the protected value and generating a new unprotected (unsafe) +// reflect.Value to it. +// +// This allows us to check for implementations of the Stringer and error +// interfaces to be used for pretty printing ordinarily unaddressable and +// inaccessible values such as unexported struct fields. +func unsafeReflectValue(v reflect.Value) reflect.Value { + if !v.IsValid() || (v.CanInterface() && v.CanAddr()) { + return v + } + flagFieldPtr := flagField(&v) + *flagFieldPtr &^= flagRO + *flagFieldPtr |= flagAddr + return v +} + +// Sanity checks against future reflect package changes +// to the type or semantics of the Value.flag field. +func init() { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + if field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() { + panic("reflect.Value flag field has changed kind") + } + type t0 int + var t struct { + A t0 + // t0 will have flagEmbedRO set. + t0 + // a will have flagStickyRO set + a t0 + } + vA := reflect.ValueOf(t).FieldByName("A") + va := reflect.ValueOf(t).FieldByName("a") + vt0 := reflect.ValueOf(t).FieldByName("t0") + + // Infer flagRO from the difference between the flags + // for the (otherwise identical) fields in t. + flagPublic := *flagField(&vA) + flagWithRO := *flagField(&va) | *flagField(&vt0) + flagRO = flagPublic ^ flagWithRO + + // Infer flagAddr from the difference between a value + // taken from a pointer and not. + vPtrA := reflect.ValueOf(&t).Elem().FieldByName("A") + flagNoPtr := *flagField(&vA) + flagPtr := *flagField(&vPtrA) + flagAddr = flagNoPtr ^ flagPtr + + // Check that the inferred flags tally with one of the known versions. + for _, f := range okFlags { + if flagRO == f.ro && flagAddr == f.addr { + return + } + } + panic("reflect.Value read-only flag has changed semantics") +} diff --git a/internal/spew/bypasssafe.go b/internal/spew/bypasssafe.go new file mode 100644 index 000000000..5e2d890d6 --- /dev/null +++ b/internal/spew/bypasssafe.go @@ -0,0 +1,39 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is running on Google App Engine, compiled by GopherJS, or +// "-tags safe" is added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +//go:build js || appengine || safe || disableunsafe || !go1.4 +// +build js appengine safe disableunsafe !go1.4 + +package spew + +import "reflect" + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = true +) + +// unsafeReflectValue typically converts the passed reflect.Value into a one +// that bypasses the typical safety restrictions preventing access to +// unaddressable and unexported data. However, doing this relies on access to +// the unsafe package. This is a stub version which simply returns the passed +// reflect.Value when the unsafe package is not available. +func unsafeReflectValue(v reflect.Value) reflect.Value { + return v +} diff --git a/internal/spew/common.go b/internal/spew/common.go new file mode 100644 index 000000000..1be8ce945 --- /dev/null +++ b/internal/spew/common.go @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "reflect" + "sort" + "strconv" +) + +// Some constants in the form of bytes to avoid string overhead. This mirrors +// the technique used in the fmt package. +var ( + panicBytes = []byte("(PANIC=") + plusBytes = []byte("+") + iBytes = []byte("i") + trueBytes = []byte("true") + falseBytes = []byte("false") + interfaceBytes = []byte("(interface {})") + commaNewlineBytes = []byte(",\n") + newlineBytes = []byte("\n") + openBraceBytes = []byte("{") + openBraceNewlineBytes = []byte("{\n") + closeBraceBytes = []byte("}") + asteriskBytes = []byte("*") + colonBytes = []byte(":") + colonSpaceBytes = []byte(": ") + openParenBytes = []byte("(") + closeParenBytes = []byte(")") + spaceBytes = []byte(" ") + pointerChainBytes = []byte("->") + nilAngleBytes = []byte("") + maxNewlineBytes = []byte("\n") + maxShortBytes = []byte("") + circularBytes = []byte("") + circularShortBytes = []byte("") + invalidAngleBytes = []byte("") + openBracketBytes = []byte("[") + closeBracketBytes = []byte("]") + percentBytes = []byte("%") + precisionBytes = []byte(".") + openAngleBytes = []byte("<") + closeAngleBytes = []byte(">") + openMapBytes = []byte("map[") + closeMapBytes = []byte("]") + lenEqualsBytes = []byte("len=") + capEqualsBytes = []byte("cap=") +) + +// hexDigits is used to map a decimal value to a hex digit. +var hexDigits = "0123456789abcdef" + +// catchPanic handles any panics that might occur during the handleMethods +// calls. +func catchPanic(w io.Writer, v reflect.Value) { + if err := recover(); err != nil { + w.Write(panicBytes) + fmt.Fprintf(w, "%v", err) + w.Write(closeParenBytes) + } +} + +// handleMethods attempts to call the Error and String methods on the underlying +// type the passed reflect.Value represents and outputes the result to Writer w. +// +// It handles panics in any called methods by catching and displaying the error +// as the formatted value. +func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { + // We need an interface to check if the type implements the error or + // Stringer interface. However, the reflect package won't give us an + // interface on certain things like unexported struct fields in order + // to enforce visibility rules. We use unsafe, when it's available, + // to bypass these restrictions since this package does not mutate the + // values. + if !v.CanInterface() { + if UnsafeDisabled { + return false + } + + v = unsafeReflectValue(v) + } + + // Choose whether or not to do error and Stringer interface lookups against + // the base type or a pointer to the base type depending on settings. + // Technically calling one of these methods with a pointer receiver can + // mutate the value, however, types which choose to satisify an error or + // Stringer interface with a pointer receiver should not be mutating their + // state inside these interface methods. + if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { + v = unsafeReflectValue(v) + } + if v.CanAddr() { + v = v.Addr() + } + + // Is it an error or Stringer? + switch iface := v.Interface().(type) { + case error: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.Error())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + + w.Write([]byte(iface.Error())) + return true + + case fmt.Stringer: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.String())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + w.Write([]byte(iface.String())) + return true + } + return false +} + +// printBool outputs a boolean value as true or false to Writer w. +func printBool(w io.Writer, val bool) { + if val { + w.Write(trueBytes) + } else { + w.Write(falseBytes) + } +} + +// printInt outputs a signed integer value to Writer w. +func printInt(w io.Writer, val int64, base int) { + w.Write([]byte(strconv.FormatInt(val, base))) +} + +// printUint outputs an unsigned integer value to Writer w. +func printUint(w io.Writer, val uint64, base int) { + w.Write([]byte(strconv.FormatUint(val, base))) +} + +// printFloat outputs a floating point value using the specified precision, +// which is expected to be 32 or 64bit, to Writer w. +func printFloat(w io.Writer, val float64, precision int) { + w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) +} + +// printComplex outputs a complex value using the specified float precision +// for the real and imaginary parts to Writer w. +func printComplex(w io.Writer, c complex128, floatPrecision int) { + r := real(c) + w.Write(openParenBytes) + w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) + i := imag(c) + if i >= 0 { + w.Write(plusBytes) + } + w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) + w.Write(iBytes) + w.Write(closeParenBytes) +} + +// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' +// prefix to Writer w. +func printHexPtr(w io.Writer, p uintptr) { + // Null pointer. + num := uint64(p) + if num == 0 { + w.Write(nilAngleBytes) + return + } + + // Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix + buf := make([]byte, 18) + + // It's simpler to construct the hex string right to left. + base := uint64(16) + i := len(buf) - 1 + for num >= base { + buf[i] = hexDigits[num%base] + num /= base + i-- + } + buf[i] = hexDigits[num] + + // Add '0x' prefix. + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + + // Strip unused leading bytes. + buf = buf[i:] + w.Write(buf) +} + +// valuesSorter implements sort.Interface to allow a slice of reflect.Value +// elements to be sorted. +type valuesSorter struct { + values []reflect.Value + strings []string // either nil or same len and values + cs *ConfigState +} + +// newValuesSorter initializes a valuesSorter instance, which holds a set of +// surrogate keys on which the data should be sorted. It uses flags in +// ConfigState to decide if and how to populate those surrogate keys. +func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { + vs := &valuesSorter{values: values, cs: cs} + if canSortSimply(vs.values[0].Kind()) { + return vs + } + if !cs.DisableMethods { + vs.strings = make([]string, len(values)) + for i := range vs.values { + b := bytes.Buffer{} + if !handleMethods(cs, &b, vs.values[i]) { + vs.strings = nil + break + } + vs.strings[i] = b.String() + } + } + if vs.strings == nil && cs.SpewKeys { + vs.strings = make([]string, len(values)) + for i := range vs.values { + vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) + } + } + return vs +} + +// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted +// directly, or whether it should be considered for sorting by surrogate keys +// (if the ConfigState allows it). +func canSortSimply(kind reflect.Kind) bool { + // This switch parallels valueSortLess, except for the default case. + switch kind { + case reflect.Bool: + return true + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return true + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Uintptr: + return true + case reflect.Array: + return true + } + return false +} + +// Len returns the number of values in the slice. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Len() int { + return len(s.values) +} + +// Swap swaps the values at the passed indices. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Swap(i, j int) { + s.values[i], s.values[j] = s.values[j], s.values[i] + if s.strings != nil { + s.strings[i], s.strings[j] = s.strings[j], s.strings[i] + } +} + +// valueSortLess returns whether the first value should sort before the second +// value. It is used by valueSorter.Less as part of the sort.Interface +// implementation. +func valueSortLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Bool: + return !a.Bool() && b.Bool() + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return a.Int() < b.Int() + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return a.Uint() < b.Uint() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.String: + return a.String() < b.String() + case reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Array: + // Compare the contents of both arrays. + l := a.Len() + for i := 0; i < l; i++ { + av := a.Index(i) + bv := b.Index(i) + if av.Interface() == bv.Interface() { + continue + } + return valueSortLess(av, bv) + } + } + return a.String() < b.String() +} + +// Less returns whether the value at index i should sort before the +// value at index j. It is part of the sort.Interface implementation. +func (s *valuesSorter) Less(i, j int) bool { + if s.strings == nil { + return valueSortLess(s.values[i], s.values[j]) + } + return s.strings[i] < s.strings[j] +} + +// sortValues is a sort function that handles both native types and any type that +// can be converted to error or Stringer. Other inputs are sorted according to +// their Value.String() value to ensure display stability. +func sortValues(values []reflect.Value, cs *ConfigState) { + if len(values) == 0 { + return + } + sort.Sort(newValuesSorter(values, cs)) +} diff --git a/internal/spew/common_test.go b/internal/spew/common_test.go new file mode 100644 index 000000000..a312057e1 --- /dev/null +++ b/internal/spew/common_test.go @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew_test + +import ( + "fmt" + "reflect" + "testing" + + "github.com/expr-lang/expr/internal/spew" +) + +// custom type to test Stinger interface on non-pointer receiver. +type stringer string + +// String implements the Stringer interface for testing invocation of custom +// stringers on types with non-pointer receivers. +func (s stringer) String() string { + return "stringer " + string(s) +} + +// custom type to test Stinger interface on pointer receiver. +type pstringer string + +// String implements the Stringer interface for testing invocation of custom +// stringers on types with only pointer receivers. +func (s *pstringer) String() string { + return "stringer " + string(*s) +} + +// xref1 and xref2 are cross referencing structs for testing circular reference +// detection. +type xref1 struct { + ps2 *xref2 +} +type xref2 struct { + ps1 *xref1 +} + +// indirCir1, indirCir2, and indirCir3 are used to generate an indirect circular +// reference for testing detection. +type indirCir1 struct { + ps2 *indirCir2 +} +type indirCir2 struct { + ps3 *indirCir3 +} +type indirCir3 struct { + ps1 *indirCir1 +} + +// embed is used to test embedded structures. +type embed struct { + a string +} + +// embedwrap is used to test embedded structures. +type embedwrap struct { + *embed + e *embed +} + +// panicer is used to intentionally cause a panic for testing spew properly +// handles them +type panicer int + +func (p panicer) String() string { + panic("test panic") +} + +// customError is used to test custom error interface invocation. +type customError int + +func (e customError) Error() string { + return fmt.Sprintf("error: %d", int(e)) +} + +// stringizeWants converts a slice of wanted test output into a format suitable +// for a test error message. +func stringizeWants(wants []string) string { + s := "" + for i, want := range wants { + if i > 0 { + s += fmt.Sprintf("want%d: %s", i+1, want) + } else { + s += "want: " + want + } + } + return s +} + +// testFailed returns whether or not a test failed by checking if the result +// of the test is in the slice of wanted strings. +func testFailed(result string, wants []string) bool { + for _, want := range wants { + if result == want { + return false + } + } + return true +} + +type sortableStruct struct { + x int +} + +func (ss sortableStruct) String() string { + return fmt.Sprintf("ss.%d", ss.x) +} + +type unsortableStruct struct { + x int +} + +type sortTestCase struct { + input []reflect.Value + expected []reflect.Value +} + +func helpTestSortValues(tests []sortTestCase, cs *spew.ConfigState, t *testing.T) { + getInterfaces := func(values []reflect.Value) []interface{} { + interfaces := []interface{}{} + for _, v := range values { + interfaces = append(interfaces, v.Interface()) + } + return interfaces + } + + for _, test := range tests { + spew.SortValues(test.input, cs) + // reflect.DeepEqual cannot really make sense of reflect.Value, + // probably because of all the pointer tricks. For instance, + // v(2.0) != v(2.0) on a 32-bits system. Turn them into interface{} + // instead. + input := getInterfaces(test.input) + expected := getInterfaces(test.expected) + if !reflect.DeepEqual(input, expected) { + t.Errorf("Sort mismatch:\n %v != %v", input, expected) + } + } +} + +// TestSortValues ensures the sort functionality for relect.Value based sorting +// works as intended. +func TestSortValues(t *testing.T) { + v := reflect.ValueOf + + a := v("a") + b := v("b") + c := v("c") + embedA := v(embed{"a"}) + embedB := v(embed{"b"}) + embedC := v(embed{"c"}) + tests := []sortTestCase{ + // No values. + { + []reflect.Value{}, + []reflect.Value{}, + }, + // Bools. + { + []reflect.Value{v(false), v(true), v(false)}, + []reflect.Value{v(false), v(false), v(true)}, + }, + // Ints. + { + []reflect.Value{v(2), v(1), v(3)}, + []reflect.Value{v(1), v(2), v(3)}, + }, + // Uints. + { + []reflect.Value{v(uint8(2)), v(uint8(1)), v(uint8(3))}, + []reflect.Value{v(uint8(1)), v(uint8(2)), v(uint8(3))}, + }, + // Floats. + { + []reflect.Value{v(2.0), v(1.0), v(3.0)}, + []reflect.Value{v(1.0), v(2.0), v(3.0)}, + }, + // Strings. + { + []reflect.Value{b, a, c}, + []reflect.Value{a, b, c}, + }, + // Array + { + []reflect.Value{v([3]int{3, 2, 1}), v([3]int{1, 3, 2}), v([3]int{1, 2, 3})}, + []reflect.Value{v([3]int{1, 2, 3}), v([3]int{1, 3, 2}), v([3]int{3, 2, 1})}, + }, + // Uintptrs. + { + []reflect.Value{v(uintptr(2)), v(uintptr(1)), v(uintptr(3))}, + []reflect.Value{v(uintptr(1)), v(uintptr(2)), v(uintptr(3))}, + }, + // SortableStructs. + { + // Note: not sorted - DisableMethods is set. + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + }, + // UnsortableStructs. + { + // Note: not sorted - SpewKeys is false. + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + }, + // Invalid. + { + []reflect.Value{embedB, embedA, embedC}, + []reflect.Value{embedB, embedA, embedC}, + }, + } + cs := spew.ConfigState{DisableMethods: true, SpewKeys: false} + helpTestSortValues(tests, &cs, t) +} + +// TestSortValuesWithMethods ensures the sort functionality for relect.Value +// based sorting works as intended when using string methods. +func TestSortValuesWithMethods(t *testing.T) { + v := reflect.ValueOf + + a := v("a") + b := v("b") + c := v("c") + tests := []sortTestCase{ + // Ints. + { + []reflect.Value{v(2), v(1), v(3)}, + []reflect.Value{v(1), v(2), v(3)}, + }, + // Strings. + { + []reflect.Value{b, a, c}, + []reflect.Value{a, b, c}, + }, + // SortableStructs. + { + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, + }, + // UnsortableStructs. + { + // Note: not sorted - SpewKeys is false. + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + }, + } + cs := spew.ConfigState{DisableMethods: false, SpewKeys: false} + helpTestSortValues(tests, &cs, t) +} + +// TestSortValuesWithSpew ensures the sort functionality for relect.Value +// based sorting works as intended when using spew to stringify keys. +func TestSortValuesWithSpew(t *testing.T) { + v := reflect.ValueOf + + a := v("a") + b := v("b") + c := v("c") + tests := []sortTestCase{ + // Ints. + { + []reflect.Value{v(2), v(1), v(3)}, + []reflect.Value{v(1), v(2), v(3)}, + }, + // Strings. + { + []reflect.Value{b, a, c}, + []reflect.Value{a, b, c}, + }, + // SortableStructs. + { + []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, + []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, + }, + // UnsortableStructs. + { + []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, + []reflect.Value{v(unsortableStruct{1}), v(unsortableStruct{2}), v(unsortableStruct{3})}, + }, + } + cs := spew.ConfigState{DisableMethods: true, SpewKeys: true} + helpTestSortValues(tests, &cs, t) +} diff --git a/internal/spew/config.go b/internal/spew/config.go new file mode 100644 index 000000000..161895fc6 --- /dev/null +++ b/internal/spew/config.go @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "os" +) + +// ConfigState houses the configuration options used by spew to format and +// display values. There is a global instance, Config, that is used to control +// all top-level Formatter and Dump functionality. Each ConfigState instance +// provides methods equivalent to the top-level functions. +// +// The zero value for ConfigState provides no indentation. You would typically +// want to set it to a space or a tab. +// +// Alternatively, you can use NewDefaultConfig to get a ConfigState instance +// with default settings. See the documentation of NewDefaultConfig for default +// values. +type ConfigState struct { + // Indent specifies the string to use for each indentation level. The + // global config instance that all top-level functions use set this to a + // single space by default. If you would like more indentation, you might + // set this to a tab with "\t" or perhaps two spaces with " ". + Indent string + + // MaxDepth controls the maximum number of levels to descend into nested + // data structures. The default, 0, means there is no limit. + // + // NOTE: Circular data structures are properly detected, so it is not + // necessary to set this value unless you specifically want to limit deeply + // nested data structures. + MaxDepth int + + // DisableMethods specifies whether or not error and Stringer interfaces are + // invoked for types that implement them. + DisableMethods bool + + // DisablePointerMethods specifies whether or not to check for and invoke + // error and Stringer interfaces on types which only accept a pointer + // receiver when the current type is not a pointer. + // + // NOTE: This might be an unsafe action since calling one of these methods + // with a pointer receiver could technically mutate the value, however, + // in practice, types which choose to satisify an error or Stringer + // interface with a pointer receiver should not be mutating their state + // inside these interface methods. As a result, this option relies on + // access to the unsafe package, so it will not have any effect when + // running in environments without access to the unsafe package such as + // Google App Engine or with the "safe" build tag specified. + DisablePointerMethods bool + + // DisablePointerAddresses specifies whether to disable the printing of + // pointer addresses. This is useful when diffing data structures in tests. + DisablePointerAddresses bool + + // DisableCapacities specifies whether to disable the printing of capacities + // for arrays, slices, maps and channels. This is useful when diffing + // data structures in tests. + DisableCapacities bool + + // ContinueOnMethod specifies whether or not recursion should continue once + // a custom error or Stringer interface is invoked. The default, false, + // means it will print the results of invoking the custom error or Stringer + // interface and return immediately instead of continuing to recurse into + // the internals of the data type. + // + // NOTE: This flag does not have any effect if method invocation is disabled + // via the DisableMethods or DisablePointerMethods options. + ContinueOnMethod bool + + // SortKeys specifies map keys should be sorted before being printed. Use + // this to have a more deterministic, diffable output. Note that only + // native types (bool, int, uint, floats, uintptr and string) and types + // that support the error or Stringer interfaces (if methods are + // enabled) are supported, with other types sorted according to the + // reflect.Value.String() output which guarantees display stability. + SortKeys bool + + // SpewKeys specifies that, as a last resort attempt, map keys should + // be spewed to strings and sorted by those strings. This is only + // considered if SortKeys is true. + SpewKeys bool +} + +// Config is the active configuration of the top-level functions. +// The configuration can be changed by modifying the contents of spew.Config. +var Config = ConfigState{Indent: " "} + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the formatted string as a value that satisfies error. See NewFormatter +// for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, c.convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, c.convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, c.convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a Formatter interface returned by c.NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, c.convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Print(a ...interface{}) (n int, err error) { + return fmt.Print(c.convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, c.convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Println(a ...interface{}) (n int, err error) { + return fmt.Println(c.convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprint(a ...interface{}) string { + return fmt.Sprint(c.convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, c.convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a Formatter interface returned by c.NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintln(a ...interface{}) string { + return fmt.Sprintln(c.convertArgs(a)...) +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +c.Printf, c.Println, or c.Printf. +*/ +func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(c, v) +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { + fdump(c, w, a...) +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + - Pointers are dereferenced and followed + - Circular data structures are detected and handled properly + - Custom Stringer/error interfaces are optionally invoked, including + on unexported types + - Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + - Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by modifying the public members +of c. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func (c *ConfigState) Dump(a ...interface{}) { + fdump(c, os.Stdout, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func (c *ConfigState) Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(c, &buf, a...) + return buf.String() +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a spew Formatter interface using +// the ConfigState associated with s. +func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = newFormatter(c, arg) + } + return formatters +} + +// NewDefaultConfig returns a ConfigState with the following default settings. +// +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false +func NewDefaultConfig() *ConfigState { + return &ConfigState{Indent: " "} +} diff --git a/internal/spew/doc.go b/internal/spew/doc.go new file mode 100644 index 000000000..722e9aa79 --- /dev/null +++ b/internal/spew/doc.go @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Package spew implements a deep pretty printer for Go data structures to aid in +debugging. + +A quick overview of the additional features spew provides over the built-in +printing facilities for Go data types are as follows: + + - Pointers are dereferenced and followed + - Circular data structures are detected and handled properly + - Custom Stringer/error interfaces are optionally invoked, including + on unexported types + - Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + - Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) + +There are two different approaches spew allows for dumping Go data structures: + + - Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + - A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt + +# Quick Start + +This section demonstrates how to quickly get started with spew. See the +sections below for further details on formatting and configuration options. + +To dump a variable with full newlines, indentation, type, and pointer +information use Dump, Fdump, or Sdump: + + spew.Dump(myVar1, myVar2, ...) + spew.Fdump(someWriter, myVar1, myVar2, ...) + str := spew.Sdump(myVar1, myVar2, ...) + +Alternatively, if you would prefer to use format strings with a compacted inline +printing style, use the convenience wrappers Printf, Fprintf, etc with +%v (most compact), %+v (adds pointer addresses), %#v (adds types), or +%#+v (adds types and pointer addresses): + + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +# Configuration Options + +Configuration of spew is handled by fields in the ConfigState type. For +convenience, all of the top-level functions use a global state available +via the spew.Config global. + +It is also possible to create a ConfigState instance that provides methods +equivalent to the top-level functions. This allows concurrent configuration +options. See the ConfigState documentation for more details. + +The following configuration options are available: + + - Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + + - MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + + - DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + + - DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. + + - DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + + - DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. + + - ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + + - SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. + + - SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. + +# Dump Usage + +Simply call spew.Dump with a list of variables you want to dump: + + spew.Dump(myVar1, myVar2, ...) + +You may also call spew.Fdump if you would prefer to output to an arbitrary +io.Writer. For example, to dump to standard error: + + spew.Fdump(os.Stderr, myVar1, myVar2, ...) + +A third option is to call spew.Sdump to get the formatted output as a string: + + str := spew.Sdump(myVar1, myVar2, ...) + +# Sample Dump Output + +See the Dump example for details on the setup of the types and variables being +shown here. + + (main.Foo) { + unexportedField: (*main.Bar)(0xf84002e210)({ + flag: (main.Flag) flagTwo, + data: (uintptr) + }), + ExportedField: (map[interface {}]interface {}) (len=1) { + (string) (len=3) "one": (bool) true + } + } + +Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C +command as shown. + + ([]uint8) (len=32 cap=32) { + 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + 00000020 31 32 |12| + } + +# Custom Formatter + +Spew provides a custom formatter that implements the fmt.Formatter interface +so that it integrates cleanly with standard fmt package printing functions. The +formatter is useful for inline printing of smaller data types similar to the +standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +# Custom Formatter Usage + +The simplest way to make use of the spew custom formatter is to call one of the +convenience functions such as spew.Printf, spew.Println, or spew.Printf. The +functions have syntax you are most likely already familiar with: + + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Println(myVar, myVar2) + spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +See the Index for the full list convenience functions. + +# Sample Formatter Output + +Double pointer to a uint8: + + %v: <**>5 + %+v: <**>(0xf8400420d0->0xf8400420c8)5 + %#v: (**uint8)5 + %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 + +Pointer to circular struct with a uint8 field and a pointer to itself: + + %v: <*>{1 <*>} + %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} + %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} + %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} + +See the Printf example for details on the setup of variables being shown +here. + +# Errors + +Since it is possible for custom Stringer/error interfaces to panic, spew +detects them and handles them internally by printing the panic information +inline with the output. Since spew is intended to provide deep pretty printing +capabilities on structures, it intentionally does not return any errors. +*/ +package spew diff --git a/internal/spew/dump.go b/internal/spew/dump.go new file mode 100644 index 000000000..8323041a4 --- /dev/null +++ b/internal/spew/dump.go @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "os" + "reflect" + "regexp" + "strconv" + "strings" +) + +var ( + // uint8Type is a reflect.Type representing a uint8. It is used to + // convert cgo types to uint8 slices for hexdumping. + uint8Type = reflect.TypeOf(uint8(0)) + + // cCharRE is a regular expression that matches a cgo char. + // It is used to detect character arrays to hexdump them. + cCharRE = regexp.MustCompile(`^.*\._Ctype_char$`) + + // cUnsignedCharRE is a regular expression that matches a cgo unsigned + // char. It is used to detect unsigned character arrays to hexdump + // them. + cUnsignedCharRE = regexp.MustCompile(`^.*\._Ctype_unsignedchar$`) + + // cUint8tCharRE is a regular expression that matches a cgo uint8_t. + // It is used to detect uint8_t arrays to hexdump them. + cUint8tCharRE = regexp.MustCompile(`^.*\._Ctype_uint8_t$`) +) + +// dumpState contains information about the state of a dump operation. +type dumpState struct { + w io.Writer + depth int + pointers map[uintptr]int + ignoreNextType bool + ignoreNextIndent bool + cs *ConfigState +} + +// indent performs indentation according to the depth level and cs.Indent +// option. +func (d *dumpState) indent() { + if d.ignoreNextIndent { + d.ignoreNextIndent = false + return + } + d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) +} + +// unpackValue returns values inside of non-nil interfaces when possible. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + return v +} + +// dumpPtr handles formatting of pointers by indirecting them as necessary. +func (d *dumpState) dumpPtr(v reflect.Value) { + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range d.pointers { + if depth >= d.depth { + delete(d.pointers, k) + } + } + + // Keep list of all dereferenced pointers to show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by dereferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := d.pointers[addr]; ok && pd < d.depth { + cycleFound = true + indirects-- + break + } + d.pointers[addr] = d.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type information. + d.w.Write(openParenBytes) + d.w.Write(bytes.Repeat(asteriskBytes, indirects)) + d.w.Write([]byte(ve.Type().String())) + d.w.Write(closeParenBytes) + + // Display pointer information. + if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { + d.w.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + d.w.Write(pointerChainBytes) + } + printHexPtr(d.w, addr) + } + d.w.Write(closeParenBytes) + } + + // Display dereferenced value. + d.w.Write(openParenBytes) + switch { + case nilFound: + d.w.Write(nilAngleBytes) + + case cycleFound: + d.w.Write(circularBytes) + + default: + d.ignoreNextType = true + d.dump(ve) + } + d.w.Write(closeParenBytes) +} + +// dumpSlice handles formatting of arrays and slices. Byte (uint8 under +// reflection) arrays and slices are dumped in hexdump -C fashion. +func (d *dumpState) dumpSlice(v reflect.Value) { + // Determine whether this type should be hex dumped or not. Also, + // for types which should be hexdumped, try to use the underlying data + // first, then fall back to trying to convert them to a uint8 slice. + var buf []uint8 + doConvert := false + doHexDump := false + numEntries := v.Len() + if numEntries > 0 { + vt := v.Index(0).Type() + vts := vt.String() + switch { + // C types that need to be converted. + case cCharRE.MatchString(vts): + fallthrough + case cUnsignedCharRE.MatchString(vts): + fallthrough + case cUint8tCharRE.MatchString(vts): + doConvert = true + + // Try to use existing uint8 slices and fall back to converting + // and copying if that fails. + case vt.Kind() == reflect.Uint8: + // We need an addressable interface to convert the type + // to a byte slice. However, the reflect package won't + // give us an interface on certain things like + // unexported struct fields in order to enforce + // visibility rules. We use unsafe, when available, to + // bypass these restrictions since this package does not + // mutate the values. + vs := v + if !vs.CanInterface() || !vs.CanAddr() { + vs = unsafeReflectValue(vs) + } + if !UnsafeDisabled { + vs = vs.Slice(0, numEntries) + + // Use the existing uint8 slice if it can be + // type asserted. + iface := vs.Interface() + if slice, ok := iface.([]uint8); ok { + buf = slice + doHexDump = true + break + } + } + + // The underlying data needs to be converted if it can't + // be type asserted to a uint8 slice. + doConvert = true + } + + // Copy and convert the underlying type if needed. + if doConvert && vt.ConvertibleTo(uint8Type) { + // Convert and copy each element into a uint8 byte + // slice. + buf = make([]uint8, numEntries) + for i := 0; i < numEntries; i++ { + vv := v.Index(i) + buf[i] = uint8(vv.Convert(uint8Type).Uint()) + } + doHexDump = true + } + } + + // Hexdump the entire slice as needed. + if doHexDump { + indent := strings.Repeat(d.cs.Indent, d.depth) + str := indent + hex.Dump(buf) + str = strings.Replace(str, "\n", "\n"+indent, -1) + str = strings.TrimRight(str, d.cs.Indent) + d.w.Write([]byte(str)) + return + } + + // Recursively call dump for each item. + for i := 0; i < numEntries; i++ { + d.dump(d.unpackValue(v.Index(i))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } +} + +// dump is the main workhorse for dumping a value. It uses the passed reflect +// value to figure out what kind of object we are dealing with and formats it +// appropriately. It is a recursive function, however circular data structures +// are detected and handled properly. +func (d *dumpState) dump(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + d.w.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + d.indent() + d.dumpPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !d.ignoreNextType { + d.indent() + d.w.Write(openParenBytes) + d.w.Write([]byte(v.Type().String())) + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + d.ignoreNextType = false + + // Display length and capacity if the built-in len and cap functions + // work with the value's kind and the len/cap itself is non-zero. + valueLen, valueCap := 0, 0 + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.Chan: + valueLen, valueCap = v.Len(), v.Cap() + case reflect.Map, reflect.String: + valueLen = v.Len() + } + if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { + d.w.Write(openParenBytes) + if valueLen != 0 { + d.w.Write(lenEqualsBytes) + printInt(d.w, int64(valueLen), 10) + } + if !d.cs.DisableCapacities && valueCap != 0 { + if valueLen != 0 { + d.w.Write(spaceBytes) + } + d.w.Write(capEqualsBytes) + printInt(d.w, int64(valueCap), 10) + } + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + + // Call Stringer/error interfaces if they exist and the handle methods flag + // is enabled + if !d.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(d.cs, d.w, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(d.w, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(d.w, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(d.w, v.Uint(), 10) + + case reflect.Float32: + printFloat(d.w, v.Float(), 32) + + case reflect.Float64: + printFloat(d.w, v.Float(), 64) + + case reflect.Complex64: + printComplex(d.w, v.Complex(), 32) + + case reflect.Complex128: + printComplex(d.w, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + d.dumpSlice(v) + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.String: + d.w.Write([]byte(strconv.Quote(v.String()))) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + d.w.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + numEntries := v.Len() + keys := v.MapKeys() + if d.cs.SortKeys { + sortValues(keys, d.cs) + } + for i, key := range keys { + d.dump(d.unpackValue(key)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.MapIndex(key))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Struct: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + vt := v.Type() + numFields := v.NumField() + for i := 0; i < numFields; i++ { + d.indent() + vtf := vt.Field(i) + d.w.Write([]byte(vtf.Name)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.Field(i))) + if i < (numFields - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(d.w, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(d.w, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it in case any new + // types are added. + default: + if v.CanInterface() { + fmt.Fprintf(d.w, "%v", v.Interface()) + } else { + fmt.Fprintf(d.w, "%v", v.String()) + } + } +} + +// fdump is a helper function to consolidate the logic from the various public +// methods which take varying writers and config states. +func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { + for _, arg := range a { + if arg == nil { + w.Write(interfaceBytes) + w.Write(spaceBytes) + w.Write(nilAngleBytes) + w.Write(newlineBytes) + continue + } + + d := dumpState{w: w, cs: cs} + d.pointers = make(map[uintptr]int) + d.dump(reflect.ValueOf(arg)) + d.w.Write(newlineBytes) + } +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func Fdump(w io.Writer, a ...interface{}) { + fdump(&Config, w, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(&Config, &buf, a...) + return buf.String() +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + - Pointers are dereferenced and followed + - Circular data structures are detected and handled properly + - Custom Stringer/error interfaces are optionally invoked, including + on unexported types + - Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + - Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by an exported package global, +spew.Config. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func Dump(a ...interface{}) { + fdump(&Config, os.Stdout, a...) +} diff --git a/internal/spew/dump_test.go b/internal/spew/dump_test.go new file mode 100644 index 000000000..b7e3b8f64 --- /dev/null +++ b/internal/spew/dump_test.go @@ -0,0 +1,1042 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Test Summary: +NOTE: For each test, a nil pointer, a single pointer and double pointer to the +base test element are also tested to ensure proper indirection across all types. + +- Max int8, int16, int32, int64, int +- Max uint8, uint16, uint32, uint64, uint +- Boolean true and false +- Standard complex64 and complex128 +- Array containing standard ints +- Array containing type with custom formatter on pointer receiver only +- Array containing interfaces +- Array containing bytes +- Slice containing standard float32 values +- Slice containing type with custom formatter on pointer receiver only +- Slice containing interfaces +- Slice containing bytes +- Nil slice +- Standard string +- Nil interface +- Sub-interface +- Map with string keys and int vals +- Map with custom formatter type on pointer receiver only keys and vals +- Map with interface keys and values +- Map with nil interface value +- Struct with primitives +- Struct that contains another struct +- Struct that contains custom type with Stringer pointer interface via both + exported and unexported fields +- Struct that contains embedded struct and field to same struct +- Uintptr to 0 (null pointer) +- Uintptr address of real variable +- Unsafe.Pointer to 0 (null pointer) +- Unsafe.Pointer to address of real variable +- Nil channel +- Standard int channel +- Function with no params and no returns +- Function with param and no returns +- Function with multiple params and multiple returns +- Struct that is circular through self referencing +- Structs that are circular through cross referencing +- Structs that are indirectly circular +- Type that panics in its Stringer interface +*/ + +package spew_test + +import ( + "bytes" + "fmt" + "testing" + "unsafe" + + "github.com/expr-lang/expr/internal/spew" +) + +// dumpTest is used to describe a test to be performed against the Dump method. +type dumpTest struct { + in interface{} + wants []string +} + +// dumpTests houses all of the tests to be performed against the Dump method. +var dumpTests = make([]dumpTest, 0) + +// addDumpTest is a helper method to append the passed input and desired result +// to dumpTests +func addDumpTest(in interface{}, wants ...string) { + test := dumpTest{in, wants} + dumpTests = append(dumpTests, test) +} + +func addIntDumpTests() { + // Max int8. + v := int8(127) + nv := (*int8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "int8" + vs := "127" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Max int16. + v2 := int16(32767) + nv2 := (*int16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "int16" + v2s := "32767" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Max int32. + v3 := int32(2147483647) + nv3 := (*int32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "int32" + v3s := "2147483647" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Max int64. + v4 := int64(9223372036854775807) + nv4 := (*int64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "int64" + v4s := "9223372036854775807" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") + + // Max int. + v5 := int(2147483647) + nv5 := (*int)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "int" + v5s := "2147483647" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") + addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") + addDumpTest(nv5, "(*"+v5t+")()\n") +} + +func addUintDumpTests() { + // Max uint8. + v := uint8(255) + nv := (*uint8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uint8" + vs := "255" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Max uint16. + v2 := uint16(65535) + nv2 := (*uint16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Max uint32. + v3 := uint32(4294967295) + nv3 := (*uint32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "uint32" + v3s := "4294967295" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Max uint64. + v4 := uint64(18446744073709551615) + nv4 := (*uint64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "uint64" + v4s := "18446744073709551615" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") + + // Max uint. + v5 := uint(4294967295) + nv5 := (*uint)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "uint" + v5s := "4294967295" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") + addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") + addDumpTest(nv5, "(*"+v5t+")()\n") +} + +func addBoolDumpTests() { + // Boolean true. + v := bool(true) + nv := (*bool)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "bool" + vs := "true" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Boolean false. + v2 := bool(false) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "bool" + v2s := "false" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") +} + +func addFloatDumpTests() { + // Standard float32. + v := float32(3.1415) + nv := (*float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "float32" + vs := "3.1415" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Standard float64. + v2 := float64(3.1415926) + nv2 := (*float64)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "float64" + v2s := "3.1415926" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") +} + +func addComplexDumpTests() { + // Standard complex64. + v := complex(float32(6), -2) + nv := (*complex64)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "complex64" + vs := "(6-2i)" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Standard complex128. + v2 := complex(float64(-6), 2) + nv2 := (*complex128)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "complex128" + v2s := "(-6+2i)" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") +} + +func addArrayDumpTests() { + // Array containing standard ints. + v := [3]int{1, 2, 3} + vLen := fmt.Sprintf("%d", len(v)) + vCap := fmt.Sprintf("%d", cap(v)) + nv := (*[3]int)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "int" + vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 1,\n (" + + vt + ") 2,\n (" + vt + ") 3\n}" + addDumpTest(v, "([3]"+vt+") "+vs+"\n") + addDumpTest(pv, "(*[3]"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**[3]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*[3]"+vt+")()\n") + + // Array containing type with custom formatter on pointer receiver only. + v2i0 := pstringer("1") + v2i1 := pstringer("2") + v2i2 := pstringer("3") + v2 := [3]pstringer{v2i0, v2i1, v2i2} + v2i0Len := fmt.Sprintf("%d", len(v2i0)) + v2i1Len := fmt.Sprintf("%d", len(v2i1)) + v2i2Len := fmt.Sprintf("%d", len(v2i2)) + v2Len := fmt.Sprintf("%d", len(v2)) + v2Cap := fmt.Sprintf("%d", cap(v2)) + nv2 := (*[3]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.pstringer" + v2sp := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + + ") (len=" + v2i0Len + ") stringer 1,\n (" + v2t + + ") (len=" + v2i1Len + ") stringer 2,\n (" + v2t + + ") (len=" + v2i2Len + ") " + "stringer 3\n}" + v2s := v2sp + if spew.UnsafeDisabled { + v2s = "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + + ") (len=" + v2i0Len + ") \"1\",\n (" + v2t + ") (len=" + + v2i1Len + ") \"2\",\n (" + v2t + ") (len=" + v2i2Len + + ") " + "\"3\"\n}" + } + addDumpTest(v2, "([3]"+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*[3]"+v2t+")("+v2Addr+")("+v2sp+")\n") + addDumpTest(&pv2, "(**[3]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2sp+")\n") + addDumpTest(nv2, "(*[3]"+v2t+")()\n") + + // Array containing interfaces. + v3i0 := "one" + v3 := [3]interface{}{v3i0, int(2), uint(3)} + v3i0Len := fmt.Sprintf("%d", len(v3i0)) + v3Len := fmt.Sprintf("%d", len(v3)) + v3Cap := fmt.Sprintf("%d", cap(v3)) + nv3 := (*[3]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[3]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + + "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + + v3t4 + ") 3\n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Array containing bytes. + v4 := [34]byte{ + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, + } + v4Len := fmt.Sprintf("%d", len(v4)) + v4Cap := fmt.Sprintf("%d", cap(v4)) + nv4 := (*[34]byte)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "[34]uint8" + v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + + "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + + " |............... |\n" + + " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + + " |!\"#$%&'()*+,-./0|\n" + + " 00000020 31 32 " + + " |12|\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") +} + +func addSliceDumpTests() { + // Slice containing standard float32 values. + v := []float32{3.14, 6.28, 12.56} + vLen := fmt.Sprintf("%d", len(v)) + vCap := fmt.Sprintf("%d", cap(v)) + nv := (*[]float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "float32" + vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 3.14,\n (" + + vt + ") 6.28,\n (" + vt + ") 12.56\n}" + addDumpTest(v, "([]"+vt+") "+vs+"\n") + addDumpTest(pv, "(*[]"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**[]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*[]"+vt+")()\n") + + // Slice containing type with custom formatter on pointer receiver only. + v2i0 := pstringer("1") + v2i1 := pstringer("2") + v2i2 := pstringer("3") + v2 := []pstringer{v2i0, v2i1, v2i2} + v2i0Len := fmt.Sprintf("%d", len(v2i0)) + v2i1Len := fmt.Sprintf("%d", len(v2i1)) + v2i2Len := fmt.Sprintf("%d", len(v2i2)) + v2Len := fmt.Sprintf("%d", len(v2)) + v2Cap := fmt.Sprintf("%d", cap(v2)) + nv2 := (*[]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.pstringer" + v2s := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + ") (len=" + + v2i0Len + ") stringer 1,\n (" + v2t + ") (len=" + v2i1Len + + ") stringer 2,\n (" + v2t + ") (len=" + v2i2Len + ") " + + "stringer 3\n}" + addDumpTest(v2, "([]"+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*[]"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**[]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*[]"+v2t+")()\n") + + // Slice containing interfaces. + v3i0 := "one" + v3 := []interface{}{v3i0, int(2), uint(3), nil} + v3i0Len := fmt.Sprintf("%d", len(v3i0)) + v3Len := fmt.Sprintf("%d", len(v3)) + v3Cap := fmt.Sprintf("%d", cap(v3)) + nv3 := (*[]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3t5 := "interface {}" + v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + + "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + + v3t4 + ") 3,\n (" + v3t5 + ") \n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Slice containing bytes. + v4 := []byte{ + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, + } + v4Len := fmt.Sprintf("%d", len(v4)) + v4Cap := fmt.Sprintf("%d", cap(v4)) + nv4 := (*[]byte)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "[]uint8" + v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + + "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + + " |............... |\n" + + " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + + " |!\"#$%&'()*+,-./0|\n" + + " 00000020 31 32 " + + " |12|\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") + + // Nil slice. + v5 := []int(nil) + nv5 := (*[]int)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "[]int" + v5s := "" + addDumpTest(v5, "("+v5t+") "+v5s+"\n") + addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") + addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") + addDumpTest(nv5, "(*"+v5t+")()\n") +} + +func addStringDumpTests() { + // Standard string. + v := "test" + vLen := fmt.Sprintf("%d", len(v)) + nv := (*string)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "string" + vs := "(len=" + vLen + ") \"test\"" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +func addInterfaceDumpTests() { + // Nil interface. + var v interface{} + nv := (*interface{})(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "interface {}" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Sub-interface. + v2 := interface{}(uint16(65535)) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") +} + +func addMapDumpTests() { + // Map with string keys and int vals. + k := "one" + kk := "two" + m := map[string]int{k: 1, kk: 2} + klen := fmt.Sprintf("%d", len(k)) // not kLen to shut golint up + kkLen := fmt.Sprintf("%d", len(kk)) + mLen := fmt.Sprintf("%d", len(m)) + nilMap := map[string]int(nil) + nm := (*map[string]int)(nil) + pm := &m + mAddr := fmt.Sprintf("%p", pm) + pmAddr := fmt.Sprintf("%p", &pm) + mt := "map[string]int" + mt1 := "string" + mt2 := "int" + ms := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + klen + ") " + + "\"one\": (" + mt2 + ") 1,\n (" + mt1 + ") (len=" + kkLen + + ") \"two\": (" + mt2 + ") 2\n}" + ms2 := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + kkLen + ") " + + "\"two\": (" + mt2 + ") 2,\n (" + mt1 + ") (len=" + klen + + ") \"one\": (" + mt2 + ") 1\n}" + addDumpTest(m, "("+mt+") "+ms+"\n", "("+mt+") "+ms2+"\n") + addDumpTest(pm, "(*"+mt+")("+mAddr+")("+ms+")\n", + "(*"+mt+")("+mAddr+")("+ms2+")\n") + addDumpTest(&pm, "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms+")\n", + "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms2+")\n") + addDumpTest(nm, "(*"+mt+")()\n") + addDumpTest(nilMap, "("+mt+") \n") + + // Map with custom formatter type on pointer receiver only keys and vals. + k2 := pstringer("one") + v2 := pstringer("1") + m2 := map[pstringer]pstringer{k2: v2} + k2Len := fmt.Sprintf("%d", len(k2)) + v2Len := fmt.Sprintf("%d", len(v2)) + m2Len := fmt.Sprintf("%d", len(m2)) + nilMap2 := map[pstringer]pstringer(nil) + nm2 := (*map[pstringer]pstringer)(nil) + pm2 := &m2 + m2Addr := fmt.Sprintf("%p", pm2) + pm2Addr := fmt.Sprintf("%p", &pm2) + m2t := "map[spew_test.pstringer]spew_test.pstringer" + m2t1 := "spew_test.pstringer" + m2t2 := "spew_test.pstringer" + m2s := "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + ") " + + "stringer one: (" + m2t2 + ") (len=" + v2Len + ") stringer 1\n}" + if spew.UnsafeDisabled { + m2s = "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + + ") " + "\"one\": (" + m2t2 + ") (len=" + v2Len + + ") \"1\"\n}" + } + addDumpTest(m2, "("+m2t+") "+m2s+"\n") + addDumpTest(pm2, "(*"+m2t+")("+m2Addr+")("+m2s+")\n") + addDumpTest(&pm2, "(**"+m2t+")("+pm2Addr+"->"+m2Addr+")("+m2s+")\n") + addDumpTest(nm2, "(*"+m2t+")()\n") + addDumpTest(nilMap2, "("+m2t+") \n") + + // Map with interface keys and values. + k3 := "one" + k3Len := fmt.Sprintf("%d", len(k3)) + m3 := map[interface{}]interface{}{k3: 1} + m3Len := fmt.Sprintf("%d", len(m3)) + nilMap3 := map[interface{}]interface{}(nil) + nm3 := (*map[interface{}]interface{})(nil) + pm3 := &m3 + m3Addr := fmt.Sprintf("%p", pm3) + pm3Addr := fmt.Sprintf("%p", &pm3) + m3t := "map[interface {}]interface {}" + m3t1 := "string" + m3t2 := "int" + m3s := "(len=" + m3Len + ") {\n (" + m3t1 + ") (len=" + k3Len + ") " + + "\"one\": (" + m3t2 + ") 1\n}" + addDumpTest(m3, "("+m3t+") "+m3s+"\n") + addDumpTest(pm3, "(*"+m3t+")("+m3Addr+")("+m3s+")\n") + addDumpTest(&pm3, "(**"+m3t+")("+pm3Addr+"->"+m3Addr+")("+m3s+")\n") + addDumpTest(nm3, "(*"+m3t+")()\n") + addDumpTest(nilMap3, "("+m3t+") \n") + + // Map with nil interface value. + k4 := "nil" + k4Len := fmt.Sprintf("%d", len(k4)) + m4 := map[string]interface{}{k4: nil} + m4Len := fmt.Sprintf("%d", len(m4)) + nilMap4 := map[string]interface{}(nil) + nm4 := (*map[string]interface{})(nil) + pm4 := &m4 + m4Addr := fmt.Sprintf("%p", pm4) + pm4Addr := fmt.Sprintf("%p", &pm4) + m4t := "map[string]interface {}" + m4t1 := "string" + m4t2 := "interface {}" + m4s := "(len=" + m4Len + ") {\n (" + m4t1 + ") (len=" + k4Len + ")" + + " \"nil\": (" + m4t2 + ") \n}" + addDumpTest(m4, "("+m4t+") "+m4s+"\n") + addDumpTest(pm4, "(*"+m4t+")("+m4Addr+")("+m4s+")\n") + addDumpTest(&pm4, "(**"+m4t+")("+pm4Addr+"->"+m4Addr+")("+m4s+")\n") + addDumpTest(nm4, "(*"+m4t+")()\n") + addDumpTest(nilMap4, "("+m4t+") \n") +} + +func addStructDumpTests() { + // Struct with primitives. + type s1 struct { + a int8 + b uint8 + } + v := s1{127, 255} + nv := (*s1)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.s1" + vt2 := "int8" + vt3 := "uint8" + vs := "{\n a: (" + vt2 + ") 127,\n b: (" + vt3 + ") 255\n}" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Struct that contains another struct. + type s2 struct { + s1 s1 + b bool + } + v2 := s2{s1{127, 255}, true} + nv2 := (*s2)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.s2" + v2t2 := "spew_test.s1" + v2t3 := "int8" + v2t4 := "uint8" + v2t5 := "bool" + v2s := "{\n s1: (" + v2t2 + ") {\n a: (" + v2t3 + ") 127,\n b: (" + + v2t4 + ") 255\n },\n b: (" + v2t5 + ") true\n}" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Struct that contains custom type with Stringer pointer interface via both + // exported and unexported fields. + type s3 struct { + s pstringer + S pstringer + } + v3 := s3{"test", "test2"} + nv3 := (*s3)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.s3" + v3t2 := "spew_test.pstringer" + v3s := "{\n s: (" + v3t2 + ") (len=4) stringer test,\n S: (" + v3t2 + + ") (len=5) stringer test2\n}" + v3sp := v3s + if spew.UnsafeDisabled { + v3s = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + + v3t2 + ") (len=5) \"test2\"\n}" + v3sp = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + + v3t2 + ") (len=5) stringer test2\n}" + } + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3sp+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3sp+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") + + // Struct that contains embedded struct and field to same struct. + e := embed{"embedstr"} + eLen := fmt.Sprintf("%d", len("embedstr")) + v4 := embedwrap{embed: &e, e: &e} + nv4 := (*embedwrap)(nil) + pv4 := &v4 + eAddr := fmt.Sprintf("%p", &e) + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "spew_test.embedwrap" + v4t2 := "spew_test.embed" + v4t3 := "string" + v4s := "{\n embed: (*" + v4t2 + ")(" + eAddr + ")({\n a: (" + v4t3 + + ") (len=" + eLen + ") \"embedstr\"\n }),\n e: (*" + v4t2 + + ")(" + eAddr + ")({\n a: (" + v4t3 + ") (len=" + eLen + ")" + + " \"embedstr\"\n })\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") + addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") + addDumpTest(nv4, "(*"+v4t+")()\n") +} + +func addUintptrDumpTests() { + // Null pointer. + v := uintptr(0) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uintptr" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + + // Address of real variable. + i := 1 + v2 := uintptr(unsafe.Pointer(&i)) + nv2 := (*uintptr)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uintptr" + v2s := fmt.Sprintf("%p", &i) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") +} + +func addUnsafePointerDumpTests() { + // Null pointer. + v := unsafe.Pointer(nil) + nv := (*unsafe.Pointer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "unsafe.Pointer" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Address of real variable. + i := 1 + v2 := unsafe.Pointer(&i) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "unsafe.Pointer" + v2s := fmt.Sprintf("%p", &i) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +func addChanDumpTests() { + // Nil channel. + var v chan int + pv := &v + nv := (*chan int)(nil) + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "chan int" + vs := "" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Real channel. + v2 := make(chan int) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "chan int" + v2s := fmt.Sprintf("%p", v2) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") +} + +func addFuncDumpTests() { + // Function with no params and no returns. + v := addIntDumpTests + nv := (*func())(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "func()" + vs := fmt.Sprintf("%p", v) + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") + + // Function with param and no returns. + v2 := TestDump + nv2 := (*func(*testing.T))(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "func(*testing.T)" + v2s := fmt.Sprintf("%p", v2) + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") + addDumpTest(nv2, "(*"+v2t+")()\n") + + // Function with multiple params and multiple returns. + var v3 = func(i int, s string) (b bool, err error) { + return true, nil + } + nv3 := (*func(int, string) (bool, error))(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "func(int, string) (bool, error)" + v3s := fmt.Sprintf("%p", v3) + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") + addDumpTest(nv3, "(*"+v3t+")()\n") +} + +func addCircularDumpTests() { + // Struct that is circular through self referencing. + type circular struct { + c *circular + } + v := circular{nil} + v.c = &v + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.circular" + vs := "{\n c: (*" + vt + ")(" + vAddr + ")({\n c: (*" + vt + ")(" + + vAddr + ")()\n })\n}" + vs2 := "{\n c: (*" + vt + ")(" + vAddr + ")()\n}" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs2+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs2+")\n") + + // Structs that are circular through cross referencing. + v2 := xref1{nil} + ts2 := xref2{&v2} + v2.ps2 = &ts2 + pv2 := &v2 + ts2Addr := fmt.Sprintf("%p", &ts2) + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.xref1" + v2t2 := "spew_test.xref2" + v2s := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + + ")(" + v2Addr + ")({\n ps2: (*" + v2t2 + ")(" + ts2Addr + + ")()\n })\n })\n}" + v2s2 := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + + ")(" + v2Addr + ")()\n })\n}" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s2+")\n") + addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s2+")\n") + + // Structs that are indirectly circular. + v3 := indirCir1{nil} + tic2 := indirCir2{nil} + tic3 := indirCir3{&v3} + tic2.ps3 = &tic3 + v3.ps2 = &tic2 + pv3 := &v3 + tic2Addr := fmt.Sprintf("%p", &tic2) + tic3Addr := fmt.Sprintf("%p", &tic3) + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.indirCir1" + v3t2 := "spew_test.indirCir2" + v3t3 := "spew_test.indirCir3" + v3s := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + + ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + + ")({\n ps2: (*" + v3t2 + ")(" + tic2Addr + + ")()\n })\n })\n })\n}" + v3s2 := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + + ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + + ")()\n })\n })\n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n") + addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s2+")\n") + addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s2+")\n") +} + +func addPanicDumpTests() { + // Type that panics in its Stringer interface. + v := panicer(127) + nv := (*panicer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.panicer" + vs := "(PANIC=test panic)127" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +func addErrorDumpTests() { + // Type that has a custom Error interface. + v := customError(127) + nv := (*customError)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.customError" + vs := "error: 127" + addDumpTest(v, "("+vt+") "+vs+"\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") + addDumpTest(nv, "(*"+vt+")()\n") +} + +// TestDump executes all of the tests described by dumpTests. +func TestDump(t *testing.T) { + // Setup tests. + addIntDumpTests() + addUintDumpTests() + addBoolDumpTests() + addFloatDumpTests() + addComplexDumpTests() + addArrayDumpTests() + addSliceDumpTests() + addStringDumpTests() + addInterfaceDumpTests() + addMapDumpTests() + addStructDumpTests() + addUintptrDumpTests() + addUnsafePointerDumpTests() + addChanDumpTests() + addFuncDumpTests() + addCircularDumpTests() + addPanicDumpTests() + addErrorDumpTests() + addCgoDumpTests() + + t.Logf("Running %d tests", len(dumpTests)) + for i, test := range dumpTests { + buf := new(bytes.Buffer) + spew.Fdump(buf, test.in) + s := buf.String() + if testFailed(s, test.wants) { + t.Errorf("Dump #%d\n got: %s %s", i, s, stringizeWants(test.wants)) + continue + } + } +} + +func TestDumpSortedKeys(t *testing.T) { + cfg := spew.ConfigState{SortKeys: true} + s := cfg.Sdump(map[int]string{1: "1", 3: "3", 2: "2"}) + expected := "(map[int]string) (len=3) {\n(int) 1: (string) (len=1) " + + "\"1\",\n(int) 2: (string) (len=1) \"2\",\n(int) 3: (string) " + + "(len=1) \"3\"\n" + + "}\n" + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + + s = cfg.Sdump(map[stringer]int{"1": 1, "3": 3, "2": 2}) + expected = "(map[spew_test.stringer]int) (len=3) {\n" + + "(spew_test.stringer) (len=1) stringer 1: (int) 1,\n" + + "(spew_test.stringer) (len=1) stringer 2: (int) 2,\n" + + "(spew_test.stringer) (len=1) stringer 3: (int) 3\n" + + "}\n" + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + + s = cfg.Sdump(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) + expected = "(map[spew_test.pstringer]int) (len=3) {\n" + + "(spew_test.pstringer) (len=1) stringer 1: (int) 1,\n" + + "(spew_test.pstringer) (len=1) stringer 2: (int) 2,\n" + + "(spew_test.pstringer) (len=1) stringer 3: (int) 3\n" + + "}\n" + if spew.UnsafeDisabled { + expected = "(map[spew_test.pstringer]int) (len=3) {\n" + + "(spew_test.pstringer) (len=1) \"1\": (int) 1,\n" + + "(spew_test.pstringer) (len=1) \"2\": (int) 2,\n" + + "(spew_test.pstringer) (len=1) \"3\": (int) 3\n" + + "}\n" + } + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + + s = cfg.Sdump(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) + expected = "(map[spew_test.customError]int) (len=3) {\n" + + "(spew_test.customError) error: 1: (int) 1,\n" + + "(spew_test.customError) error: 2: (int) 2,\n" + + "(spew_test.customError) error: 3: (int) 3\n" + + "}\n" + if s != expected { + t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) + } + +} diff --git a/internal/spew/dumpcgo_test.go b/internal/spew/dumpcgo_test.go new file mode 100644 index 000000000..1bf71fafb --- /dev/null +++ b/internal/spew/dumpcgo_test.go @@ -0,0 +1,102 @@ +// Copyright (c) 2013-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when both cgo is supported and "-tags testcgo" is added to the go test +// command line. This means the cgo tests are only added (and hence run) when +// specifially requested. This configuration is used because spew itself +// does not require cgo to run even though it does handle certain cgo types +// specially. Rather than forcing all clients to require cgo and an external +// C compiler just to run the tests, this scheme makes them optional. +//go:build cgo && testcgo +// +build cgo,testcgo + +package spew_test + +import ( + "fmt" + + "github.com/expr-lang/expr/internal/spew/testdata" +) + +func addCgoDumpTests() { + // C char pointer. + v := testdata.GetCgoCharPointer() + nv := testdata.GetCgoNullCharPointer() + pv := &v + vcAddr := fmt.Sprintf("%p", v) + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "*testdata._Ctype_char" + vs := "116" + addDumpTest(v, "("+vt+")("+vcAddr+")("+vs+")\n") + addDumpTest(pv, "(*"+vt+")("+vAddr+"->"+vcAddr+")("+vs+")\n") + addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+"->"+vcAddr+")("+vs+")\n") + addDumpTest(nv, "("+vt+")()\n") + + // C char array. + v2, v2l, v2c := testdata.GetCgoCharArray() + v2Len := fmt.Sprintf("%d", v2l) + v2Cap := fmt.Sprintf("%d", v2c) + v2t := "[6]testdata._Ctype_char" + v2s := "(len=" + v2Len + " cap=" + v2Cap + ") " + + "{\n 00000000 74 65 73 74 32 00 " + + " |test2.|\n}" + addDumpTest(v2, "("+v2t+") "+v2s+"\n") + + // C unsigned char array. + v3, v3l, v3c := testdata.GetCgoUnsignedCharArray() + v3Len := fmt.Sprintf("%d", v3l) + v3Cap := fmt.Sprintf("%d", v3c) + v3t := "[6]testdata._Ctype_unsignedchar" + v3t2 := "[6]testdata._Ctype_uchar" + v3s := "(len=" + v3Len + " cap=" + v3Cap + ") " + + "{\n 00000000 74 65 73 74 33 00 " + + " |test3.|\n}" + addDumpTest(v3, "("+v3t+") "+v3s+"\n", "("+v3t2+") "+v3s+"\n") + + // C signed char array. + v4, v4l, v4c := testdata.GetCgoSignedCharArray() + v4Len := fmt.Sprintf("%d", v4l) + v4Cap := fmt.Sprintf("%d", v4c) + v4t := "[6]testdata._Ctype_schar" + v4t2 := "testdata._Ctype_schar" + v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + + "{\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 101,\n (" + v4t2 + + ") 115,\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 52,\n (" + v4t2 + + ") 0\n}" + addDumpTest(v4, "("+v4t+") "+v4s+"\n") + + // C uint8_t array. + v5, v5l, v5c := testdata.GetCgoUint8tArray() + v5Len := fmt.Sprintf("%d", v5l) + v5Cap := fmt.Sprintf("%d", v5c) + v5t := "[6]testdata._Ctype_uint8_t" + v5t2 := "[6]testdata._Ctype_uchar" + v5s := "(len=" + v5Len + " cap=" + v5Cap + ") " + + "{\n 00000000 74 65 73 74 35 00 " + + " |test5.|\n}" + addDumpTest(v5, "("+v5t+") "+v5s+"\n", "("+v5t2+") "+v5s+"\n") + + // C typedefed unsigned char array. + v6, v6l, v6c := testdata.GetCgoTypdefedUnsignedCharArray() + v6Len := fmt.Sprintf("%d", v6l) + v6Cap := fmt.Sprintf("%d", v6c) + v6t := "[6]testdata._Ctype_custom_uchar_t" + v6t2 := "[6]testdata._Ctype_uchar" + v6s := "(len=" + v6Len + " cap=" + v6Cap + ") " + + "{\n 00000000 74 65 73 74 36 00 " + + " |test6.|\n}" + addDumpTest(v6, "("+v6t+") "+v6s+"\n", "("+v6t2+") "+v6s+"\n") +} diff --git a/internal/spew/dumpnocgo_test.go b/internal/spew/dumpnocgo_test.go new file mode 100644 index 000000000..9498d98a7 --- /dev/null +++ b/internal/spew/dumpnocgo_test.go @@ -0,0 +1,27 @@ +// Copyright (c) 2013 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when either cgo is not supported or "-tags testcgo" is not added to the go +// test command line. This file intentionally does not setup any cgo tests in +// this scenario. +//go:build !cgo || !testcgo +// +build !cgo !testcgo + +package spew_test + +func addCgoDumpTests() { + // Don't add any tests for cgo since this file is only compiled when + // there should not be any cgo tests. +} diff --git a/internal/spew/example_test.go b/internal/spew/example_test.go new file mode 100644 index 000000000..f5d659b23 --- /dev/null +++ b/internal/spew/example_test.go @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew_test + +import ( + "fmt" + + "github.com/expr-lang/expr/internal/spew" +) + +type Flag int + +const ( + flagOne Flag = iota + flagTwo +) + +var flagStrings = map[Flag]string{ + flagOne: "flagOne", + flagTwo: "flagTwo", +} + +func (f Flag) String() string { + if s, ok := flagStrings[f]; ok { + return s + } + return fmt.Sprintf("Unknown flag (%d)", int(f)) +} + +type Bar struct { + data uintptr +} + +type Foo struct { + unexportedField Bar + ExportedField map[interface{}]interface{} +} + +// This example demonstrates how to use Dump to dump variables to stdout. +func ExampleDump() { + // The following package level declarations are assumed for this example: + /* + type Flag int + + const ( + flagOne Flag = iota + flagTwo + ) + + var flagStrings = map[Flag]string{ + flagOne: "flagOne", + flagTwo: "flagTwo", + } + + func (f Flag) String() string { + if s, ok := flagStrings[f]; ok { + return s + } + return fmt.Sprintf("Unknown flag (%d)", int(f)) + } + + type Bar struct { + data uintptr + } + + type Foo struct { + unexportedField Bar + ExportedField map[interface{}]interface{} + } + */ + + // Setup some sample data structures for the example. + bar := Bar{uintptr(0)} + s1 := Foo{bar, map[interface{}]interface{}{"one": true}} + f := Flag(5) + b := []byte{ + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, + } + + // Dump! + spew.Dump(s1, f, b) + + // Output: + // (spew_test.Foo) { + // unexportedField: (spew_test.Bar) { + // data: (uintptr) + // }, + // ExportedField: (map[interface {}]interface {}) (len=1) { + // (string) (len=3) "one": (bool) true + // } + // } + // (spew_test.Flag) Unknown flag (5) + // ([]uint8) (len=34 cap=34) { + // 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + // 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + // 00000020 31 32 |12| + // } + // +} + +// This example demonstrates how to use Printf to display a variable with a +// format string and inline formatting. +func ExamplePrintf() { + // Create a double pointer to a uint 8. + ui8 := uint8(5) + pui8 := &ui8 + ppui8 := &pui8 + + // Create a circular data type. + type circular struct { + ui8 uint8 + c *circular + } + c := circular{ui8: 1} + c.c = &c + + // Print! + spew.Printf("ppui8: %v\n", ppui8) + spew.Printf("circular: %v\n", c) + + // Output: + // ppui8: <**>5 + // circular: {1 <*>{1 <*>}} +} + +// This example demonstrates how to use a ConfigState. +func ExampleConfigState() { + // Modify the indent level of the ConfigState only. The global + // configuration is not modified. + scs := spew.ConfigState{Indent: "\t"} + + // Output using the ConfigState instance. + v := map[string]int{"one": 1} + scs.Printf("v: %v\n", v) + scs.Dump(v) + + // Output: + // v: map[one:1] + // (map[string]int) (len=1) { + // (string) (len=3) "one": (int) 1 + // } +} + +// This example demonstrates how to use ConfigState.Dump to dump variables to +// stdout +func ExampleConfigState_Dump() { + // See the top-level Dump example for details on the types used in this + // example. + + // Create two ConfigState instances with different indentation. + scs := spew.ConfigState{Indent: "\t"} + scs2 := spew.ConfigState{Indent: " "} + + // Setup some sample data structures for the example. + bar := Bar{uintptr(0)} + s1 := Foo{bar, map[interface{}]interface{}{"one": true}} + + // Dump using the ConfigState instances. + scs.Dump(s1) + scs2.Dump(s1) + + // Output: + // (spew_test.Foo) { + // unexportedField: (spew_test.Bar) { + // data: (uintptr) + // }, + // ExportedField: (map[interface {}]interface {}) (len=1) { + // (string) (len=3) "one": (bool) true + // } + // } + // (spew_test.Foo) { + // unexportedField: (spew_test.Bar) { + // data: (uintptr) + // }, + // ExportedField: (map[interface {}]interface {}) (len=1) { + // (string) (len=3) "one": (bool) true + // } + // } + // +} + +// This example demonstrates how to use ConfigState.Printf to display a variable +// with a format string and inline formatting. +func ExampleConfigState_Printf() { + // See the top-level Dump example for details on the types used in this + // example. + + // Create two ConfigState instances and modify the method handling of the + // first ConfigState only. + scs := spew.NewDefaultConfig() + scs2 := spew.NewDefaultConfig() + scs.DisableMethods = true + + // Alternatively + // scs := spew.ConfigState{Indent: " ", DisableMethods: true} + // scs2 := spew.ConfigState{Indent: " "} + + // This is of type Flag which implements a Stringer and has raw value 1. + f := flagTwo + + // Dump using the ConfigState instances. + scs.Printf("f: %v\n", f) + scs2.Printf("f: %v\n", f) + + // Output: + // f: 1 + // f: flagTwo +} diff --git a/internal/spew/format.go b/internal/spew/format.go new file mode 100644 index 000000000..b04edb7d7 --- /dev/null +++ b/internal/spew/format.go @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" +) + +// supportedFlags is a list of all the character flags supported by fmt package. +const supportedFlags = "0-+# " + +// formatState implements the fmt.Formatter interface and contains information +// about the state of a formatting operation. The NewFormatter function can +// be used to get a new Formatter which can be used directly as arguments +// in standard fmt package printing calls. +type formatState struct { + value interface{} + fs fmt.State + depth int + pointers map[uintptr]int + ignoreNextType bool + cs *ConfigState +} + +// buildDefaultFormat recreates the original format string without precision +// and width information to pass in to fmt.Sprintf in the case of an +// unrecognized type. Unless new types are added to the language, this +// function won't ever be called. +func (f *formatState) buildDefaultFormat() (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + buf.WriteRune('v') + + format = buf.String() + return format +} + +// constructOrigFormat recreates the original format string including precision +// and width information to pass along to the standard fmt package. This allows +// automatic deferral of all format strings this package doesn't support. +func (f *formatState) constructOrigFormat(verb rune) (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + if width, ok := f.fs.Width(); ok { + buf.WriteString(strconv.Itoa(width)) + } + + if precision, ok := f.fs.Precision(); ok { + buf.Write(precisionBytes) + buf.WriteString(strconv.Itoa(precision)) + } + + buf.WriteRune(verb) + + format = buf.String() + return format +} + +// unpackValue returns values inside of non-nil interfaces when possible and +// ensures that types for values which have been unpacked from an interface +// are displayed when the show types flag is also set. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (f *formatState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface { + f.ignoreNextType = false + if !v.IsNil() { + v = v.Elem() + } + } + return v +} + +// formatPtr handles formatting of pointers by indirecting them as necessary. +func (f *formatState) formatPtr(v reflect.Value) { + // Display nil if top level pointer is nil. + showTypes := f.fs.Flag('#') + if v.IsNil() && (!showTypes || f.ignoreNextType) { + f.fs.Write(nilAngleBytes) + return + } + + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range f.pointers { + if depth >= f.depth { + delete(f.pointers, k) + } + } + + // Keep list of all dereferenced pointers to possibly show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by derferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := f.pointers[addr]; ok && pd < f.depth { + cycleFound = true + indirects-- + break + } + f.pointers[addr] = f.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type or indirection level depending on flags. + if showTypes && !f.ignoreNextType { + f.fs.Write(openParenBytes) + f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) + f.fs.Write([]byte(ve.Type().String())) + f.fs.Write(closeParenBytes) + } else { + if nilFound || cycleFound { + indirects += strings.Count(ve.Type().String(), "*") + } + f.fs.Write(openAngleBytes) + f.fs.Write([]byte(strings.Repeat("*", indirects))) + f.fs.Write(closeAngleBytes) + } + + // Display pointer information depending on flags. + if f.fs.Flag('+') && (len(pointerChain) > 0) { + f.fs.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + f.fs.Write(pointerChainBytes) + } + printHexPtr(f.fs, addr) + } + f.fs.Write(closeParenBytes) + } + + // Display dereferenced value. + switch { + case nilFound: + f.fs.Write(nilAngleBytes) + + case cycleFound: + f.fs.Write(circularShortBytes) + + default: + f.ignoreNextType = true + f.format(ve) + } +} + +// format is the main workhorse for providing the Formatter interface. It +// uses the passed reflect value to figure out what kind of object we are +// dealing with and formats it appropriately. It is a recursive function, +// however circular data structures are detected and handled properly. +func (f *formatState) format(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + f.fs.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + f.formatPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !f.ignoreNextType && f.fs.Flag('#') { + f.fs.Write(openParenBytes) + f.fs.Write([]byte(v.Type().String())) + f.fs.Write(closeParenBytes) + } + f.ignoreNextType = false + + // Call Stringer/error interfaces if they exist and the handle methods + // flag is enabled. + if !f.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(f.cs, f.fs, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(f.fs, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(f.fs, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(f.fs, v.Uint(), 10) + + case reflect.Float32: + printFloat(f.fs, v.Float(), 32) + + case reflect.Float64: + printFloat(f.fs, v.Float(), 64) + + case reflect.Complex64: + printComplex(f.fs, v.Complex(), 32) + + case reflect.Complex128: + printComplex(f.fs, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + f.fs.Write(openBracketBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + numEntries := v.Len() + for i := 0; i < numEntries; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(v.Index(i))) + } + } + f.depth-- + f.fs.Write(closeBracketBytes) + + case reflect.String: + f.fs.Write([]byte(v.String())) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + f.fs.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + + f.fs.Write(openMapBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + keys := v.MapKeys() + if f.cs.SortKeys { + sortValues(keys, f.cs) + } + for i, key := range keys { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(key)) + f.fs.Write(colonBytes) + f.ignoreNextType = true + f.format(f.unpackValue(v.MapIndex(key))) + } + } + f.depth-- + f.fs.Write(closeMapBytes) + + case reflect.Struct: + numFields := v.NumField() + f.fs.Write(openBraceBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + vt := v.Type() + for i := 0; i < numFields; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + vtf := vt.Field(i) + if f.fs.Flag('+') || f.fs.Flag('#') { + f.fs.Write([]byte(vtf.Name)) + f.fs.Write(colonBytes) + } + f.format(f.unpackValue(v.Field(i))) + } + } + f.depth-- + f.fs.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(f.fs, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(f.fs, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it if any get added. + default: + format := f.buildDefaultFormat() + if v.CanInterface() { + fmt.Fprintf(f.fs, format, v.Interface()) + } else { + fmt.Fprintf(f.fs, format, v.String()) + } + } +} + +// Format satisfies the fmt.Formatter interface. See NewFormatter for usage +// details. +func (f *formatState) Format(fs fmt.State, verb rune) { + f.fs = fs + + // Use standard formatting for verbs that are not v. + if verb != 'v' { + format := f.constructOrigFormat(verb) + fmt.Fprintf(fs, format, f.value) + return + } + + if f.value == nil { + if fs.Flag('#') { + fs.Write(interfaceBytes) + } + fs.Write(nilAngleBytes) + return + } + + f.format(reflect.ValueOf(f.value)) +} + +// newFormatter is a helper function to consolidate the logic from the various +// public methods which take varying config states. +func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { + fs := &formatState{value: v, cs: cs} + fs.pointers = make(map[uintptr]int) + return fs +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +Printf, Println, or Fprintf. +*/ +func NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(&Config, v) +} diff --git a/internal/spew/format_test.go b/internal/spew/format_test.go new file mode 100644 index 000000000..11c9c4cd6 --- /dev/null +++ b/internal/spew/format_test.go @@ -0,0 +1,1558 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Test Summary: +NOTE: For each test, a nil pointer, a single pointer and double pointer to the +base test element are also tested to ensure proper indirection across all types. + +- Max int8, int16, int32, int64, int +- Max uint8, uint16, uint32, uint64, uint +- Boolean true and false +- Standard complex64 and complex128 +- Array containing standard ints +- Array containing type with custom formatter on pointer receiver only +- Array containing interfaces +- Slice containing standard float32 values +- Slice containing type with custom formatter on pointer receiver only +- Slice containing interfaces +- Nil slice +- Standard string +- Nil interface +- Sub-interface +- Map with string keys and int vals +- Map with custom formatter type on pointer receiver only keys and vals +- Map with interface keys and values +- Map with nil interface value +- Struct with primitives +- Struct that contains another struct +- Struct that contains custom type with Stringer pointer interface via both + exported and unexported fields +- Struct that contains embedded struct and field to same struct +- Uintptr to 0 (null pointer) +- Uintptr address of real variable +- Unsafe.Pointer to 0 (null pointer) +- Unsafe.Pointer to address of real variable +- Nil channel +- Standard int channel +- Function with no params and no returns +- Function with param and no returns +- Function with multiple params and multiple returns +- Struct that is circular through self referencing +- Structs that are circular through cross referencing +- Structs that are indirectly circular +- Type that panics in its Stringer interface +- Type that has a custom Error interface +- %x passthrough with uint +- %#x passthrough with uint +- %f passthrough with precision +- %f passthrough with width and precision +- %d passthrough with width +- %q passthrough with string +*/ + +package spew_test + +import ( + "bytes" + "fmt" + "testing" + "unsafe" + + "github.com/expr-lang/expr/internal/spew" +) + +// formatterTest is used to describe a test to be performed against NewFormatter. +type formatterTest struct { + format string + in interface{} + wants []string +} + +// formatterTests houses all of the tests to be performed against NewFormatter. +var formatterTests = make([]formatterTest, 0) + +// addFormatterTest is a helper method to append the passed input and desired +// result to formatterTests. +func addFormatterTest(format string, in interface{}, wants ...string) { + test := formatterTest{format, in, wants} + formatterTests = append(formatterTests, test) +} + +func addIntFormatterTests() { + // Max int8. + v := int8(127) + nv := (*int8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "int8" + vs := "127" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Max int16. + v2 := int16(32767) + nv2 := (*int16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "int16" + v2s := "32767" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Max int32. + v3 := int32(2147483647) + nv3 := (*int32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "int32" + v3s := "2147483647" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + + // Max int64. + v4 := int64(9223372036854775807) + nv4 := (*int64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "int64" + v4s := "9223372036854775807" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") + + // Max int. + v5 := int(2147483647) + nv5 := (*int)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "int" + v5s := "2147483647" + addFormatterTest("%v", v5, v5s) + addFormatterTest("%v", pv5, "<*>"+v5s) + addFormatterTest("%v", &pv5, "<**>"+v5s) + addFormatterTest("%v", nv5, "") + addFormatterTest("%+v", v5, v5s) + addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) + addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%+v", nv5, "") + addFormatterTest("%#v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) + addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) + addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") + addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) + addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%#+v", nv5, "(*"+v5t+")"+"") +} + +func addUintFormatterTests() { + // Max uint8. + v := uint8(255) + nv := (*uint8)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uint8" + vs := "255" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Max uint16. + v2 := uint16(65535) + nv2 := (*uint16)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Max uint32. + v3 := uint32(4294967295) + nv3 := (*uint32)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "uint32" + v3s := "4294967295" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + + // Max uint64. + v4 := uint64(18446744073709551615) + nv4 := (*uint64)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "uint64" + v4s := "18446744073709551615" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") + + // Max uint. + v5 := uint(4294967295) + nv5 := (*uint)(nil) + pv5 := &v5 + v5Addr := fmt.Sprintf("%p", pv5) + pv5Addr := fmt.Sprintf("%p", &pv5) + v5t := "uint" + v5s := "4294967295" + addFormatterTest("%v", v5, v5s) + addFormatterTest("%v", pv5, "<*>"+v5s) + addFormatterTest("%v", &pv5, "<**>"+v5s) + addFormatterTest("%v", nv5, "") + addFormatterTest("%+v", v5, v5s) + addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) + addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%+v", nv5, "") + addFormatterTest("%#v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) + addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) + addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") + addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) + addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) + addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) + addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") +} + +func addBoolFormatterTests() { + // Boolean true. + v := bool(true) + nv := (*bool)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "bool" + vs := "true" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Boolean false. + v2 := bool(false) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "bool" + v2s := "false" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addFloatFormatterTests() { + // Standard float32. + v := float32(3.1415) + nv := (*float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "float32" + vs := "3.1415" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Standard float64. + v2 := float64(3.1415926) + nv2 := (*float64)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "float64" + v2s := "3.1415926" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") +} + +func addComplexFormatterTests() { + // Standard complex64. + v := complex(float32(6), -2) + nv := (*complex64)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "complex64" + vs := "(6-2i)" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Standard complex128. + v2 := complex(float64(-6), 2) + nv2 := (*complex128)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "complex128" + v2s := "(-6+2i)" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") +} + +func addArrayFormatterTests() { + // Array containing standard ints. + v := [3]int{1, 2, 3} + nv := (*[3]int)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "[3]int" + vs := "[1 2 3]" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Array containing type with custom formatter on pointer receiver only. + v2 := [3]pstringer{"1", "2", "3"} + nv2 := (*[3]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "[3]spew_test.pstringer" + v2sp := "[stringer 1 stringer 2 stringer 3]" + v2s := v2sp + if spew.UnsafeDisabled { + v2s = "[1 2 3]" + } + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2sp) + addFormatterTest("%v", &pv2, "<**>"+v2sp) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2sp) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2sp) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2sp) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2sp) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2sp) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2sp) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Array containing interfaces. + v3 := [3]interface{}{"one", int(2), uint(3)} + nv3 := (*[3]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[3]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3s := "[one 2 3]" + v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") +} + +func addSliceFormatterTests() { + // Slice containing standard float32 values. + v := []float32{3.14, 6.28, 12.56} + nv := (*[]float32)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "[]float32" + vs := "[3.14 6.28 12.56]" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Slice containing type with custom formatter on pointer receiver only. + v2 := []pstringer{"1", "2", "3"} + nv2 := (*[]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "[]spew_test.pstringer" + v2s := "[stringer 1 stringer 2 stringer 3]" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Slice containing interfaces. + v3 := []interface{}{"one", int(2), uint(3), nil} + nv3 := (*[]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "[]interface {}" + v3t2 := "string" + v3t3 := "int" + v3t4 := "uint" + v3t5 := "interface {}" + v3s := "[one 2 3 ]" + v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3 (" + v3t5 + + ")]" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") + + // Nil slice. + var v4 []int + nv4 := (*[]int)(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "[]int" + v4s := "" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") +} + +func addStringFormatterTests() { + // Standard string. + v := "test" + nv := (*string)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "string" + vs := "test" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + +func addInterfaceFormatterTests() { + // Nil interface. + var v interface{} + nv := (*interface{})(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "interface {}" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Sub-interface. + v2 := interface{}(uint16(65535)) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uint16" + v2s := "65535" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addMapFormatterTests() { + // Map with string keys and int vals. + v := map[string]int{"one": 1, "two": 2} + nilMap := map[string]int(nil) + nv := (*map[string]int)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "map[string]int" + vs := "map[one:1 two:2]" + vs2 := "map[two:2 one:1]" + addFormatterTest("%v", v, vs, vs2) + addFormatterTest("%v", pv, "<*>"+vs, "<*>"+vs2) + addFormatterTest("%v", &pv, "<**>"+vs, "<**>"+vs2) + addFormatterTest("%+v", nilMap, "") + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs, vs2) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs, "<*>("+vAddr+")"+vs2) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs, + "<**>("+pvAddr+"->"+vAddr+")"+vs2) + addFormatterTest("%+v", nilMap, "") + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs, "("+vt+")"+vs2) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs, "(*"+vt+")"+vs2) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs, "(**"+vt+")"+vs2) + addFormatterTest("%#v", nilMap, "("+vt+")"+"") + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs, "("+vt+")"+vs2) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs, + "(*"+vt+")("+vAddr+")"+vs2) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs, + "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs2) + addFormatterTest("%#+v", nilMap, "("+vt+")"+"") + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Map with custom formatter type on pointer receiver only keys and vals. + v2 := map[pstringer]pstringer{"one": "1"} + nv2 := (*map[pstringer]pstringer)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "map[spew_test.pstringer]spew_test.pstringer" + v2s := "map[stringer one:stringer 1]" + if spew.UnsafeDisabled { + v2s = "map[one:1]" + } + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Map with interface keys and values. + v3 := map[interface{}]interface{}{"one": 1} + nv3 := (*map[interface{}]interface{})(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "map[interface {}]interface {}" + v3t1 := "string" + v3t2 := "int" + v3s := "map[one:1]" + v3s2 := "map[(" + v3t1 + ")one:(" + v3t2 + ")1]" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") + + // Map with nil interface value + v4 := map[string]interface{}{"nil": nil} + nv4 := (*map[string]interface{})(nil) + pv4 := &v4 + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "map[string]interface {}" + v4t1 := "interface {}" + v4s := "map[nil:]" + v4s2 := "map[nil:(" + v4t1 + ")]" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%+v", v4, v4s) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s2) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s2) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s2) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s2) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s2) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s2) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") +} + +func addStructFormatterTests() { + // Struct with primitives. + type s1 struct { + a int8 + b uint8 + } + v := s1{127, 255} + nv := (*s1)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.s1" + vt2 := "int8" + vt3 := "uint8" + vs := "{127 255}" + vs2 := "{a:127 b:255}" + vs3 := "{a:(" + vt2 + ")127 b:(" + vt3 + ")255}" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs2) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs3) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs3) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs3) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs3) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs3) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs3) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Struct that contains another struct. + type s2 struct { + s1 s1 + b bool + } + v2 := s2{s1{127, 255}, true} + nv2 := (*s2)(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.s2" + v2t2 := "spew_test.s1" + v2t3 := "int8" + v2t4 := "uint8" + v2t5 := "bool" + v2s := "{{127 255} true}" + v2s2 := "{s1:{a:127 b:255} b:true}" + v2s3 := "{s1:(" + v2t2 + "){a:(" + v2t3 + ")127 b:(" + v2t4 + ")255} b:(" + + v2t5 + ")true}" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s2) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s3) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s3) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s3) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s3) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s3) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s3) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Struct that contains custom type with Stringer pointer interface via both + // exported and unexported fields. + type s3 struct { + s pstringer + S pstringer + } + v3 := s3{"test", "test2"} + nv3 := (*s3)(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.s3" + v3t2 := "spew_test.pstringer" + v3s := "{stringer test stringer test2}" + v3sp := v3s + v3s2 := "{s:stringer test S:stringer test2}" + v3s2p := v3s2 + v3s3 := "{s:(" + v3t2 + ")stringer test S:(" + v3t2 + ")stringer test2}" + v3s3p := v3s3 + if spew.UnsafeDisabled { + v3s = "{test test2}" + v3sp = "{test stringer test2}" + v3s2 = "{s:test S:test2}" + v3s2p = "{s:test S:stringer test2}" + v3s3 = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")test2}" + v3s3p = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")stringer test2}" + } + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3sp) + addFormatterTest("%v", &pv3, "<**>"+v3sp) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s2) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2p) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2p) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s3) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s3p) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s3p) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s3) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s3p) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s3p) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") + + // Struct that contains embedded struct and field to same struct. + e := embed{"embedstr"} + v4 := embedwrap{embed: &e, e: &e} + nv4 := (*embedwrap)(nil) + pv4 := &v4 + eAddr := fmt.Sprintf("%p", &e) + v4Addr := fmt.Sprintf("%p", pv4) + pv4Addr := fmt.Sprintf("%p", &pv4) + v4t := "spew_test.embedwrap" + v4t2 := "spew_test.embed" + v4t3 := "string" + v4s := "{<*>{embedstr} <*>{embedstr}}" + v4s2 := "{embed:<*>(" + eAddr + "){a:embedstr} e:<*>(" + eAddr + + "){a:embedstr}}" + v4s3 := "{embed:(*" + v4t2 + "){a:(" + v4t3 + ")embedstr} e:(*" + v4t2 + + "){a:(" + v4t3 + ")embedstr}}" + v4s4 := "{embed:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + + ")embedstr} e:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + ")embedstr}}" + addFormatterTest("%v", v4, v4s) + addFormatterTest("%v", pv4, "<*>"+v4s) + addFormatterTest("%v", &pv4, "<**>"+v4s) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%+v", v4, v4s2) + addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s2) + addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s2) + addFormatterTest("%+v", nv4, "") + addFormatterTest("%#v", v4, "("+v4t+")"+v4s3) + addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s3) + addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s3) + addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") + addFormatterTest("%#+v", v4, "("+v4t+")"+v4s4) + addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s4) + addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s4) + addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") +} + +func addUintptrFormatterTests() { + // Null pointer. + v := uintptr(0) + nv := (*uintptr)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "uintptr" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Address of real variable. + i := 1 + v2 := uintptr(unsafe.Pointer(&i)) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "uintptr" + v2s := fmt.Sprintf("%p", &i) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addUnsafePointerFormatterTests() { + // Null pointer. + v := unsafe.Pointer(nil) + nv := (*unsafe.Pointer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "unsafe.Pointer" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Address of real variable. + i := 1 + v2 := unsafe.Pointer(&i) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "unsafe.Pointer" + v2s := fmt.Sprintf("%p", &i) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addChanFormatterTests() { + // Nil channel. + var v chan int + pv := &v + nv := (*chan int)(nil) + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "chan int" + vs := "" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Real channel. + v2 := make(chan int) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "chan int" + v2s := fmt.Sprintf("%p", v2) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) +} + +func addFuncFormatterTests() { + // Function with no params and no returns. + v := addIntFormatterTests + nv := (*func())(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "func()" + vs := fmt.Sprintf("%p", v) + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") + + // Function with param and no returns. + v2 := TestFormatter + nv2 := (*func(*testing.T))(nil) + pv2 := &v2 + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "func(*testing.T)" + v2s := fmt.Sprintf("%p", v2) + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s) + addFormatterTest("%v", &pv2, "<**>"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%+v", v2, v2s) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%+v", nv2, "") + addFormatterTest("%#v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) + addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) + addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") + + // Function with multiple params and multiple returns. + var v3 = func(i int, s string) (b bool, err error) { + return true, nil + } + nv3 := (*func(int, string) (bool, error))(nil) + pv3 := &v3 + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "func(int, string) (bool, error)" + v3s := fmt.Sprintf("%p", v3) + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s) + addFormatterTest("%v", &pv3, "<**>"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%+v", v3, v3s) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%+v", nv3, "") + addFormatterTest("%#v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) + addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) + addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") +} + +func addCircularFormatterTests() { + // Struct that is circular through self referencing. + type circular struct { + c *circular + } + v := circular{nil} + v.c = &v + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.circular" + vs := "{<*>{<*>}}" + vs2 := "{<*>}" + vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")}}" + vs4 := "{c:<*>(" + vAddr + ")}" + vs5 := "{c:(*" + vt + "){c:(*" + vt + ")}}" + vs6 := "{c:(*" + vt + ")}" + vs7 := "{c:(*" + vt + ")(" + vAddr + "){c:(*" + vt + ")(" + vAddr + + ")}}" + vs8 := "{c:(*" + vt + ")(" + vAddr + ")}" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs2) + addFormatterTest("%v", &pv, "<**>"+vs2) + addFormatterTest("%+v", v, vs3) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4) + addFormatterTest("%#v", v, "("+vt+")"+vs5) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs6) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs6) + addFormatterTest("%#+v", v, "("+vt+")"+vs7) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs8) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs8) + + // Structs that are circular through cross referencing. + v2 := xref1{nil} + ts2 := xref2{&v2} + v2.ps2 = &ts2 + pv2 := &v2 + ts2Addr := fmt.Sprintf("%p", &ts2) + v2Addr := fmt.Sprintf("%p", pv2) + pv2Addr := fmt.Sprintf("%p", &pv2) + v2t := "spew_test.xref1" + v2t2 := "spew_test.xref2" + v2s := "{<*>{<*>{<*>}}}" + v2s2 := "{<*>{<*>}}" + v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" + + ts2Addr + ")}}}" + v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")}}" + v2s5 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + "){ps2:(*" + v2t2 + + ")}}}" + v2s6 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + ")}}" + v2s7 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + + ")(" + v2Addr + "){ps2:(*" + v2t2 + ")(" + ts2Addr + + ")}}}" + v2s8 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + + ")(" + v2Addr + ")}}" + addFormatterTest("%v", v2, v2s) + addFormatterTest("%v", pv2, "<*>"+v2s2) + addFormatterTest("%v", &pv2, "<**>"+v2s2) + addFormatterTest("%+v", v2, v2s3) + addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4) + addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4) + addFormatterTest("%#v", v2, "("+v2t+")"+v2s5) + addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s6) + addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s6) + addFormatterTest("%#+v", v2, "("+v2t+")"+v2s7) + addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s8) + addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s8) + + // Structs that are indirectly circular. + v3 := indirCir1{nil} + tic2 := indirCir2{nil} + tic3 := indirCir3{&v3} + tic2.ps3 = &tic3 + v3.ps2 = &tic2 + pv3 := &v3 + tic2Addr := fmt.Sprintf("%p", &tic2) + tic3Addr := fmt.Sprintf("%p", &tic3) + v3Addr := fmt.Sprintf("%p", pv3) + pv3Addr := fmt.Sprintf("%p", &pv3) + v3t := "spew_test.indirCir1" + v3t2 := "spew_test.indirCir2" + v3t3 := "spew_test.indirCir3" + v3s := "{<*>{<*>{<*>{<*>}}}}" + v3s2 := "{<*>{<*>{<*>}}}" + v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + + v3Addr + "){ps2:<*>(" + tic2Addr + ")}}}}" + v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + + v3Addr + ")}}}" + v3s5 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + + "){ps2:(*" + v3t2 + ")}}}}" + v3s6 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + + ")}}}" + v3s7 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + + tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + "){ps2:(*" + v3t2 + + ")(" + tic2Addr + ")}}}}" + v3s8 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + + tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + ")}}}" + addFormatterTest("%v", v3, v3s) + addFormatterTest("%v", pv3, "<*>"+v3s2) + addFormatterTest("%v", &pv3, "<**>"+v3s2) + addFormatterTest("%+v", v3, v3s3) + addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4) + addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4) + addFormatterTest("%#v", v3, "("+v3t+")"+v3s5) + addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s6) + addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s6) + addFormatterTest("%#+v", v3, "("+v3t+")"+v3s7) + addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s8) + addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8) +} + +func addPanicFormatterTests() { + // Type that panics in its Stringer interface. + v := panicer(127) + nv := (*panicer)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.panicer" + vs := "(PANIC=test panic)127" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + +func addErrorFormatterTests() { + // Type that has a custom Error interface. + v := customError(127) + nv := (*customError)(nil) + pv := &v + vAddr := fmt.Sprintf("%p", pv) + pvAddr := fmt.Sprintf("%p", &pv) + vt := "spew_test.customError" + vs := "error: 127" + addFormatterTest("%v", v, vs) + addFormatterTest("%v", pv, "<*>"+vs) + addFormatterTest("%v", &pv, "<**>"+vs) + addFormatterTest("%v", nv, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + +func addPassthroughFormatterTests() { + // %x passthrough with uint. + v := uint(4294967295) + pv := &v + vAddr := fmt.Sprintf("%x", pv) + pvAddr := fmt.Sprintf("%x", &pv) + vs := "ffffffff" + addFormatterTest("%x", v, vs) + addFormatterTest("%x", pv, vAddr) + addFormatterTest("%x", &pv, pvAddr) + + // %#x passthrough with uint. + v2 := int(2147483647) + pv2 := &v2 + v2Addr := fmt.Sprintf("%#x", pv2) + pv2Addr := fmt.Sprintf("%#x", &pv2) + v2s := "0x7fffffff" + addFormatterTest("%#x", v2, v2s) + addFormatterTest("%#x", pv2, v2Addr) + addFormatterTest("%#x", &pv2, pv2Addr) + + // %f passthrough with precision. + addFormatterTest("%.2f", 3.1415, "3.14") + addFormatterTest("%.3f", 3.1415, "3.142") + addFormatterTest("%.4f", 3.1415, "3.1415") + + // %f passthrough with width and precision. + addFormatterTest("%5.2f", 3.1415, " 3.14") + addFormatterTest("%6.3f", 3.1415, " 3.142") + addFormatterTest("%7.4f", 3.1415, " 3.1415") + + // %d passthrough with width. + addFormatterTest("%3d", 127, "127") + addFormatterTest("%4d", 127, " 127") + addFormatterTest("%5d", 127, " 127") + + // %q passthrough with string. + addFormatterTest("%q", "test", "\"test\"") +} + +// TestFormatter executes all of the tests described by formatterTests. +func TestFormatter(t *testing.T) { + // Setup tests. + addIntFormatterTests() + addUintFormatterTests() + addBoolFormatterTests() + addFloatFormatterTests() + addComplexFormatterTests() + addArrayFormatterTests() + addSliceFormatterTests() + addStringFormatterTests() + addInterfaceFormatterTests() + addMapFormatterTests() + addStructFormatterTests() + addUintptrFormatterTests() + addUnsafePointerFormatterTests() + addChanFormatterTests() + addFuncFormatterTests() + addCircularFormatterTests() + addPanicFormatterTests() + addErrorFormatterTests() + addPassthroughFormatterTests() + + t.Logf("Running %d tests", len(formatterTests)) + for i, test := range formatterTests { + buf := new(bytes.Buffer) + spew.Fprintf(buf, test.format, test.in) + s := buf.String() + if testFailed(s, test.wants) { + t.Errorf("Formatter #%d format: %s got: %s %s", i, test.format, s, + stringizeWants(test.wants)) + continue + } + } +} + +type testStruct struct { + x int +} + +func (ts testStruct) String() string { + return fmt.Sprintf("ts.%d", ts.x) +} + +type testStructP struct { + x int +} + +func (ts *testStructP) String() string { + return fmt.Sprintf("ts.%d", ts.x) +} + +func TestPrintSortedKeys(t *testing.T) { + cfg := spew.ConfigState{SortKeys: true} + s := cfg.Sprint(map[int]string{1: "1", 3: "3", 2: "2"}) + expected := "map[1:1 2:2 3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 1:\n %v %v", s, expected) + } + + s = cfg.Sprint(map[stringer]int{"1": 1, "3": 3, "2": 2}) + expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 2:\n %v %v", s, expected) + } + + s = cfg.Sprint(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) + expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" + if spew.UnsafeDisabled { + expected = "map[1:1 2:2 3:3]" + } + if s != expected { + t.Errorf("Sorted keys mismatch 3:\n %v %v", s, expected) + } + + s = cfg.Sprint(map[testStruct]int{{1}: 1, {3}: 3, {2}: 2}) + expected = "map[ts.1:1 ts.2:2 ts.3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 4:\n %v %v", s, expected) + } + + if !spew.UnsafeDisabled { + s = cfg.Sprint(map[testStructP]int{{1}: 1, {3}: 3, {2}: 2}) + expected = "map[ts.1:1 ts.2:2 ts.3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 5:\n %v %v", s, expected) + } + } + + s = cfg.Sprint(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) + expected = "map[error: 1:1 error: 2:2 error: 3:3]" + if s != expected { + t.Errorf("Sorted keys mismatch 6:\n %v %v", s, expected) + } +} diff --git a/internal/spew/internal_test.go b/internal/spew/internal_test.go new file mode 100644 index 000000000..e312b4fad --- /dev/null +++ b/internal/spew/internal_test.go @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +This test file is part of the spew package rather than than the spew_test +package because it needs access to internals to properly test certain cases +which are not possible via the public interface since they should never happen. +*/ + +package spew + +import ( + "bytes" + "reflect" + "testing" +) + +// dummyFmtState implements a fake fmt.State to use for testing invalid +// reflect.Value handling. This is necessary because the fmt package catches +// invalid values before invoking the formatter on them. +type dummyFmtState struct { + bytes.Buffer +} + +func (dfs *dummyFmtState) Flag(f int) bool { + return f == int('+') +} + +func (dfs *dummyFmtState) Precision() (int, bool) { + return 0, false +} + +func (dfs *dummyFmtState) Width() (int, bool) { + return 0, false +} + +// TestInvalidReflectValue ensures the dump and formatter code handles an +// invalid reflect value properly. This needs access to internal state since it +// should never happen in real code and therefore can't be tested via the public +// API. +func TestInvalidReflectValue(t *testing.T) { + i := 1 + + // Dump invalid reflect value. + v := new(reflect.Value) + buf := new(bytes.Buffer) + d := dumpState{w: buf, cs: &Config} + d.dump(*v) + s := buf.String() + want := "" + if s != want { + t.Errorf("InvalidReflectValue #%d\n got: %s want: %s", i, s, want) + } + i++ + + // Formatter invalid reflect value. + buf2 := new(dummyFmtState) + f := formatState{value: *v, cs: &Config, fs: buf2} + f.format(*v) + s = buf2.String() + want = "" + if s != want { + t.Errorf("InvalidReflectValue #%d got: %s want: %s", i, s, want) + } +} + +// SortValues makes the internal sortValues function available to the test +// package. +func SortValues(values []reflect.Value, cs *ConfigState) { + sortValues(values, cs) +} diff --git a/internal/spew/internalunsafe_test.go b/internal/spew/internalunsafe_test.go new file mode 100644 index 000000000..2b547c41c --- /dev/null +++ b/internal/spew/internalunsafe_test.go @@ -0,0 +1,102 @@ +// Copyright (c) 2013-2016 Dave Collins + +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. + +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +//go:build !js && !appengine && !safe && !disableunsafe && go1.4 +// +build !js,!appengine,!safe,!disableunsafe,go1.4 + +/* +This test file is part of the spew package rather than than the spew_test +package because it needs access to internals to properly test certain cases +which are not possible via the public interface since they should never happen. +*/ + +package spew + +import ( + "bytes" + "reflect" + "testing" +) + +// changeKind uses unsafe to intentionally change the kind of a reflect.Value to +// the maximum kind value which does not exist. This is needed to test the +// fallback code which punts to the standard fmt library for new types that +// might get added to the language. +func changeKind(v *reflect.Value, readOnly bool) { + flags := flagField(v) + if readOnly { + *flags |= flagRO + } else { + *flags &^= flagRO + } + *flags |= flagKindMask +} + +// TestAddedReflectValue tests functionaly of the dump and formatter code which +// falls back to the standard fmt library for new types that might get added to +// the language. +func TestAddedReflectValue(t *testing.T) { + i := 1 + + // Dump using a reflect.Value that is exported. + v := reflect.ValueOf(int8(5)) + changeKind(&v, false) + buf := new(bytes.Buffer) + d := dumpState{w: buf, cs: &Config} + d.dump(v) + s := buf.String() + want := "(int8) 5" + if s != want { + t.Errorf("TestAddedReflectValue #%d\n got: %s want: %s", i, s, want) + } + i++ + + // Dump using a reflect.Value that is not exported. + changeKind(&v, true) + buf.Reset() + d.dump(v) + s = buf.String() + want = "(int8) " + if s != want { + t.Errorf("TestAddedReflectValue #%d\n got: %s want: %s", i, s, want) + } + i++ + + // Formatter using a reflect.Value that is exported. + changeKind(&v, false) + buf2 := new(dummyFmtState) + f := formatState{value: v, cs: &Config, fs: buf2} + f.format(v) + s = buf2.String() + want = "5" + if s != want { + t.Errorf("TestAddedReflectValue #%d got: %s want: %s", i, s, want) + } + i++ + + // Formatter using a reflect.Value that is not exported. + changeKind(&v, true) + buf2.Reset() + f = formatState{value: v, cs: &Config, fs: buf2} + f.format(v) + s = buf2.String() + want = "" + if s != want { + t.Errorf("TestAddedReflectValue #%d got: %s want: %s", i, s, want) + } +} diff --git a/internal/spew/spew.go b/internal/spew/spew.go new file mode 100644 index 000000000..32c0e3388 --- /dev/null +++ b/internal/spew/spew.go @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "fmt" + "io" +) + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the formatted string as a value that satisfies error. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a default Formatter interface returned by NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) +func Print(a ...interface{}) (n int, err error) { + return fmt.Print(convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) +func Println(a ...interface{}) (n int, err error) { + return fmt.Println(convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprint(a ...interface{}) string { + return fmt.Sprint(convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintln(a ...interface{}) string { + return fmt.Sprintln(convertArgs(a)...) +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a default spew Formatter interface. +func convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = NewFormatter(arg) + } + return formatters +} diff --git a/internal/spew/spew_test.go b/internal/spew/spew_test.go new file mode 100644 index 000000000..55b7897e2 --- /dev/null +++ b/internal/spew/spew_test.go @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew_test + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "testing" + + "github.com/expr-lang/expr/internal/spew" +) + +// spewFunc is used to identify which public function of the spew package or +// ConfigState a test applies to. +type spewFunc int + +const ( + fCSFdump spewFunc = iota + fCSFprint + fCSFprintf + fCSFprintln + fCSPrint + fCSPrintln + fCSSdump + fCSSprint + fCSSprintf + fCSSprintln + fCSErrorf + fCSNewFormatter + fErrorf + fFprint + fFprintln + fPrint + fPrintln + fSdump + fSprint + fSprintf + fSprintln +) + +// Map of spewFunc values to names for pretty printing. +var spewFuncStrings = map[spewFunc]string{ + fCSFdump: "ConfigState.Fdump", + fCSFprint: "ConfigState.Fprint", + fCSFprintf: "ConfigState.Fprintf", + fCSFprintln: "ConfigState.Fprintln", + fCSSdump: "ConfigState.Sdump", + fCSPrint: "ConfigState.Print", + fCSPrintln: "ConfigState.Println", + fCSSprint: "ConfigState.Sprint", + fCSSprintf: "ConfigState.Sprintf", + fCSSprintln: "ConfigState.Sprintln", + fCSErrorf: "ConfigState.Errorf", + fCSNewFormatter: "ConfigState.NewFormatter", + fErrorf: "spew.Errorf", + fFprint: "spew.Fprint", + fFprintln: "spew.Fprintln", + fPrint: "spew.Print", + fPrintln: "spew.Println", + fSdump: "spew.Sdump", + fSprint: "spew.Sprint", + fSprintf: "spew.Sprintf", + fSprintln: "spew.Sprintln", +} + +func (f spewFunc) String() string { + if s, ok := spewFuncStrings[f]; ok { + return s + } + return fmt.Sprintf("Unknown spewFunc (%d)", int(f)) +} + +// spewTest is used to describe a test to be performed against the public +// functions of the spew package or ConfigState. +type spewTest struct { + cs *spew.ConfigState + f spewFunc + format string + in interface{} + want string +} + +// spewTests houses the tests to be performed against the public functions of +// the spew package and ConfigState. +// +// These tests are only intended to ensure the public functions are exercised +// and are intentionally not exhaustive of types. The exhaustive type +// tests are handled in the dump and format tests. +var spewTests []spewTest + +// redirStdout is a helper function to return the standard output from f as a +// byte slice. +func redirStdout(f func()) ([]byte, error) { + tempFile, err := ioutil.TempFile("", "ss-test") + if err != nil { + return nil, err + } + fileName := tempFile.Name() + defer os.Remove(fileName) // Ignore error + + origStdout := os.Stdout + os.Stdout = tempFile + f() + os.Stdout = origStdout + tempFile.Close() + + return ioutil.ReadFile(fileName) +} + +func initSpewTests() { + // Config states with various settings. + scsDefault := spew.NewDefaultConfig() + scsNoMethods := &spew.ConfigState{Indent: " ", DisableMethods: true} + scsNoPmethods := &spew.ConfigState{Indent: " ", DisablePointerMethods: true} + scsMaxDepth := &spew.ConfigState{Indent: " ", MaxDepth: 1} + scsContinue := &spew.ConfigState{Indent: " ", ContinueOnMethod: true} + scsNoPtrAddr := &spew.ConfigState{DisablePointerAddresses: true} + scsNoCap := &spew.ConfigState{DisableCapacities: true} + + // Variables for tests on types which implement Stringer interface with and + // without a pointer receiver. + ts := stringer("test") + tps := pstringer("test") + + type ptrTester struct { + s *struct{} + } + tptr := &ptrTester{s: &struct{}{}} + + // depthTester is used to test max depth handling for structs, array, slices + // and maps. + type depthTester struct { + ic indirCir1 + arr [1]string + slice []string + m map[string]int + } + dt := depthTester{indirCir1{nil}, [1]string{"arr"}, []string{"slice"}, + map[string]int{"one": 1}} + + // Variable for tests on types which implement error interface. + te := customError(10) + + spewTests = []spewTest{ + {scsDefault, fCSFdump, "", int8(127), "(int8) 127\n"}, + {scsDefault, fCSFprint, "", int16(32767), "32767"}, + {scsDefault, fCSFprintf, "%v", int32(2147483647), "2147483647"}, + {scsDefault, fCSFprintln, "", int(2147483647), "2147483647\n"}, + {scsDefault, fCSPrint, "", int64(9223372036854775807), "9223372036854775807"}, + {scsDefault, fCSPrintln, "", uint8(255), "255\n"}, + {scsDefault, fCSSdump, "", uint8(64), "(uint8) 64\n"}, + {scsDefault, fCSSprint, "", complex(1, 2), "(1+2i)"}, + {scsDefault, fCSSprintf, "%v", complex(float32(3), 4), "(3+4i)"}, + {scsDefault, fCSSprintln, "", complex(float64(5), 6), "(5+6i)\n"}, + {scsDefault, fCSErrorf, "%#v", uint16(65535), "(uint16)65535"}, + {scsDefault, fCSNewFormatter, "%v", uint32(4294967295), "4294967295"}, + {scsDefault, fErrorf, "%v", uint64(18446744073709551615), "18446744073709551615"}, + {scsDefault, fFprint, "", float32(3.14), "3.14"}, + {scsDefault, fFprintln, "", float64(6.28), "6.28\n"}, + {scsDefault, fPrint, "", true, "true"}, + {scsDefault, fPrintln, "", false, "false\n"}, + {scsDefault, fSdump, "", complex(-10, -20), "(complex128) (-10-20i)\n"}, + {scsDefault, fSprint, "", complex(-1, -2), "(-1-2i)"}, + {scsDefault, fSprintf, "%v", complex(float32(-3), -4), "(-3-4i)"}, + {scsDefault, fSprintln, "", complex(float64(-5), -6), "(-5-6i)\n"}, + {scsNoMethods, fCSFprint, "", ts, "test"}, + {scsNoMethods, fCSFprint, "", &ts, "<*>test"}, + {scsNoMethods, fCSFprint, "", tps, "test"}, + {scsNoMethods, fCSFprint, "", &tps, "<*>test"}, + {scsNoPmethods, fCSFprint, "", ts, "stringer test"}, + {scsNoPmethods, fCSFprint, "", &ts, "<*>stringer test"}, + {scsNoPmethods, fCSFprint, "", tps, "test"}, + {scsNoPmethods, fCSFprint, "", &tps, "<*>stringer test"}, + {scsMaxDepth, fCSFprint, "", dt, "{{} [] [] map[]}"}, + {scsMaxDepth, fCSFdump, "", dt, "(spew_test.depthTester) {\n" + + " ic: (spew_test.indirCir1) {\n \n },\n" + + " arr: ([1]string) (len=1 cap=1) {\n \n },\n" + + " slice: ([]string) (len=1 cap=1) {\n \n },\n" + + " m: (map[string]int) (len=1) {\n \n }\n}\n"}, + {scsContinue, fCSFprint, "", ts, "(stringer test) test"}, + {scsContinue, fCSFdump, "", ts, "(spew_test.stringer) " + + "(len=4) (stringer test) \"test\"\n"}, + {scsContinue, fCSFprint, "", te, "(error: 10) 10"}, + {scsContinue, fCSFdump, "", te, "(spew_test.customError) " + + "(error: 10) 10\n"}, + {scsNoPtrAddr, fCSFprint, "", tptr, "<*>{<*>{}}"}, + {scsNoPtrAddr, fCSSdump, "", tptr, "(*spew_test.ptrTester)({\ns: (*struct {})({\n})\n})\n"}, + {scsNoCap, fCSSdump, "", make([]string, 0, 10), "([]string) {\n}\n"}, + {scsNoCap, fCSSdump, "", make([]string, 1, 10), "([]string) (len=1) {\n(string) \"\"\n}\n"}, + } +} + +// TestSpew executes all of the tests described by spewTests. +func TestSpew(t *testing.T) { + initSpewTests() + + t.Logf("Running %d tests", len(spewTests)) + for i, test := range spewTests { + buf := new(bytes.Buffer) + switch test.f { + case fCSFdump: + test.cs.Fdump(buf, test.in) + + case fCSFprint: + test.cs.Fprint(buf, test.in) + + case fCSFprintf: + test.cs.Fprintf(buf, test.format, test.in) + + case fCSFprintln: + test.cs.Fprintln(buf, test.in) + + case fCSPrint: + b, err := redirStdout(func() { test.cs.Print(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fCSPrintln: + b, err := redirStdout(func() { test.cs.Println(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fCSSdump: + str := test.cs.Sdump(test.in) + buf.WriteString(str) + + case fCSSprint: + str := test.cs.Sprint(test.in) + buf.WriteString(str) + + case fCSSprintf: + str := test.cs.Sprintf(test.format, test.in) + buf.WriteString(str) + + case fCSSprintln: + str := test.cs.Sprintln(test.in) + buf.WriteString(str) + + case fCSErrorf: + err := test.cs.Errorf(test.format, test.in) + buf.WriteString(err.Error()) + + case fCSNewFormatter: + fmt.Fprintf(buf, test.format, test.cs.NewFormatter(test.in)) + + case fErrorf: + err := spew.Errorf(test.format, test.in) + buf.WriteString(err.Error()) + + case fFprint: + spew.Fprint(buf, test.in) + + case fFprintln: + spew.Fprintln(buf, test.in) + + case fPrint: + b, err := redirStdout(func() { spew.Print(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fPrintln: + b, err := redirStdout(func() { spew.Println(test.in) }) + if err != nil { + t.Errorf("%v #%d %v", test.f, i, err) + continue + } + buf.Write(b) + + case fSdump: + str := spew.Sdump(test.in) + buf.WriteString(str) + + case fSprint: + str := spew.Sprint(test.in) + buf.WriteString(str) + + case fSprintf: + str := spew.Sprintf(test.format, test.in) + buf.WriteString(str) + + case fSprintln: + str := spew.Sprintln(test.in) + buf.WriteString(str) + + default: + t.Errorf("%v #%d unrecognized function", test.f, i) + continue + } + s := buf.String() + if test.want != s { + t.Errorf("ConfigState #%d\n got: %s want: %s", i, s, test.want) + continue + } + } +} diff --git a/internal/spew/testdata/dumpcgo.go b/internal/spew/testdata/dumpcgo.go new file mode 100644 index 000000000..368ead024 --- /dev/null +++ b/internal/spew/testdata/dumpcgo.go @@ -0,0 +1,83 @@ +// Copyright (c) 2013 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when both cgo is supported and "-tags testcgo" is added to the go test +// command line. This code should really only be in the dumpcgo_test.go file, +// but unfortunately Go will not allow cgo in test files, so this is a +// workaround to allow cgo types to be tested. This configuration is used +// because spew itself does not require cgo to run even though it does handle +// certain cgo types specially. Rather than forcing all clients to require cgo +// and an external C compiler just to run the tests, this scheme makes them +// optional. +//go:build cgo && testcgo +// +build cgo,testcgo + +package testdata + +/* +#include +typedef unsigned char custom_uchar_t; + +char *ncp = 0; +char *cp = "test"; +char ca[6] = {'t', 'e', 's', 't', '2', '\0'}; +unsigned char uca[6] = {'t', 'e', 's', 't', '3', '\0'}; +signed char sca[6] = {'t', 'e', 's', 't', '4', '\0'}; +uint8_t ui8ta[6] = {'t', 'e', 's', 't', '5', '\0'}; +custom_uchar_t tuca[6] = {'t', 'e', 's', 't', '6', '\0'}; +*/ +import "C" + +// GetCgoNullCharPointer returns a null char pointer via cgo. This is only +// used for tests. +func GetCgoNullCharPointer() interface{} { + return C.ncp +} + +// GetCgoCharPointer returns a char pointer via cgo. This is only used for +// tests. +func GetCgoCharPointer() interface{} { + return C.cp +} + +// GetCgoCharArray returns a char array via cgo and the array's len and cap. +// This is only used for tests. +func GetCgoCharArray() (interface{}, int, int) { + return C.ca, len(C.ca), cap(C.ca) +} + +// GetCgoUnsignedCharArray returns an unsigned char array via cgo and the +// array's len and cap. This is only used for tests. +func GetCgoUnsignedCharArray() (interface{}, int, int) { + return C.uca, len(C.uca), cap(C.uca) +} + +// GetCgoSignedCharArray returns a signed char array via cgo and the array's len +// and cap. This is only used for tests. +func GetCgoSignedCharArray() (interface{}, int, int) { + return C.sca, len(C.sca), cap(C.sca) +} + +// GetCgoUint8tArray returns a uint8_t array via cgo and the array's len and +// cap. This is only used for tests. +func GetCgoUint8tArray() (interface{}, int, int) { + return C.ui8ta, len(C.ui8ta), cap(C.ui8ta) +} + +// GetCgoTypdefedUnsignedCharArray returns a typedefed unsigned char array via +// cgo and the array's len and cap. This is only used for tests. +func GetCgoTypdefedUnsignedCharArray() (interface{}, int, int) { + return C.tuca, len(C.tuca), cap(C.tuca) +} diff --git a/internal/testify/assert/assertion_compare.go b/internal/testify/assert/assertion_compare.go new file mode 100644 index 000000000..7e19eba09 --- /dev/null +++ b/internal/testify/assert/assertion_compare.go @@ -0,0 +1,489 @@ +package assert + +import ( + "bytes" + "fmt" + "reflect" + "time" +) + +// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it. +type CompareType = compareResult + +type compareResult int + +const ( + compareLess compareResult = iota - 1 + compareEqual + compareGreater +) + +var ( + intType = reflect.TypeOf(int(1)) + int8Type = reflect.TypeOf(int8(1)) + int16Type = reflect.TypeOf(int16(1)) + int32Type = reflect.TypeOf(int32(1)) + int64Type = reflect.TypeOf(int64(1)) + + uintType = reflect.TypeOf(uint(1)) + uint8Type = reflect.TypeOf(uint8(1)) + uint16Type = reflect.TypeOf(uint16(1)) + uint32Type = reflect.TypeOf(uint32(1)) + uint64Type = reflect.TypeOf(uint64(1)) + + uintptrType = reflect.TypeOf(uintptr(1)) + + float32Type = reflect.TypeOf(float32(1)) + float64Type = reflect.TypeOf(float64(1)) + + stringType = reflect.TypeOf("") + + timeType = reflect.TypeOf(time.Time{}) + bytesType = reflect.TypeOf([]byte{}) +) + +func compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) { + obj1Value := reflect.ValueOf(obj1) + obj2Value := reflect.ValueOf(obj2) + + // throughout this switch we try and avoid calling .Convert() if possible, + // as this has a pretty big performance impact + switch kind { + case reflect.Int: + { + intobj1, ok := obj1.(int) + if !ok { + intobj1 = obj1Value.Convert(intType).Interface().(int) + } + intobj2, ok := obj2.(int) + if !ok { + intobj2 = obj2Value.Convert(intType).Interface().(int) + } + if intobj1 > intobj2 { + return compareGreater, true + } + if intobj1 == intobj2 { + return compareEqual, true + } + if intobj1 < intobj2 { + return compareLess, true + } + } + case reflect.Int8: + { + int8obj1, ok := obj1.(int8) + if !ok { + int8obj1 = obj1Value.Convert(int8Type).Interface().(int8) + } + int8obj2, ok := obj2.(int8) + if !ok { + int8obj2 = obj2Value.Convert(int8Type).Interface().(int8) + } + if int8obj1 > int8obj2 { + return compareGreater, true + } + if int8obj1 == int8obj2 { + return compareEqual, true + } + if int8obj1 < int8obj2 { + return compareLess, true + } + } + case reflect.Int16: + { + int16obj1, ok := obj1.(int16) + if !ok { + int16obj1 = obj1Value.Convert(int16Type).Interface().(int16) + } + int16obj2, ok := obj2.(int16) + if !ok { + int16obj2 = obj2Value.Convert(int16Type).Interface().(int16) + } + if int16obj1 > int16obj2 { + return compareGreater, true + } + if int16obj1 == int16obj2 { + return compareEqual, true + } + if int16obj1 < int16obj2 { + return compareLess, true + } + } + case reflect.Int32: + { + int32obj1, ok := obj1.(int32) + if !ok { + int32obj1 = obj1Value.Convert(int32Type).Interface().(int32) + } + int32obj2, ok := obj2.(int32) + if !ok { + int32obj2 = obj2Value.Convert(int32Type).Interface().(int32) + } + if int32obj1 > int32obj2 { + return compareGreater, true + } + if int32obj1 == int32obj2 { + return compareEqual, true + } + if int32obj1 < int32obj2 { + return compareLess, true + } + } + case reflect.Int64: + { + int64obj1, ok := obj1.(int64) + if !ok { + int64obj1 = obj1Value.Convert(int64Type).Interface().(int64) + } + int64obj2, ok := obj2.(int64) + if !ok { + int64obj2 = obj2Value.Convert(int64Type).Interface().(int64) + } + if int64obj1 > int64obj2 { + return compareGreater, true + } + if int64obj1 == int64obj2 { + return compareEqual, true + } + if int64obj1 < int64obj2 { + return compareLess, true + } + } + case reflect.Uint: + { + uintobj1, ok := obj1.(uint) + if !ok { + uintobj1 = obj1Value.Convert(uintType).Interface().(uint) + } + uintobj2, ok := obj2.(uint) + if !ok { + uintobj2 = obj2Value.Convert(uintType).Interface().(uint) + } + if uintobj1 > uintobj2 { + return compareGreater, true + } + if uintobj1 == uintobj2 { + return compareEqual, true + } + if uintobj1 < uintobj2 { + return compareLess, true + } + } + case reflect.Uint8: + { + uint8obj1, ok := obj1.(uint8) + if !ok { + uint8obj1 = obj1Value.Convert(uint8Type).Interface().(uint8) + } + uint8obj2, ok := obj2.(uint8) + if !ok { + uint8obj2 = obj2Value.Convert(uint8Type).Interface().(uint8) + } + if uint8obj1 > uint8obj2 { + return compareGreater, true + } + if uint8obj1 == uint8obj2 { + return compareEqual, true + } + if uint8obj1 < uint8obj2 { + return compareLess, true + } + } + case reflect.Uint16: + { + uint16obj1, ok := obj1.(uint16) + if !ok { + uint16obj1 = obj1Value.Convert(uint16Type).Interface().(uint16) + } + uint16obj2, ok := obj2.(uint16) + if !ok { + uint16obj2 = obj2Value.Convert(uint16Type).Interface().(uint16) + } + if uint16obj1 > uint16obj2 { + return compareGreater, true + } + if uint16obj1 == uint16obj2 { + return compareEqual, true + } + if uint16obj1 < uint16obj2 { + return compareLess, true + } + } + case reflect.Uint32: + { + uint32obj1, ok := obj1.(uint32) + if !ok { + uint32obj1 = obj1Value.Convert(uint32Type).Interface().(uint32) + } + uint32obj2, ok := obj2.(uint32) + if !ok { + uint32obj2 = obj2Value.Convert(uint32Type).Interface().(uint32) + } + if uint32obj1 > uint32obj2 { + return compareGreater, true + } + if uint32obj1 == uint32obj2 { + return compareEqual, true + } + if uint32obj1 < uint32obj2 { + return compareLess, true + } + } + case reflect.Uint64: + { + uint64obj1, ok := obj1.(uint64) + if !ok { + uint64obj1 = obj1Value.Convert(uint64Type).Interface().(uint64) + } + uint64obj2, ok := obj2.(uint64) + if !ok { + uint64obj2 = obj2Value.Convert(uint64Type).Interface().(uint64) + } + if uint64obj1 > uint64obj2 { + return compareGreater, true + } + if uint64obj1 == uint64obj2 { + return compareEqual, true + } + if uint64obj1 < uint64obj2 { + return compareLess, true + } + } + case reflect.Float32: + { + float32obj1, ok := obj1.(float32) + if !ok { + float32obj1 = obj1Value.Convert(float32Type).Interface().(float32) + } + float32obj2, ok := obj2.(float32) + if !ok { + float32obj2 = obj2Value.Convert(float32Type).Interface().(float32) + } + if float32obj1 > float32obj2 { + return compareGreater, true + } + if float32obj1 == float32obj2 { + return compareEqual, true + } + if float32obj1 < float32obj2 { + return compareLess, true + } + } + case reflect.Float64: + { + float64obj1, ok := obj1.(float64) + if !ok { + float64obj1 = obj1Value.Convert(float64Type).Interface().(float64) + } + float64obj2, ok := obj2.(float64) + if !ok { + float64obj2 = obj2Value.Convert(float64Type).Interface().(float64) + } + if float64obj1 > float64obj2 { + return compareGreater, true + } + if float64obj1 == float64obj2 { + return compareEqual, true + } + if float64obj1 < float64obj2 { + return compareLess, true + } + } + case reflect.String: + { + stringobj1, ok := obj1.(string) + if !ok { + stringobj1 = obj1Value.Convert(stringType).Interface().(string) + } + stringobj2, ok := obj2.(string) + if !ok { + stringobj2 = obj2Value.Convert(stringType).Interface().(string) + } + if stringobj1 > stringobj2 { + return compareGreater, true + } + if stringobj1 == stringobj2 { + return compareEqual, true + } + if stringobj1 < stringobj2 { + return compareLess, true + } + } + // Check for known struct types we can check for compare results. + case reflect.Struct: + { + // All structs enter here. We're not interested in most types. + if !obj1Value.CanConvert(timeType) { + break + } + + // time.Time can be compared! + timeObj1, ok := obj1.(time.Time) + if !ok { + timeObj1 = obj1Value.Convert(timeType).Interface().(time.Time) + } + + timeObj2, ok := obj2.(time.Time) + if !ok { + timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time) + } + + if timeObj1.Before(timeObj2) { + return compareLess, true + } + if timeObj1.Equal(timeObj2) { + return compareEqual, true + } + return compareGreater, true + } + case reflect.Slice: + { + // We only care about the []byte type. + if !obj1Value.CanConvert(bytesType) { + break + } + + // []byte can be compared! + bytesObj1, ok := obj1.([]byte) + if !ok { + bytesObj1 = obj1Value.Convert(bytesType).Interface().([]byte) + + } + bytesObj2, ok := obj2.([]byte) + if !ok { + bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte) + } + + return compareResult(bytes.Compare(bytesObj1, bytesObj2)), true + } + case reflect.Uintptr: + { + uintptrObj1, ok := obj1.(uintptr) + if !ok { + uintptrObj1 = obj1Value.Convert(uintptrType).Interface().(uintptr) + } + uintptrObj2, ok := obj2.(uintptr) + if !ok { + uintptrObj2 = obj2Value.Convert(uintptrType).Interface().(uintptr) + } + if uintptrObj1 > uintptrObj2 { + return compareGreater, true + } + if uintptrObj1 == uintptrObj2 { + return compareEqual, true + } + if uintptrObj1 < uintptrObj2 { + return compareLess, true + } + } + } + + return compareEqual, false +} + +// Greater asserts that the first element is greater than the second +// +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") +func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return compareTwoValues(t, e1, e2, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") +func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) +} + +// Less asserts that the first element is less than the second +// +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") +func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return compareTwoValues(t, e1, e2, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") +func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) +} + +// Positive asserts that the specified element is positive +// +// assert.Positive(t, 1) +// assert.Positive(t, 1.23) +func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + zero := reflect.Zero(reflect.TypeOf(e)) + return compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, "\"%v\" is not positive", msgAndArgs...) +} + +// Negative asserts that the specified element is negative +// +// assert.Negative(t, -1) +// assert.Negative(t, -1.23) +func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + zero := reflect.Zero(reflect.TypeOf(e)) + return compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, "\"%v\" is not negative", msgAndArgs...) +} + +func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + compareResult, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) + } + + return true +} + +func containsValue(values []compareResult, value compareResult) bool { + for _, v := range values { + if v == value { + return true + } + } + + return false +} diff --git a/internal/testify/assert/assertion_compare_test.go b/internal/testify/assert/assertion_compare_test.go new file mode 100644 index 000000000..bac3d7463 --- /dev/null +++ b/internal/testify/assert/assertion_compare_test.go @@ -0,0 +1,472 @@ +package assert + +import ( + "bytes" + "fmt" + "reflect" + "runtime" + "testing" + "time" +) + +func TestCompare(t *testing.T) { + type customString string + type customInt int + type customInt8 int8 + type customInt16 int16 + type customInt32 int32 + type customInt64 int64 + type customUInt uint + type customUInt8 uint8 + type customUInt16 uint16 + type customUInt32 uint32 + type customUInt64 uint64 + type customFloat32 float32 + type customFloat64 float64 + type customUintptr uintptr + type customTime time.Time + type customBytes []byte + for _, currCase := range []struct { + less interface{} + greater interface{} + cType string + }{ + {less: customString("a"), greater: customString("b"), cType: "string"}, + {less: "a", greater: "b", cType: "string"}, + {less: customInt(1), greater: customInt(2), cType: "int"}, + {less: int(1), greater: int(2), cType: "int"}, + {less: customInt8(1), greater: customInt8(2), cType: "int8"}, + {less: int8(1), greater: int8(2), cType: "int8"}, + {less: customInt16(1), greater: customInt16(2), cType: "int16"}, + {less: int16(1), greater: int16(2), cType: "int16"}, + {less: customInt32(1), greater: customInt32(2), cType: "int32"}, + {less: int32(1), greater: int32(2), cType: "int32"}, + {less: customInt64(1), greater: customInt64(2), cType: "int64"}, + {less: int64(1), greater: int64(2), cType: "int64"}, + {less: customUInt(1), greater: customUInt(2), cType: "uint"}, + {less: uint8(1), greater: uint8(2), cType: "uint8"}, + {less: customUInt8(1), greater: customUInt8(2), cType: "uint8"}, + {less: uint16(1), greater: uint16(2), cType: "uint16"}, + {less: customUInt16(1), greater: customUInt16(2), cType: "uint16"}, + {less: uint32(1), greater: uint32(2), cType: "uint32"}, + {less: customUInt32(1), greater: customUInt32(2), cType: "uint32"}, + {less: uint64(1), greater: uint64(2), cType: "uint64"}, + {less: customUInt64(1), greater: customUInt64(2), cType: "uint64"}, + {less: float32(1.23), greater: float32(2.34), cType: "float32"}, + {less: customFloat32(1.23), greater: customFloat32(2.23), cType: "float32"}, + {less: float64(1.23), greater: float64(2.34), cType: "float64"}, + {less: customFloat64(1.23), greater: customFloat64(2.34), cType: "float64"}, + {less: uintptr(1), greater: uintptr(2), cType: "uintptr"}, + {less: customUintptr(1), greater: customUintptr(2), cType: "uint64"}, + {less: time.Now(), greater: time.Now().Add(time.Hour), cType: "time.Time"}, + {less: time.Date(2024, 0, 0, 0, 0, 0, 0, time.Local), greater: time.Date(2263, 0, 0, 0, 0, 0, 0, time.Local), cType: "time.Time"}, + {less: customTime(time.Now()), greater: customTime(time.Now().Add(time.Hour)), cType: "time.Time"}, + {less: []byte{1, 1}, greater: []byte{1, 2}, cType: "[]byte"}, + {less: customBytes([]byte{1, 1}), greater: customBytes([]byte{1, 2}), cType: "[]byte"}, + } { + resLess, isComparable := compare(currCase.less, currCase.greater, reflect.ValueOf(currCase.less).Kind()) + if !isComparable { + t.Error("object should be comparable for type " + currCase.cType) + } + + if resLess != compareLess { + t.Errorf("object less (%v) should be less than greater (%v) for type "+currCase.cType, + currCase.less, currCase.greater) + } + + resGreater, isComparable := compare(currCase.greater, currCase.less, reflect.ValueOf(currCase.less).Kind()) + if !isComparable { + t.Error("object are comparable for type " + currCase.cType) + } + + if resGreater != compareGreater { + t.Errorf("object greater should be greater than less for type " + currCase.cType) + } + + resEqual, isComparable := compare(currCase.less, currCase.less, reflect.ValueOf(currCase.less).Kind()) + if !isComparable { + t.Error("object are comparable for type " + currCase.cType) + } + + if resEqual != 0 { + t.Errorf("objects should be equal for type " + currCase.cType) + } + } +} + +type outputT struct { + buf *bytes.Buffer + helpers map[string]struct{} +} + +// Implements TestingT +func (t *outputT) Errorf(format string, args ...interface{}) { + s := fmt.Sprintf(format, args...) + t.buf.WriteString(s) +} + +func (t *outputT) Helper() { + if t.helpers == nil { + t.helpers = make(map[string]struct{}) + } + t.helpers[callerName(1)] = struct{}{} +} + +// callerName gives the function name (qualified with a package path) +// for the caller after skip frames (where 0 means the current function). +func callerName(skip int) string { + // Make room for the skip PC. + var pc [1]uintptr + n := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName + if n == 0 { + panic("testing: zero callers found") + } + frames := runtime.CallersFrames(pc[:n]) + frame, _ := frames.Next() + return frame.Function +} + +func TestGreater(t *testing.T) { + mockT := new(testing.T) + + if !Greater(mockT, 2, 1) { + t.Error("Greater should return true") + } + + if Greater(mockT, 1, 1) { + t.Error("Greater should return false") + } + + if Greater(mockT, 1, 2) { + t.Error("Greater should return false") + } + + // Check error report + for _, currCase := range []struct { + less interface{} + greater interface{} + msg string + }{ + {less: "a", greater: "b", msg: `"a" is not greater than "b"`}, + {less: int(1), greater: int(2), msg: `"1" is not greater than "2"`}, + {less: int8(1), greater: int8(2), msg: `"1" is not greater than "2"`}, + {less: int16(1), greater: int16(2), msg: `"1" is not greater than "2"`}, + {less: int32(1), greater: int32(2), msg: `"1" is not greater than "2"`}, + {less: int64(1), greater: int64(2), msg: `"1" is not greater than "2"`}, + {less: uint8(1), greater: uint8(2), msg: `"1" is not greater than "2"`}, + {less: uint16(1), greater: uint16(2), msg: `"1" is not greater than "2"`}, + {less: uint32(1), greater: uint32(2), msg: `"1" is not greater than "2"`}, + {less: uint64(1), greater: uint64(2), msg: `"1" is not greater than "2"`}, + {less: float32(1.23), greater: float32(2.34), msg: `"1.23" is not greater than "2.34"`}, + {less: float64(1.23), greater: float64(2.34), msg: `"1.23" is not greater than "2.34"`}, + {less: uintptr(1), greater: uintptr(2), msg: `"1" is not greater than "2"`}, + {less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `"0001-01-01 00:00:00 +0000 UTC" is not greater than "0001-01-01 01:00:00 +0000 UTC"`}, + {less: []byte{1, 1}, greater: []byte{1, 2}, msg: `"[1 1]" is not greater than "[1 2]"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, Greater(out, currCase.less, currCase.greater)) + Contains(t, out.buf.String(), currCase.msg) + Contains(t, out.helpers, "github.com/expr-lang/expr/internal/testify/assert.Greater") + } +} + +func TestGreaterOrEqual(t *testing.T) { + mockT := new(testing.T) + + if !GreaterOrEqual(mockT, 2, 1) { + t.Error("GreaterOrEqual should return true") + } + + if !GreaterOrEqual(mockT, 1, 1) { + t.Error("GreaterOrEqual should return true") + } + + if GreaterOrEqual(mockT, 1, 2) { + t.Error("GreaterOrEqual should return false") + } + + // Check error report + for _, currCase := range []struct { + less interface{} + greater interface{} + msg string + }{ + {less: "a", greater: "b", msg: `"a" is not greater than or equal to "b"`}, + {less: int(1), greater: int(2), msg: `"1" is not greater than or equal to "2"`}, + {less: int8(1), greater: int8(2), msg: `"1" is not greater than or equal to "2"`}, + {less: int16(1), greater: int16(2), msg: `"1" is not greater than or equal to "2"`}, + {less: int32(1), greater: int32(2), msg: `"1" is not greater than or equal to "2"`}, + {less: int64(1), greater: int64(2), msg: `"1" is not greater than or equal to "2"`}, + {less: uint8(1), greater: uint8(2), msg: `"1" is not greater than or equal to "2"`}, + {less: uint16(1), greater: uint16(2), msg: `"1" is not greater than or equal to "2"`}, + {less: uint32(1), greater: uint32(2), msg: `"1" is not greater than or equal to "2"`}, + {less: uint64(1), greater: uint64(2), msg: `"1" is not greater than or equal to "2"`}, + {less: float32(1.23), greater: float32(2.34), msg: `"1.23" is not greater than or equal to "2.34"`}, + {less: float64(1.23), greater: float64(2.34), msg: `"1.23" is not greater than or equal to "2.34"`}, + {less: uintptr(1), greater: uintptr(2), msg: `"1" is not greater than or equal to "2"`}, + {less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `"0001-01-01 00:00:00 +0000 UTC" is not greater than or equal to "0001-01-01 01:00:00 +0000 UTC"`}, + {less: []byte{1, 1}, greater: []byte{1, 2}, msg: `"[1 1]" is not greater than or equal to "[1 2]"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, GreaterOrEqual(out, currCase.less, currCase.greater)) + Contains(t, out.buf.String(), currCase.msg) + Contains(t, out.helpers, "github.com/expr-lang/expr/internal/testify/assert.GreaterOrEqual") + } +} + +func TestLess(t *testing.T) { + mockT := new(testing.T) + + if !Less(mockT, 1, 2) { + t.Error("Less should return true") + } + + if Less(mockT, 1, 1) { + t.Error("Less should return false") + } + + if Less(mockT, 2, 1) { + t.Error("Less should return false") + } + + // Check error report + for _, currCase := range []struct { + less interface{} + greater interface{} + msg string + }{ + {less: "a", greater: "b", msg: `"b" is not less than "a"`}, + {less: int(1), greater: int(2), msg: `"2" is not less than "1"`}, + {less: int8(1), greater: int8(2), msg: `"2" is not less than "1"`}, + {less: int16(1), greater: int16(2), msg: `"2" is not less than "1"`}, + {less: int32(1), greater: int32(2), msg: `"2" is not less than "1"`}, + {less: int64(1), greater: int64(2), msg: `"2" is not less than "1"`}, + {less: uint8(1), greater: uint8(2), msg: `"2" is not less than "1"`}, + {less: uint16(1), greater: uint16(2), msg: `"2" is not less than "1"`}, + {less: uint32(1), greater: uint32(2), msg: `"2" is not less than "1"`}, + {less: uint64(1), greater: uint64(2), msg: `"2" is not less than "1"`}, + {less: float32(1.23), greater: float32(2.34), msg: `"2.34" is not less than "1.23"`}, + {less: float64(1.23), greater: float64(2.34), msg: `"2.34" is not less than "1.23"`}, + {less: uintptr(1), greater: uintptr(2), msg: `"2" is not less than "1"`}, + {less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `"0001-01-01 01:00:00 +0000 UTC" is not less than "0001-01-01 00:00:00 +0000 UTC"`}, + {less: []byte{1, 1}, greater: []byte{1, 2}, msg: `"[1 2]" is not less than "[1 1]"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, Less(out, currCase.greater, currCase.less)) + Contains(t, out.buf.String(), currCase.msg) + Contains(t, out.helpers, "github.com/expr-lang/expr/internal/testify/assert.Less") + } +} + +func TestLessOrEqual(t *testing.T) { + mockT := new(testing.T) + + if !LessOrEqual(mockT, 1, 2) { + t.Error("LessOrEqual should return true") + } + + if !LessOrEqual(mockT, 1, 1) { + t.Error("LessOrEqual should return true") + } + + if LessOrEqual(mockT, 2, 1) { + t.Error("LessOrEqual should return false") + } + + // Check error report + for _, currCase := range []struct { + less interface{} + greater interface{} + msg string + }{ + {less: "a", greater: "b", msg: `"b" is not less than or equal to "a"`}, + {less: int(1), greater: int(2), msg: `"2" is not less than or equal to "1"`}, + {less: int8(1), greater: int8(2), msg: `"2" is not less than or equal to "1"`}, + {less: int16(1), greater: int16(2), msg: `"2" is not less than or equal to "1"`}, + {less: int32(1), greater: int32(2), msg: `"2" is not less than or equal to "1"`}, + {less: int64(1), greater: int64(2), msg: `"2" is not less than or equal to "1"`}, + {less: uint8(1), greater: uint8(2), msg: `"2" is not less than or equal to "1"`}, + {less: uint16(1), greater: uint16(2), msg: `"2" is not less than or equal to "1"`}, + {less: uint32(1), greater: uint32(2), msg: `"2" is not less than or equal to "1"`}, + {less: uint64(1), greater: uint64(2), msg: `"2" is not less than or equal to "1"`}, + {less: float32(1.23), greater: float32(2.34), msg: `"2.34" is not less than or equal to "1.23"`}, + {less: float64(1.23), greater: float64(2.34), msg: `"2.34" is not less than or equal to "1.23"`}, + {less: uintptr(1), greater: uintptr(2), msg: `"2" is not less than or equal to "1"`}, + {less: time.Time{}, greater: time.Time{}.Add(time.Hour), msg: `"0001-01-01 01:00:00 +0000 UTC" is not less than or equal to "0001-01-01 00:00:00 +0000 UTC"`}, + {less: []byte{1, 1}, greater: []byte{1, 2}, msg: `"[1 2]" is not less than or equal to "[1 1]"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, LessOrEqual(out, currCase.greater, currCase.less)) + Contains(t, out.buf.String(), currCase.msg) + Contains(t, out.helpers, "github.com/expr-lang/expr/internal/testify/assert.LessOrEqual") + } +} + +func TestPositive(t *testing.T) { + mockT := new(testing.T) + + if !Positive(mockT, 1) { + t.Error("Positive should return true") + } + + if !Positive(mockT, 1.23) { + t.Error("Positive should return true") + } + + if Positive(mockT, -1) { + t.Error("Positive should return false") + } + + if Positive(mockT, -1.23) { + t.Error("Positive should return false") + } + + // Check error report + for _, currCase := range []struct { + e interface{} + msg string + }{ + {e: int(-1), msg: `"-1" is not positive`}, + {e: int8(-1), msg: `"-1" is not positive`}, + {e: int16(-1), msg: `"-1" is not positive`}, + {e: int32(-1), msg: `"-1" is not positive`}, + {e: int64(-1), msg: `"-1" is not positive`}, + {e: float32(-1.23), msg: `"-1.23" is not positive`}, + {e: float64(-1.23), msg: `"-1.23" is not positive`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, Positive(out, currCase.e)) + Contains(t, out.buf.String(), currCase.msg) + Contains(t, out.helpers, "github.com/expr-lang/expr/internal/testify/assert.Positive") + } +} + +func TestNegative(t *testing.T) { + mockT := new(testing.T) + + if !Negative(mockT, -1) { + t.Error("Negative should return true") + } + + if !Negative(mockT, -1.23) { + t.Error("Negative should return true") + } + + if Negative(mockT, 1) { + t.Error("Negative should return false") + } + + if Negative(mockT, 1.23) { + t.Error("Negative should return false") + } + + // Check error report + for _, currCase := range []struct { + e interface{} + msg string + }{ + {e: int(1), msg: `"1" is not negative`}, + {e: int8(1), msg: `"1" is not negative`}, + {e: int16(1), msg: `"1" is not negative`}, + {e: int32(1), msg: `"1" is not negative`}, + {e: int64(1), msg: `"1" is not negative`}, + {e: float32(1.23), msg: `"1.23" is not negative`}, + {e: float64(1.23), msg: `"1.23" is not negative`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, Negative(out, currCase.e)) + Contains(t, out.buf.String(), currCase.msg) + Contains(t, out.helpers, "github.com/expr-lang/expr/internal/testify/assert.Negative") + } +} + +func Test_compareTwoValuesDifferentValuesTypes(t *testing.T) { + mockT := new(testing.T) + + for _, currCase := range []struct { + v1 interface{} + v2 interface{} + compareResult bool + }{ + {v1: 123, v2: "abc"}, + {v1: "abc", v2: 123456}, + {v1: float64(12), v2: "123"}, + {v1: "float(12)", v2: float64(1)}, + } { + result := compareTwoValues(mockT, currCase.v1, currCase.v2, []compareResult{compareLess, compareEqual, compareGreater}, "testFailMessage") + False(t, result) + } +} + +func Test_compareTwoValuesNotComparableValues(t *testing.T) { + mockT := new(testing.T) + + type CompareStruct struct { + } + + for _, currCase := range []struct { + v1 interface{} + v2 interface{} + }{ + {v1: CompareStruct{}, v2: CompareStruct{}}, + {v1: map[string]int{}, v2: map[string]int{}}, + {v1: make([]int, 5), v2: make([]int, 5)}, + } { + result := compareTwoValues(mockT, currCase.v1, currCase.v2, []compareResult{compareLess, compareEqual, compareGreater}, "testFailMessage") + False(t, result) + } +} + +func Test_compareTwoValuesCorrectCompareResult(t *testing.T) { + mockT := new(testing.T) + + for _, currCase := range []struct { + v1 interface{} + v2 interface{} + allowedResults []compareResult + }{ + {v1: 1, v2: 2, allowedResults: []compareResult{compareLess}}, + {v1: 1, v2: 2, allowedResults: []compareResult{compareLess, compareEqual}}, + {v1: 2, v2: 2, allowedResults: []compareResult{compareGreater, compareEqual}}, + {v1: 2, v2: 2, allowedResults: []compareResult{compareEqual}}, + {v1: 2, v2: 1, allowedResults: []compareResult{compareEqual, compareGreater}}, + {v1: 2, v2: 1, allowedResults: []compareResult{compareGreater}}, + } { + result := compareTwoValues(mockT, currCase.v1, currCase.v2, currCase.allowedResults, "testFailMessage") + True(t, result) + } +} + +func Test_containsValue(t *testing.T) { + for _, currCase := range []struct { + values []compareResult + value compareResult + result bool + }{ + {values: []compareResult{compareGreater}, value: compareGreater, result: true}, + {values: []compareResult{compareGreater, compareLess}, value: compareGreater, result: true}, + {values: []compareResult{compareGreater, compareLess}, value: compareLess, result: true}, + {values: []compareResult{compareGreater, compareLess}, value: compareEqual, result: false}, + } { + result := containsValue(currCase.values, currCase.value) + Equal(t, currCase.result, result) + } +} + +func TestComparingMsgAndArgsForwarding(t *testing.T) { + msgAndArgs := []interface{}{"format %s %x", "this", 0xc001} + expectedOutput := "format this c001\n" + funcs := []func(t TestingT){ + func(t TestingT) { Greater(t, 1, 2, msgAndArgs...) }, + func(t TestingT) { GreaterOrEqual(t, 1, 2, msgAndArgs...) }, + func(t TestingT) { Less(t, 2, 1, msgAndArgs...) }, + func(t TestingT) { LessOrEqual(t, 2, 1, msgAndArgs...) }, + func(t TestingT) { Positive(t, 0, msgAndArgs...) }, + func(t TestingT) { Negative(t, 0, msgAndArgs...) }, + } + for _, f := range funcs { + out := &outputT{buf: bytes.NewBuffer(nil)} + f(out) + Contains(t, out.buf.String(), expectedOutput) + } +} diff --git a/internal/testify/assert/assertion_format.go b/internal/testify/assert/assertion_format.go new file mode 100644 index 000000000..dcc01f098 --- /dev/null +++ b/internal/testify/assert/assertion_format.go @@ -0,0 +1,807 @@ +// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT. + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Condition(t, comp, append([]interface{}{msg}, args...)...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Contains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return DirExists(t, path, append([]interface{}{msg}, args...)...) +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Empty(t, object, append([]interface{}{msg}, args...)...) +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// EqualValuesf asserts that two objects are equal or convertible to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Error(t, err, append([]interface{}{msg}, args...)...) +} + +// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return ErrorAs(t, err, target, append([]interface{}{msg}, args...)...) +} + +// ErrorContainsf asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") +func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return ErrorContains(t, theError, contains, append([]interface{}{msg}, args...)...) +} + +// ErrorIsf asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return ErrorIs(t, err, target, append([]interface{}{msg}, args...)...) +} + +// Eventuallyf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return EventuallyWithT(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return False(t, value, append([]interface{}{msg}, args...)...) +} + +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return FileExists(t, path, append([]interface{}{msg}, args...)...) +} + +// Greaterf asserts that the first element is greater than the second +// +// assert.Greaterf(t, 2, 1, "error message %s", "formatted") +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") +// assert.Greaterf(t, "b", "a", "error message %s", "formatted") +func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Greater(t, e1, e2, append([]interface{}{msg}, args...)...) +} + +// GreaterOrEqualf asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") +func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return GreaterOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// IsDecreasingf asserts that the collection is decreasing +// +// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsDecreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsIncreasingf asserts that the collection is increasing +// +// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsIncreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsNonDecreasingf asserts that the collection is not decreasing +// +// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsNonDecreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsNonIncreasingf asserts that the collection is not increasing +// +// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsNonIncreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Len(t, object, length, append([]interface{}{msg}, args...)...) +} + +// Lessf asserts that the first element is less than the second +// +// assert.Lessf(t, 1, 2, "error message %s", "formatted") +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") +// assert.Lessf(t, "a", "b", "error message %s", "formatted") +func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Less(t, e1, e2, append([]interface{}{msg}, args...)...) +} + +// LessOrEqualf asserts that the first element is less than or equal to the second +// +// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") +func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return LessOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) +} + +// Negativef asserts that the specified element is negative +// +// assert.Negativef(t, -1, "error message %s", "formatted") +// assert.Negativef(t, -1.23, "error message %s", "formatted") +func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Negative(t, e, append([]interface{}{msg}, args...)...) +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Never(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Nil(t, object, append([]interface{}{msg}, args...)...) +} + +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoDirExists(t, path, append([]interface{}{msg}, args...)...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoError(t, err, append([]interface{}{msg}, args...)...) +} + +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoFileExists(t, path, append([]interface{}{msg}, args...)...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEmpty(t, object, append([]interface{}{msg}, args...)...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotErrorIs(t, err, target, append([]interface{}{msg}, args...)...) +} + +// NotImplementsf asserts that an object does not implement the specified interface. +// +// assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotImplements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotNil(t, object, append([]interface{}{msg}, args...)...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotPanics(t, f, append([]interface{}{msg}, args...)...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// NotSamef asserts that two pointers do not reference the same object. +// +// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotSame(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotSubsetf asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted") +// assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// NotZerof asserts that i is not the zero value for its type. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotZero(t, i, append([]interface{}{msg}, args...)...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Panics(t, f, append([]interface{}{msg}, args...)...) +} + +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return PanicsWithError(t, errString, f, append([]interface{}{msg}, args...)...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) +} + +// Positivef asserts that the specified element is positive +// +// assert.Positivef(t, 1, "error message %s", "formatted") +// assert.Positivef(t, 1.23, "error message %s", "formatted") +func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Positive(t, e, append([]interface{}{msg}, args...)...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// Samef asserts that two pointers reference the same object. +// +// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func Samef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Same(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Subsetf asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted") +// assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Subset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return True(t, value, append([]interface{}{msg}, args...)...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return WithinRange(t, actual, start, end, append([]interface{}{msg}, args...)...) +} + +// Zerof asserts that i is the zero value for its type. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Zero(t, i, append([]interface{}{msg}, args...)...) +} diff --git a/internal/testify/assert/assertion_format.go.tmpl b/internal/testify/assert/assertion_format.go.tmpl new file mode 100644 index 000000000..d2bb0b817 --- /dev/null +++ b/internal/testify/assert/assertion_format.go.tmpl @@ -0,0 +1,5 @@ +{{.CommentFormat}} +func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { + if h, ok := t.(tHelper); ok { h.Helper() } + return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) +} diff --git a/internal/testify/assert/assertion_forward.go b/internal/testify/assert/assertion_forward.go new file mode 100644 index 000000000..c498c9d43 --- /dev/null +++ b/internal/testify/assert/assertion_forward.go @@ -0,0 +1,1605 @@ +// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT. + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Containsf(a.t, s, contains, msg, args...) +} + +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return DirExists(a.t, path, msgAndArgs...) +} + +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return DirExistsf(a.t, path, msg, args...) +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) +func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ElementsMatch(a.t, listA, listB, msgAndArgs...) +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ElementsMatchf(a.t, listA, listB, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValues(S{1, 2}, S{1, 3}) => true +// a.EqualExportedValues(S{1, 2}, S{2, 3}) => false +func (a *Assertions) EqualExportedValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualExportedValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValuesf(S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// a.EqualExportedValuesf(S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualExportedValuesf(a.t, expected, actual, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertible to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertible to the same types +// and equal. +// +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Error(a.t, err, msgAndArgs...) +} + +// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func (a *Assertions) ErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorAs(a.t, err, target, msgAndArgs...) +} + +// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorAsf(a.t, err, target, msg, args...) +} + +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// a.ErrorContains(err, expectedErrorSubString) +func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorContains(a.t, theError, contains, msgAndArgs...) +} + +// ErrorContainsf asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted") +func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorContainsf(a.t, theError, contains, msg, args...) +} + +// ErrorIs asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorIs(a.t, err, target, msgAndArgs...) +} + +// ErrorIsf asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorIsf(a.t, err, target, msg, args...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Errorf(a.t, err, msg, args...) +} + +// Eventually asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Eventually(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithT(func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EventuallyWithT(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EventuallyWithTf(a.t, condition, waitFor, tick, msg, args...) +} + +// Eventuallyf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Eventuallyf(a.t, condition, waitFor, tick, msg, args...) +} + +// Exactly asserts that two objects are equal in value and type. +// +// a.Exactly(int32(123), int64(123)) +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Falsef(a.t, value, msg, args...) +} + +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return FileExists(a.t, path, msgAndArgs...) +} + +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return FileExistsf(a.t, path, msg, args...) +} + +// Greater asserts that the first element is greater than the second +// +// a.Greater(2, 1) +// a.Greater(float64(2), float64(1)) +// a.Greater("b", "a") +func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Greater(a.t, e1, e2, msgAndArgs...) +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// a.GreaterOrEqual(2, 1) +// a.GreaterOrEqual(2, 2) +// a.GreaterOrEqual("b", "a") +// a.GreaterOrEqual("b", "b") +func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return GreaterOrEqual(a.t, e1, e2, msgAndArgs...) +} + +// GreaterOrEqualf asserts that the first element is greater than or equal to the second +// +// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") +// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") +// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") +// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") +func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return GreaterOrEqualf(a.t, e1, e2, msg, args...) +} + +// Greaterf asserts that the first element is greater than the second +// +// a.Greaterf(2, 1, "error message %s", "formatted") +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") +// a.Greaterf("b", "a", "error message %s", "formatted") +func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Greaterf(a.t, e1, e2, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPError(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPErrorf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPSuccessf(a.t, handler, method, url, values, msg, args...) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, 22/7.0, 0.01) +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsDecreasing asserts that the collection is decreasing +// +// a.IsDecreasing([]int{2, 1, 0}) +// a.IsDecreasing([]float{2, 1}) +// a.IsDecreasing([]string{"b", "a"}) +func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsDecreasing(a.t, object, msgAndArgs...) +} + +// IsDecreasingf asserts that the collection is decreasing +// +// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") +// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") +func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsDecreasingf(a.t, object, msg, args...) +} + +// IsIncreasing asserts that the collection is increasing +// +// a.IsIncreasing([]int{1, 2, 3}) +// a.IsIncreasing([]float{1, 2}) +// a.IsIncreasing([]string{"a", "b"}) +func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsIncreasing(a.t, object, msgAndArgs...) +} + +// IsIncreasingf asserts that the collection is increasing +// +// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") +// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") +func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsIncreasingf(a.t, object, msg, args...) +} + +// IsNonDecreasing asserts that the collection is not decreasing +// +// a.IsNonDecreasing([]int{1, 1, 2}) +// a.IsNonDecreasing([]float{1, 2}) +// a.IsNonDecreasing([]string{"a", "b"}) +func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonDecreasing(a.t, object, msgAndArgs...) +} + +// IsNonDecreasingf asserts that the collection is not decreasing +// +// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") +func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonDecreasingf(a.t, object, msg, args...) +} + +// IsNonIncreasing asserts that the collection is not increasing +// +// a.IsNonIncreasing([]int{2, 1, 1}) +// a.IsNonIncreasing([]float{2, 1}) +// a.IsNonIncreasing([]string{"b", "a"}) +func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonIncreasing(a.t, object, msgAndArgs...) +} + +// IsNonIncreasingf asserts that the collection is not increasing +// +// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") +func (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonIncreasingf(a.t, object, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Lenf(a.t, object, length, msg, args...) +} + +// Less asserts that the first element is less than the second +// +// a.Less(1, 2) +// a.Less(float64(1), float64(2)) +// a.Less("a", "b") +func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Less(a.t, e1, e2, msgAndArgs...) +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// a.LessOrEqual(1, 2) +// a.LessOrEqual(2, 2) +// a.LessOrEqual("a", "b") +// a.LessOrEqual("b", "b") +func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return LessOrEqual(a.t, e1, e2, msgAndArgs...) +} + +// LessOrEqualf asserts that the first element is less than or equal to the second +// +// a.LessOrEqualf(1, 2, "error message %s", "formatted") +// a.LessOrEqualf(2, 2, "error message %s", "formatted") +// a.LessOrEqualf("a", "b", "error message %s", "formatted") +// a.LessOrEqualf("b", "b", "error message %s", "formatted") +func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return LessOrEqualf(a.t, e1, e2, msg, args...) +} + +// Lessf asserts that the first element is less than the second +// +// a.Lessf(1, 2, "error message %s", "formatted") +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") +// a.Lessf("a", "b", "error message %s", "formatted") +func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Lessf(a.t, e1, e2, msg, args...) +} + +// Negative asserts that the specified element is negative +// +// a.Negative(-1) +// a.Negative(-1.23) +func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Negative(a.t, e, msgAndArgs...) +} + +// Negativef asserts that the specified element is negative +// +// a.Negativef(-1, "error message %s", "formatted") +// a.Negativef(-1.23, "error message %s", "formatted") +func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Negativef(a.t, e, msg, args...) +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Never(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Neverf(a.t, condition, waitFor, tick, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Nilf(a.t, object, msg, args...) +} + +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoDirExists(a.t, path, msgAndArgs...) +} + +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoDirExistsf(a.t, path, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoErrorf(a.t, err, msg, args...) +} + +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoFileExists(a.t, path, msgAndArgs...) +} + +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoFileExistsf(a.t, path, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValuesf(a.t, expected, actual, msg, args...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotErrorIs asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotErrorIs(a.t, err, target, msgAndArgs...) +} + +// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotErrorIsf(a.t, err, target, msg, args...) +} + +// NotImplements asserts that an object does not implement the specified interface. +// +// a.NotImplements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) NotImplements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotImplements(a.t, interfaceObject, object, msgAndArgs...) +} + +// NotImplementsf asserts that an object does not implement the specified interface. +// +// a.NotImplementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func (a *Assertions) NotImplementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotImplementsf(a.t, interfaceObject, object, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSame asserts that two pointers do not reference the same object. +// +// a.NotSame(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSame(a.t, expected, actual, msgAndArgs...) +} + +// NotSamef asserts that two pointers do not reference the same object. +// +// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSamef(a.t, expected, actual, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// a.NotSubset([1, 3, 4], [1, 2]) +// a.NotSubset({"x": 1, "y": 2}, {"z": 3}) +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// a.NotSubsetf([1, 3, 4], [1, 2], "error message %s", "formatted") +// a.NotSubsetf({"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithError("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithError(a.t, errString, f, msgAndArgs...) +} + +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithErrorf(a.t, errString, f, msg, args...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Panicsf(a.t, f, msg, args...) +} + +// Positive asserts that the specified element is positive +// +// a.Positive(1) +// a.Positive(1.23) +func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Positive(a.t, e, msgAndArgs...) +} + +// Positivef asserts that the specified element is positive +// +// a.Positivef(1, "error message %s", "formatted") +// a.Positivef(1.23, "error message %s", "formatted") +func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Positivef(a.t, e, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Regexpf(a.t, rx, str, msg, args...) +} + +// Same asserts that two pointers reference the same object. +// +// a.Same(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Same(a.t, expected, actual, msgAndArgs...) +} + +// Samef asserts that two pointers reference the same object. +// +// a.Samef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Samef(a.t, expected, actual, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// a.Subset([1, 2, 3], [1, 2]) +// a.Subset({"x": 1, "y": 2}, {"x": 1}) +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// a.Subsetf([1, 2, 3], [1, 2], "error message %s", "formatted") +// a.Subsetf({"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// WithinRange asserts that a time is within a time range (inclusive). +// +// a.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinRange(a.t, actual, start, end, msgAndArgs...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// a.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinRangef(a.t, actual, start, end, msg, args...) +} + +// Zero asserts that i is the zero value for its type. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Zerof(a.t, i, msg, args...) +} diff --git a/internal/testify/assert/assertion_forward.go.tmpl b/internal/testify/assert/assertion_forward.go.tmpl new file mode 100644 index 000000000..188bb9e17 --- /dev/null +++ b/internal/testify/assert/assertion_forward.go.tmpl @@ -0,0 +1,5 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { + if h, ok := a.t.(tHelper); ok { h.Helper() } + return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/internal/testify/assert/assertion_order.go b/internal/testify/assert/assertion_order.go new file mode 100644 index 000000000..1d2f71824 --- /dev/null +++ b/internal/testify/assert/assertion_order.go @@ -0,0 +1,81 @@ +package assert + +import ( + "fmt" + "reflect" +) + +// isOrdered checks that collection contains orderable elements. +func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool { + objKind := reflect.TypeOf(object).Kind() + if objKind != reflect.Slice && objKind != reflect.Array { + return false + } + + objValue := reflect.ValueOf(object) + objLen := objValue.Len() + + if objLen <= 1 { + return true + } + + value := objValue.Index(0) + valueInterface := value.Interface() + firstValueKind := value.Kind() + + for i := 1; i < objLen; i++ { + prevValue := value + prevValueInterface := valueInterface + + value = objValue.Index(i) + valueInterface = value.Interface() + + compareResult, isComparable := compare(prevValueInterface, valueInterface, firstValueKind) + + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\" and \"%s\"", reflect.TypeOf(value), reflect.TypeOf(prevValue)), msgAndArgs...) + } + + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, prevValue, value), msgAndArgs...) + } + } + + return true +} + +// IsIncreasing asserts that the collection is increasing +// +// assert.IsIncreasing(t, []int{1, 2, 3}) +// assert.IsIncreasing(t, []float{1, 2}) +// assert.IsIncreasing(t, []string{"a", "b"}) +func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) +} + +// IsNonIncreasing asserts that the collection is not increasing +// +// assert.IsNonIncreasing(t, []int{2, 1, 1}) +// assert.IsNonIncreasing(t, []float{2, 1}) +// assert.IsNonIncreasing(t, []string{"b", "a"}) +func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) +} + +// IsDecreasing asserts that the collection is decreasing +// +// assert.IsDecreasing(t, []int{2, 1, 0}) +// assert.IsDecreasing(t, []float{2, 1}) +// assert.IsDecreasing(t, []string{"b", "a"}) +func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) +} + +// IsNonDecreasing asserts that the collection is not decreasing +// +// assert.IsNonDecreasing(t, []int{1, 1, 2}) +// assert.IsNonDecreasing(t, []float{1, 2}) +// assert.IsNonDecreasing(t, []string{"a", "b"}) +func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) +} diff --git a/internal/testify/assert/assertion_order_test.go b/internal/testify/assert/assertion_order_test.go new file mode 100644 index 000000000..eefe06127 --- /dev/null +++ b/internal/testify/assert/assertion_order_test.go @@ -0,0 +1,203 @@ +package assert + +import ( + "bytes" + "testing" +) + +func TestIsIncreasing(t *testing.T) { + mockT := new(testing.T) + + if !IsIncreasing(mockT, []int{1, 2}) { + t.Error("IsIncreasing should return true") + } + + if !IsIncreasing(mockT, []int{1, 2, 3, 4, 5}) { + t.Error("IsIncreasing should return true") + } + + if IsIncreasing(mockT, []int{1, 1}) { + t.Error("IsIncreasing should return false") + } + + if IsIncreasing(mockT, []int{2, 1}) { + t.Error("IsIncreasing should return false") + } + + // Check error report + for _, currCase := range []struct { + collection interface{} + msg string + }{ + {collection: []string{"b", "a"}, msg: `"b" is not less than "a"`}, + {collection: []int{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []int{2, 1, 3, 4, 5, 6, 7}, msg: `"2" is not less than "1"`}, + {collection: []int{-1, 0, 2, 1}, msg: `"2" is not less than "1"`}, + {collection: []int8{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []int16{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []int32{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []int64{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []uint8{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []uint16{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []uint32{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []uint64{2, 1}, msg: `"2" is not less than "1"`}, + {collection: []float32{2.34, 1.23}, msg: `"2.34" is not less than "1.23"`}, + {collection: []float64{2.34, 1.23}, msg: `"2.34" is not less than "1.23"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, IsIncreasing(out, currCase.collection)) + Contains(t, out.buf.String(), currCase.msg) + } +} + +func TestIsNonIncreasing(t *testing.T) { + mockT := new(testing.T) + + if !IsNonIncreasing(mockT, []int{2, 1}) { + t.Error("IsNonIncreasing should return true") + } + + if !IsNonIncreasing(mockT, []int{5, 4, 4, 3, 2, 1}) { + t.Error("IsNonIncreasing should return true") + } + + if !IsNonIncreasing(mockT, []int{1, 1}) { + t.Error("IsNonIncreasing should return true") + } + + if IsNonIncreasing(mockT, []int{1, 2}) { + t.Error("IsNonIncreasing should return false") + } + + // Check error report + for _, currCase := range []struct { + collection interface{} + msg string + }{ + {collection: []string{"a", "b"}, msg: `"a" is not greater than or equal to "b"`}, + {collection: []int{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []int{1, 2, 7, 6, 5, 4, 3}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []int{5, 4, 3, 1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []int8{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []int16{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []int32{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []int64{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []uint8{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []uint16{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []uint32{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []uint64{1, 2}, msg: `"1" is not greater than or equal to "2"`}, + {collection: []float32{1.23, 2.34}, msg: `"1.23" is not greater than or equal to "2.34"`}, + {collection: []float64{1.23, 2.34}, msg: `"1.23" is not greater than or equal to "2.34"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, IsNonIncreasing(out, currCase.collection)) + Contains(t, out.buf.String(), currCase.msg) + } +} + +func TestIsDecreasing(t *testing.T) { + mockT := new(testing.T) + + if !IsDecreasing(mockT, []int{2, 1}) { + t.Error("IsDecreasing should return true") + } + + if !IsDecreasing(mockT, []int{5, 4, 3, 2, 1}) { + t.Error("IsDecreasing should return true") + } + + if IsDecreasing(mockT, []int{1, 1}) { + t.Error("IsDecreasing should return false") + } + + if IsDecreasing(mockT, []int{1, 2}) { + t.Error("IsDecreasing should return false") + } + + // Check error report + for _, currCase := range []struct { + collection interface{} + msg string + }{ + {collection: []string{"a", "b"}, msg: `"a" is not greater than "b"`}, + {collection: []int{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []int{1, 2, 7, 6, 5, 4, 3}, msg: `"1" is not greater than "2"`}, + {collection: []int{5, 4, 3, 1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []int8{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []int16{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []int32{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []int64{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []uint8{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []uint16{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []uint32{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []uint64{1, 2}, msg: `"1" is not greater than "2"`}, + {collection: []float32{1.23, 2.34}, msg: `"1.23" is not greater than "2.34"`}, + {collection: []float64{1.23, 2.34}, msg: `"1.23" is not greater than "2.34"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, IsDecreasing(out, currCase.collection)) + Contains(t, out.buf.String(), currCase.msg) + } +} + +func TestIsNonDecreasing(t *testing.T) { + mockT := new(testing.T) + + if !IsNonDecreasing(mockT, []int{1, 2}) { + t.Error("IsNonDecreasing should return true") + } + + if !IsNonDecreasing(mockT, []int{1, 1, 2, 3, 4, 5}) { + t.Error("IsNonDecreasing should return true") + } + + if !IsNonDecreasing(mockT, []int{1, 1}) { + t.Error("IsNonDecreasing should return false") + } + + if IsNonDecreasing(mockT, []int{2, 1}) { + t.Error("IsNonDecreasing should return false") + } + + // Check error report + for _, currCase := range []struct { + collection interface{} + msg string + }{ + {collection: []string{"b", "a"}, msg: `"b" is not less than or equal to "a"`}, + {collection: []int{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []int{2, 1, 3, 4, 5, 6, 7}, msg: `"2" is not less than or equal to "1"`}, + {collection: []int{-1, 0, 2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []int8{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []int16{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []int32{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []int64{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []uint8{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []uint16{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []uint32{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []uint64{2, 1}, msg: `"2" is not less than or equal to "1"`}, + {collection: []float32{2.34, 1.23}, msg: `"2.34" is not less than or equal to "1.23"`}, + {collection: []float64{2.34, 1.23}, msg: `"2.34" is not less than or equal to "1.23"`}, + } { + out := &outputT{buf: bytes.NewBuffer(nil)} + False(t, IsNonDecreasing(out, currCase.collection)) + Contains(t, out.buf.String(), currCase.msg) + } +} + +func TestOrderingMsgAndArgsForwarding(t *testing.T) { + msgAndArgs := []interface{}{"format %s %x", "this", 0xc001} + expectedOutput := "format this c001\n" + collection := []int{1, 2, 1} + funcs := []func(t TestingT){ + func(t TestingT) { IsIncreasing(t, collection, msgAndArgs...) }, + func(t TestingT) { IsNonIncreasing(t, collection, msgAndArgs...) }, + func(t TestingT) { IsDecreasing(t, collection, msgAndArgs...) }, + func(t TestingT) { IsNonDecreasing(t, collection, msgAndArgs...) }, + } + for _, f := range funcs { + out := &outputT{buf: bytes.NewBuffer(nil)} + f(out) + Contains(t, out.buf.String(), expectedOutput) + } +} diff --git a/internal/testify/assert/assertions.go b/internal/testify/assert/assertions.go new file mode 100644 index 000000000..64ab7e6b9 --- /dev/null +++ b/internal/testify/assert/assertions.go @@ -0,0 +1,2091 @@ +package assert + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "os" + "reflect" + "regexp" + "runtime" + "runtime/debug" + "strings" + "time" + "unicode" + "unicode/utf8" + + "github.com/expr-lang/expr/internal/spew" + + "github.com/expr-lang/expr/internal/difflib" +) + +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) +} + +// ComparisonAssertionFunc is a common function prototype when comparing two values. Can be useful +// for table driven tests. +type ComparisonAssertionFunc func(TestingT, interface{}, interface{}, ...interface{}) bool + +// ValueAssertionFunc is a common function prototype when validating a single value. Can be useful +// for table driven tests. +type ValueAssertionFunc func(TestingT, interface{}, ...interface{}) bool + +// BoolAssertionFunc is a common function prototype when validating a bool value. Can be useful +// for table driven tests. +type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool + +// ErrorAssertionFunc is a common function prototype when validating an error value. Can be useful +// for table driven tests. +type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool + +// PanicAssertionFunc is a common function prototype when validating a panic value. Can be useful +// for table driven tests. +type PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool + +// Comparison is a custom function that returns true on success and false on failure +type Comparison func() (success bool) + +/* + Helper functions +*/ + +// ObjectsAreEqual determines if two objects are considered equal. +// +// This function does no assertion of any kind. +func ObjectsAreEqual(expected, actual interface{}) bool { + if expected == nil || actual == nil { + return expected == actual + } + + exp, ok := expected.([]byte) + if !ok { + return reflect.DeepEqual(expected, actual) + } + + act, ok := actual.([]byte) + if !ok { + return false + } + if exp == nil || act == nil { + return exp == nil && act == nil + } + return bytes.Equal(exp, act) +} + +// copyExportedFields iterates downward through nested data structures and creates a copy +// that only contains the exported struct fields. +func copyExportedFields(expected interface{}) interface{} { + if isNil(expected) { + return expected + } + + expectedType := reflect.TypeOf(expected) + expectedKind := expectedType.Kind() + expectedValue := reflect.ValueOf(expected) + + switch expectedKind { + case reflect.Struct: + result := reflect.New(expectedType).Elem() + for i := 0; i < expectedType.NumField(); i++ { + field := expectedType.Field(i) + isExported := field.IsExported() + if isExported { + fieldValue := expectedValue.Field(i) + if isNil(fieldValue) || isNil(fieldValue.Interface()) { + continue + } + newValue := copyExportedFields(fieldValue.Interface()) + result.Field(i).Set(reflect.ValueOf(newValue)) + } + } + return result.Interface() + + case reflect.Ptr: + result := reflect.New(expectedType.Elem()) + unexportedRemoved := copyExportedFields(expectedValue.Elem().Interface()) + result.Elem().Set(reflect.ValueOf(unexportedRemoved)) + return result.Interface() + + case reflect.Array, reflect.Slice: + var result reflect.Value + if expectedKind == reflect.Array { + result = reflect.New(reflect.ArrayOf(expectedValue.Len(), expectedType.Elem())).Elem() + } else { + result = reflect.MakeSlice(expectedType, expectedValue.Len(), expectedValue.Len()) + } + for i := 0; i < expectedValue.Len(); i++ { + index := expectedValue.Index(i) + if isNil(index) { + continue + } + unexportedRemoved := copyExportedFields(index.Interface()) + result.Index(i).Set(reflect.ValueOf(unexportedRemoved)) + } + return result.Interface() + + case reflect.Map: + result := reflect.MakeMap(expectedType) + for _, k := range expectedValue.MapKeys() { + index := expectedValue.MapIndex(k) + unexportedRemoved := copyExportedFields(index.Interface()) + result.SetMapIndex(k, reflect.ValueOf(unexportedRemoved)) + } + return result.Interface() + + default: + return expected + } +} + +// ObjectsExportedFieldsAreEqual determines if the exported (public) fields of two objects are +// considered equal. This comparison of only exported fields is applied recursively to nested data +// structures. +// +// This function does no assertion of any kind. +// +// Deprecated: Use [EqualExportedValues] instead. +func ObjectsExportedFieldsAreEqual(expected, actual interface{}) bool { + expectedCleaned := copyExportedFields(expected) + actualCleaned := copyExportedFields(actual) + return ObjectsAreEqualValues(expectedCleaned, actualCleaned) +} + +// ObjectsAreEqualValues gets whether two objects are equal, or if their +// values are equal. +func ObjectsAreEqualValues(expected, actual interface{}) bool { + if ObjectsAreEqual(expected, actual) { + return true + } + + expectedValue := reflect.ValueOf(expected) + actualValue := reflect.ValueOf(actual) + if !expectedValue.IsValid() || !actualValue.IsValid() { + return false + } + + expectedType := expectedValue.Type() + actualType := actualValue.Type() + if !expectedType.ConvertibleTo(actualType) { + return false + } + + if !isNumericType(expectedType) || !isNumericType(actualType) { + // Attempt comparison after type conversion + return reflect.DeepEqual( + expectedValue.Convert(actualType).Interface(), actual, + ) + } + + // If BOTH values are numeric, there are chances of false positives due + // to overflow or underflow. So, we need to make sure to always convert + // the smaller type to a larger type before comparing. + if expectedType.Size() >= actualType.Size() { + return actualValue.Convert(expectedType).Interface() == expected + } + + return expectedValue.Convert(actualType).Interface() == actual +} + +// isNumericType returns true if the type is one of: +// int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, +// float32, float64, complex64, complex128 +func isNumericType(t reflect.Type) bool { + return t.Kind() >= reflect.Int && t.Kind() <= reflect.Complex128 +} + +/* CallerInfo is necessary because the assert functions use the testing object +internally, causing it to print the file:line of the assert method, rather than where +the problem actually occurred in calling code.*/ + +// CallerInfo returns an array of strings containing the file and line number +// of each stack frame leading from the current test to the assert call that +// failed. +func CallerInfo() []string { + + var pc uintptr + var ok bool + var file string + var line int + var name string + + callers := []string{} + for i := 0; ; i++ { + pc, file, line, ok = runtime.Caller(i) + if !ok { + // The breaks below failed to terminate the loop, and we ran off the + // end of the call stack. + break + } + + // This is a huge edge case, but it will panic if this is the case, see #180 + if file == "" { + break + } + + f := runtime.FuncForPC(pc) + if f == nil { + break + } + name = f.Name() + + // testing.tRunner is the standard library function that calls + // tests. Subtests are called directly by tRunner, without going through + // the Test/Benchmark/Example function that contains the t.Run calls, so + // with subtests we should break when we hit tRunner, without adding it + // to the list of callers. + if name == "testing.tRunner" { + break + } + + parts := strings.Split(file, "/") + if len(parts) > 1 { + filename := parts[len(parts)-1] + dir := parts[len(parts)-2] + if (dir != "assert" && dir != "mock" && dir != "require") || filename == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + } + } + + // Drop the package + segments := strings.Split(name, ".") + name = segments[len(segments)-1] + if isTest(name, "Test") || + isTest(name, "Benchmark") || + isTest(name, "Example") { + break + } + } + + return callers +} + +// Stolen from the `go test` tool. +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + r, _ := utf8.DecodeRuneInString(name[len(prefix):]) + return !unicode.IsLower(r) +} + +func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { + if len(msgAndArgs) == 0 || msgAndArgs == nil { + return "" + } + if len(msgAndArgs) == 1 { + msg := msgAndArgs[0] + if msgAsStr, ok := msg.(string); ok { + return msgAsStr + } + return fmt.Sprintf("%+v", msg) + } + if len(msgAndArgs) > 1 { + return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + } + return "" +} + +// Aligns the provided message so that all lines after the first line start at the same location as the first line. +// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). +// The longestLabelLen parameter specifies the length of the longest label in the output (required because this is the +// basis on which the alignment occurs). +func indentMessageLines(message string, longestLabelLen int) string { + outBuf := new(bytes.Buffer) + + for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { + // no need to align first line because it starts at the correct location (after the label) + if i != 0 { + // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab + outBuf.WriteString("\n\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + } + outBuf.WriteString(scanner.Text()) + } + + return outBuf.String() +} + +type failNower interface { + FailNow() +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + Fail(t, failureMessage, msgAndArgs...) + + // We cannot extend TestingT with FailNow() and + // maintain backwards compatibility, so we fallback + // to panicking when FailNow is not available in + // TestingT. + // See issue #263 + + if t, ok := t.(failNower); ok { + t.FailNow() + } else { + panic("test failed and t is missing `FailNow()`") + } + return false +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + content := []labeledContent{ + {"Error Trace", strings.Join(CallerInfo(), "\n\t\t\t")}, + {"Error", failureMessage}, + } + + // Add test name if the Go version supports it + if n, ok := t.(interface { + Name() string + }); ok { + content = append(content, labeledContent{"Test", n.Name()}) + } + + message := messageFromMsgAndArgs(msgAndArgs...) + if len(message) > 0 { + content = append(content, labeledContent{"Messages", message}) + } + + t.Errorf("\n%s", ""+labeledOutput(content...)) + + return false +} + +type labeledContent struct { + label string + content string +} + +// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: +// +// \t{{label}}:{{align_spaces}}\t{{content}}\n +// +// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. +// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this +// alignment is achieved, "\t{{content}}\n" is added for the output. +// +// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. +func labeledOutput(content ...labeledContent) string { + longestLabel := 0 + for _, v := range content { + if len(v.label) > longestLabel { + longestLabel = len(v.label) + } + } + var output string + for _, v := range content { + output += "\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" + } + return output +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if object == nil { + return Fail(t, fmt.Sprintf("Cannot check if nil implements %v", interfaceType), msgAndArgs...) + } + if !reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) + } + + return true +} + +// NotImplements asserts that an object does not implement the specified interface. +// +// assert.NotImplements(t, (*MyInterface)(nil), new(MyObject)) +func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if object == nil { + return Fail(t, fmt.Sprintf("Cannot check if nil does not implement %v", interfaceType), msgAndArgs...) + } + if reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T implements %v", object, interfaceType), msgAndArgs...) + } + + return true +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { + return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) + } + + return true +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if !ObjectsAreEqual(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if expected == nil && actual == nil { + return nil + } + + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + +// Same asserts that two pointers reference the same object. +// +// assert.Same(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if !samePointers(expected, actual) { + return Fail(t, fmt.Sprintf("Not same: \n"+ + "expected: %p %#v\n"+ + "actual : %p %#v", expected, expected, actual, actual), msgAndArgs...) + } + + return true +} + +// NotSame asserts that two pointers do not reference the same object. +// +// assert.NotSame(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if samePointers(expected, actual) { + return Fail(t, fmt.Sprintf( + "Expected and actual point to the same object: %p %#v", + expected, expected), msgAndArgs...) + } + return true +} + +// samePointers compares two generic interface objects and returns whether +// they point to the same object +func samePointers(first, second interface{}) bool { + firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second) + if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr { + return false + } + + firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second) + if firstType != secondType { + return false + } + + // compare pointer addresses + return first == second +} + +// formatUnequalValues takes two values of arbitrary types and returns string +// representations appropriate to be presented to the user. +// +// If the values are not of like type, the returned strings will be prefixed +// with the type name, and the value will be enclosed in parentheses similar +// to a type conversion in the Go grammar. +func formatUnequalValues(expected, actual interface{}) (e string, a string) { + if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + return fmt.Sprintf("%T(%s)", expected, truncatingFormat(expected)), + fmt.Sprintf("%T(%s)", actual, truncatingFormat(actual)) + } + switch expected.(type) { + case time.Duration: + return fmt.Sprintf("%v", expected), fmt.Sprintf("%v", actual) + } + return truncatingFormat(expected), truncatingFormat(actual) +} + +// truncatingFormat formats the data and truncates it if it's too long. +// +// This helps keep formatted error messages lines from exceeding the +// bufio.MaxScanTokenSize max line length that the go testing framework imposes. +func truncatingFormat(data interface{}) string { + value := fmt.Sprintf("%#v", data) + max := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed. + if len(value) > max { + value = value[0:max] + "<... truncated>" + } + return value +} + +// EqualValues asserts that two objects are equal or convertible to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true +// assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false +func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...) + } + + if aType.Kind() == reflect.Ptr { + aType = aType.Elem() + } + if bType.Kind() == reflect.Ptr { + bType = bType.Elem() + } + + if aType.Kind() != reflect.Struct { + return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...) + } + + if bType.Kind() != reflect.Struct { + return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...) + } + + expected = copyExportedFields(expected) + actual = copyExportedFields(actual) + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal (comparing only exported fields): \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) + } + + return true +} + +// Exactly asserts that two objects are equal in value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...) + } + + return Equal(t, expected, actual, msgAndArgs...) + +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if !isNil(object) { + return true + } + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, "Expected value not to be nil.", msgAndArgs...) +} + +// isNil checks if a specified object is nil or not, without Failing. +func isNil(object interface{}) bool { + if object == nil { + return true + } + + value := reflect.ValueOf(object) + switch value.Kind() { + case + reflect.Chan, reflect.Func, + reflect.Interface, reflect.Map, + reflect.Ptr, reflect.Slice, reflect.UnsafePointer: + + return value.IsNil() + } + + return false +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if isNil(object) { + return true + } + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) +} + +// isEmpty gets whether the specified object is considered empty or not. +func isEmpty(object interface{}) bool { + + // get nil case out of the way + if object == nil { + return true + } + + objValue := reflect.ValueOf(object) + + switch objValue.Kind() { + // collection types are empty when they have no element + case reflect.Chan, reflect.Map, reflect.Slice: + return objValue.Len() == 0 + // pointers are empty if nil or if the value they point to is empty + case reflect.Ptr: + if objValue.IsNil() { + return true + } + deref := objValue.Elem().Interface() + return isEmpty(deref) + // for all other types, compare against the zero value + // array types are empty when they match their zero-initialized state + default: + zero := reflect.Zero(objValue.Type()) + return reflect.DeepEqual(object, zero.Interface()) + } +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + pass := isEmpty(object) + if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } + Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + pass := !isEmpty(object) + if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } + Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// getLen tries to get the length of an object. +// It returns (0, false) if impossible. +func getLen(x interface{}) (length int, ok bool) { + v := reflect.ValueOf(x) + defer func() { + ok = recover() == nil + }() + return v.Len(), true +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + l, ok := getLen(object) + if !ok { + return Fail(t, fmt.Sprintf("\"%v\" could not be applied builtin len()", object), msgAndArgs...) + } + + if l != length { + return Fail(t, fmt.Sprintf("\"%v\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) + } + return true +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { + if !value { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, "Should be true", msgAndArgs...) + } + + return true + +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { + if value { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, "Should be false", msgAndArgs...) + } + + return true + +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if ObjectsAreEqual(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true + +} + +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if ObjectsAreEqualValues(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true +} + +// containsElement try loop over the list check if the list includes the element. +// return (false, false) if impossible. +// return (true, false) if element was not found. +// return (true, true) if element was found. +func containsElement(list interface{}, element interface{}) (ok, found bool) { + + listValue := reflect.ValueOf(list) + listType := reflect.TypeOf(list) + if listType == nil { + return false, false + } + listKind := listType.Kind() + defer func() { + if e := recover(); e != nil { + ok = false + found = false + } + }() + + if listKind == reflect.String { + elementValue := reflect.ValueOf(element) + return true, strings.Contains(listValue.String(), elementValue.String()) + } + + if listKind == reflect.Map { + mapKeys := listValue.MapKeys() + for i := 0; i < len(mapKeys); i++ { + if ObjectsAreEqual(mapKeys[i].Interface(), element) { + return true, true + } + } + return true, false + } + + for i := 0; i < listValue.Len(); i++ { + if ObjectsAreEqual(listValue.Index(i).Interface(), element) { + return true, true + } + } + return true, false + +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + ok, found := containsElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", s, contains), msgAndArgs...) + } + + return true + +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + ok, found := containsElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) + } + if found { + return Fail(t, fmt.Sprintf("%#v should not contain %#v", s, contains), msgAndArgs...) + } + + return true + +} + +// Subset asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// assert.Subset(t, [1, 2, 3], [1, 2]) +// assert.Subset(t, {"x": 1, "y": 2}, {"x": 1}) +func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if subset == nil { + return true // we consider nil to be equal to the nil set + } + + listKind := reflect.TypeOf(list).Kind() + if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + subsetKind := reflect.TypeOf(subset).Kind() + if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + if subsetKind == reflect.Map && listKind == reflect.Map { + subsetMap := reflect.ValueOf(subset) + actualMap := reflect.ValueOf(list) + + for _, k := range subsetMap.MapKeys() { + ev := subsetMap.MapIndex(k) + av := actualMap.MapIndex(k) + + if !av.IsValid() { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, subset), msgAndArgs...) + } + if !ObjectsAreEqual(ev.Interface(), av.Interface()) { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, subset), msgAndArgs...) + } + } + + return true + } + + subsetList := reflect.ValueOf(subset) + for i := 0; i < subsetList.Len(); i++ { + element := subsetList.Index(i).Interface() + ok, found := containsElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, element), msgAndArgs...) + } + } + + return true +} + +// NotSubset asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// assert.NotSubset(t, [1, 3, 4], [1, 2]) +// assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3}) +func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if subset == nil { + return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...) + } + + listKind := reflect.TypeOf(list).Kind() + if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + subsetKind := reflect.TypeOf(subset).Kind() + if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + if subsetKind == reflect.Map && listKind == reflect.Map { + subsetMap := reflect.ValueOf(subset) + actualMap := reflect.ValueOf(list) + + for _, k := range subsetMap.MapKeys() { + ev := subsetMap.MapIndex(k) + av := actualMap.MapIndex(k) + + if !av.IsValid() { + return true + } + if !ObjectsAreEqual(ev.Interface(), av.Interface()) { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) + } + + subsetList := reflect.ValueOf(subset) + for i := 0; i < subsetList.Len(); i++ { + element := subsetList.Index(i).Interface() + ok, found := containsElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if isEmpty(listA) && isEmpty(listB) { + return true + } + + if !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) { + return false + } + + extraA, extraB := diffLists(listA, listB) + + if len(extraA) == 0 && len(extraB) == 0 { + return true + } + + return Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...) +} + +// isList checks that the provided value is array or slice. +func isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) { + kind := reflect.TypeOf(list).Kind() + if kind != reflect.Array && kind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s, expecting array or slice", list, kind), + msgAndArgs...) + } + return true +} + +// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B. +// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and +// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored. +func diffLists(listA, listB interface{}) (extraA, extraB []interface{}) { + aValue := reflect.ValueOf(listA) + bValue := reflect.ValueOf(listB) + + aLen := aValue.Len() + bLen := bValue.Len() + + // Mark indexes in bValue that we already used + visited := make([]bool, bLen) + for i := 0; i < aLen; i++ { + element := aValue.Index(i).Interface() + found := false + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + if ObjectsAreEqual(bValue.Index(j).Interface(), element) { + visited[j] = true + found = true + break + } + } + if !found { + extraA = append(extraA, element) + } + } + + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + extraB = append(extraB, bValue.Index(j).Interface()) + } + + return +} + +func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string { + var msg bytes.Buffer + + msg.WriteString("elements differ") + if len(extraA) > 0 { + msg.WriteString("\n\nextra elements in list A:\n") + msg.WriteString(spewConfig.Sdump(extraA)) + } + if len(extraB) > 0 { + msg.WriteString("\n\nextra elements in list B:\n") + msg.WriteString(spewConfig.Sdump(extraB)) + } + msg.WriteString("\n\nlistA:\n") + msg.WriteString(spewConfig.Sdump(listA)) + msg.WriteString("\n\nlistB:\n") + msg.WriteString(spewConfig.Sdump(listB)) + + return msg.String() +} + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + result := comp() + if !result { + Fail(t, "Condition failed!", msgAndArgs...) + } + return result +} + +// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics +// methods, and represents a simple func that takes no arguments, and returns nothing. +type PanicTestFunc func() + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string) { + didPanic = true + + defer func() { + message = recover() + if didPanic { + stack = string(debug.Stack()) + } + }() + + // call the target function + f() + didPanic = false + + return +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) + } + + return true +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + funcDidPanic, panicValue, panickedStack := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) + } + if panicValue != expected { + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, expected, panicValue, panickedStack), msgAndArgs...) + } + + return true +} + +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + funcDidPanic, panicValue, panickedStack := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) + } + panicErr, ok := panicValue.(error) + if !ok || panicErr.Error() != errString { + return Fail(t, fmt.Sprintf("func %#v should panic with error message:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, errString, panicValue, panickedStack), msgAndArgs...) + } + + return true +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v\n\tPanic stack:\t%s", f, panicValue, panickedStack), msgAndArgs...) + } + + return true +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + dt := expected.Sub(actual) + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +// WithinRange asserts that a time is within a time range (inclusive). +// +// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func WithinRange(t TestingT, actual, start, end time.Time, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if end.Before(start) { + return Fail(t, "Start should be before end", msgAndArgs...) + } + + if actual.Before(start) { + return Fail(t, fmt.Sprintf("Time %v expected to be in time range %v to %v, but is before the range", actual, start, end), msgAndArgs...) + } else if actual.After(end) { + return Fail(t, fmt.Sprintf("Time %v expected to be in time range %v to %v, but is after the range", actual, start, end), msgAndArgs...) + } + + return true +} + +func toFloat(x interface{}) (float64, bool) { + var xf float64 + xok := true + + switch xn := x.(type) { + case uint: + xf = float64(xn) + case uint8: + xf = float64(xn) + case uint16: + xf = float64(xn) + case uint32: + xf = float64(xn) + case uint64: + xf = float64(xn) + case int: + xf = float64(xn) + case int8: + xf = float64(xn) + case int16: + xf = float64(xn) + case int32: + xf = float64(xn) + case int64: + xf = float64(xn) + case float32: + xf = float64(xn) + case float64: + xf = xn + case time.Duration: + xf = float64(xn) + default: + xok = false + } + + return xf, xok +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, 22/7.0, 0.01) +func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + af, aok := toFloat(expected) + bf, bok := toFloat(actual) + + if !aok || !bok { + return Fail(t, "Parameters must be numerical", msgAndArgs...) + } + + if math.IsNaN(af) && math.IsNaN(bf) { + return true + } + + if math.IsNaN(af) { + return Fail(t, "Expected must not be NaN", msgAndArgs...) + } + + if math.IsNaN(bf) { + return Fail(t, fmt.Sprintf("Expected %v with delta %v, but was NaN", expected, delta), msgAndArgs...) + } + + dt := af - bf + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, "Parameters must be slice", msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + if !result { + return result + } + } + + return true +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Map || + reflect.TypeOf(expected).Kind() != reflect.Map { + return Fail(t, "Arguments must be maps", msgAndArgs...) + } + + expectedMap := reflect.ValueOf(expected) + actualMap := reflect.ValueOf(actual) + + if expectedMap.Len() != actualMap.Len() { + return Fail(t, "Arguments must have the same number of keys", msgAndArgs...) + } + + for _, k := range expectedMap.MapKeys() { + ev := expectedMap.MapIndex(k) + av := actualMap.MapIndex(k) + + if !ev.IsValid() { + return Fail(t, fmt.Sprintf("missing key %q in expected map", k), msgAndArgs...) + } + + if !av.IsValid() { + return Fail(t, fmt.Sprintf("missing key %q in actual map", k), msgAndArgs...) + } + + if !InDelta( + t, + ev.Interface(), + av.Interface(), + delta, + msgAndArgs..., + ) { + return false + } + } + + return true +} + +func calcRelativeError(expected, actual interface{}) (float64, error) { + af, aok := toFloat(expected) + bf, bok := toFloat(actual) + if !aok || !bok { + return 0, fmt.Errorf("Parameters must be numerical") + } + if math.IsNaN(af) && math.IsNaN(bf) { + return 0, nil + } + if math.IsNaN(af) { + return 0, errors.New("expected value must not be NaN") + } + if af == 0 { + return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") + } + if math.IsNaN(bf) { + return 0, errors.New("actual value must not be NaN") + } + + return math.Abs(af-bf) / math.Abs(af), nil +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if math.IsNaN(epsilon) { + return Fail(t, "epsilon must not be NaN", msgAndArgs...) + } + actualEpsilon, err := calcRelativeError(expected, actual) + if err != nil { + return Fail(t, err.Error(), msgAndArgs...) + } + if actualEpsilon > epsilon { + return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ + " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + } + + return true +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if expected == nil || actual == nil { + return Fail(t, "Parameters must be slice", msgAndArgs...) + } + + expectedSlice := reflect.ValueOf(expected) + actualSlice := reflect.ValueOf(actual) + + if expectedSlice.Type().Kind() != reflect.Slice { + return Fail(t, "Expected value must be slice", msgAndArgs...) + } + + expectedLen := expectedSlice.Len() + if !IsType(t, expected, actual) || !Len(t, actual, expectedLen) { + return false + } + + for i := 0; i < expectedLen; i++ { + if !InEpsilon(t, expectedSlice.Index(i).Interface(), actualSlice.Index(i).Interface(), epsilon, "at index %d", i) { + return false + } + } + + return true +} + +/* + Errors +*/ + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { + if err != nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + } + + return true +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { + if err == nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Fail(t, "An error is expected but got nil.", msgAndArgs...) + } + + return true +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if !Error(t, theError, msgAndArgs...) { + return false + } + expected := errString + actual := theError.Error() + // don't need to use deep equals here, we know they are both strings + if expected != actual { + return Fail(t, fmt.Sprintf("Error message not equal:\n"+ + "expected: %q\n"+ + "actual : %q", expected, actual), msgAndArgs...) + } + return true +} + +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// assert.ErrorContains(t, err, expectedErrorSubString) +func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if !Error(t, theError, msgAndArgs...) { + return false + } + + actual := theError.Error() + if !strings.Contains(actual, contains) { + return Fail(t, fmt.Sprintf("Error %#v does not contain %#v", actual, contains), msgAndArgs...) + } + + return true +} + +// matchRegexp return true if a specified regexp matches a string. +func matchRegexp(rx interface{}, str interface{}) bool { + + var r *regexp.Regexp + if rr, ok := rx.(*regexp.Regexp); ok { + r = rr + } else { + r = regexp.MustCompile(fmt.Sprint(rx)) + } + + return (r.FindStringIndex(fmt.Sprint(str)) != nil) + +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + match := matchRegexp(rx, str) + + if !match { + Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) + } + + return match +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + match := matchRegexp(rx, str) + + if match { + Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) + } + + return !match + +} + +// Zero asserts that i is the zero value for its type. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// NotZero asserts that i is not the zero value for its type. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) + } + return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) + } + if info.IsDir() { + return Fail(t, fmt.Sprintf("%q is a directory", path), msgAndArgs...) + } + return true +} + +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + return true + } + if info.IsDir() { + return true + } + return Fail(t, fmt.Sprintf("file %q exists", path), msgAndArgs...) +} + +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) + } + return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) + } + if !info.IsDir() { + return Fail(t, fmt.Sprintf("%q is a file", path), msgAndArgs...) + } + return true +} + +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return true + } + return true + } + if !info.IsDir() { + return true + } + return Fail(t, fmt.Sprintf("directory %q exists", path), msgAndArgs...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + var expectedJSONAsInterface, actualJSONAsInterface interface{} + + if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid json.\nJSON parsing error: '%s'", expected, err.Error()), msgAndArgs...) + } + + if err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid json.\nJSON parsing error: '%s'", actual, err.Error()), msgAndArgs...) + } + + return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice, array or string. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array && ek != reflect.String { + return "" + } + + var e, a string + + switch et { + case reflect.TypeOf(""): + e = reflect.ValueOf(expected).String() + a = reflect.ValueOf(actual).String() + case reflect.TypeOf(time.Time{}): + e = spewConfigStringerEnabled.Sdump(expected) + a = spewConfigStringerEnabled.Sdump(actual) + default: + e = spewConfig.Sdump(expected) + a = spewConfig.Sdump(actual) + } + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return "\n\nDiff:\n" + diff +} + +func isFunction(arg interface{}) bool { + if arg == nil { + return false + } + return reflect.TypeOf(arg).Kind() == reflect.Func +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, + DisableMethods: true, + MaxDepth: 10, +} + +var spewConfigStringerEnabled = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, + MaxDepth: 10, +} + +type tHelper = interface { + Helper() +} + +// Eventually asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) +func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + ch := make(chan bool, 1) + + timer := time.NewTimer(waitFor) + defer timer.Stop() + + ticker := time.NewTicker(tick) + defer ticker.Stop() + + for tick := ticker.C; ; { + select { + case <-timer.C: + return Fail(t, "Condition never satisfied", msgAndArgs...) + case <-tick: + tick = nil + go func() { ch <- condition() }() + case v := <-ch: + if v { + return true + } + tick = ticker.C + } + } +} + +// CollectT implements the TestingT interface and collects all errors. +type CollectT struct { + errors []error +} + +// Errorf collects the error. +func (c *CollectT) Errorf(format string, args ...interface{}) { + c.errors = append(c.errors, fmt.Errorf(format, args...)) +} + +// FailNow panics. +func (*CollectT) FailNow() { + panic("Assertion failed") +} + +// Deprecated: That was a method for internal usage that should not have been published. Now just panics. +func (*CollectT) Reset() { + panic("Reset() is deprecated") +} + +// Deprecated: That was a method for internal usage that should not have been published. Now just panics. +func (*CollectT) Copy(TestingT) { + panic("Copy() is deprecated") +} + +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithT(t, func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + var lastFinishedTickErrs []error + ch := make(chan []error, 1) + + timer := time.NewTimer(waitFor) + defer timer.Stop() + + ticker := time.NewTicker(tick) + defer ticker.Stop() + + for tick := ticker.C; ; { + select { + case <-timer.C: + for _, err := range lastFinishedTickErrs { + t.Errorf("%v", err) + } + return Fail(t, "Condition never satisfied", msgAndArgs...) + case <-tick: + tick = nil + go func() { + collect := new(CollectT) + defer func() { + ch <- collect.errors + }() + condition(collect) + }() + case errs := <-ch: + if len(errs) == 0 { + return true + } + // Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached. + lastFinishedTickErrs = errs + tick = ticker.C + } + } +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + ch := make(chan bool, 1) + + timer := time.NewTimer(waitFor) + defer timer.Stop() + + ticker := time.NewTicker(tick) + defer ticker.Stop() + + for tick := ticker.C; ; { + select { + case <-timer.C: + return true + case <-tick: + tick = nil + go func() { ch <- condition() }() + case v := <-ch: + if v { + return Fail(t, "Condition satisfied", msgAndArgs...) + } + tick = ticker.C + } + } +} + +// ErrorIs asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if errors.Is(err, target) { + return true + } + + var expectedText string + if target != nil { + expectedText = target.Error() + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Target error should be in err chain:\n"+ + "expected: %q\n"+ + "in chain: %s", expectedText, chain, + ), msgAndArgs...) +} + +// NotErrorIs asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if !errors.Is(err, target) { + return true + } + + var expectedText string + if target != nil { + expectedText = target.Error() + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+ + "found: %q\n"+ + "in chain: %s", expectedText, chain, + ), msgAndArgs...) +} + +// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if errors.As(err, target) { + return true + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Should be in error chain:\n"+ + "expected: %q\n"+ + "in chain: %s", target, chain, + ), msgAndArgs...) +} + +func buildErrorChainString(err error) string { + if err == nil { + return "" + } + + e := errors.Unwrap(err) + chain := fmt.Sprintf("%q", err.Error()) + for e != nil { + chain += fmt.Sprintf("\n\t%q", e.Error()) + e = errors.Unwrap(e) + } + return chain +} diff --git a/internal/testify/assert/assertions_test.go b/internal/testify/assert/assertions_test.go new file mode 100644 index 000000000..fa004a0a3 --- /dev/null +++ b/internal/testify/assert/assertions_test.go @@ -0,0 +1,3155 @@ +package assert + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "os" + "path/filepath" + "reflect" + "regexp" + "runtime" + "strings" + "testing" + "time" +) + +var ( + i interface{} + zeros = []interface{}{ + false, + byte(0), + complex64(0), + complex128(0), + float32(0), + float64(0), + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + rune(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + uintptr(0), + "", + [0]interface{}{}, + []interface{}(nil), + struct{ x int }{}, + (*interface{})(nil), + (func())(nil), + nil, + interface{}(nil), + map[interface{}]interface{}(nil), + (chan interface{})(nil), + (<-chan interface{})(nil), + (chan<- interface{})(nil), + } + nonZeros = []interface{}{ + true, + byte(1), + complex64(1), + complex128(1), + float32(1), + float64(1), + int(1), + int8(1), + int16(1), + int32(1), + int64(1), + rune(1), + uint(1), + uint8(1), + uint16(1), + uint32(1), + uint64(1), + uintptr(1), + "s", + [1]interface{}{1}, + []interface{}{}, + struct{ x int }{1}, + (&i), + (func() {}), + interface{}(1), + map[interface{}]interface{}{}, + (make(chan interface{})), + (<-chan interface{})(make(chan interface{})), + (chan<- interface{})(make(chan interface{})), + } +) + +// AssertionTesterInterface defines an interface to be used for testing assertion methods +type AssertionTesterInterface interface { + TestMethod() +} + +// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface +type AssertionTesterConformingObject struct { +} + +func (a *AssertionTesterConformingObject) TestMethod() { +} + +// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface +type AssertionTesterNonConformingObject struct { +} + +func TestObjectsAreEqual(t *testing.T) { + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + // cases that are expected to be equal + {"Hello World", "Hello World", true}, + {123, 123, true}, + {123.5, 123.5, true}, + {[]byte("Hello World"), []byte("Hello World"), true}, + {nil, nil, true}, + + // cases that are expected not to be equal + {map[int]int{5: 10}, map[int]int{10: 20}, false}, + {'x', "x", false}, + {"x", 'x', false}, + {0, 0.1, false}, + {0.1, 0, false}, + {time.Now, time.Now, false}, + {func() {}, func() {}, false}, + {uint32(10), int32(10), false}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("ObjectsAreEqual(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := ObjectsAreEqual(c.expected, c.actual) + + if res != c.result { + t.Errorf("ObjectsAreEqual(%#v, %#v) should return %#v", c.expected, c.actual, c.result) + } + + }) + } +} + +func TestObjectsAreEqualValues(t *testing.T) { + now := time.Now() + + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + {uint32(10), int32(10), true}, + {0, nil, false}, + {nil, 0, false}, + {now, now.In(time.Local), false}, // should not be time zone independent + {int(270), int8(14), false}, // should handle overflow/underflow + {int8(14), int(270), false}, + {[]int{270, 270}, []int8{14, 14}, false}, + {complex128(1e+100 + 1e+100i), complex64(complex(math.Inf(0), math.Inf(0))), false}, + {complex64(complex(math.Inf(0), math.Inf(0))), complex128(1e+100 + 1e+100i), false}, + {complex128(1e+100 + 1e+100i), 270, false}, + {270, complex128(1e+100 + 1e+100i), false}, + {complex128(1e+100 + 1e+100i), 3.14, false}, + {3.14, complex128(1e+100 + 1e+100i), false}, + {complex128(1e+10 + 1e+10i), complex64(1e+10 + 1e+10i), true}, + {complex64(1e+10 + 1e+10i), complex128(1e+10 + 1e+10i), true}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("ObjectsAreEqualValues(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := ObjectsAreEqualValues(c.expected, c.actual) + + if res != c.result { + t.Errorf("ObjectsAreEqualValues(%#v, %#v) should return %#v", c.expected, c.actual, c.result) + } + }) + } +} + +type Nested struct { + Exported interface{} + notExported interface{} +} + +type S struct { + Exported1 interface{} + Exported2 Nested + notExported1 interface{} + notExported2 Nested +} + +type S2 struct { + foo interface{} +} + +type S3 struct { + Exported1 *Nested + Exported2 *Nested +} + +type S4 struct { + Exported1 []*Nested +} + +type S5 struct { + Exported Nested +} + +type S6 struct { + Exported string + unexported string +} + +func TestObjectsExportedFieldsAreEqual(t *testing.T) { + + intValue := 1 + + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, 4, Nested{5, 6}}, true}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, "a", Nested{5, 6}}, true}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, 4, Nested{5, "a"}}, true}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, 3}, 4, Nested{"a", "a"}}, true}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{2, "a"}, 4, Nested{5, 6}}, true}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{"a", Nested{2, 3}, 4, Nested{5, 6}}, false}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S{1, Nested{"a", 3}, 4, Nested{5, 6}}, false}, + {S{1, Nested{2, 3}, 4, Nested{5, 6}}, S2{1}, false}, + {1, S{1, Nested{2, 3}, 4, Nested{5, 6}}, false}, + + {S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{1, 2}, &Nested{3, 4}}, true}, + {S3{nil, &Nested{3, 4}}, S3{nil, &Nested{3, 4}}, true}, + {S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{1, 2}, &Nested{3, "b"}}, true}, + {S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{1, "a"}, &Nested{3, "b"}}, true}, + {S3{&Nested{1, 2}, &Nested{3, 4}}, S3{&Nested{"a", 2}, &Nested{3, 4}}, false}, + {S3{&Nested{1, 2}, &Nested{3, 4}}, S3{}, false}, + {S3{}, S3{}, true}, + + {S4{[]*Nested{{1, 2}}}, S4{[]*Nested{{1, 2}}}, true}, + {S4{[]*Nested{{1, 2}}}, S4{[]*Nested{{1, 3}}}, true}, + {S4{[]*Nested{{1, 2}, {3, 4}}}, S4{[]*Nested{{1, "a"}, {3, "b"}}}, true}, + {S4{[]*Nested{{1, 2}, {3, 4}}}, S4{[]*Nested{{1, "a"}, {2, "b"}}}, false}, + + {Nested{&intValue, 2}, Nested{&intValue, 2}, true}, + {Nested{&Nested{1, 2}, 3}, Nested{&Nested{1, "b"}, 3}, true}, + {Nested{&Nested{1, 2}, 3}, Nested{nil, 3}, false}, + + { + Nested{map[interface{}]*Nested{nil: nil}, 2}, + Nested{map[interface{}]*Nested{nil: nil}, 2}, + true, + }, + { + Nested{map[interface{}]*Nested{"a": nil}, 2}, + Nested{map[interface{}]*Nested{"a": nil}, 2}, + true, + }, + { + Nested{map[interface{}]*Nested{"a": nil}, 2}, + Nested{map[interface{}]*Nested{"a": {1, 2}}, 2}, + false, + }, + { + Nested{map[interface{}]Nested{"a": {1, 2}, "b": {3, 4}}, 2}, + Nested{map[interface{}]Nested{"a": {1, 5}, "b": {3, 7}}, 2}, + true, + }, + { + Nested{map[interface{}]Nested{"a": {1, 2}, "b": {3, 4}}, 2}, + Nested{map[interface{}]Nested{"a": {2, 2}, "b": {3, 4}}, 2}, + false, + }, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("ObjectsExportedFieldsAreEqual(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := ObjectsExportedFieldsAreEqual(c.expected, c.actual) + + if res != c.result { + t.Errorf("ObjectsExportedFieldsAreEqual(%#v, %#v) should return %#v", c.expected, c.actual, c.result) + } + + }) + } +} + +func TestCopyExportedFields(t *testing.T) { + intValue := 1 + + cases := []struct { + input interface{} + expected interface{} + }{ + { + input: Nested{"a", "b"}, + expected: Nested{"a", nil}, + }, + { + input: Nested{&intValue, 2}, + expected: Nested{&intValue, nil}, + }, + { + input: Nested{nil, 3}, + expected: Nested{nil, nil}, + }, + { + input: S{1, Nested{2, 3}, 4, Nested{5, 6}}, + expected: S{1, Nested{2, nil}, nil, Nested{}}, + }, + { + input: S3{}, + expected: S3{}, + }, + { + input: S3{&Nested{1, 2}, &Nested{3, 4}}, + expected: S3{&Nested{1, nil}, &Nested{3, nil}}, + }, + { + input: S3{Exported1: &Nested{"a", "b"}}, + expected: S3{Exported1: &Nested{"a", nil}}, + }, + { + input: S4{[]*Nested{ + nil, + {1, 2}, + }}, + expected: S4{[]*Nested{ + nil, + {1, nil}, + }}, + }, + { + input: S4{[]*Nested{ + {1, 2}}, + }, + expected: S4{[]*Nested{ + {1, nil}}, + }, + }, + { + input: S4{[]*Nested{ + {1, 2}, + {3, 4}, + }}, + expected: S4{[]*Nested{ + {1, nil}, + {3, nil}, + }}, + }, + { + input: S5{Exported: Nested{"a", "b"}}, + expected: S5{Exported: Nested{"a", nil}}, + }, + { + input: S6{"a", "b"}, + expected: S6{"a", ""}, + }, + } + + for _, c := range cases { + t.Run("", func(t *testing.T) { + output := copyExportedFields(c.input) + if !ObjectsAreEqualValues(c.expected, output) { + t.Errorf("%#v, %#v should be equal", c.expected, output) + } + }) + } +} + +func TestEqualExportedValues(t *testing.T) { + cases := []struct { + value1 interface{} + value2 interface{} + expectedEqual bool + expectedFail string + }{ + { + value1: S{1, Nested{2, 3}, 4, Nested{5, 6}}, + value2: S{1, Nested{2, nil}, nil, Nested{}}, + expectedEqual: true, + }, + { + value1: S{1, Nested{2, 3}, 4, Nested{5, 6}}, + value2: S{1, Nested{1, nil}, nil, Nested{}}, + expectedEqual: false, + expectedFail: ` + Diff: + --- Expected + +++ Actual + @@ -3,3 +3,3 @@ + Exported2: (assert.Nested) { + - Exported: (int) 2, + + Exported: (int) 1, + notExported: (interface {}) `, + }, + { + value1: S3{&Nested{1, 2}, &Nested{3, 4}}, + value2: S3{&Nested{"a", 2}, &Nested{3, 4}}, + expectedEqual: false, + expectedFail: ` + Diff: + --- Expected + +++ Actual + @@ -2,3 +2,3 @@ + Exported1: (*assert.Nested)({ + - Exported: (int) 1, + + Exported: (string) (len=1) "a", + notExported: (interface {}) `, + }, + { + value1: S4{[]*Nested{ + {1, 2}, + {3, 4}, + }}, + value2: S4{[]*Nested{ + {1, "a"}, + {2, "b"}, + }}, + expectedEqual: false, + expectedFail: ` + Diff: + --- Expected + +++ Actual + @@ -7,3 +7,3 @@ + (*assert.Nested)({ + - Exported: (int) 3, + + Exported: (int) 2, + notExported: (interface {}) `, + }, + { + value1: S{[2]int{1, 2}, Nested{2, 3}, 4, Nested{5, 6}}, + value2: S{[2]int{1, 2}, Nested{2, nil}, nil, Nested{}}, + expectedEqual: true, + }, + { + value1: &S{1, Nested{2, 3}, 4, Nested{5, 6}}, + value2: &S{1, Nested{2, nil}, nil, Nested{}}, + expectedEqual: true, + }, + { + value1: &S{1, Nested{2, 3}, 4, Nested{5, 6}}, + value2: &S{1, Nested{1, nil}, nil, Nested{}}, + expectedEqual: false, + expectedFail: ` + Diff: + --- Expected + +++ Actual + @@ -3,3 +3,3 @@ + Exported2: (assert.Nested) { + - Exported: (int) 2, + + Exported: (int) 1, + notExported: (interface {}) `, + }, + } + + for _, c := range cases { + t.Run("", func(t *testing.T) { + mockT := new(mockTestingT) + + actual := EqualExportedValues(mockT, c.value1, c.value2) + if actual != c.expectedEqual { + t.Errorf("Expected EqualExportedValues to be %t, but was %t", c.expectedEqual, actual) + } + + actualFail := mockT.errorString() + if !strings.Contains(actualFail, c.expectedFail) { + t.Errorf("Contains failure should include %q but was %q", c.expectedFail, actualFail) + } + }) + } + +} + +func TestImplements(t *testing.T) { + + mockT := new(testing.T) + + if !Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { + t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface") + } + if Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { + t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface") + } + if Implements(mockT, (*AssertionTesterInterface)(nil), nil) { + t.Error("Implements method should return false: nil does not implement AssertionTesterInterface") + } + +} + +func TestNotImplements(t *testing.T) { + + mockT := new(testing.T) + + if !NotImplements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { + t.Error("NotImplements method should return true: AssertionTesterNonConformingObject does not implement AssertionTesterInterface") + } + if NotImplements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { + t.Error("NotImplements method should return false: AssertionTesterConformingObject implements AssertionTesterInterface") + } + if NotImplements(mockT, (*AssertionTesterInterface)(nil), nil) { + t.Error("NotImplements method should return false: nil can't be checked to be implementing AssertionTesterInterface or not") + } + +} + +func TestIsType(t *testing.T) { + + mockT := new(testing.T) + + if !IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { + t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject") + } + if IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) { + t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject") + } + +} + +func TestEqual(t *testing.T) { + type myType string + + mockT := new(testing.T) + var m map[string]interface{} + + cases := []struct { + expected interface{} + actual interface{} + result bool + remark string + }{ + {"Hello World", "Hello World", true, ""}, + {123, 123, true, ""}, + {123.5, 123.5, true, ""}, + {[]byte("Hello World"), []byte("Hello World"), true, ""}, + {nil, nil, true, ""}, + {int32(123), int32(123), true, ""}, + {uint64(123), uint64(123), true, ""}, + {myType("1"), myType("1"), true, ""}, + {&struct{}{}, &struct{}{}, true, "pointer equality is based on equality of underlying value"}, + + // Not expected to be equal + {m["bar"], "something", false, ""}, + {myType("1"), myType("2"), false, ""}, + + // A case that might be confusing, especially with numeric literals + {10, uint(10), false, ""}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("Equal(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := Equal(mockT, c.expected, c.actual) + + if res != c.result { + t.Errorf("Equal(%#v, %#v) should return %#v: %s", c.expected, c.actual, c.result, c.remark) + } + }) + } +} + +func ptr(i int) *int { + return &i +} + +func TestSame(t *testing.T) { + + mockT := new(testing.T) + + if Same(mockT, ptr(1), ptr(1)) { + t.Error("Same should return false") + } + if Same(mockT, 1, 1) { + t.Error("Same should return false") + } + p := ptr(2) + if Same(mockT, p, *p) { + t.Error("Same should return false") + } + if !Same(mockT, p, p) { + t.Error("Same should return true") + } +} + +func TestNotSame(t *testing.T) { + + mockT := new(testing.T) + + if !NotSame(mockT, ptr(1), ptr(1)) { + t.Error("NotSame should return true; different pointers") + } + if !NotSame(mockT, 1, 1) { + t.Error("NotSame should return true; constant inputs") + } + p := ptr(2) + if !NotSame(mockT, p, *p) { + t.Error("NotSame should return true; mixed-type inputs") + } + if NotSame(mockT, p, p) { + t.Error("NotSame should return false") + } +} + +func Test_samePointers(t *testing.T) { + p := ptr(2) + + type args struct { + first interface{} + second interface{} + } + tests := []struct { + name string + args args + assertion BoolAssertionFunc + }{ + { + name: "1 != 2", + args: args{first: 1, second: 2}, + assertion: False, + }, + { + name: "1 != 1 (not same ptr)", + args: args{first: 1, second: 1}, + assertion: False, + }, + { + name: "ptr(1) == ptr(1)", + args: args{first: p, second: p}, + assertion: True, + }, + { + name: "int(1) != float32(1)", + args: args{first: int(1), second: float32(1)}, + assertion: False, + }, + { + name: "array != slice", + args: args{first: [2]int{1, 2}, second: []int{1, 2}}, + assertion: False, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, samePointers(tt.args.first, tt.args.second)) + }) + } +} + +// bufferT implements TestingT. Its implementation of Errorf writes the output that would be produced by +// testing.T.Errorf to an internal bytes.Buffer. +type bufferT struct { + buf bytes.Buffer +} + +func (t *bufferT) Errorf(format string, args ...interface{}) { + // implementation of decorate is copied from testing.T + decorate := func(s string) string { + _, file, line, ok := runtime.Caller(3) // decorate + log + public function. + if ok { + // Truncate file name at last file name separator. + if index := strings.LastIndex(file, "/"); index >= 0 { + file = file[index+1:] + } else if index = strings.LastIndex(file, "\\"); index >= 0 { + file = file[index+1:] + } + } else { + file = "???" + line = 1 + } + buf := new(bytes.Buffer) + // Every line is indented at least one tab. + buf.WriteByte('\t') + fmt.Fprintf(buf, "%s:%d: ", file, line) + lines := strings.Split(s, "\n") + if l := len(lines); l > 1 && lines[l-1] == "" { + lines = lines[:l-1] + } + for i, line := range lines { + if i > 0 { + // Second and subsequent lines are indented an extra tab. + buf.WriteString("\n\t\t") + } + buf.WriteString(line) + } + buf.WriteByte('\n') + return buf.String() + } + t.buf.WriteString(decorate(fmt.Sprintf(format, args...))) +} + +func TestStringEqual(t *testing.T) { + for i, currCase := range []struct { + equalWant string + equalGot string + msgAndArgs []interface{} + want string + }{ + {equalWant: "hi, \nmy name is", equalGot: "what,\nmy name is", want: "\tassertions.go:\\d+: \n\t+Error Trace:\t\n\t+Error:\\s+Not equal:\\s+\n\\s+expected: \"hi, \\\\nmy name is\"\n\\s+actual\\s+: \"what,\\\\nmy name is\"\n\\s+Diff:\n\\s+-+ Expected\n\\s+\\++ Actual\n\\s+@@ -1,2 \\+1,2 @@\n\\s+-hi, \n\\s+\\+what,\n\\s+my name is"}, + } { + mockT := &bufferT{} + Equal(mockT, currCase.equalWant, currCase.equalGot, currCase.msgAndArgs...) + Regexp(t, regexp.MustCompile(currCase.want), mockT.buf.String(), "Case %d", i) + } +} + +func TestEqualFormatting(t *testing.T) { + for i, currCase := range []struct { + equalWant string + equalGot string + msgAndArgs []interface{} + want string + }{ + {equalWant: "want", equalGot: "got", want: "\tassertions.go:\\d+: \n\t+Error Trace:\t\n\t+Error:\\s+Not equal:\\s+\n\\s+expected: \"want\"\n\\s+actual\\s+: \"got\"\n\\s+Diff:\n\\s+-+ Expected\n\\s+\\++ Actual\n\\s+@@ -1 \\+1 @@\n\\s+-want\n\\s+\\+got\n"}, + {equalWant: "want", equalGot: "got", msgAndArgs: []interface{}{"hello, %v!", "world"}, want: "\tassertions.go:[0-9]+: \n\t+Error Trace:\t\n\t+Error:\\s+Not equal:\\s+\n\\s+expected: \"want\"\n\\s+actual\\s+: \"got\"\n\\s+Diff:\n\\s+-+ Expected\n\\s+\\++ Actual\n\\s+@@ -1 \\+1 @@\n\\s+-want\n\\s+\\+got\n\\s+Messages:\\s+hello, world!\n"}, + {equalWant: "want", equalGot: "got", msgAndArgs: []interface{}{123}, want: "\tassertions.go:[0-9]+: \n\t+Error Trace:\t\n\t+Error:\\s+Not equal:\\s+\n\\s+expected: \"want\"\n\\s+actual\\s+: \"got\"\n\\s+Diff:\n\\s+-+ Expected\n\\s+\\++ Actual\n\\s+@@ -1 \\+1 @@\n\\s+-want\n\\s+\\+got\n\\s+Messages:\\s+123\n"}, + {equalWant: "want", equalGot: "got", msgAndArgs: []interface{}{struct{ a string }{"hello"}}, want: "\tassertions.go:[0-9]+: \n\t+Error Trace:\t\n\t+Error:\\s+Not equal:\\s+\n\\s+expected: \"want\"\n\\s+actual\\s+: \"got\"\n\\s+Diff:\n\\s+-+ Expected\n\\s+\\++ Actual\n\\s+@@ -1 \\+1 @@\n\\s+-want\n\\s+\\+got\n\\s+Messages:\\s+{a:hello}\n"}, + } { + mockT := &bufferT{} + Equal(mockT, currCase.equalWant, currCase.equalGot, currCase.msgAndArgs...) + Regexp(t, regexp.MustCompile(currCase.want), mockT.buf.String(), "Case %d", i) + } +} + +func TestFormatUnequalValues(t *testing.T) { + expected, actual := formatUnequalValues("foo", "bar") + Equal(t, `"foo"`, expected, "value should not include type") + Equal(t, `"bar"`, actual, "value should not include type") + + expected, actual = formatUnequalValues(123, 123) + Equal(t, `123`, expected, "value should not include type") + Equal(t, `123`, actual, "value should not include type") + + expected, actual = formatUnequalValues(int64(123), int32(123)) + Equal(t, `int64(123)`, expected, "value should include type") + Equal(t, `int32(123)`, actual, "value should include type") + + expected, actual = formatUnequalValues(int64(123), nil) + Equal(t, `int64(123)`, expected, "value should include type") + Equal(t, `()`, actual, "value should include type") + + type testStructType struct { + Val string + } + + expected, actual = formatUnequalValues(&testStructType{Val: "test"}, &testStructType{Val: "test"}) + Equal(t, `&assert.testStructType{Val:"test"}`, expected, "value should not include type annotation") + Equal(t, `&assert.testStructType{Val:"test"}`, actual, "value should not include type annotation") +} + +func TestNotNil(t *testing.T) { + + mockT := new(testing.T) + + if !NotNil(mockT, new(AssertionTesterConformingObject)) { + t.Error("NotNil should return true: object is not nil") + } + if NotNil(mockT, nil) { + t.Error("NotNil should return false: object is nil") + } + if NotNil(mockT, (*struct{})(nil)) { + t.Error("NotNil should return false: object is (*struct{})(nil)") + } + +} + +func TestNil(t *testing.T) { + + mockT := new(testing.T) + + if !Nil(mockT, nil) { + t.Error("Nil should return true: object is nil") + } + if !Nil(mockT, (*struct{})(nil)) { + t.Error("Nil should return true: object is (*struct{})(nil)") + } + if Nil(mockT, new(AssertionTesterConformingObject)) { + t.Error("Nil should return false: object is not nil") + } + +} + +func TestTrue(t *testing.T) { + + mockT := new(testing.T) + + if !True(mockT, true) { + t.Error("True should return true") + } + if True(mockT, false) { + t.Error("True should return false") + } + +} + +func TestFalse(t *testing.T) { + + mockT := new(testing.T) + + if !False(mockT, false) { + t.Error("False should return true") + } + if False(mockT, true) { + t.Error("False should return false") + } + +} + +func TestExactly(t *testing.T) { + + mockT := new(testing.T) + + a := float32(1) + b := float64(1) + c := float32(1) + d := float32(2) + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + {a, b, false}, + {a, d, false}, + {a, c, true}, + {nil, a, false}, + {a, nil, false}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("Exactly(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := Exactly(mockT, c.expected, c.actual) + + if res != c.result { + t.Errorf("Exactly(%#v, %#v) should return %#v", c.expected, c.actual, c.result) + } + }) + } +} + +func TestNotEqual(t *testing.T) { + + mockT := new(testing.T) + + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + // cases that are expected not to match + {"Hello World", "Hello World!", true}, + {123, 1234, true}, + {123.5, 123.55, true}, + {[]byte("Hello World"), []byte("Hello World!"), true}, + {nil, new(AssertionTesterConformingObject), true}, + + // cases that are expected to match + {nil, nil, false}, + {"Hello World", "Hello World", false}, + {123, 123, false}, + {123.5, 123.5, false}, + {[]byte("Hello World"), []byte("Hello World"), false}, + {new(AssertionTesterConformingObject), new(AssertionTesterConformingObject), false}, + {&struct{}{}, &struct{}{}, false}, + {func() int { return 23 }, func() int { return 24 }, false}, + // A case that might be confusing, especially with numeric literals + {int(10), uint(10), true}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("NotEqual(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := NotEqual(mockT, c.expected, c.actual) + + if res != c.result { + t.Errorf("NotEqual(%#v, %#v) should return %#v", c.expected, c.actual, c.result) + } + }) + } +} + +func TestNotEqualValues(t *testing.T) { + mockT := new(testing.T) + + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + // cases that are expected not to match + {"Hello World", "Hello World!", true}, + {123, 1234, true}, + {123.5, 123.55, true}, + {[]byte("Hello World"), []byte("Hello World!"), true}, + {nil, new(AssertionTesterConformingObject), true}, + + // cases that are expected to match + {nil, nil, false}, + {"Hello World", "Hello World", false}, + {123, 123, false}, + {123.5, 123.5, false}, + {[]byte("Hello World"), []byte("Hello World"), false}, + {new(AssertionTesterConformingObject), new(AssertionTesterConformingObject), false}, + {&struct{}{}, &struct{}{}, false}, + + // Different behavior from NotEqual() + {func() int { return 23 }, func() int { return 24 }, true}, + {int(10), int(11), true}, + {int(10), uint(10), false}, + + {struct{}{}, struct{}{}, false}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("NotEqualValues(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := NotEqualValues(mockT, c.expected, c.actual) + + if res != c.result { + t.Errorf("NotEqualValues(%#v, %#v) should return %#v", c.expected, c.actual, c.result) + } + }) + } +} + +func TestContainsNotContains(t *testing.T) { + + type A struct { + Name, Value string + } + list := []string{"Foo", "Bar"} + + complexList := []*A{ + {"b", "c"}, + {"d", "e"}, + {"g", "h"}, + {"j", "k"}, + } + simpleMap := map[interface{}]interface{}{"Foo": "Bar"} + var zeroMap map[interface{}]interface{} + + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + {"Hello World", "Hello", true}, + {"Hello World", "Salut", false}, + {list, "Bar", true}, + {list, "Salut", false}, + {complexList, &A{"g", "h"}, true}, + {complexList, &A{"g", "e"}, false}, + {simpleMap, "Foo", true}, + {simpleMap, "Bar", false}, + {zeroMap, "Bar", false}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("Contains(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + mockT := new(testing.T) + res := Contains(mockT, c.expected, c.actual) + + if res != c.result { + if res { + t.Errorf("Contains(%#v, %#v) should return true:\n\t%#v contains %#v", c.expected, c.actual, c.expected, c.actual) + } else { + t.Errorf("Contains(%#v, %#v) should return false:\n\t%#v does not contain %#v", c.expected, c.actual, c.expected, c.actual) + } + } + }) + } + + for _, c := range cases { + t.Run(fmt.Sprintf("NotContains(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + mockT := new(testing.T) + res := NotContains(mockT, c.expected, c.actual) + + // NotContains should be inverse of Contains. If it's not, something is wrong + if res == Contains(mockT, c.expected, c.actual) { + if res { + t.Errorf("NotContains(%#v, %#v) should return true:\n\t%#v does not contains %#v", c.expected, c.actual, c.expected, c.actual) + } else { + t.Errorf("NotContains(%#v, %#v) should return false:\n\t%#v contains %#v", c.expected, c.actual, c.expected, c.actual) + } + } + }) + } +} + +func TestContainsNotContainsFailMessage(t *testing.T) { + mockT := new(mockTestingT) + + type nonContainer struct { + Value string + } + + cases := []struct { + assertion func(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool + container interface{} + instance interface{} + expected string + }{ + { + assertion: Contains, + container: "Hello World", + instance: errors.New("Hello"), + expected: "\"Hello World\" does not contain &errors.errorString{s:\"Hello\"}", + }, + { + assertion: Contains, + container: map[string]int{"one": 1}, + instance: "two", + expected: "map[string]int{\"one\":1} does not contain \"two\"\n", + }, + { + assertion: NotContains, + container: map[string]int{"one": 1}, + instance: "one", + expected: "map[string]int{\"one\":1} should not contain \"one\"", + }, + { + assertion: Contains, + container: nonContainer{Value: "Hello"}, + instance: "Hello", + expected: "assert.nonContainer{Value:\"Hello\"} could not be applied builtin len()\n", + }, + { + assertion: NotContains, + container: nonContainer{Value: "Hello"}, + instance: "Hello", + expected: "assert.nonContainer{Value:\"Hello\"} could not be applied builtin len()\n", + }, + } + for _, c := range cases { + name := filepath.Base(runtime.FuncForPC(reflect.ValueOf(c.assertion).Pointer()).Name()) + t.Run(fmt.Sprintf("%v(%T, %T)", name, c.container, c.instance), func(t *testing.T) { + c.assertion(mockT, c.container, c.instance) + actualFail := mockT.errorString() + if !strings.Contains(actualFail, c.expected) { + t.Errorf("Contains failure should include %q but was %q", c.expected, actualFail) + } + }) + } +} + +func TestContainsNotContainsOnNilValue(t *testing.T) { + mockT := new(mockTestingT) + + Contains(mockT, nil, "key") + expectedFail := " could not be applied builtin len()" + actualFail := mockT.errorString() + if !strings.Contains(actualFail, expectedFail) { + t.Errorf("Contains failure should include %q but was %q", expectedFail, actualFail) + } + + NotContains(mockT, nil, "key") + if !strings.Contains(actualFail, expectedFail) { + t.Errorf("Contains failure should include %q but was %q", expectedFail, actualFail) + } +} + +func TestSubsetNotSubset(t *testing.T) { + cases := []struct { + list interface{} + subset interface{} + result bool + message string + }{ + // cases that are expected to contain + {[]int{1, 2, 3}, nil, true, `nil is the empty set which is a subset of every set`}, + {[]int{1, 2, 3}, []int{}, true, `[] is a subset of ['\x01' '\x02' '\x03']`}, + {[]int{1, 2, 3}, []int{1, 2}, true, `['\x01' '\x02'] is a subset of ['\x01' '\x02' '\x03']`}, + {[]int{1, 2, 3}, []int{1, 2, 3}, true, `['\x01' '\x02' '\x03'] is a subset of ['\x01' '\x02' '\x03']`}, + {[]string{"hello", "world"}, []string{"hello"}, true, `["hello"] is a subset of ["hello" "world"]`}, + {map[string]string{ + "a": "x", + "c": "z", + "b": "y", + }, map[string]string{ + "a": "x", + "b": "y", + }, true, `map["a":"x" "b":"y"] is a subset of map["a":"x" "b":"y" "c":"z"]`}, + + // cases that are expected not to contain + {[]string{"hello", "world"}, []string{"hello", "testify"}, false, `[]string{"hello", "world"} does not contain "testify"`}, + {[]int{1, 2, 3}, []int{4, 5}, false, `[]int{1, 2, 3} does not contain 4`}, + {[]int{1, 2, 3}, []int{1, 5}, false, `[]int{1, 2, 3} does not contain 5`}, + {map[string]string{ + "a": "x", + "c": "z", + "b": "y", + }, map[string]string{ + "a": "x", + "b": "z", + }, false, `map[string]string{"a":"x", "b":"y", "c":"z"} does not contain map[string]string{"a":"x", "b":"z"}`}, + {map[string]string{ + "a": "x", + "b": "y", + }, map[string]string{ + "a": "x", + "b": "y", + "c": "z", + }, false, `map[string]string{"a":"x", "b":"y"} does not contain map[string]string{"a":"x", "b":"y", "c":"z"}`}, + } + + for _, c := range cases { + t.Run("SubSet: "+c.message, func(t *testing.T) { + + mockT := new(mockTestingT) + res := Subset(mockT, c.list, c.subset) + + if res != c.result { + t.Errorf("Subset should return %t: %s", c.result, c.message) + } + if !c.result { + expectedFail := c.message + actualFail := mockT.errorString() + if !strings.Contains(actualFail, expectedFail) { + t.Log(actualFail) + t.Errorf("Subset failure should contain %q but was %q", expectedFail, actualFail) + } + } + }) + } + for _, c := range cases { + t.Run("NotSubSet: "+c.message, func(t *testing.T) { + mockT := new(mockTestingT) + res := NotSubset(mockT, c.list, c.subset) + + // NotSubset should match the inverse of Subset. If it doesn't, something is wrong + if res == Subset(mockT, c.list, c.subset) { + t.Errorf("NotSubset should return %t: %s", !c.result, c.message) + } + if c.result { + expectedFail := c.message + actualFail := mockT.errorString() + if !strings.Contains(actualFail, expectedFail) { + t.Log(actualFail) + t.Errorf("NotSubset failure should contain %q but was %q", expectedFail, actualFail) + } + } + }) + } +} + +func TestNotSubsetNil(t *testing.T) { + mockT := new(testing.T) + NotSubset(mockT, []string{"foo"}, nil) + if !mockT.Failed() { + t.Error("NotSubset on nil set should have failed the test") + } +} + +func Test_containsElement(t *testing.T) { + + list1 := []string{"Foo", "Bar"} + list2 := []int{1, 2} + simpleMap := map[interface{}]interface{}{"Foo": "Bar"} + + ok, found := containsElement("Hello World", "World") + True(t, ok) + True(t, found) + + ok, found = containsElement(list1, "Foo") + True(t, ok) + True(t, found) + + ok, found = containsElement(list1, "Bar") + True(t, ok) + True(t, found) + + ok, found = containsElement(list2, 1) + True(t, ok) + True(t, found) + + ok, found = containsElement(list2, 2) + True(t, ok) + True(t, found) + + ok, found = containsElement(list1, "Foo!") + True(t, ok) + False(t, found) + + ok, found = containsElement(list2, 3) + True(t, ok) + False(t, found) + + ok, found = containsElement(list2, "1") + True(t, ok) + False(t, found) + + ok, found = containsElement(simpleMap, "Foo") + True(t, ok) + True(t, found) + + ok, found = containsElement(simpleMap, "Bar") + True(t, ok) + False(t, found) + + ok, found = containsElement(1433, "1") + False(t, ok) + False(t, found) +} + +func TestElementsMatch(t *testing.T) { + mockT := new(testing.T) + + cases := []struct { + expected interface{} + actual interface{} + result bool + }{ + // matching + {nil, nil, true}, + + {nil, nil, true}, + {[]int{}, []int{}, true}, + {[]int{1}, []int{1}, true}, + {[]int{1, 1}, []int{1, 1}, true}, + {[]int{1, 2}, []int{1, 2}, true}, + {[]int{1, 2}, []int{2, 1}, true}, + {[2]int{1, 2}, [2]int{2, 1}, true}, + {[]string{"hello", "world"}, []string{"world", "hello"}, true}, + {[]string{"hello", "hello"}, []string{"hello", "hello"}, true}, + {[]string{"hello", "hello", "world"}, []string{"hello", "world", "hello"}, true}, + {[3]string{"hello", "hello", "world"}, [3]string{"hello", "world", "hello"}, true}, + {[]int{}, nil, true}, + + // not matching + {[]int{1}, []int{1, 1}, false}, + {[]int{1, 2}, []int{2, 2}, false}, + {[]string{"hello", "hello"}, []string{"hello"}, false}, + } + + for _, c := range cases { + t.Run(fmt.Sprintf("ElementsMatch(%#v, %#v)", c.expected, c.actual), func(t *testing.T) { + res := ElementsMatch(mockT, c.actual, c.expected) + + if res != c.result { + t.Errorf("ElementsMatch(%#v, %#v) should return %v", c.actual, c.expected, c.result) + } + }) + } +} + +func TestDiffLists(t *testing.T) { + tests := []struct { + name string + listA interface{} + listB interface{} + extraA []interface{} + extraB []interface{} + }{ + { + name: "equal empty", + listA: []string{}, + listB: []string{}, + extraA: nil, + extraB: nil, + }, + { + name: "equal same order", + listA: []string{"hello", "world"}, + listB: []string{"hello", "world"}, + extraA: nil, + extraB: nil, + }, + { + name: "equal different order", + listA: []string{"hello", "world"}, + listB: []string{"world", "hello"}, + extraA: nil, + extraB: nil, + }, + { + name: "extra A", + listA: []string{"hello", "hello", "world"}, + listB: []string{"hello", "world"}, + extraA: []interface{}{"hello"}, + extraB: nil, + }, + { + name: "extra A twice", + listA: []string{"hello", "hello", "hello", "world"}, + listB: []string{"hello", "world"}, + extraA: []interface{}{"hello", "hello"}, + extraB: nil, + }, + { + name: "extra B", + listA: []string{"hello", "world"}, + listB: []string{"hello", "hello", "world"}, + extraA: nil, + extraB: []interface{}{"hello"}, + }, + { + name: "extra B twice", + listA: []string{"hello", "world"}, + listB: []string{"hello", "hello", "world", "hello"}, + extraA: nil, + extraB: []interface{}{"hello", "hello"}, + }, + { + name: "integers 1", + listA: []int{1, 2, 3, 4, 5}, + listB: []int{5, 4, 3, 2, 1}, + extraA: nil, + extraB: nil, + }, + { + name: "integers 2", + listA: []int{1, 2, 1, 2, 1}, + listB: []int{2, 1, 2, 1, 2}, + extraA: []interface{}{1}, + extraB: []interface{}{2}, + }, + } + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + actualExtraA, actualExtraB := diffLists(test.listA, test.listB) + Equal(t, test.extraA, actualExtraA, "extra A does not match for listA=%v listB=%v", + test.listA, test.listB) + Equal(t, test.extraB, actualExtraB, "extra B does not match for listA=%v listB=%v", + test.listA, test.listB) + }) + } +} + +func TestCondition(t *testing.T) { + mockT := new(testing.T) + + if !Condition(mockT, func() bool { return true }, "Truth") { + t.Error("Condition should return true") + } + + if Condition(mockT, func() bool { return false }, "Lie") { + t.Error("Condition should return false") + } + +} + +func TestDidPanic(t *testing.T) { + + const panicMsg = "Panic!" + + if funcDidPanic, msg, _ := didPanic(func() { + panic(panicMsg) + }); !funcDidPanic || msg != panicMsg { + t.Error("didPanic should return true, panicMsg") + } + + if funcDidPanic, msg, _ := didPanic(func() { + panic(nil) + }); !funcDidPanic || msg != nil { + t.Error("didPanic should return true, nil") + } + + if funcDidPanic, _, _ := didPanic(func() { + }); funcDidPanic { + t.Error("didPanic should return false") + } + +} + +func TestPanics(t *testing.T) { + + mockT := new(testing.T) + + if !Panics(mockT, func() { + panic("Panic!") + }) { + t.Error("Panics should return true") + } + + if Panics(mockT, func() { + }) { + t.Error("Panics should return false") + } + +} + +func TestPanicsWithValue(t *testing.T) { + + mockT := new(testing.T) + + if !PanicsWithValue(mockT, "Panic!", func() { + panic("Panic!") + }) { + t.Error("PanicsWithValue should return true") + } + + if !PanicsWithValue(mockT, nil, func() { + panic(nil) + }) { + t.Error("PanicsWithValue should return true") + } + + if PanicsWithValue(mockT, "Panic!", func() { + }) { + t.Error("PanicsWithValue should return false") + } + + if PanicsWithValue(mockT, "at the disco", func() { + panic("Panic!") + }) { + t.Error("PanicsWithValue should return false") + } +} + +func TestPanicsWithError(t *testing.T) { + + mockT := new(testing.T) + + if !PanicsWithError(mockT, "panic", func() { + panic(errors.New("panic")) + }) { + t.Error("PanicsWithError should return true") + } + + if PanicsWithError(mockT, "Panic!", func() { + }) { + t.Error("PanicsWithError should return false") + } + + if PanicsWithError(mockT, "at the disco", func() { + panic(errors.New("panic")) + }) { + t.Error("PanicsWithError should return false") + } + + if PanicsWithError(mockT, "Panic!", func() { + panic("panic") + }) { + t.Error("PanicsWithError should return false") + } +} + +func TestNotPanics(t *testing.T) { + + mockT := new(testing.T) + + if !NotPanics(mockT, func() { + }) { + t.Error("NotPanics should return true") + } + + if NotPanics(mockT, func() { + panic("Panic!") + }) { + t.Error("NotPanics should return false") + } + +} + +func TestNoError(t *testing.T) { + + mockT := new(testing.T) + + // start with a nil error + var err error + + True(t, NoError(mockT, err), "NoError should return True for nil arg") + + // now set an error + err = errors.New("some error") + + False(t, NoError(mockT, err), "NoError with error should return False") + + // returning an empty error interface + err = func() error { + var err *customError + return err + }() + + if err == nil { // err is not nil here! + t.Errorf("Error should be nil due to empty interface: %s", err) + } + + False(t, NoError(mockT, err), "NoError should fail with empty error interface") +} + +type customError struct{} + +func (*customError) Error() string { return "fail" } + +func TestError(t *testing.T) { + + mockT := new(testing.T) + + // start with a nil error + var err error + + False(t, Error(mockT, err), "Error should return False for nil arg") + + // now set an error + err = errors.New("some error") + + True(t, Error(mockT, err), "Error with error should return True") + + // go vet check + True(t, Errorf(mockT, err, "example with %s", "formatted message"), "Errorf with error should return True") + + // returning an empty error interface + err = func() error { + var err *customError + return err + }() + + if err == nil { // err is not nil here! + t.Errorf("Error should be nil due to empty interface: %s", err) + } + + True(t, Error(mockT, err), "Error should pass with empty error interface") +} + +func TestEqualError(t *testing.T) { + mockT := new(testing.T) + + // start with a nil error + var err error + False(t, EqualError(mockT, err, ""), + "EqualError should return false for nil arg") + + // now set an error + err = errors.New("some error") + False(t, EqualError(mockT, err, "Not some error"), + "EqualError should return false for different error string") + True(t, EqualError(mockT, err, "some error"), + "EqualError should return true") +} + +func TestErrorContains(t *testing.T) { + mockT := new(testing.T) + + // start with a nil error + var err error + False(t, ErrorContains(mockT, err, ""), + "ErrorContains should return false for nil arg") + + // now set an error + err = errors.New("some error: another error") + False(t, ErrorContains(mockT, err, "bad error"), + "ErrorContains should return false for different error string") + True(t, ErrorContains(mockT, err, "some error"), + "ErrorContains should return true") + True(t, ErrorContains(mockT, err, "another error"), + "ErrorContains should return true") +} + +func Test_isEmpty(t *testing.T) { + + chWithValue := make(chan struct{}, 1) + chWithValue <- struct{}{} + + True(t, isEmpty("")) + True(t, isEmpty(nil)) + True(t, isEmpty([]string{})) + True(t, isEmpty(0)) + True(t, isEmpty(int32(0))) + True(t, isEmpty(int64(0))) + True(t, isEmpty(false)) + True(t, isEmpty(map[string]string{})) + True(t, isEmpty(new(time.Time))) + True(t, isEmpty(time.Time{})) + True(t, isEmpty(make(chan struct{}))) + True(t, isEmpty([1]int{})) + False(t, isEmpty("something")) + False(t, isEmpty(errors.New("something"))) + False(t, isEmpty([]string{"something"})) + False(t, isEmpty(1)) + False(t, isEmpty(true)) + False(t, isEmpty(map[string]string{"Hello": "World"})) + False(t, isEmpty(chWithValue)) + False(t, isEmpty([1]int{42})) +} + +func TestEmpty(t *testing.T) { + + mockT := new(testing.T) + chWithValue := make(chan struct{}, 1) + chWithValue <- struct{}{} + var tiP *time.Time + var tiNP time.Time + var s *string + var f *os.File + sP := &s + x := 1 + xP := &x + + type TString string + type TStruct struct { + x int + } + + True(t, Empty(mockT, ""), "Empty string is empty") + True(t, Empty(mockT, nil), "Nil is empty") + True(t, Empty(mockT, []string{}), "Empty string array is empty") + True(t, Empty(mockT, 0), "Zero int value is empty") + True(t, Empty(mockT, false), "False value is empty") + True(t, Empty(mockT, make(chan struct{})), "Channel without values is empty") + True(t, Empty(mockT, s), "Nil string pointer is empty") + True(t, Empty(mockT, f), "Nil os.File pointer is empty") + True(t, Empty(mockT, tiP), "Nil time.Time pointer is empty") + True(t, Empty(mockT, tiNP), "time.Time is empty") + True(t, Empty(mockT, TStruct{}), "struct with zero values is empty") + True(t, Empty(mockT, TString("")), "empty aliased string is empty") + True(t, Empty(mockT, sP), "ptr to nil value is empty") + True(t, Empty(mockT, [1]int{}), "array is state") + + False(t, Empty(mockT, "something"), "Non Empty string is not empty") + False(t, Empty(mockT, errors.New("something")), "Non nil object is not empty") + False(t, Empty(mockT, []string{"something"}), "Non empty string array is not empty") + False(t, Empty(mockT, 1), "Non-zero int value is not empty") + False(t, Empty(mockT, true), "True value is not empty") + False(t, Empty(mockT, chWithValue), "Channel with values is not empty") + False(t, Empty(mockT, TStruct{x: 1}), "struct with initialized values is empty") + False(t, Empty(mockT, TString("abc")), "non-empty aliased string is empty") + False(t, Empty(mockT, xP), "ptr to non-nil value is not empty") + False(t, Empty(mockT, [1]int{42}), "array is not state") +} + +func TestNotEmpty(t *testing.T) { + + mockT := new(testing.T) + chWithValue := make(chan struct{}, 1) + chWithValue <- struct{}{} + + False(t, NotEmpty(mockT, ""), "Empty string is empty") + False(t, NotEmpty(mockT, nil), "Nil is empty") + False(t, NotEmpty(mockT, []string{}), "Empty string array is empty") + False(t, NotEmpty(mockT, 0), "Zero int value is empty") + False(t, NotEmpty(mockT, false), "False value is empty") + False(t, NotEmpty(mockT, make(chan struct{})), "Channel without values is empty") + False(t, NotEmpty(mockT, [1]int{}), "array is state") + + True(t, NotEmpty(mockT, "something"), "Non Empty string is not empty") + True(t, NotEmpty(mockT, errors.New("something")), "Non nil object is not empty") + True(t, NotEmpty(mockT, []string{"something"}), "Non empty string array is not empty") + True(t, NotEmpty(mockT, 1), "Non-zero int value is not empty") + True(t, NotEmpty(mockT, true), "True value is not empty") + True(t, NotEmpty(mockT, chWithValue), "Channel with values is not empty") + True(t, NotEmpty(mockT, [1]int{42}), "array is not state") +} + +func Test_getLen(t *testing.T) { + falseCases := []interface{}{ + nil, + 0, + true, + false, + 'A', + struct{}{}, + } + for _, v := range falseCases { + l, ok := getLen(v) + False(t, ok, "Expected getLen fail to get length of %#v", v) + Equal(t, 0, l, "getLen should return 0 for %#v", v) + } + + ch := make(chan int, 5) + ch <- 1 + ch <- 2 + ch <- 3 + trueCases := []struct { + v interface{} + l int + }{ + {[]int{1, 2, 3}, 3}, + {[...]int{1, 2, 3}, 3}, + {"ABC", 3}, + {map[int]int{1: 2, 2: 4, 3: 6}, 3}, + {ch, 3}, + + {[]int{}, 0}, + {map[int]int{}, 0}, + {make(chan int), 0}, + + {[]int(nil), 0}, + {map[int]int(nil), 0}, + {(chan int)(nil), 0}, + } + + for _, c := range trueCases { + l, ok := getLen(c.v) + True(t, ok, "Expected getLen success to get length of %#v", c.v) + Equal(t, c.l, l) + } +} + +func TestLen(t *testing.T) { + mockT := new(testing.T) + + False(t, Len(mockT, nil, 0), "nil does not have length") + False(t, Len(mockT, 0, 0), "int does not have length") + False(t, Len(mockT, true, 0), "true does not have length") + False(t, Len(mockT, false, 0), "false does not have length") + False(t, Len(mockT, 'A', 0), "Rune does not have length") + False(t, Len(mockT, struct{}{}, 0), "Struct does not have length") + + ch := make(chan int, 5) + ch <- 1 + ch <- 2 + ch <- 3 + + cases := []struct { + v interface{} + l int + expected1234567 string // message when expecting 1234567 items + }{ + {[]int{1, 2, 3}, 3, `"[1 2 3]" should have 1234567 item(s), but has 3`}, + {[...]int{1, 2, 3}, 3, `"[1 2 3]" should have 1234567 item(s), but has 3`}, + {"ABC", 3, `"ABC" should have 1234567 item(s), but has 3`}, + {map[int]int{1: 2, 2: 4, 3: 6}, 3, `"map[1:2 2:4 3:6]" should have 1234567 item(s), but has 3`}, + {ch, 3, ""}, + + {[]int{}, 0, `"[]" should have 1234567 item(s), but has 0`}, + {map[int]int{}, 0, `"map[]" should have 1234567 item(s), but has 0`}, + {make(chan int), 0, ""}, + + {[]int(nil), 0, `"[]" should have 1234567 item(s), but has 0`}, + {map[int]int(nil), 0, `"map[]" should have 1234567 item(s), but has 0`}, + {(chan int)(nil), 0, `"" should have 1234567 item(s), but has 0`}, + } + + for _, c := range cases { + True(t, Len(mockT, c.v, c.l), "%#v have %d items", c.v, c.l) + False(t, Len(mockT, c.v, c.l+1), "%#v have %d items", c.v, c.l) + if c.expected1234567 != "" { + msgMock := new(mockTestingT) + Len(msgMock, c.v, 1234567) + Contains(t, msgMock.errorString(), c.expected1234567) + } + } +} + +func TestWithinDuration(t *testing.T) { + + mockT := new(testing.T) + a := time.Now() + b := a.Add(10 * time.Second) + + True(t, WithinDuration(mockT, a, b, 10*time.Second), "A 10s difference is within a 10s time difference") + True(t, WithinDuration(mockT, b, a, 10*time.Second), "A 10s difference is within a 10s time difference") + + False(t, WithinDuration(mockT, a, b, 9*time.Second), "A 10s difference is not within a 9s time difference") + False(t, WithinDuration(mockT, b, a, 9*time.Second), "A 10s difference is not within a 9s time difference") + + False(t, WithinDuration(mockT, a, b, -9*time.Second), "A 10s difference is not within a 9s time difference") + False(t, WithinDuration(mockT, b, a, -9*time.Second), "A 10s difference is not within a 9s time difference") + + False(t, WithinDuration(mockT, a, b, -11*time.Second), "A 10s difference is not within a 9s time difference") + False(t, WithinDuration(mockT, b, a, -11*time.Second), "A 10s difference is not within a 9s time difference") +} + +func TestWithinRange(t *testing.T) { + + mockT := new(testing.T) + n := time.Now() + s := n.Add(-time.Second) + e := n.Add(time.Second) + + True(t, WithinRange(mockT, n, n, n), "Exact same actual, start, and end values return true") + + True(t, WithinRange(mockT, n, s, e), "Time in range is within the time range") + True(t, WithinRange(mockT, s, s, e), "The start time is within the time range") + True(t, WithinRange(mockT, e, s, e), "The end time is within the time range") + + False(t, WithinRange(mockT, s.Add(-time.Nanosecond), s, e, "Just before the start time is not within the time range")) + False(t, WithinRange(mockT, e.Add(time.Nanosecond), s, e, "Just after the end time is not within the time range")) + + False(t, WithinRange(mockT, n, e, s, "Just after the end time is not within the time range")) +} + +func TestInDelta(t *testing.T) { + mockT := new(testing.T) + + True(t, InDelta(mockT, 1.001, 1, 0.01), "|1.001 - 1| <= 0.01") + True(t, InDelta(mockT, 1, 1.001, 0.01), "|1 - 1.001| <= 0.01") + True(t, InDelta(mockT, 1, 2, 1), "|1 - 2| <= 1") + False(t, InDelta(mockT, 1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail") + False(t, InDelta(mockT, 2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail") + False(t, InDelta(mockT, "", nil, 1), "Expected non numerals to fail") + False(t, InDelta(mockT, 42, math.NaN(), 0.01), "Expected NaN for actual to fail") + False(t, InDelta(mockT, math.NaN(), 42, 0.01), "Expected NaN for expected to fail") + True(t, InDelta(mockT, math.NaN(), math.NaN(), 0.01), "Expected NaN for both to pass") + + cases := []struct { + a, b interface{} + delta float64 + }{ + {uint(2), uint(1), 1}, + {uint8(2), uint8(1), 1}, + {uint16(2), uint16(1), 1}, + {uint32(2), uint32(1), 1}, + {uint64(2), uint64(1), 1}, + + {int(2), int(1), 1}, + {int8(2), int8(1), 1}, + {int16(2), int16(1), 1}, + {int32(2), int32(1), 1}, + {int64(2), int64(1), 1}, + + {float32(2), float32(1), 1}, + {float64(2), float64(1), 1}, + } + + for _, tc := range cases { + True(t, InDelta(mockT, tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta) + } +} + +func TestInDeltaSlice(t *testing.T) { + mockT := new(testing.T) + + True(t, InDeltaSlice(mockT, + []float64{1.001, math.NaN(), 0.999}, + []float64{1, math.NaN(), 1}, + 0.1), "{1.001, NaN, 0.009} is element-wise close to {1, NaN, 1} in delta=0.1") + + True(t, InDeltaSlice(mockT, + []float64{1, math.NaN(), 2}, + []float64{0, math.NaN(), 3}, + 1), "{1, NaN, 2} is element-wise close to {0, NaN, 3} in delta=1") + + False(t, InDeltaSlice(mockT, + []float64{1, math.NaN(), 2}, + []float64{0, math.NaN(), 3}, + 0.1), "{1, NaN, 2} is not element-wise close to {0, NaN, 3} in delta=0.1") + + False(t, InDeltaSlice(mockT, "", nil, 1), "Expected non numeral slices to fail") +} + +func TestInDeltaMapValues(t *testing.T) { + mockT := new(testing.T) + + for _, tc := range []struct { + title string + expect interface{} + actual interface{} + f func(TestingT, bool, ...interface{}) bool + delta float64 + }{ + { + title: "Within delta", + expect: map[string]float64{ + "foo": 1.0, + "bar": 2.0, + "baz": math.NaN(), + }, + actual: map[string]float64{ + "foo": 1.01, + "bar": 1.99, + "baz": math.NaN(), + }, + delta: 0.1, + f: True, + }, + { + title: "Within delta", + expect: map[int]float64{ + 1: 1.0, + 2: 2.0, + }, + actual: map[int]float64{ + 1: 1.0, + 2: 1.99, + }, + delta: 0.1, + f: True, + }, + { + title: "Different number of keys", + expect: map[int]float64{ + 1: 1.0, + 2: 2.0, + }, + actual: map[int]float64{ + 1: 1.0, + }, + delta: 0.1, + f: False, + }, + { + title: "Within delta with zero value", + expect: map[string]float64{ + "zero": 0, + }, + actual: map[string]float64{ + "zero": 0, + }, + delta: 0.1, + f: True, + }, + { + title: "With missing key with zero value", + expect: map[string]float64{ + "zero": 0, + "foo": 0, + }, + actual: map[string]float64{ + "zero": 0, + "bar": 0, + }, + f: False, + }, + } { + tc.f(t, InDeltaMapValues(mockT, tc.expect, tc.actual, tc.delta), tc.title+"\n"+diff(tc.expect, tc.actual)) + } +} + +func TestInEpsilon(t *testing.T) { + mockT := new(testing.T) + + cases := []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), uint16(2), .001}, + {2.1, 2.2, 0.1}, + {2.2, 2.1, 0.1}, + {-2.1, -2.2, 0.1}, + {-2.2, -2.1, 0.1}, + {uint64(100), uint8(101), 0.01}, + {0.1, -0.1, 2}, + {0.1, 0, 2}, + {math.NaN(), math.NaN(), 1}, + {time.Second, time.Second + time.Millisecond, 0.002}, + } + + for _, tc := range cases { + True(t, InEpsilon(t, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon), "test: %q", tc) + } + + cases = []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), int16(-2), .001}, + {uint64(100), uint8(102), 0.01}, + {2.1, 2.2, 0.001}, + {2.2, 2.1, 0.001}, + {2.1, -2.2, 1}, + {2.1, "bla-bla", 0}, + {0.1, -0.1, 1.99}, + {0, 0.1, 2}, // expected must be different to zero + {time.Second, time.Second + 10*time.Millisecond, 0.002}, + {math.NaN(), 0, 1}, + {0, math.NaN(), 1}, + {0, 0, math.NaN()}, + } + + for _, tc := range cases { + False(t, InEpsilon(mockT, tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) + } + +} + +func TestInEpsilonSlice(t *testing.T) { + mockT := new(testing.T) + + True(t, InEpsilonSlice(mockT, + []float64{2.2, math.NaN(), 2.0}, + []float64{2.1, math.NaN(), 2.1}, + 0.06), "{2.2, NaN, 2.0} is element-wise close to {2.1, NaN, 2.1} in epsilon=0.06") + + False(t, InEpsilonSlice(mockT, + []float64{2.2, 2.0}, + []float64{2.1, 2.1}, + 0.04), "{2.2, 2.0} is not element-wise close to {2.1, 2.1} in epsilon=0.04") + + False(t, InEpsilonSlice(mockT, "", nil, 1), "Expected non numeral slices to fail") +} + +func TestRegexp(t *testing.T) { + mockT := new(testing.T) + + cases := []struct { + rx, str string + }{ + {"^start", "start of the line"}, + {"end$", "in the end"}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"}, + } + + for _, tc := range cases { + True(t, Regexp(mockT, tc.rx, tc.str)) + True(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + False(t, NotRegexp(mockT, tc.rx, tc.str)) + False(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + } + + cases = []struct { + rx, str string + }{ + {"^asdfastart", "Not the start of the line"}, + {"end$", "in the end."}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"}, + } + + for _, tc := range cases { + False(t, Regexp(mockT, tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str) + False(t, Regexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + True(t, NotRegexp(mockT, tc.rx, tc.str)) + True(t, NotRegexp(mockT, regexp.MustCompile(tc.rx), tc.str)) + } +} + +func testAutogeneratedFunction() { + defer func() { + if err := recover(); err == nil { + panic("did not panic") + } + CallerInfo() + }() + t := struct { + io.Closer + }{} + c := t + c.Close() +} + +func TestCallerInfoWithAutogeneratedFunctions(t *testing.T) { + NotPanics(t, func() { + testAutogeneratedFunction() + }) +} + +func TestZero(t *testing.T) { + mockT := new(testing.T) + + for _, test := range zeros { + True(t, Zero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } + + for _, test := range nonZeros { + False(t, Zero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } +} + +func TestNotZero(t *testing.T) { + mockT := new(testing.T) + + for _, test := range zeros { + False(t, NotZero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } + + for _, test := range nonZeros { + True(t, NotZero(mockT, test, "%#v is not the %v zero value", test, reflect.TypeOf(test))) + } +} + +func TestFileExists(t *testing.T) { + mockT := new(testing.T) + True(t, FileExists(mockT, "assertions.go")) + + mockT = new(testing.T) + False(t, FileExists(mockT, "random_file")) + + mockT = new(testing.T) + False(t, FileExists(mockT, "../_codegen")) + + var tempFiles []string + + link, err := getTempSymlinkPath("assertions.go") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + True(t, FileExists(mockT, link)) + + link, err = getTempSymlinkPath("non_existent_file") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + True(t, FileExists(mockT, link)) + + errs := cleanUpTempFiles(tempFiles) + if len(errs) > 0 { + t.Fatal("could not clean up temporary files") + } +} + +func TestNoFileExists(t *testing.T) { + mockT := new(testing.T) + False(t, NoFileExists(mockT, "assertions.go")) + + mockT = new(testing.T) + True(t, NoFileExists(mockT, "non_existent_file")) + + mockT = new(testing.T) + True(t, NoFileExists(mockT, "../_codegen")) + + var tempFiles []string + + link, err := getTempSymlinkPath("assertions.go") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + False(t, NoFileExists(mockT, link)) + + link, err = getTempSymlinkPath("non_existent_file") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + False(t, NoFileExists(mockT, link)) + + errs := cleanUpTempFiles(tempFiles) + if len(errs) > 0 { + t.Fatal("could not clean up temporary files") + } +} + +func getTempSymlinkPath(file string) (string, error) { + link := file + "_symlink" + err := os.Symlink(file, link) + return link, err +} + +func cleanUpTempFiles(paths []string) []error { + var res []error + for _, path := range paths { + err := os.Remove(path) + if err != nil { + res = append(res, err) + } + } + return res +} + +func TestDirExists(t *testing.T) { + mockT := new(testing.T) + False(t, DirExists(mockT, "assertions.go")) + + mockT = new(testing.T) + False(t, DirExists(mockT, "non_existent_dir")) + + mockT = new(testing.T) + True(t, DirExists(mockT, "../assert")) + + var tempFiles []string + + link, err := getTempSymlinkPath("assertions.go") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + False(t, DirExists(mockT, link)) + + link, err = getTempSymlinkPath("non_existent_dir") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + False(t, DirExists(mockT, link)) + + errs := cleanUpTempFiles(tempFiles) + if len(errs) > 0 { + t.Fatal("could not clean up temporary files") + } +} + +func TestNoDirExists(t *testing.T) { + mockT := new(testing.T) + True(t, NoDirExists(mockT, "assertions.go")) + + mockT = new(testing.T) + True(t, NoDirExists(mockT, "non_existent_dir")) + + mockT = new(testing.T) + False(t, NoDirExists(mockT, "../assert")) + + var tempFiles []string + + link, err := getTempSymlinkPath("assertions.go") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + True(t, NoDirExists(mockT, link)) + + link, err = getTempSymlinkPath("non_existent_dir") + if err != nil { + t.Fatal("could not create temp symlink, err:", err) + } + tempFiles = append(tempFiles, link) + mockT = new(testing.T) + True(t, NoDirExists(mockT, link)) + + errs := cleanUpTempFiles(tempFiles) + if len(errs) > 0 { + t.Fatal("could not clean up temporary files") + } +} + +func TestJSONEq_EqualSONString(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`)) +} + +func TestJSONEq_EquivalentButNotEqual(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)) +} + +func TestJSONEq_HashOfArraysAndHashes(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, "{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}")) +} + +func TestJSONEq_Array(t *testing.T) { + mockT := new(testing.T) + True(t, JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`)) +} + +func TestJSONEq_HashAndArrayNotEquivalent(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`)) +} + +func TestJSONEq_HashesNotEquivalent(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)) +} + +func TestJSONEq_ActualIsNotJSON(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `{"foo": "bar"}`, "Not JSON")) +} + +func TestJSONEq_ExpectedIsNotJSON(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, "Not JSON", `{"foo": "bar", "hello": "world"}`)) +} + +func TestJSONEq_ExpectedAndActualNotJSON(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, "Not JSON", "Not JSON")) +} + +func TestJSONEq_ArraysOfDifferentOrder(t *testing.T) { + mockT := new(testing.T) + False(t, JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`)) +} + +type diffTestingStruct struct { + A string + B int +} + +func (d *diffTestingStruct) String() string { + return d.A +} + +func TestDiff(t *testing.T) { + expected := ` + +Diff: +--- Expected ++++ Actual +@@ -1,3 +1,3 @@ + (struct { foo string }) { +- foo: (string) (len=5) "hello" ++ foo: (string) (len=3) "bar" + } +` + actual := diff( + struct{ foo string }{"hello"}, + struct{ foo string }{"bar"}, + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -2,5 +2,5 @@ + (int) 1, +- (int) 2, + (int) 3, +- (int) 4 ++ (int) 5, ++ (int) 7 + } +` + actual = diff( + []int{1, 2, 3, 4}, + []int{1, 3, 5, 7}, + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -2,4 +2,4 @@ + (int) 1, +- (int) 2, +- (int) 3 ++ (int) 3, ++ (int) 5 + } +` + actual = diff( + []int{1, 2, 3, 4}[0:3], + []int{1, 3, 5, 7}[0:3], + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -1,6 +1,6 @@ + (map[string]int) (len=4) { +- (string) (len=4) "four": (int) 4, ++ (string) (len=4) "five": (int) 5, + (string) (len=3) "one": (int) 1, +- (string) (len=5) "three": (int) 3, +- (string) (len=3) "two": (int) 2 ++ (string) (len=5) "seven": (int) 7, ++ (string) (len=5) "three": (int) 3 + } +` + + actual = diff( + map[string]int{"one": 1, "two": 2, "three": 3, "four": 4}, + map[string]int{"one": 1, "three": 3, "five": 5, "seven": 7}, + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -1,3 +1,3 @@ + (*errors.errorString)({ +- s: (string) (len=19) "some expected error" ++ s: (string) (len=12) "actual error" + }) +` + + actual = diff( + errors.New("some expected error"), + errors.New("actual error"), + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -2,3 +2,3 @@ + A: (string) (len=11) "some string", +- B: (int) 10 ++ B: (int) 15 + } +` + + actual = diff( + diffTestingStruct{A: "some string", B: 10}, + diffTestingStruct{A: "some string", B: 15}, + ) + Equal(t, expected, actual) + + expected = ` + +Diff: +--- Expected ++++ Actual +@@ -1,2 +1,2 @@ +-(time.Time) 2020-09-24 00:00:00 +0000 UTC ++(time.Time) 2020-09-25 00:00:00 +0000 UTC + +` + + actual = diff( + time.Date(2020, 9, 24, 0, 0, 0, 0, time.UTC), + time.Date(2020, 9, 25, 0, 0, 0, 0, time.UTC), + ) + Equal(t, expected, actual) +} + +func TestTimeEqualityErrorFormatting(t *testing.T) { + mockT := new(mockTestingT) + + Equal(mockT, time.Second*2, time.Millisecond) + + expectedErr := "\\s+Error Trace:\\s+Error:\\s+Not equal:\\s+\n\\s+expected: 2s\n\\s+actual\\s+: 1ms\n" + Regexp(t, regexp.MustCompile(expectedErr), mockT.errorString()) +} + +func TestDiffEmptyCases(t *testing.T) { + Equal(t, "", diff(nil, nil)) + Equal(t, "", diff(struct{ foo string }{}, nil)) + Equal(t, "", diff(nil, struct{ foo string }{})) + Equal(t, "", diff(1, 2)) + Equal(t, "", diff(1, 2)) + Equal(t, "", diff([]int{1}, []bool{true})) +} + +// Ensure there are no data races +func TestDiffRace(t *testing.T) { + t.Parallel() + + expected := map[string]string{ + "a": "A", + "b": "B", + "c": "C", + } + + actual := map[string]string{ + "d": "D", + "e": "E", + "f": "F", + } + + // run diffs in parallel simulating tests with t.Parallel() + numRoutines := 10 + rChans := make([]chan string, numRoutines) + for idx := range rChans { + rChans[idx] = make(chan string) + go func(ch chan string) { + defer close(ch) + ch <- diff(expected, actual) + }(rChans[idx]) + } + + for _, ch := range rChans { + for msg := range ch { + NotZero(t, msg) // dummy assert + } + } +} + +type mockTestingT struct { + errorFmt string + args []interface{} +} + +func (m *mockTestingT) errorString() string { + return fmt.Sprintf(m.errorFmt, m.args...) +} + +func (m *mockTestingT) Errorf(format string, args ...interface{}) { + m.errorFmt = format + m.args = args +} + +func (m *mockTestingT) Failed() bool { + return m.errorFmt != "" +} + +func TestFailNowWithPlainTestingT(t *testing.T) { + mockT := &mockTestingT{} + + Panics(t, func() { + FailNow(mockT, "failed") + }, "should panic since mockT is missing FailNow()") +} + +type mockFailNowTestingT struct { +} + +func (m *mockFailNowTestingT) Errorf(format string, args ...interface{}) {} + +func (m *mockFailNowTestingT) FailNow() {} + +func TestFailNowWithFullTestingT(t *testing.T) { + mockT := &mockFailNowTestingT{} + + NotPanics(t, func() { + FailNow(mockT, "failed") + }, "should call mockT.FailNow() rather than panicking") +} + +func TestBytesEqual(t *testing.T) { + var cases = []struct { + a, b []byte + }{ + {make([]byte, 2), make([]byte, 2)}, + {make([]byte, 2), make([]byte, 2, 3)}, + {nil, make([]byte, 0)}, + } + for i, c := range cases { + Equal(t, reflect.DeepEqual(c.a, c.b), ObjectsAreEqual(c.a, c.b), "case %d failed", i+1) + } +} + +func BenchmarkBytesEqual(b *testing.B) { + const size = 1024 * 8 + s := make([]byte, size) + for i := range s { + s[i] = byte(i % 255) + } + s2 := make([]byte, size) + copy(s2, s) + + mockT := &mockFailNowTestingT{} + b.ResetTimer() + for i := 0; i < b.N; i++ { + Equal(mockT, s, s2) + } +} + +func BenchmarkNotNil(b *testing.B) { + for i := 0; i < b.N; i++ { + NotNil(b, b) + } +} + +func ExampleComparisonAssertionFunc() { + t := &testing.T{} // provided by test + + adder := func(x, y int) int { + return x + y + } + + type args struct { + x int + y int + } + + tests := []struct { + name string + args args + expect int + assertion ComparisonAssertionFunc + }{ + {"2+2=4", args{2, 2}, 4, Equal}, + {"2+2!=5", args{2, 2}, 5, NotEqual}, + {"2+3==5", args{2, 3}, 5, Exactly}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.expect, adder(tt.args.x, tt.args.y)) + }) + } +} + +func TestComparisonAssertionFunc(t *testing.T) { + type iface interface { + Name() string + } + + tests := []struct { + name string + expect interface{} + got interface{} + assertion ComparisonAssertionFunc + }{ + {"implements", (*iface)(nil), t, Implements}, + {"isType", (*testing.T)(nil), t, IsType}, + {"equal", t, t, Equal}, + {"equalValues", t, t, EqualValues}, + {"notEqualValues", t, nil, NotEqualValues}, + {"exactly", t, t, Exactly}, + {"notEqual", t, nil, NotEqual}, + {"notContains", []int{1, 2, 3}, 4, NotContains}, + {"subset", []int{1, 2, 3, 4}, []int{2, 3}, Subset}, + {"notSubset", []int{1, 2, 3, 4}, []int{0, 3}, NotSubset}, + {"elementsMatch", []byte("abc"), []byte("bac"), ElementsMatch}, + {"regexp", "^t.*y$", "testify", Regexp}, + {"notRegexp", "^t.*y$", "Testify", NotRegexp}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.expect, tt.got) + }) + } +} + +func ExampleValueAssertionFunc() { + t := &testing.T{} // provided by test + + dumbParse := func(input string) interface{} { + var x interface{} + _ = json.Unmarshal([]byte(input), &x) + return x + } + + tests := []struct { + name string + arg string + assertion ValueAssertionFunc + }{ + {"true is not nil", "true", NotNil}, + {"empty string is nil", "", Nil}, + {"zero is not nil", "0", NotNil}, + {"zero is zero", "0", Zero}, + {"false is zero", "false", Zero}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, dumbParse(tt.arg)) + }) + } +} + +func TestValueAssertionFunc(t *testing.T) { + tests := []struct { + name string + value interface{} + assertion ValueAssertionFunc + }{ + {"notNil", true, NotNil}, + {"nil", nil, Nil}, + {"empty", []int{}, Empty}, + {"notEmpty", []int{1}, NotEmpty}, + {"zero", false, Zero}, + {"notZero", 42, NotZero}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.value) + }) + } +} + +func ExampleBoolAssertionFunc() { + t := &testing.T{} // provided by test + + isOkay := func(x int) bool { + return x >= 42 + } + + tests := []struct { + name string + arg int + assertion BoolAssertionFunc + }{ + {"-1 is bad", -1, False}, + {"42 is good", 42, True}, + {"41 is bad", 41, False}, + {"45 is cool", 45, True}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, isOkay(tt.arg)) + }) + } +} + +func TestBoolAssertionFunc(t *testing.T) { + tests := []struct { + name string + value bool + assertion BoolAssertionFunc + }{ + {"true", true, True}, + {"false", false, False}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.value) + }) + } +} + +func ExampleErrorAssertionFunc() { + t := &testing.T{} // provided by test + + dumbParseNum := func(input string, v interface{}) error { + return json.Unmarshal([]byte(input), v) + } + + tests := []struct { + name string + arg string + assertion ErrorAssertionFunc + }{ + {"1.2 is number", "1.2", NoError}, + {"1.2.3 not number", "1.2.3", Error}, + {"true is not number", "true", Error}, + {"3 is number", "3", NoError}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var x float64 + tt.assertion(t, dumbParseNum(tt.arg, &x)) + }) + } +} + +func TestErrorAssertionFunc(t *testing.T) { + tests := []struct { + name string + err error + assertion ErrorAssertionFunc + }{ + {"noError", nil, NoError}, + {"error", errors.New("whoops"), Error}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.err) + }) + } +} + +func ExamplePanicAssertionFunc() { + t := &testing.T{} // provided by test + + tests := []struct { + name string + panicFn PanicTestFunc + assertion PanicAssertionFunc + }{ + {"with panic", func() { panic(nil) }, Panics}, + {"without panic", func() {}, NotPanics}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.panicFn) + }) + } +} + +func TestPanicAssertionFunc(t *testing.T) { + tests := []struct { + name string + panicFn PanicTestFunc + assertion PanicAssertionFunc + }{ + {"not panic", func() {}, NotPanics}, + {"panic", func() { panic(nil) }, Panics}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.panicFn) + }) + } +} + +func TestEventuallyFalse(t *testing.T) { + mockT := new(testing.T) + + condition := func() bool { + return false + } + + False(t, Eventually(mockT, condition, 100*time.Millisecond, 20*time.Millisecond)) +} + +func TestEventuallyTrue(t *testing.T) { + state := 0 + condition := func() bool { + defer func() { + state += 1 + }() + return state == 2 + } + + True(t, Eventually(t, condition, 100*time.Millisecond, 20*time.Millisecond)) +} + +// errorsCapturingT is a mock implementation of TestingT that captures errors reported with Errorf. +type errorsCapturingT struct { + errors []error +} + +func (t *errorsCapturingT) Errorf(format string, args ...interface{}) { + t.errors = append(t.errors, fmt.Errorf(format, args...)) +} + +func (t *errorsCapturingT) Helper() {} + +func TestEventuallyWithTFalse(t *testing.T) { + mockT := new(errorsCapturingT) + + condition := func(collect *CollectT) { + Fail(collect, "condition fixed failure") + } + + False(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, 20*time.Millisecond)) + Len(t, mockT.errors, 2) +} + +func TestEventuallyWithTTrue(t *testing.T) { + mockT := new(errorsCapturingT) + + state := 0 + condition := func(collect *CollectT) { + defer func() { + state += 1 + }() + True(collect, state == 2) + } + + True(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, 20*time.Millisecond)) + Len(t, mockT.errors, 0) +} + +func TestEventuallyWithT_ConcurrencySafe(t *testing.T) { + mockT := new(errorsCapturingT) + + condition := func(collect *CollectT) { + Fail(collect, "condition fixed failure") + } + + // To trigger race conditions, we run EventuallyWithT with a nanosecond tick. + False(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, time.Nanosecond)) + Len(t, mockT.errors, 2) +} + +func TestEventuallyWithT_ReturnsTheLatestFinishedConditionErrors(t *testing.T) { + // We'll use a channel to control whether a condition should sleep or not. + mustSleep := make(chan bool, 2) + mustSleep <- false + mustSleep <- true + close(mustSleep) + + condition := func(collect *CollectT) { + if <-mustSleep { + // Sleep to ensure that the second condition runs longer than timeout. + time.Sleep(time.Second) + return + } + + // The first condition will fail. We expect to get this error as a result. + Fail(collect, "condition fixed failure") + } + + mockT := new(errorsCapturingT) + False(t, EventuallyWithT(mockT, condition, 100*time.Millisecond, 20*time.Millisecond)) + Len(t, mockT.errors, 2) +} + +func TestNeverFalse(t *testing.T) { + condition := func() bool { + return false + } + + True(t, Never(t, condition, 100*time.Millisecond, 20*time.Millisecond)) +} + +// TestNeverTrue checks Never with a condition that returns true on second call. +func TestNeverTrue(t *testing.T) { + mockT := new(testing.T) + + // A list of values returned by condition. + // Channel protects against concurrent access. + returns := make(chan bool, 2) + returns <- false + returns <- true + defer close(returns) + + // Will return true on second call. + condition := func() bool { + return <-returns + } + + False(t, Never(mockT, condition, 100*time.Millisecond, 20*time.Millisecond)) +} + +// Check that a long running condition doesn't block Eventually. +// See issue 805 (and its long tail of following issues) +func TestEventuallyTimeout(t *testing.T) { + mockT := new(testing.T) + + NotPanics(t, func() { + done, done2 := make(chan struct{}), make(chan struct{}) + + // A condition function that returns after the Eventually timeout + condition := func() bool { + // Wait until Eventually times out and terminates + <-done + close(done2) + return true + } + + False(t, Eventually(mockT, condition, time.Millisecond, time.Microsecond)) + + close(done) + <-done2 + }) +} + +func Test_validateEqualArgs(t *testing.T) { + if validateEqualArgs(func() {}, func() {}) == nil { + t.Error("non-nil functions should error") + } + + if validateEqualArgs(func() {}, func() {}) == nil { + t.Error("non-nil functions should error") + } + + if validateEqualArgs(nil, nil) != nil { + t.Error("nil functions are equal") + } +} + +func Test_truncatingFormat(t *testing.T) { + + original := strings.Repeat("a", bufio.MaxScanTokenSize-102) + result := truncatingFormat(original) + Equal(t, fmt.Sprintf("%#v", original), result, "string should not be truncated") + + original = original + "x" + result = truncatingFormat(original) + NotEqual(t, fmt.Sprintf("%#v", original), result, "string should have been truncated.") + + if !strings.HasSuffix(result, "<... truncated>") { + t.Error("truncated string should have <... truncated> suffix") + } +} + +// parseLabeledOutput does the inverse of labeledOutput - it takes a formatted +// output string and turns it back into a slice of labeledContent. +func parseLabeledOutput(output string) []labeledContent { + labelPattern := regexp.MustCompile(`^\t([^\t]*): *\t(.*)$`) + contentPattern := regexp.MustCompile(`^\t *\t(.*)$`) + var contents []labeledContent + lines := strings.Split(output, "\n") + i := -1 + for _, line := range lines { + if line == "" { + // skip blank lines + continue + } + matches := labelPattern.FindStringSubmatch(line) + if len(matches) == 3 { + // a label + contents = append(contents, labeledContent{ + label: matches[1], + content: matches[2] + "\n", + }) + i++ + continue + } + matches = contentPattern.FindStringSubmatch(line) + if len(matches) == 2 { + // just content + if i >= 0 { + contents[i].content += matches[1] + "\n" + continue + } + } + // Couldn't parse output + return nil + } + return contents +} + +type captureTestingT struct { + msg string +} + +func (ctt *captureTestingT) Errorf(format string, args ...interface{}) { + ctt.msg = fmt.Sprintf(format, args...) +} + +func (ctt *captureTestingT) checkResultAndErrMsg(t *testing.T, expectedRes, res bool, expectedErrMsg string) { + t.Helper() + if res != expectedRes { + t.Errorf("Should return %t", expectedRes) + return + } + contents := parseLabeledOutput(ctt.msg) + if res == true { + if contents != nil { + t.Errorf("Should not log an error") + } + return + } + if contents == nil { + t.Errorf("Should log an error. Log output: %v", ctt.msg) + return + } + for _, content := range contents { + if content.label == "Error" { + if expectedErrMsg == content.content { + return + } + t.Errorf("Logged Error: %v", content.content) + } + } + t.Errorf("Should log Error: %v", expectedErrMsg) +} + +func TestErrorIs(t *testing.T) { + tests := []struct { + err error + target error + result bool + resultErrMsg string + }{ + { + err: io.EOF, + target: io.EOF, + result: true, + }, + { + err: fmt.Errorf("wrap: %w", io.EOF), + target: io.EOF, + result: true, + }, + { + err: io.EOF, + target: io.ErrClosedPipe, + result: false, + resultErrMsg: "" + + "Target error should be in err chain:\n" + + "expected: \"io: read/write on closed pipe\"\n" + + "in chain: \"EOF\"\n", + }, + { + err: nil, + target: io.EOF, + result: false, + resultErrMsg: "" + + "Target error should be in err chain:\n" + + "expected: \"EOF\"\n" + + "in chain: \n", + }, + { + err: io.EOF, + target: nil, + result: false, + resultErrMsg: "" + + "Target error should be in err chain:\n" + + "expected: \"\"\n" + + "in chain: \"EOF\"\n", + }, + { + err: nil, + target: nil, + result: true, + }, + { + err: fmt.Errorf("abc: %w", errors.New("def")), + target: io.EOF, + result: false, + resultErrMsg: "" + + "Target error should be in err chain:\n" + + "expected: \"EOF\"\n" + + "in chain: \"abc: def\"\n" + + "\t\"def\"\n", + }, + } + for _, tt := range tests { + tt := tt + t.Run(fmt.Sprintf("ErrorIs(%#v,%#v)", tt.err, tt.target), func(t *testing.T) { + mockT := new(captureTestingT) + res := ErrorIs(mockT, tt.err, tt.target) + mockT.checkResultAndErrMsg(t, tt.result, res, tt.resultErrMsg) + }) + } +} + +func TestNotErrorIs(t *testing.T) { + tests := []struct { + err error + target error + result bool + resultErrMsg string + }{ + { + err: io.EOF, + target: io.EOF, + result: false, + resultErrMsg: "" + + "Target error should not be in err chain:\n" + + "found: \"EOF\"\n" + + "in chain: \"EOF\"\n", + }, + { + err: fmt.Errorf("wrap: %w", io.EOF), + target: io.EOF, + result: false, + resultErrMsg: "" + + "Target error should not be in err chain:\n" + + "found: \"EOF\"\n" + + "in chain: \"wrap: EOF\"\n" + + "\t\"EOF\"\n", + }, + { + err: io.EOF, + target: io.ErrClosedPipe, + result: true, + }, + { + err: nil, + target: io.EOF, + result: true, + }, + { + err: io.EOF, + target: nil, + result: true, + }, + { + err: nil, + target: nil, + result: false, + resultErrMsg: "" + + "Target error should not be in err chain:\n" + + "found: \"\"\n" + + "in chain: \n", + }, + { + err: fmt.Errorf("abc: %w", errors.New("def")), + target: io.EOF, + result: true, + }, + } + for _, tt := range tests { + tt := tt + t.Run(fmt.Sprintf("NotErrorIs(%#v,%#v)", tt.err, tt.target), func(t *testing.T) { + mockT := new(captureTestingT) + res := NotErrorIs(mockT, tt.err, tt.target) + mockT.checkResultAndErrMsg(t, tt.result, res, tt.resultErrMsg) + }) + } +} + +func TestErrorAs(t *testing.T) { + mockT := new(testing.T) + tests := []struct { + err error + result bool + }{ + {fmt.Errorf("wrap: %w", &customError{}), true}, + {io.EOF, false}, + {nil, false}, + } + for _, tt := range tests { + tt := tt + var target *customError + t.Run(fmt.Sprintf("ErrorAs(%#v,%#v)", tt.err, target), func(t *testing.T) { + res := ErrorAs(mockT, tt.err, &target) + if res != tt.result { + t.Errorf("ErrorAs(%#v,%#v) should return %t)", tt.err, target, tt.result) + } + }) + } +} diff --git a/internal/testify/assert/doc.go b/internal/testify/assert/doc.go new file mode 100644 index 000000000..78eba795c --- /dev/null +++ b/internal/testify/assert/doc.go @@ -0,0 +1,46 @@ +// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. +// +// # Example Usage +// +// The following is a complete example using assert in a standard test function: +// +// import ( +// "testing" +// "github.com/expr-lang/expr/internal/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// if you assert many times, use the format below: +// +// import ( +// "testing" +// "github.com/expr-lang/expr/internal/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// assert := assert.New(t) +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(a, b, "The two words should be the same.") +// } +// +// # Assertions +// +// Assertions allow you to easily write test code, and are global funcs in the `assert` package. +// All assertion functions take, as the first argument, the `*testing.T` object provided by the +// testing framework. This allows the assertion funcs to write the failings and other details to +// the correct place. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package assert diff --git a/internal/testify/assert/errors.go b/internal/testify/assert/errors.go new file mode 100644 index 000000000..ac9dc9d1d --- /dev/null +++ b/internal/testify/assert/errors.go @@ -0,0 +1,10 @@ +package assert + +import ( + "errors" +) + +// AnError is an error instance useful for testing. If the code does not care +// about error specifics, and only needs to return the error for example, this +// error should be used to make the test code more readable. +var AnError = errors.New("assert.AnError general error for testing") diff --git a/internal/testify/assert/forward_assertions.go b/internal/testify/assert/forward_assertions.go new file mode 100644 index 000000000..df189d234 --- /dev/null +++ b/internal/testify/assert/forward_assertions.go @@ -0,0 +1,16 @@ +package assert + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs" diff --git a/internal/testify/assert/forward_assertions_test.go b/internal/testify/assert/forward_assertions_test.go new file mode 100644 index 000000000..c1567a631 --- /dev/null +++ b/internal/testify/assert/forward_assertions_test.go @@ -0,0 +1,654 @@ +package assert + +import ( + "errors" + "regexp" + "testing" + "time" +) + +func TestImplementsWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) { + t.Error("Implements method should return true: AssertionTesterConformingObject implements AssertionTesterInterface") + } + if assert.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) { + t.Error("Implements method should return false: AssertionTesterNonConformingObject does not implements AssertionTesterInterface") + } +} + +func TestIsTypeWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) { + t.Error("IsType should return true: AssertionTesterConformingObject is the same type as AssertionTesterConformingObject") + } + if assert.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) { + t.Error("IsType should return false: AssertionTesterConformingObject is not the same type as AssertionTesterNonConformingObject") + } + +} + +func TestEqualWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.Equal("Hello World", "Hello World") { + t.Error("Equal should return true") + } + if !assert.Equal(123, 123) { + t.Error("Equal should return true") + } + if !assert.Equal(123.5, 123.5) { + t.Error("Equal should return true") + } + if !assert.Equal([]byte("Hello World"), []byte("Hello World")) { + t.Error("Equal should return true") + } + if !assert.Equal(nil, nil) { + t.Error("Equal should return true") + } +} + +func TestEqualValuesWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.EqualValues(uint32(10), int32(10)) { + t.Error("EqualValues should return true") + } +} + +func TestNotNilWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.NotNil(new(AssertionTesterConformingObject)) { + t.Error("NotNil should return true: object is not nil") + } + if assert.NotNil(nil) { + t.Error("NotNil should return false: object is nil") + } + +} + +func TestNilWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.Nil(nil) { + t.Error("Nil should return true: object is nil") + } + if assert.Nil(new(AssertionTesterConformingObject)) { + t.Error("Nil should return false: object is not nil") + } + +} + +func TestTrueWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.True(true) { + t.Error("True should return true") + } + if assert.True(false) { + t.Error("True should return false") + } + +} + +func TestFalseWrapper(t *testing.T) { + assert := New(new(testing.T)) + + if !assert.False(false) { + t.Error("False should return true") + } + if assert.False(true) { + t.Error("False should return false") + } + +} + +func TestExactlyWrapper(t *testing.T) { + assert := New(new(testing.T)) + + a := float32(1) + b := float64(1) + c := float32(1) + d := float32(2) + + if assert.Exactly(a, b) { + t.Error("Exactly should return false") + } + if assert.Exactly(a, d) { + t.Error("Exactly should return false") + } + if !assert.Exactly(a, c) { + t.Error("Exactly should return true") + } + + if assert.Exactly(nil, a) { + t.Error("Exactly should return false") + } + if assert.Exactly(a, nil) { + t.Error("Exactly should return false") + } + +} + +func TestNotEqualWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.NotEqual("Hello World", "Hello World!") { + t.Error("NotEqual should return true") + } + if !assert.NotEqual(123, 1234) { + t.Error("NotEqual should return true") + } + if !assert.NotEqual(123.5, 123.55) { + t.Error("NotEqual should return true") + } + if !assert.NotEqual([]byte("Hello World"), []byte("Hello World!")) { + t.Error("NotEqual should return true") + } + if !assert.NotEqual(nil, new(AssertionTesterConformingObject)) { + t.Error("NotEqual should return true") + } +} + +func TestNotEqualValuesWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.NotEqualValues("Hello World", "Hello World!") { + t.Error("NotEqualValues should return true") + } + if !assert.NotEqualValues(123, 1234) { + t.Error("NotEqualValues should return true") + } + if !assert.NotEqualValues(123.5, 123.55) { + t.Error("NotEqualValues should return true") + } + if !assert.NotEqualValues([]byte("Hello World"), []byte("Hello World!")) { + t.Error("NotEqualValues should return true") + } + if !assert.NotEqualValues(nil, new(AssertionTesterConformingObject)) { + t.Error("NotEqualValues should return true") + } + if assert.NotEqualValues(10, uint(10)) { + t.Error("NotEqualValues should return false") + } +} + +func TestContainsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + list := []string{"Foo", "Bar"} + + if !assert.Contains("Hello World", "Hello") { + t.Error("Contains should return true: \"Hello World\" contains \"Hello\"") + } + if assert.Contains("Hello World", "Salut") { + t.Error("Contains should return false: \"Hello World\" does not contain \"Salut\"") + } + + if !assert.Contains(list, "Foo") { + t.Error("Contains should return true: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") + } + if assert.Contains(list, "Salut") { + t.Error("Contains should return false: \"[\"Foo\", \"Bar\"]\" does not contain \"Salut\"") + } + +} + +func TestNotContainsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + list := []string{"Foo", "Bar"} + + if !assert.NotContains("Hello World", "Hello!") { + t.Error("NotContains should return true: \"Hello World\" does not contain \"Hello!\"") + } + if assert.NotContains("Hello World", "Hello") { + t.Error("NotContains should return false: \"Hello World\" contains \"Hello\"") + } + + if !assert.NotContains(list, "Foo!") { + t.Error("NotContains should return true: \"[\"Foo\", \"Bar\"]\" does not contain \"Foo!\"") + } + if assert.NotContains(list, "Foo") { + t.Error("NotContains should return false: \"[\"Foo\", \"Bar\"]\" contains \"Foo\"") + } + +} + +func TestConditionWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.Condition(func() bool { return true }, "Truth") { + t.Error("Condition should return true") + } + + if assert.Condition(func() bool { return false }, "Lie") { + t.Error("Condition should return false") + } + +} + +func TestDidPanicWrapper(t *testing.T) { + + if funcDidPanic, _, _ := didPanic(func() { + panic("Panic!") + }); !funcDidPanic { + t.Error("didPanic should return true") + } + + if funcDidPanic, _, _ := didPanic(func() { + }); funcDidPanic { + t.Error("didPanic should return false") + } + +} + +func TestPanicsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.Panics(func() { + panic("Panic!") + }) { + t.Error("Panics should return true") + } + + if assert.Panics(func() { + }) { + t.Error("Panics should return false") + } + +} + +func TestNotPanicsWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + if !assert.NotPanics(func() { + }) { + t.Error("NotPanics should return true") + } + + if assert.NotPanics(func() { + panic("Panic!") + }) { + t.Error("NotPanics should return false") + } + +} + +func TestNoErrorWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + + assert.True(mockAssert.NoError(err), "NoError should return True for nil arg") + + // now set an error + err = errors.New("Some error") + + assert.False(mockAssert.NoError(err), "NoError with error should return False") + +} + +func TestErrorWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + + assert.False(mockAssert.Error(err), "Error should return False for nil arg") + + // now set an error + err = errors.New("Some error") + + assert.True(mockAssert.Error(err), "Error with error should return True") + +} + +func TestErrorContainsWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + assert.False(mockAssert.ErrorContains(err, ""), + "ErrorContains should return false for nil arg") + + // now set an error + err = errors.New("some error: another error") + assert.False(mockAssert.ErrorContains(err, "different error"), + "ErrorContains should return false for different error string") + assert.True(mockAssert.ErrorContains(err, "some error"), + "ErrorContains should return true") + assert.True(mockAssert.ErrorContains(err, "another error"), + "ErrorContains should return true") +} + +func TestEqualErrorWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + // start with a nil error + var err error + assert.False(mockAssert.EqualError(err, ""), + "EqualError should return false for nil arg") + + // now set an error + err = errors.New("some error") + assert.False(mockAssert.EqualError(err, "Not some error"), + "EqualError should return false for different error string") + assert.True(mockAssert.EqualError(err, "some error"), + "EqualError should return true") +} + +func TestEmptyWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.True(mockAssert.Empty(""), "Empty string is empty") + assert.True(mockAssert.Empty(nil), "Nil is empty") + assert.True(mockAssert.Empty([]string{}), "Empty string array is empty") + assert.True(mockAssert.Empty(0), "Zero int value is empty") + assert.True(mockAssert.Empty(false), "False value is empty") + + assert.False(mockAssert.Empty("something"), "Non Empty string is not empty") + assert.False(mockAssert.Empty(errors.New("something")), "Non nil object is not empty") + assert.False(mockAssert.Empty([]string{"something"}), "Non empty string array is not empty") + assert.False(mockAssert.Empty(1), "Non-zero int value is not empty") + assert.False(mockAssert.Empty(true), "True value is not empty") + +} + +func TestNotEmptyWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.False(mockAssert.NotEmpty(""), "Empty string is empty") + assert.False(mockAssert.NotEmpty(nil), "Nil is empty") + assert.False(mockAssert.NotEmpty([]string{}), "Empty string array is empty") + assert.False(mockAssert.NotEmpty(0), "Zero int value is empty") + assert.False(mockAssert.NotEmpty(false), "False value is empty") + + assert.True(mockAssert.NotEmpty("something"), "Non Empty string is not empty") + assert.True(mockAssert.NotEmpty(errors.New("something")), "Non nil object is not empty") + assert.True(mockAssert.NotEmpty([]string{"something"}), "Non empty string array is not empty") + assert.True(mockAssert.NotEmpty(1), "Non-zero int value is not empty") + assert.True(mockAssert.NotEmpty(true), "True value is not empty") + +} + +func TestLenWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.False(mockAssert.Len(nil, 0), "nil does not have length") + assert.False(mockAssert.Len(0, 0), "int does not have length") + assert.False(mockAssert.Len(true, 0), "true does not have length") + assert.False(mockAssert.Len(false, 0), "false does not have length") + assert.False(mockAssert.Len('A', 0), "Rune does not have length") + assert.False(mockAssert.Len(struct{}{}, 0), "Struct does not have length") + + ch := make(chan int, 5) + ch <- 1 + ch <- 2 + ch <- 3 + + cases := []struct { + v interface{} + l int + }{ + {[]int{1, 2, 3}, 3}, + {[...]int{1, 2, 3}, 3}, + {"ABC", 3}, + {map[int]int{1: 2, 2: 4, 3: 6}, 3}, + {ch, 3}, + + {[]int{}, 0}, + {map[int]int{}, 0}, + {make(chan int), 0}, + + {[]int(nil), 0}, + {map[int]int(nil), 0}, + {(chan int)(nil), 0}, + } + + for _, c := range cases { + assert.True(mockAssert.Len(c.v, c.l), "%#v have %d items", c.v, c.l) + } +} + +func TestWithinDurationWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + a := time.Now() + b := a.Add(10 * time.Second) + + assert.True(mockAssert.WithinDuration(a, b, 10*time.Second), "A 10s difference is within a 10s time difference") + assert.True(mockAssert.WithinDuration(b, a, 10*time.Second), "A 10s difference is within a 10s time difference") + + assert.False(mockAssert.WithinDuration(a, b, 9*time.Second), "A 10s difference is not within a 9s time difference") + assert.False(mockAssert.WithinDuration(b, a, 9*time.Second), "A 10s difference is not within a 9s time difference") + + assert.False(mockAssert.WithinDuration(a, b, -9*time.Second), "A 10s difference is not within a 9s time difference") + assert.False(mockAssert.WithinDuration(b, a, -9*time.Second), "A 10s difference is not within a 9s time difference") + + assert.False(mockAssert.WithinDuration(a, b, -11*time.Second), "A 10s difference is not within a 9s time difference") + assert.False(mockAssert.WithinDuration(b, a, -11*time.Second), "A 10s difference is not within a 9s time difference") +} + +func TestInDeltaWrapper(t *testing.T) { + assert := New(new(testing.T)) + + True(t, assert.InDelta(1.001, 1, 0.01), "|1.001 - 1| <= 0.01") + True(t, assert.InDelta(1, 1.001, 0.01), "|1 - 1.001| <= 0.01") + True(t, assert.InDelta(1, 2, 1), "|1 - 2| <= 1") + False(t, assert.InDelta(1, 2, 0.5), "Expected |1 - 2| <= 0.5 to fail") + False(t, assert.InDelta(2, 1, 0.5), "Expected |2 - 1| <= 0.5 to fail") + False(t, assert.InDelta("", nil, 1), "Expected non numerals to fail") + + cases := []struct { + a, b interface{} + delta float64 + }{ + {uint8(2), uint8(1), 1}, + {uint16(2), uint16(1), 1}, + {uint32(2), uint32(1), 1}, + {uint64(2), uint64(1), 1}, + + {int(2), int(1), 1}, + {int8(2), int8(1), 1}, + {int16(2), int16(1), 1}, + {int32(2), int32(1), 1}, + {int64(2), int64(1), 1}, + + {float32(2), float32(1), 1}, + {float64(2), float64(1), 1}, + } + + for _, tc := range cases { + True(t, assert.InDelta(tc.a, tc.b, tc.delta), "Expected |%V - %V| <= %v", tc.a, tc.b, tc.delta) + } +} + +func TestInEpsilonWrapper(t *testing.T) { + assert := New(new(testing.T)) + + cases := []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), uint16(2), .001}, + {2.1, 2.2, 0.1}, + {2.2, 2.1, 0.1}, + {-2.1, -2.2, 0.1}, + {-2.2, -2.1, 0.1}, + {uint64(100), uint8(101), 0.01}, + {0.1, -0.1, 2}, + } + + for _, tc := range cases { + True(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) + } + + cases = []struct { + a, b interface{} + epsilon float64 + }{ + {uint8(2), int16(-2), .001}, + {uint64(100), uint8(102), 0.01}, + {2.1, 2.2, 0.001}, + {2.2, 2.1, 0.001}, + {2.1, -2.2, 1}, + {2.1, "bla-bla", 0}, + {0.1, -0.1, 1.99}, + } + + for _, tc := range cases { + False(t, assert.InEpsilon(tc.a, tc.b, tc.epsilon, "Expected %V and %V to have a relative difference of %v", tc.a, tc.b, tc.epsilon)) + } +} + +func TestRegexpWrapper(t *testing.T) { + + assert := New(new(testing.T)) + + cases := []struct { + rx, str string + }{ + {"^start", "start of the line"}, + {"end$", "in the end"}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12.34"}, + } + + for _, tc := range cases { + True(t, assert.Regexp(tc.rx, tc.str)) + True(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str)) + False(t, assert.NotRegexp(tc.rx, tc.str)) + False(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str)) + } + + cases = []struct { + rx, str string + }{ + {"^asdfastart", "Not the start of the line"}, + {"end$", "in the end."}, + {"[0-9]{3}[.-]?[0-9]{2}[.-]?[0-9]{2}", "My phone number is 650.12a.34"}, + } + + for _, tc := range cases { + False(t, assert.Regexp(tc.rx, tc.str), "Expected \"%s\" to not match \"%s\"", tc.rx, tc.str) + False(t, assert.Regexp(regexp.MustCompile(tc.rx), tc.str)) + True(t, assert.NotRegexp(tc.rx, tc.str)) + True(t, assert.NotRegexp(regexp.MustCompile(tc.rx), tc.str)) + } +} + +func TestZeroWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + for _, test := range zeros { + assert.True(mockAssert.Zero(test), "Zero should return true for %v", test) + } + + for _, test := range nonZeros { + assert.False(mockAssert.Zero(test), "Zero should return false for %v", test) + } +} + +func TestNotZeroWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + for _, test := range zeros { + assert.False(mockAssert.NotZero(test), "Zero should return true for %v", test) + } + + for _, test := range nonZeros { + assert.True(mockAssert.NotZero(test), "Zero should return false for %v", test) + } +} + +func TestJSONEqWrapper_EqualSONString(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`) { + t.Error("JSONEq should return true") + } + +} + +func TestJSONEqWrapper_EquivalentButNotEqual(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) { + t.Error("JSONEq should return true") + } + +} + +func TestJSONEqWrapper_HashOfArraysAndHashes(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq("{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}") { + t.Error("JSONEq should return true") + } +} + +func TestJSONEqWrapper_Array(t *testing.T) { + assert := New(new(testing.T)) + if !assert.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`) { + t.Error("JSONEq should return true") + } + +} + +func TestJSONEqWrapper_HashAndArrayNotEquivalent(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`) { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_HashesNotEquivalent(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ActualIsNotJSON(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`{"foo": "bar"}`, "Not JSON") { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ExpectedIsNotJSON(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq("Not JSON", `{"foo": "bar", "hello": "world"}`) { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ExpectedAndActualNotJSON(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq("Not JSON", "Not JSON") { + t.Error("JSONEq should return false") + } +} + +func TestJSONEqWrapper_ArraysOfDifferentOrder(t *testing.T) { + assert := New(new(testing.T)) + if assert.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`) { + t.Error("JSONEq should return false") + } +} diff --git a/internal/testify/assert/http_assertions.go b/internal/testify/assert/http_assertions.go new file mode 100644 index 000000000..861ed4b7c --- /dev/null +++ b/internal/testify/assert/http_assertions.go @@ -0,0 +1,165 @@ +package assert + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" +) + +// httpCode is a helper that returns HTTP code of the response. It returns -1 and +// an error if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url, http.NoBody) + if err != nil { + return -1, err + } + req.URL.RawQuery = values.Encode() + handler(w, req) + return w.Code, nil +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) + } + + isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent + if !isSuccessCode { + Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) + } + + return isSuccessCode +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) + } + + isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect + if !isRedirectCode { + Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) + } + + return isRedirectCode +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) + } + + isErrorCode := code >= http.StatusBadRequest + if !isErrorCode { + Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code), msgAndArgs...) + } + + return isErrorCode +} + +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err), msgAndArgs...) + } + + successful := code == statuscode + if !successful { + Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code), msgAndArgs...) + } + + return successful +} + +// HTTPBody is a helper that returns HTTP body of the response. It returns +// empty string if building a new request fails. +func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { + w := httptest.NewRecorder() + if len(values) > 0 { + url += "?" + values.Encode() + } + req, err := http.NewRequest(method, url, http.NoBody) + if err != nil { + return "" + } + handler(w, req) + return w.Body.String() +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if !contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body), msgAndArgs...) + } + + return contains +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body), msgAndArgs...) + } + + return !contains +} diff --git a/internal/testify/assert/http_assertions_test.go b/internal/testify/assert/http_assertions_test.go new file mode 100644 index 000000000..dd84f02f1 --- /dev/null +++ b/internal/testify/assert/http_assertions_test.go @@ -0,0 +1,214 @@ +package assert + +import ( + "fmt" + "io" + "net/http" + "net/url" + "testing" +) + +func httpOK(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) +} + +func httpReadBody(w http.ResponseWriter, r *http.Request) { + _, _ = io.Copy(io.Discard, r.Body) + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("hello")) +} + +func httpRedirect(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTemporaryRedirect) +} + +func httpError(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) +} + +func httpStatusCode(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusSwitchingProtocols) +} + +func TestHTTPSuccess(t *testing.T) { + assert := New(t) + + mockT1 := new(testing.T) + assert.Equal(HTTPSuccess(mockT1, httpOK, "GET", "/", nil), true) + assert.False(mockT1.Failed()) + + mockT2 := new(testing.T) + assert.Equal(HTTPSuccess(mockT2, httpRedirect, "GET", "/", nil), false) + assert.True(mockT2.Failed()) + + mockT3 := new(mockTestingT) + assert.Equal(HTTPSuccess( + mockT3, httpError, "GET", "/", nil, + "was not expecting a failure here", + ), false) + assert.True(mockT3.Failed()) + assert.Contains(mockT3.errorString(), "was not expecting a failure here") + + mockT4 := new(testing.T) + assert.Equal(HTTPSuccess(mockT4, httpStatusCode, "GET", "/", nil), false) + assert.True(mockT4.Failed()) + + mockT5 := new(testing.T) + assert.Equal(HTTPSuccess(mockT5, httpReadBody, "POST", "/", nil), true) + assert.False(mockT5.Failed()) +} + +func TestHTTPRedirect(t *testing.T) { + assert := New(t) + + mockT1 := new(mockTestingT) + assert.Equal(HTTPRedirect( + mockT1, httpOK, "GET", "/", nil, + "was expecting a 3xx status code. Got 200.", + ), false) + assert.True(mockT1.Failed()) + assert.Contains(mockT1.errorString(), "was expecting a 3xx status code. Got 200.") + + mockT2 := new(testing.T) + assert.Equal(HTTPRedirect(mockT2, httpRedirect, "GET", "/", nil), true) + assert.False(mockT2.Failed()) + + mockT3 := new(testing.T) + assert.Equal(HTTPRedirect(mockT3, httpError, "GET", "/", nil), false) + assert.True(mockT3.Failed()) + + mockT4 := new(testing.T) + assert.Equal(HTTPRedirect(mockT4, httpStatusCode, "GET", "/", nil), false) + assert.True(mockT4.Failed()) +} + +func TestHTTPError(t *testing.T) { + assert := New(t) + + mockT1 := new(testing.T) + assert.Equal(HTTPError(mockT1, httpOK, "GET", "/", nil), false) + assert.True(mockT1.Failed()) + + mockT2 := new(mockTestingT) + assert.Equal(HTTPError( + mockT2, httpRedirect, "GET", "/", nil, + "Expected this request to error out. But it didn't", + ), false) + assert.True(mockT2.Failed()) + assert.Contains(mockT2.errorString(), "Expected this request to error out. But it didn't") + + mockT3 := new(testing.T) + assert.Equal(HTTPError(mockT3, httpError, "GET", "/", nil), true) + assert.False(mockT3.Failed()) + + mockT4 := new(testing.T) + assert.Equal(HTTPError(mockT4, httpStatusCode, "GET", "/", nil), false) + assert.True(mockT4.Failed()) +} + +func TestHTTPStatusCode(t *testing.T) { + assert := New(t) + + mockT1 := new(testing.T) + assert.Equal(HTTPStatusCode(mockT1, httpOK, "GET", "/", nil, http.StatusSwitchingProtocols), false) + assert.True(mockT1.Failed()) + + mockT2 := new(testing.T) + assert.Equal(HTTPStatusCode(mockT2, httpRedirect, "GET", "/", nil, http.StatusSwitchingProtocols), false) + assert.True(mockT2.Failed()) + + mockT3 := new(mockTestingT) + assert.Equal(HTTPStatusCode( + mockT3, httpError, "GET", "/", nil, http.StatusSwitchingProtocols, + "Expected the status code to be %d", http.StatusSwitchingProtocols, + ), false) + assert.True(mockT3.Failed()) + assert.Contains(mockT3.errorString(), "Expected the status code to be 101") + + mockT4 := new(testing.T) + assert.Equal(HTTPStatusCode(mockT4, httpStatusCode, "GET", "/", nil, http.StatusSwitchingProtocols), true) + assert.False(mockT4.Failed()) +} + +func TestHTTPStatusesWrapper(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.Equal(mockAssert.HTTPSuccess(httpOK, "GET", "/", nil), true) + assert.Equal(mockAssert.HTTPSuccess(httpRedirect, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPSuccess(httpError, "GET", "/", nil), false) + + assert.Equal(mockAssert.HTTPRedirect(httpOK, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPRedirect(httpRedirect, "GET", "/", nil), true) + assert.Equal(mockAssert.HTTPRedirect(httpError, "GET", "/", nil), false) + + assert.Equal(mockAssert.HTTPError(httpOK, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPError(httpRedirect, "GET", "/", nil), false) + assert.Equal(mockAssert.HTTPError(httpError, "GET", "/", nil), true) +} + +func httpHelloName(w http.ResponseWriter, r *http.Request) { + name := r.FormValue("name") + _, _ = fmt.Fprintf(w, "Hello, %s!", name) +} + +func TestHTTPRequestWithNoParams(t *testing.T) { + var got *http.Request + handler := func(w http.ResponseWriter, r *http.Request) { + got = r + w.WriteHeader(http.StatusOK) + } + + True(t, HTTPSuccess(t, handler, "GET", "/url", nil)) + + Empty(t, got.URL.Query()) + Equal(t, "/url", got.URL.RequestURI()) +} + +func TestHTTPRequestWithParams(t *testing.T) { + var got *http.Request + handler := func(w http.ResponseWriter, r *http.Request) { + got = r + w.WriteHeader(http.StatusOK) + } + params := url.Values{} + params.Add("id", "12345") + + True(t, HTTPSuccess(t, handler, "GET", "/url", params)) + + Equal(t, url.Values{"id": []string{"12345"}}, got.URL.Query()) + Equal(t, "/url?id=12345", got.URL.String()) + Equal(t, "/url?id=12345", got.URL.RequestURI()) +} + +func TestHttpBody(t *testing.T) { + assert := New(t) + mockT := new(mockTestingT) + + assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.True(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.False(HTTPBodyContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) + + assert.False(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.False(HTTPBodyNotContains( + mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World", + "Expected the request body to not contain 'World'. But it did.", + )) + assert.True(HTTPBodyNotContains(mockT, httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) + assert.Contains(mockT.errorString(), "Expected the request body to not contain 'World'. But it did.") + + assert.True(HTTPBodyContains(mockT, httpReadBody, "GET", "/", nil, "hello")) +} + +func TestHttpBodyWrappers(t *testing.T) { + assert := New(t) + mockAssert := New(new(testing.T)) + + assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.True(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.False(mockAssert.HTTPBodyContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) + + assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "Hello, World!")) + assert.False(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "World")) + assert.True(mockAssert.HTTPBodyNotContains(httpHelloName, "GET", "/", url.Values{"name": []string{"World"}}, "world")) +} diff --git a/internal/testify/assert/internal/unsafetests/doc.go b/internal/testify/assert/internal/unsafetests/doc.go new file mode 100644 index 000000000..08172d511 --- /dev/null +++ b/internal/testify/assert/internal/unsafetests/doc.go @@ -0,0 +1,4 @@ +// This package exists just to isolate tests that reference the [unsafe] package. +// +// The tests in this package are totally safe. +package unsafetests diff --git a/internal/testify/assert/internal/unsafetests/unsafetests_test.go b/internal/testify/assert/internal/unsafetests/unsafetests_test.go new file mode 100644 index 000000000..47b66500f --- /dev/null +++ b/internal/testify/assert/internal/unsafetests/unsafetests_test.go @@ -0,0 +1,34 @@ +package unsafetests_test + +import ( + "fmt" + "testing" + "unsafe" + + "github.com/expr-lang/expr/internal/testify/assert" +) + +type ignoreTestingT struct{} + +var _ assert.TestingT = ignoreTestingT{} + +func (ignoreTestingT) Helper() {} + +func (ignoreTestingT) Errorf(format string, args ...interface{}) { + // Run the formatting, but ignore the result + msg := fmt.Sprintf(format, args...) + _ = msg +} + +func TestUnsafePointers(t *testing.T) { + var ignore ignoreTestingT + + assert.True(t, assert.Nil(t, unsafe.Pointer(nil), "unsafe.Pointer(nil) is nil")) + assert.False(t, assert.NotNil(ignore, unsafe.Pointer(nil), "unsafe.Pointer(nil) is nil")) + + assert.True(t, assert.Nil(t, unsafe.Pointer((*int)(nil)), "unsafe.Pointer((*int)(nil)) is nil")) + assert.False(t, assert.NotNil(ignore, unsafe.Pointer((*int)(nil)), "unsafe.Pointer((*int)(nil)) is nil")) + + assert.False(t, assert.Nil(ignore, unsafe.Pointer(new(int)), "unsafe.Pointer(new(int)) is NOT nil")) + assert.True(t, assert.NotNil(t, unsafe.Pointer(new(int)), "unsafe.Pointer(new(int)) is NOT nil")) +} diff --git a/internal/testify/require/doc.go b/internal/testify/require/doc.go new file mode 100644 index 000000000..a3a9ccc19 --- /dev/null +++ b/internal/testify/require/doc.go @@ -0,0 +1,29 @@ +// Package require implements the same assertions as the `assert` package but +// stops test execution when a test fails. +// +// # Example Usage +// +// The following is a complete example using require in a standard test function: +// +// import ( +// "testing" +// "github.com/expr-lang/expr/internal/testify/require" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// require.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// # Assertions +// +// The `require` package have same global functions as in the `assert` package, +// but instead of returning a boolean result they call `t.FailNow()`. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package require diff --git a/internal/testify/require/forward_requirements.go b/internal/testify/require/forward_requirements.go new file mode 100644 index 000000000..1dcb2338c --- /dev/null +++ b/internal/testify/require/forward_requirements.go @@ -0,0 +1,16 @@ +package require + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=require -template=require_forward.go.tmpl -include-format-funcs" diff --git a/internal/testify/require/forward_requirements_test.go b/internal/testify/require/forward_requirements_test.go new file mode 100644 index 000000000..818ecec6d --- /dev/null +++ b/internal/testify/require/forward_requirements_test.go @@ -0,0 +1,397 @@ +package require + +import ( + "errors" + "testing" + "time" +) + +func TestImplementsWrapper(t *testing.T) { + require := New(t) + + require.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Implements((*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestIsTypeWrapper(t *testing.T) { + require := New(t) + require.IsType(new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.IsType(new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqualWrapper(t *testing.T) { + require := New(t) + require.Equal(1, 1) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Equal(1, 2) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotEqualWrapper(t *testing.T) { + require := New(t) + require.NotEqual(1, 2) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotEqual(2, 2) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestExactlyWrapper(t *testing.T) { + require := New(t) + + a := float32(1) + b := float32(1) + c := float64(1) + + require.Exactly(a, b) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Exactly(a, c) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotNilWrapper(t *testing.T) { + require := New(t) + require.NotNil(t, new(AssertionTesterConformingObject)) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotNil(nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNilWrapper(t *testing.T) { + require := New(t) + require.Nil(nil) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Nil(new(AssertionTesterConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestTrueWrapper(t *testing.T) { + require := New(t) + require.True(true) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.True(false) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestFalseWrapper(t *testing.T) { + require := New(t) + require.False(false) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.False(true) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestContainsWrapper(t *testing.T) { + require := New(t) + require.Contains("Hello World", "Hello") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Contains("Hello World", "Salut") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotContainsWrapper(t *testing.T) { + require := New(t) + require.NotContains("Hello World", "Hello!") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotContains("Hello World", "Hello") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestPanicsWrapper(t *testing.T) { + require := New(t) + require.Panics(func() { + panic("Panic!") + }) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Panics(func() {}) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotPanicsWrapper(t *testing.T) { + require := New(t) + require.NotPanics(func() {}) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotPanics(func() { + panic("Panic!") + }) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNoErrorWrapper(t *testing.T) { + require := New(t) + require.NoError(nil) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NoError(errors.New("some error")) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestErrorWrapper(t *testing.T) { + require := New(t) + require.Error(errors.New("some error")) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Error(nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestErrorContainsWrapper(t *testing.T) { + require := New(t) + require.ErrorContains(errors.New("some error: another error"), "some error") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.ErrorContains(errors.New("some error: another error"), "different error") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqualErrorWrapper(t *testing.T) { + require := New(t) + require.EqualError(errors.New("some error"), "some error") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.EqualError(errors.New("some error"), "Not some error") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEmptyWrapper(t *testing.T) { + require := New(t) + require.Empty("") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Empty("x") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotEmptyWrapper(t *testing.T) { + require := New(t) + require.NotEmpty("x") + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotEmpty("") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestWithinDurationWrapper(t *testing.T) { + require := New(t) + a := time.Now() + b := a.Add(10 * time.Second) + + require.WithinDuration(a, b, 15*time.Second) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.WithinDuration(a, b, 5*time.Second) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestInDeltaWrapper(t *testing.T) { + require := New(t) + require.InDelta(1.001, 1, 0.01) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.InDelta(1, 2, 0.5) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestZeroWrapper(t *testing.T) { + require := New(t) + require.Zero(0) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.Zero(1) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotZeroWrapper(t *testing.T) { + require := New(t) + require.NotZero(1) + + mockT := new(MockT) + mockRequire := New(mockT) + mockRequire.NotZero(0) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_EqualSONString(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_EquivalentButNotEqual(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_HashOfArraysAndHashes(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq("{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}") + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_Array(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEqWrapper_HashAndArrayNotEquivalent(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_HashesNotEquivalent(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ActualIsNotJSON(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`{"foo": "bar"}`, "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ExpectedIsNotJSON(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq("Not JSON", `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ExpectedAndActualNotJSON(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq("Not JSON", "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEqWrapper_ArraysOfDifferentOrder(t *testing.T) { + mockT := new(MockT) + mockRequire := New(mockT) + + mockRequire.JSONEq(`["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`) + if !mockT.Failed { + t.Error("Check should fail") + } +} diff --git a/internal/testify/require/require.go b/internal/testify/require/require.go new file mode 100644 index 000000000..fb036865f --- /dev/null +++ b/internal/testify/require/require.go @@ -0,0 +1,2039 @@ +// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT. + +package require + +import ( + http "net/http" + url "net/url" + time "time" + + assert "github.com/expr-lang/expr/internal/testify/assert" +) + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Condition(t, comp, msgAndArgs...) { + return + } + t.FailNow() +} + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Conditionf(t, comp, msg, args...) { + return + } + t.FailNow() +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Contains(t, s, contains, msgAndArgs...) { + return + } + t.FailNow() +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Containsf(t, s, contains, msg, args...) { + return + } + t.FailNow() +} + +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func DirExists(t TestingT, path string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.DirExists(t, path, msgAndArgs...) { + return + } + t.FailNow() +} + +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func DirExistsf(t TestingT, path string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.DirExistsf(t, path, msg, args...) { + return + } + t.FailNow() +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ElementsMatch(t, listA, listB, msgAndArgs...) { + return + } + t.FailNow() +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ElementsMatchf(t, listA, listB, msg, args...) { + return + } + t.FailNow() +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Empty(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Emptyf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Equal(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualError(t, theError, errString, msgAndArgs...) { + return + } + t.FailNow() +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualErrorf(t, theError, errString, msg, args...) { + return + } + t.FailNow() +} + +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true +// assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false +func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualExportedValues(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualExportedValuesf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// EqualValues asserts that two objects are equal or convertible to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualValues(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// EqualValuesf asserts that two objects are equal or convertible to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualValuesf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Equalf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +func Error(t TestingT, err error, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Error(t, err, msgAndArgs...) { + return + } + t.FailNow() +} + +// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ErrorAs(t, err, target, msgAndArgs...) { + return + } + t.FailNow() +} + +// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ErrorAsf(t, err, target, msg, args...) { + return + } + t.FailNow() +} + +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// assert.ErrorContains(t, err, expectedErrorSubString) +func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ErrorContains(t, theError, contains, msgAndArgs...) { + return + } + t.FailNow() +} + +// ErrorContainsf asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") +func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ErrorContainsf(t, theError, contains, msg, args...) { + return + } + t.FailNow() +} + +// ErrorIs asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func ErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ErrorIs(t, err, target, msgAndArgs...) { + return + } + t.FailNow() +} + +// ErrorIsf asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.ErrorIsf(t, err, target, msg, args...) { + return + } + t.FailNow() +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func Errorf(t TestingT, err error, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Errorf(t, err, msg, args...) { + return + } + t.FailNow() +} + +// Eventually asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) +func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Eventually(t, condition, waitFor, tick, msgAndArgs...) { + return + } + t.FailNow() +} + +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithT(t, func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EventuallyWithT(t, condition, waitFor, tick, msgAndArgs...) { + return + } + t.FailNow() +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EventuallyWithTf(t, condition, waitFor, tick, msg, args...) { + return + } + t.FailNow() +} + +// Eventuallyf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Eventuallyf(t, condition, waitFor, tick, msg, args...) { + return + } + t.FailNow() +} + +// Exactly asserts that two objects are equal in value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Exactly(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Exactlyf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Fail(t, failureMessage, msgAndArgs...) { + return + } + t.FailNow() +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.FailNow(t, failureMessage, msgAndArgs...) { + return + } + t.FailNow() +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.FailNowf(t, failureMessage, msg, args...) { + return + } + t.FailNow() +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Failf(t, failureMessage, msg, args...) { + return + } + t.FailNow() +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +func False(t TestingT, value bool, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.False(t, value, msgAndArgs...) { + return + } + t.FailNow() +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +func Falsef(t TestingT, value bool, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Falsef(t, value, msg, args...) { + return + } + t.FailNow() +} + +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func FileExists(t TestingT, path string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.FileExists(t, path, msgAndArgs...) { + return + } + t.FailNow() +} + +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func FileExistsf(t TestingT, path string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.FileExistsf(t, path, msg, args...) { + return + } + t.FailNow() +} + +// Greater asserts that the first element is greater than the second +// +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") +func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Greater(t, e1, e2, msgAndArgs...) { + return + } + t.FailNow() +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") +func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.GreaterOrEqual(t, e1, e2, msgAndArgs...) { + return + } + t.FailNow() +} + +// GreaterOrEqualf asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") +func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.GreaterOrEqualf(t, e1, e2, msg, args...) { + return + } + t.FailNow() +} + +// Greaterf asserts that the first element is greater than the second +// +// assert.Greaterf(t, 2, 1, "error message %s", "formatted") +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") +// assert.Greaterf(t, "b", "a", "error message %s", "formatted") +func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Greaterf(t, e1, e2, msg, args...) { + return + } + t.FailNow() +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPBodyContains(t, handler, method, url, values, str, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPBodyContainsf(t, handler, method, url, values, str, msg, args...) { + return + } + t.FailNow() +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPBodyNotContains(t, handler, method, url, values, str, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPBodyNotContainsf(t, handler, method, url, values, str, msg, args...) { + return + } + t.FailNow() +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPError(t, handler, method, url, values, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPErrorf(t, handler, method, url, values, msg, args...) { + return + } + t.FailNow() +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPRedirect(t, handler, method, url, values, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPRedirectf(t, handler, method, url, values, msg, args...) { + return + } + t.FailNow() +} + +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPStatusCode(t, handler, method, url, values, statuscode, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPStatusCodef(t, handler, method, url, values, statuscode, msg, args...) { + return + } + t.FailNow() +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPSuccess(t, handler, method, url, values, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPSuccessf(t, handler, method, url, values, msg, args...) { + return + } + t.FailNow() +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Implements(t, interfaceObject, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Implementsf(t, interfaceObject, object, msg, args...) { + return + } + t.FailNow() +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, 22/7.0, 0.01) +func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InDelta(t, expected, actual, delta, msgAndArgs...) { + return + } + t.FailNow() +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValues(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InDeltaMapValues(t, expected, actual, delta, msgAndArgs...) { + return + } + t.FailNow() +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InDeltaMapValuesf(t, expected, actual, delta, msg, args...) { + return + } + t.FailNow() +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { + return + } + t.FailNow() +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) { + return + } + t.FailNow() +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InDeltaf(t, expected, actual, delta, msg, args...) { + return + } + t.FailNow() +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { + return + } + t.FailNow() +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) { + return + } + t.FailNow() +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) { + return + } + t.FailNow() +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) { + return + } + t.FailNow() +} + +// IsDecreasing asserts that the collection is decreasing +// +// assert.IsDecreasing(t, []int{2, 1, 0}) +// assert.IsDecreasing(t, []float{2, 1}) +// assert.IsDecreasing(t, []string{"b", "a"}) +func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsDecreasing(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// IsDecreasingf asserts that the collection is decreasing +// +// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsDecreasingf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// IsIncreasing asserts that the collection is increasing +// +// assert.IsIncreasing(t, []int{1, 2, 3}) +// assert.IsIncreasing(t, []float{1, 2}) +// assert.IsIncreasing(t, []string{"a", "b"}) +func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsIncreasing(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// IsIncreasingf asserts that the collection is increasing +// +// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsIncreasingf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// IsNonDecreasing asserts that the collection is not decreasing +// +// assert.IsNonDecreasing(t, []int{1, 1, 2}) +// assert.IsNonDecreasing(t, []float{1, 2}) +// assert.IsNonDecreasing(t, []string{"a", "b"}) +func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsNonDecreasing(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// IsNonDecreasingf asserts that the collection is not decreasing +// +// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsNonDecreasingf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// IsNonIncreasing asserts that the collection is not increasing +// +// assert.IsNonIncreasing(t, []int{2, 1, 1}) +// assert.IsNonIncreasing(t, []float{2, 1}) +// assert.IsNonIncreasing(t, []string{"b", "a"}) +func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsNonIncreasing(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// IsNonIncreasingf asserts that the collection is not increasing +// +// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsNonIncreasingf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsType(t, expectedType, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.IsTypef(t, expectedType, object, msg, args...) { + return + } + t.FailNow() +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.JSONEq(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.JSONEqf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Len(t, object, length, msgAndArgs...) { + return + } + t.FailNow() +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Lenf(t, object, length, msg, args...) { + return + } + t.FailNow() +} + +// Less asserts that the first element is less than the second +// +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") +func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Less(t, e1, e2, msgAndArgs...) { + return + } + t.FailNow() +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") +func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.LessOrEqual(t, e1, e2, msgAndArgs...) { + return + } + t.FailNow() +} + +// LessOrEqualf asserts that the first element is less than or equal to the second +// +// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") +func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.LessOrEqualf(t, e1, e2, msg, args...) { + return + } + t.FailNow() +} + +// Lessf asserts that the first element is less than the second +// +// assert.Lessf(t, 1, 2, "error message %s", "formatted") +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") +// assert.Lessf(t, "a", "b", "error message %s", "formatted") +func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Lessf(t, e1, e2, msg, args...) { + return + } + t.FailNow() +} + +// Negative asserts that the specified element is negative +// +// assert.Negative(t, -1) +// assert.Negative(t, -1.23) +func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Negative(t, e, msgAndArgs...) { + return + } + t.FailNow() +} + +// Negativef asserts that the specified element is negative +// +// assert.Negativef(t, -1, "error message %s", "formatted") +// assert.Negativef(t, -1.23, "error message %s", "formatted") +func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Negativef(t, e, msg, args...) { + return + } + t.FailNow() +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Never(t, condition, waitFor, tick, msgAndArgs...) { + return + } + t.FailNow() +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Neverf(t, condition, waitFor, tick, msg, args...) { + return + } + t.FailNow() +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Nil(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Nilf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NoDirExists(t, path, msgAndArgs...) { + return + } + t.FailNow() +} + +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NoDirExistsf(t, path, msg, args...) { + return + } + t.FailNow() +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoError(t TestingT, err error, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NoError(t, err, msgAndArgs...) { + return + } + t.FailNow() +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NoErrorf(t, err, msg, args...) { + return + } + t.FailNow() +} + +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NoFileExists(t, path, msgAndArgs...) { + return + } + t.FailNow() +} + +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NoFileExistsf(t, path, msg, args...) { + return + } + t.FailNow() +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotContains(t, s, contains, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotContainsf(t, s, contains, msg, args...) { + return + } + t.FailNow() +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEmpty(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEmptyf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqual(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualValues(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualValuesf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// NotErrorIs asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func NotErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotErrorIs(t, err, target, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotErrorIsf(t, err, target, msg, args...) { + return + } + t.FailNow() +} + +// NotImplements asserts that an object does not implement the specified interface. +// +// assert.NotImplements(t, (*MyInterface)(nil), new(MyObject)) +func NotImplements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotImplements(t, interfaceObject, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotImplementsf asserts that an object does not implement the specified interface. +// +// assert.NotImplementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func NotImplementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotImplementsf(t, interfaceObject, object, msg, args...) { + return + } + t.FailNow() +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotNil(t, object, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotNilf(t, object, msg, args...) { + return + } + t.FailNow() +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotPanics(t, f, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotPanicsf(t, f, msg, args...) { + return + } + t.FailNow() +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotRegexp(t, rx, str, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotRegexpf(t, rx, str, msg, args...) { + return + } + t.FailNow() +} + +// NotSame asserts that two pointers do not reference the same object. +// +// assert.NotSame(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotSame(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotSamef asserts that two pointers do not reference the same object. +// +// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotSamef(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// NotSubset asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// assert.NotSubset(t, [1, 3, 4], [1, 2]) +// assert.NotSubset(t, {"x": 1, "y": 2}, {"z": 3}) +func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotSubset(t, list, subset, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotSubsetf asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "error message %s", "formatted") +// assert.NotSubsetf(t, {"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotSubsetf(t, list, subset, msg, args...) { + return + } + t.FailNow() +} + +// NotZero asserts that i is not the zero value for its type. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotZero(t, i, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotZerof asserts that i is not the zero value for its type. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotZerof(t, i, msg, args...) { + return + } + t.FailNow() +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Panics(t, f, msgAndArgs...) { + return + } + t.FailNow() +} + +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.PanicsWithError(t, errString, f, msgAndArgs...) { + return + } + t.FailNow() +} + +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.PanicsWithErrorf(t, errString, f, msg, args...) { + return + } + t.FailNow() +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.PanicsWithValue(t, expected, f, msgAndArgs...) { + return + } + t.FailNow() +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.PanicsWithValuef(t, expected, f, msg, args...) { + return + } + t.FailNow() +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Panicsf(t, f, msg, args...) { + return + } + t.FailNow() +} + +// Positive asserts that the specified element is positive +// +// assert.Positive(t, 1) +// assert.Positive(t, 1.23) +func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Positive(t, e, msgAndArgs...) { + return + } + t.FailNow() +} + +// Positivef asserts that the specified element is positive +// +// assert.Positivef(t, 1, "error message %s", "formatted") +// assert.Positivef(t, 1.23, "error message %s", "formatted") +func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Positivef(t, e, msg, args...) { + return + } + t.FailNow() +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Regexp(t, rx, str, msgAndArgs...) { + return + } + t.FailNow() +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Regexpf(t, rx, str, msg, args...) { + return + } + t.FailNow() +} + +// Same asserts that two pointers reference the same object. +// +// assert.Same(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Same(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// Samef asserts that two pointers reference the same object. +// +// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func Samef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Samef(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + +// Subset asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// assert.Subset(t, [1, 2, 3], [1, 2]) +// assert.Subset(t, {"x": 1, "y": 2}, {"x": 1}) +func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Subset(t, list, subset, msgAndArgs...) { + return + } + t.FailNow() +} + +// Subsetf asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "error message %s", "formatted") +// assert.Subsetf(t, {"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Subsetf(t, list, subset, msg, args...) { + return + } + t.FailNow() +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +func True(t TestingT, value bool, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.True(t, value, msgAndArgs...) { + return + } + t.FailNow() +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +func Truef(t TestingT, value bool, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Truef(t, value, msg, args...) { + return + } + t.FailNow() +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { + return + } + t.FailNow() +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinDurationf(t, expected, actual, delta, msg, args...) { + return + } + t.FailNow() +} + +// WithinRange asserts that a time is within a time range (inclusive). +// +// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinRange(t, actual, start, end, msgAndArgs...) { + return + } + t.FailNow() +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinRangef(t, actual, start, end, msg, args...) { + return + } + t.FailNow() +} + +// Zero asserts that i is the zero value for its type. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Zero(t, i, msgAndArgs...) { + return + } + t.FailNow() +} + +// Zerof asserts that i is the zero value for its type. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.Zerof(t, i, msg, args...) { + return + } + t.FailNow() +} diff --git a/internal/testify/require/require.go.tmpl b/internal/testify/require/require.go.tmpl new file mode 100644 index 000000000..55e42ddeb --- /dev/null +++ b/internal/testify/require/require.go.tmpl @@ -0,0 +1,6 @@ +{{.Comment}} +func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { + if h, ok := t.(tHelper); ok { h.Helper() } + if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return } + t.FailNow() +} diff --git a/internal/testify/require/require_forward.go b/internal/testify/require/require_forward.go new file mode 100644 index 000000000..4cf7154f6 --- /dev/null +++ b/internal/testify/require/require_forward.go @@ -0,0 +1,1607 @@ +// Code generated with github.com/expr-lang/expr/internal/_codegen; DO NOT EDIT. + +package require + +import ( + http "net/http" + url "net/url" + time "time" + + assert "github.com/expr-lang/expr/internal/testify/assert" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Containsf(a.t, s, contains, msg, args...) +} + +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + DirExists(a.t, path, msgAndArgs...) +} + +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. +func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + DirExistsf(a.t, path, msg, args...) +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) +func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ElementsMatch(a.t, listA, listB, msgAndArgs...) +} + +// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") +func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ElementsMatchf(a.t, listA, listB, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValues(S{1, 2}, S{1, 3}) => true +// a.EqualExportedValues(S{1, 2}, S{2, 3}) => false +func (a *Assertions) EqualExportedValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualExportedValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValuesf(S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// a.EqualExportedValuesf(S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualExportedValuesf(a.t, expected, actual, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertible to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertible to the same types +// and equal. +// +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Error(a.t, err, msgAndArgs...) +} + +// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func (a *Assertions) ErrorAs(err error, target interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ErrorAs(a.t, err, target, msgAndArgs...) +} + +// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ErrorAsf(a.t, err, target, msg, args...) +} + +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// a.ErrorContains(err, expectedErrorSubString) +func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ErrorContains(a.t, theError, contains, msgAndArgs...) +} + +// ErrorContainsf asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +// +// actualObj, err := SomeFunction() +// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted") +func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ErrorContainsf(a.t, theError, contains, msg, args...) +} + +// ErrorIs asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ErrorIs(a.t, err, target, msgAndArgs...) +} + +// ErrorIsf asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + ErrorIsf(a.t, err, target, msg, args...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Errorf(a.t, err, msg, args...) +} + +// Eventually asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Eventually(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithT(func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EventuallyWithT(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EventuallyWithTf(a.t, condition, waitFor, tick, msg, args...) +} + +// Eventuallyf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. +// +// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Eventuallyf(a.t, condition, waitFor, tick, msg, args...) +} + +// Exactly asserts that two objects are equal in value and type. +// +// a.Exactly(int32(123), int64(123)) +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal in value and type. +// +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Falsef(a.t, value, msg, args...) +} + +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + FileExists(a.t, path, msgAndArgs...) +} + +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. +func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + FileExistsf(a.t, path, msg, args...) +} + +// Greater asserts that the first element is greater than the second +// +// a.Greater(2, 1) +// a.Greater(float64(2), float64(1)) +// a.Greater("b", "a") +func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Greater(a.t, e1, e2, msgAndArgs...) +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// a.GreaterOrEqual(2, 1) +// a.GreaterOrEqual(2, 2) +// a.GreaterOrEqual("b", "a") +// a.GreaterOrEqual("b", "b") +func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + GreaterOrEqual(a.t, e1, e2, msgAndArgs...) +} + +// GreaterOrEqualf asserts that the first element is greater than or equal to the second +// +// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") +// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") +// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") +// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") +func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + GreaterOrEqualf(a.t, e1, e2, msg, args...) +} + +// Greaterf asserts that the first element is greater than the second +// +// a.Greaterf(2, 1, "error message %s", "formatted") +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") +// a.Greaterf("b", "a", "error message %s", "formatted") +func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Greaterf(a.t, e1, e2, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPError(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPErrorf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPRedirectf(a.t, handler, method, url, values, msg, args...) +} + +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPSuccessf(a.t, handler, method, url, values, msg, args...) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, 22/7.0, 0.01) +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. +func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsDecreasing asserts that the collection is decreasing +// +// a.IsDecreasing([]int{2, 1, 0}) +// a.IsDecreasing([]float{2, 1}) +// a.IsDecreasing([]string{"b", "a"}) +func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsDecreasing(a.t, object, msgAndArgs...) +} + +// IsDecreasingf asserts that the collection is decreasing +// +// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") +// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") +func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsDecreasingf(a.t, object, msg, args...) +} + +// IsIncreasing asserts that the collection is increasing +// +// a.IsIncreasing([]int{1, 2, 3}) +// a.IsIncreasing([]float{1, 2}) +// a.IsIncreasing([]string{"a", "b"}) +func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsIncreasing(a.t, object, msgAndArgs...) +} + +// IsIncreasingf asserts that the collection is increasing +// +// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") +// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") +func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsIncreasingf(a.t, object, msg, args...) +} + +// IsNonDecreasing asserts that the collection is not decreasing +// +// a.IsNonDecreasing([]int{1, 1, 2}) +// a.IsNonDecreasing([]float{1, 2}) +// a.IsNonDecreasing([]string{"a", "b"}) +func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsNonDecreasing(a.t, object, msgAndArgs...) +} + +// IsNonDecreasingf asserts that the collection is not decreasing +// +// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") +func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsNonDecreasingf(a.t, object, msg, args...) +} + +// IsNonIncreasing asserts that the collection is not increasing +// +// a.IsNonIncreasing([]int{2, 1, 1}) +// a.IsNonIncreasing([]float{2, 1}) +// a.IsNonIncreasing([]string{"b", "a"}) +func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsNonIncreasing(a.t, object, msgAndArgs...) +} + +// IsNonIncreasingf asserts that the collection is not increasing +// +// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") +func (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsNonIncreasingf(a.t, object, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Lenf(a.t, object, length, msg, args...) +} + +// Less asserts that the first element is less than the second +// +// a.Less(1, 2) +// a.Less(float64(1), float64(2)) +// a.Less("a", "b") +func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Less(a.t, e1, e2, msgAndArgs...) +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// a.LessOrEqual(1, 2) +// a.LessOrEqual(2, 2) +// a.LessOrEqual("a", "b") +// a.LessOrEqual("b", "b") +func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + LessOrEqual(a.t, e1, e2, msgAndArgs...) +} + +// LessOrEqualf asserts that the first element is less than or equal to the second +// +// a.LessOrEqualf(1, 2, "error message %s", "formatted") +// a.LessOrEqualf(2, 2, "error message %s", "formatted") +// a.LessOrEqualf("a", "b", "error message %s", "formatted") +// a.LessOrEqualf("b", "b", "error message %s", "formatted") +func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + LessOrEqualf(a.t, e1, e2, msg, args...) +} + +// Lessf asserts that the first element is less than the second +// +// a.Lessf(1, 2, "error message %s", "formatted") +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") +// a.Lessf("a", "b", "error message %s", "formatted") +func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Lessf(a.t, e1, e2, msg, args...) +} + +// Negative asserts that the specified element is negative +// +// a.Negative(-1) +// a.Negative(-1.23) +func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Negative(a.t, e, msgAndArgs...) +} + +// Negativef asserts that the specified element is negative +// +// a.Negativef(-1, "error message %s", "formatted") +// a.Negativef(-1.23, "error message %s", "formatted") +func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Negativef(a.t, e, msg, args...) +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Never(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Neverf(a.t, condition, waitFor, tick, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Nilf(a.t, object, msg, args...) +} + +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NoDirExists(a.t, path, msgAndArgs...) +} + +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NoDirExistsf(a.t, path, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NoErrorf(a.t, err, msg, args...) +} + +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NoFileExists(a.t, path, msgAndArgs...) +} + +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NoFileExistsf(a.t, path, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualValuesf(a.t, expected, actual, msg, args...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotErrorIs asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotErrorIs(a.t, err, target, msgAndArgs...) +} + +// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotErrorIsf(a.t, err, target, msg, args...) +} + +// NotImplements asserts that an object does not implement the specified interface. +// +// a.NotImplements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) NotImplements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotImplements(a.t, interfaceObject, object, msgAndArgs...) +} + +// NotImplementsf asserts that an object does not implement the specified interface. +// +// a.NotImplementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +func (a *Assertions) NotImplementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotImplementsf(a.t, interfaceObject, object, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSame asserts that two pointers do not reference the same object. +// +// a.NotSame(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotSame(a.t, expected, actual, msgAndArgs...) +} + +// NotSamef asserts that two pointers do not reference the same object. +// +// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotSamef(a.t, expected, actual, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// a.NotSubset([1, 3, 4], [1, 2]) +// a.NotSubset({"x": 1, "y": 2}, {"z": 3}) +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) or map does NOT +// contain all elements given in the specified subset list(array, slice...) or +// map. +// +// a.NotSubsetf([1, 3, 4], [1, 2], "error message %s", "formatted") +// a.NotSubsetf({"x": 1, "y": 2}, {"z": 3}, "error message %s", "formatted") +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithError("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithError(errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + PanicsWithError(a.t, errString, f, msgAndArgs...) +} + +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithErrorf(errString string, f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + PanicsWithErrorf(a.t, errString, f, msg, args...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Panicsf(a.t, f, msg, args...) +} + +// Positive asserts that the specified element is positive +// +// a.Positive(1) +// a.Positive(1.23) +func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Positive(a.t, e, msgAndArgs...) +} + +// Positivef asserts that the specified element is positive +// +// a.Positivef(1, "error message %s", "formatted") +// a.Positivef(1.23, "error message %s", "formatted") +func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Positivef(a.t, e, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Regexpf(a.t, rx, str, msg, args...) +} + +// Same asserts that two pointers reference the same object. +// +// a.Same(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Same(a.t, expected, actual, msgAndArgs...) +} + +// Samef asserts that two pointers reference the same object. +// +// a.Samef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Samef(a.t, expected, actual, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// a.Subset([1, 2, 3], [1, 2]) +// a.Subset({"x": 1, "y": 2}, {"x": 1}) +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) or map contains all +// elements given in the specified subset list(array, slice...) or map. +// +// a.Subsetf([1, 2, 3], [1, 2], "error message %s", "formatted") +// a.Subsetf({"x": 1, "y": 2}, {"x": 1}, "error message %s", "formatted") +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// WithinRange asserts that a time is within a time range (inclusive). +// +// a.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinRange(a.t, actual, start, end, msgAndArgs...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// a.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinRangef(a.t, actual, start, end, msg, args...) +} + +// Zero asserts that i is the zero value for its type. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + Zerof(a.t, i, msg, args...) +} diff --git a/internal/testify/require/require_forward.go.tmpl b/internal/testify/require/require_forward.go.tmpl new file mode 100644 index 000000000..54124df1d --- /dev/null +++ b/internal/testify/require/require_forward.go.tmpl @@ -0,0 +1,5 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { + if h, ok := a.t.(tHelper); ok { h.Helper() } + {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/internal/testify/require/requirements.go b/internal/testify/require/requirements.go new file mode 100644 index 000000000..6b7ce929e --- /dev/null +++ b/internal/testify/require/requirements.go @@ -0,0 +1,29 @@ +package require + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +type tHelper = interface { + Helper() +} + +// ComparisonAssertionFunc is a common function prototype when comparing two values. Can be useful +// for table driven tests. +type ComparisonAssertionFunc func(TestingT, interface{}, interface{}, ...interface{}) + +// ValueAssertionFunc is a common function prototype when validating a single value. Can be useful +// for table driven tests. +type ValueAssertionFunc func(TestingT, interface{}, ...interface{}) + +// BoolAssertionFunc is a common function prototype when validating a bool value. Can be useful +// for table driven tests. +type BoolAssertionFunc func(TestingT, bool, ...interface{}) + +// ErrorAssertionFunc is a common function prototype when validating an error value. Can be useful +// for table driven tests. +type ErrorAssertionFunc func(TestingT, error, ...interface{}) + +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=require -template=require.go.tmpl -include-format-funcs" diff --git a/internal/testify/require/requirements_test.go b/internal/testify/require/requirements_test.go new file mode 100644 index 000000000..1f6eff463 --- /dev/null +++ b/internal/testify/require/requirements_test.go @@ -0,0 +1,578 @@ +package require + +import ( + "encoding/json" + "errors" + "testing" + "time" +) + +// AssertionTesterInterface defines an interface to be used for testing assertion methods +type AssertionTesterInterface interface { + TestMethod() +} + +// AssertionTesterConformingObject is an object that conforms to the AssertionTesterInterface interface +type AssertionTesterConformingObject struct { +} + +func (a *AssertionTesterConformingObject) TestMethod() { +} + +// AssertionTesterNonConformingObject is an object that does not conform to the AssertionTesterInterface interface +type AssertionTesterNonConformingObject struct { +} + +type MockT struct { + Failed bool +} + +func (t *MockT) FailNow() { + t.Failed = true +} + +func (t *MockT) Errorf(format string, args ...interface{}) { + _, _ = format, args +} + +func TestImplements(t *testing.T) { + + Implements(t, (*AssertionTesterInterface)(nil), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + Implements(mockT, (*AssertionTesterInterface)(nil), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestIsType(t *testing.T) { + + IsType(t, new(AssertionTesterConformingObject), new(AssertionTesterConformingObject)) + + mockT := new(MockT) + IsType(mockT, new(AssertionTesterConformingObject), new(AssertionTesterNonConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqual(t *testing.T) { + + Equal(t, 1, 1) + + mockT := new(MockT) + Equal(mockT, 1, 2) + if !mockT.Failed { + t.Error("Check should fail") + } + +} + +func TestNotEqual(t *testing.T) { + + NotEqual(t, 1, 2) + mockT := new(MockT) + NotEqual(mockT, 2, 2) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestExactly(t *testing.T) { + + a := float32(1) + b := float32(1) + c := float64(1) + + Exactly(t, a, b) + + mockT := new(MockT) + Exactly(mockT, a, c) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotNil(t *testing.T) { + + NotNil(t, new(AssertionTesterConformingObject)) + + mockT := new(MockT) + NotNil(mockT, nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNil(t *testing.T) { + + Nil(t, nil) + + mockT := new(MockT) + Nil(mockT, new(AssertionTesterConformingObject)) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestTrue(t *testing.T) { + + True(t, true) + + mockT := new(MockT) + True(mockT, false) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestFalse(t *testing.T) { + + False(t, false) + + mockT := new(MockT) + False(mockT, true) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestContains(t *testing.T) { + + Contains(t, "Hello World", "Hello") + + mockT := new(MockT) + Contains(mockT, "Hello World", "Salut") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotContains(t *testing.T) { + + NotContains(t, "Hello World", "Hello!") + + mockT := new(MockT) + NotContains(mockT, "Hello World", "Hello") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestPanics(t *testing.T) { + + Panics(t, func() { + panic("Panic!") + }) + + mockT := new(MockT) + Panics(mockT, func() {}) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotPanics(t *testing.T) { + + NotPanics(t, func() {}) + + mockT := new(MockT) + NotPanics(mockT, func() { + panic("Panic!") + }) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNoError(t *testing.T) { + + NoError(t, nil) + + mockT := new(MockT) + NoError(mockT, errors.New("some error")) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestError(t *testing.T) { + + Error(t, errors.New("some error")) + + mockT := new(MockT) + Error(mockT, nil) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestErrorContains(t *testing.T) { + + ErrorContains(t, errors.New("some error: another error"), "some error") + + mockT := new(MockT) + ErrorContains(mockT, errors.New("some error"), "different error") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEqualError(t *testing.T) { + + EqualError(t, errors.New("some error"), "some error") + + mockT := new(MockT) + EqualError(mockT, errors.New("some error"), "Not some error") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestEmpty(t *testing.T) { + + Empty(t, "") + + mockT := new(MockT) + Empty(mockT, "x") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotEmpty(t *testing.T) { + + NotEmpty(t, "x") + + mockT := new(MockT) + NotEmpty(mockT, "") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestWithinDuration(t *testing.T) { + + a := time.Now() + b := a.Add(10 * time.Second) + + WithinDuration(t, a, b, 15*time.Second) + + mockT := new(MockT) + WithinDuration(mockT, a, b, 5*time.Second) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestInDelta(t *testing.T) { + + InDelta(t, 1.001, 1, 0.01) + + mockT := new(MockT) + InDelta(mockT, 1, 2, 0.5) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestZero(t *testing.T) { + + Zero(t, "") + + mockT := new(MockT) + Zero(mockT, "x") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestNotZero(t *testing.T) { + + NotZero(t, "x") + + mockT := new(MockT) + NotZero(mockT, "") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_EqualSONString(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"hello": "world", "foo": "bar"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_EquivalentButNotEqual(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_HashOfArraysAndHashes(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, "{\r\n\t\"numeric\": 1.5,\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]],\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\"\r\n}", + "{\r\n\t\"numeric\": 1.5,\r\n\t\"hash\": {\"nested\": \"hash\", \"nested_slice\": [\"this\", \"is\", \"nested\"]},\r\n\t\"string\": \"foo\",\r\n\t\"array\": [{\"foo\": \"bar\"}, 1, \"string\", [\"nested\", \"array\", 5.5]]\r\n}") + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_Array(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `["foo", {"nested": "hash", "hello": "world"}]`) + if mockT.Failed { + t.Error("Check should pass") + } +} + +func TestJSONEq_HashAndArrayNotEquivalent(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `{"foo": "bar", {"nested": "hash", "hello": "world"}}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_HashesNotEquivalent(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ActualIsNotJSON(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `{"foo": "bar"}`, "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ExpectedIsNotJSON(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, "Not JSON", `{"foo": "bar", "hello": "world"}`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ExpectedAndActualNotJSON(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, "Not JSON", "Not JSON") + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func TestJSONEq_ArraysOfDifferentOrder(t *testing.T) { + mockT := new(MockT) + JSONEq(mockT, `["foo", {"hello": "world", "nested": "hash"}]`, `[{ "hello": "world", "nested": "hash"}, "foo"]`) + if !mockT.Failed { + t.Error("Check should fail") + } +} + +func ExampleComparisonAssertionFunc() { + t := &testing.T{} // provided by test + + adder := func(x, y int) int { + return x + y + } + + type args struct { + x int + y int + } + + tests := []struct { + name string + args args + expect int + assertion ComparisonAssertionFunc + }{ + {"2+2=4", args{2, 2}, 4, Equal}, + {"2+2!=5", args{2, 2}, 5, NotEqual}, + {"2+3==5", args{2, 3}, 5, Exactly}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.expect, adder(tt.args.x, tt.args.y)) + }) + } +} + +func TestComparisonAssertionFunc(t *testing.T) { + type iface interface { + Name() string + } + + tests := []struct { + name string + expect interface{} + got interface{} + assertion ComparisonAssertionFunc + }{ + {"implements", (*iface)(nil), t, Implements}, + {"isType", (*testing.T)(nil), t, IsType}, + {"equal", t, t, Equal}, + {"equalValues", t, t, EqualValues}, + {"exactly", t, t, Exactly}, + {"notEqual", t, nil, NotEqual}, + {"NotEqualValues", t, nil, NotEqualValues}, + {"notContains", []int{1, 2, 3}, 4, NotContains}, + {"subset", []int{1, 2, 3, 4}, []int{2, 3}, Subset}, + {"notSubset", []int{1, 2, 3, 4}, []int{0, 3}, NotSubset}, + {"elementsMatch", []byte("abc"), []byte("bac"), ElementsMatch}, + {"regexp", "^t.*y$", "testify", Regexp}, + {"notRegexp", "^t.*y$", "Testify", NotRegexp}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.expect, tt.got) + }) + } +} + +func ExampleValueAssertionFunc() { + t := &testing.T{} // provided by test + + dumbParse := func(input string) interface{} { + var x interface{} + json.Unmarshal([]byte(input), &x) + return x + } + + tests := []struct { + name string + arg string + assertion ValueAssertionFunc + }{ + {"true is not nil", "true", NotNil}, + {"empty string is nil", "", Nil}, + {"zero is not nil", "0", NotNil}, + {"zero is zero", "0", Zero}, + {"false is zero", "false", Zero}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, dumbParse(tt.arg)) + }) + } +} + +func TestValueAssertionFunc(t *testing.T) { + tests := []struct { + name string + value interface{} + assertion ValueAssertionFunc + }{ + {"notNil", true, NotNil}, + {"nil", nil, Nil}, + {"empty", []int{}, Empty}, + {"notEmpty", []int{1}, NotEmpty}, + {"zero", false, Zero}, + {"notZero", 42, NotZero}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.value) + }) + } +} + +func ExampleBoolAssertionFunc() { + t := &testing.T{} // provided by test + + isOkay := func(x int) bool { + return x >= 42 + } + + tests := []struct { + name string + arg int + assertion BoolAssertionFunc + }{ + {"-1 is bad", -1, False}, + {"42 is good", 42, True}, + {"41 is bad", 41, False}, + {"45 is cool", 45, True}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, isOkay(tt.arg)) + }) + } +} + +func TestBoolAssertionFunc(t *testing.T) { + tests := []struct { + name string + value bool + assertion BoolAssertionFunc + }{ + {"true", true, True}, + {"false", false, False}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.value) + }) + } +} + +func ExampleErrorAssertionFunc() { + t := &testing.T{} // provided by test + + dumbParseNum := func(input string, v interface{}) error { + return json.Unmarshal([]byte(input), v) + } + + tests := []struct { + name string + arg string + assertion ErrorAssertionFunc + }{ + {"1.2 is number", "1.2", NoError}, + {"1.2.3 not number", "1.2.3", Error}, + {"true is not number", "true", Error}, + {"3 is number", "3", NoError}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var x float64 + tt.assertion(t, dumbParseNum(tt.arg, &x)) + }) + } +} + +func TestErrorAssertionFunc(t *testing.T) { + tests := []struct { + name string + err error + assertion ErrorAssertionFunc + }{ + {"noError", nil, NoError}, + {"error", errors.New("whoops"), Error}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.assertion(t, tt.err) + }) + } +} diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 3c7947c09..0ff4b4901 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -6,8 +6,8 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" diff --git a/optimizer/sum_array_test.go b/optimizer/sum_array_test.go index 09286c22b..6ff93e350 100644 --- a/optimizer/sum_array_test.go +++ b/optimizer/sum_array_test.go @@ -3,8 +3,8 @@ package optimizer_test import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" diff --git a/optimizer/sum_map_test.go b/optimizer/sum_map_test.go index 0ce3203e2..96bdcfd35 100644 --- a/optimizer/sum_map_test.go +++ b/optimizer/sum_map_test.go @@ -3,8 +3,8 @@ package optimizer_test import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/optimizer" diff --git a/parser/lexer/lexer_test.go b/parser/lexer/lexer_test.go index 442fd4dbd..f30d3ba11 100644 --- a/parser/lexer/lexer_test.go +++ b/parser/lexer/lexer_test.go @@ -5,8 +5,8 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr/file" . "github.com/expr-lang/expr/parser/lexer" diff --git a/parser/parser_test.go b/parser/parser_test.go index 2a30787a0..bb0fc078b 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -5,8 +5,8 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" . "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/parser" diff --git a/patcher/value/bench_test.go b/patcher/value/bench_test.go index d6a1aae89..f72ed53e0 100644 --- a/patcher/value/bench_test.go +++ b/patcher/value/bench_test.go @@ -3,7 +3,7 @@ package value import ( "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/vm" diff --git a/patcher/value/value_test.go b/patcher/value/value_test.go index 1b6c5527a..30c8a56ad 100644 --- a/patcher/value/value_test.go +++ b/patcher/value/value_test.go @@ -3,7 +3,7 @@ package value import ( "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/vm" diff --git a/patcher/with_context_test.go b/patcher/with_context_test.go index 5ce64191f..278705334 100644 --- a/patcher/with_context_test.go +++ b/patcher/with_context_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/patcher" diff --git a/patcher/with_timezone_test.go b/patcher/with_timezone_test.go index 2cd099f20..a1adf9bc9 100644 --- a/patcher/with_timezone_test.go +++ b/patcher/with_timezone_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" ) diff --git a/repl/go.mod b/repl/go.mod index b96e6a3be..cdd4f1b7c 100644 --- a/repl/go.mod +++ b/repl/go.mod @@ -3,9 +3,9 @@ module github.com/expr-lang/expr/repl go 1.20 require ( + github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf github.com/expr-lang/expr v1.13.0 github.com/expr-lang/expr/debug v0.0.0 - github.com/bettercap/readline v0.0.0-20210228151553-655e48bcb7bf ) require ( diff --git a/repl/go.sum b/repl/go.sum index b584a8acf..824246de9 100644 --- a/repl/go.sum +++ b/repl/go.sum @@ -4,7 +4,6 @@ github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= @@ -14,14 +13,12 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703 h1:ZyM/+FYnpbZsFWuCohniM56kRoHRB4r5EuIzXEYkpxo= github.com/rivo/tview v0.0.0-20230814110005-ccc2c8119703/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -54,4 +51,3 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/test/coredns/coredns_test.go b/test/coredns/coredns_test.go index 97eb3768f..980a25e77 100644 --- a/test/coredns/coredns_test.go +++ b/test/coredns/coredns_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/test/coredns" - "github.com/stretchr/testify/assert" ) func TestCoreDNS(t *testing.T) { diff --git a/test/crowdsec/crowdsec_test.go b/test/crowdsec/crowdsec_test.go index 2ac25871c..0ddb54102 100644 --- a/test/crowdsec/crowdsec_test.go +++ b/test/crowdsec/crowdsec_test.go @@ -5,9 +5,10 @@ import ( "os" "testing" + "github.com/expr-lang/expr/internal/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/test/crowdsec" - "github.com/stretchr/testify/require" ) func TestCrowdsec(t *testing.T) { diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index 2911e8e26..0b228ca16 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" ) diff --git a/test/gen/gen_test.go b/test/gen/gen_test.go index 424974de8..6ac07c4f8 100644 --- a/test/gen/gen_test.go +++ b/test/gen/gen_test.go @@ -5,8 +5,9 @@ import ( "strings" "testing" + "github.com/expr-lang/expr/internal/testify/require" + "github.com/expr-lang/expr" - "github.com/stretchr/testify/require" ) func TestGenerated(t *testing.T) { diff --git a/test/interface_method/interface_method_test.go b/test/interface_method/interface_method_test.go index 51057f7a8..716b390e7 100644 --- a/test/interface_method/interface_method_test.go +++ b/test/interface_method/interface_method_test.go @@ -3,8 +3,8 @@ package interface_method_test import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" ) diff --git a/test/operator/issues584/issues584_test.go b/test/operator/issues584/issues584_test.go index 13c9c66f3..5ceb2d50c 100644 --- a/test/operator/issues584/issues584_test.go +++ b/test/operator/issues584/issues584_test.go @@ -3,7 +3,7 @@ package issues584_test import ( "testing" - "github.com/stretchr/testify/assert" + "github.com/expr-lang/expr/internal/testify/assert" "github.com/expr-lang/expr" ) diff --git a/test/operator/operator_test.go b/test/operator/operator_test.go index b49d91cc6..2ebb176f8 100644 --- a/test/operator/operator_test.go +++ b/test/operator/operator_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/test/mock" diff --git a/test/patch/change_ident_test.go b/test/patch/change_ident_test.go index 4d23b134a..663ccefab 100644 --- a/test/patch/change_ident_test.go +++ b/test/patch/change_ident_test.go @@ -3,7 +3,7 @@ package patch_test import ( "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" diff --git a/test/patch/patch_test.go b/test/patch/patch_test.go index 612a63e84..facae7255 100644 --- a/test/patch/patch_test.go +++ b/test/patch/patch_test.go @@ -3,10 +3,11 @@ package patch_test import ( "testing" + "github.com/expr-lang/expr/internal/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" "github.com/expr-lang/expr/test/mock" - "github.com/stretchr/testify/require" ) type lengthPatcher struct{} diff --git a/test/patch/set_type/set_type_test.go b/test/patch/set_type/set_type_test.go index 673698afb..b9c831b0d 100644 --- a/test/patch/set_type/set_type_test.go +++ b/test/patch/set_type/set_type_test.go @@ -4,7 +4,7 @@ import ( "reflect" "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/ast" diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index da894d507..6c38ba1c0 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -4,8 +4,9 @@ import ( "fmt" "testing" + "github.com/expr-lang/expr/internal/testify/require" + "github.com/expr-lang/expr" - "github.com/stretchr/testify/require" ) func TestPipes(t *testing.T) { diff --git a/test/time/time_test.go b/test/time/time_test.go index 3eeef4a0d..d010679a8 100644 --- a/test/time/time_test.go +++ b/test/time/time_test.go @@ -5,13 +5,14 @@ import ( "testing" "time" + "github.com/expr-lang/expr/internal/testify/require" + "github.com/expr-lang/expr" "github.com/expr-lang/expr/checker" "github.com/expr-lang/expr/compiler" "github.com/expr-lang/expr/conf" "github.com/expr-lang/expr/parser" "github.com/expr-lang/expr/vm" - "github.com/stretchr/testify/require" ) func TestTime(t *testing.T) { diff --git a/vm/debug_test.go b/vm/debug_test.go index 576960f06..7360e5833 100644 --- a/vm/debug_test.go +++ b/vm/debug_test.go @@ -5,7 +5,7 @@ package vm_test import ( "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr/compiler" "github.com/expr-lang/expr/parser" diff --git a/vm/runtime/helpers_test.go b/vm/runtime/helpers_test.go index 42a0aece0..b0ef5340f 100644 --- a/vm/runtime/helpers_test.go +++ b/vm/runtime/helpers_test.go @@ -3,8 +3,9 @@ package runtime_test import ( "testing" + "github.com/expr-lang/expr/internal/testify/assert" + "github.com/expr-lang/expr/vm/runtime" - "github.com/stretchr/testify/assert" ) var tests = []struct { diff --git a/vm/vm_test.go b/vm/vm_test.go index 2628b961d..3ed57d75b 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -6,7 +6,7 @@ import ( "reflect" "testing" - "github.com/stretchr/testify/require" + "github.com/expr-lang/expr/internal/testify/require" "github.com/expr-lang/expr" "github.com/expr-lang/expr/checker" From bd688c314e97ecb0586f6783e0bcfde2037d68e8 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 8 May 2024 00:25:05 +0200 Subject: [PATCH 325/506] Add go 1.22 to tests --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 087bbc7c4..dc197eb1f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go-versions: [ '1.18', '1.19', '1.20', '1.21' ] + go-versions: [ '1.18', '1.19', '1.20', '1.21', '1.22' ] steps: - uses: actions/checkout@v3 - name: Setup Go ${{ matrix.go-version }} From 83d67e7fe596a34802d8b98804030aac50de5a0a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 8 May 2024 10:04:54 +0200 Subject: [PATCH 326/506] Remove implicit date's timezone set on parse --- builtin/builtin.go | 1 - builtin/builtin_test.go | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 38a6f2f3f..9687d7e59 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -528,7 +528,6 @@ var Builtins = []*Function{ if err != nil { return nil, err } - t = t.In(tz) return t, nil } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 334910afb..b7579153c 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -113,7 +113,7 @@ func TestBuiltin(t *testing.T) { {`duration("1h")`, time.Hour}, {`date("2006-01-02T15:04:05Z")`, time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)}, {`date("2006.01.02", "2006.01.02")`, time.Date(2006, 1, 2, 0, 0, 0, 0, time.UTC)}, - {`date("2023-04-23T00:30:00.000+0100", "2006-01-02T15:04:05-0700", "America/Chicago").Format("2006-01-02")`, "2023-04-22"}, + {`date("2023-04-23T00:30:00.000+0100", "2006-01-02T15:04:05-0700", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, {`date("2023-04-23T00:30:00", "2006-01-02T15:04:05", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, {`date("2023-04-23", "2006-01-02", "America/Chicago").Format("2006-01-02")`, "2023-04-23"}, {`timezone("UTC").String()`, "UTC"}, From 6171d560d7faf0513a2547542d92a9781a594100 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 8 May 2024 22:20:37 +0200 Subject: [PATCH 327/506] Update docs --- docs/configuration.md | 201 ++++++++++++++++------------------- docs/environment.md | 95 +++++++++++++++++ docs/functions.md | 86 +++++++++++++++ docs/getting-started.md | 90 +++++++++------- docs/images/debug.gif | Bin 3546095 -> 0 bytes docs/images/logo-small.png | Bin 86921 -> 0 bytes docs/images/logo.png | Bin 395487 -> 0 bytes docs/internals.md | 61 ----------- docs/language-definition.md | 2 +- docs/operator-overloading.md | 52 --------- docs/patch.md | 125 ++++++++++++++++++++++ docs/tips.md | 38 ------- docs/visitor-and-patch.md | 98 ----------------- docs/visitor.md | 49 +++++++++ 14 files changed, 495 insertions(+), 402 deletions(-) create mode 100644 docs/environment.md create mode 100644 docs/functions.md delete mode 100644 docs/images/debug.gif delete mode 100644 docs/images/logo-small.png delete mode 100644 docs/images/logo.png delete mode 100644 docs/internals.md delete mode 100644 docs/operator-overloading.md create mode 100644 docs/patch.md delete mode 100644 docs/tips.md delete mode 100644 docs/visitor-and-patch.md create mode 100644 docs/visitor.md diff --git a/docs/configuration.md b/docs/configuration.md index a427515e9..511ebd48b 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,156 +1,135 @@ # Configuration -Expr can be configured with options. For example, you can pass the environment with variables and functions. +## Return type -## AllowUndefinedVariables() +Usually, the return type of expression is anything. But we can instruct type checker to verify the return type of the +expression. +For example, in filter expressions, we expect the return type to be a boolean. -This option allows undefined variables in the expression. By default, Expr will return an error -if the expression contains undefined variables. +```go +program, err := expr.Compile(code, expr.AsBool()) +if err != nil { +panic(err) +} -```go -program, err := expr.Compile(`foo + bar`, expr.AllowUndefinedVariables()) -``` +output, err := expr.Run(program, env) +if err != nil { +panic(err) +} -## AsBool() +ok := output.(bool) // It is safe to assert the output to bool, if the expression is type checked as bool. +``` -This option forces the expression to return a boolean value. If the expression returns a non-boolean value, -Expr will return an error. +If `code` variable for example returns a string, the compiler will return an error. -```go -program, err := expr.Compile(`Title contains "Hello"`, expr.AsBool()) -``` +Expr has a few options to specify the return type: -## AsFloat64() +- [expr.AsBool()](https://pkg.go.dev/github.com/expr-lang/expr#AsBool) - expects the return type to be a bool. +- [expr.AsInt()](https://pkg.go.dev/github.com/expr-lang/expr#AsInt) - expects the return type to be an int (float64, + uint, int32, and other will be cast to int). +- [expr.AsInt64()](https://pkg.go.dev/github.com/expr-lang/expr#AsInt64) - expects the return type to be an int64 ( + float64, uint, int32, and other will be cast to int64). +- [expr.AsFloat64()](https://pkg.go.dev/github.com/expr-lang/expr#AsFloat64) - expects the return type to be a float64 ( + float32 will be cast to float64). +- [expr.AsAny()](https://pkg.go.dev/github.com/expr-lang/expr#AsAny) - expects the return type to be anything. +- [expr.AsKind(reflect.Kind)](https://pkg.go.dev/github.com/expr-lang/expr#AsKind) - expects the return type to be a + specific kind. -This option forces the expression to return a float64 value. If the expression returns a non-float64 value, -Expr will return an error. +:::tip Warn on any +By default, type checker will accept any type, even if the return type is specified. Consider following examples: -```go -program, err := expr.Compile(`42`, expr.AsFloat64()) +```expr +let arr = [1, 2, 3]; arr[0] ``` -:::note -If the expression returns integer value, Expr will convert it to float64. -::: - -## AsInt() +The return type of the expression is `any`. Arrays created in Expr are of type `[]any`. The type checker will not return +an error if the return type is specified as `expr.AsInt()`. The output of the expression is `1`, which is an int, but the +type checker will not return an error. -This option forces the expression to return an int value. If the expression returns a non-int value, -Expr will return an error. +But we can instruct the type checker to warn us if the return type is `any`. Use [`expr.WarnOnAny()`](https://pkg.go.dev/github.com/expr-lang/expr#WarnOnAny) to enable this behavior. ```go -program, err := expr.Compile(`42`, expr.AsInt()) +program, err := expr.Compile(code, expr.AsInt(), expr.WarnOnAny()) ``` -:::note -If the expression returns a float value, Expr truncates it to int. -::: - -## AsInt64() +The type checker will return an error if the return type is `any`. We need to modify the expression to return a specific +type. -Same as `AsInt()` but returns an int64 value. - -```go -program, err := expr.Compile(`42`, expr.AsInt64()) +```expr +let arr = [1, 2, 3]; int(arr[0]) ``` +::: -## AsKind() -This option forces the expression to return a value of the specified kind. -If the expression returns a value of a different kind, Expr will return an error. +## WithContext -```go -program, err := expr.Compile(`42`, expr.AsKind(reflect.String)) -``` +Although the compiled program is guaranteed to be terminated, some user defined functions may not be. For example, if a +user defined function calls a remote service, we may want to pass a context to the function. -## ConstExpr() +This is possible via the [`WithContext`](https://pkg.go.dev/github.com/expr-lang/expr#WithContext) option. -This option tells Expr to treat specified functions as constant expressions. -If all arguments of the function are constants, Expr will replace the function call with the result -during the compile step. +This option will modify function calls to include the context as the first argument (only if the function signature +accepts a context). -```go -program, err := expr.Compile(`fib(42)`, expr.ConstExpr("fib")) +```expr +customFunc(42) +// will be transformed to +customFunc(ctx, 42) ``` -[ConstExpr Example](https://pkg.go.dev/github.com/expr-lang/expr?tab=doc#ConstExpr) - -## Env() - -This option passes the environment with variables and functions to the expression. +Function `expr.WithContext()` takes the name of context variable. The context variable must be defined in the environment. ```go -program, err := expr.Compile(`foo + bar`, expr.Env(Env{})) +env := map[string]any{ + "ctx": context.Background(), +} + +program, err := expr.Compile(code, expr.Env(env), expr.WithContext("ctx")) ``` -## Function() +## ConstExpr -This option adds a function to the expression. +For some user defined functions, we may want to evaluate the expression at compile time. This is possible via the +[`ConstExpr`](https://pkg.go.dev/github.com/expr-lang/expr#ConstExpr) option. ```go - atoi := expr.Function( - "atoi", - func(params ...any) (any, error) { - return strconv.Atoi(params[0].(string)) - }, - ) - - program, err := expr.Compile(`atoi("42")`, atoi) +func fib(n int) int { + if n <= 1 { + return n + } + return fib(n-1) + fib(n-2) +} + +env := map[string]any{ + "fib": fib, +} + +program, err := expr.Compile(`fib(10)`, expr.Env(env), expr.ConstExpr("fib")) ``` -Expr sees the `atoi` function as a function with a variadic number of arguments of type `any` and returns a value of type `any`. But, we can specify the types of arguments and the return value by adding the correct function -signature or multiple signatures. +If all arguments of the function are constants, the function will be evaluated at compile time. The result of the function +will be used as a constant in the expression. -```go - atoi := expr.Function( - "atoi", - func(params ...any) (any, error) { - return strconv.Atoi(params[0].(string)) - }, - new(func(string) int), - ) +```expr +fib(10) // will be transformed to 55 during the compilation +fib(12+12) // will be transformed to 267914296 during the compilation +fib(x) // will **not** be transformed and will be evaluated at runtime ``` -Or we can simply reuse the `strconv.Atoi` function. - -```go - atoi := expr.Function( - "atoi", - func(params ...any) (any, error) { - return strconv.Atoi(params[0].(string)) - }, - strconv.Atoi, - ) -``` +## Options -Here is another example with a few function signatures: +Compiler options can be defined as an array: ```go - toInt := expr.Function( - "toInt", - func(params ...any) (any, error) { - switch params[0].(type) { - case float64: - return int(params[0].(float64)), nil - case string: - return strconv.Atoi(params[0].(string)) - } - return nil, fmt.Errorf("invalid type") - }, - new(func(float64) int), - new(func(string) int), - ) +options := []expr.Option{ + expr.Env(Env{}) + expr.AsInt(), + expr.WarnOnAny(), + expr.WithContext("ctx"), + expr.ConstExpr("fib"), +} + +program, err := expr.Compile(code, options...) ``` - -## Operator() - -This options defines an [operator overloading](operator-overloading). - -## Optimize() - -This option enables [optimizations](internals.md). By default, Expr will optimize the expression. - -## Patch() - -This option allows you to [patch the expression](visitor-and-patch) before compilation. +Full list of available options can be found in the [pkg.go.dev](https://pkg.go.dev/github.com/expr-lang/expr#Option) documentation. diff --git a/docs/environment.md b/docs/environment.md new file mode 100644 index 000000000..2ae2f0af6 --- /dev/null +++ b/docs/environment.md @@ -0,0 +1,95 @@ +# Environment + +The environment is a map or a struct that contains the variables and functions that the expression can access. + +## Struct as Environment + +Let's consider the following example: + +```go +type Env struct { + UpdatedAt time.Time + Posts []Post + Map map[string]string `expr:"tags"` +} +``` + +The `Env` struct contains 3 variables that the expression can access: `UpdatedAt`, `Posts`, and `tags`. + +:::info +The `expr` tag is used to rename the `Map` field to `tags` variable in the expression. +::: + +The `Env` struct can also contain methods. The methods defined on the struct become functions that the expression can +call. + +```go +func (Env) Format(t time.Time) string { + return t.Format(time.RFC822) +} +``` + +:::tip +Methods defined on embedded structs are also accessible. +```go +type Env struct { + Helpers +} + +type Helpers struct{} + +func (Helpers) Format(t time.Time) string { + return t.Format(time.RFC822) +} +``` +::: + +We can use an empty struct `Env{}` to with [expr.Env](https://pkg.go.dev/github.com/expr-lang/expr#Env) to create an environment. Expr will use reflection to find +the fields and methods of the struct. + +```go +program, err := expr.Compile(code, expr.Env(Env{})) +``` + +Compiler will type check the expression against the environment. After the compilation, we can run the program with the environment. +You should use the same type of environment that you passed to the `expr.Env` function. + +```go +output, err := expr.Run(program, Env{ + UpdatedAt: time.Now(), + Posts: []Post{{Title: "Hello, World!"}}, + Map: map[string]string{"tag1": "value1"}, +}) +``` + +## Map as Environment + +You can also use a map as an environment. + +```go +env := map[string]any{ + "UpdatedAt": time.Time{}, + "Posts": []Post{}, + "tags": map[string]string{}, + "sprintf": fmt.Sprintf, +} + +program, err := expr.Compile(code, expr.Env(env)) +``` + +A map defines variables and functions that the expression can access. The key is the variable name, and the type +is the value's type. + +```go +env := map[string]any{ + "object": map[string]any{ + "field": 42, + }, +} +``` + +Expr will infer the type of the `object` variable as `map[string]any`. + +By default, Expr will return an error if unknown variables are used in the expression. + +You can disable this behavior by passing [`AllowUndefinedVariables`](https://pkg.go.dev/github.com/expr-lang/expr#AllowUndefinedVariables) option to the compiler. diff --git a/docs/functions.md b/docs/functions.md new file mode 100644 index 000000000..03b5b9641 --- /dev/null +++ b/docs/functions.md @@ -0,0 +1,86 @@ +# Functions + +Expr comes with a set of [builtin](language-definition.md) functions, but you can also define your own functions. + +The easiest way to define a custom function is to add it to the environment. + +```go +env := map[string]any{ + "add": func(a, b int) int { + return a + b + }, +} +``` + +Or you can use functions defined on a struct: + +```go +type Env struct{} + +func (Env) Add(a, b int) int { + return a + b +} +``` + +:::info +If functions are marked with [`ConstExpr`](./configuration.md#constexpr) option, they will be evaluated at compile time. +::: + +The best way to define a function from a performance perspective is to use a [`Function`](https://pkg.go.dev/github.com/expr-lang/expr#Function) option. + +```go +atoi := expr.Function( + "atoi", + func(params ...any) (any, error) { + return strconv.Atoi(params[0].(string)) + }, +) + +program, err := expr.Compile(`atoi("42")`, atoi) +``` + +Type checker sees the `atoi` function as a function with a variadic number of arguments of type `any`, and returns +a value of type `any`. But, we can specify the types of arguments and the return value by adding the correct function +signature or multiple signatures. + +```go +atoi := expr.Function( + "atoi", + func(params ...any) (any, error) { + return strconv.Atoi(params[0].(string)) + }, + new(func(string) int), +) +``` + +Or we can simply reuse the strconv.Atoi function as a type: + +```go +atoi := expr.Function( + "atoi", + func(params ...any) (any, error) { + return strconv.Atoi(params[0].(string)) + }, + // highlight-next-line + strconv.Atoi, +) +``` + +It is possible to define multiple signatures for a function: + +```go +toInt := expr.Function( + "toInt", + func(params ...any) (any, error) { + switch params[0].(type) { + case float64: + return int(params[0].(float64)), nil + case string: + return strconv.Atoi(params[0].(string)) + } + return nil, fmt.Errorf("invalid type") + }, + new(func(float64) int), + new(func(string) int), +) +``` diff --git a/docs/getting-started.md b/docs/getting-started.md index b6b0e4da9..8ee14fd49 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -26,20 +26,24 @@ fmt.Print(output) // 4 ``` Expr compiles the expression `2 + 2` into a bytecode program. Then we run -the program and get the output. The output is `4` as expected. +the program and get the output. + +:::tip +In performance-critical applications, you can reuse the compiled program. Compiled programs are safe for concurrent use. +**Compile once** and run **multiple** times. +::: + +The `expr.Compile` function returns a `*vm.Program` and an error. The `expr.Run` function takes a program and an +environment. The environment is a map of variables that can be used in the expression. In this example, we use `nil` as +an environment because we don't need any variables. -The `expr.Compile` function returns a `*vm.Program` and an error. The program -can be reused between runs. The `expr.Run` function takes a program and an -environment. The environment is a map of variables that can be used in the -expression. In this example, we use `nil` as an environment because we don't -need any variables. Now let's pass some variables to the expression: ```go env := map[string]any{ "foo": 100, - "bar": 200, + "bar": 200, } program, err := expr.Compile(`foo + bar`, expr.Env(env)) @@ -56,7 +60,9 @@ fmt.Print(output) // 300 ``` Why do we need to pass the environment to the `expr.Compile` function? Expr can be used as a type-safe language. -Expr can infer the type of the expression and check it against the environment. Here is an example: +Expr can infer the type of the expression and check it against the environment. + +Here is an example: ```go env := map[string]any{ @@ -70,73 +76,75 @@ if err != nil { } ``` -Expr can work with any Go types. Here is an example: +Expr can work with any Go types: ```go env := map[string]any{ - "greet": "Hello, %v!", - "names": []string{"world", "you"}, - "sprintf": fmt.Sprintf, + "greet": "Hello, %v!", + "names": []string{"world", "you"}, + "sprintf": fmt.Sprintf, } code := `sprintf(greet, names[0])` program, err := expr.Compile(code, expr.Env(env)) if err != nil { - panic(err) + panic(err) } output, err := expr.Run(program, env) if err != nil { - panic(err) + panic(err) } fmt.Print(output) // Hello, world! ``` Also, Expr can use a struct as an environment. Methods defined on the struct become functions. -The struct fields can be renamed with the `expr` tag. Here is an example: +The struct fields can be renamed with the `expr` tag. + +Here is an example: ```go type Env struct { - Posts []Post `expr:"posts"` + Posts []Post `expr:"posts"` } func (Env) Format(t time.Time) string { - return t.Format(time.RFC822) + return t.Format(time.RFC822) } type Post struct { - Body string - Date time.Time + Body string + Date time.Time } func main() { - code := `map(posts, Format(.Date) + ": " + .Body)` - - program, err := expr.Compile(code, expr.Env(Env{})) - if err != nil { - panic(err) - } - - env := Env{ - Posts: []Post{ - {"Oh My God!", time.Now()}, - {"How you doin?", time.Now()}, - {"Could I be wearing any more clothes?", time.Now()}, - }, - } - - output, err := expr.Run(program, env) - if err != nil { - panic(err) - } - - fmt.Print(output) + code := `map(posts, Format(.Date) + ": " + .Body)` + + program, err := expr.Compile(code, expr.Env(Env{})) + if err != nil { + panic(err) + } + + env := Env{ + Posts: []Post{ + {"Oh My God!", time.Now()}, + {"How you doin?", time.Now()}, + {"Could I be wearing any more clothes?", time.Now()}, + }, + } + + output, err := expr.Run(program, env) + if err != nil { + panic(err) + } + + fmt.Print(output) } ``` -The compiled program can be reused between runs. Here is an example: +The compiled program can be reused between runs. ```go type Env struct { diff --git a/docs/images/debug.gif b/docs/images/debug.gif deleted file mode 100644 index 90a6ec2e6c9d0d708ccf2d069934fce9b8775550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3546095 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

    GIgZ^j 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

  • *Wt@fz(MK(}fhm*E|u=hd1l= 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

    L6~b=a@FYtkUzW9c~m2hcsf==RUc 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

    nBX#4%K5Ix_4K?uHcudy6=Ru1tqU9YXn!9yw)q z2yu+pICW&uAq)wt8G*bJTB^{hxZ2NVyfo+&w1nJTAwGV02R<7ILBDA7c5I#3wXrJvv{4=?7WJdVh?m)wb)v&@-Gd2_ze58MRh;y@t!WZza z;7vR+qVG$I`!Q>;fh#uc;4A?5rKF`?xbu{swK=%*)2_B4ZW!7$XLaeDSi858E$jUW zIT5n=5x#~DJ-&E+!~(nDi({zL6td_(=rjbRtXBpVkGFe}IEE(858ZG5$RDRaIhf5p z&W~eA(G;%T*<4)lS_$N3F7Ijma9>lXQRBVH52|_vuZo0>PHvw3qxm(2%jG-aqHgJv z5?^OQxLlq~To4aqUfNL;d6>&@iEB-eB1Vrm_$ip1q#aj#Fj}7F1CiR|jAtT&Cm13% z6=|sddf|t1{{T-gbZQD0p98(uuxDFPaT!WAg$z%D<}VnS9gvP8R8zoq!`N^3ls}Mz zxpkaE0;Qgj-wbGva6=(8YG^h^{?*bwIMzy3$+L`-#C$~ZI5DJs=aYyvjJmAax zIK~V#wQR6Wy3pj(BcKCgh}I-z1=9O2Toax4})|;zi<6vwKGHhjCo6~K8$qeL^GYX^n`S+Bz&h~R8o%(YtxAvc z9)(6<9Y)EQr6R+N(-$RlkZyFOf39zy6_DCn)RqpOBEU`5_shT26p+tb(x#(Q+BB>k z`yk~hz!Gmkn~v+GO#?Zh@T$_tVozEtq z2h{e~xA|Kvx5tL7QwmOg-ag@p^VYf%bUWG6xA!s7V#;6dB}IdB;w^e}uqhQ0wiz8& z&elM++FST0VWT3&=PLkp!MPg)k+Ev=0<^Ibm1H?0;QT{^y7^TK{CJxjHO75yv0 z+Ntf#>2nKEM6f9Bdnq|G+$pL?MEw21(9KdyRYPE8~*(^5F^7~Q4y^qaZIo(ColBTx` zPP)MHD~PiXA36tKe2eoQiRQoxRXE_pkU4W#g2LfF5X}JiZ~vjB|3tgx-;*$AO(3#;*`+>);Uu!mT=R@MP`Bu z?X8O=Xo(mZUevjD(2$AKJ5qX2bPxG7POG%(!D-q`R}7~yg3$1TTUMS19g%kM9wbU! z!{vrVvzy9Dz4&uw?9obb+Nqv5uq@UzQwTo$Tz-7Tz2JCKJ7wVhg|4an26ay9mxljN zu^+|^0I?pY_CL(O6VXnP-_h<;7&<$Zx~(P+CO`RKQpd%4R&m;?)Qc?JV71t&v}(F3 zOWr#*`Yg-v#EHw9jOp=98g*|4Vl$4F2z*OioL0dqjytM+Ssx**;Pm#4M7BEKOk1XX z4@$bXKu+V6L;9m7F(c}eW`q|(*sQv)W7A=W#C9TuGQs6q<>YH& zL{}{nsH7Mm6F667E$MB6zwNgLsyz7qBuD_>A~`=#m$ZYU#Q5O{5wPbexdCj&M&z9n zD-p1#K+XV8F&A(0??V@Y`rtiR%>=gNBG>C>*C1$5mYdLa_wZB7lvcp)cp|0>tle-gDIa z7SXwz(HuhDuD>^WsGCVOZY!e$a9du1$ycQv@w>GV|NTyvUtM6WdH0sc`P&S_BOzjE zCXnj9C2}S*$z?QmQ1fv4LFx=-b!Zf)nUW@Qou@}mMOKGW%!|txmu!-MKJEAtgdG~m z$!eSB?P~nm8?fA4CgzUS~M6 zSF2v_ z2rpI2|J4Or%9Sttx)-p~TMOs6l+|r-e_XL4n86$GErv6IEob-q@V8-ri{4r|1K4Pm z$QfI!yn7cxheq@2s2fe(eET4R4z24K&~^s-<^GkWAg;Zi2K9FcV9d%*aW8nI>(H1ku>JZP;(6S-s&Sx@ ztI!L?b1@`E5<9|rRfR(OjcNDD^aS@P( zr;ba%|LB0akKaolD-H4;PaCH}`>h{2`o))@0AKRN^WCUzk9&|IQ4tC?CJ==7@d&7N)nrGPPdxlAUa&zX5|2<|8?2GrF{-%eA z(?~0Wn`S#z1{v&0Zr$M1EyPkuCu61gMjj+3Ms+J=buo%u|m z#V!%GjkwDHLHM0IFx;b&x~m z<^R=w|0UjgNSqeY<;%!}f2u9!Ch>gHvdfS&Lg9INP--8PkMDt;;Yo7cY^x8uo%@Ng z$l6c}czIA_?=+hO=KIBaKOw4HYo+I6bDztMtPO?R^wfmDW<={zJ-X+1LqemqTC(7@ z78+nG+tjB^hHFWKib~%cn-953L!$>zH0KLr5fGZ}LS>CP`Fh7wwlh+{w{lL)8kLSl zw-ln0WJ}+ErF4sBw%R40r=asU95f!i^1NDwehB^3-J+T$?=v8B3%HN0x^Dd-QH!2&IU)D_0qmQg`ho) zxkhz@HqOO}Iju4eJ%FG?;kyIvm-vYCIse_5IS`1=oT# z4M{>r=-{-Xd+Ufe1RW~v!Di;qSO4h=nx~M2b5U9bSIyH;IoqUP25V_BPDP@3K9R_N zAx`XR-F@y66eFQIX~|TO_ZHD zmhS%dCsY@}4H=XR;X8 zWG>)SgX2bk#2k`ZE=n{A1_!B*FYWi-O?UW=Mr+l4c+lFibzQHGXFwQ-q>>Z1f`iz{ zx85v-kkvIGXWdZ6p7LYrlYk)JbL9LMjvcje5&ZM25QPR@IJ zoW7H5fe-PH49U0yt)XHGBl6(U&$H#v9sxUY@8?GKH5ADD(GSu3&YI7j0@Ye|0UoqY zuYAhEX-%8wqm`roMayp9;yBI02bynC;En+47b0 z`N7(Sq>k&{B@KMIm3MN@e?Zpoo)@RtO~{m$O{=r+*$v($kN19HRLAbttxR$Hu+IeV zI5cHCIN}XSBPYIjC2)J}#l?mr!MAepiJ=gjz{RJ!w&iahe)}u?Yqt21lyWpQ+1P6q z>puIidw!*db}0NNSie(m#hml)*M}244bar#6&nMj4~;qX4(%Tq_56ee&13zp7>Mgl zi*FBixvunb%66hU{eeJwIr}{CN_S2G4)rsN$4}2$hPmlA54col=(I=cI ziIvG+@2;-9RxEWPpzq6q3+m!PNUw4OR!|#th)Vcs?tAw9X%6=fo^QCC~2(DbA7Vi_iJCAcu?HBTiE{7^*SIj zLK4f7CxrCc%^oW3rf)xR3^*brxg3FmP229|33m{5D5rG<4US*)*VqX@kV)_!5@#$Q z+6-llFZ4DD>W~z3(rlm|*)ijXb_hF^BYMI{Tdj99HJF6l9ZGvZ*x>kb?4W0BgY@D3 zj;X)9&Ga$r>D=H`qy+D`Om$c>j0S!6``O~NMeL*Egpf3If-Zy&_V%R{XU+j-Tt&7Q z$L-^<#Ur+q2g?_dQjQD;r&OOU&t4EjT}WCv2@TTp>XTL8KxQjf1n9twH3T<9$A5d_ z3W5%0e@|woANvrPv!%_u@`Z2h%gF@qr%tspE}u(U4=yJkBo14F><)?K!frsstaqR6 z4~Q6&VotckB;w&=1@qfodO}EIIfC`;(p8Nadv(t)`(4*YQ#Aw3vF!!gc@^__ySI)`XVJk! z&)=#aSz+WYdkaSPk67O5SNAqlTiTEWbv^o|b{<5!7})@s!N2C`;^0}BgpibVzQ16d z2W(4=-i5p$QYw(v+oNZ9)foCdsBqreIz8wmHt9}GuZ$S_&vKAyLQ>a(c}hvICXEKU zkvD?QCnONC=+(Eh6Enc`V+kS2>j+vr3937TsK0W-oL^k2p|)#Ro4(-GhgWnDet$KW zE45f;c8K7g)vsRPxBco>d9~hBail2Y8F6MKzH+U#;<3G@R(+0n~C5MU~Krr!$;MEL4V zEr9d2sQ2NEB`#*At@B5o*kWITB=APo`SOdz*MpK$z=H{4zqpSVYbii2tXB%KuJh`j zICC4UWk}*X$5h%58j@fN#)KYKc7t;RZv~#_Yl;zgj9%i!a_`#LD+wVf@K6Abosj@W zfh6!|*!dPP1?~uYSIpiTq%7V5I~^G`&;`GHzdi^%?^j(lSEtZiLp|(h4c|!GumRM| zkc4+BSR-<#OcI#5mEirVtDnv2=q`C@sfozbp^#h{4a;W6LlqM2OQ(d8X4uI+gw@|? zN&4$PDDo<`dNEuao|wzG`q1OAgSZGuYL|k})_NpIg1hg8kW_Xl@EGZT17{USCWo@2 zPeFUvpL0(C9YjS)@;U(wzneOdWyLmRv}aBCi)C=BzGvKw6gMceW+5bXoki*$Q$Gcd zMJ9wKtV@BH-aqu-`z%NoAx)$s-6)X1{n7OZ_%J>pBwd{YZTTbm-x*&Zt3x@ACurk% ziputwjZ2TX>!+1%)y{a5+TOMI$#Ngu!zP3zt|N2HnJ0^s@TcvVCS~(fxV3-_Nnq!I z8($O1_B4FsAmHebBz6Q24(n>CrR7G@>UhMvu_I`3j}W5d{?EzZ<1nttE=V(w~T3>o> z4>)DfE(=-EX4{efxh%~ONY)h5_3vl8fy@r6 ziW4-zKKJY1qadC`lHHL@j0;~f`?Z3jz;L>RkcQI{G{~xp3gjD&JQ5Pe1vC=tK3%VN zN#qg56h`a`Y>=^Qhu=i4UP#(I@`yPcg!p~({S_lXMOVqgli&V1gI4hF=scx>o4o~i zMogn3a6hg`caZHu(%_LV1UA@sR=l%!2w23BG)canh5hrp&EyDaN=rJn=N8`&`|zkrF0{Jp zEzv!1A^TV`(OY|`xrB}~O?NypZ_IcKV*f+?MDHney2*7ar61WVXH4sLJC)Lfzl1c= zTX*M=jBhWKTZDDAkGm5?(%q3~0^J9^U19wr_U&k5NCG^Cui{WG=(FQKe9X=si6P1G z^w&z1<4+e%SwzuI{?VgQaXdiw&>i1s_0guMlQR@;)Tn|sZG#B^Yu4{p+t>A4*$ql~ zxHo^K(Y!H$?;#2C$QNe5qZXva;kz5`ORvO`ba*~&BmfMIC$8zKrkkZ^S?R;SgD?z9lqb=xMEgqP*MA|$`)e=~qtwj~ zBMc88Iw8XFjbi>`NbCB~;ivA{-AH0cv+Shdk>cYu(+!M^7k zqo@gGi=gmPdI_IcWB>|#&m^G7B}I++L`8IKx`QYQJXW{Vakq<5$A4OP?2!blOS?(! zW-b8shNRN-c?7xRqi1f-2N@t01}3FY+9 zhm9@;ufKYG7lIGvV1QP7R#DV7C_k7ISSEtp@z8Wp9XaBD+?f$>Q?))_hEN#CsOMpT(F(j>? z&va2!b;nRHD3maM9cca4!g}O_6djO4CF$zDiy%}&((6$Z=WDn8^hYw%BN|Nt^&%v> zo)6z?x2#`K;K9uM=r4q_1MvL?YSxW!BU3|PRg%ADHl6y$%J=y5G9~-D%^lHY% z;1)J9B>CQ;q5Zq3hq;3O;n-(jnqXo`>OBc9_bz7K?A)58I`T;f_QX zj@ue898Lc;XY(X|{$ByfCut+YEg>^`z5cfB&)MG`CGsAmb^lD1Air}ajkfEH%9sDM zg!mQoPyZ!q=M`kj>;4JZV2eK^BU8Retv=*a)a`KjyT+h<@_v|>>bLu+WKOH%JYzte zys=09H#I6RJ$&o`_-!Ij1K1;_&mh4s-*!R%#R&MKeW6pQPoTe|0ydb_{QiolhT>YAcU*pJxB(U zxPq)8f1W>lVLdpe;0^CnxN!OY7gzf?WHT!dIN0(=OHX6eJ)Dfr`4ynP%3?vO4@rc9T~QhefoXT1)R?$D5fx6LKMW4;0m>Re-;XD9>0BSN$>`3h~t|! z^k@%G2o$sj$F0l3&-)K747j3+jDq<>sM+Z0N5GX6Lq>E(xSlh(E}T*2bD4_LMX25#!hZ5DuIG@fYC z!IhgXdJfI%WR7L~ejjMMd7?ob-1pv^?+>Vb`k!k*>`Npx_UYck`{Uwzl&iEgC;#9Xz0309DxTJf4BDk3rH0@4oW)PDzOo`%m(~V=>G+z3RlMW@4-*X7aQ=uJ^FtE zslu5(&1U1I)QN44{GXG0z*?WOPqMyoYcy}A6)0-MwFUB(=G*YIjVCfMsMXhfd>eW> z{Fm7J;?4g`Op`qSMu#r^BrmlAH6qg_uMgSzhM(k5HlWD7jaPQRx1QFFlUy^7HL`|z zRNC^9c=scf;V&*_Z7S2m!=7}DBM zd()5(>ine6fkt561lGtR^Y(m9oWwfGM&L#pP{TZ`aQei1Q~A{^j>Y$XlcHfBtqsri z?%L0<4b5yok$HjLvbE`gYH$h=3tTSV|<7{_vB_%E`^ylzgP4%RHLovGX>};U~GN4Ja}%MWyRr z{3LI*0Y&EJEE4Aoe{OKFJmLEnSz}Tt^1VXqZu4E!#0C_Z7wI$9ho6*9HlWD7zLo5n z^V__Gzk-eR|E<#_WlSpN0j z$f7xUVE1k~pSZh?r(qs-&BZdyD)OQnw*f`>d5PmXG~!Q6nJoXEe~C5Bqe(6~;MxWC ztW80Ulk95)YM4iniv~Qf=MOfQY(Ne3sKR*9Tqp8pIakY)@h`H*EK`L6D-SQ@D^xeA z|9~3iQH9H{CwJy6{AdGem`4>>X!RkL!mGVveVK$(Kc{ItD&+p5@ zpEeyW|4;uCYnVrq{P6X%TGj`I#>m5MKn?S#!s|i(PV=YDJ2s$(c~s%7ts~s6H}l2{ zOIenTf00Gz6&e<=u4O;BQ2C#!nr6Yt z#;q(j*>>tO^7dJIqMosLKQNO%*j7g{>+|sVmIdQ)U>EBju0SIj(*E0<7l)v{=0X0$B5*5KB^ueU@u zW&WFN#T?;O^M&`U#yMJ!OcGs#*)-FEaCO6>E+g{`GD-FrnCio-ubGNOS?e^a+0b%+v1Zp; zfoV7wbfCQq^A9o{dN?u;=QKo$)a+G1R$`Or$P}p=day@UzRpsXUy`u4 zd{N4-q5HO^lapBrvQw8ayFW5TYIg6HaS@;W8!|;|W<9>+??;4+Ypk=L<*;MRE>d&k z!a^zdmS2ZVk($-}AIxTb9nDy0+?-ISNX=hKUTx&-Y=caZn%72GRkwGH?)#A`QgdBA zS08@Ybj(HBsg*R;TwX3`dwz58g-DT_A96XX+dSsLa2A;&H5Y&F^fqrHRO-@zl_Le$tsv*4s8?dp<;_NXr_LSs-2Q>3sHm z$fP;a(0$9UP%l1v`uvbxq~@aCseO1g`y*4NX28CT`}y%ahfI;06-Le&#H*RB0Av@b zxjR$rZR(y_UB-DIflQH_zp~F(AAefj;Z&C*TOTal113$8shVn{|J}Nm8u(*=x;ofI&tAC@ zWY@F1D`j^pqY91NW`5J$q9f?d0HL1?L7vns)MmJ9TU1VygNz9Q0JJsT|yBCG*8fp^L zebA)6JaY~*HPj^Cd!EnSQvH+S8neGgrbx|xaoQi`>#Xex*{PQ_bk96#j6JVW2r@O) zr0l6r?rFg<$+6s^PLZ0gD*tM#K9p9MaXeciQ>5mV2dka=$3RDbNzpabtZ}Yu3%<-W z#V9&_kf$+43FmctsXp;mmod68GDT``FI^yx^+RtX^DZ(q)TC*5KQwT zhwK_^67$ZmjxMU@qwns^kg1_2>3%A{*Li-a`;APIni;AdwEY5$F?)*=kX@u^@T5}7 z`8vapN&TtOOP60hOUyIVxU{aYH zYPL_%)Ao9(vCNz$DZ2G9g7tPyho29J@jKj5WQx=bua$HM~|`D+Sp#)FfuA>UoDMEu*VB2bmgblI{+dcDGbKwTu|+{D@4Enupx$`>8u3bs3r7 zr6IdW&8RrJD)RS*TahVJvsRu4>n)E>|9)|cvChP0pib&}4c)6$>Dr#3cVA?R)V!Ev z(@0ZaZO(lMne}hbsnu|BN9O9WZ%0qUM znuXsud+_7A2ALu?M|{lrfoI050CkGgEZTK>9;-&i{`5g6c@%^0>Xn1h+oG0RnTZXL zfkKH%9Up_4ig;&n0#E*k9H*i!x%E5vEn>!iR4)glTtBrJFMDG|ik|s;UVl)Y-!r!% zlcL8kn5xco-Ry?(%#?4sWl08N8koWu?-A1NJc9&*5{rOwCl9eI5NcJ;Mm&Wqrxd@pe*+->a zf66Mm@xjsuU{cF#sQKha1NCD2-@mUnu1QrrDLUw`q0y*>XG-!@v<#V4rzw+;iD4z< z&Q-%1eQ*DROp%)3Tmnj}J8X3svp1>&*)`OpI%h4exKxd2^rPnHIwh!vV%X$=dA|WMQYl`OV*gLb22hTYT7OM z^Nm;Y2{5TWP1RI|{rfm3!<-6P)GDu3GPY;Q>J;7jQy6+jy#HHn#G^ixlsxe=KnH6xc4Ic9lX^zUE0 z8^<$o4X9J3=1#}wJNezcH!?+P?wH-opI_$BB2%Ph8HcvEKT|hmcdiN9HPob@Pxb6} z1$Flt{b|5hWQx>m`)yiEUd_kAq*gLjlUk|kxQ{9MSL)nrQFQCiROqRB?Oy&U{^81W zWQx>m)Us(-HI&hZ^A$2hYE};YF^XS3>(qwqG@cr|pTD$n6o2;`f=rQ`cUxBuGHO~|A<($IbWwkgfBT9zes8F!A<-cYAV%|097cjTA4 zVaODzxyLz0Nq&y*AycI0oe3k0^3MZGH-PLSHH*JmR+sP3xyTf$d9K-`Sp2T}379lR z8fs1-+RUCmfK_iu(Pi%!jW2gCoFC3L$P}r0ab>#n{Ithv1a*qk{L=7Y8~y;+3Yj7` zWBG+P%2MtQue)Po$WHTas=GQP{JW7E)i0~FYR~AWkWt9gP?MO+pY%(t zb~ttTHZCC%$kb4im>=W+{QEn-sz;4Xk0y{^q~>CG&sqHa>tbYz)U17NvkR~0Z(!1J zYN%N-eUF`dnf04eblLkwfupCZKk8*3g@htgq-MG#cMI~&l+B<{k(xcHx!ArN#W?MK zkttHMe1*?R`TN34$P}qLcSri%N+ER_>nz?JvTLYGhq@d)!cXy^7S2N^^^&RX#C&M? z?!Hnex<=oSsi7t@!x#8%;^)0_3&<`~v-P15S=17uF5`IaM5aj16^-|d<`1+PeW*@~ zuAyd`W{-|%wUnqXW0~C%Df;l_{OioNpYbpWb&cL^lT`Q=^Q;px(gI6>X!St{otd$bpY|`v)KHTSHjNjo^itCk{jk)mEkxH)lbH85mHDJvK00$3GDT|cDww7e zKb{%eL7gHscbr(2fN!NC$kb4ivbTr|$?0Utp3QO@TmB9*MQT>9w0H=gy;6I~uAwH? znRZ6$*lLcVpBPpklX_l5_p&v%mr-*becl~9K%F8rmsGsJl~=PfFbS!l=FNy_?Rbs$ zB2q(58qRMCj^*Nq)2SmxFR7s>9c-H9@q5JY9HWq_p(ZiYgsl0^Gan#Rq~_!r*AMXH z>Cp+Yi_|<7G4%t_T!l;xH7UDuymvu7Gk#~NQ>12q^UW}x*$tT*YEqql@^+ogGtVJY zq-M5GBM+)2Df+VH(gm`UM=|KG-UdqJ|0KxzNr&pZD zyqI5+NyBMcCpFT@pNA9j$FHW{AiGHRV;!=s;F)2_6v^)SqOZwEC+WIFog&$%r+jbn zj`Kidie%rjv{6O=;oo&+ieyjyzE3uOJl%Rgc9HDAi`?_zZ;fUnQzZM~d>Mc8YJLSK zwY;gC)Sdw&vZv&uSL;d9W$za~yWQFLJ*P%B*C3PX)X*qrjc*h9JEKIspiYsR8;3-#1PnQ>13Q$jFua92M*h*+ptbCE4(WuX7qQHPoafd7?uOUv)%| zzRbTtrbx~6w+a;J>#WlUvWwI#9eg$eZ{r% zwN>=!H`#L#DN-}d8kggI%YQ+pNXYRv!?lT3%hoY2SfN8cz+~ z*YsU=DT{@tE+aFiFVv}_CbfLj+7UtgvNQ#mA~i>zsyQ;drABob>x@LENX?`fJqGYg za>K!pT|-UE-qCUIXnx*zAyY$5>UqDRXS=EsSoCEn!w{%bq-MD*Yqs!e4gw}kyQ!KK zebf1Y50#qgGEUJ+L~5u>(Kmgr(^3s*bY}jc6disjM5E=~mv!yO>pm5kA~hY8jxkw1 zUm{ba=IyX0{=7!DhCz0kBh&0Oo)0z@PN>FHagB4d5t$ll5;Hho-0b`uB^?fRYN$!f z_B$JPR4uQ##yWcES1t_M{=JEktUlNxHAPaI_2Gp6(+ldNI+i*|Wu-uw=$T|o_8G7 zDN?iB#=?`WtEX{1ry*0MX4|#PE~~~;myvlFnIbi(RNE9D-@;Ruky&^=WT#%z(0#&? z3zMzwX=IK>rbx{uFEUS4HwWr6GA|)hq~^Iq=Z^5>={^Cni_~1Z&ufHr-i;rgOaUfE zH&v5XklGW2-tuMMLZnE|F(vF)^3z^mB1JDDQghXS<;9X)rbk`IDH?`M4K*pd)1t){ z`RrGaDN=Ju^0R$;X6{LlU8H7_gscDlRG9i;!kFC`nIbh`&8g8PnT4k=Bl9XUMQR?} zJ;;k^7MKj#sXsMzf0X2QM(fJ~#yZC$Q>3QX{#f1kx3O;^Q>134`}1;GmnEZ`MW;}9 zDpNyE|7HDu@WVL{ks>v-H2WRKYjhi#A~hd9{+-DBA+d3aT&F^Gk(#03X0GMyoQzD7 znned3UdS^aAXB7fp-z}GngnIbitE-rJP@10(*1ODUd`vgB&3F#IfG;S@WWYZIz^X#f6>a^b$jy6 znaC8W*)Ak%J^HM1V!@vPtv*+pu4?e15aX9gluq~_BMney|@*T@v9*>O&t^gPpZCS)g%V$fZ^ z4b=L~#N~-CCy;-ax;wUhjrAg8QYXb=rXso&`?0-EmcHo|$YuWEZI!GcNl$}~hL(Kxs<5%P#T69FDNX-iQ>Ls+6X>8BE$P}q**WaxzUuW{g z5M89^#YgS$^URLOr18|yy_j8NUEifU8Lr5nP-DP+4%uUD? zsrmlnj=}tr?64BDi`1-Xf25doj*R!3&45W$q@m{Z_*1U%?YRMwqFr;0u?&|GX$9;HM1tzo|v!m4>Cn+*6NA_-nohqPuj835mUhzsegx*OFD1tvw;Q1jl(Q-S;= z8;A82UH1EEj`LDIFo}*#k(#OZzP!M{?HYd%6l`O6JItL5muk1yBp z%&W*0sX6pR@Kk<03xq;;k($rnyfAs;U^FtR=QVWSd#ZY7KKl)1iqy_9wz*DSo1 zvJ+B6&E#Ejo4jW-8j&J3bEIh0*d#hKMQV0WJILfQP~mM5U8LrW(2`a8I>#YXq-M)p zU5@e0+sG8Dd2d~*&pfl}cE~PLGrZ}v)Yetrc+)W%nIbghDlV&{zGZk_5+bB0) z_ToEj$>I5I3`q4p%#DZnZ}Y(?AyOoJ<*grvS%VuVJp!2;va65T|9$AbtH|B*>Yvg? zYouaf5M3mDvJ~4p@{KeTnIhSD1_d?Z$MXd;Y1(6GBsE75{C+3pnH6?Hc9HCzomwU5 znSsa@$=>+;K1cqesMp98$-c~?yEorU)pkR6k?h$fm2b^67b8<7d-{NUm8^@W@re8p znAGwbYR+o$+Ma*FP_lCWEZLVCGyR9e%D+JOlnUJH4k{_aN&23?}!xbnr&JX8^*U% z{R0$T_I^=rpId%Ba~(1%yN2$oFHYXiGwlvSogy{+`VN`IGaDmQq~^WbY3A|FjmQ+K znXIN~MxGhx5M&pr`D#Un!#uMEGDT|o2R5tAGq)mBq-Ju*1nqcc!o!eVq~@Sbdw1|^ zwgD!!l7^a9u0}XpH)7-Ab1Nc6Y93fWv@^ddIUJ$ruA*Ht(bkG4?b!^OA~lPIZ}sP= zXbUoFJT-JrTQ_}eo*DlrWEZKK`Q3%sJhK%tMQYY~u(dhQ+<{Dynum@L>c=nhNsd8w zk(%E_#}DP19grzfGe_2Dr}^yrkSS7g^Gmz_yqc-QDLYNOhMKiKPcP)l?1)H_n&}&^ zJ;F2hAycI0+i8V9tG8#>Wn4m1ABX57HFx#9K9qk(*$bH>HQ(fFw>O=oMs*qMJc>-3 zBMse4bxU%9uQSI9$SzVdOD^Y`>b^bty}K_mMQTQdZOqBf(N$!M)NCJ~e+thmauTwO z)a+6%AcEgIrXo|OW|m_cty`S&Uh@GkX^J$|9M$;hJ3hM0DT*%peKfn<6AtstX~-0* z`QqsDD1JDfAyY$5dbE^rX@*~EE$yj3Ej4OX_B3P{sTsa?y2*GhM5czCRA=6ztyZY< zRR6|U=VxTnyld#5$A89n{ux8PGmu@RW>~~gAAXKjAycHLyLVtup7{frA~k=6jvK-+ zOZCn|c9EKys`qNo@0uHdNyDk3=F1%k=J93Poue{k?-wOLxHgSyd370E$p@JtH8(vS zoq~UfVGlAj)J$lp>fc|gj%zr!9-lqadB`qOGs*b7VSJr~k*T33)%hrJ?nHh(Zy{5p zW|6hqy7SrHFFfjJ@;`nIbha_nLn=lZB@) zBeT&($SzWI(Xld(c{O(flcH;=StR6jb-tAnU!pQ)?-xBip1pvhCAPYZ(R(0Mq-M~q z>@QAUCn-!ud^32MQVn% z>3W7g&>jaSm8qfT_c-hF@@1yGM$z3x_nO5Abu#(zq!%(pY8Kx4=LTQrF=UF=Jl}AI z2fuSm>y&jk&n$BXvWwL84>}#m-)qi9rbtcK!?ULG z_u0>oNglXFOYbZDnjg#(_b7M~(LUTG*BURr&Z)>0$sUrmb9KHsA0SgC`>Ccg zv+-gUkAUnV+2f6k*OaewGBT-^H0EexvIbpw<~?MJWIvp{TqQoc>wU;BlD+HtiyL|7 z1Z0Y2kIFXDWRbs#Op)yKe=M>6jjr*TZ=na2omyT)&3B zWKx|PtrX_qypM0C!Ve+3NX^u1s%_wz)0$>@RbHF^8Ny1N^9&B4H=R?<+@Zqm;d z{F|w#5h+r0tM`Y`{1oMULD6OJ7j?hrvYBTNMy5#3ioO*}@CWa6$fWT!)jhRk{r&f1 zf7vkizu!Ep#?-hXXMYLVMQR@Un96~#b1*VRY7Q%9-${Moqb_5eXOSsV)BjEK?R=e1 zk&s=aX7YBGCh*LD$kb4i<|yyB6U)^To9J_N9GN0Dw_jOtkXJKH6lJGr*HE)v{4;U+ zmhX*7k($*T{tn|GRvkm8XxF@(V)7lHnduco7pWP#WYIW2dp~4qsHqzK->0vALZ6=D z>pX!>nj=%)iJ5iXli@tm=`~~*skz+m;ZD`8>N2W15Sb!1J&PS~%GY@bnIbh4p7g%W z&r#ktkX=Jf8qd^)4n61V9Dz)cnm39D@8A!#SAj`Wq@iYTnN$t<=(*lfblLkw8v{K| z)Et6Lk($?n?k(nr^CB`uYBoyYXY#$adEP;Gk(v`H+%3%4ITD#7HJ?1$c$8;eLnh6; zhVJ`ro}0wad%^dRU8H99Du=G{b&f%%NX_l5+q~rKyopSan)5EsH2G7&LLVTzNX^IR zm-gXz&GEpb;nYww-MKq+t+pFi&+CX3?V7Jod6(lqG0XFjqRW0CElb+VCV#>-9+@IF zbG6G>fp4Wd$P}rWW~ZacpAx%%g6twSQ$=pB%zs)q1(_l>y)p%!<+DFTCiRkr?$x(F z`Obf$TkGXR+)H4C)rw4A@!e1lApn(Zrn@Zi<-{6g6&x`vvQJLKNN zYZQn`k(%o-yUpaIe?+Ee*F1SM-wt*7QkQWF@%jqUMQWC-eeMQ-AF~>nA~iGJ>g>$7 z{C8xE)ckd#L{@%0>wSal8fvQ1`*%+~X=2IDiW&WWYYj3*Y7Vd5J{4c*FJw}GYUp09 zrgt5F*Yy4l*+ptje0H`VKSyhkDN-|T)=}$tHU9vU%G6LZ)r#HK`7-PMpy;yqi=tMp z-^35+T4ajUJYaX#RwLUxgwbJx|H!?$M$GDT{hJF~MAziZn6 zf;u(Sr2DNkYtO#n=e;R1MQSEWwEPdx+>A_-nzt6cH@VM__ZzZP&ui!&6qI=yUuR2X ziqzaRZfA1q>C^axb~`W$siEdi-)Wh7jpF>F=(68Ob1Bz%5g)x7GDT``3C*^NXKq2J zNX?J&a*X7&$G5Y$>)54xhgL2{ij@?pxhQ{4lkax*L8eH}c`Nq2^Vvg@DN-|_!J{~Q z_5}8jU8H7px7WM*I$I)Bq-OrcLG^g%c4UgweDv`53O;+{Sdg7Oia~evHc;oSc@A1n zV8-{0+7OdQGX^siF?j5oUHm@06^L}4jRC3N1&R!+cZd%jC$=qkaoO*qU3>HHEk8lc zkSUTq&|}6b>pEvVB5y&aNcK*r6Tjp4w^$C4T_n59?OyA6W;0}pWG^>vg2|t{hayuX zyZ3{1C-^x^5C^hTd&bc4s+Y#!$oGWL-Wr)A+0Rzpm58r144ER?KNqcG^5^r(;zD+j z?D>-Iox-cx5t!8S8fxB-lgH%S2*MCax@%0)%%QIa@wz9AN6}@!k9NQJEtB?ak4%x8 zuLpEZ!%zDjWQx?hYB$g1>myUfhwLIX?N{2_^T+Nk$P}r0w`|{fyhaC*DN=KDlSlSE zGhG76E>bgXiEr*avllWo)TBFix9Q2trnTI;r;GL^3^a^~;Dm4Dpy zmWi_d?CVHmiqsr8W>X96QOUTwUqz-!&0^!uuQ$n_7_y7h+#Y|?5}r8{nIbjwrJiE) zHDFhfDN^&WTi-(bc;-(6*)`OpJ9n>u?|V$LBU7a2(9{P?^SkC%U{Wh-sQI*VpGJI{ z&Pge{t4PfmsZM9*hjTbGMQSd|z24-7`HRRDspK(^J>lkCQZABn&)~BdcwEoGel~rNe6}>t8RBwyQcbt z%NV_EN{a3#QZsl;XntPzKxB&4-1s_PDL#87GDT{}DmU#q&#agVveO)C=>BX&qFg4~ zkttGhXp4HM`8p$!DN^(Lv|G7(X2sNyU8Lrak3%2x%s^y{)I5>C&1Zi3e1%Mrn(K$p zEMUEfGahKGq@nCIMH*_>$aU!~KkW+;si7tv7#?OQ-b#t8E~A>SkttF$WB){@`6=>B z3(-Yt?pQhM8qZvcOp%(A5094NKXm_$Op%&#V|6>i&r!W}ke%jTL-+IHKBxHXtB@&D zbLOYX3Hg@)flQH_^E+gH$=@6`NDtXXYWj}OYVy?q8<8nevp~&sXZT$+ZU(B8hEqe$ zEq~7Y@zI+gQlzH;g>PqgHA9gpQqw)$a~{u3nh~Ol)GRUMTzOujuE-Rr`Q~y_lW)E| zhD?!~8T(fH#=mHi)e*9b)a*8k(ze*ewX2Q&AY&)=o)GkI^nldJ*kTRw8|wjMVEblQInnN;_w>z zBU7Yi-5Sl$@pVQaQ>3PyTks9_q)uJN-MvN@$SzVdfnS>jJaZi~MQWZbP-_g|^6{LY zPLZ0MN}q1R-*2@=rbx{@pYN{X?==r2lloIb_e^o~hVolS#;lNCq~^7v8!o9cp1O?l z-XEDFHAmIokc?L|9GFz5hMH-8)?T+Fjb&!cM$u*O7j=7fK5KkSY;_r#y^twVbF%$i zPwRof$UJ~dk($Z(jcv(iPnjLEi_{!4^YCGQ+B+drq-Lw%$Mf zOr8U>i_}b4uKQfR&bG)Dso8E`YY)Dcb|I5`UPJegxU(wo*%Rc1>>@RDx`x@l-@$mV z*&LXJ)KD}3ltcaaGB+SnbfCTS{;kQktp7o#NX?*xrQLar8s(zlEGbg+?cFmy_*M!* zrbx|Y;pa{M94=OFs8gh7r3dj|@Vik{WQx@6b*}U&p1B2?A~p9n?N*IvCUA!AA~g%< zXm0WzR2yW9)I8ek`B#44cOa8Iib40k?-#ASmCSnZHojk!B#$jSC6B>OMZ8#j<9=($ z8)a_;L=rOwqYr&mm7kzC$P~%$ zcg=B%bvTWCdl)iBvX6MwZ7pACl6;U|B>VVv+n)1vwnwH&_MvxAWa8`Gg-ns`jo*JP z&oh(fhwRky8oe~DW*0X;dnaUyWUsa=tO{S}USx`7uXpU1pS4b-nyCsH85lj zkMzCx@jQV{k(v$S`ZwTPDRUvnE>g2(J9`J7*&mrAHM8Z+nv!RpMy5#3^FFU%@ORnS z3qy91n%S@A|H${}7-WjneEY8TE^99t)w~5vYEKO{JNmyF$3FxrT!f;_zP~8N+l(eZ zAv_hCA~ic?YuLgX-Kfz+WKwnw-Lu55Ve*~z?kP{FH0fF6seiY_qPkrv~z_zMQX;| ze9PoJks2aXq~^H`UP-MVnHkj#1}3$VhMKF^hugk)#n|${5GmR) zCtGLDZd9{Y3Cd2>uA!z=`okCa=*tl)QuEx5S@n757i5Zd&DyaKwc(jH-66V2&F#IP z_T{H&88Ss`u3A=c6kq2@WYQdI=)Nymb(1g8tX>kbi`4wM+rwlxT7*oInpbn=w!Qvl zT;|^)Q>5nI7L&X3b5yw$WEZJDN^&!y%r02HKTw@Q>3A04&PVz`A?!M zmZs>k?=SLko<4_ws)FqJ%Aad$=g=}g0?8}iUQZp$2A4hA;8|(an zOp%(`YrP8R?=@?cgX|(T!#6$YZXHkKuDJ@BG@Kf04%(Uh@6Y0?dl_T&uZR@wni~^6 zYGf_b$n-8x(PiIX^g5xvKR-olkSS7gdB2-)_*VLbOp%&5`b|vFuk!UPKz5Ou>!#*! z#xqwTQ>5m-sI(?6{}q|kOB%XAng7`2OHyiAgzO?U(>x98%g_5tWQx=bIZ@o?&-}k5 zQ>3Qfu~zx5bsE*I<3ZUex`vv|i%rRHMH)3)iAa%}^*U7C$*cJtnWA0u@b>S&_&RG> zg6JYOdv@rPoM)~?rbx}{3)XhvSLE-=6seiX>@SO#ao}4&%PR&A~pA1 zcYeS#eiquS#r>i4>3b}zyk(v{- zt@7pjvtV_|PCc)od*dCSzVpm+$P}rWe&AEvXXHjTZv&H%8ftb5J6M=sRTPXsWA~i!-kAB5ZQJET$U8LrQ5vwZm?KvBnA~hfF8`FZX z^Eom_YPNH^*o$YDuL;>jYQ}epwU1}cMW#s2BvYT9=Ew6DGDT|MoK)ZB)d-JTkexh= zL3i~w(DOW#%UHJ#M-b?^)|*R`zs*Qo*4sDy$jUT!9FoRLFH@P zg1gJUzsPUH`%*k}E;2>3FB@|%1J8VgOp)w8Zsgj+H&W#~kXOppq?AxwRUSO@$sOA!2Qp;}MG5J|dgM6b7f&I3Mr<@yv| z_Wea=E;wxAnG2CAQnP&P>NTyyY0Ul}nIbip4-D?h*ICsYvWwI_pQ?0rp1ByAA~j!( z_y5T=KOs}3W>mK4Wq4-I29RB(=6L(_WTl2Oe@4JkXdr-qv6H?NG#A7_IRDN=LFlP%f!DT>ty%A_SkL-)ufJ588PkxAK2 znKVUt`kpGJ9$Kh>V^ni9GDT{h^&H)iKguU+4B16$URdJw(t7+d*4Y`EA~ox#%5als z?nkCb&8to8=H(v(rEUV*MQSGf`MX9&%lxRzn7tP=HPoaRIDBgc&Ey}{T|}lx&47$I zX7dNyTumuEwUUOK_VF`z=BH>7B1LMB9#_3N&peAvk(%d5PAtT?e2!)iT|-TpqO`-8 zFI8GbS926HX*^AJC+6cK-+uAS(j8=q)U1)JSrO}sY-~^0=8#>a<_V``_xL&|AycGg zrS6|hUS5enrbx~C4&f$u*={W$yGYHhU0UDe`*SKXMQV2NxS8HMN5)wJVvk(v*m-)hY>OSgpVA~k=MDwV`K zMMjNgBa`MxL-!A!b4*^se~wI%nj6MGGwiRR-so6DYOLt!P0Az~P^xk~+K0lt3 z$P}rWu2h>~zRn7*A-hP;C+DWve)-j?W*{(WiZs*=+);EsUuGmCMQWB_wEHVRoE~i` zdNGljZ}x6Hz}FdwOp%(dkJ8v~-HjT(My5#3a`}Ikv_AD#b#WlevWwL0SN2&H&s>d6>Lm@`yDrT! zjlb9Yg-nr}h3r~?;6Ej9(h0JQ)a;t|@f-g8i^7m8QnQSIi4pw0W{S>KCq>s#Gk1}? zYxuWv+aXeL!Ozc3q;pYlQi0r&g+GmBGpdDU9$@^HPobg z&BLR9rr{qk97d){&6AZMntUl`+OCjYq-OOKTTH$Kn;4m_&KTUO~ zIdaQarjh#Is^~A8ICX>UA~hf7N_vrhd1VALMQSGPp70dEYeoQ*%G6Nv?Yg7h{BXK< zr|7cpFB;f9@hkpo!2FRZQnP5jW#jnae1l94HA$nY@9!Sr>#W-YvWwJAx2je!zshey zrbx}UryS1k%w#>GPLY}mYrh-G&wDRqiqs5i*L)B^M`w_!p(f4Ijnc>0J6hCKmvQ+l z*bA~#&ztH_%1Zw#M7*&CF6ni8!!o}q2~TF@%*w_ zN>rDz%(}fPy6pX;f}5*9%WC1N%gEe;Op%(c>J{If*}_wok(s3r)G1Q4L&T*J{=_gA znIbj2y$A1&QQrbx|%r@xw>@Q2^}IcYuX8FgMQX0uU)PssK0>BQ&8krq zO+G;=-4C*h)Vz1cuRUMqOk|Qrrn-}wjoT)^qk2i5z>Mz~y&xtLV=z<6?)GM0CjN+A zvA-=jh#3P?y=&1oaoov#@Y#qI9g&+~E)mY(#Y7@gBzyZy>2C7-MwI~&T_k&!;)7jz z<_ctrWKW!BjLGkL*$sp`MY5mXdCo<(mAZ@zU1Ma5WItGYa7q5|bt^JOvaejUzP`0R zjddm*1ldKh|4Qd<@-m?hGDWfvU)bN|!DlEkNljDP|LyHc%~pdF4CRl=@q8&ewY-L! zUA*gVvLcPc*&LA~H3ua6d4Zpz&B&xWV~DPnkm3EkLwRQG!4O@fW9$P}sh zAnvRB{9SekGDT|ES~bRlXW9>e>>@SK=Dpa5XEsKrNX?5IYLDRW+&3Uoq-Li5qd)L< z+7E^7A~o+eaZbR`dt+pZ)QtGiteTZ+JR+|LCbg%Antgs$%V0$s)wCN%(PiIX^lp%2 zKAzbSnIbjM`nb;E)eJ@^W!KRCS&uJW`8t0gQ>12x>v!7nb=Dsa<0(?J$J%~&JaZK? zMQWZK*7+Bo{VOs>YPueEXu&gUjezVTHCLwWVRDpTj!co7_0|m9$=CTEnIbh4)n7Nl z$~3B3XC!5(R?<*2?aZboe*?J!k)mC*XZvSg<5>=0>N4v71DPT(zI)+8PeHx z4L?O5V=21q{i6JjTLnDDgTK$NFaffQ)Lio}-1db#Ml}P0NmHbu=1h+yUHCF15h>a=$J_54!9TX} zm`KrO?-w24>=3~}u3C&tk($o-We)SJ=VxS!)SMdtwbix zyN2%l&u#t2xBL%eiq!mgFJCRb&bpH!yGYHp)#jArnQM?KQu9jb4+Ht^zmX|Y(|PzD z+xJ!()%2c1*=aa6)N~payxt@_B1LL$>+G7?BswxhyXM|>i)^csao6;o3eiPs?s(8K zKA(LpGDT|Uis&50e_HqlnIbh$FB^S=AJ5j)AiGG-uN(3n<4v<)XZCIum@jf8)S;qY&5JyMgG;lFl36vJlf>9qr;FXQgeK> z!^8MFO6CvQMQUF5T9%V%c0#5|&DwRVr{S3gkV*Zip?kq@bwc@hPd5{?i_~26dggfk zL$jX96sb9|6gvSi#fPXm+6)KJssXhoB6e{-5e(Pi%!-K~}~4}VY`fJ~8^S6c3? z#@`#AMy5#3Y2GR3^L0AShU^+@{`)XneaJJ!J2bvxMt>`J05U~tCXVn3=IcC-Op%(! zH!j)8fA*X$0J4kJY*)>5Ip6Zbkg1_2ji-lGx>QQ{=;L`4nbh+dy6+e@Fd?tI%N)oq zQuFi6V-dWXlYmJ`4K)*7Ien0S#Bc|ZqFpm-WLcAYj^cAEdP$L*t=^V1`8$6ZwX$bLyA|LyDia9VMQXmOb+k6moP|u0nsd(&Ji)i;b7YFt%=c;R zC2M;cZ#v4)gX|h=(s-8Yp26giO#m`QYG$8OU^8E5Br?gP7<5;!9IOt1;$z)9jPDm! zm~YMQLKekfrXmJR-eLQ(DC0gn3y9iCwQofJsNRg9^rwggewM|kX0;&7 zPWxL7wkwV1EZFjhkG=qrA~icXWO&R+e}hb_Q$zP>lf16;%qoi^x=77yZ`=3fA20+V zQ>3PSoOo;bz5O*ZMQYxv*UjX2U#l#E>>@Rnx;PZ#$1@0-A~g$bX|S08gRqat6sg(2 zXf@lVv zm^0r>_A8)Hk(ymv?sw&HjhY}+q^A2FpIQ7JaVRoHY9{-U@;c8wjUlds<|JS)Jhs^rg3<=k}os)DvIu^v1`)9fUh}*PFMe=9x@nLx{k;c zsTu3tpcIO!E+g|WGBwnsI@dRuIoAXB7f-q$OA`5i9%8ptkE^XTl|x%oPWB2z<6nxnS?r+%qAm7d1&yogMZn$2gd zH~Ided}|@QNX-}fCfk14$*ATiVA8Z}sF^3H{eHfct{_rFO?ntmI@z6A{1oL`N73Cx zY6eC$e#0|IAX7t4sscA6p$HK&%VP>0`*rXW(J=7CT3On#jADKbTBR#+V=BOJFC-W`u zk4%x8_nXXW#4}$YQ>13Gmq*v|OplF_o#tIb_lN=6#_~(ZLS%~6?6)eoC(nF`Op%)J zs&vfCXRo>mvWwJAczlq_4?8VIrbx}U=a=uYKC>~Z`5BlroEmB->gD6Z52x2=ie6l# z=AcOLSNw1;MW#s2WyO}+9(NlLHs6pbQnTBef@ApXwYETZ4K?Wi<~#e~V|9>^{uRk9 zkSS90c=^@6_&V)Ep-z#SQ7O}V^GjVLWKu6_=)T`)Xg|KrU}TEaOzHP_G0(Ky3fVD5`Bv(WOp%(6%N=>nGfyE?q-M*a zag*|MlywJW7pd9pM#{5%FAYZ~^{0mJu5D7e@m~;g8<`?CBeUe3!>d_(CuA3?d9M3e zlW&+01SXZKp=OR08RGE68Hq@dnpLhXyUBkqQ1vj1?k-aEV)-miyqar~DN=L(p}~Xr zX^*uF>J+J&-)+_-{>xn2B2z<6+KC@z_RXQ@NWJZAJTV+crbx{j?W(2ZpZez74cSF% z_H0<%htEC?nIbiFEctzwuk!&ispmCxA5`x57XDP{z6Y|4)U17fvF*!UjR)G9z$B!G znw6(-e#n>k1d$>&Blq@?$1}_ArRX~E7g2jQd(_ogwPy71FA7AaNX=DFZgcq`7Wj%x zk($TuTx-d%$j$aab`3RYC*Js{_H2H4-+@e#nne#6@Z#qv#eS$$q-LzHdm?#eS7eIR z>|A1m$(OqxL8eH}@&!^>=5^0_0J4)uG3fsHZJ-^Ss;L=Mm+}3gKE$NWCjr?=E9>}EVF$|`vGpg{gBs}vN zGDWf%8-LB@m(4RDg6tZy)1q{2^SY;MQHuV(cfQCJ$v&pWyl4D*;U+RgvU_CD5}!XS zl{^gDMY5;4wKE%k?4E~Ak?gI%_D#T_6F(tSB>Ut{@0apD?|lTai)45D5oGe6^&5am zEw7m-)2@NemyR646fPDiFl%@cbEKj2&G2{J`$X4*c;i9aut4~Og` zHNyj9t>Kr?g~$}CIdeu&2cG!>nIbh8Z>_kTKiAYa4%tO&E*W&r(I3&BiAvdQlBEi8=kz*@|D55}kxPMQVP{ki8bKQ6FTA)LfEsNfy49P9syKW|hwY>-gO$_bJFOQZvcb z7omKevF1QbSE@dGCI`ukb5!^)nRRRYOf;)^fOXnrE&;rbx}vUQX_Od)l9c zI%zyLbhi($nTTh$LZ(Q~x_9gB=9&ADDN^%7y-bsNrsFxtE>d$zsmCk%mLH5vk(%ef zmao8X9aoSkQgd{zDtq`kUCu*xk(zNAg^sa)yk%5#8Zc?vP1U59Z`ZtTT|RmQB1LLW zF8bmoAHB>4iY|M>@RrPOoy6-!(@9lcq>R&8=J7oBXoo6-0{EtbVqAY(9FCD->P!{Y4wX!w>MSG#!~D zHCOHGa+hbmM5aj1CMRD!;Imh`3fV3JBL?+FTZsd*}V(MO)S3z;G{U$n_<^7t?9b*NLM=FM1XY@d)Dcg;S)q~X+1bK%`3 zo_zFhM2ghReB^CzzU6b=pyTg~An6Jz6u~yMIC^^^&RX#5^6+t(^LJEBeim z_btdSQnTlPZW;LO+mR_!Gey^cJ^UlZRJWl{k(x;#WxmfJX!`+^qHCzxHQ;e)6EzX3 zp(agH)mNT1)gz$j)1KoFMK2*zvskLpyZ9*@gG`Z{WxE%;%`@*KQ>13X<2h6E<5})5 zWEZKK^;l#iU*|$(YN$y!GI2a#zvP#tZ^+b8lbF6cS2f^w_lEZ%JN2ij?!d+vMPV37H}_(?9M|h@bW%4nv1WQx?>b|=MC{-u!04faa-v|WHnNDVbx7S8{jUy+X>Ql#dmrPDL>2Zn5q zDZ0-4MWnl9xptm>ouiQ{QZxCIkoY_^0+}K;=eD~%kY|>C0@+1s4qSFT7SCLWOp%%$ zn_tY$&(Swziqv!*@T8E^NL|K5a?_`fT|-Tp_qEBFROXku-N+QFxua9r<~%daGpLh1 zia~d!X2K3rYFQ7o#`lYQ6O+0#1~U~g{v6Nt{62gbh$LnVNOc$Ey0^n+emze2+!nm3 z?ERv<5B>A=&Djr`8b@SWk2618{g}Tqx`<2~&KM?0Wxw1%tI0h-y4}CH4nF} zdW(N6_dGDEJvG$KQp~>+|7umXw-jCW{Y5Kh2RGzfX)rQHYM!gVD5ZLq82x$Tb!1X@ z4c%9+sXdv$iz)pMvTLYG?fE!X?i;E-qt_XPOp%%^#;<+P|JBKFWNN5MbvEt%s-{v? z;y8fwxUJuMevvU9XSrbtcCG@Fm` zyU{^piqu^H^-v(cYdU>_>>@QoXH|T`kLOTiiqt%n?Rgl#Yu*4RO}nX@w0iEFcrd5h z;i9je`My$g+3%xu`keY0|A1i>6s)cn-Y! zeu~;TqW>++N@UU;Y3N=x%h+yNElhP8cQ}XdP^U=Eb=O7?=G(J7GDT`uPu(pE&pe4t zk(w2T)@;c4Qtls+U8LsL3SC3^)6zs_iqs5w`_hl!HD3UerpQ!HT0IZd$zP5i&ayu# zdNF#mq|r(~CB7}=cen+}6sg%GqUCSC&QHh`sky#HKtukpRR0%b*HDwjGr^G)CcDvg zWQx?Rd!|QDehEqa8|tKa*O;Ro&+a_onf;I{Qqw+5s`C6CT|%ZvP1mYh=JRzH{sY-X zYKC~ar{{0DrXy3NX8vKj_Va2+0h5MPL(S94rw8!SE7--d>)54xhgL2wMP=V#G^W9t z8GQ65$kb4ib|dd2U;eJhifi0Cej!t&rr)o;e?Ns&tFn>V%pS6f)bv?9XbykBwFj9Z zHGc(O-NVn3V=Smsq~^8`#oF?7Gz6K{OB%Z0U+(Y6FUdEMDN=K7p8hZRKihMS4cRr+ zq+VKi@K=z!caQ$*>l9>))Qox;XBe;M8(>m&4K;HN88(kUFjR7&=(6uG`cR?bS)REP znHp-+Zq%+sI+G{KapFLoA~lmGiAcw{e0yYy)C~10oyy5F?dme>egv5!H7ooKUX;(m zQ=^-$jfx`77O|@t{uXPYvC7PKb4b|5L!8$kb4iddcTV z{VV(<#Vg1Zso6FpUPJy~(>*?Ar!qCv%yOf07QU6HAX0RoT|O?OAHQ?FL#9a0JS(>Q z=C`z_x{U2vF9AdsshO_L^rg-gp1O?8qsY`ylUC&B@1Oor_c77$HC+=zogy{wAJ65) zFClY~DN@s}>miet|AZEsrli&^T4c@@l=;_jt(M|dfrrbnxi>^ z-UXGK(U;FWiJ?xBnicAI?auF-(|}1x4K*iUNq(C@Fx*F^NX@->ZZzfpK)FN`iY|M< zsL#7pefY!DOk|4G%#l22dj5l>C}e7=Nh|WO(|0dgS5IRrRZa@oMQSE0ly*yeODn0% z$P7fLNX_s5c^;{%)n#NpL#9a0CF949;qNs|CWGuEHFMAHWAfcibCIc`Ce6{t?E8`` zQPpM4{tlVsk*V(gnCfkyDKBo0;NLH*mE4w{Iw=M-74hJ`lC5~zmjIE(G)2;y^!{hu zYf2(DNygwG5J}7!f~)s-j?cJa@^`AWQ&4c7-$$c5&jcPV$=4ZzOp)y09;Y>V&m?Y2 zsFS8hBfCdvhcJFoYKKe>*(rPG!Sh$E#WQ+y?nkCb_B;t|WL3QA%=D=syN2vk=lKF3 zF7b2JADJTAzqiWPfL}n)BU3|msKVZ_) z(^O4blj?T-c9eha8G%R*H7WX$T=5_B(LK^obQh{qqvbz0y49Yqa|JR*Y9>$Hr8}=t z+_X@qhMJUpLF@J@)a^m^kGI+&Q>5mBpK*5ZN4i7E6sb97#`Plntx>LYkX@u^hBLX- z@^wx_rbx{K2R{1qb-qQWhMLs#xl`xd$lr1_P7m2dYR)`X>NUS>?f@pWr>UCMO4B0U zBUQ^sfBuy)1C=Rzzi8LImp%Bqm>$T~P?PFhJTc!XHSN*A;`1^xDZ7U5As@fiV*;fvedv4vTLYG*|V3M^-ax~ zx{N2VO~}+xljc2LtqLRg6GNg*P^U=E?Fmn{=jW&cGDT{psNUr+ujXN3QY&ewIcjkF zhy1js%}mi{?-xyN6Mrfny$>=)YVJ>YD+yocIb@2|j5}tA$tz%avp{wlPYvByrfq+n zZ_jba6sbA0!;X4-=WrL z`P0&8WNN5MbvlKH*5K=GniaB()I4^7K_su{ZeY^1o2p6C8{{6Fm0vxRW}`A??-#93 z`ZF#6{zeyMiqxDvypTVCP&|!Hk(v`5b>Ge(mhxwZ>>6s)w1?)}@5&$QW+9X2NJIB* z9qXjw>->yNk(#N~1kL8_^vMC)MQYmTIsEsJ3)NxKxN9Clrbx}C5xw2`6PQy@s8gh7 z>GjJ)`IF*!WQx>`_4RmR{$BGrFlmZ3)C_vJvwAkmP^!x~oTYM6be;E$s6E$?>2O{R zXLRNYWQx>`w>?LD{y>``H`FOovwzlJ+xRbg?14-THEF4vHU3p+{uz2WGDT`ON#-5M z*O}QFveUe4=)T~)M?${NfymTQld>mBT{kyh=UHTm)SNsob{d|UI}c>nP?PHHkn^F* zZ`h4Qrbx{$l|KF8cg-8Xq~X+1Gg17vjrflw3go5eviFM~Jw5Jj{X3P|^O*rWvuHlZE>bgce&=R<_9@5|sX4IB`J;TD_mL@5^Yi9KUwEc_ ze#lO}q@nwChl}34M*heYsd+tM)pdRed4Wukn%URvuf*3`p#WqTsrlmk>Jz-0^MOgx zHPl?5|5b0k%vXrictT4WMMNgt&JSmmf)ri${Y4*&ygtO&8H7xcn*H|fd(SgJBU7Yi za)+TycxIhKkX@u^->Tm-@#DD`nIbj!u1P(Euk#NwMQWDGUv)3fY*HAqQ-5mcKE%Dz z2tNB3WQx@6QKWJbzRvhXpiYsR2`6^0#UE(f0F%npQ1jK^bmjOmw<1!croG+g;XE_3 z3q_ZGe^K@fy$>@QImc?$(Gy5QudR{~K53xU{;QR9=GDT{JU0F4l z-!-$lQFcOVsClPYj|KdyG!T&@HCruRXwOGKi%ijhHlo0ZqC7KqF^Dcw^NQEuuYC5A z$dsvB;`CU)&TGh&skvv~W}aENIAj;8nX!Db4t(}W$P}p=_GM3qwLOhDG7-oWskviO z>j8Y7ZY3bQNX_EOU90fSsmLUcV$fZ^4YcT_T|RYgRG0Dliyjh_W<3To716!PXD{n$ z8ed{4>TXL8&u3#ms&|1lPfC5#iZo8p1VoBt@06&>7k)5rBU2>%vx)7F^30+oA-YKR zM5V_}!M z))|OQk?gVEo(1uBMj}%r``EB;8+m5M(vV#wd)kx%79o|C|9_4GktveBS?Tf1tR5NF zj07gNyoQ>WR_t`*qn9s3(PiIXRKM`!0z7jLGO13D_Pp=7Wel%TBr-*6{(AZ$wRJd+ z?dee#vWwKL8Fp_LUuPgPMQWaL^IOIQ>5kyN5|Scvs!t`E>d&2%YaD!?sW+;sXaB+Y*K7f1V2UZ5GmRWd zdFE1NiqxDiAzem(`TT-Rk(wjQ{YcO6MzuU3yGYG^xqK7ybuL4uNX_7N`AhQ5FUSPslD(bBpWRM?7;SGDT|s zb`L1cXa9jrk(&4Ogw*HjtXl=Li_~nr@@pHOxdxdcH3z2NHO89VsOE2A(zI)+*`rHw zlh^d>SEcB1|EkfR2_DZc$v+6$giMi|Bf<`J7 za=zlTA3!F}k;ZstTAKI-&rDw(vWwLG@##-4{=Kq3$P}r$?0Tn#{CJ*0rbtc4#YtxK z*>ihAc9EJlvX6MoXCH}7k(vW)-yxO4fwzA~i?u&Jf0DpN&kBn)@q7nfw%F6f$Yv zO?9Vtz$zZ_?5f67EqBJd%Ci))eUzo0H7b2&0aYHo^kA{{^Pzmch-CS`ZN zcfB#6y=iU8E>hDu*=|>U*W3n78cq#0&%VmOj33VUb*N0)`$ea7-zmcnXM1Fd)a(&i zEr@UV1IQGqdGB;<6OGc>h3q0Vr%v*Y%V+O{Op%(6(hq;lFCk};si7tgFI*q~^JD z6~6P?Un5hbX2Dv4_xV<;-T<cftHAlbx`j)Tr8!|;|+P4ik!ZYhP zgzVIx8oCEBjb-xHVj;*BsabdM+P-|9u^K_0A~l!2pD{gwMN4%V?=_nPlgiXk^TMYe z75Oql5Ghi#O!bVhc&0;RiY|M<=$G%Q-u!zeKFAcQ+3o0DNB+^$c4Ugw{QWY`5&oVy zQ4`26QnTLeRVMG)bVjB~&5Mmco4gBj5Sb!1+wCbim>%o6PeWW z8oJvZTy63WSU568YOeFk8pW%br5R->q=uT;yX1|>Yt$2wA~m0#d*a5g^2d=WI?xV1 zRV5u?XO`v=U8LrZDrs`^%t6Q$srhD$S0g_A1!RiU4E9Mohp*GQ1!NbgneU?KYMwa? znIbi-cNu${XWm4nNKKE-yZ-RwS=0xzi`0B_D(W_0=VWA(M=|KG-Uhn;{?>WxCmsLq z{UT!048>rkA|CD6EEE4=$*rX=IXnc40jb_y=}_gsb3XV4M2cj0^V!>!XGS1XB>T3D zZ@ThK_f`;HBzuz{N%Qi|naC8$ex*ypXZ(5LB{D^_CkkxThTq>jT0?efr5Ku1&AacZ zQYL>LGY^>}*}qolV)9o!Z;>gIeVtENlfPi9)&{bRWDo9{*pr|4rN|V?UinV~lfNnb z225&s4K<^B6&%d3b2ZvhblLkwanH7E$VXp}OsZ3(l_pdy(vfHWK&D8|$H~Vy^4S}- zgX|(T8((Yvn6EPgnIbjw%)GaVXF9ZpIz?)pD_s0If0Xw@rbx}Mvm3_a$8$F_MQV;K zx@8)lJw*q|E>hEB|HA`3vnw)1YBq{{teJI5Hr~A+0VcJlhMH}ozMH&?ov|ZDmwkUx z!&MKG^3nSsQ>5nAyrE@z<|$-Sb`9N2&hZ|>Gjnu;>>@Q?Pkno0og(8$62p)wQnT2f z)kXMS^9nLWYA)$A_Y+@dzRr+cq^8r8W8pk=3^GM(mK~L#KA-&-GDT|E{vAGuud_%O z$SzW|Zi#}v{DF27FsYR^)I8UBPG!E#TZj}LXfJJVJ(O?xqFpJvt4PhlV={;FEAmui ziqssDHd!~m&WFgP@zl`$_ktEpcxLHtkX@warqQil@XP>YiqtHeB=Iet`3jjLHEV7^ zwUcL7=?>XNYEG$Fu^&J0OOPp2^M2Y@Yxp`pBU7Yi?+y`(`3FmNdQf(nb`3RKFZdk5 zm$?LyA~nYpdYytF&acQ6sp&HMQ!c*FIz1t}NX?Nu)YIhEzx~J*shKm!)laH0!+k(#knfqeF?{UAHdyN2$UCJYJT>l}nk zk(%`r=AFkgFCbGxO?nro*{NHH)u-9f--F8AAF_+o{8ZsZL;e%;amW;@IV^pO=DeB_ zz@*{SP;>cZpF#W!2QC9By6pX;-vg2_<=s(*_9 z8+MzJsi7vl3zYC?DmVUdRU%)gQ$tOvbBW8CO8gvkMy5zj-;BL`@(0=@z@+FJYL@TN zDTr_RRD&tH?Dx^~4gXbzpZ5Qw>@35odcHO+BDP{+2Vf^+H=-EWiiKjgf~Z*7f(dqu zov2vY9bg9_wxSq61rr5Z6koUh>$sl%vi8NS59fn^xUcohtb1n8KEpXfkg1?14QI^t z`%U=ayo^kdngxB`;`!{w#zA%kHK~<$X0LUD&prv6A~pML$WWHwjUFIVq-M!X?d$N& z%Htusf|`^)-Sk4Kc;*~rQhyriPE4l?js~BQzd)vfn#A;5JMj=d?+z0nyGYIQ<~d&T zyXFdDQke>B{u+?v&i}gPYeb3;v~PDz+sUu;&J!uR?0!*?**pDs<|bq+s7bm%YMaM} z*F6cDA~n|!_&AbRv-2d#E>hF=;I6;FccRs*f9iV>nIbilW-MFG??%}sL!BZuXU$(Q zlb@p@$P}qrd(V-LJo6GVspk!Kr+GhaKYb`a??tCTc9EL9=GVW^t2qgngj7)T{GD_T zd@Ef?q)5#=3y*&1hqIgyMVI|P+KSjTyZKg{iA)7GY4voO?!J#-J)a{}q~_BtPRn_w zgD+$ksd+VI<|lrRRv=TPX3VMv*Z4X=AycI0%iL+J@^!YF3fVFch z3P|mq$*%ReF7p#)HvM1lYWBo546aeqr_z``x1PzN4W=f%e&6VZOobydO_1;Dj{k%cjSCo%v=$ zc4|+``GKyYY1voCVoMvfH+4Q^+K{Ud<7} zq?T7u)2;q`Prl3xh*VIMrs(jm`sI0MAwP;P`+c;Kk*OQ1426*Di>aOzwB z3Nl4%4!Jv|Jzr;Gf5G#nIbhW9NeAFAUiTeYMyYcdxx*H@NCE~QnSuA z&lfy%Br-*6c75bkito=W$P}r$;i0*mX*~66+RmZu)Se1z&dX}Qh+maPB2uL0he?HM z@X;?Lla>&L6?s@ft4uu8W-dgh>?6>A7zk1$8rbx}* z0U_y4E1iDVEWHr2(|9WA-ta=gS-#GR$P}r0uGxkUJo6?pMQR4dcn&tmz6i35)XeoL z-ixnuA~Hp4+CJzsnD3>V$P}qLea|<8uhT2D7_y7h{BSYVI@5US)tn4Wnsx;>kGf|} z;2+rBK%{8boIAG0IDR-QETQOCL~3UF?B0}T&OoL}&AHb*8GP&CBV>xyeAv78Rld$j zOCdYWk%I1tm*UL%k2(C1DN?h;`_Ga5ygx&xNX@P{%op)>)>{VIMQT=<7HH5*E08Ht z^TTitU%t-w$P}qLta-bgyqeC-DLYM(f||pA)!WOLxeAdYHA^OD$ji6qCuEA$+%R}( zWxmelDE3{6?nS0Z&0HTsZkT#rziVb# zMcHXM71Rv;a&i>k@;wkKQgiUqxbvnm^#{cx$P}rWvBQmie4Uo7A-YIS|NA}$KVdfz znIbiNzplTP&mMwIk(yDVzOj7vylWu4NKLm^k+*o}aAZ<1Dd=9~OP-@V^9nLWYDP5P zmz5vSqH7_$NX;c3ytngpjzgwM&F6KxMDw4N-UKE^S5VXHe%Y0LnZ?&pblLr)i!}>* z@WVL?nIbhCg_bh7V{;psA~nyq8lRWXZnqw?i_|Qgu+oiZ&P1k2%^YiXjpSGPC&(13 z`M~x4DSn5mu>rD+)I8-7+Ly0$9x|yv6?Avlx3Ck>j6tSI%^M{hAM)89HbQohnrB*^ zuE<~gTLMffQ$fw4+ZV;~(Vrtyv}?XE9&(#!*4aeSW%rAs;#XAXTYd>LMQZk{Qeqar zguFwhNX;=WUrX|JHrx!^MQVPH-fYD)*C11*=Ah<&ulej>kSS6#@ch;-e4Q<~Kz5Ou zC7OO(#xnzvNjAbFLIKOLl38d_VR8X^X)@E^h^qq(lsTq5z z`xk!NEw)0LqFwXzuHs32on4VBQgf8;=rEpn5Sb!1-ye=&!e`IA4YG^WELLmO1isFG z$P}r$`A~`0Jo6MXMQS={yqKA1=GhL}MQVO_FdNM;^TUuSQuDdJ^?QETyo5~hC0PH!?-CZz}UC125)nWQt_pct5wnb9uX6keymyp_eTER^{XCoQ_P9?DH)ymEoDu z$P~$bsdBb<{1LhOZpuzAub^g7;L)=DzA+P#A~m}&TCvR_Ix?wFg(<3Aru%uGS$z*g z7pa*pV>5%_Tw8!lk(vwrD&FSnj76qM&FmJvV|b=xFk~00X*ue}6Mo(UkSS8rv2d?W ze4QVVDN^&yqDp;vX4AcpU8H6?yPF1YV>TjFq-MTp)h6@1W+E`DJr&e^SYho`ewA;z zkD|-Izi3*Y$4mJm$QERZ)clZYV<=x|A~Gqvg6?w)4*Sa2*=|2%7pb|Sz=jcgo!gNq zQqy*Mf+No~I{_JL0yJ}kX@u^Lh5$| z`Ru)sDN-{!ga1ih&EvqNR#H%NL%QMp`QglRh@#8x7j4QHcb|{m7nve8>wHgm%3p3j ziA<52!6S0+=N~ZSI}F)rJQZ|*o@Ipt|HUgKkttI1)S0dZ7yEA_Q$bDoqlQlt4piX( zsG-6U$SzW|W6VY?{*M~`kSS90-iC04zqt7inF?xB_Jv`N{rK$ljzV^knmv#HKE)qs z1As}>uApY6&_nh3;e3Ti(Sf$ylE^W9%R3#T=(77o`C`rEdFEPViqxEyzLUWhB!5Sy zNX=#kgX-~1oy&2^PIIK7d-)t6oA68Bc4R83Nq^K}TmESpemqm3fI3BLuB{Z+o3FDQ zGDT_@+fm~x&pd=o1vM%A=92E;c&6n^$SzXTE9k{8e%BlbOqwDEHOJ2XHjF}eMQU2d4Q|R$(SBr#)I93D*n+P!>jj7|Qu9r<`<8s21CS|FvrD`AH~3{K6qzD5 zH>S^Cnpd;nMaV8vb79^I28YiP$P}rWeMyD3{2X0FCiSO+?p+2S^5n;}_$A0LQu9}- z@Em-dlaVP>b5q@e20#9A513S@f|@Nh|9Hkf{VQ{sqSp|qdFiQZIN$QV$P}r$`N5ps z{1iPxrbx{TdD{K`vPZ2}{q5oES0KAcO^bOOR`PW&LZ(Q~uj>ZA5nCyt&Ho z2ikqWB&33xKkT3N;a89}VHCZlNX?tI>t^7ms2egxYQA04;T%7lhmk2#v(+${5`6Zo z;gDUVX3sS--}vkUkSS8rBc$3CzCA;bDN=LF?lqVA@yr(i*+puu^T}PBAJ1XP6seiN zMZ^63GJhGFA~nxd-g%ZE&tlghJ9(6X?%HjjEbsT9HmRwz(6| z$YDSvF;hTlcY!*-KUtY?&O(v@g4a;_{vvv&b~atPhCFi&GDWg)jk|Af;UE&3BH8U~ zSWf4gv(yd9E|Ps(h8J~)Q)4XOU<+443;mwkUxj|F~J_&T>CQ>5nG;0@V%ruiMH zQ>5nnN1w{^t<)WvA~ko-GB3fm(s5*p)O<5F_>wJn#k($qg33-hl0V_NB;FP?NH6{g%HdpFIwl3To0EjjEiw7{4qzM?rRxn$60MkKo613o;ed zr0jd$4i?aQQ~Mu%fBr_MNX_(17X*+|iI-q~d^4F0mQnTdZgKhXZD)Sh!i_{!`rcZVL0oV*=DyT`>Eswr5 z_`|j5$P}sRU#`p%e%Gw`gtF7LE2z0WLv(I_+7}{Hq-L?p{x}-m$SzW|Szw1oJaZBeS%aUV1Z0ZT{4%zuHP3AO3ZjeDthMez0?!Oarbx|*_V!2lX}5e0 zbtK|X3@^kpOTK~ZA~mO!J7B>xrz2CO zX8IB?!})pt51Ar0&-Ls#jNdgIyrt|ET|v#G7f<%(%Ups;k($TyR4&LfKO$44rq8JG z?EDhq@(!Yl)ZCvXDlb3n`;e)iChc&C;;heT2XBq5-!-$vL7gHsCv+Kko*&O4$P}qr zWkRjv{QK-{$P}shc*it@C8Xqg$WHyKp!=T2YjX3u`*dWA)cjU@aU#!*MW#s2hHtAm z@oF~xK-sBGLp7hE`Ns~bS{p&GgDyT_2T=xHFUgPV`lK^#!)Lh`y{CI&sW2wFL<2f3cA~k(8l!@h+ zy8Fl!skwMiUW1cO&5w{>q~?#JUM~D8WCb#*=M{8cI4WW&za)P`rbx{(U5oVQ540|y zC_5ny)udKxH*xp@zRZn?6sb94!Jv%%ik#{*lqpj4)Z3W5yhd)w6shT*{fGs>gd9Pp zNX^^1D&6BB+2s2I*+pumpET5(&psTPA~o-qUr?H#_i$v2)O=^1KO6tY?&ZEhc9EKw z^SnJ|+Ku$fk}onvYMu*v+KB(bliSE7k5bTGyA8Cg-SAu{HTCz4%6$8moro!zsS$U( z`}{CnUeRA-7z;!aGXZ$v$Oz`zE}YMSnnck?e`*B6smex+%yM$v*S+I2XRo zXUJ5Loz8T_U+x~wfBIT45weS9PxsYvH9toI$P~%`rtp}vJo6JWNzD{`UQ@H2RnkJ! zqNG=|^-s!9`pd@ks>uaPFs4ww1Vh$PeLZunL>0;_Y0Gq6Zqlm@C%}g z)O_{2;~u^}gOMpxbKk=AqxtCy^DyW&Ec2s*dZ zk($d(EirgUoPbP`noIjl@#5=jof@)>)Eu34b0&US3PPqx&EGB`gL!5;bEs3K=BQQ= z4Zec5FET}HIz`US#eYJ65}6`3lfnu|nND^3T{BM_%1*7Mpr*y!Rc-lccSod1%`@B0 z8u82v$P}r${oX5Eo@r|V(M4)LzL@SR&zyiv8czk?lO9Y>;+c1mDN-{bL)cG#m9LZ* zvWwL8=(=_^zZ=a%rbx|M-8VY%YQ`c{q-NUCtvC4bY?uzRi_}c8Eq8}s=GP%pq~@gh zEno6#{sJaVyMmev-Zw1DPkY<+6upW_&9>9qUE!neLZ(Q~GgE$l;F*~+K%EL|(tD$t zt)l$2hd|m2sy}!SLZ(Q~ke`*-nx;t43_&K%k%I0)Jt}5l#zd@%>=-dD%!H7eaxfRJ#$v5ljdDP_snkwmE^~BFfv7IZY{mW z;IZ08WGbjh+22&1zft>_R;xaH5lhG}Qq#Nk_v?K2Nyrqb`D^O#ocw#uC}7fXDyUhg zO7Fk1lSeO~jiOf*scBZs>?{9ip+7Pe)TAjI+TrMCtv!=}`uYl)A~iFFZ#~S{*(5t; z7pd8IN3~d<8Hh{;HE9XiR3cYSzLhL;K%F8rLu$u#=9#^bNxfvKJI#^*#{7T(BrJI^ zokpgDnv~tzW5is3CoYf^vWwK*)njV`evT#}Q>5mFGHLhlyJi$HDY}B14s9a`@nu%9 zqUf^UN857H%#CNxL#9a0*Ugqq)}~zJ>Q~Qq$P}sRJ8a%q{{2?7T##L)X7tv#nRwXYBmn+u$osh9GFz5f|`DfoeJ>7StKt-mwkWH(L($3 z6#Nrgd+DS5B2z(4nxgxQx{l+gCLMfhWQ}7NX;qZo;Kmfa|1FJ)TG_$ zcj>wpwd@*KKb~g!p-z#S9-}U|=Re@;flQH_6SL-iVE(5@?WM2t5Hdw-Ms&?~S?dDr zrDvKIfb7)s3c3frKA2$o!6ZGi9Wq5~e*S4ToIlWR1tuX4)ud^!@i^q~&&MQx6!IOB zq64jczGD^mRmr6w4QEXSHL1>lsk{9B%{6UD(huiuWQx?BJt*S~UQLTaP^U;ur#nSQ z^LK1|BU3?5T9!PP+uSm($olL@kSS8LN0zJAP4{8+%q)c=yGYI3t7fg_b?=T$k(yV` z-x+)b+CgNB)XWiNahO*#r!{0Jk5bTGyK=Ch#lt-&HTCz42K-~fPpBB0`M+7$h z`uKnsvse+xE|Pub%Cd)eiN+&SB)iWM$BKNN5y%wD9%?h$i)WT73fV=nFRy4(m{)Tm zFsbDY)ufiM)FW+9zRXBOlI|(2N!neYb0^Oke9dL4ViaBW{YAbN>Ll_l?~6YTxES~-`3=#*W7*``U3M|>-7K&FD4 zr2CsKF$P~W{vDYjH6Qow^^{*eT}nfCk(!o;Ljrl`c4Ugw3@_l9fgjIQWuQ)xn$BJg zbMtDtB2%PhF+0ycCq(U(`2SCedyy$p(`k17-=-6TUd?o6DLb{2p_^wYP<4G%W@E1q~`N% z6sb9KRZ?C4oo0dZkX@vvYpd?v`DeZ!$P}qL?LsYsHysy|DN^%iLZ%P=c-q)Oc9EK= z%S@feZyn>1DN?h1*s3U#?s_#NfJxJ?pysF`&q11~+Doryu?iGjcE4yr>)&bl=d+`c zDN=L)`6yR@if$oOq-L6IS1<9)lAS$dS5T8qAyx$njL_=T+Fn1N{>Y>`QqX;!duJd1 zIr4L4iqyPUsZjv`_c0ACLUxgwpZyv+^SfpsGDT{B-&EV+ePI$ZWokw|cH)=14wWFg zNX_P-;@0rHW*{(WiWJmL__4eNuhDlzD(srno-NL&t)(%Of2!H3GDVmDK3aw82RHKV zc@UW*HDBhM)t7IjTveb>1vTju;_cvI@SR9QkSS6#pL@eVep$MVOqzEE-929n9>O1J zi&ll~A~mPI%Q>R(pLy3_`ekVxGDT`u?d#Qwf28;XnIbh~&R;pff0AFf8e|u#`LoN_ z⁢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¨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 Z7uLxsDqogEmcy@{w`z>Y`498u`yUP&!8iZ_ literal 11768 zcmb7~e{5Cd8OLu+i%1cnsEkSG>m_p+X$!r*_m&lEtvazkgd(iC6l~6I?}dZ+-qYQ4 zI*PiCZ3G!Qm>EmioMMJ%TjmcKF)BD0|6wR3YAH2{nTtOdun^*+S(g29?|aWZ?|Gi{ zc6rVVd6N?0ljnKg=X2h3zim&~l&a|w@#}|=U9;}j@3huV<6nz4Ju*L%HFKH%#s+7^ z`R3XyBU5^peK;uA@JLOhqU!UCNTli-{x2JnY!PcnPVYgi%$e=2SMa|Tt46YxP%x9- z*vd8sSdP78+EmUF%V&{=nd}w?l{%C7KrJgymvxI;))ze3_UUieADK`|q&-HT86?fQ@b(sEvf^ZWoYb;8$XfZ>(LZ=Q<@ZO*BUnMy z?{D~{`gn+w@)&(;Rh5t2`m(xLq&plHEGoaf`D5={>i0*QWArt))HeoU^ZwiZHFe`j zZE~4H%vcy0hs4m*b82CvHqO?ej0$`FrNwWmFj5^OZO7^xgOyc3a&xCQ5>g&=B1~4V z$n)B%Ju9x{;)o?TzloH`EI6?x4as0#_wJjwTwIc3`7~0XY|b*ASRx+8&Dnp$BskI{ z+bNobjWIKbTd}`k?+jjEZVP7 zkB%HVIhPZ~@~Na*g4$EeWX%y?EHeaKt@!=n4?d~oT(NvM>6&1#8P1m222-(@FT8iR za``op)(sC0Ws0$=p=?1@&FC(bN1B(jwg_Ik!fSadQ7c}+#PZuF<+F!!ro-#2OVtTrrQp81_^~XE9SDx(j=x{>rO{W|Jf&n( z&l7LHb@J5C-p;kW*v`t?Z*(5I^_~?SKdlK={J`kNX64Khq^)LQFf+0$%S%p|&Md8* z*&R=vNGrpYAP+5XjKmu2;&tV1@IMQ5ojvxv$|HTvn}x}F-K_s<kmt#L0yn z^<&4^9$d5Jbk*POIW^nn*Hm|EN?gi zn=+FjzrFENUM-V!5h51_Tc7yliGx@162Aqv+hBK4kx<0&DeRXOkrOR4YL)s`Rao5g6!+X@~NbNja zI6FYS=0OAd?4THP$PqVg+Kd{1zu{UtuwkqA$& zBTs){d<7HkYB%8yq}x4Rn1^$1$m^E8^4Np};&2-R_eo%Rbix5~#0`NTNnm++!U1v4 z4S|dKPP$uI9-nZ)UX*r2-~$p^erSgS;>a5Uk4a$pu^kSGb8iT&t@K(hKf1#Kaqta+ zX$dSpz`_A>`VE24OJLc;a6p`bL*PFouqu%_nTG>&2(08ey4$jrc{n$R zz-|fDG7o3x5cqQm)G`kT=n(jc1ZtUwLv#p?^UoFT9%`9~gLDY|o(I&L8XTuX-W!sq zWgbq{A#g6g_)8r(>6wQzbqLH#pw`0%r|J;+q6BK~Ax_mHa4LWAbX(Rk4+rWHxLyLa z%)==<1imbRTIS*W90ITA!IRsvmU%cphroUb)G`kz=n(jV1ZtUwlXD21#$QQGEr&Q{ zKe)pAIpp0Vd0OV-#2f+-Nni-`{0ebg4uRD?K6X3SG7l%@5I7)#TIS(o90FgJzz~Px zf26?CI0Vk%sioVpmU%cEhrsm`sAV2b$06`{5~yV!PQ@XxiYGX3%Ub5)Y#ahtNuZW_ zI2eb(10GQ8OmI97d6y(l%RHQrL*O$0@wv2xUS1yV$a?A9?rrc@MjXJb;>vhhrkOGsAV2b!6C4fCv|SiTIS&l90GqLfm-I_ z02~58mOw4@aQ+Q}DgND%Qp;Lfh*NOL+a`Hh=HUz+0#8X`h&#`}0B{Npfl>Y=2yVwA z%=3Xb35P&S0=3M;K{y1yE`eI+;V2veXYsJuZCT4a9EU^T1_{&}8ytv3;Ik5_WgZU0 zA+Ul!Gu@W8%)==-1b#~bwamjYI0XLI18Q}QLvYCZm*i=ghl6kkyzAQX7J9LGxH}I= z;Se|~fm-I_FdPEUNuZW_I1Y!v Date: Wed, 30 Aug 2023 11:14:54 +0200 Subject: [PATCH 132/506] Add groupBy --- builtin/builtin.go | 5 +++++ checker/checker.go | 18 ++++++++++++++++++ compiler/compiler.go | 10 ++++++++++ debug/debugger.go | 3 +++ expr_test.go | 23 +++++++++++++++++++++++ parser/parser.go | 1 + vm/opcodes.go | 2 ++ vm/program.go | 6 ++++++ vm/vm.go | 21 +++++++++++++++++---- 9 files changed, 85 insertions(+), 4 deletions(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index cc7a081ee..299c61eb8 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -690,4 +690,9 @@ var Builtins = []*ast.Function{ return arrayType, nil }, }, + { + Name: "groupBy", + Predicate: true, + Types: types(new(func([]any, func(any) any) map[any][]any)), + }, } diff --git a/checker/checker.go b/checker/checker.go index 41b1b2c8c..c1933a115 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -718,6 +718,24 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return integerType, info{} } return v.error(node.Arguments[1], "predicate should has one input and one output param") + + case "groupBy": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + v.begin(collection) + closure, _ := v.visit(node.Arguments[1]) + v.end() + + if isFunc(closure) && + closure.NumOut() == 1 && + closure.NumIn() == 1 && isAny(closure.In(0)) { + + return reflect.TypeOf(map[any][]any{}), info{} + } + return v.error(node.Arguments[1], "predicate should has one input and one output param") } if id, ok := builtin.Index[node.Name]; ok { diff --git a/compiler/compiler.go b/compiler/compiler.go index ecf2c5ba1..a26d85e5a 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -814,6 +814,16 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpEnd) return + case "groupBy": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + c.emitLoop(func() { + c.compile(node.Arguments[1]) + c.emit(OpGroupBy) + }) + c.emit(OpGetGroupBy) + c.emit(OpEnd) + return } if id, ok := builtin.Index[node.Name]; ok { diff --git a/debug/debugger.go b/debug/debugger.go index 6bd66f977..e8c38fc6f 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -130,6 +130,9 @@ func StartDebugger(program *Program, env interface{}) { keys = append(keys, pair{"Index", s.Index}) keys = append(keys, pair{"Len", s.Len}) keys = append(keys, pair{"Count", s.Count}) + if s.GroupBy != nil { + keys = append(keys, pair{"GroupBy", s.GroupBy}) + } row := 0 for _, pair := range keys { scope.SetCellSimple(row, 0, fmt.Sprintf("%v: ", pair.key)) diff --git a/expr_test.go b/expr_test.go index 0bf03be5d..54b216d4a 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1040,6 +1040,29 @@ func TestExpr(t *testing.T) { `4/2 == 2`, true, }, + { + `groupBy(1..9, # % 2)`, + map[any][]any{ + 0: {2, 4, 6, 8}, + 1: {1, 3, 5, 7, 9}, + }, + }, + { + `groupBy(1..9, # % 2)[0]`, + []any{2, 4, 6, 8}, + }, + { + `groupBy(1..3, # > 1)[true]`, + []any{2, 3}, + }, + { + `groupBy(1..3, # > 1 ? nil : "")[nil]`, + []any{2, 3}, + }, + { + `groupBy(ArrayOfFoo, .Value).foo`, + []any{env.ArrayOfFoo[0]}, + }, } for _, tt := range tests { diff --git a/parser/parser.go b/parser/parser.go index f60ff8936..87cdb2982 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -28,6 +28,7 @@ var predicates = map[string]struct { "findIndex": {2}, "findLast": {2}, "findLastIndex": {2}, + "groupBy": {2}, } type parser struct { diff --git a/vm/opcodes.go b/vm/opcodes.go index 2efe09ded..8a0283173 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -72,8 +72,10 @@ const ( OpSetIndex OpGetCount OpGetLen + OpGetGroupBy OpPointer OpThrow + OpGroupBy OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index c4cd8103b..029458830 100644 --- a/vm/program.go +++ b/vm/program.go @@ -289,6 +289,9 @@ func (program *Program) Opcodes(w io.Writer) { case OpGetLen: code("OpGetLen") + case OpGetGroupBy: + code("OpGetGroupBy") + case OpPointer: code("OpPointer") @@ -298,6 +301,9 @@ func (program *Program) Opcodes(w io.Writer) { case OpBegin: code("OpBegin") + case OpGroupBy: + code("OpGroupBy") + case OpEnd: code("OpEnd") diff --git a/vm/vm.go b/vm/vm.go index 41390fe71..b4a15a20d 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -39,10 +39,11 @@ type VM struct { } type Scope struct { - Array reflect.Value - Index int - Len int - Count int + Array reflect.Value + Index int + Len int + Count int + GroupBy map[any][]any } func Debug() *VM { @@ -461,6 +462,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) scope := vm.Scope() vm.push(scope.Len) + case OpGetGroupBy: + vm.push(vm.Scope().GroupBy) + case OpPointer: scope := vm.Scope() vm.push(scope.Array.Index(scope.Index).Interface()) @@ -468,6 +472,15 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpThrow: panic(vm.pop().(error)) + case OpGroupBy: + scope := vm.Scope() + if scope.GroupBy == nil { + scope.GroupBy = make(map[any][]any) + } + it := scope.Array.Index(scope.Index).Interface() + key := vm.pop() + scope.GroupBy[key] = append(scope.GroupBy[key], it) + case OpBegin: a := vm.pop() array := reflect.ValueOf(a) From 4a536fda9615a6153164165a0e29f981241ed93e Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 11:22:35 +0200 Subject: [PATCH 133/506] Add groupBy bench --- bench_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bench_test.go b/bench_test.go index a294bb06a..95b3c2017 100644 --- a/bench_test.go +++ b/bench_test.go @@ -498,3 +498,17 @@ func Benchmark_sortBy(b *testing.B) { require.Equal(b, 1, out.([]any)[0].(Foo).Value) require.Equal(b, 100, out.([]any)[99].(Foo).Value) } + +func Benchmark_groupBy(b *testing.B) { + program, err := expr.Compile(`groupBy(1..100, # % 7)[6]`) + require.NoError(b, err) + + var out interface{} + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, _ = vm.Run(program, nil) + } + b.StopTimer() + + require.Equal(b, 6, out.([]any)[0]) +} From 7221fe0c260f5ced1428259e28266029ce861dfb Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 11:25:15 +0200 Subject: [PATCH 134/506] Replace interface{} with any --- ast/func.go | 4 +- ast/node.go | 2 +- ast/print_test.go | 2 +- bench_test.go | 68 ++++----- builtin/builtin.go | 100 ++++++------- builtin/builtin_test.go | 36 ++--- builtin/func.go | 20 +-- builtin/utils.go | 6 +- checker/checker.go | 2 +- checker/checker_test.go | 26 ++-- checker/types.go | 8 +- compiler/compiler.go | 12 +- compiler/compiler_test.go | 24 ++-- conf/config.go | 8 +- conf/types_table.go | 2 +- debug/debugger.go | 2 +- docgen/docgen.go | 2 +- docgen/docgen_test.go | 4 +- expr.go | 8 +- expr_test.go | 134 +++++++++--------- optimizer/const_expr.go | 2 +- optimizer/fold.go | 2 +- optimizer/optimizer_test.go | 4 +- parser/lexer/lexer.go | 2 +- parser/parser.go | 4 +- repl/repl.go | 2 +- test/coredns/coredns.go | 4 +- test/crowdsec/crowdsec.go | 32 ++--- test/crowdsec/crowdsec_test.go | 4 +- test/crowdsec/funcs.go | 134 +++++++++--------- test/deref/deref_test.go | 24 ++-- .../interface_method/interface_method_test.go | 2 +- test/mock/mock.go | 16 +-- test/pipes/pipes_test.go | 6 +- test/time/time_test.go | 10 +- vm/func_types/main.go | 38 ++--- vm/generated.go | 84 +++++------ vm/program.go | 6 +- vm/program_test.go | 2 +- vm/runtime/generated.go | 20 +-- vm/runtime/helpers/main.go | 2 +- vm/runtime/runtime.go | 26 ++-- vm/vm.go | 30 ++-- vm/vm_test.go | 12 +- 44 files changed, 469 insertions(+), 469 deletions(-) diff --git a/ast/func.go b/ast/func.go index 92be2a197..a873c35e9 100644 --- a/ast/func.go +++ b/ast/func.go @@ -4,8 +4,8 @@ import "reflect" type Function struct { Name string - Func func(args ...interface{}) (interface{}, error) - Fast func(arg interface{}) interface{} + Func func(args ...any) (any, error) + Fast func(arg any) any Types []reflect.Type Validate func(args []reflect.Type) (reflect.Type, error) Predicate bool diff --git a/ast/node.go b/ast/node.go index 3f083dfc6..d037926c1 100644 --- a/ast/node.go +++ b/ast/node.go @@ -77,7 +77,7 @@ type StringNode struct { type ConstantNode struct { base - Value interface{} + Value any } type UnaryNode struct { diff --git a/ast/print_test.go b/ast/print_test.go index 1b992511c..7bb5c85b2 100644 --- a/ast/print_test.go +++ b/ast/print_test.go @@ -91,7 +91,7 @@ func TestPrint_MemberNode(t *testing.T) { func TestPrint_ConstantNode(t *testing.T) { tests := []struct { - input interface{} + input any want string }{ {nil, `nil`}, diff --git a/bench_test.go b/bench_test.go index 95b3c2017..935f3a80b 100644 --- a/bench_test.go +++ b/bench_test.go @@ -9,7 +9,7 @@ import ( ) func Benchmark_expr(b *testing.B) { - params := make(map[string]interface{}) + params := make(map[string]any) params["Origin"] = "MOW" params["Country"] = "RU" params["Adults"] = 1 @@ -18,7 +18,7 @@ func Benchmark_expr(b *testing.B) { program, err := expr.Compile(`(Origin == "MOW" || Country == "RU") && (Value >= 100 || Adults == 1)`, expr.Env(params)) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { @@ -31,7 +31,7 @@ func Benchmark_expr(b *testing.B) { } func Benchmark_expr_reuseVm(b *testing.B) { - params := make(map[string]interface{}) + params := make(map[string]any) params["Origin"] = "MOW" params["Country"] = "RU" params["Adults"] = 1 @@ -40,7 +40,7 @@ func Benchmark_expr_reuseVm(b *testing.B) { program, err := expr.Compile(`(Origin == "MOW" || Country == "RU") && (Value >= 100 || Adults == 1)`, expr.Env(params)) require.NoError(b, err) - var out interface{} + var out any v := vm.VM{} b.ResetTimer() @@ -54,14 +54,14 @@ func Benchmark_expr_reuseVm(b *testing.B) { } func Benchmark_len(b *testing.B) { - env := map[string]interface{}{ + env := map[string]any{ "arr": make([]int, 100), } program, err := expr.Compile(`len(arr)`, expr.Env(env)) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -86,7 +86,7 @@ func Benchmark_filter(b *testing.B) { program, err := expr.Compile(`filter(Ints, # % 7 == 0)`, expr.Env(Env{})) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -94,7 +94,7 @@ func Benchmark_filter(b *testing.B) { b.StopTimer() require.NoError(b, err) - require.Len(b, out.([]interface{}), 142) + require.Len(b, out.([]any), 142) } func Benchmark_filterLen(b *testing.B) { @@ -111,7 +111,7 @@ func Benchmark_filterLen(b *testing.B) { program, err := expr.Compile(`len(filter(Ints, # % 7 == 0))`, expr.Env(Env{})) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -136,7 +136,7 @@ func Benchmark_filterFirst(b *testing.B) { program, err := expr.Compile(`filter(Ints, # % 7 == 0)[0]`, expr.Env(Env{})) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -161,7 +161,7 @@ func Benchmark_filterLast(b *testing.B) { program, err := expr.Compile(`filter(Ints, # % 7 == 0)[-1]`, expr.Env(Env{})) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -187,7 +187,7 @@ func Benchmark_filterMap(b *testing.B) { program, err := expr.Compile(`map(filter(Ints, # % 7 == 0), # * 2)`, expr.Env(Env{})) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -195,12 +195,12 @@ func Benchmark_filterMap(b *testing.B) { b.StopTimer() require.NoError(b, err) - require.Len(b, out.([]interface{}), 14) - require.Equal(b, 14, out.([]interface{})[0]) + require.Len(b, out.([]any), 14) + require.Equal(b, 14, out.([]any)[0]) } func Benchmark_arrayIndex(b *testing.B) { - env := map[string]interface{}{ + env := map[string]any{ "arr": make([]int, 100), } for i := 0; i < 100; i++ { @@ -210,7 +210,7 @@ func Benchmark_arrayIndex(b *testing.B) { program, err := expr.Compile(`arr[50]`, expr.Env(env)) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -234,7 +234,7 @@ func Benchmark_envStruct(b *testing.B) { env := Env{Price: Price{Value: 1}} - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -249,14 +249,14 @@ func Benchmark_envMap(b *testing.B) { type Price struct { Value int } - env := map[string]interface{}{ + env := map[string]any{ "price": Price{Value: 1}, } program, err := expr.Compile(`price.Value > 0`, expr.Env(env)) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -272,7 +272,7 @@ type CallEnv struct { B int C int Fn func() bool - FnFast func(...interface{}) interface{} + FnFast func(...any) any Foo CallFoo } @@ -296,7 +296,7 @@ func Benchmark_callFunc(b *testing.B) { env := CallEnv{} - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -313,7 +313,7 @@ func Benchmark_callMethod(b *testing.B) { env := CallEnv{} - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -334,7 +334,7 @@ func Benchmark_callField(b *testing.B) { }, } - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -352,12 +352,12 @@ func Benchmark_callFast(b *testing.B) { } env := CallEnv{ - FnFast: func(s ...interface{}) interface{} { + FnFast: func(s ...any) any { return "fn_fast" }, } - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -374,7 +374,7 @@ func Benchmark_callConstExpr(b *testing.B) { env := CallEnv{} - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, env) @@ -396,7 +396,7 @@ func Benchmark_largeStructAccess(b *testing.B) { env := Env{Field: 21} - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, &env) @@ -421,7 +421,7 @@ func Benchmark_largeNestedStructAccess(b *testing.B) { env := Env{} env.Inner.Field = 21 - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, &env) @@ -443,7 +443,7 @@ func Benchmark_largeNestedArrayAccess(b *testing.B) { env := Env{} env.Data[0][0] = 1 - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, err = vm.Run(program, &env) @@ -455,14 +455,14 @@ func Benchmark_largeNestedArrayAccess(b *testing.B) { } func Benchmark_sort(b *testing.B) { - env := map[string]interface{}{ + env := map[string]any{ "arr": []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30}, } program, err := expr.Compile(`sort(arr)`, expr.Env(env)) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, _ = vm.Run(program, env) @@ -478,7 +478,7 @@ func Benchmark_sortBy(b *testing.B) { Value int } arr := []any{55, 58, 42, 61, 75, 52, 64, 62, 16, 79, 40, 14, 50, 76, 23, 2, 5, 80, 89, 51, 21, 96, 91, 13, 71, 82, 65, 63, 11, 17, 94, 81, 74, 4, 97, 1, 39, 3, 28, 8, 84, 90, 47, 85, 7, 56, 49, 93, 33, 12, 19, 60, 86, 100, 44, 45, 36, 72, 95, 77, 34, 92, 24, 73, 18, 38, 43, 26, 41, 69, 67, 57, 9, 27, 66, 87, 46, 35, 59, 70, 10, 20, 53, 15, 32, 98, 68, 31, 54, 25, 83, 88, 22, 48, 29, 37, 6, 78, 99, 30} - env := map[string]interface{}{ + env := map[string]any{ "arr": make([]Foo, len(arr)), } for i, v := range arr { @@ -488,7 +488,7 @@ func Benchmark_sortBy(b *testing.B) { program, err := expr.Compile(`sortBy(arr, "Value")`, expr.Env(env)) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, _ = vm.Run(program, env) @@ -503,7 +503,7 @@ func Benchmark_groupBy(b *testing.B) { program, err := expr.Compile(`groupBy(1..100, # % 7)[6]`) require.NoError(b, err) - var out interface{} + var out any b.ResetTimer() for n := 0; n < b.N; n++ { out, _ = vm.Run(program, nil) diff --git a/builtin/builtin.go b/builtin/builtin.go index 299c61eb8..aacaa0a49 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -31,57 +31,57 @@ var Builtins = []*ast.Function{ { Name: "all", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + Types: types(new(func([]any, func(any) bool) bool)), }, { Name: "none", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + Types: types(new(func([]any, func(any) bool) bool)), }, { Name: "any", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + Types: types(new(func([]any, func(any) bool) bool)), }, { Name: "one", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) bool)), + Types: types(new(func([]any, func(any) bool) bool)), }, { Name: "filter", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) []interface{})), + Types: types(new(func([]any, func(any) bool) []any)), }, { Name: "map", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) interface{}) []interface{})), + Types: types(new(func([]any, func(any) any) []any)), }, { Name: "count", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) int)), + Types: types(new(func([]any, func(any) bool) int)), }, { Name: "find", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) interface{})), + Types: types(new(func([]any, func(any) bool) any)), }, { Name: "findIndex", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) int)), + Types: types(new(func([]any, func(any) bool) int)), }, { Name: "findLast", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) interface{})), + Types: types(new(func([]any, func(any) bool) any)), }, { Name: "findLastIndex", Predicate: true, - Types: types(new(func([]interface{}, func(interface{}) bool) int)), + Types: types(new(func([]any, func(any) bool) int)), }, { Name: "len", @@ -100,7 +100,7 @@ var Builtins = []*ast.Function{ { Name: "type", Fast: Type, - Types: types(new(func(interface{}) string)), + Types: types(new(func(any) string)), }, { Name: "abs", @@ -155,11 +155,11 @@ var Builtins = []*ast.Function{ { Name: "string", Fast: String, - Types: types(new(func(any interface{}) string)), + Types: types(new(func(any any) string)), }, { Name: "trim", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) == 1 { return strings.TrimSpace(args[0].(string)), nil } else if len(args) == 2 { @@ -175,7 +175,7 @@ var Builtins = []*ast.Function{ }, { Name: "trimPrefix", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { s := " " if len(args) == 2 { s = args[1].(string) @@ -189,7 +189,7 @@ var Builtins = []*ast.Function{ }, { Name: "trimSuffix", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { s := " " if len(args) == 2 { s = args[1].(string) @@ -203,21 +203,21 @@ var Builtins = []*ast.Function{ }, { Name: "upper", - Fast: func(arg interface{}) interface{} { + Fast: func(arg any) any { return strings.ToUpper(arg.(string)) }, Types: types(strings.ToUpper), }, { Name: "lower", - Fast: func(arg interface{}) interface{} { + Fast: func(arg any) any { return strings.ToLower(arg.(string)) }, Types: types(strings.ToLower), }, { Name: "split", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) == 2 { return strings.Split(args[0].(string), args[1].(string)), nil } else if len(args) == 3 { @@ -233,7 +233,7 @@ var Builtins = []*ast.Function{ }, { Name: "splitAfter", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) == 2 { return strings.SplitAfter(args[0].(string), args[1].(string)), nil } else if len(args) == 3 { @@ -249,7 +249,7 @@ var Builtins = []*ast.Function{ }, { Name: "replace", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) == 4 { return strings.Replace(args[0].(string), args[1].(string), args[2].(string), runtime.ToInt(args[3])), nil } else if len(args) == 3 { @@ -265,7 +265,7 @@ var Builtins = []*ast.Function{ }, { Name: "repeat", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { n := runtime.ToInt(args[1]) if n > 1e6 { panic("memory budget exceeded") @@ -276,7 +276,7 @@ var Builtins = []*ast.Function{ }, { Name: "join", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { glue := "" if len(args) == 2 { glue = args[1].(string) @@ -284,9 +284,9 @@ var Builtins = []*ast.Function{ switch args[0].(type) { case []string: return strings.Join(args[0].([]string), glue), nil - case []interface{}: + case []any: var s []string - for _, arg := range args[0].([]interface{}) { + for _, arg := range args[0].([]any) { s = append(s, arg.(string)) } return strings.Join(s, glue), nil @@ -295,36 +295,36 @@ var Builtins = []*ast.Function{ }, Types: types( strings.Join, - new(func([]interface{}, string) string), - new(func([]interface{}) string), + new(func([]any, string) string), + new(func([]any) string), new(func([]string, string) string), new(func([]string) string), ), }, { Name: "indexOf", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return strings.Index(args[0].(string), args[1].(string)), nil }, Types: types(strings.Index), }, { Name: "lastIndexOf", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return strings.LastIndex(args[0].(string), args[1].(string)), nil }, Types: types(strings.LastIndex), }, { Name: "hasPrefix", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return strings.HasPrefix(args[0].(string), args[1].(string)), nil }, Types: types(strings.HasPrefix), }, { Name: "hasSuffix", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return strings.HasSuffix(args[0].(string), args[1].(string)), nil }, Types: types(strings.HasSuffix), @@ -369,37 +369,37 @@ var Builtins = []*ast.Function{ }, { Name: "toJSON", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { b, err := json.MarshalIndent(args[0], "", " ") if err != nil { return nil, err } return string(b), nil }, - Types: types(new(func(interface{}) string)), + Types: types(new(func(any) string)), }, { Name: "fromJSON", - Func: func(args ...interface{}) (interface{}, error) { - var v interface{} + Func: func(args ...any) (any, error) { + var v any err := json.Unmarshal([]byte(args[0].(string)), &v) if err != nil { return nil, err } return v, nil }, - Types: types(new(func(string) interface{})), + Types: types(new(func(string) any)), }, { Name: "toBase64", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return base64.StdEncoding.EncodeToString([]byte(args[0].(string))), nil }, Types: types(new(func(string) string)), }, { Name: "fromBase64", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { b, err := base64.StdEncoding.DecodeString(args[0].(string)) if err != nil { return nil, err @@ -410,21 +410,21 @@ var Builtins = []*ast.Function{ }, { Name: "now", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return time.Now(), nil }, Types: types(new(func() time.Time)), }, { Name: "duration", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { return time.ParseDuration(args[0].(string)) }, Types: types(time.ParseDuration), }, { Name: "date", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { date := args[0].(string) if len(args) == 2 { layout := args[1].(string) @@ -469,7 +469,7 @@ var Builtins = []*ast.Function{ }, { Name: "first", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { defer func() { if r := recover(); r != nil { return @@ -492,7 +492,7 @@ var Builtins = []*ast.Function{ }, { Name: "last", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { defer func() { if r := recover(); r != nil { return @@ -515,7 +515,7 @@ var Builtins = []*ast.Function{ }, { Name: "get", - Func: func(args ...interface{}) (out interface{}, err error) { + Func: func(args ...any) (out any, err error) { defer func() { if r := recover(); r != nil { return @@ -526,7 +526,7 @@ var Builtins = []*ast.Function{ }, { Name: "keys", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) != 1 { return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } @@ -535,7 +535,7 @@ var Builtins = []*ast.Function{ return nil, fmt.Errorf("cannot get keys from %s", v.Kind()) } keys := v.MapKeys() - out := make([]interface{}, len(keys)) + out := make([]any, len(keys)) for i, key := range keys { out[i] = key.Interface() } @@ -556,7 +556,7 @@ var Builtins = []*ast.Function{ }, { Name: "values", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) != 1 { return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) } @@ -565,7 +565,7 @@ var Builtins = []*ast.Function{ return nil, fmt.Errorf("cannot get values from %s", v.Kind()) } keys := v.MapKeys() - out := make([]interface{}, len(keys)) + out := make([]any, len(keys)) for i, key := range keys { out[i] = v.MapIndex(key).Interface() } @@ -586,7 +586,7 @@ var Builtins = []*ast.Function{ }, { Name: "sort", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) != 1 && len(args) != 2 { return nil, fmt.Errorf("invalid number of arguments (expected 1 or 2, got %d)", len(args)) } @@ -633,7 +633,7 @@ var Builtins = []*ast.Function{ }, { Name: "sortBy", - Func: func(args ...interface{}) (interface{}, error) { + Func: func(args ...any) (any, error) { if len(args) != 2 && len(args) != 3 { return nil, fmt.Errorf("invalid number of arguments (expected 2 or 3, got %d)", len(args)) } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 34704bdad..e7782fa32 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -20,7 +20,7 @@ import ( func TestBuiltin(t *testing.T) { var tests = []struct { input string - want interface{} + want any }{ {`len(1..10)`, 10}, {`len({foo: 1, bar: 2})`, 2}, @@ -63,7 +63,7 @@ func TestBuiltin(t *testing.T) { {`min(1, 2, 3)`, 1}, {`min(1.5, 2.5, 3.5)`, 1.5}, {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, - {`fromJSON("[1, 2, 3]")`, []interface{}{1.0, 2.0, 3.0}}, + {`fromJSON("[1, 2, 3]")`, []any{1.0, 2.0, 3.0}}, {`toBase64("hello")`, "aGVsbG8="}, {`fromBase64("aGVsbG8=")`, "hello"}, {`now().Format("2006-01-02T15:04Z")`, time.Now().Format("2006-01-02T15:04Z")}, @@ -89,10 +89,10 @@ func TestBuiltin(t *testing.T) { {`1 in values({foo: 1, bar: 2})`, true}, } - env := map[string]interface{}{ + env := map[string]any{ "ArrayOfString": []string{"foo", "bar", "baz"}, "ArrayOfInt": []int{1, 2, 3}, - "ArrayOfAny": []interface{}{1, "2", true}, + "ArrayOfAny": []any{1, "2", true}, } for _, test := range tests { t.Run(test.input, func(t *testing.T) { @@ -171,7 +171,7 @@ func TestBuiltin_errors(t *testing.T) { } func TestBuiltin_types(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "num": 42, "str": "foo", "ArrayOfString": []string{"foo", "bar", "baz"}, @@ -223,7 +223,7 @@ func TestBuiltin_memory_limits(t *testing.T) { func TestBuiltin_disallow_builtins_override(t *testing.T) { t.Run("via env", func(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "len": func() int { return 42 }, "repeat": func(a string) string { return a @@ -235,13 +235,13 @@ func TestBuiltin_disallow_builtins_override(t *testing.T) { }) t.Run("via expr.Function", func(t *testing.T) { length := expr.Function("len", - func(params ...interface{}) (interface{}, error) { + func(params ...any) (any, error) { return 42, nil }, new(func() int), ) repeat := expr.Function("repeat", - func(params ...interface{}) (interface{}, error) { + func(params ...any) (any, error) { return params[0], nil }, new(func(string) string), @@ -259,7 +259,7 @@ func TestBuiltin_DisableBuiltin(t *testing.T) { continue // TODO: allow to disable predicates } t.Run(b.Name, func(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ b.Name: func() int { return 42 }, } program, err := expr.Compile(b.Name+"()", expr.Env(env), expr.DisableBuiltin(b.Name)) @@ -278,7 +278,7 @@ func TestBuiltin_DisableBuiltin(t *testing.T) { } t.Run(b.Name, func(t *testing.T) { fn := expr.Function(b.Name, - func(params ...interface{}) (interface{}, error) { + func(params ...any) (any, error) { return 42, nil }, new(func() int), @@ -302,7 +302,7 @@ func TestBuiltin_DisableAllBuiltins(t *testing.T) { func TestBuiltin_EnableBuiltin(t *testing.T) { t.Run("via env", func(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "repeat": func() string { return "repeat" }, } program, err := expr.Compile(`len(repeat())`, expr.Env(env), expr.DisableAllBuiltins(), expr.EnableBuiltin("len")) @@ -314,7 +314,7 @@ func TestBuiltin_EnableBuiltin(t *testing.T) { }) t.Run("via expr.Function", func(t *testing.T) { fn := expr.Function("repeat", - func(params ...interface{}) (interface{}, error) { + func(params ...any) (any, error) { return "repeat", nil }, new(func() string), @@ -330,10 +330,10 @@ func TestBuiltin_EnableBuiltin(t *testing.T) { func TestBuiltin_type(t *testing.T) { type Foo struct{} - var b interface{} = 1 - var a interface{} = &b + var b any = 1 + var a any = &b tests := []struct { - obj interface{} + obj any want string }{ {nil, "nil"}, @@ -345,7 +345,7 @@ func TestBuiltin_type(t *testing.T) { {float32(1.0), "float"}, {"string", "string"}, {[]string{"foo", "bar"}, "array"}, - {map[string]interface{}{"foo": "bar"}, "map"}, + {map[string]any{"foo": "bar"}, "map"}, {func() {}, "func"}, {time.Now(), "time.Time"}, {time.Second, "time.Duration"}, @@ -355,7 +355,7 @@ func TestBuiltin_type(t *testing.T) { } for _, test := range tests { t.Run(test.want, func(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "obj": test.obj, } program, err := expr.Compile(`type(obj)`, expr.Env(env)) @@ -369,7 +369,7 @@ func TestBuiltin_type(t *testing.T) { } func TestBuiltin_sort(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "ArrayOfString": []string{"foo", "bar", "baz"}, "ArrayOfInt": []int{3, 2, 1}, "ArrayOfFoo": []mock.Foo{{Value: "c"}, {Value: "a"}, {Value: "b"}}, diff --git a/builtin/func.go b/builtin/func.go index a14f6553d..7c042c6d2 100644 --- a/builtin/func.go +++ b/builtin/func.go @@ -8,7 +8,7 @@ import ( "github.com/antonmedv/expr/vm/runtime" ) -func Len(x interface{}) interface{} { +func Len(x any) any { v := reflect.ValueOf(x) switch v.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: @@ -18,7 +18,7 @@ func Len(x interface{}) interface{} { } } -func Type(arg interface{}) interface{} { +func Type(arg any) any { if arg == nil { return "nil" } @@ -60,7 +60,7 @@ func Type(arg interface{}) interface{} { return "unknown" } -func Abs(x interface{}) interface{} { +func Abs(x any) any { switch x.(type) { case float32: if x.(float32) < 0 { @@ -138,7 +138,7 @@ func Abs(x interface{}) interface{} { panic(fmt.Sprintf("invalid argument for abs (type %T)", x)) } -func Int(x interface{}) interface{} { +func Int(x any) any { switch x := x.(type) { case float32: return int(x) @@ -175,7 +175,7 @@ func Int(x interface{}) interface{} { } } -func Float(x interface{}) interface{} { +func Float(x any) any { switch x := x.(type) { case float32: return float64(x) @@ -212,12 +212,12 @@ func Float(x interface{}) interface{} { } } -func String(arg interface{}) interface{} { +func String(arg any) any { return fmt.Sprintf("%v", arg) } -func Max(args ...interface{}) (interface{}, error) { - var max interface{} +func Max(args ...any) (any, error) { + var max any for _, arg := range args { if max == nil || runtime.Less(max, arg) { max = arg @@ -226,8 +226,8 @@ func Max(args ...interface{}) (interface{}, error) { return max, nil } -func Min(args ...interface{}) (interface{}, error) { - var min interface{} +func Min(args ...any) (any, error) { + var min any for _, arg := range args { if min == nil || runtime.More(min, arg) { min = arg diff --git a/builtin/utils.go b/builtin/utils.go index 9850b09a9..349663dd9 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -6,11 +6,11 @@ import ( ) var ( - anyType = reflect.TypeOf(new(interface{})).Elem() + anyType = reflect.TypeOf(new(any)).Elem() integerType = reflect.TypeOf(0) floatType = reflect.TypeOf(float64(0)) stringType = reflect.TypeOf("") - arrayType = reflect.TypeOf([]interface{}{}) + arrayType = reflect.TypeOf([]any{}) ) func kind(t reflect.Type) reflect.Kind { @@ -20,7 +20,7 @@ func kind(t reflect.Type) reflect.Kind { return t.Kind() } -func types(types ...interface{}) []reflect.Type { +func types(types ...any) []reflect.Type { ts := make([]reflect.Type, len(types)) for i, t := range types { t := reflect.TypeOf(t) diff --git a/checker/checker.go b/checker/checker.go index c1933a115..e76472ccc 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -130,7 +130,7 @@ func (v *checker) visit(node ast.Node) (reflect.Type, info) { return t, i } -func (v *checker) error(node ast.Node, format string, args ...interface{}) (reflect.Type, info) { +func (v *checker) error(node ast.Node, format string, args ...any) (reflect.Type, info) { if v.err == nil { // show first error v.err = &file.Error{ Location: node.Location(), diff --git a/checker/checker_test.go b/checker/checker_test.go index eeade988a..69c0a8e76 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -709,7 +709,7 @@ func TestCheck_AllowUndefinedVariables_OptionalChaining(t *testing.T) { func TestCheck_OperatorOverload(t *testing.T) { type Date struct{} - env := map[string]interface{}{ + env := map[string]any{ "a": Date{}, "b": Date{}, "add": func(a, b Date) bool { @@ -738,7 +738,7 @@ func TestCheck_PointerNode(t *testing.T) { } func TestCheck_TypeWeights(t *testing.T) { - types := map[string]interface{}{ + types := map[string]any{ "Uint": uint(1), "Uint8": uint8(2), "Uint16": uint16(3), @@ -766,8 +766,8 @@ func TestCheck_TypeWeights(t *testing.T) { } func TestCheck_CallFastTyped(t *testing.T) { - env := map[string]interface{}{ - "fn": func([]interface{}, string) string { + env := map[string]any{ + "fn": func([]any, string) string { return "foo" }, } @@ -809,7 +809,7 @@ func TestCheck_CallTyped_excludes_named_functions(t *testing.T) { } func TestCheck_works_with_nil_types(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "null": nil, } @@ -823,7 +823,7 @@ func TestCheck_works_with_nil_types(t *testing.T) { func TestCheck_cast_to_expected_works_with_interface(t *testing.T) { t.Run("float64", func(t *testing.T) { type Env struct { - Any interface{} + Any any } tree, err := parser.Parse("Any") @@ -838,8 +838,8 @@ func TestCheck_cast_to_expected_works_with_interface(t *testing.T) { }) t.Run("kind", func(t *testing.T) { - env := map[string]interface{}{ - "Any": interface{}("foo"), + env := map[string]any{ + "Any": any("foo"), } tree, err := parser.Parse("Any") @@ -867,7 +867,7 @@ func TestCheck_operator_in_works_with_interfaces(t *testing.T) { func TestCheck_Function_types_are_checked(t *testing.T) { add := expr.Function( "add", - func(p ...interface{}) (interface{}, error) { + func(p ...any) (any, error) { out := 0 for _, each := range p { out += each.(int) @@ -914,7 +914,7 @@ func TestCheck_Function_types_are_checked(t *testing.T) { func TestCheck_Function_without_types(t *testing.T) { add := expr.Function( "add", - func(p ...interface{}) (interface{}, error) { + func(p ...any) (any, error) { out := 0 for _, each := range p { out += each.(int) @@ -954,7 +954,7 @@ func TestCheck_dont_panic_on_nil_arguments_for_builtins(t *testing.T) { } func TestCheck_do_not_override_params_for_functions(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "foo": func(p string) string { return "foo" }, @@ -962,7 +962,7 @@ func TestCheck_do_not_override_params_for_functions(t *testing.T) { config := conf.New(env) expr.Function( "bar", - func(p ...interface{}) (interface{}, error) { + func(p ...any) (any, error) { return p[0].(string), nil }, new(func(string) string), @@ -989,7 +989,7 @@ func TestCheck_do_not_override_params_for_functions(t *testing.T) { } func TestCheck_env_keyword(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "num": 42, "str": "foo", "name": "str", diff --git a/checker/types.go b/checker/types.go index 5248b760c..1665527f0 100644 --- a/checker/types.go +++ b/checker/types.go @@ -13,12 +13,12 @@ var ( integerType = reflect.TypeOf(0) floatType = reflect.TypeOf(float64(0)) stringType = reflect.TypeOf("") - arrayType = reflect.TypeOf([]interface{}{}) - mapType = reflect.TypeOf(map[string]interface{}{}) - anyType = reflect.TypeOf(new(interface{})).Elem() + arrayType = reflect.TypeOf([]any{}) + mapType = reflect.TypeOf(map[string]any{}) + anyType = reflect.TypeOf(new(any)).Elem() timeType = reflect.TypeOf(time.Time{}) durationType = reflect.TypeOf(time.Duration(0)) - functionType = reflect.TypeOf(new(func(...interface{}) (interface{}, error))).Elem() + functionType = reflect.TypeOf(new(func(...any) (any, error))).Elem() ) func combined(a, b reflect.Type) reflect.Type { diff --git a/compiler/compiler.go b/compiler/compiler.go index a26d85e5a..978ab6f9c 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -26,7 +26,7 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro c := &compiler{ locations: make([]file.Location, 0), - constantsIndex: make(map[interface{}]int), + constantsIndex: make(map[any]int), functionsIndex: make(map[string]int), debugInfo: make(map[string]string), } @@ -64,10 +64,10 @@ func Compile(tree *parser.Tree, config *conf.Config) (program *Program, err erro type compiler struct { locations []file.Location bytecode []Opcode - variables []interface{} + variables []any scopes []scope - constants []interface{} - constantsIndex map[interface{}]int + constants []any + constantsIndex map[any]int functions []Function functionsIndex map[string]int debugInfo map[string]string @@ -106,11 +106,11 @@ func (c *compiler) emit(op Opcode, args ...int) int { return c.emitLocation(loc, op, arg) } -func (c *compiler) emitPush(value interface{}) int { +func (c *compiler) emitPush(value any) int { return c.emit(OpPush, c.addConstant(value)) } -func (c *compiler) addConstant(constant interface{}) int { +func (c *compiler) addConstant(constant any) int { indexable := true hash := constant switch reflect.TypeOf(constant).Kind() { diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go index 9a21979d8..c2e9c8f3c 100644 --- a/compiler/compiler_test.go +++ b/compiler/compiler_test.go @@ -41,7 +41,7 @@ func TestCompile(t *testing.T) { { `65535`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ math.MaxUint16, }, Bytecode: []vm.Opcode{ @@ -53,7 +53,7 @@ func TestCompile(t *testing.T) { { `.5`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ .5, }, Bytecode: []vm.Opcode{ @@ -74,7 +74,7 @@ func TestCompile(t *testing.T) { { `"string"`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ "string", }, Bytecode: []vm.Opcode{ @@ -86,7 +86,7 @@ func TestCompile(t *testing.T) { { `"string" == "string"`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ "string", }, Bytecode: []vm.Opcode{ @@ -100,7 +100,7 @@ func TestCompile(t *testing.T) { { `1000000 == 1000000`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ int64(1000000), }, Bytecode: []vm.Opcode{ @@ -114,7 +114,7 @@ func TestCompile(t *testing.T) { { `-1`, vm.Program{ - Constants: []interface{}{1}, + Constants: []any{1}, Bytecode: []vm.Opcode{ vm.OpPush, vm.OpNegate, @@ -155,7 +155,7 @@ func TestCompile(t *testing.T) { { `A.B.C.D`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ &runtime.Field{ Index: []int{0, 1, 2, 3}, Path: []string{"A", "B", "C", "D"}, @@ -170,7 +170,7 @@ func TestCompile(t *testing.T) { { `A?.B.C.D`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ &runtime.Field{ Index: []int{0}, Path: []string{"A"}, @@ -191,7 +191,7 @@ func TestCompile(t *testing.T) { { `A.B?.C.D`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ &runtime.Field{ Index: []int{0, 1}, Path: []string{"A", "B"}, @@ -212,7 +212,7 @@ func TestCompile(t *testing.T) { { `A.Map["B"].C.D`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ &runtime.Field{ Index: []int{0, 2}, Path: []string{"A", "Map"}, @@ -235,7 +235,7 @@ func TestCompile(t *testing.T) { { `A ?? 1`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ &runtime.Field{ Index: []int{0}, Path: []string{"A"}, @@ -254,7 +254,7 @@ func TestCompile(t *testing.T) { { `A.Ptr + 1`, vm.Program{ - Constants: []interface{}{ + Constants: []any{ &runtime.Field{ Index: []int{0, 3}, Path: []string{"A", "Ptr"}, diff --git a/conf/config.go b/conf/config.go index f44cfe7b1..5fb5e1194 100644 --- a/conf/config.go +++ b/conf/config.go @@ -10,7 +10,7 @@ import ( ) type Config struct { - Env interface{} + Env any Types TypesTable MapEnv bool DefaultType reflect.Type @@ -43,16 +43,16 @@ func CreateNew() *Config { } // New creates new config with environment. -func New(env interface{}) *Config { +func New(env any) *Config { c := CreateNew() c.WithEnv(env) return c } -func (c *Config) WithEnv(env interface{}) { +func (c *Config) WithEnv(env any) { var mapEnv bool var mapValueType reflect.Type - if _, ok := env.(map[string]interface{}); ok { + if _, ok := env.(map[string]any); ok { mapEnv = true } else { if reflect.ValueOf(env).Kind() == reflect.Map { diff --git a/conf/types_table.go b/conf/types_table.go index 592340069..8ebb76c35 100644 --- a/conf/types_table.go +++ b/conf/types_table.go @@ -20,7 +20,7 @@ type TypesTable map[string]Tag // // If map is passed, all items will be treated as variables // (key as name, value as type). -func CreateTypesTable(i interface{}) TypesTable { +func CreateTypesTable(i any) TypesTable { if i == nil { return nil } diff --git a/debug/debugger.go b/debug/debugger.go index e8c38fc6f..6ee9788bf 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -12,7 +12,7 @@ import ( "github.com/rivo/tview" ) -func StartDebugger(program *Program, env interface{}) { +func StartDebugger(program *Program, env any) { vm := Debug() app := tview.NewApplication() table := tview.NewTable() diff --git a/docgen/docgen.go b/docgen/docgen.go index 672cd0183..a1145586f 100644 --- a/docgen/docgen.go +++ b/docgen/docgen.go @@ -76,7 +76,7 @@ var ( } ) -func CreateDoc(i interface{}) *Context { +func CreateDoc(i any) *Context { c := &Context{ Variables: make(map[Identifier]*Type), Types: make(map[TypeName]*Type), diff --git a/docgen/docgen_test.go b/docgen/docgen_test.go index 1eaa6d73b..e2b58b874 100644 --- a/docgen/docgen_test.go +++ b/docgen/docgen_test.go @@ -20,7 +20,7 @@ type Env struct { Config struct { MaxSize int32 } - Env map[string]interface{} + Env map[string]any // NOTE: conflicting type name TimeWeekday time.Weekday Weekday Weekday @@ -201,7 +201,7 @@ func TestCreateDoc_Ambiguous(t *testing.T) { } func TestCreateDoc_FromMap(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "Tweets": []*Tweet{}, "Config": struct { MaxSize int diff --git a/expr.go b/expr.go index fa6e7101d..eb9eb7683 100644 --- a/expr.go +++ b/expr.go @@ -22,7 +22,7 @@ type Option func(c *conf.Config) // as well as all fields of embedded structs and struct itself. // If map is passed, all items will be treated as variables. // Methods defined on this type will be available as functions. -func Env(env interface{}) Option { +func Env(env any) Option { return func(c *conf.Config) { c.WithEnv(env) } @@ -108,7 +108,7 @@ func Patch(visitor ast.Visitor) Option { } // Function adds function to list of functions what will be available in expressions. -func Function(name string, fn func(params ...interface{}) (interface{}, error), types ...interface{}) Option { +func Function(name string, fn func(params ...any) (any, error), types ...any) Option { return func(c *conf.Config) { ts := make([]reflect.Type, len(types)) for i, t := range types { @@ -207,12 +207,12 @@ func Compile(input string, ops ...Option) (*vm.Program, error) { } // Run evaluates given bytecode program. -func Run(program *vm.Program, env interface{}) (interface{}, error) { +func Run(program *vm.Program, env any) (any, error) { return vm.Run(program, env) } // Eval parses, compiles and runs given input. -func Eval(input string, env interface{}) (interface{}, error) { +func Eval(input string, env any) (any, error) { if _, ok := env.(Option); ok { return nil, fmt.Errorf("misused expr.Eval: second argument (env) should be passed without expr.Env") } diff --git a/expr_test.go b/expr_test.go index 54b216d4a..be8e406a9 100644 --- a/expr_test.go +++ b/expr_test.go @@ -16,7 +16,7 @@ import ( ) func ExampleEval() { - output, err := expr.Eval("greet + name", map[string]interface{}{ + output, err := expr.Eval("greet + name", map[string]any{ "greet": "Hello, ", "name": "world!", }) @@ -40,7 +40,7 @@ func ExampleEval_runtime_error() { } func ExampleCompile() { - env := map[string]interface{}{ + env := map[string]any{ "foo": 1, "bar": 99, } @@ -176,7 +176,7 @@ func ExampleAsBool() { } func ExampleAsBool_error() { - env := map[string]interface{}{ + env := map[string]any{ "foo": 0, } @@ -206,7 +206,7 @@ func ExampleAsInt() { } func ExampleAsInt64() { - env := map[string]interface{}{ + env := map[string]any{ "rating": 5.5, } @@ -306,7 +306,7 @@ func fib(n int) int { func ExampleConstExpr() { code := `[fib(5), fib(3+3), fib(dyn)]` - env := map[string]interface{}{ + env := map[string]any{ "fib": fib, "dyn": 0, } @@ -339,7 +339,7 @@ func ExampleConstExpr() { func ExampleAllowUndefinedVariables() { code := `name == nil ? "Hello, world!" : sprintf("Hello, %v!", name)` - env := map[string]interface{}{ + env := map[string]any{ "sprintf": fmt.Sprintf, } @@ -470,7 +470,7 @@ func ExamplePatch() { return } - env := map[string]interface{}{ + env := map[string]any{ "greet": "Hello", "get": func(a, b string) string { return a + ", " + b @@ -488,7 +488,7 @@ func ExamplePatch() { } func TestExpr_readme_example(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "greet": "Hello, %v!", "names": []string{"world", "you"}, "sprintf": fmt.Sprintf, @@ -562,7 +562,7 @@ func TestExpr(t *testing.T) { tests := []struct { code string - want interface{} + want any }{ { `1`, @@ -758,11 +758,11 @@ func TestExpr(t *testing.T) { }, { `{foo: 0, bar: 1}`, - map[string]interface{}{"foo": 0, "bar": 1}, + map[string]any{"foo": 0, "bar": 1}, }, { `{foo: 0, bar: 1}`, - map[string]interface{}{"foo": 0, "bar": 1}, + map[string]any{"foo": 0, "bar": 1}, }, { `(true ? 0+1 : 2+3) + (false ? -1 : -2)`, @@ -770,11 +770,11 @@ func TestExpr(t *testing.T) { }, { `filter(1..9, {# > 7})`, - []interface{}{8, 9}, + []any{8, 9}, }, { `map(1..3, {# * #})`, - []interface{}{1, 4, 9}, + []any{1, 4, 9}, }, { `all(1..3, {# > 0})`, @@ -910,7 +910,7 @@ func TestExpr(t *testing.T) { }, { `map(filter(ArrayOfInt, # >= 3), # + 1)`, - []interface{}{4, 5, 6}, + []any{4, 5, 6}, }, { `Time < Time + Duration`, @@ -954,11 +954,11 @@ func TestExpr(t *testing.T) { }, { `map(1..3, let x = #; let y = x * x; y * y)`, - []interface{}{1, 16, 81}, + []any{1, 16, 81}, }, { `map(1..2, let x = #; map(2..3, let y = #; x + y))`, - []interface{}{[]interface{}{3, 4}, []interface{}{4, 5}}, + []any{[]any{3, 4}, []any{4, 5}}, }, { `len(filter(1..99, # % 7 == 0))`, @@ -1002,11 +1002,11 @@ func TestExpr(t *testing.T) { }, { `map(filter(1..9, # % 2 == 0), # * 2)`, - []interface{}{4, 8, 12, 16}, + []any{4, 8, 12, 16}, }, { `map(map(filter(1..9, # % 2 == 0), # * 2), # * 2)`, - []interface{}{8, 16, 24, 32}, + []any{8, 16, 24, 32}, }, { `first(map(filter(1..9, # % 2 == 0), # * 2))`, @@ -1120,7 +1120,7 @@ func TestExpr_error(t *testing.T) { } func TestExpr_optional_chaining(t *testing.T) { - env := map[string]interface{}{} + env := map[string]any{} program, err := expr.Compile("foo?.bar.baz", expr.Env(env), expr.AllowUndefinedVariables()) require.NoError(t, err) @@ -1130,8 +1130,8 @@ func TestExpr_optional_chaining(t *testing.T) { } func TestExpr_optional_chaining_property(t *testing.T) { - env := map[string]interface{}{ - "foo": map[string]interface{}{}, + env := map[string]any{ + "foo": map[string]any{}, } program, err := expr.Compile("foo.bar?.baz", expr.Env(env)) require.NoError(t, err) @@ -1142,10 +1142,10 @@ func TestExpr_optional_chaining_property(t *testing.T) { } func TestExpr_optional_chaining_nested_chains(t *testing.T) { - env := map[string]interface{}{ - "foo": map[string]interface{}{ + env := map[string]any{ + "foo": map[string]any{ "id": 1, - "bar": []map[string]interface{}{ + "bar": []map[string]any{ 1: { "baz": "baz", }, @@ -1161,13 +1161,13 @@ func TestExpr_optional_chaining_nested_chains(t *testing.T) { } func TestExpr_eval_with_env(t *testing.T) { - _, err := expr.Eval("true", expr.Env(map[string]interface{}{})) + _, err := expr.Eval("true", expr.Env(map[string]any{})) assert.Error(t, err) assert.Contains(t, err.Error(), "misused") } func TestExpr_fetch_from_func(t *testing.T) { - _, err := expr.Eval("foo.Value", map[string]interface{}{ + _, err := expr.Eval("foo.Value", map[string]any{ "foo": func() {}, }) assert.Error(t, err) @@ -1175,7 +1175,7 @@ func TestExpr_fetch_from_func(t *testing.T) { } func TestExpr_map_default_values(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "foo": map[string]string{}, "bar": map[string]*string{}, } @@ -1192,7 +1192,7 @@ func TestExpr_map_default_values(t *testing.T) { func TestExpr_map_default_values_compile_check(t *testing.T) { tests := []struct { - env interface{} + env any input string }{ { @@ -1211,8 +1211,8 @@ func TestExpr_map_default_values_compile_check(t *testing.T) { } func TestExpr_calls_with_nil(t *testing.T) { - env := map[string]interface{}{ - "equals": func(a, b interface{}) interface{} { + env := map[string]any{ + "equals": func(a, b any) any { assert.Nil(t, a, "a is not nil") assert.Nil(t, b, "b is not nil") return a == b @@ -1234,8 +1234,8 @@ func TestExpr_calls_with_nil(t *testing.T) { } func TestExpr_call_float_arg_func_with_int(t *testing.T) { - env := map[string]interface{}{ - "cnv": func(f float64) interface{} { + env := map[string]any{ + "cnv": func(f float64) any { return f }, } @@ -1264,7 +1264,7 @@ func TestExpr_call_float_arg_func_with_int(t *testing.T) { } func TestConstExpr_error_panic(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "divide": func(a, b int) int { return a / b }, } @@ -1284,7 +1284,7 @@ func (e divideError) Error() string { } func TestConstExpr_error_as_error(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "divide": func(a, b int) (int, error) { if b == 0 { return 0, divideError{"integer divide by zero"} @@ -1304,7 +1304,7 @@ func TestConstExpr_error_as_error(t *testing.T) { } func TestConstExpr_error_wrong_type(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "divide": 0, } assert.Panics(t, func() { @@ -1434,7 +1434,7 @@ func TestIssue_nested_closures(t *testing.T) { } func TestIssue138(t *testing.T) { - env := map[string]interface{}{} + env := map[string]any{} _, err := expr.Compile(`1 / (1 - 1)`, expr.Env(env)) require.NoError(t, err) @@ -1446,9 +1446,9 @@ func TestIssue138(t *testing.T) { func TestIssue154(t *testing.T) { type Data struct { - Array *[2]interface{} - Slice *[]interface{} - Map *map[string]interface{} + Array *[2]any + Slice *[]any + Map *map[string]any String *string } @@ -1460,17 +1460,17 @@ func TestIssue154(t *testing.T) { i := 10 s := "value" - Array := [2]interface{}{ + Array := [2]any{ &b, &i, } - Slice := []interface{}{ + Slice := []any{ &b, &i, } - Map := map[string]interface{}{ + Map := map[string]any{ "Bool": &b, "Int": &i, } @@ -1505,7 +1505,7 @@ func TestIssue154(t *testing.T) { } func TestIssue270(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "int8": int8(1), "int16": int16(3), "int32": int32(5), @@ -1603,7 +1603,7 @@ func (i Issue346Array) Len() int { func TestIssue346(t *testing.T) { code := `Foo[0].Bar` - env := map[string]interface{}{ + env := map[string]any{ "Foo": Issue346Array{ {Bar: "bar"}, }, @@ -1618,8 +1618,8 @@ func TestIssue346(t *testing.T) { func TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) { code := `{"value": "ok"}[vars.key]` - env := map[string]interface{}{ - "vars": map[string]interface{}{ + env := map[string]any{ + "vars": map[string]any{ "key": "value", }, } @@ -1648,8 +1648,8 @@ func TestCompile_allow_to_use_interface_to_get_an_element_from_map(t *testing.T) } func TestFastCall(t *testing.T) { - env := map[string]interface{}{ - "func": func(in interface{}) float64 { + env := map[string]any{ + "func": func(in any) float64 { return 8 }, } @@ -1664,8 +1664,8 @@ func TestFastCall(t *testing.T) { } func TestFastCall_OpCallFastErr(t *testing.T) { - env := map[string]interface{}{ - "func": func(...interface{}) (interface{}, error) { + env := map[string]any{ + "func": func(...any) (any, error) { return 8, nil }, } @@ -1680,7 +1680,7 @@ func TestFastCall_OpCallFastErr(t *testing.T) { } func TestRun_custom_func_returns_an_error_as_second_arg(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "semver": func(value string, cmp string) (bool, error) { return true, nil }, } @@ -1695,7 +1695,7 @@ func TestRun_custom_func_returns_an_error_as_second_arg(t *testing.T) { func TestFunction(t *testing.T) { add := expr.Function( "add", - func(p ...interface{}) (interface{}, error) { + func(p ...any) (any, error) { out := 0 for _, each := range p { out += each.(int) @@ -1715,8 +1715,8 @@ func TestFunction(t *testing.T) { // Nil coalescing operator func TestRun_NilCoalescingOperator(t *testing.T) { - env := map[string]interface{}{ - "foo": map[string]interface{}{ + env := map[string]any{ + "foo": map[string]any{ "bar": "value", }, } @@ -1743,16 +1743,16 @@ func TestRun_NilCoalescingOperator(t *testing.T) { p, err := expr.Compile(`foo?.bar ?? "default"`, expr.Env(env)) assert.NoError(t, err) - out, err := expr.Run(p, map[string]interface{}{}) + out, err := expr.Run(p, map[string]any{}) assert.NoError(t, err) assert.Equal(t, "default", out) }) } func TestEval_nil_in_maps(t *testing.T) { - env := map[string]interface{}{ - "m": map[interface{}]interface{}{nil: "bar"}, - "empty": map[interface{}]interface{}{}, + env := map[string]any{ + "m": map[any]any{nil: "bar"}, + "empty": map[any]any{}, } t.Run("nil key exists", func(t *testing.T) { p, err := expr.Compile(`m[nil]`, expr.Env(env)) @@ -1791,7 +1791,7 @@ func TestEval_nil_in_maps(t *testing.T) { // Test the use of env keyword. Forms env[] and env[”] are valid. // The enclosed identifier must be in the expression env. func TestEnv_keyword(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "space test": "ok", "space_test": "not ok", // Seems to be some underscore substituting happening, check that. "Section 1-2a": "ok", @@ -1825,7 +1825,7 @@ func TestEnv_keyword(t *testing.T) { // No error cases var tests = []struct { code string - want interface{} + want any }{ {"$env['space test']", "ok"}, {"$env['Section 1-2a']", "ok"}, @@ -1872,7 +1872,7 @@ func TestEnv_keyword(t *testing.T) { // error cases tests = []struct { code string - want interface{} + want any }{ {"env()", "bad"}, } @@ -1891,7 +1891,7 @@ func TestIssue401(t *testing.T) { program, err := expr.Compile("(a - b + c) / d", expr.AllowUndefinedVariables()) require.NoError(t, err, "compile error") - output, err := expr.Run(program, map[string]interface{}{ + output, err := expr.Run(program, map[string]any{ "a": 1, "b": 2, "c": 3, @@ -1904,12 +1904,12 @@ func TestIssue401(t *testing.T) { func TestEval_slices_out_of_bound(t *testing.T) { tests := []struct { code string - want interface{} + want any }{ - {"[1, 2, 3][:99]", []interface{}{1, 2, 3}}, - {"[1, 2, 3][99:]", []interface{}{}}, - {"[1, 2, 3][:-99]", []interface{}{}}, - {"[1, 2, 3][-99:]", []interface{}{1, 2, 3}}, + {"[1, 2, 3][:99]", []any{1, 2, 3}}, + {"[1, 2, 3][99:]", []any{}}, + {"[1, 2, 3][:-99]", []any{}}, + {"[1, 2, 3][-99:]", []any{1, 2, 3}}, } for _, tt := range tests { diff --git a/optimizer/const_expr.go b/optimizer/const_expr.go index 7ececb3db..694c88bcf 100644 --- a/optimizer/const_expr.go +++ b/optimizer/const_expr.go @@ -42,7 +42,7 @@ func (c *constExpr) Visit(node *Node) { in := make([]reflect.Value, len(call.Arguments)) for i := 0; i < len(call.Arguments); i++ { arg := call.Arguments[i] - var param interface{} + var param any switch a := arg.(type) { case *NilNode: diff --git a/optimizer/fold.go b/optimizer/fold.go index 8d31a5cc5..670ebec09 100644 --- a/optimizer/fold.go +++ b/optimizer/fold.go @@ -285,7 +285,7 @@ func (fold *fold) Visit(node *Node) { return } } - value := make([]interface{}, len(n.Nodes)) + value := make([]any, len(n.Nodes)) for i, a := range n.Nodes { switch b := a.(type) { case *IntegerNode: diff --git a/optimizer/optimizer_test.go b/optimizer/optimizer_test.go index 4f2130618..7ecbefa29 100644 --- a/optimizer/optimizer_test.go +++ b/optimizer/optimizer_test.go @@ -23,7 +23,7 @@ func TestOptimize_constant_folding(t *testing.T) { require.NoError(t, err) expected := &ast.MemberNode{ - Node: &ast.ConstantNode{Value: []interface{}{1, 2, 3}}, + Node: &ast.ConstantNode{Value: []any{1, 2, 3}}, Property: &ast.IntegerNode{Value: 0}, } @@ -134,7 +134,7 @@ func TestOptimize_const_expr(t *testing.T) { tree, err := parser.Parse(`toUpper("hello")`) require.NoError(t, err) - env := map[string]interface{}{ + env := map[string]any{ "toUpper": strings.ToUpper, } diff --git a/parser/lexer/lexer.go b/parser/lexer/lexer.go index cfb1e8c61..5db2dcbb5 100644 --- a/parser/lexer/lexer.go +++ b/parser/lexer/lexer.go @@ -150,7 +150,7 @@ func (l *lexer) acceptWord(word string) bool { return true } -func (l *lexer) error(format string, args ...interface{}) stateFn { +func (l *lexer) error(format string, args ...any) stateFn { if l.err == nil { // show first error l.err = &file.Error{ Location: l.loc, diff --git a/parser/parser.go b/parser/parser.go index 87cdb2982..229f8e1b3 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -81,11 +81,11 @@ func ParseWithConfig(input string, config *conf.Config) (*Tree, error) { }, nil } -func (p *parser) error(format string, args ...interface{}) { +func (p *parser) error(format string, args ...any) { p.errorAt(p.current, format, args...) } -func (p *parser) errorAt(token Token, format string, args ...interface{}) { +func (p *parser) errorAt(token Token, format string, args ...any) { if p.err == nil { // show first error p.err = &file.Error{ Location: token.Location, diff --git a/repl/repl.go b/repl/repl.go index 1e70feffe..2508973d4 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -36,7 +36,7 @@ func main() { } defer rl.Close() - env := map[string]interface{}{ + env := map[string]any{ "ENV": os.Environ(), } var program *vm.Program diff --git a/test/coredns/coredns.go b/test/coredns/coredns.go index 068946487..40f005243 100644 --- a/test/coredns/coredns.go +++ b/test/coredns/coredns.go @@ -6,8 +6,8 @@ import ( "net" ) -func DefaultEnv(ctx context.Context, state *Request) map[string]interface{} { - return map[string]interface{}{ +func DefaultEnv(ctx context.Context, state *Request) map[string]any { + return map[string]any{ "incidr": func(ipStr, cidrStr string) (bool, error) { ip := net.ParseIP(ipStr) if ip == nil { diff --git a/test/crowdsec/crowdsec.go b/test/crowdsec/crowdsec.go index e1ec1becb..7a6a03751 100644 --- a/test/crowdsec/crowdsec.go +++ b/test/crowdsec/crowdsec.go @@ -5,22 +5,22 @@ import ( ) type Event struct { - Type int `yaml:"Type,omitempty" json:"Type,omitempty"` - ExpectMode int `yaml:"ExpectMode,omitempty" json:"ExpectMode,omitempty"` - Whitelisted bool `yaml:"Whitelisted,omitempty" json:"Whitelisted,omitempty"` - WhitelistReason string `yaml:"WhitelistReason,omitempty" json:"whitelist_reason,omitempty"` - Stage string `yaml:"Stage,omitempty" json:"Stage,omitempty"` - Line Line `yaml:"Line,omitempty" json:"Line,omitempty"` - Parsed map[string]string `yaml:"Parsed,omitempty" json:"Parsed,omitempty"` - Enriched map[string]string `yaml:"Enriched,omitempty" json:"Enriched,omitempty"` - Unmarshaled map[string]interface{} `yaml:"Unmarshaled,omitempty" json:"Unmarshaled,omitempty"` - Overflow RuntimeAlert `yaml:"Overflow,omitempty" json:"Alert,omitempty"` - Time time.Time `yaml:"Time,omitempty" json:"Time,omitempty"` - StrTime string `yaml:"StrTime,omitempty" json:"StrTime,omitempty"` - StrTimeFormat string `yaml:"StrTimeFormat,omitempty" json:"StrTimeFormat,omitempty"` - MarshaledTime string `yaml:"MarshaledTime,omitempty" json:"MarshaledTime,omitempty"` - Process bool `yaml:"Process,omitempty" json:"Process,omitempty"` - Meta map[string]string `yaml:"Meta,omitempty" json:"Meta,omitempty"` + Type int `yaml:"Type,omitempty" json:"Type,omitempty"` + ExpectMode int `yaml:"ExpectMode,omitempty" json:"ExpectMode,omitempty"` + Whitelisted bool `yaml:"Whitelisted,omitempty" json:"Whitelisted,omitempty"` + WhitelistReason string `yaml:"WhitelistReason,omitempty" json:"whitelist_reason,omitempty"` + Stage string `yaml:"Stage,omitempty" json:"Stage,omitempty"` + Line Line `yaml:"Line,omitempty" json:"Line,omitempty"` + Parsed map[string]string `yaml:"Parsed,omitempty" json:"Parsed,omitempty"` + Enriched map[string]string `yaml:"Enriched,omitempty" json:"Enriched,omitempty"` + Unmarshaled map[string]any `yaml:"Unmarshaled,omitempty" json:"Unmarshaled,omitempty"` + Overflow RuntimeAlert `yaml:"Overflow,omitempty" json:"Alert,omitempty"` + Time time.Time `yaml:"Time,omitempty" json:"Time,omitempty"` + StrTime string `yaml:"StrTime,omitempty" json:"StrTime,omitempty"` + StrTimeFormat string `yaml:"StrTimeFormat,omitempty" json:"StrTimeFormat,omitempty"` + MarshaledTime string `yaml:"MarshaledTime,omitempty" json:"MarshaledTime,omitempty"` + Process bool `yaml:"Process,omitempty" json:"Process,omitempty"` + Meta map[string]string `yaml:"Meta,omitempty" json:"Meta,omitempty"` } func (e *Event) GetType() string { diff --git a/test/crowdsec/crowdsec_test.go b/test/crowdsec/crowdsec_test.go index 0ff2f6211..e38190a38 100644 --- a/test/crowdsec/crowdsec_test.go +++ b/test/crowdsec/crowdsec_test.go @@ -18,7 +18,7 @@ func TestCrowdsec(t *testing.T) { err = json.Unmarshal(b, &examples) require.NoError(t, err) - env := map[string]interface{}{ + env := map[string]any{ "evt": &crowdsec.Event{}, } @@ -30,7 +30,7 @@ func TestCrowdsec(t *testing.T) { opt, expr.Function( fn.Name, - func(params ...interface{}) (interface{}, error) { + func(params ...any) (any, error) { return nil, nil }, fn.Func..., diff --git a/test/crowdsec/funcs.go b/test/crowdsec/funcs.go index acc14c545..928cc1f9d 100644 --- a/test/crowdsec/funcs.go +++ b/test/crowdsec/funcs.go @@ -6,347 +6,347 @@ import ( var CustomFunctions = []struct { Name string - Func []interface{} + Func []any }{ { Name: "Distance", - Func: []interface{}{ + Func: []any{ new(func(string, string, string, string) (float64, error)), }, }, { Name: "GetFromStash", - Func: []interface{}{ + Func: []any{ new(func(string, string) (string, error)), }, }, { Name: "Atof", - Func: []interface{}{ + Func: []any{ new(func(string) float64), }, }, { Name: "JsonExtract", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "JsonExtractUnescape", - Func: []interface{}{ + Func: []any{ new(func(string, ...string) string), }, }, { Name: "JsonExtractLib", - Func: []interface{}{ + Func: []any{ new(func(string, ...string) string), }, }, { Name: "JsonExtractSlice", - Func: []interface{}{ - new(func(string, string) []interface{}), + Func: []any{ + new(func(string, string) []any), }, }, { Name: "JsonExtractObject", - Func: []interface{}{ - new(func(string, string) map[string]interface{}), + Func: []any{ + new(func(string, string) map[string]any), }, }, { Name: "ToJsonString", - Func: []interface{}{ - new(func(interface{}) string), + Func: []any{ + new(func(any) string), }, }, { Name: "File", - Func: []interface{}{ + Func: []any{ new(func(string) []string), }, }, { Name: "RegexpInFile", - Func: []interface{}{ + Func: []any{ new(func(string, string) bool), }, }, { Name: "Upper", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "Lower", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "IpInRange", - Func: []interface{}{ + Func: []any{ new(func(string, string) bool), }, }, { Name: "TimeNow", - Func: []interface{}{ + Func: []any{ new(func() string), }, }, { Name: "ParseUri", - Func: []interface{}{ + Func: []any{ new(func(string) map[string][]string), }, }, { Name: "PathUnescape", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "QueryUnescape", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "PathEscape", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "QueryEscape", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "XMLGetAttributeValue", - Func: []interface{}{ + Func: []any{ new(func(string, string, string) string), }, }, { Name: "XMLGetNodeValue", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "IpToRange", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "IsIPV6", - Func: []interface{}{ + Func: []any{ new(func(string) bool), }, }, { Name: "IsIPV4", - Func: []interface{}{ + Func: []any{ new(func(string) bool), }, }, { Name: "IsIP", - Func: []interface{}{ + Func: []any{ new(func(string) bool), }, }, { Name: "LookupHost", - Func: []interface{}{ + Func: []any{ new(func(string) []string), }, }, { Name: "GetDecisionsCount", - Func: []interface{}{ + Func: []any{ new(func(string) int), }, }, { Name: "GetDecisionsSinceCount", - Func: []interface{}{ + Func: []any{ new(func(string, string) int), }, }, { Name: "Sprintf", - Func: []interface{}{ - new(func(string, ...interface{}) string), + Func: []any{ + new(func(string, ...any) string), }, }, { Name: "ParseUnix", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "SetInStash", - Func: []interface{}{ + Func: []any{ new(func(string, string, string, *time.Duration) error), }, }, { Name: "Fields", - Func: []interface{}{ + Func: []any{ new(func(string) []string), }, }, { Name: "Index", - Func: []interface{}{ + Func: []any{ new(func(string, string) int), }, }, { Name: "IndexAny", - Func: []interface{}{ + Func: []any{ new(func(string, string) int), }, }, { Name: "Join", - Func: []interface{}{ + Func: []any{ new(func([]string, string) string), }, }, { Name: "Split", - Func: []interface{}{ + Func: []any{ new(func(string, string) []string), }, }, { Name: "SplitAfter", - Func: []interface{}{ + Func: []any{ new(func(string, string) []string), }, }, { Name: "SplitAfterN", - Func: []interface{}{ + Func: []any{ new(func(string, string, int) []string), }, }, { Name: "SplitN", - Func: []interface{}{ + Func: []any{ new(func(string, string, int) []string), }, }, { Name: "Replace", - Func: []interface{}{ + Func: []any{ new(func(string, string, string, int) string), }, }, { Name: "ReplaceAll", - Func: []interface{}{ + Func: []any{ new(func(string, string, string) string), }, }, { Name: "Trim", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "TrimLeft", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "TrimRight", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "TrimSpace", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "TrimPrefix", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "TrimSuffix", - Func: []interface{}{ + Func: []any{ new(func(string, string) string), }, }, { Name: "Get", - Func: []interface{}{ + Func: []any{ new(func([]string, int) string), }, }, { Name: "ToString", - Func: []interface{}{ - new(func(interface{}) string), + Func: []any{ + new(func(any) string), }, }, { Name: "Match", - Func: []interface{}{ + Func: []any{ new(func(string, string) bool), }, }, { Name: "KeyExists", - Func: []interface{}{ - new(func(string, map[string]interface{}) bool), + Func: []any{ + new(func(string, map[string]any) bool), }, }, { Name: "LogInfo", - Func: []interface{}{ - new(func(string, ...interface{}) bool), + Func: []any{ + new(func(string, ...any) bool), }, }, { Name: "B64Decode", - Func: []interface{}{ + Func: []any{ new(func(string) string), }, }, { Name: "UnmarshalJSON", - Func: []interface{}{ - new(func(string, map[string]interface{}, string) error), + Func: []any{ + new(func(string, map[string]any, string) error), }, }, { Name: "ParseKV", - Func: []interface{}{ - new(func(string, map[string]interface{}, string) error), + Func: []any{ + new(func(string, map[string]any, string) error), }, }, { Name: "Hostname", - Func: []interface{}{ + Func: []any{ new(func() (string, error)), }, }, diff --git a/test/deref/deref_test.go b/test/deref/deref_test.go index 1e1bb83a1..4af128bde 100644 --- a/test/deref/deref_test.go +++ b/test/deref/deref_test.go @@ -10,9 +10,9 @@ import ( func TestDeref_binary(t *testing.T) { i := 1 - env := map[string]interface{}{ + env := map[string]any{ "i": &i, - "obj": map[string]interface{}{ + "obj": map[string]any{ "i": &i, }, } @@ -45,9 +45,9 @@ func TestDeref_binary(t *testing.T) { func TestDeref_unary(t *testing.T) { i := 1 ok := true - env := map[string]interface{}{ + env := map[string]any{ "i": &i, - "obj": map[string]interface{}{ + "obj": map[string]any{ "ok": &ok, }, } @@ -62,9 +62,9 @@ func TestDeref_unary(t *testing.T) { func TestDeref_eval(t *testing.T) { i := 1 - env := map[string]interface{}{ + env := map[string]any{ "i": &i, - "obj": map[string]interface{}{ + "obj": map[string]any{ "i": &i, }, } @@ -77,7 +77,7 @@ func TestDeref_emptyCtx(t *testing.T) { program, err := expr.Compile(`ctx`) require.NoError(t, err) - output, err := expr.Run(program, map[string]interface{}{ + output, err := expr.Run(program, map[string]any{ "ctx": context.Background(), }) require.NoError(t, err) @@ -85,7 +85,7 @@ func TestDeref_emptyCtx(t *testing.T) { } func TestDeref_emptyCtx_Eval(t *testing.T) { - output, err := expr.Eval(`ctx`, map[string]interface{}{ + output, err := expr.Eval(`ctx`, map[string]any{ "ctx": context.Background(), }) require.NoError(t, err) @@ -96,7 +96,7 @@ func TestDeref_context_WithValue(t *testing.T) { program, err := expr.Compile(`ctxWithValue`) require.NoError(t, err) - output, err := expr.Run(program, map[string]interface{}{ + output, err := expr.Run(program, map[string]any{ "ctxWithValue": context.WithValue(context.Background(), "value", "test"), }) require.NoError(t, err) @@ -104,7 +104,7 @@ func TestDeref_context_WithValue(t *testing.T) { } func TestDeref_method_on_int_pointer(t *testing.T) { - output, err := expr.Eval(`foo.Bar()`, map[string]interface{}{ + output, err := expr.Eval(`foo.Bar()`, map[string]any{ "foo": new(foo), }) require.NoError(t, err) @@ -122,7 +122,7 @@ func TestDeref_multiple_pointers(t *testing.T) { b := &a c := &b t.Run("returned as is", func(t *testing.T) { - output, err := expr.Eval(`c`, map[string]interface{}{ + output, err := expr.Eval(`c`, map[string]any{ "c": c, }) require.NoError(t, err) @@ -130,7 +130,7 @@ func TestDeref_multiple_pointers(t *testing.T) { require.IsType(t, (**int)(nil), output) }) t.Run("+ works", func(t *testing.T) { - output, err := expr.Eval(`c+2`, map[string]interface{}{ + output, err := expr.Eval(`c+2`, map[string]any{ "c": c, }) require.NoError(t, err) diff --git a/test/interface_method/interface_method_test.go b/test/interface_method/interface_method_test.go index 44d765f04..ab49d5356 100644 --- a/test/interface_method/interface_method_test.go +++ b/test/interface_method/interface_method_test.go @@ -35,7 +35,7 @@ func TestInterfaceMethod(t *testing.T) { require.True(t, BarImpl{}.Aba()) require.True(t, BarImpl{}.Bar() == 42) - env := map[string]interface{}{ + env := map[string]any{ "var": FooImpl{}, } p, err := expr.Compile(`var.Foo().Bar()`, expr.Env(env)) diff --git a/test/mock/mock.go b/test/mock/mock.go index b2798a045..ad4a91563 100644 --- a/test/mock/mock.go +++ b/test/mock/mock.go @@ -12,7 +12,7 @@ import ( type Env struct { Embed Ambiguous string - Any interface{} + Any any Bool bool Float float64 Int64 int64 @@ -30,24 +30,24 @@ type Env struct { StringPtr *string Foo Foo Abstract Abstract - ArrayOfAny []interface{} + ArrayOfAny []any ArrayOfInt []int ArrayOfString []string ArrayOfFoo []*Foo MapOfFoo map[string]Foo - MapOfAny map[string]interface{} + MapOfAny map[string]any MapIntAny map[int]string FuncParam func(_ bool, _ int, _ string) bool - FuncParamAny func(_ interface{}) bool + FuncParamAny func(_ any) bool FuncTooManyReturns func() (int, int, error) FuncNamed MyFunc - NilAny interface{} + NilAny any NilInt *int NilFn func() NilStruct *Foo - NilSlice []interface{} + NilSlice []any Variadic func(_ int, _ ...int) bool - Fast func(...interface{}) interface{} + Fast func(...any) any Time time.Time TimePlusDay time.Time Duration time.Duration @@ -172,6 +172,6 @@ type MapStringIntEnv map[string]int type Is struct{} -func (Is) Nil(a interface{}) bool { +func (Is) Nil(a any) bool { return a == nil } diff --git a/test/pipes/pipes_test.go b/test/pipes/pipes_test.go index 6a0e2950b..98c55f5fc 100644 --- a/test/pipes/pipes_test.go +++ b/test/pipes/pipes_test.go @@ -9,13 +9,13 @@ import ( ) func TestPipes(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "sprintf": fmt.Sprintf, } tests := []struct { input string - want interface{} + want any }{ { `-1 | abs()`, @@ -53,5 +53,5 @@ func TestPipes_map_filter(t *testing.T) { out, err := expr.Run(program, nil) require.NoError(t, err) - require.Equal(t, []interface{}{2, 4, 6, 8, 10}, out) + require.Equal(t, []any{2, 4, 6, 8, 10}, out) } diff --git a/test/time/time_test.go b/test/time/time_test.go index 4b659367c..7012a24cf 100644 --- a/test/time/time_test.go +++ b/test/time/time_test.go @@ -19,10 +19,10 @@ func TestTime(t *testing.T) { testDuration := time.Duration(1) tests := []struct { - a interface{} - b interface{} + a any + b any op string - want interface{} + want any wantErr bool }{ {a: testTime, b: testTime, op: "<", wantErr: false, want: false}, @@ -72,7 +72,7 @@ func TestTime(t *testing.T) { for _, tt := range tests { t.Run(fmt.Sprintf("time helper test `%T %s %T`", tt.a, tt.op, tt.b), func(t *testing.T) { input := fmt.Sprintf("a %v b", tt.op) - env := map[string]interface{}{ + env := map[string]any{ "a": tt.a, "b": tt.b, } @@ -103,7 +103,7 @@ func TestTime(t *testing.T) { } func TestTime_duration(t *testing.T) { - env := map[string]interface{}{ + env := map[string]any{ "foo": time.Date(2000, time.Month(1), 1, 0, 0, 0, 0, time.UTC), } program, err := expr.Compile(`now() - duration("1h") < now() && foo + duration("24h") < now()`, expr.Env(env)) diff --git a/vm/func_types/main.go b/vm/func_types/main.go index 8d99ba044..6262261ef 100644 --- a/vm/func_types/main.go +++ b/vm/func_types/main.go @@ -11,21 +11,21 @@ import ( ) // Keep sorted. -var types = []interface{}{ +var types = []any{ nil, new(func() Duration), new(func() Month), new(func() Time), new(func() Weekday), new(func() []byte), - new(func() []interface{}), + new(func() []any), new(func() bool), new(func() byte), new(func() float64), new(func() int), new(func() int64), - new(func() interface{}), - new(func() map[string]interface{}), + new(func() any), + new(func() map[string]any), new(func() rune), new(func() string), new(func() uint), @@ -34,7 +34,7 @@ var types = []interface{}{ new(func(Duration) Time), new(func(Time) Duration), new(func(Time) bool), - new(func([]interface{}, string) string), + new(func([]any, string) string), new(func([]string, string) string), new(func(bool) bool), new(func(bool) float64), @@ -61,20 +61,20 @@ var types = []interface{}{ new(func(string, rune) int), new(func(string, string) bool), new(func(string, string) string), - new(func(interface{}) bool), - new(func(interface{}) float64), - new(func(interface{}) int), - new(func(interface{}) string), - new(func(interface{}) interface{}), - new(func(interface{}) []interface{}), - new(func(interface{}) map[string]interface{}), - new(func([]interface{}) interface{}), - new(func([]interface{}) []interface{}), - new(func([]interface{}) map[string]interface{}), - new(func(interface{}, interface{}) bool), - new(func(interface{}, interface{}) string), - new(func(interface{}, interface{}) interface{}), - new(func(interface{}, interface{}) []interface{}), + new(func(any) bool), + new(func(any) float64), + new(func(any) int), + new(func(any) string), + new(func(any) any), + new(func(any) []any), + new(func(any) map[string]any), + new(func([]any) any), + new(func([]any) []any), + new(func([]any) map[string]any), + new(func(any, any) bool), + new(func(any, any) string), + new(func(any, any) any), + new(func(any, any) []any), } func main() { diff --git a/vm/generated.go b/vm/generated.go index 9fc7883e2..1a0b36571 100644 --- a/vm/generated.go +++ b/vm/generated.go @@ -7,20 +7,20 @@ import ( "time" ) -var FuncTypes = []interface{}{ +var FuncTypes = []any{ 1: new(func() time.Duration), 2: new(func() time.Month), 3: new(func() time.Time), 4: new(func() time.Weekday), 5: new(func() []uint8), - 6: new(func() []interface{}), + 6: new(func() []any), 7: new(func() bool), 8: new(func() uint8), 9: new(func() float64), 10: new(func() int), 11: new(func() int64), - 12: new(func() interface{}), - 13: new(func() map[string]interface{}), + 12: new(func() any), + 13: new(func() map[string]any), 14: new(func() int32), 15: new(func() string), 16: new(func() uint), @@ -29,7 +29,7 @@ var FuncTypes = []interface{}{ 19: new(func(time.Duration) time.Time), 20: new(func(time.Time) time.Duration), 21: new(func(time.Time) bool), - 22: new(func([]interface{}, string) string), + 22: new(func([]any, string) string), 23: new(func([]string, string) string), 24: new(func(bool) bool), 25: new(func(bool) float64), @@ -56,23 +56,23 @@ var FuncTypes = []interface{}{ 46: new(func(string, int32) int), 47: new(func(string, string) bool), 48: new(func(string, string) string), - 49: new(func(interface{}) bool), - 50: new(func(interface{}) float64), - 51: new(func(interface{}) int), - 52: new(func(interface{}) string), - 53: new(func(interface{}) interface{}), - 54: new(func(interface{}) []interface{}), - 55: new(func(interface{}) map[string]interface{}), - 56: new(func([]interface{}) interface{}), - 57: new(func([]interface{}) []interface{}), - 58: new(func([]interface{}) map[string]interface{}), - 59: new(func(interface{}, interface{}) bool), - 60: new(func(interface{}, interface{}) string), - 61: new(func(interface{}, interface{}) interface{}), - 62: new(func(interface{}, interface{}) []interface{}), + 49: new(func(any) bool), + 50: new(func(any) float64), + 51: new(func(any) int), + 52: new(func(any) string), + 53: new(func(any) any), + 54: new(func(any) []any), + 55: new(func(any) map[string]any), + 56: new(func([]any) any), + 57: new(func([]any) []any), + 58: new(func([]any) map[string]any), + 59: new(func(any, any) bool), + 60: new(func(any, any) string), + 61: new(func(any, any) any), + 62: new(func(any, any) []any), } -func (vm *VM) call(fn interface{}, kind int) interface{} { +func (vm *VM) call(fn any, kind int) any { switch kind { case 1: return fn.(func() time.Duration)() @@ -85,7 +85,7 @@ func (vm *VM) call(fn interface{}, kind int) interface{} { case 5: return fn.(func() []uint8)() case 6: - return fn.(func() []interface{})() + return fn.(func() []any)() case 7: return fn.(func() bool)() case 8: @@ -97,9 +97,9 @@ func (vm *VM) call(fn interface{}, kind int) interface{} { case 11: return fn.(func() int64)() case 12: - return fn.(func() interface{})() + return fn.(func() any)() case 13: - return fn.(func() map[string]interface{})() + return fn.(func() map[string]any)() case 14: return fn.(func() int32)() case 15: @@ -122,8 +122,8 @@ func (vm *VM) call(fn interface{}, kind int) interface{} { return fn.(func(time.Time) bool)(arg1) case 22: arg2 := vm.pop().(string) - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}, string) string)(arg1, arg2) + arg1 := vm.pop().([]any) + return fn.(func([]any, string) string)(arg1, arg2) case 23: arg2 := vm.pop().(string) arg1 := vm.pop().([]string) @@ -212,50 +212,50 @@ func (vm *VM) call(fn interface{}, kind int) interface{} { return fn.(func(string, string) string)(arg1, arg2) case 49: arg1 := vm.pop() - return fn.(func(interface{}) bool)(arg1) + return fn.(func(any) bool)(arg1) case 50: arg1 := vm.pop() - return fn.(func(interface{}) float64)(arg1) + return fn.(func(any) float64)(arg1) case 51: arg1 := vm.pop() - return fn.(func(interface{}) int)(arg1) + return fn.(func(any) int)(arg1) case 52: arg1 := vm.pop() - return fn.(func(interface{}) string)(arg1) + return fn.(func(any) string)(arg1) case 53: arg1 := vm.pop() - return fn.(func(interface{}) interface{})(arg1) + return fn.(func(any) any)(arg1) case 54: arg1 := vm.pop() - return fn.(func(interface{}) []interface{})(arg1) + return fn.(func(any) []any)(arg1) case 55: arg1 := vm.pop() - return fn.(func(interface{}) map[string]interface{})(arg1) + return fn.(func(any) map[string]any)(arg1) case 56: - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}) interface{})(arg1) + arg1 := vm.pop().([]any) + return fn.(func([]any) any)(arg1) case 57: - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}) []interface{})(arg1) + arg1 := vm.pop().([]any) + return fn.(func([]any) []any)(arg1) case 58: - arg1 := vm.pop().([]interface{}) - return fn.(func([]interface{}) map[string]interface{})(arg1) + arg1 := vm.pop().([]any) + return fn.(func([]any) map[string]any)(arg1) case 59: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(interface{}, interface{}) bool)(arg1, arg2) + return fn.(func(any, any) bool)(arg1, arg2) case 60: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(interface{}, interface{}) string)(arg1, arg2) + return fn.(func(any, any) string)(arg1, arg2) case 61: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(interface{}, interface{}) interface{})(arg1, arg2) + return fn.(func(any, any) any)(arg1, arg2) case 62: arg2 := vm.pop() arg1 := vm.pop() - return fn.(func(interface{}, interface{}) []interface{})(arg1, arg2) + return fn.(func(any, any) []any)(arg1, arg2) } panic(fmt.Sprintf("unknown function kind (%v)", kind)) diff --git a/vm/program.go b/vm/program.go index 029458830..ea2c2a0cc 100644 --- a/vm/program.go +++ b/vm/program.go @@ -19,8 +19,8 @@ type Program struct { Node ast.Node Source *file.Source Locations []file.Location - Variables []interface{} - Constants []interface{} + Variables []any + Constants []any Bytecode []Opcode Arguments []int Functions []Function @@ -59,7 +59,7 @@ func (program *Program) Opcodes(w io.Writer) { _, _ = fmt.Fprintf(w, "%v\t%v\t<%v>\t%v\n", pp, label, arg, program.DebugInfo[fmt.Sprintf("%s_%d", prefix, arg)]) } constant := func(label string) { - var c interface{} + var c any if arg < len(program.Constants) { c = program.Constants[arg] } else { diff --git a/vm/program_test.go b/vm/program_test.go index 06e83b18c..4408a565d 100644 --- a/vm/program_test.go +++ b/vm/program_test.go @@ -10,7 +10,7 @@ import ( func TestProgram_Disassemble(t *testing.T) { for op := vm.OpPush; op < vm.OpEnd; op++ { program := vm.Program{ - Constants: []interface{}{1, 2}, + Constants: []any{1, 2}, Bytecode: []vm.Opcode{op}, Arguments: []int{1}, } diff --git a/vm/runtime/generated.go b/vm/runtime/generated.go index 011a03325..0832dc991 100644 --- a/vm/runtime/generated.go +++ b/vm/runtime/generated.go @@ -8,7 +8,7 @@ import ( "time" ) -func Equal(a, b interface{}) bool { +func Equal(a, b any) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -351,7 +351,7 @@ func Equal(a, b interface{}) bool { return reflect.DeepEqual(a, b) } -func Less(a, b interface{}) bool { +func Less(a, b any) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -691,7 +691,7 @@ func Less(a, b interface{}) bool { panic(fmt.Sprintf("invalid operation: %T < %T", a, b)) } -func More(a, b interface{}) bool { +func More(a, b any) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -1031,7 +1031,7 @@ func More(a, b interface{}) bool { panic(fmt.Sprintf("invalid operation: %T > %T", a, b)) } -func LessOrEqual(a, b interface{}) bool { +func LessOrEqual(a, b any) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -1371,7 +1371,7 @@ func LessOrEqual(a, b interface{}) bool { panic(fmt.Sprintf("invalid operation: %T <= %T", a, b)) } -func MoreOrEqual(a, b interface{}) bool { +func MoreOrEqual(a, b any) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -1711,7 +1711,7 @@ func MoreOrEqual(a, b interface{}) bool { panic(fmt.Sprintf("invalid operation: %T >= %T", a, b)) } -func Add(a, b interface{}) interface{} { +func Add(a, b any) any { switch x := a.(type) { case uint: switch y := b.(type) { @@ -2056,7 +2056,7 @@ func Add(a, b interface{}) interface{} { panic(fmt.Sprintf("invalid operation: %T + %T", a, b)) } -func Subtract(a, b interface{}) interface{} { +func Subtract(a, b any) any { switch x := a.(type) { case uint: switch y := b.(type) { @@ -2393,7 +2393,7 @@ func Subtract(a, b interface{}) interface{} { panic(fmt.Sprintf("invalid operation: %T - %T", a, b)) } -func Multiply(a, b interface{}) interface{} { +func Multiply(a, b any) any { switch x := a.(type) { case uint: switch y := b.(type) { @@ -2723,7 +2723,7 @@ func Multiply(a, b interface{}) interface{} { panic(fmt.Sprintf("invalid operation: %T * %T", a, b)) } -func Divide(a, b interface{}) float64 { +func Divide(a, b any) float64 { switch x := a.(type) { case uint: switch y := b.(type) { @@ -3053,7 +3053,7 @@ func Divide(a, b interface{}) float64 { panic(fmt.Sprintf("invalid operation: %T / %T", a, b)) } -func Modulo(a, b interface{}) int { +func Modulo(a, b any) int { switch x := a.(type) { case uint: switch y := b.(type) { diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index b9b919283..21d53ea6f 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -46,7 +46,7 @@ var types = []string{ func cases(op string, noFloat bool) string { var out string - echo := func(s string, xs ...interface{}) { + echo := func(s string, xs ...any) { out += fmt.Sprintf(s, xs...) + "\n" } for _, a := range types { diff --git a/vm/runtime/runtime.go b/vm/runtime/runtime.go index 7075c7014..b03714e0f 100644 --- a/vm/runtime/runtime.go +++ b/vm/runtime/runtime.go @@ -8,7 +8,7 @@ import ( "reflect" ) -func Fetch(from, i interface{}) interface{} { +func Fetch(from, i any) any { v := reflect.ValueOf(from) kind := v.Kind() if kind == reflect.Invalid { @@ -81,7 +81,7 @@ type Field struct { Path []string } -func FetchField(from interface{}, field *Field) interface{} { +func FetchField(from any, field *Field) any { v := reflect.ValueOf(from) kind := v.Kind() if kind != reflect.Invalid { @@ -125,7 +125,7 @@ type Method struct { Name string } -func FetchMethod(from interface{}, method *Method) interface{} { +func FetchMethod(from any, method *Method) any { v := reflect.ValueOf(from) kind := v.Kind() if kind != reflect.Invalid { @@ -138,7 +138,7 @@ func FetchMethod(from interface{}, method *Method) interface{} { panic(fmt.Sprintf("cannot fetch %v from %T", method.Name, from)) } -func Deref(i interface{}) interface{} { +func Deref(i any) any { if i == nil { return nil } @@ -173,7 +173,7 @@ loop: panic(fmt.Sprintf("cannot dereference %v", i)) } -func Slice(array, from, to interface{}) interface{} { +func Slice(array, from, to any) any { v := reflect.ValueOf(array) switch v.Kind() { @@ -213,7 +213,7 @@ func Slice(array, from, to interface{}) interface{} { panic(fmt.Sprintf("cannot slice %v", from)) } -func In(needle interface{}, array interface{}) bool { +func In(needle any, array any) bool { if array == nil { return false } @@ -270,7 +270,7 @@ func In(needle interface{}, array interface{}) bool { panic(fmt.Sprintf(`operator "in" not defined on %T`, array)) } -func Len(a interface{}) int { +func Len(a any) int { v := reflect.ValueOf(a) switch v.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: @@ -280,7 +280,7 @@ func Len(a interface{}) int { } } -func Negate(i interface{}) interface{} { +func Negate(i any) any { switch v := i.(type) { case float32: return -v @@ -311,7 +311,7 @@ func Negate(i interface{}) interface{} { } } -func Exponent(a, b interface{}) float64 { +func Exponent(a, b any) float64 { return math.Pow(ToFloat64(a), ToFloat64(b)) } @@ -327,7 +327,7 @@ func MakeRange(min, max int) []int { return rng } -func ToInt(a interface{}) int { +func ToInt(a any) int { switch x := a.(type) { case float32: return int(x) @@ -358,7 +358,7 @@ func ToInt(a interface{}) int { } } -func ToInt64(a interface{}) int64 { +func ToInt64(a any) int64 { switch x := a.(type) { case float32: return int64(x) @@ -389,7 +389,7 @@ func ToInt64(a interface{}) int64 { } } -func ToFloat64(a interface{}) float64 { +func ToFloat64(a any) float64 { switch x := a.(type) { case float32: return float64(x) @@ -420,7 +420,7 @@ func ToFloat64(a interface{}) float64 { } } -func IsNil(v interface{}) bool { +func IsNil(v any) bool { if v == nil { return true } diff --git a/vm/vm.go b/vm/vm.go index b4a15a20d..ae8fe8d96 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -16,9 +16,9 @@ import ( var MemoryBudget int = 1e6 var errorType = reflect.TypeOf((*error)(nil)).Elem() -type Function = func(params ...interface{}) (interface{}, error) +type Function = func(params ...any) (any, error) -func Run(program *Program, env interface{}) (interface{}, error) { +func Run(program *Program, env any) (any, error) { if program == nil { return nil, fmt.Errorf("program is nil") } @@ -28,7 +28,7 @@ func Run(program *Program, env interface{}) (interface{}, error) { } type VM struct { - stack []interface{} + stack []any ip int scopes []*Scope debug bool @@ -55,7 +55,7 @@ func Debug() *VM { return vm } -func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) { +func (vm *VM) Run(program *Program, env any) (_ any, err error) { defer func() { if r := recover(); r != nil { f := &file.Error{ @@ -70,7 +70,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) }() if vm.stack == nil { - vm.stack = make([]interface{}, 0, 2) + vm.stack = make([]any, 0, 2) } else { vm.stack = vm.stack[0:0] } @@ -119,7 +119,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(runtime.FetchField(env, program.Constants[arg].(*runtime.Field))) case OpLoadFast: - vm.push(env.(map[string]interface{})[program.Constants[arg].(string)]) + vm.push(env.(map[string]any)[program.Constants[arg].(string)]) case OpLoadMethod: vm.push(runtime.FetchMethod(env, program.Constants[arg].(*runtime.Method))) @@ -367,7 +367,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpCallN: fn := vm.pop().(Function) size := arg - in := make([]interface{}, size) + in := make([]any, size) for i := int(size) - 1; i >= 0; i-- { in[i] = vm.pop() } @@ -378,9 +378,9 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) vm.push(out) case OpCallFast: - fn := vm.pop().(func(...interface{}) interface{}) + fn := vm.pop().(func(...any) any) size := arg - in := make([]interface{}, size) + in := make([]any, size) for i := int(size) - 1; i >= 0; i-- { in[i] = vm.pop() } @@ -394,7 +394,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpArray: size := vm.pop().(int) - array := make([]interface{}, size) + array := make([]any, size) for i := size - 1; i >= 0; i-- { array[i] = vm.pop() } @@ -406,7 +406,7 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) case OpMap: size := vm.pop().(int) - m := make(map[string]interface{}) + m := make(map[string]any) for i := size - 1; i >= 0; i-- { value := vm.pop() key := vm.pop() @@ -513,21 +513,21 @@ func (vm *VM) Run(program *Program, env interface{}) (_ interface{}, err error) return nil, nil } -func (vm *VM) push(value interface{}) { +func (vm *VM) push(value any) { vm.stack = append(vm.stack, value) } -func (vm *VM) current() interface{} { +func (vm *VM) current() any { return vm.stack[len(vm.stack)-1] } -func (vm *VM) pop() interface{} { +func (vm *VM) pop() any { value := vm.stack[len(vm.stack)-1] vm.stack = vm.stack[:len(vm.stack)-1] return value } -func (vm *VM) Stack() []interface{} { +func (vm *VM) Stack() []any { return vm.stack } diff --git a/vm/vm_test.go b/vm/vm_test.go index 202dd3357..dfbd17869 100644 --- a/vm/vm_test.go +++ b/vm/vm_test.go @@ -78,7 +78,7 @@ func TestRun_Cast(t *testing.T) { } func TestRun_Helpers(t *testing.T) { - values := []interface{}{ + values := []any{ uint(1), uint8(1), uint16(1), @@ -110,7 +110,7 @@ func TestRun_Helpers(t *testing.T) { } input := fmt.Sprintf("a %v b", op) - env := map[string]interface{}{ + env := map[string]any{ "a": a, "b": b, } @@ -145,7 +145,7 @@ func (ErrorEnv) WillError(param string) (bool, error) { return true, nil } -func (ErrorEnv) FastError(...interface{}) interface{} { +func (ErrorEnv) FastError(...any) any { return true } @@ -185,9 +185,9 @@ func TestRun_FastMethods(t *testing.T) { tree, err := parser.Parse(input) require.NoError(t, err) - env := map[string]interface{}{ - "hello": func(...interface{}) interface{} { return "hello " }, - "world": func(...interface{}) interface{} { return "world" }, + env := map[string]any{ + "hello": func(...any) any { return "hello " }, + "world": func(...any) any { return "world" }, } funcConf := conf.New(env) _, err = checker.Check(tree, funcConf) From 1829e72fa50ccc67f2ce604c7824f24438495477 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 12:07:16 +0200 Subject: [PATCH 135/506] Add countBy() --- bench_test.go | 14 ++++++++++++++ builtin/builtin.go | 5 +++++ checker/checker.go | 19 +++++++++++++++++++ compiler/compiler.go | 12 ++++++++++++ expr_test.go | 4 ++++ parser/parser.go | 1 + vm/opcodes.go | 2 ++ vm/program.go | 6 ++++++ vm/vm.go | 11 +++++++++++ 9 files changed, 74 insertions(+) diff --git a/bench_test.go b/bench_test.go index 935f3a80b..62b787da7 100644 --- a/bench_test.go +++ b/bench_test.go @@ -512,3 +512,17 @@ func Benchmark_groupBy(b *testing.B) { require.Equal(b, 6, out.([]any)[0]) } + +func Benchmark_countBy(b *testing.B) { + program, err := expr.Compile(`countBy(1..100, # % 7)[6]`) + require.NoError(b, err) + + var out any + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, _ = vm.Run(program, nil) + } + b.StopTimer() + + require.Equal(b, 14, out.(int)) +} diff --git a/builtin/builtin.go b/builtin/builtin.go index aacaa0a49..66031b2fd 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -695,4 +695,9 @@ var Builtins = []*ast.Function{ Predicate: true, Types: types(new(func([]any, func(any) any) map[any][]any)), }, + { + Name: "countBy", + Predicate: true, + Types: types(new(func([]any, func(any) any) map[any]int)), + }, } diff --git a/checker/checker.go b/checker/checker.go index e76472ccc..a000c1114 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -736,6 +736,25 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { return reflect.TypeOf(map[any][]any{}), info{} } return v.error(node.Arguments[1], "predicate should has one input and one output param") + + case "countBy": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + v.begin(collection) + closure, _ := v.visit(node.Arguments[1]) + v.end() + + if isFunc(closure) && + closure.NumOut() == 1 && + closure.NumIn() == 1 && isAny(closure.In(0)) { + + return reflect.TypeOf(map[any]int{}), info{} + } + return v.error(node.Arguments[1], "predicate should has one input and one output param") + } if id, ok := builtin.Index[node.Name]; ok { diff --git a/compiler/compiler.go b/compiler/compiler.go index 978ab6f9c..ed8a05ad3 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -824,6 +824,18 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpGetGroupBy) c.emit(OpEnd) return + + case "countBy": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + c.emitLoop(func() { + c.compile(node.Arguments[1]) + c.emit(OpCountBy) + }) + c.emit(OpGetCountBy) + c.emit(OpEnd) + return + } if id, ok := builtin.Index[node.Name]; ok { diff --git a/expr_test.go b/expr_test.go index be8e406a9..fb20f395c 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1063,6 +1063,10 @@ func TestExpr(t *testing.T) { `groupBy(ArrayOfFoo, .Value).foo`, []any{env.ArrayOfFoo[0]}, }, + { + `countBy(1..9, # % 2)`, + map[any]int{0: 4, 1: 5}, + }, } for _, tt := range tests { diff --git a/parser/parser.go b/parser/parser.go index 229f8e1b3..71c4337a2 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -29,6 +29,7 @@ var predicates = map[string]struct { "findLast": {2}, "findLastIndex": {2}, "groupBy": {2}, + "countBy": {2}, } type parser struct { diff --git a/vm/opcodes.go b/vm/opcodes.go index 8a0283173..4f6258ac9 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -73,9 +73,11 @@ const ( OpGetCount OpGetLen OpGetGroupBy + OpGetCountBy OpPointer OpThrow OpGroupBy + OpCountBy OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index ea2c2a0cc..94b8b4ed3 100644 --- a/vm/program.go +++ b/vm/program.go @@ -292,6 +292,9 @@ func (program *Program) Opcodes(w io.Writer) { case OpGetGroupBy: code("OpGetGroupBy") + case OpGetCountBy: + code("OpGetCountBy") + case OpPointer: code("OpPointer") @@ -304,6 +307,9 @@ func (program *Program) Opcodes(w io.Writer) { case OpGroupBy: code("OpGroupBy") + case OpCountBy: + code("OpCountBy") + case OpEnd: code("OpEnd") diff --git a/vm/vm.go b/vm/vm.go index ae8fe8d96..b0a04ce87 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -44,6 +44,7 @@ type Scope struct { Len int Count int GroupBy map[any][]any + CountBy map[any]int } func Debug() *VM { @@ -465,6 +466,9 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpGetGroupBy: vm.push(vm.Scope().GroupBy) + case OpGetCountBy: + vm.push(vm.Scope().CountBy) + case OpPointer: scope := vm.Scope() vm.push(scope.Array.Index(scope.Index).Interface()) @@ -481,6 +485,13 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { key := vm.pop() scope.GroupBy[key] = append(scope.GroupBy[key], it) + case OpCountBy: + scope := vm.Scope() + if scope.CountBy == nil { + scope.CountBy = make(map[any]int) + } + scope.CountBy[vm.pop()]++ + case OpBegin: a := vm.pop() array := reflect.ValueOf(a) From 323f23bcdea9efb9a1c3dd808149044a4b1fa6ff Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 12:11:57 +0200 Subject: [PATCH 136/506] Move tests to builtin_test.go --- builtin/builtin_test.go | 18 +++++++++++++----- expr_test.go | 27 --------------------------- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index e7782fa32..f34f40a7f 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -18,6 +18,13 @@ import ( ) func TestBuiltin(t *testing.T) { + env := map[string]any{ + "ArrayOfString": []string{"foo", "bar", "baz"}, + "ArrayOfInt": []int{1, 2, 3}, + "ArrayOfAny": []any{1, "2", true}, + "ArrayOfFoo": []mock.Foo{{Value: "a"}, {Value: "b"}, {Value: "c"}}, + } + var tests = []struct { input string want any @@ -87,13 +94,14 @@ func TestBuiltin(t *testing.T) { {`get({foo: 1, bar: 2}, "unknown")`, nil}, {`"foo" in keys({foo: 1, bar: 2})`, true}, {`1 in values({foo: 1, bar: 2})`, true}, + {`groupBy(1..9, # % 2)`, map[any][]any{0: {2, 4, 6, 8}, 1: {1, 3, 5, 7, 9}}}, + {`groupBy(1..9, # % 2)[0]`, []any{2, 4, 6, 8}}, + {`groupBy(1..3, # > 1)[true]`, []any{2, 3}}, + {`groupBy(1..3, # > 1 ? nil : "")[nil]`, []any{2, 3}}, + {`groupBy(ArrayOfFoo, .Value).a`, []any{mock.Foo{Value: "a"}}}, + {`countBy(1..9, # % 2)`, map[any]int{0: 4, 1: 5}}, } - env := map[string]any{ - "ArrayOfString": []string{"foo", "bar", "baz"}, - "ArrayOfInt": []int{1, 2, 3}, - "ArrayOfAny": []any{1, "2", true}, - } for _, test := range tests { t.Run(test.input, func(t *testing.T) { program, err := expr.Compile(test.input, expr.Env(env)) diff --git a/expr_test.go b/expr_test.go index fb20f395c..f24e56f5b 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1040,33 +1040,6 @@ func TestExpr(t *testing.T) { `4/2 == 2`, true, }, - { - `groupBy(1..9, # % 2)`, - map[any][]any{ - 0: {2, 4, 6, 8}, - 1: {1, 3, 5, 7, 9}, - }, - }, - { - `groupBy(1..9, # % 2)[0]`, - []any{2, 4, 6, 8}, - }, - { - `groupBy(1..3, # > 1)[true]`, - []any{2, 3}, - }, - { - `groupBy(1..3, # > 1 ? nil : "")[nil]`, - []any{2, 3}, - }, - { - `groupBy(ArrayOfFoo, .Value).foo`, - []any{env.ArrayOfFoo[0]}, - }, - { - `countBy(1..9, # % 2)`, - map[any]int{0: 4, 1: 5}, - }, } for _, tt := range tests { From 418fed5b7ef1458dd623b102d8318f97c631cfee Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 12:47:22 +0200 Subject: [PATCH 137/506] Add toPairs() and fromPairs() --- builtin/builtin.go | 64 +++++++++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 4 +++ builtin/utils.go | 2 +- 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/builtin/builtin.go b/builtin/builtin.go index 66031b2fd..d7bb39db3 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -584,6 +584,70 @@ var Builtins = []*ast.Function{ return anyType, fmt.Errorf("cannot get values from %s", args[0]) }, }, + { + Name: "toPairs", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Map { + return nil, fmt.Errorf("cannot transform %s to pairs", v.Kind()) + } + keys := v.MapKeys() + out := make([][2]any, len(keys)) + for i, key := range keys { + out[i] = [2]any{key.Interface(), v.MapIndex(key).Interface()} + } + return out, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Map: + return arrayType, nil + } + return anyType, fmt.Errorf("cannot transform %s to pairs", args[0]) + }, + }, + { + Name: "fromPairs", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot transform %s from pairs", v) + } + out := reflect.MakeMap(mapType) + for i := 0; i < v.Len(); i++ { + pair := deref(v.Index(i)) + if pair.Kind() != reflect.Array && pair.Kind() != reflect.Slice { + return nil, fmt.Errorf("invalid pair %v", pair) + } + if pair.Len() != 2 { + return nil, fmt.Errorf("invalid pair length %v", pair) + } + key := pair.Index(0) + value := pair.Index(1) + out.SetMapIndex(key, value) + } + return out.Interface(), nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + return mapType, nil + } + return anyType, fmt.Errorf("cannot transform %s from pairs", args[0]) + }, + }, { Name: "sort", Func: func(args ...any) (any, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index f34f40a7f..279ae9972 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -94,6 +94,10 @@ func TestBuiltin(t *testing.T) { {`get({foo: 1, bar: 2}, "unknown")`, nil}, {`"foo" in keys({foo: 1, bar: 2})`, true}, {`1 in values({foo: 1, bar: 2})`, true}, + {`len(toPairs({foo: 1, bar: 2}))`, 2}, + {`len(toPairs({}))`, 0}, + {`fromPairs([["foo", 1], ["bar", 2]])`, map[any]any{"foo": 1, "bar": 2}}, + {`fromPairs(toPairs({foo: 1, bar: 2}))`, map[any]any{"foo": 1, "bar": 2}}, {`groupBy(1..9, # % 2)`, map[any][]any{0: {2, 4, 6, 8}, 1: {1, 3, 5, 7, 9}}}, {`groupBy(1..9, # % 2)[0]`, []any{2, 4, 6, 8}}, {`groupBy(1..3, # > 1)[true]`, []any{2, 3}}, diff --git a/builtin/utils.go b/builtin/utils.go index 349663dd9..eff8fdcd1 100644 --- a/builtin/utils.go +++ b/builtin/utils.go @@ -9,8 +9,8 @@ var ( anyType = reflect.TypeOf(new(any)).Elem() integerType = reflect.TypeOf(0) floatType = reflect.TypeOf(float64(0)) - stringType = reflect.TypeOf("") arrayType = reflect.TypeOf([]any{}) + mapType = reflect.TypeOf(map[any]any{}) ) func kind(t reflect.Type) reflect.Kind { From 82bb7df9310b4e2e06972ac5f232c36f5b3b7ce0 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 12:54:13 +0200 Subject: [PATCH 138/506] Add take() --- builtin/builtin.go | 36 ++++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 3 +++ 2 files changed, 39 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index d7bb39db3..44be51cf0 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -524,6 +524,42 @@ var Builtins = []*ast.Function{ return runtime.Fetch(args[0], args[1]), nil }, }, + { + Name: "take", + Func: func(args ...any) (any, error) { + if len(args) != 2 { + return nil, fmt.Errorf("invalid number of arguments (expected 2, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot take from %s", v.Kind()) + } + n := reflect.ValueOf(args[1]) + if !n.CanInt() { + return nil, fmt.Errorf("cannot take %s elements", n.Kind()) + } + if n.Int() > int64(v.Len()) { + return args[0], nil + } + return v.Slice(0, int(n.Int())).Interface(), nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 2 { + return anyType, fmt.Errorf("invalid number of arguments (expected 2, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot take from %s", args[0]) + } + switch kind(args[1]) { + case reflect.Interface, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + default: + return anyType, fmt.Errorf("cannot take %s elements", args[1]) + } + return args[0], nil + }, + }, { Name: "keys", Func: func(args ...any) (any, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 279ae9972..8ac076c7c 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -92,6 +92,8 @@ func TestBuiltin(t *testing.T) { {`get(ArrayOfAny, 1)`, "2"}, {`get({foo: 1, bar: 2}, "foo")`, 1}, {`get({foo: 1, bar: 2}, "unknown")`, nil}, + {`take(ArrayOfString, 2)`, []string{"foo", "bar"}}, + {`take(ArrayOfString, 99)`, []string{"foo", "bar", "baz"}}, {`"foo" in keys({foo: 1, bar: 2})`, true}, {`1 in values({foo: 1, bar: 2})`, true}, {`len(toPairs({foo: 1, bar: 2}))`, 2}, @@ -123,6 +125,7 @@ func TestBuiltin_works_with_any(t *testing.T) { arity int }{ "get": {2}, + "take": {2}, "sortBy": {2}, } From ed3d1f381b0f158e6d8113dd7c6a02f925191c93 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 13:33:16 +0200 Subject: [PATCH 139/506] Add reduce() --- bench_test.go | 14 ++++++++++++++ builtin/builtin.go | 5 +++++ builtin/builtin_test.go | 4 ++++ checker/checker.go | 19 +++++++++++++++++++ compiler/compiler.go | 21 +++++++++++++++++++++ debug/debugger.go | 3 +++ parser/parser.go | 28 ++++++++++++++++++++++++++++ vm/opcodes.go | 2 ++ vm/program.go | 12 +++++++++--- vm/vm.go | 7 +++++++ 10 files changed, 112 insertions(+), 3 deletions(-) diff --git a/bench_test.go b/bench_test.go index 62b787da7..0aea490b3 100644 --- a/bench_test.go +++ b/bench_test.go @@ -526,3 +526,17 @@ func Benchmark_countBy(b *testing.B) { require.Equal(b, 14, out.(int)) } + +func Benchmark_reduce(b *testing.B) { + program, err := expr.Compile(`reduce(1..100, # + #acc)`) + require.NoError(b, err) + + var out any + b.ResetTimer() + for n := 0; n < b.N; n++ { + out, _ = vm.Run(program, nil) + } + b.StopTimer() + + require.Equal(b, 5050, out.(int)) +} diff --git a/builtin/builtin.go b/builtin/builtin.go index 44be51cf0..88d607ea0 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -800,4 +800,9 @@ var Builtins = []*ast.Function{ Predicate: true, Types: types(new(func([]any, func(any) any) map[any]int)), }, + { + Name: "reduce", + Predicate: true, + Types: types(new(func([]any, func(any, any) any, any) any)), + }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 8ac076c7c..afff89038 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -106,6 +106,10 @@ func TestBuiltin(t *testing.T) { {`groupBy(1..3, # > 1 ? nil : "")[nil]`, []any{2, 3}}, {`groupBy(ArrayOfFoo, .Value).a`, []any{mock.Foo{Value: "a"}}}, {`countBy(1..9, # % 2)`, map[any]int{0: 4, 1: 5}}, + {`reduce(1..9, # + #acc, 0)`, 45}, + {`reduce(1..9, # + #acc)`, 45}, + {`reduce([.5, 1.5, 2.5], # + #acc, 0)`, 4.5}, + {`reduce([], 5, 0)`, 0}, } for _, test := range tests { diff --git a/checker/checker.go b/checker/checker.go index a000c1114..5002b7ca2 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -755,6 +755,25 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { } return v.error(node.Arguments[1], "predicate should has one input and one output param") + case "reduce": + collection, _ := v.visit(node.Arguments[0]) + if !isArray(collection) && !isAny(collection) { + return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) + } + + v.begin(collection, scopeVar{"index", integerType}, scopeVar{"acc", anyType}) + closure, _ := v.visit(node.Arguments[1]) + v.end() + + if len(node.Arguments) == 3 { + _, _ = v.visit(node.Arguments[2]) + } + + if isFunc(closure) && closure.NumOut() == 1 { + return closure.Out(0), info{} + } + return v.error(node.Arguments[1], "predicate should has two input and one output param") + } if id, ok := builtin.Index[node.Name]; ok { diff --git a/compiler/compiler.go b/compiler/compiler.go index ed8a05ad3..deb38065b 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -836,6 +836,25 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpEnd) return + case "reduce": + c.compile(node.Arguments[0]) + c.emit(OpBegin) + if len(node.Arguments) == 3 { + c.compile(node.Arguments[2]) + c.emit(OpSetAcc) + } else { + c.emit(OpPointer) + c.emit(OpIncrementIndex) + c.emit(OpSetAcc) + } + c.emitLoop(func() { + c.compile(node.Arguments[1]) + c.emit(OpSetAcc) + }) + c.emit(OpGetAcc) + c.emit(OpEnd) + return + } if id, ok := builtin.Index[node.Name]; ok { @@ -903,6 +922,8 @@ func (c *compiler) PointerNode(node *ast.PointerNode) { switch node.Name { case "index": c.emit(OpGetIndex) + case "acc": + c.emit(OpGetAcc) case "": c.emit(OpPointer) default: diff --git a/debug/debugger.go b/debug/debugger.go index 6ee9788bf..1dfe4c162 100644 --- a/debug/debugger.go +++ b/debug/debugger.go @@ -133,6 +133,9 @@ func StartDebugger(program *Program, env any) { if s.GroupBy != nil { keys = append(keys, pair{"GroupBy", s.GroupBy}) } + if s.Acc != nil { + keys = append(keys, pair{"Acc", s.Acc}) + } row := 0 for _, pair := range keys { scope.SetCellSimple(row, 0, fmt.Sprintf("%v: ", pair.key)) diff --git a/parser/parser.go b/parser/parser.go index 71c4337a2..9f20a5678 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -30,6 +30,7 @@ var predicates = map[string]struct { "findLastIndex": {2}, "groupBy": {2}, "countBy": {2}, + "reduce": {3}, } type parser struct { @@ -357,6 +358,9 @@ func (p *parser) parseCall(token Token) Node { if b, ok := predicates[token.Value]; ok { p.expect(Bracket, "(") + + // TODO: Refactor parser to use builtin.Builtins instead of predicates map. + if b.arity == 1 { arguments = make([]Node, 1) arguments[0] = p.parseExpression(0) @@ -366,6 +370,18 @@ func (p *parser) parseCall(token Token) Node { p.expect(Operator, ",") arguments[1] = p.parseClosure() } + + if token.Value == "reduce" { + arguments = make([]Node, 2) + arguments[0] = p.parseExpression(0) + p.expect(Operator, ",") + arguments[1] = p.parseClosure() + if p.current.Is(Operator, ",") { + p.next() + arguments = append(arguments, p.parseExpression(0)) + } + } + p.expect(Bracket, ")") node = &BuiltinNode{ @@ -596,9 +612,21 @@ func (p *parser) parsePipe(node Node) Node { if b, ok := predicates[identifier.Value]; ok { p.expect(Bracket, "(") + + // TODO: Refactor parser to use builtin.Builtins instead of predicates map. + if b.arity == 2 { arguments = append(arguments, p.parseClosure()) } + + if identifier.Value == "reduce" { + arguments = append(arguments, p.parseClosure()) + if p.current.Is(Operator, ",") { + p.next() + arguments = append(arguments, p.parseExpression(0)) + } + } + p.expect(Bracket, ")") node = &BuiltinNode{ diff --git a/vm/opcodes.go b/vm/opcodes.go index 4f6258ac9..5f36fb1a3 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -74,10 +74,12 @@ const ( OpGetLen OpGetGroupBy OpGetCountBy + OpGetAcc OpPointer OpThrow OpGroupBy OpCountBy + OpSetAcc OpBegin OpEnd // This opcode must be at the end of this list. ) diff --git a/vm/program.go b/vm/program.go index 94b8b4ed3..a81eb3ae2 100644 --- a/vm/program.go +++ b/vm/program.go @@ -295,21 +295,27 @@ func (program *Program) Opcodes(w io.Writer) { case OpGetCountBy: code("OpGetCountBy") + case OpGetAcc: + code("OpGetAcc") + case OpPointer: code("OpPointer") case OpThrow: code("OpThrow") - case OpBegin: - code("OpBegin") - case OpGroupBy: code("OpGroupBy") case OpCountBy: code("OpCountBy") + case OpSetAcc: + code("OpSetAcc") + + case OpBegin: + code("OpBegin") + case OpEnd: code("OpEnd") diff --git a/vm/vm.go b/vm/vm.go index b0a04ce87..290206ae6 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -45,6 +45,7 @@ type Scope struct { Count int GroupBy map[any][]any CountBy map[any]int + Acc any } func Debug() *VM { @@ -469,6 +470,12 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpGetCountBy: vm.push(vm.Scope().CountBy) + case OpGetAcc: + vm.push(vm.Scope().Acc) + + case OpSetAcc: + vm.Scope().Acc = vm.pop() + case OpPointer: scope := vm.Scope() vm.push(scope.Array.Index(scope.Index).Interface()) From 3b2df5a1c5d6f5ab30fb031a910d03cd6e9bf94d Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 14:31:40 +0200 Subject: [PATCH 140/506] Add mean() and median() --- builtin/builtin.go | 130 ++++++++++++++++++++++++++++++++++++++++ builtin/builtin_test.go | 13 ++++ 2 files changed, 143 insertions(+) diff --git a/builtin/builtin.go b/builtin/builtin.go index 88d607ea0..f33c6059c 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -367,6 +367,136 @@ var Builtins = []*ast.Function{ return args[0], nil }, }, + { + Name: "sum", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot sum %s", v.Kind()) + } + sum := int64(0) + i := 0 + for ; i < v.Len(); i++ { + it := deref(v.Index(i)) + if it.CanInt() { + sum += it.Int() + } else if it.CanFloat() { + goto float + } else { + return nil, fmt.Errorf("cannot sum %s", it.Kind()) + } + } + return int(sum), nil + float: + fSum := float64(sum) + for ; i < v.Len(); i++ { + it := deref(v.Index(i)) + if it.CanInt() { + fSum += float64(it.Int()) + } else if it.CanFloat() { + fSum += it.Float() + } else { + return nil, fmt.Errorf("cannot sum %s", it.Kind()) + } + } + return fSum, nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot sum %s", args[0]) + } + return anyType, nil + }, + }, + { + Name: "mean", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot mean %s", v.Kind()) + } + if v.Len() == 0 { + return 0.0, nil + } + sum := float64(0) + i := 0 + for ; i < v.Len(); i++ { + it := deref(v.Index(i)) + if it.CanInt() { + sum += float64(it.Int()) + } else if it.CanFloat() { + sum += it.Float() + } else { + return nil, fmt.Errorf("cannot mean %s", it.Kind()) + } + } + return sum / float64(i), nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot avg %s", args[0]) + } + return floatType, nil + }, + }, + { + Name: "median", + Func: func(args ...any) (any, error) { + if len(args) != 1 { + return nil, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + v := reflect.ValueOf(args[0]) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return nil, fmt.Errorf("cannot median %s", v.Kind()) + } + if v.Len() == 0 { + return 0.0, nil + } + s := make([]float64, v.Len()) + for i := 0; i < v.Len(); i++ { + it := deref(v.Index(i)) + if it.CanInt() { + s[i] = float64(it.Int()) + } else if it.CanFloat() { + s[i] = it.Float() + } else { + return nil, fmt.Errorf("cannot median %s", it.Kind()) + } + } + sort.Float64s(s) + if len(s)%2 == 0 { + return (s[len(s)/2-1] + s[len(s)/2]) / 2, nil + } + return s[len(s)/2], nil + }, + Validate: func(args []reflect.Type) (reflect.Type, error) { + if len(args) != 1 { + return anyType, fmt.Errorf("invalid number of arguments (expected 1, got %d)", len(args)) + } + switch kind(args[0]) { + case reflect.Interface, reflect.Slice, reflect.Array: + default: + return anyType, fmt.Errorf("cannot median %s", args[0]) + } + return floatType, nil + }, + }, { Name: "toJSON", Func: func(args ...any) (any, error) { diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index afff89038..6b320e72c 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -69,6 +69,19 @@ func TestBuiltin(t *testing.T) { {`max(1.5, 2.5, 3.5)`, 3.5}, {`min(1, 2, 3)`, 1}, {`min(1.5, 2.5, 3.5)`, 1.5}, + {`sum(1..9)`, 45}, + {`sum([.5, 1.5, 2.5])`, 4.5}, + {`sum([])`, 0}, + {`sum([1, 2, 3.0, 4])`, 10.0}, + {`mean(1..9)`, 5.0}, + {`mean([.5, 1.5, 2.5])`, 1.5}, + {`mean([])`, 0.0}, + {`mean([1, 2, 3.0, 4])`, 2.5}, + {`median(1..9)`, 5.0}, + {`median([.5, 1.5, 2.5])`, 1.5}, + {`median([])`, 0.0}, + {`median([1, 2, 3])`, 2.0}, + {`median([1, 2, 3, 4])`, 2.5}, {`toJSON({foo: 1, bar: 2})`, "{\n \"bar\": 2,\n \"foo\": 1\n}"}, {`fromJSON("[1, 2, 3]")`, []any{1.0, 2.0, 3.0}}, {`toBase64("hello")`, "aGVsbG8="}, From e3bfec77efb0953146b53a335752c16825d6aac5 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 14:55:05 +0200 Subject: [PATCH 141/506] Remove countBy --- bench_test.go | 14 -------------- builtin/builtin.go | 35 +++++++++++++++-------------------- builtin/builtin_test.go | 1 - checker/checker.go | 18 ------------------ compiler/compiler.go | 11 ----------- parser/parser.go | 1 - vm/opcodes.go | 2 -- vm/program.go | 6 ------ vm/vm.go | 11 ----------- 9 files changed, 15 insertions(+), 84 deletions(-) diff --git a/bench_test.go b/bench_test.go index 0aea490b3..8d1a272c3 100644 --- a/bench_test.go +++ b/bench_test.go @@ -513,20 +513,6 @@ func Benchmark_groupBy(b *testing.B) { require.Equal(b, 6, out.([]any)[0]) } -func Benchmark_countBy(b *testing.B) { - program, err := expr.Compile(`countBy(1..100, # % 7)[6]`) - require.NoError(b, err) - - var out any - b.ResetTimer() - for n := 0; n < b.N; n++ { - out, _ = vm.Run(program, nil) - } - b.StopTimer() - - require.Equal(b, 14, out.(int)) -} - func Benchmark_reduce(b *testing.B) { program, err := expr.Compile(`reduce(1..100, # + #acc)`) require.NoError(b, err) diff --git a/builtin/builtin.go b/builtin/builtin.go index f33c6059c..d7248a867 100644 --- a/builtin/builtin.go +++ b/builtin/builtin.go @@ -58,11 +58,6 @@ var Builtins = []*ast.Function{ Predicate: true, Types: types(new(func([]any, func(any) any) []any)), }, - { - Name: "count", - Predicate: true, - Types: types(new(func([]any, func(any) bool) int)), - }, { Name: "find", Predicate: true, @@ -83,6 +78,21 @@ var Builtins = []*ast.Function{ Predicate: true, Types: types(new(func([]any, func(any) bool) int)), }, + { + Name: "count", + Predicate: true, + Types: types(new(func([]any, func(any) bool) int)), + }, + { + Name: "groupBy", + Predicate: true, + Types: types(new(func([]any, func(any) any) map[any][]any)), + }, + { + Name: "reduce", + Predicate: true, + Types: types(new(func([]any, func(any, any) any, any) any)), + }, { Name: "len", Fast: Len, @@ -920,19 +930,4 @@ var Builtins = []*ast.Function{ return arrayType, nil }, }, - { - Name: "groupBy", - Predicate: true, - Types: types(new(func([]any, func(any) any) map[any][]any)), - }, - { - Name: "countBy", - Predicate: true, - Types: types(new(func([]any, func(any) any) map[any]int)), - }, - { - Name: "reduce", - Predicate: true, - Types: types(new(func([]any, func(any, any) any, any) any)), - }, } diff --git a/builtin/builtin_test.go b/builtin/builtin_test.go index 6b320e72c..62bd12562 100644 --- a/builtin/builtin_test.go +++ b/builtin/builtin_test.go @@ -118,7 +118,6 @@ func TestBuiltin(t *testing.T) { {`groupBy(1..3, # > 1)[true]`, []any{2, 3}}, {`groupBy(1..3, # > 1 ? nil : "")[nil]`, []any{2, 3}}, {`groupBy(ArrayOfFoo, .Value).a`, []any{mock.Foo{Value: "a"}}}, - {`countBy(1..9, # % 2)`, map[any]int{0: 4, 1: 5}}, {`reduce(1..9, # + #acc, 0)`, 45}, {`reduce(1..9, # + #acc)`, 45}, {`reduce([.5, 1.5, 2.5], # + #acc, 0)`, 4.5}, diff --git a/checker/checker.go b/checker/checker.go index 5002b7ca2..287164b64 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -737,24 +737,6 @@ func (v *checker) BuiltinNode(node *ast.BuiltinNode) (reflect.Type, info) { } return v.error(node.Arguments[1], "predicate should has one input and one output param") - case "countBy": - collection, _ := v.visit(node.Arguments[0]) - if !isArray(collection) && !isAny(collection) { - return v.error(node.Arguments[0], "builtin %v takes only array (got %v)", node.Name, collection) - } - - v.begin(collection) - closure, _ := v.visit(node.Arguments[1]) - v.end() - - if isFunc(closure) && - closure.NumOut() == 1 && - closure.NumIn() == 1 && isAny(closure.In(0)) { - - return reflect.TypeOf(map[any]int{}), info{} - } - return v.error(node.Arguments[1], "predicate should has one input and one output param") - case "reduce": collection, _ := v.visit(node.Arguments[0]) if !isArray(collection) && !isAny(collection) { diff --git a/compiler/compiler.go b/compiler/compiler.go index deb38065b..66ad4f1f2 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -825,17 +825,6 @@ func (c *compiler) BuiltinNode(node *ast.BuiltinNode) { c.emit(OpEnd) return - case "countBy": - c.compile(node.Arguments[0]) - c.emit(OpBegin) - c.emitLoop(func() { - c.compile(node.Arguments[1]) - c.emit(OpCountBy) - }) - c.emit(OpGetCountBy) - c.emit(OpEnd) - return - case "reduce": c.compile(node.Arguments[0]) c.emit(OpBegin) diff --git a/parser/parser.go b/parser/parser.go index 9f20a5678..b7a8752d5 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -29,7 +29,6 @@ var predicates = map[string]struct { "findLast": {2}, "findLastIndex": {2}, "groupBy": {2}, - "countBy": {2}, "reduce": {3}, } diff --git a/vm/opcodes.go b/vm/opcodes.go index 5f36fb1a3..1106cd3f0 100644 --- a/vm/opcodes.go +++ b/vm/opcodes.go @@ -73,12 +73,10 @@ const ( OpGetCount OpGetLen OpGetGroupBy - OpGetCountBy OpGetAcc OpPointer OpThrow OpGroupBy - OpCountBy OpSetAcc OpBegin OpEnd // This opcode must be at the end of this list. diff --git a/vm/program.go b/vm/program.go index a81eb3ae2..c45a2bff2 100644 --- a/vm/program.go +++ b/vm/program.go @@ -292,9 +292,6 @@ func (program *Program) Opcodes(w io.Writer) { case OpGetGroupBy: code("OpGetGroupBy") - case OpGetCountBy: - code("OpGetCountBy") - case OpGetAcc: code("OpGetAcc") @@ -307,9 +304,6 @@ func (program *Program) Opcodes(w io.Writer) { case OpGroupBy: code("OpGroupBy") - case OpCountBy: - code("OpCountBy") - case OpSetAcc: code("OpSetAcc") diff --git a/vm/vm.go b/vm/vm.go index 290206ae6..1a62b587a 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -44,7 +44,6 @@ type Scope struct { Len int Count int GroupBy map[any][]any - CountBy map[any]int Acc any } @@ -467,9 +466,6 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpGetGroupBy: vm.push(vm.Scope().GroupBy) - case OpGetCountBy: - vm.push(vm.Scope().CountBy) - case OpGetAcc: vm.push(vm.Scope().Acc) @@ -492,13 +488,6 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { key := vm.pop() scope.GroupBy[key] = append(scope.GroupBy[key], it) - case OpCountBy: - scope := vm.Scope() - if scope.CountBy == nil { - scope.CountBy = make(map[any]int) - } - scope.CountBy[vm.pop()]++ - case OpBegin: a := vm.pop() array := reflect.ValueOf(a) From b427e166d6ecf2e44bafa5b46c08f5c5c5c0e202 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 14:57:12 +0200 Subject: [PATCH 142/506] Update Language-Definition.md --- docs/Language-Definition.md | 155 +++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 3 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index c08781a97..d5967e311 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -220,19 +220,85 @@ If the array is empty, returns **true**. Returns new array by applying the [predicate](#predicate) to each element of the array. +``` +map(Tweets, {.Size}) +``` + ### filter(array, predicate) Returns new array by filtering elements of the array by [predicate](#predicate). +``` +filter(users, .Name startsWith "J") +``` + +### find(array, predicate) + +Finds the first element in an array that satisfies the [predicate](#predicate). + +```expr +find([1, 2, 3, 4], # > 2) == 3 +``` + +### findIndex(array, predicate) + +Finds the index of the first element in an array that satisfies the [predicate](#predicate). + +```expr +findIndex([1, 2, 3, 4], # > 2) == 2 +``` + +### findLast(array, predicate) + +Finds the last element in an array that satisfies the [predicate](#predicate). + +```expr +findLast([1, 2, 3, 4], # > 2) == 4 +``` + +### findLastIndex(array, predicate) + +Finds the index of the last element in an array that satisfies the [predicate](#predicate). + +```expr +findLastIndex([1, 2, 3, 4], # > 2) == 3 +``` + +### groupBy(array, predicate) + +Groups the elements of an array by the result of the [predicate](#predicate). + +```expr +groupBy(users, .Age) +``` + ### count(array, predicate) Returns the number of elements what satisfies the [predicate](#predicate). + Equivalent to: ```expr len(filter(array, predicate)) ``` +### reduce(array, predicate[, initialValue]) + +Applies a predicate to each element in the array, reducing the array to a single value. +Optional `initialValue` argument can be used to specify the initial value of the accumulator. +If `initialValue` is not given, the first element of the array is used as the initial value. + +Following variables are available in the predicate: + +- `#` - the current element +- `#acc` - the accumulator +- `#index` - the index of the current element + +```expr +reduce(1..9, #acc + #) +reduce(1..9, #acc + #, 0) +``` + ### len(v) Returns the length of an array, a map or a string. @@ -243,7 +309,6 @@ Returns the type of the given value `v`. Returns on of the following types: `nil`, `bool`, `int`, `uint`, `float`, `string`, `array`, `map`. For named types and structs, the type name is returned. - ```expr type(42) == "int" type("hello") == "string" @@ -408,6 +473,30 @@ Returns the minimum of the two values `v1` and `v2`. min(5, 7) == 5 ``` +### sum(array) + +Returns the sum of all numbers in the array. + +```expr +sum([1, 2, 3]) == 6 +``` + +### mean(array) + +Returns the average of all numbers in the array. + +```expr +mean([1, 2, 3]) == 2.0 +``` + +### median(array) + +Returns the median of all numbers in the array. + +```expr +median([1, 2, 3]) == 2.0 +``` + ### toJSON(v) Converts the given value `v` to its JSON string representation. @@ -511,10 +600,70 @@ get([1, 2, 3], 1) == 2 get({"name": "John", "age": 30}, "name") == "John" ``` +### take(array, n) + +Returns the first `n` elements from an array. If the array has fewer than `n` elements, returns the whole array. + +```expr +take([1, 2, 3, 4], 2) == [1, 2] +``` + +### keys(map) + +Returns an array containing the keys of the map. + +```expr +keys({"name": "John", "age": 30}) == ["name", "age"] +``` + +### values(map) + +Returns an array containing the values of the map. + +```expr +values({"name": "John", "age": 30}) == ["John", 30] +``` + +### toPairs(map) + +Converts a map to an array of key-value pairs. + +```expr +toPairs({"name": "John", "age": 30}) == [["name", "John"], ["age", 30]] +``` + +### fromPairs(array) + +Converts an array of key-value pairs to a map. + +```expr +fromPairs([["name", "John"], ["age", 30]]) == {"name": "John", "age": 30} +``` + +### sort(array[, order]) + +Sorts an array in ascending order. Optional `order` argument can be used to specify the order of sorting: `asc` +or `desc`. + +```expr +sort([3, 1, 4]) == [1, 3, 4] +sort([3, 1, 4], "desc") == [4, 3, 1] +``` + +### sortBy(array, key[, order]) + +Sorts an array of maps by a specific key in ascending order. Optional `order` argument can be used to specify the order +of sorting: `asc` or `desc`. + +```expr +sortBy(users, "Age") +sortBy(users, "Age", "desc") +``` + ## Predicate -The predicate is an expression that accepts a single argument. To access -the argument use the `#` symbol. +The predicate is an expression. It takes one or more arguments and returns a boolean value. +To access the arguments, the `#` symbol is used. ```expr map(0..9, {# / 2}) From 999485d59a7751498b473244041a586592f22480 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 14:59:10 +0200 Subject: [PATCH 143/506] Update Language-Definition.md --- docs/Language-Definition.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index d5967e311..6b5343565 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -137,7 +137,7 @@ the last element. The `in` operator can be used to check if an item is in an array or a map. -```python +```expr user.Name in list["available-names"] ``` @@ -220,7 +220,7 @@ If the array is empty, returns **true**. Returns new array by applying the [predicate](#predicate) to each element of the array. -``` +```expr map(Tweets, {.Size}) ``` @@ -228,7 +228,7 @@ map(Tweets, {.Size}) Returns new array by filtering elements of the array by [predicate](#predicate). -``` +```expr filter(users, .Name startsWith "J") ``` From 92c90686ec937f285c39c060b895a11f259e2376 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 15:11:30 +0200 Subject: [PATCH 144/506] Update Language-Definition.md --- docs/Language-Definition.md | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/docs/Language-Definition.md b/docs/Language-Definition.md index 6b5343565..026d1fe26 100644 --- a/docs/Language-Definition.md +++ b/docs/Language-Definition.md @@ -128,6 +128,14 @@ user.Age in 18..45 and user.Name not in ["admin", "root"] foo matches "^[A-Z].*" ``` +```expr +tweets | filter(.Size < 280) | map(.Content) | join(" -- ") +``` + +```expr +filter(posts, {now() - .CreatedAt >= 7 * duration("24h")}) +``` + ### Membership Operator Fields of structs and items of maps can be accessed with `.` operator @@ -185,6 +193,16 @@ For example, expression `split(lower(user.Name), " ")` can be written as: user.Name | lower() | split(" ") ``` +### Date Manipulation + +The following operators can be used to manipulate dates: + +```expr +date("2023-08-14") + duration("1h") +date("2023-08-14") - duration("1h") +date("2023-08-14") - date("2023-08-13") == duration("24h") +``` + ## Built-in Functions ### all(array, predicate) @@ -193,7 +211,7 @@ Returns **true** if all elements satisfies the [predicate](#predicate). If the array is empty, returns **true**. ```expr -all(Tweets, {.Size < 280}) +all(tweets, {.Size < 280}) ``` ### any(array, predicate) @@ -207,7 +225,7 @@ Returns **true** if _exactly one_ element satisfies the [predicate](#predicate). If the array is empty, returns **false**. ```expr -one(Participants, {.Winner}) +one(participants, {.Winner}) ``` ### none(array, predicate) @@ -221,7 +239,7 @@ Returns new array by applying the [predicate](#predicate) to each element of the array. ```expr -map(Tweets, {.Size}) +map(tweets, {.Size}) ``` ### filter(array, predicate) @@ -673,13 +691,13 @@ If items of the array is a struct or a map, it is possible to access fields with omitted `#` symbol (`#.Value` becomes `.Value`). ```expr -filter(Tweets, {len(.Value) > 280}) +filter(tweets, {len(.Value) > 280}) ``` Braces `{` `}` can be omitted: ```expr -filter(Tweets, len(.Value) > 280) +filter(tweets, len(.Value) > 280) ``` ## `$env` variable @@ -687,5 +705,6 @@ filter(Tweets, len(.Value) > 280) The `$env` variable is a map of all variables passed to the expression. ```expr -Foo.Name == $env["Foo"].Name +foo.Name == $env["foo"].Name +$env["var with spaces"] ``` From f32da1ed24a28993721a72f8bd76b51e4fc583de Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 15:23:33 +0200 Subject: [PATCH 145/506] Fix date manipulation operations --- expr_test.go | 32 +++++++++++++++++++++++ vm/runtime/generated.go | 52 ++++++++++++++++++++++++++++++-------- vm/runtime/helpers/main.go | 34 +++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 10 deletions(-) diff --git a/expr_test.go b/expr_test.go index f24e56f5b..11f433c24 100644 --- a/expr_test.go +++ b/expr_test.go @@ -944,6 +944,38 @@ func TestExpr(t *testing.T) { `TimePlusDay - Duration`, date, }, + { + `duration("1h") == duration("1h")`, + true, + }, + { + `TimePlusDay - Time >= duration("24h")`, + true, + }, + { + `duration("1h") > duration("1m")`, + true, + }, + { + `duration("1h") < duration("1m")`, + false, + }, + { + `duration("1h") >= duration("1m")`, + true, + }, + { + `duration("1h") <= duration("1m")`, + false, + }, + { + `duration("1h") > duration("1m")`, + true, + }, + { + `duration("1h") + duration("1m")`, + time.Hour + time.Minute, + }, { `1 /* one */ + 2 // two`, 3, diff --git a/vm/runtime/generated.go b/vm/runtime/generated.go index 0832dc991..919899064 100644 --- a/vm/runtime/generated.go +++ b/vm/runtime/generated.go @@ -8,7 +8,7 @@ import ( "time" ) -func Equal(a, b any) bool { +func Equal(a, b interface{}) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -344,6 +344,11 @@ func Equal(a, b any) bool { case time.Time: return x.Equal(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x == y + } } if IsNil(a) && IsNil(b) { return true @@ -351,7 +356,7 @@ func Equal(a, b any) bool { return reflect.DeepEqual(a, b) } -func Less(a, b any) bool { +func Less(a, b interface{}) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -687,11 +692,16 @@ func Less(a, b any) bool { case time.Time: return x.Before(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x < y + } } panic(fmt.Sprintf("invalid operation: %T < %T", a, b)) } -func More(a, b any) bool { +func More(a, b interface{}) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -1027,11 +1037,16 @@ func More(a, b any) bool { case time.Time: return x.After(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x > y + } } panic(fmt.Sprintf("invalid operation: %T > %T", a, b)) } -func LessOrEqual(a, b any) bool { +func LessOrEqual(a, b interface{}) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -1367,11 +1382,16 @@ func LessOrEqual(a, b any) bool { case time.Time: return x.Before(y) || x.Equal(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x <= y + } } panic(fmt.Sprintf("invalid operation: %T <= %T", a, b)) } -func MoreOrEqual(a, b any) bool { +func MoreOrEqual(a, b interface{}) bool { switch x := a.(type) { case uint: switch y := b.(type) { @@ -1707,11 +1727,16 @@ func MoreOrEqual(a, b any) bool { case time.Time: return x.After(y) || x.Equal(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x >= y + } } panic(fmt.Sprintf("invalid operation: %T >= %T", a, b)) } -func Add(a, b any) any { +func Add(a, b interface{}) interface{} { switch x := a.(type) { case uint: switch y := b.(type) { @@ -2051,12 +2076,14 @@ func Add(a, b any) any { switch y := b.(type) { case time.Time: return y.Add(x) + case time.Duration: + return x + y } } panic(fmt.Sprintf("invalid operation: %T + %T", a, b)) } -func Subtract(a, b any) any { +func Subtract(a, b interface{}) interface{} { switch x := a.(type) { case uint: switch y := b.(type) { @@ -2389,11 +2416,16 @@ func Subtract(a, b any) any { case time.Duration: return x.Add(-y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x - y + } } panic(fmt.Sprintf("invalid operation: %T - %T", a, b)) } -func Multiply(a, b any) any { +func Multiply(a, b interface{}) interface{} { switch x := a.(type) { case uint: switch y := b.(type) { @@ -2723,7 +2755,7 @@ func Multiply(a, b any) any { panic(fmt.Sprintf("invalid operation: %T * %T", a, b)) } -func Divide(a, b any) float64 { +func Divide(a, b interface{}) float64 { switch x := a.(type) { case uint: switch y := b.(type) { @@ -3053,7 +3085,7 @@ func Divide(a, b any) float64 { panic(fmt.Sprintf("invalid operation: %T / %T", a, b)) } -func Modulo(a, b any) int { +func Modulo(a, b interface{}) int { switch x := a.(type) { case uint: switch y := b.(type) { diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index 21d53ea6f..ea049dd3b 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -100,6 +100,11 @@ func Equal(a, b interface{}) bool { case time.Time: return x.Equal(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x == y + } } if IsNil(a) && IsNil(b) { return true @@ -120,6 +125,11 @@ func Less(a, b interface{}) bool { case time.Time: return x.Before(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x < y + } } panic(fmt.Sprintf("invalid operation: %T < %T", a, b)) } @@ -137,6 +147,11 @@ func More(a, b interface{}) bool { case time.Time: return x.After(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x > y + } } panic(fmt.Sprintf("invalid operation: %T > %T", a, b)) } @@ -154,6 +169,11 @@ func LessOrEqual(a, b interface{}) bool { case time.Time: return x.Before(y) || x.Equal(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x <= y + } } panic(fmt.Sprintf("invalid operation: %T <= %T", a, b)) } @@ -171,6 +191,11 @@ func MoreOrEqual(a, b interface{}) bool { case time.Time: return x.After(y) || x.Equal(y) } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x >= y + } } panic(fmt.Sprintf("invalid operation: %T >= %T", a, b)) } @@ -192,6 +217,8 @@ func Add(a, b interface{}) interface{} { switch y := b.(type) { case time.Time: return y.Add(x) + case time.Duration: + return x + y } } panic(fmt.Sprintf("invalid operation: %T + %T", a, b)) @@ -204,6 +231,13 @@ func Subtract(a, b interface{}) interface{} { switch y := b.(type) { case time.Time: return x.Sub(y) + case time.Duration: + return x.Add(-y) + } + case time.Duration: + switch y := b.(type) { + case time.Duration: + return x - y } } panic(fmt.Sprintf("invalid operation: %T - %T", a, b)) From 5be37aa5430d5833f11a224ff7cdc843d6f3fcf0 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 30 Aug 2023 17:15:22 +0200 Subject: [PATCH 146/506] Fix duration multiplication by integer --- expr_test.go | 12 +++++++ vm/runtime/generated.go | 53 +++++++++++++++++++++++++++++++ vm/runtime/helpers/main.go | 64 ++++++++++++++++++++++++++------------ 3 files changed, 109 insertions(+), 20 deletions(-) diff --git a/expr_test.go b/expr_test.go index 11f433c24..84d31bf9e 100644 --- a/expr_test.go +++ b/expr_test.go @@ -976,6 +976,18 @@ func TestExpr(t *testing.T) { `duration("1h") + duration("1m")`, time.Hour + time.Minute, }, + { + `7 * duration("1h")`, + 7 * time.Hour, + }, + { + `duration("1h") * 7`, + 7 * time.Hour, + }, + { + `duration("1s") * .5`, + 5e8, + }, { `1 /* one */ + 2 // two`, 3, diff --git a/vm/runtime/generated.go b/vm/runtime/generated.go index 919899064..720feb455 100644 --- a/vm/runtime/generated.go +++ b/vm/runtime/generated.go @@ -2453,6 +2453,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case uint8: switch y := b.(type) { @@ -2480,6 +2482,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case uint16: switch y := b.(type) { @@ -2507,6 +2511,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case uint32: switch y := b.(type) { @@ -2534,6 +2540,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case uint64: switch y := b.(type) { @@ -2561,6 +2569,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case int: switch y := b.(type) { @@ -2588,6 +2598,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case int8: switch y := b.(type) { @@ -2615,6 +2627,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case int16: switch y := b.(type) { @@ -2642,6 +2656,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case int32: switch y := b.(type) { @@ -2669,6 +2685,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case int64: switch y := b.(type) { @@ -2696,6 +2714,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } case float32: switch y := b.(type) { @@ -2723,6 +2743,8 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return float64(x) * float64(y) } case float64: switch y := b.(type) { @@ -2750,6 +2772,37 @@ func Multiply(a, b interface{}) interface{} { return float64(x) * float64(y) case float64: return float64(x) * float64(y) + case time.Duration: + return float64(x) * float64(y) + } + case time.Duration: + switch y := b.(type) { + case uint: + return time.Duration(x) * time.Duration(y) + case uint8: + return time.Duration(x) * time.Duration(y) + case uint16: + return time.Duration(x) * time.Duration(y) + case uint32: + return time.Duration(x) * time.Duration(y) + case uint64: + return time.Duration(x) * time.Duration(y) + case int: + return time.Duration(x) * time.Duration(y) + case int8: + return time.Duration(x) * time.Duration(y) + case int16: + return time.Duration(x) * time.Duration(y) + case int32: + return time.Duration(x) * time.Duration(y) + case int64: + return time.Duration(x) * time.Duration(y) + case float32: + return float64(x) * float64(y) + case float64: + return float64(x) * float64(y) + case time.Duration: + return time.Duration(x) * time.Duration(y) } } panic(fmt.Sprintf("invalid operation: %T * %T", a, b)) diff --git a/vm/runtime/helpers/main.go b/vm/runtime/helpers/main.go index ea049dd3b..66eb68dba 100644 --- a/vm/runtime/helpers/main.go +++ b/vm/runtime/helpers/main.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "go/format" + "os" "strings" "text/template" ) @@ -13,11 +14,14 @@ func main() { err := template.Must( template.New("helpers"). Funcs(template.FuncMap{ - "cases": func(op string) string { return cases(op, false) }, - "cases_int_only": func(op string) string { return cases(op, true) }, + "cases": func(op string) string { return cases(op, uints, ints, floats) }, + "cases_int_only": func(op string) string { return cases(op, uints, ints) }, + "cases_with_duration": func(op string) string { + return cases(op, uints, ints, floats, []string{"time.Duration"}) + }, }). Parse(helpers), - ).Execute(&b, types) + ).Execute(&b, nil) if err != nil { panic(err) } @@ -29,40 +33,48 @@ func main() { fmt.Print(string(formatted)) } -var types = []string{ - "uint", - "uint8", - "uint16", - "uint32", - "uint64", +var ints = []string{ "int", "int8", "int16", "int32", "int64", +} + +var uints = []string{ + "uint", + "uint8", + "uint16", + "uint32", + "uint64", +} + +var floats = []string{ "float32", "float64", } -func cases(op string, noFloat bool) string { +func cases(op string, xs ...[]string) string { + var types []string + for _, x := range xs { + types = append(types, x...) + } + + _, _ = fmt.Fprintf(os.Stderr, "Generating %s cases for %v\n", op, types) + var out string echo := func(s string, xs ...any) { out += fmt.Sprintf(s, xs...) + "\n" } for _, a := range types { - aIsFloat := strings.HasPrefix(a, "float") - if noFloat && aIsFloat { - continue - } echo(`case %v:`, a) echo(`switch y := b.(type) {`) for _, b := range types { - bIsFloat := strings.HasPrefix(b, "float") - if noFloat && bIsFloat { - continue - } t := "int" - if aIsFloat || bIsFloat { + if isDuration(a) || isDuration(b) { + t = "time.Duration" + } + if isFloat(a) || isFloat(b) { t = "float64" } echo(`case %v:`, b) @@ -77,6 +89,18 @@ func cases(op string, noFloat bool) string { return strings.TrimRight(out, "\n") } +func isFloat(t string) bool { + return strings.HasPrefix(t, "float") +} + +func isInt(t string) bool { + return strings.HasPrefix(t, "int") +} + +func isDuration(t string) bool { + return t == "time.Duration" +} + const helpers = `// Code generated by vm/runtime/helpers/main.go. DO NOT EDIT. package runtime @@ -245,7 +269,7 @@ func Subtract(a, b interface{}) interface{} { func Multiply(a, b interface{}) interface{} { switch x := a.(type) { - {{ cases "*" }} + {{ cases_with_duration "*" }} } panic(fmt.Sprintf("invalid operation: %T * %T", a, b)) } From c9d4a55fa95e81408461c1893b7f4f9f5c69b400 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 1 Sep 2023 09:41:34 +0200 Subject: [PATCH 147/506] Add CIFuzz --- .github/workflows/fuzz.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/fuzz.yml diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml new file mode 100644 index 000000000..b03470d84 --- /dev/null +++ b/.github/workflows/fuzz.yml @@ -0,0 +1,34 @@ +name: fuzz +on: [pull_request] +permissions: {} +jobs: + fuzzing: + runs-on: ubuntu-latest + permissions: + security-events: write + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'expr' + language: 'go' + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'expr' + language: 'go' + fuzz-seconds: 600 + - name: Upload Crash + uses: actions/upload-artifact@v3 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts + - name: Upload Sarif + if: always() && steps.build.outcome == 'success' + uses: github/codeql-action/upload-sarif@v2 + with: + # Path to SARIF file relative to the root of the repository + sarif_file: cifuzz-sarif/results.sarif + checkout_path: cifuzz-sarif From d8f4c25757792df5d54ff2ea985ba6e60387a1c4 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 1 Sep 2023 10:00:05 +0200 Subject: [PATCH 148/506] Add fuzz_coverage_test.go --- test/fuzz/fuzz_coverage_test.go | 62 +++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 test/fuzz/fuzz_coverage_test.go diff --git a/test/fuzz/fuzz_coverage_test.go b/test/fuzz/fuzz_coverage_test.go new file mode 100644 index 000000000..0575d8355 --- /dev/null +++ b/test/fuzz/fuzz_coverage_test.go @@ -0,0 +1,62 @@ +package fuzz_test + +import ( + _ "embed" + "github.com/stretchr/testify/require" + "strings" + "testing" + + "github.com/antonmedv/expr" +) + +//go:embed fuzz_corpus.txt +var fuzzCorpus string + +func TestFuzzExpr_Coverage(t *testing.T) { + inputs := strings.Split(strings.TrimSpace(fuzzCorpus), "\n") + + var env = map[string]any{ + "ok": true, + "f64": .5, + "f32": float32(.5), + "i": 1, + "i64": int64(1), + "i32": int32(1), + "array": []int{1, 2, 3, 4, 5}, + "list": []Foo{{"bar"}, {"baz"}}, + "foo": Foo{"bar"}, + "add": func(a, b int) int { return a + b }, + "div": func(a, b int) int { return a / b }, + "half": func(a float64) float64 { return a / 2 }, + "score": func(a int, x ...int) int { + s := a + for _, n := range x { + s += n + } + return s + }, + "greet": func(name string) string { return "Hello, " + name }, + } + + for _, code := range inputs { + t.Run(code, func(t *testing.T) { + program, err := expr.Compile(code, expr.Env(env)) + require.NoError(t, err) + + _, err = expr.Run(program, env) + require.NoError(t, err) + }) + } +} + +type Foo struct { + Bar string +} + +func (f Foo) String() string { + return "foo" +} + +func (f Foo) Qux(s string) string { + return f.Bar + s +} From 85a39152d8d0559059527111df71113c0a86d704 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Sep 2023 11:10:34 +0200 Subject: [PATCH 149/506] Move fuzz env to fuzz_env.go --- test/fuzz/fuzz_coverage_test.go | 36 ++----------------------------- test/fuzz/fuzz_env.go | 38 +++++++++++++++++++++++++++++++++ test/fuzz/fuzz_test.go | 37 ++------------------------------ 3 files changed, 42 insertions(+), 69 deletions(-) create mode 100644 test/fuzz/fuzz_env.go diff --git a/test/fuzz/fuzz_coverage_test.go b/test/fuzz/fuzz_coverage_test.go index 0575d8355..0f858e5db 100644 --- a/test/fuzz/fuzz_coverage_test.go +++ b/test/fuzz/fuzz_coverage_test.go @@ -2,6 +2,7 @@ package fuzz_test import ( _ "embed" + "github.com/antonmedv/expr/test/fuzz" "github.com/stretchr/testify/require" "strings" "testing" @@ -15,28 +16,7 @@ var fuzzCorpus string func TestFuzzExpr_Coverage(t *testing.T) { inputs := strings.Split(strings.TrimSpace(fuzzCorpus), "\n") - var env = map[string]any{ - "ok": true, - "f64": .5, - "f32": float32(.5), - "i": 1, - "i64": int64(1), - "i32": int32(1), - "array": []int{1, 2, 3, 4, 5}, - "list": []Foo{{"bar"}, {"baz"}}, - "foo": Foo{"bar"}, - "add": func(a, b int) int { return a + b }, - "div": func(a, b int) int { return a / b }, - "half": func(a float64) float64 { return a / 2 }, - "score": func(a int, x ...int) int { - s := a - for _, n := range x { - s += n - } - return s - }, - "greet": func(name string) string { return "Hello, " + name }, - } + var env = fuzz.NewEnv() for _, code := range inputs { t.Run(code, func(t *testing.T) { @@ -48,15 +28,3 @@ func TestFuzzExpr_Coverage(t *testing.T) { }) } } - -type Foo struct { - Bar string -} - -func (f Foo) String() string { - return "foo" -} - -func (f Foo) Qux(s string) string { - return f.Bar + s -} diff --git a/test/fuzz/fuzz_env.go b/test/fuzz/fuzz_env.go new file mode 100644 index 000000000..f761148de --- /dev/null +++ b/test/fuzz/fuzz_env.go @@ -0,0 +1,38 @@ +package fuzz + +func NewEnv() map[string]any { + return map[string]any{ + "ok": true, + "f64": .5, + "f32": float32(.5), + "i": 1, + "i64": int64(1), + "i32": int32(1), + "array": []int{1, 2, 3, 4, 5}, + "list": []Foo{{"bar"}, {"baz"}}, + "foo": Foo{"bar"}, + "add": func(a, b int) int { return a + b }, + "div": func(a, b int) int { return a / b }, + "half": func(a float64) float64 { return a / 2 }, + "score": func(a int, x ...int) int { + s := a + for _, n := range x { + s += n + } + return s + }, + "greet": func(name string) string { return "Hello, " + name }, + } +} + +type Foo struct { + Bar string +} + +func (f Foo) String() string { + return "foo" +} + +func (f Foo) Qux(s string) string { + return f.Bar + s +} diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 2b559e255..0ff55b23e 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -18,29 +18,6 @@ func FuzzExpr(f *testing.F) { f.Add(s) } - var env = map[string]any{ - "ok": true, - "f64": .5, - "f32": float32(.5), - "i": 1, - "i64": int64(1), - "i32": int32(1), - "array": []int{1, 2, 3, 4, 5}, - "list": []Foo{{"bar"}, {"baz"}}, - "foo": Foo{"bar"}, - "add": func(a, b int) int { return a + b }, - "div": func(a, b int) int { return a / b }, - "half": func(a float64) float64 { return a / 2 }, - "score": func(a int, x ...int) int { - s := a - for _, n := range x { - s += n - } - return s - }, - "greet": func(name string) string { return "Hello, " + name }, - } - skip := []*regexp.Regexp{ regexp.MustCompile(`cannot fetch .* from .*`), regexp.MustCompile(`cannot get .* from .*`), @@ -71,6 +48,8 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`cannot parse .* as .*`), } + env := NewEnv() + f.Fuzz(func(t *testing.T, code string) { program, err := expr.Compile(code, expr.Env(env)) if err != nil { @@ -89,15 +68,3 @@ func FuzzExpr(f *testing.F) { } }) } - -type Foo struct { - Bar string -} - -func (f Foo) String() string { - return "foo" -} - -func (f Foo) Qux(s string) string { - return f.Bar + s -} From 369aaec0cf2456467507828c25f284fe0bcdfc1f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Sep 2023 11:10:47 +0200 Subject: [PATCH 150/506] Use fuzz env in repl --- repl/repl.go | 52 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/repl/repl.go b/repl/repl.go index 2508973d4..cd6201dc5 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -2,7 +2,9 @@ package main import ( "fmt" + "github.com/antonmedv/expr/test/fuzz" "os" + "runtime" "strings" "github.com/antonmedv/expr" @@ -14,7 +16,7 @@ import ( var keywords = []string{ // Commands: - "exit", "opcodes", "debug", + "exit", "opcodes", "debug", "mem", // Operators: "and", "or", "in", "not", "not in", @@ -36,9 +38,9 @@ func main() { } defer rl.Close() - env := map[string]any{ - "ENV": os.Environ(), - } + env := fuzz.NewEnv() + + var memUsage uint64 var program *vm.Program for { @@ -48,20 +50,26 @@ func main() { } line = strings.TrimSpace(line) - if line == "exit" { - break - } + switch line { + case "": + continue - if line == "opcodes" { + case "exit": + return + + case "mem": + fmt.Printf("memory usage: %s\n", humanizeBytes(memUsage)) + continue + + case "opcodes": if program == nil { fmt.Println("no program") continue } fmt.Println(program.Disassemble()) continue - } - if line == "debug" { + case "debug": if program == nil { fmt.Println("no program") continue @@ -75,11 +83,15 @@ func main() { fmt.Printf("compile error: %s\n", err) continue } + + start := memoryUsage() output, err := expr.Run(program, env) if err != nil { fmt.Printf("runtime error: %s\n", err) continue } + memUsage = memoryUsage() - start + fmt.Println(output) } } @@ -106,3 +118,23 @@ func (c completer) Do(line []rune, pos int) ([][]rune, int) { return words, len(lastWord) } + +func memoryUsage() uint64 { + var m runtime.MemStats + runtime.ReadMemStats(&m) + return m.Alloc +} + +func humanizeBytes(b uint64) string { + const unit = 1024 + if b < unit { + return fmt.Sprintf("%d B", b) + } + div, exp := uint64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + return fmt.Sprintf("%.2f %ciB", + float64(b)/float64(div), "KMGTPE"[exp]) +} From 4762edf594ef4e9bc71a55d96ab1c02fbe0665dd Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Sep 2023 11:13:50 +0200 Subject: [PATCH 151/506] Change memoryBudget type to uint Fixes #427 --- vm/vm.go | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/vm/vm.go b/vm/vm.go index 1a62b587a..0b285d277 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -13,7 +13,7 @@ import ( "github.com/antonmedv/expr/vm/runtime" ) -var MemoryBudget int = 1e6 +var MemoryBudget uint = 1e6 var errorType = reflect.TypeOf((*error)(nil)).Elem() type Function = func(params ...any) (any, error) @@ -34,8 +34,8 @@ type VM struct { debug bool step chan struct{} curr chan int - memory int - memoryBudget int + memory uint + memoryBudget uint } type Scope struct { @@ -269,11 +269,8 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { min := runtime.ToInt(a) max := runtime.ToInt(b) size := max - min + 1 - if vm.memory+size >= vm.memoryBudget { - panic("memory budget exceeded") - } + vm.memGrow(uint(size)) vm.push(runtime.MakeRange(min, max)) - vm.memory += size case OpMatches: b := vm.pop() @@ -395,18 +392,16 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { case OpArray: size := vm.pop().(int) + vm.memGrow(uint(size)) array := make([]any, size) for i := size - 1; i >= 0; i-- { array[i] = vm.pop() } vm.push(array) - vm.memory += size - if vm.memory >= vm.memoryBudget { - panic("memory budget exceeded") - } case OpMap: size := vm.pop().(int) + vm.memGrow(uint(size)) m := make(map[string]any) for i := size - 1; i >= 0; i-- { value := vm.pop() @@ -414,10 +409,6 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { m[key.(string)] = value } vm.push(m) - vm.memory += size - if vm.memory >= vm.memoryBudget { - panic("memory budget exceeded") - } case OpLen: vm.push(runtime.Len(vm.current())) @@ -534,6 +525,13 @@ func (vm *VM) pop() any { return value } +func (vm *VM) memGrow(size uint) { + vm.memory += size + if vm.memory >= vm.memoryBudget { + panic("memory budget exceeded") + } +} + func (vm *VM) Stack() []any { return vm.stack } From 274eec7a91293d0d0bd70d8c17e72ebea3e5b41f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Sep 2023 11:25:31 +0200 Subject: [PATCH 152/506] Fix negative ranges memory budget --- vm/vm.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vm/vm.go b/vm/vm.go index 0b285d277..ae56c91d4 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -269,6 +269,9 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { min := runtime.ToInt(a) max := runtime.ToInt(b) size := max - min + 1 + if size <= 0 { + size = 0 + } vm.memGrow(uint(size)) vm.push(runtime.MakeRange(min, max)) From e13bdd213e351143d97c5e02a95a705f16247d43 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sun, 3 Sep 2023 11:27:32 +0200 Subject: [PATCH 153/506] Add OSS Fuzz badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 054409df2..0e11943d3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![test](https://github.com/antonmedv/expr/actions/workflows/test.yml/badge.svg)](https://github.com/antonmedv/expr/actions/workflows/test.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/antonmedv/expr)](https://goreportcard.com/report/github.com/antonmedv/expr) [![GoDoc](https://godoc.org/github.com/antonmedv/expr?status.svg)](https://godoc.org/github.com/antonmedv/expr) +[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/expr.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:expr) **Expr** is a Go-centric expression language designed to deliver dynamic configurations with unparalleled accuracy, safety, and speed. From 4e9480440d7ce99274d8a3a3a9cd41a4b61a9921 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 5 Sep 2023 18:40:03 +0200 Subject: [PATCH 154/506] Exclude "operator "in" not defined on float64" --- test/fuzz/fuzz_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index 0ff55b23e..d3d092a50 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -46,6 +46,7 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`operator "in" not defined on int`), regexp.MustCompile(`invalid date .*`), regexp.MustCompile(`cannot parse .* as .*`), + regexp.MustCompile(`operator "in" not defined on .*`), } env := NewEnv() From 33e26c525f04c8e87cde35879cec2d203e1f5ef3 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 08:15:15 +0200 Subject: [PATCH 155/506] Update fuzz.yml --- .github/workflows/fuzz.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index b03470d84..b883b8393 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -19,6 +19,7 @@ jobs: oss-fuzz-project-name: 'expr' language: 'go' fuzz-seconds: 600 + output-sarif: true - name: Upload Crash uses: actions/upload-artifact@v3 if: failure() && steps.build.outcome == 'success' From 1894b2ae97b3b62f05b5b7b0b26e185c133f9e01 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 2 Sep 2023 23:19:57 +0200 Subject: [PATCH 156/506] Update vm.go --- vm/vm.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vm/vm.go b/vm/vm.go index ae56c91d4..d020a31a8 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -431,8 +431,7 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { vm.push(runtime.Deref(a)) case OpIncrementIndex: - scope := vm.Scope() - scope.Index++ + vm.Scope().Index++ case OpDecrementIndex: scope := vm.Scope() From 2683a944fb1b42033e31fc167e71a7b57834b368 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 09:31:11 +0200 Subject: [PATCH 157/506] Add check for int64->int conversion --- parser/parser.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/parser/parser.go b/parser/parser.go index b7a8752d5..d4a870f71 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -2,6 +2,7 @@ package parser import ( "fmt" + "math" "strconv" "strings" @@ -310,6 +311,10 @@ func (p *parser) parseSecondary() Node { if err != nil { p.error("invalid hex literal: %v", err) } + if number > math.MaxInt { + p.error("integer literal is too large") + return nil + } node := &IntegerNode{Value: int(number)} node.SetLocation(token.Location) return node @@ -326,6 +331,10 @@ func (p *parser) parseSecondary() Node { if err != nil { p.error("invalid integer literal: %v", err) } + if number > math.MaxInt { + p.error("integer literal is too large") + return nil + } node := &IntegerNode{Value: int(number)} node.SetLocation(token.Location) return node From 3f563fc798c668705749ea939019eb6b00cbcf7c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 09:35:42 +0200 Subject: [PATCH 158/506] Check for an overflow before allocating --- parser/lexer/utils.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/parser/lexer/utils.go b/parser/lexer/utils.go index 83d96f49c..8131d7163 100644 --- a/parser/lexer/utils.go +++ b/parser/lexer/utils.go @@ -2,6 +2,7 @@ package lexer import ( "fmt" + "math" "strings" "unicode/utf8" ) @@ -31,6 +32,9 @@ func unescape(value string) (string, error) { // The string contains escape characters. // The following logic is adapted from `strconv/quote.go` var runeTmp [utf8.UTFMax]byte + if n >= 2/3*math.MaxInt { + return "", fmt.Errorf("too large string") + } buf := make([]byte, 0, 3*n/2) for len(value) > 0 { c, multibyte, rest, err := unescapeChar(value) From bbbabde1484e857c100c75ef917c53f57423c800 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 09:38:31 +0200 Subject: [PATCH 159/506] Fix if --- parser/lexer/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser/lexer/utils.go b/parser/lexer/utils.go index 8131d7163..4e95a0093 100644 --- a/parser/lexer/utils.go +++ b/parser/lexer/utils.go @@ -32,7 +32,7 @@ func unescape(value string) (string, error) { // The string contains escape characters. // The following logic is adapted from `strconv/quote.go` var runeTmp [utf8.UTFMax]byte - if n >= 2/3*math.MaxInt { + if n >= 2*math.MaxInt/3 { return "", fmt.Errorf("too large string") } buf := make([]byte, 0, 3*n/2) From b05f8097d4ef5b3aa27e88679c2e9a4cb2c01e0c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 09:49:19 +0200 Subject: [PATCH 160/506] Add SECURITY.md --- SECURITY.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..6e343ee36 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policy + +## Supported Versions + +Expr is generally backwards compatible with very few exceptions, so we +recommend users to always use the latest version to experience stability, +performance and security. + +We generally backport security issues to a single previous minor version, +unless this is not possible or feasible with a reasonable effort. + +| Version | Supported | +|---------|--------------------| +| 1.15 | :white_check_mark: | +| 1.14 | :white_check_mark: | +| 1.13 | :white_check_mark: | +| 1.12 | :white_check_mark: | +| < 1.12 | :x: | + +## Reporting a Vulnerability + +If you believe you've discovered a serious vulnerability, please contact the +Expr core team at anton+security@medv.io. We will evaluate your report and if +necessary issue a fix and an advisory. If the issue was previously undisclosed, +we'll also mention your name in the credits. From 46309b39e9be7d49a6cdf416a427cc82e6ccab0f Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 09:51:46 +0200 Subject: [PATCH 161/506] Fix size check --- parser/lexer/utils.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/parser/lexer/utils.go b/parser/lexer/utils.go index 4e95a0093..5c9e6b59d 100644 --- a/parser/lexer/utils.go +++ b/parser/lexer/utils.go @@ -32,10 +32,11 @@ func unescape(value string) (string, error) { // The string contains escape characters. // The following logic is adapted from `strconv/quote.go` var runeTmp [utf8.UTFMax]byte - if n >= 2*math.MaxInt/3 { + size := 3 * uint64(n) / 2 + if size >= math.MaxInt { return "", fmt.Errorf("too large string") } - buf := make([]byte, 0, 3*n/2) + buf := make([]byte, 0, size) for len(value) > 0 { c, multibyte, rest, err := unescapeChar(value) if err != nil { From 6001a17641f45196bbc8f738906e84ab7fda975c Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 10:05:00 +0200 Subject: [PATCH 162/506] Add var names in repl --- repl/repl.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/repl/repl.go b/repl/repl.go index cd6201dc5..078aa4f10 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -24,6 +24,10 @@ var keywords = []string{ } func main() { + env := fuzz.NewEnv() + for name := range env { + keywords = append(keywords, name) + } home, err := os.UserHomeDir() if err != nil { panic(err) @@ -38,8 +42,6 @@ func main() { } defer rl.Close() - env := fuzz.NewEnv() - var memUsage uint64 var program *vm.Program From 01c358d5eb221201013d8b85f230960e2b5dd019 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 6 Sep 2023 10:36:40 +0200 Subject: [PATCH 163/506] Fix type checker for "in" operator Fixes #426 --- checker/checker.go | 13 ++----------- checker/checker_test.go | 5 +++++ checker/types.go | 15 +++++++++++++++ expr_test.go | 8 ++++++++ 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 287164b64..3e787fa4f 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -242,16 +242,7 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { switch node.Operator { case "==", "!=": - if isNumber(l) && isNumber(r) { - return boolType, info{} - } - if l == nil || r == nil { // It is possible to compare with nil. - return boolType, info{} - } - if l.Kind() == r.Kind() { - return boolType, info{} - } - if isAny(l) || isAny(r) { + if isComparable(l, r) { return boolType, info{} } @@ -357,7 +348,7 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { if l == nil { // It is possible to compare with nil. return boolType, info{} } - if !isAny(l) && !l.AssignableTo(r.Elem()) && !(isInteger(l) && isInteger(r.Elem())) { + if !isComparable(l, r.Elem()) { return v.error(node, "cannot use %v as type %v in array", l, r.Elem()) } return boolType, info{} diff --git a/checker/checker_test.go b/checker/checker_test.go index 69c0a8e76..7528f1da9 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -513,6 +513,11 @@ cannot use float64 as type int in map key (1:5) | 1/2 in MapIntAny | ....^ +0.5 in ArrayOfFoo +cannot use float64 as type *mock.Foo in array (1:5) + | 0.5 in ArrayOfFoo + | ....^ + repeat("0", 1/0) cannot use float64 as argument (type int) to call repeat (1:14) | repeat("0", 1/0) diff --git a/checker/types.go b/checker/types.go index 1665527f0..890d74a5f 100644 --- a/checker/types.go +++ b/checker/types.go @@ -227,3 +227,18 @@ func kind(t reflect.Type) reflect.Kind { } return t.Kind() } + +func isComparable(l, r reflect.Type) bool { + if l == nil || r == nil { + return true + } + switch { + case l.Kind() == r.Kind(): + return true + case isNumber(l) && isNumber(r): + return true + case isAny(l) || isAny(r): + return true + } + return false +} diff --git a/expr_test.go b/expr_test.go index 84d31bf9e..1857403ec 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1084,6 +1084,14 @@ func TestExpr(t *testing.T) { `4/2 == 2`, true, }, + { + `.5 in 0..1`, + false, + }, + { + `.5 in ArrayOfInt`, + false, + }, } for _, tt := range tests { From f527a33d5a040c9ccd3feb42e16a87de8e23fd37 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Fri, 8 Sep 2023 09:08:35 +0200 Subject: [PATCH 164/506] Add fuzz filter --- test/fuzz/fuzz_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzz/fuzz_test.go b/test/fuzz/fuzz_test.go index d3d092a50..e69aaec7b 100644 --- a/test/fuzz/fuzz_test.go +++ b/test/fuzz/fuzz_test.go @@ -38,6 +38,7 @@ func FuzzExpr(f *testing.F) { regexp.MustCompile(`using interface \{} as type .*`), regexp.MustCompile(`reflect.Value.MapIndex: value of type .* is not assignable to type .*`), regexp.MustCompile(`reflect: Call using .* as type .*`), + regexp.MustCompile(`reflect: Call with too few input arguments`), regexp.MustCompile(`reflect: call of reflect.Value.Call on .* Value`), regexp.MustCompile(`reflect: call of reflect.Value.Index on map Value`), regexp.MustCompile(`reflect: call of reflect.Value.Len on .* Value`), From 709c5dd55aa7cfc1b47fc67ee32ac15af6db967a Mon Sep 17 00:00:00 2001 From: hesining Date: Tue, 12 Sep 2023 22:10:41 +0800 Subject: [PATCH 165/506] Propagate uint32 arguments types in ast (#438) --- checker/checker.go | 35 +++++++++++++++++++++++++++++------ compiler/compiler.go | 12 +++++++++++- expr_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index 3e787fa4f..efa1b7eb9 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -924,8 +924,13 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu } if isFloat(in) { - t = floatType - traverseAndReplaceIntegerNodesWithFloatNodes(&arg) + traverseAndReplaceIntegerNodesWithFloatNodes(&arguments[i], in) + continue + } + + if isInteger(in) && isInteger(t) && kind(t) != kind(in) { + traverseAndReplaceIntegerNodesWithIntegerNodes(&arguments[i], in) + continue } if t == nil { @@ -943,19 +948,37 @@ func (v *checker) checkArguments(name string, fn reflect.Type, method bool, argu return fn.Out(0), nil } -func traverseAndReplaceIntegerNodesWithFloatNodes(node *ast.Node) { +func traverseAndReplaceIntegerNodesWithFloatNodes(node *ast.Node, newType reflect.Type) { switch (*node).(type) { case *ast.IntegerNode: *node = &ast.FloatNode{Value: float64((*node).(*ast.IntegerNode).Value)} + (*node).SetType(newType) + case *ast.UnaryNode: + unaryNode := (*node).(*ast.UnaryNode) + traverseAndReplaceIntegerNodesWithFloatNodes(&unaryNode.Node, newType) + case *ast.BinaryNode: + binaryNode := (*node).(*ast.BinaryNode) + switch binaryNode.Operator { + case "+", "-", "*": + traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Left, newType) + traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Right, newType) + } + } +} + +func traverseAndReplaceIntegerNodesWithIntegerNodes(node *ast.Node, newType reflect.Type) { + switch (*node).(type) { + case *ast.IntegerNode: + (*node).SetType(newType) case *ast.UnaryNode: unaryNode := (*node).(*ast.UnaryNode) - traverseAndReplaceIntegerNodesWithFloatNodes(&unaryNode.Node) + traverseAndReplaceIntegerNodesWithIntegerNodes(&unaryNode.Node, newType) case *ast.BinaryNode: binaryNode := (*node).(*ast.BinaryNode) switch binaryNode.Operator { case "+", "-", "*": - traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Left) - traverseAndReplaceIntegerNodesWithFloatNodes(&binaryNode.Right) + traverseAndReplaceIntegerNodesWithIntegerNodes(&binaryNode.Left, newType) + traverseAndReplaceIntegerNodesWithIntegerNodes(&binaryNode.Right, newType) } } } diff --git a/compiler/compiler.go b/compiler/compiler.go index 66ad4f1f2..8e26d8788 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -307,7 +307,17 @@ func (c *compiler) IntegerNode(node *ast.IntegerNode) { } func (c *compiler) FloatNode(node *ast.FloatNode) { - c.emitPush(node.Value) + t := node.Type() + if t == nil { + c.emitPush(node.Value) + return + } + switch t.Kind() { + case reflect.Float32: + c.emitPush(float32(node.Value)) + case reflect.Float64: + c.emitPush(node.Value) + } } func (c *compiler) BoolNode(node *ast.BoolNode) { diff --git a/expr_test.go b/expr_test.go index 1857403ec..86945867f 100644 --- a/expr_test.go +++ b/expr_test.go @@ -1969,3 +1969,32 @@ func TestMemoryBudget(t *testing.T) { }) } } + +func TestIssue432(t *testing.T) { + env := map[string]any{ + "func": func( + paramUint32 uint32, + paramUint16 uint16, + paramUint8 uint8, + paramUint uint, + paramInt32 int32, + paramInt16 int16, + paramInt8 int8, + paramInt int, + paramFloat64 float64, + paramFloat32 float32, + ) float64 { + return float64(paramUint32) + float64(paramUint16) + float64(paramUint8) + float64(paramUint) + + float64(paramInt32) + float64(paramInt16) + float64(paramInt8) + float64(paramInt) + + float64(paramFloat64) + float64(paramFloat32) + }, + } + code := `func(1,1,1,1,1,1,1,1,1,1)` + + program, err := expr.Compile(code, expr.Env(env)) + assert.NoError(t, err) + + out, err := expr.Run(program, env) + assert.NoError(t, err) + assert.Equal(t, float64(10), out) +} \ No newline at end of file From 89ddc1482d21d776baa2e9eebe2d3da84610c1d7 Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Sat, 16 Sep 2023 20:32:32 +0200 Subject: [PATCH 166/506] Delete fuzz_coverage_test.go --- test/fuzz/fuzz_coverage_test.go | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 test/fuzz/fuzz_coverage_test.go diff --git a/test/fuzz/fuzz_coverage_test.go b/test/fuzz/fuzz_coverage_test.go deleted file mode 100644 index 0f858e5db..000000000 --- a/test/fuzz/fuzz_coverage_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package fuzz_test - -import ( - _ "embed" - "github.com/antonmedv/expr/test/fuzz" - "github.com/stretchr/testify/require" - "strings" - "testing" - - "github.com/antonmedv/expr" -) - -//go:embed fuzz_corpus.txt -var fuzzCorpus string - -func TestFuzzExpr_Coverage(t *testing.T) { - inputs := strings.Split(strings.TrimSpace(fuzzCorpus), "\n") - - var env = fuzz.NewEnv() - - for _, code := range inputs { - t.Run(code, func(t *testing.T) { - program, err := expr.Compile(code, expr.Env(env)) - require.NoError(t, err) - - _, err = expr.Run(program, env) - require.NoError(t, err) - }) - } -} From 5916dc2b68d01606f6c23e1b54da5ee3cd3dc79a Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Wed, 20 Sep 2023 14:00:15 +0200 Subject: [PATCH 167/506] Add type checks for `42 in ["a"]` as invalid --- checker/checker.go | 28 +++++++++++++++++++++++++--- checker/checker_test.go | 10 ++++++++-- expr_test.go | 7 ++++--- test/fuzz/fuzz_corpus.txt | 3 --- test/fuzz/fuzz_expr_seed_corpus.zip | Bin 2827388 -> 2827401 bytes testdata/examples.txt | 3 --- vm/runtime/runtime.go | 6 +----- 7 files changed, 38 insertions(+), 19 deletions(-) diff --git a/checker/checker.go b/checker/checker.go index efa1b7eb9..da46b6f9f 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -73,6 +73,12 @@ type varScope struct { type info struct { method bool fn *ast.Function + + // elem is element type of array or map. + // Arrays created with type []any, but + // we would like to detect expressions + // like `42 in ["a"]` as invalid. + elem reflect.Type } func (v *checker) visit(node ast.Node) (reflect.Type, info) { @@ -227,7 +233,7 @@ func (v *checker) UnaryNode(node *ast.UnaryNode) (reflect.Type, info) { func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { l, _ := v.visit(node.Left) - r, _ := v.visit(node.Right) + r, ri := v.visit(node.Right) l = deref(l) r = deref(r) @@ -351,6 +357,9 @@ func (v *checker) BinaryNode(node *ast.BinaryNode) (reflect.Type, info) { if !isComparable(l, r.Elem()) { return v.error(node, "cannot use %v as type %v in array", l, r.Elem()) } + if !isComparable(l, ri.elem) { + return v.error(node, "cannot use %v as type %v in array", l, ri.elem) + } return boolType, info{} } if isAny(l) && anyOf(r, isString, isArray, isMap) { @@ -1067,8 +1076,21 @@ func (v *checker) ConditionalNode(node *ast.ConditionalNode) (reflect.Type, info } func (v *checker) ArrayNode(node *ast.ArrayNode) (reflect.Type, info) { - for _, node := range node.Nodes { - v.visit(node) + var prev reflect.Type + allElementsAreSameType := true + for i, node := range node.Nodes { + curr, _ := v.visit(node) + if i > 0 { + if curr == nil || prev == nil { + allElementsAreSameType = false + } else if curr.Kind() != prev.Kind() { + allElementsAreSameType = false + } + } + prev = curr + } + if allElementsAreSameType && prev != nil { + return arrayType, info{elem: prev} } return arrayType, info{} } diff --git a/checker/checker_test.go b/checker/checker_test.go index 7528f1da9..f6b109bc2 100644 --- a/checker/checker_test.go +++ b/checker/checker_test.go @@ -7,14 +7,15 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/antonmedv/expr" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/checker" "github.com/antonmedv/expr/conf" "github.com/antonmedv/expr/parser" "github.com/antonmedv/expr/test/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestCheck(t *testing.T) { @@ -547,6 +548,11 @@ map(1..9, #unknown) unknown pointer #unknown (1:11) | map(1..9, #unknown) | ..........^ + +42 in ["a", "b", "c"] +cannot use int as type string in array (1:4) + | 42 in ["a", "b", "c"] + | ...^ ` func TestCheck_error(t *testing.T) { diff --git a/expr_test.go b/expr_test.go index 86945867f..4cb1902a5 100644 --- a/expr_test.go +++ b/expr_test.go @@ -7,12 +7,13 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/antonmedv/expr" "github.com/antonmedv/expr/ast" "github.com/antonmedv/expr/file" "github.com/antonmedv/expr/test/mock" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func ExampleEval() { @@ -1997,4 +1998,4 @@ func TestIssue432(t *testing.T) { out, err := expr.Run(program, env) assert.NoError(t, err) assert.Equal(t, float64(10), out) -} \ No newline at end of file +} diff --git a/test/fuzz/fuzz_corpus.txt b/test/fuzz/fuzz_corpus.txt index f427f787d..3d3491ad4 100644 --- a/test/fuzz/fuzz_corpus.txt +++ b/test/fuzz/fuzz_corpus.txt @@ -2711,7 +2711,6 @@ add == score != true add == score and i32 >= 1 add == score or 0.5 < 1 add in [div] -add not in [f64] add not in sort(array) add(1, 1) ** i add(1, 1) ^ i @@ -3113,7 +3112,6 @@ array == map(array, add) array == nil != nil array == nil != true ? 0.5 : 0.5 array == nil && (false || ok) -array in [i] array[-1] array[-i32] array[-i64] @@ -6102,7 +6100,6 @@ foo == foo ? i : score foo == last(list) foo == nil == nil foo == nil || ok -foo in [half] foo in filter(list, false) foo in list foo in list ? nil : i32 diff --git a/test/fuzz/fuzz_expr_seed_corpus.zip b/test/fuzz/fuzz_expr_seed_corpus.zip index 6f529cbbb50f62c1bc6620238be31de49ee0a9c8..aef08934d397fd9ae4b11a9756151e45892a8366 100644 GIT binary patch literal 2827401 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 z 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≫@~;yXNMy0lk4H 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 z%0A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

    13GMs=2}2L$KX%h>MW$P}rWro{c{ww-z7 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
    aD?>s)ekh#luPjgIlN224 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

    =XshJ<_^IBw*1;E*CD(YJ2xdsA)pOrDaY;Uw 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%0AT@;cYNNq_qFF^Z7T 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

    MQ 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

    GIgZ^j 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