linked-list-iterator and context operator $$ enhancement

This commit is contained in:
2026-05-18 09:49:44 +02:00
parent 35a599b284
commit 081395be5f
7 changed files with 47 additions and 76 deletions
+19 -61
View File
@@ -13,59 +13,23 @@ import (
)
type LinkedListIterator struct {
a *kern.ListType
count int64
index int64
start int64
stop int64
step int64
a *kern.LinkedList
count int64
index int64
current *kern.ListNode
}
func NewLinkedListIterator(list *kern.ListType, args []any) (it *LinkedListIterator) {
var argc int = 0
listLen := int64(len(([]any)(*list)))
if args != nil {
argc = len(args)
}
it = &LinkedListIterator{a: list, count: 0, index: -1, start: 0, stop: listLen - 1, step: 1}
if argc >= 1 {
if i, err := kern.ToGoInt64(args[0], "start index"); err == nil {
if i < 0 {
i = listLen + i
}
it.start = i
}
if argc >= 2 {
if i, err := kern.ToGoInt64(args[1], "stop index"); err == nil {
if i < 0 {
i = listLen + i
}
it.stop = i
}
if argc >= 3 {
if i, err := kern.ToGoInt64(args[2], "step"); err == nil {
if i < 0 {
i = -i
}
if it.start > it.stop {
it.step = -i
} else {
it.step = i
}
}
}
}
}
it.index = it.start - it.step
func NewLinkedListIterator(list *kern.LinkedList, args []any) (it *LinkedListIterator) {
it = &LinkedListIterator{a: list, count: 0, index: -1, current: list.FirstNode()}
return
}
func (it *LinkedListIterator) String() string {
var l = int64(0)
if it.a != nil {
l = int64(len(*it.a))
l = int64(it.a.Len())
}
return fmt.Sprintf("$([#%d])", l)
return fmt.Sprintf("$([<#%d>])", l)
}
func (it *LinkedListIterator) TypeName() string {
@@ -73,7 +37,6 @@ func (it *LinkedListIterator) TypeName() string {
}
func (it *LinkedListIterator) HasOperation(name string) bool {
//yes := name == expr.NextName || name == expr.ResetName || name == expr.IndexName || name == expr.CountName || name == expr.CurrentName
yes := slices.Contains([]string{kern.NextName, kern.ResetName, kern.IndexName, kern.CountName, kern.CurrentName}, name)
return yes
}
@@ -99,28 +62,22 @@ func (it *LinkedListIterator) CallOperation(name string, args map[string]any) (v
}
func (it *LinkedListIterator) Current() (item any, err error) {
a := *(it.a)
if it.start <= it.stop {
if it.stop < int64(len(a)) && it.index >= it.start && it.index <= it.stop {
item = a[it.index]
} else {
err = io.EOF
}
if it.current != nil {
item = it.current.Data()
} else {
if it.start < int64(len(a)) && it.index >= it.stop && it.index <= it.start {
item = a[it.index]
} else {
err = io.EOF
}
err = io.EOF
}
return
}
func (it *LinkedListIterator) Next() (item any, err error) {
it.index += it.step
if item, err = it.Current(); err != io.EOF {
if it.current != nil {
item = it.current.Data()
it.current = it.current.Next()
it.index++
it.count++
} else {
err = io.EOF
}
return
}
@@ -134,7 +91,8 @@ func (it *LinkedListIterator) Count() int64 {
}
func (it *LinkedListIterator) Reset() error {
it.index = it.start - it.step
it.current = it.a.FirstNode()
it.index = -1
it.count = 0
return nil
}