refactored data-types to reduce plugin sizes
This commit is contained in:
+23
-18
@@ -9,6 +9,11 @@ import (
|
||||
|
||||
"git.portale-stac.it/go-pkg/expr/kern"
|
||||
"git.portale-stac.it/go-pkg/expr/scan"
|
||||
"git.portale-stac.it/go-pkg/expr/types"
|
||||
"git.portale-stac.it/go-pkg/expr/types/array"
|
||||
"git.portale-stac.it/go-pkg/expr/types/boolean"
|
||||
"git.portale-stac.it/go-pkg/expr/types/fract"
|
||||
"git.portale-stac.it/go-pkg/expr/types/str"
|
||||
)
|
||||
|
||||
//-------- equal term
|
||||
@@ -26,22 +31,22 @@ func newEqualTerm(tk *scan.Token) (inst *scan.Term) {
|
||||
// type deepFuncTemplate func(a, b any) (eq bool, err error)
|
||||
|
||||
func equals(a, b any, deepCmp kern.DeepFuncTemplate) (eq bool, err error) {
|
||||
if kern.IsNumOrFract(a) && kern.IsNumOrFract(b) {
|
||||
if kern.IsNumber(a) && kern.IsNumber(b) {
|
||||
if kern.IsInteger(a) && kern.IsInteger(b) {
|
||||
if types.IsNumOrFract(a) && types.IsNumOrFract(b) {
|
||||
if types.IsNumber(a) && types.IsNumber(b) {
|
||||
if types.IsInteger(a) && types.IsInteger(b) {
|
||||
li, _ := a.(int64)
|
||||
ri, _ := b.(int64)
|
||||
eq = li == ri
|
||||
} else {
|
||||
eq = kern.NumAsFloat(a) == kern.NumAsFloat(b)
|
||||
eq = types.NumAsFloat(a) == types.NumAsFloat(b)
|
||||
}
|
||||
} else {
|
||||
var cmp int
|
||||
if cmp, err = kern.CmpAnyFract(a, b); err == nil {
|
||||
if cmp, err = fract.CmpAnyFract(a, b); err == nil {
|
||||
eq = cmp == 0
|
||||
}
|
||||
}
|
||||
} else if deepCmp != nil && kern.IsList(a) && kern.IsList(b) {
|
||||
} else if deepCmp != nil && array.IsList(a) && array.IsList(b) {
|
||||
eq, err = deepCmp(a, b)
|
||||
} else {
|
||||
eq = reflect.DeepEqual(a, b)
|
||||
@@ -75,7 +80,7 @@ func newNotEqualTerm(tk *scan.Token) (inst *scan.Term) {
|
||||
|
||||
func evalNotEqual(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
|
||||
if v, err = evalEqual(ctx, opTerm); err == nil {
|
||||
b, _ := kern.ToBool(v)
|
||||
b, _ := boolean.ToBool(v)
|
||||
v = !b
|
||||
}
|
||||
return
|
||||
@@ -94,29 +99,29 @@ func newLessTerm(tk *scan.Token) (inst *scan.Term) {
|
||||
}
|
||||
|
||||
func lessThan(self *scan.Term, a, b any) (isLess bool, err error) {
|
||||
if kern.IsNumOrFract(a) && kern.IsNumOrFract(b) {
|
||||
if kern.IsNumber(a) && kern.IsNumber(b) {
|
||||
if kern.IsInteger(a) && kern.IsInteger(b) {
|
||||
if types.IsNumOrFract(a) && types.IsNumOrFract(b) {
|
||||
if types.IsNumber(a) && types.IsNumber(b) {
|
||||
if types.IsInteger(a) && types.IsInteger(b) {
|
||||
li, _ := a.(int64)
|
||||
ri, _ := b.(int64)
|
||||
isLess = li < ri
|
||||
} else {
|
||||
isLess = kern.NumAsFloat(a) < kern.NumAsFloat(b)
|
||||
isLess = types.NumAsFloat(a) < types.NumAsFloat(b)
|
||||
}
|
||||
} else {
|
||||
var cmp int
|
||||
if cmp, err = kern.CmpAnyFract(a, b); err == nil {
|
||||
if cmp, err = fract.CmpAnyFract(a, b); err == nil {
|
||||
isLess = cmp < 0
|
||||
}
|
||||
}
|
||||
} else if kern.IsString(a) && kern.IsString(b) {
|
||||
} else if str.IsString(a) && str.IsString(b) {
|
||||
ls, _ := a.(string)
|
||||
rs, _ := b.(string)
|
||||
isLess = ls < rs
|
||||
// Inclusion test
|
||||
} else if kern.IsList(a) && kern.IsList(b) {
|
||||
aList, _ := a.(*kern.ListType)
|
||||
bList, _ := b.(*kern.ListType)
|
||||
} else if array.IsList(a) && array.IsList(b) {
|
||||
aList, _ := a.(*array.ListType)
|
||||
bList, _ := b.(*array.ListType)
|
||||
isLess = len(*aList) < len(*bList) && bList.Contains(aList)
|
||||
} else {
|
||||
err = self.ErrIncompatibleTypes(a, b)
|
||||
@@ -149,8 +154,8 @@ func newLessEqualTerm(tk *scan.Token) (inst *scan.Term) {
|
||||
func lessThanOrEqual(self *scan.Term, a, b any) (isLessEq bool, err error) {
|
||||
if isLessEq, err = lessThan(self, a, b); err == nil {
|
||||
if !isLessEq {
|
||||
if kern.IsList(a) && kern.IsList(b) {
|
||||
isLessEq, err = kern.SameContent(a, b)
|
||||
if array.IsList(a) && array.IsList(b) {
|
||||
isLessEq, err = array.SameContent(a, b)
|
||||
} else {
|
||||
isLessEq, err = equals(a, b, nil)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user