deep list inclusion and item membership implemented

This commit is contained in:
2024-05-29 13:03:58 +02:00
parent 4b25a07699
commit d84e690ef3
4 changed files with 68 additions and 36 deletions
+8 -26
View File
@@ -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)
}
}
}