11package stdlib
22
33import (
4- "github.com/regeda/expr/assert"
4+ "errors"
5+
56 "github.com/regeda/expr/delegate"
67 "github.com/regeda/expr/memory"
78)
89
910var Compare = delegate.Module {
10- "equals" : delegate .DelegatorFunc (equals ).
11- Assert (assert .Every (
12- assert .Len (2 ),
13- assert .Any (
14- assert .TypeInt64 ,
15- assert .TypeBytes ,
16- assert .Every (
17- assert .TypeVector ,
18- assert .VectorAt (0 , assert .Any (
19- assert .TypeInt64 ,
20- assert .TypeBytes ,
21- )),
22- assert .VectorAt (1 , assert .Any (
23- assert .TypeInt64 ,
24- assert .TypeBytes ,
25- )),
26- ),
27- ),
28- )),
29- "contains" : delegate .DelegatorFunc (contains ).
30- Assert (assert .Every (
31- assert .Len (2 ),
32- assert .TypeAt (0 , memory .TypeVector ),
33- assert .Any (
34- assert .Every (
35- assert .VectorAt (0 , assert .TypeInt64 ),
36- assert .TypeAt (1 , memory .TypeInt64 ),
37- ),
38- assert .Every (
39- assert .VectorAt (0 , assert .TypeBytes ),
40- assert .TypeAt (1 , memory .TypeBytes ),
41- ),
42- ),
43- )),
44- "intersects" : delegate .DelegatorFunc (intersects ).
45- Assert (assert .Every (
46- assert .Len (2 ),
47- assert .TypeVector ,
48- assert .Any (
49- assert .Every (
50- assert .VectorAt (0 , assert .Type (memory .TypeInt64 )),
51- assert .VectorAt (1 , assert .Type (memory .TypeInt64 )),
52- ),
53- assert .Every (
54- assert .VectorAt (0 , assert .Type (memory .TypeBytes )),
55- assert .VectorAt (1 , assert .Type (memory .TypeBytes )),
56- ),
57- ),
58- )),
11+ "equals" : delegate .DelegatorFunc (equals ),
12+ "contains" : delegate .DelegatorFunc (contains ),
13+ "intersects" : delegate .DelegatorFunc (intersects ),
5914}
6015
16+ var (
17+ errEqualsExpectedTwoArgs = errors .New ("equals: expected 2 args" )
18+ )
19+
6120func equals (mem * memory.Memory , argv []memory.Addr ) (memory.Addr , error ) {
21+ if len (argv ) != 2 {
22+ return memory .Nil , errEqualsExpectedTwoArgs
23+ }
6224 if ! argv [0 ].EqualType (argv [1 ]) {
6325 return memory .False , nil
6426 }
@@ -79,7 +41,22 @@ func equals(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
7941 return memory .False , nil
8042}
8143
44+ var (
45+ errContainsExpectedTwoArgs = errors .New ("contains: expected 2 args" )
46+ errContainsExpectedArrayAt0 = errors .New ("contains: expected array at 0" )
47+ errContainsExpectedScalarAt1 = errors .New ("contains: expected scalar at 1" )
48+ )
49+
8250func contains (mem * memory.Memory , argv []memory.Addr ) (memory.Addr , error ) {
51+ if len (argv ) != 2 {
52+ return memory .Nil , errContainsExpectedTwoArgs
53+ }
54+ if ! argv [0 ].TypeOf (memory .TypeVector ) {
55+ return memory .Nil , errContainsExpectedArrayAt0
56+ }
57+ if argv [1 ].TypeOf (memory .TypeVector ) {
58+ return memory .Nil , errContainsExpectedScalarAt1
59+ }
8360 for _ , p := range argv [0 ].Vector () {
8461 if p .EqualBytes (argv [1 ]) {
8562 return memory .True , nil
@@ -88,7 +65,18 @@ func contains(mem *memory.Memory, argv []memory.Addr) (memory.Addr, error) {
8865 return memory .False , nil
8966}
9067
68+ var (
69+ errIntersectsExpectedTwoArgs = errors .New ("intersects: expected 2 args" )
70+ errIntersectsExpectedArrays = errors .New ("intersects: expected arrays" )
71+ )
72+
9173func intersects (mem * memory.Memory , argv []memory.Addr ) (memory.Addr , error ) {
74+ if len (argv ) != 2 {
75+ return memory .Nil , errIntersectsExpectedTwoArgs
76+ }
77+ if ! argv [0 ].EqualType (argv [1 ]) || ! argv [0 ].TypeOf (memory .TypeVector ) {
78+ return memory .Nil , errIntersectsExpectedArrays
79+ }
9280 for _ , a := range argv [0 ].Vector () {
9381 for _ , b := range argv [1 ].Vector () {
9482 if a .EqualBytes (b ) {
0 commit comments