linked-list: sum and in operators
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
|||||||
"git.portale-stac.it/go-pkg/expr/scan"
|
"git.portale-stac.it/go-pkg/expr/scan"
|
||||||
"git.portale-stac.it/go-pkg/expr/types/array"
|
"git.portale-stac.it/go-pkg/expr/types/array"
|
||||||
"git.portale-stac.it/go-pkg/expr/types/dict"
|
"git.portale-stac.it/go-pkg/expr/types/dict"
|
||||||
|
"git.portale-stac.it/go-pkg/expr/types/list"
|
||||||
)
|
)
|
||||||
|
|
||||||
//-------- in term
|
//-------- in term
|
||||||
@@ -41,6 +42,9 @@ func evalIn(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
|
|||||||
} else if dict.IsDict(rightValue) {
|
} else if dict.IsDict(rightValue) {
|
||||||
dict, _ := rightValue.(*dict.DictType)
|
dict, _ := rightValue.(*dict.DictType)
|
||||||
v = dict.HasKey(leftValue)
|
v = dict.HasKey(leftValue)
|
||||||
|
} else if list.IsLinkedList(rightValue) {
|
||||||
|
ls, _ := rightValue.(*list.LinkedList)
|
||||||
|
v = ls.HasValue(leftValue)
|
||||||
} else {
|
} else {
|
||||||
err = opTerm.ErrIncompatibleTypes(leftValue, rightValue)
|
err = opTerm.ErrIncompatibleTypes(leftValue, rightValue)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -55,7 +55,7 @@ func sumValues(plusTerm *scan.Term, leftValue, rightValue any) (v any, err error
|
|||||||
lsLeft := leftValue.(*list.LinkedList)
|
lsLeft := leftValue.(*list.LinkedList)
|
||||||
lsRight := rightValue.(*list.LinkedList)
|
lsRight := rightValue.(*list.LinkedList)
|
||||||
ls := lsLeft.Clone()
|
ls := lsLeft.Clone()
|
||||||
ls.SeqPushBack(NewLinkedListIterator(lsRight, nil))
|
ls.SeqClonePushBack(NewLinkedListIterator(lsRight, nil))
|
||||||
v = ls
|
v = ls
|
||||||
} else if (fract.IsFraction(leftValue) && types.IsNumber(rightValue)) || (fract.IsFraction(rightValue) && types.IsNumber(leftValue)) {
|
} else if (fract.IsFraction(leftValue) && types.IsNumber(rightValue)) || (fract.IsFraction(rightValue) && types.IsNumber(leftValue)) {
|
||||||
if float.IsFloat(leftValue) || float.IsFloat(rightValue) {
|
if float.IsFloat(leftValue) || float.IsFloat(rightValue) {
|
||||||
|
|||||||
+6
-2
@@ -11,8 +11,8 @@ import (
|
|||||||
"git.portale-stac.it/go-pkg/expr/types/list"
|
"git.portale-stac.it/go-pkg/expr/types/list"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestListParser(t *testing.T) {
|
func TestArray(t *testing.T) {
|
||||||
section := "List"
|
section := "Array"
|
||||||
|
|
||||||
inputs := []inputType{
|
inputs := []inputType{
|
||||||
/* 1 */ {`[]`, array.NewArrayA(), nil},
|
/* 1 */ {`[]`, array.NewArrayA(), nil},
|
||||||
@@ -76,6 +76,10 @@ func TestLinkedListParser(t *testing.T) {
|
|||||||
/* 3 */ {`it=$([<1,2,3>]); #($$(it))`, int64(3), nil},
|
/* 3 */ {`it=$([<1,2,3>]); #($$(it))`, int64(3), nil},
|
||||||
/* 4 */ {`[<1,2,3>][0]`, int64(1), nil},
|
/* 4 */ {`[<1,2,3>][0]`, int64(1), nil},
|
||||||
/* 5 */ {`[<1,2,3>][0:2]`, list.NewLinkedListA(1, 2), nil},
|
/* 5 */ {`[<1,2,3>][0:2]`, list.NewLinkedListA(1, 2), nil},
|
||||||
|
/* 6 */ {`[<1>] + [<2,3>]`, list.NewLinkedListA(1, 2, 3), nil},
|
||||||
|
/* 7 */ {`L=[<1>] + [<2,3>]; L[0]=100; L`, list.NewLinkedListA(100, 2, 3), nil},
|
||||||
|
/* 8 */ {`builtin "base"; L=[<1>]; isList(L)`, true, nil},
|
||||||
|
/* 9 */ {`2 IN [<1,2,3>]`, true, nil},
|
||||||
}
|
}
|
||||||
|
|
||||||
// t.Setenv("EXPR_PATH", ".")
|
// t.Setenv("EXPR_PATH", ".")
|
||||||
|
|||||||
@@ -127,3 +127,13 @@ func (ls1 *LinkedList) Clone() (ls2 *LinkedList) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ls *LinkedList) HasValue(value any) (found bool) {
|
||||||
|
for node := ls.FirstNode(); node != nil; node = node.Next() {
|
||||||
|
if kern.Equal(node.Data(), value) {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ func (ls *LinkedList) PushBack(data any) (node *ListNode) {
|
|||||||
func (ls *LinkedList) SeqPushBack(data any) (result *LinkedList) {
|
func (ls *LinkedList) SeqPushBack(data any) (result *LinkedList) {
|
||||||
switch seq := data.(type) {
|
switch seq := data.(type) {
|
||||||
case kern.Iterator:
|
case kern.Iterator:
|
||||||
result = ls.IterPushBack(seq)
|
result = ls.IterPushBack(seq, false)
|
||||||
default:
|
default:
|
||||||
ls.PushBack(data)
|
ls.PushBack(data)
|
||||||
result = ls
|
result = ls
|
||||||
@@ -93,10 +93,25 @@ func (ls *LinkedList) SeqPushBack(data any) (result *LinkedList) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ls *LinkedList) IterPushBack(it kern.Iterator) *LinkedList {
|
func (ls *LinkedList) SeqClonePushBack(data any) (result *LinkedList) {
|
||||||
|
switch seq := data.(type) {
|
||||||
|
case kern.Iterator:
|
||||||
|
result = ls.IterPushBack(seq, true)
|
||||||
|
default:
|
||||||
|
ls.PushBack(data)
|
||||||
|
result = ls
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *LinkedList) IterPushBack(it kern.Iterator, clone bool) *LinkedList {
|
||||||
for item, err1 := it.Next(); err1 == nil; item, err1 = it.Next() {
|
for item, err1 := it.Next(); err1 == nil; item, err1 = it.Next() {
|
||||||
|
if clone && kern.IsCloner(item) {
|
||||||
|
item = item.(kern.Cloner).Clone()
|
||||||
|
} else {
|
||||||
ls.PushBack(item)
|
ls.PushBack(item)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return ls
|
return ls
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user