deep list inclusion and item membership implemented
This commit is contained in:
+8
-26
@@ -18,7 +18,9 @@ func newEqualTerm(tk *Token) (inst *term) {
|
||||
}
|
||||
}
|
||||
|
||||
func equals(a, b any) (eq bool, err error) {
|
||||
type deepFuncTemplate func(a, b any) (eq bool, err error)
|
||||
|
||||
func equals(a, b any, deepCmp deepFuncTemplate) (eq bool, err error) {
|
||||
if isNumOrFract(a) && isNumOrFract(b) {
|
||||
if IsNumber(a) && IsNumber(b) {
|
||||
if IsInteger(a) && IsInteger(b) {
|
||||
@@ -34,6 +36,8 @@ func equals(a, b any) (eq bool, err error) {
|
||||
eq = cmp == 0
|
||||
}
|
||||
}
|
||||
} else if deepCmp != nil && IsList(a) && IsList(b) {
|
||||
eq, err = deepCmp(a, b)
|
||||
} else {
|
||||
eq = reflect.DeepEqual(a, b)
|
||||
}
|
||||
@@ -48,7 +52,7 @@ func evalEqual(ctx ExprContext, self *term) (v any, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
v, err = equals(leftValue, rightValue)
|
||||
v, err = equals(leftValue, rightValue, nil)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -108,15 +112,7 @@ func lessThan(self *term, a, b any) (isLess bool, err error) {
|
||||
} else if IsList(a) && IsList(b) {
|
||||
aList, _ := a.(*ListType)
|
||||
bList, _ := b.(*ListType)
|
||||
isLess = len(*aList) < len(*bList)
|
||||
if isLess {
|
||||
for _, item := range *aList {
|
||||
if bList.indexDeepCmp(item) < 0 {
|
||||
isLess = false
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
isLess = len(*aList) < len(*bList) && bList.contains(aList)
|
||||
} else {
|
||||
err = self.errIncompatibleTypes(a, b)
|
||||
}
|
||||
@@ -145,27 +141,13 @@ func newLessEqualTerm(tk *Token) (inst *term) {
|
||||
}
|
||||
}
|
||||
|
||||
func sameContent(a, b any) (same bool, err error) {
|
||||
la, _ := a.(*ListType)
|
||||
lb, _ := b.(*ListType)
|
||||
if len(*la) == len(*lb) {
|
||||
same = true
|
||||
for i, item := range *la {
|
||||
if same, err = equals(item, (*lb)[i]); err != nil || !same {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func lessThanOrEqual(self *term, a, b any) (isLessEq bool, err error) {
|
||||
if isLessEq, err = lessThan(self, a, b); err == nil {
|
||||
if !isLessEq {
|
||||
if IsList(a) && IsList(b) {
|
||||
isLessEq, err = sameContent(a, b)
|
||||
} else {
|
||||
isLessEq, err = equals(a, b)
|
||||
isLessEq, err = equals(a, b, nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user