Iterators: Removed NewAnyIterator(), added NewIterator()

This commit is contained in:
Celestino Amoroso 2026-04-24 06:26:00 +02:00
parent c39ee7cec0
commit 20d8236325
6 changed files with 52 additions and 35 deletions

View File

@ -70,7 +70,7 @@ func NewDictIterator(dict *DictType, args []any) (it *DictIterator, err error) {
var s string var s string
var argAny any var argAny any
it = &DictIterator{a: dict, count: 0, index: -1, keys: nil, iterMode: dictIterModeKeys} dictIt := &DictIterator{a: dict, count: 0, index: -1, keys: nil, iterMode: dictIterModeKeys}
if len(args) > 0 { if len(args) > 0 {
argAny = args[0] argAny = args[0]
} else { } else {
@ -100,13 +100,13 @@ func NewDictIterator(dict *DictType, args []any) (it *DictIterator, err error) {
if s, err = ToGoString(argAny, "iteration mode"); err == nil { if s, err = ToGoString(argAny, "iteration mode"); err == nil {
switch strings.ToLower(s) { switch strings.ToLower(s) {
case "k", "key", "keys": case "k", "key", "keys":
it.iterMode = dictIterModeKeys dictIt.iterMode = dictIterModeKeys
case "v", "value", "values": case "v", "value", "values":
it.iterMode = dictIterModeValues dictIt.iterMode = dictIterModeValues
case "i", "item", "items": case "i", "item", "items":
it.iterMode = dictIterModeItems dictIt.iterMode = dictIterModeItems
case "", "default": case "", "default":
it.iterMode = dictIterModeKeys dictIt.iterMode = dictIterModeKeys
default: default:
err = fmt.Errorf("invalid iteration mode %q", s) err = fmt.Errorf("invalid iteration mode %q", s)
} }
@ -114,8 +114,8 @@ func NewDictIterator(dict *DictType, args []any) (it *DictIterator, err error) {
} }
} }
it.makeKeys(*dict, sortType) dictIt.makeKeys(*dict, sortType)
return return dictIt, err
} }
func NewMapIterator(m map[any]any) (it *DictIterator) { func NewMapIterator(m map[any]any) (it *DictIterator) {
@ -129,7 +129,7 @@ func (it *DictIterator) String() string {
if it.a != nil { if it.a != nil {
l = len(*it.a) l = len(*it.a)
} }
return fmt.Sprintf("$(#%d)", l) return fmt.Sprintf("$({#%d})", l)
} }
func (it *DictIterator) TypeName() string { func (it *DictIterator) TypeName() string {

27
iter-factory.go Normal file
View File

@ -0,0 +1,27 @@
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
// iter-factory.go
package expr
func NewIterator(value any) (it Iterator, err error) {
if value == nil {
return NewArrayIterator([]any{}), nil
}
switch v := value.(type) {
case *ListType:
it = NewListIterator(v, nil)
case *DictType:
it, err = NewDictIterator(v, nil)
case []any:
it = NewArrayIterator(v)
case *ListIterator:
it = v
case *DictIterator:
it = v
default:
it = NewArrayIterator([]any{value})
}
return
}

View File

@ -62,27 +62,12 @@ func NewArrayIterator(array []any) (it *ListIterator) {
return return
} }
func NewAnyIterator(value any) (it *ListIterator) {
if value == nil {
it = NewArrayIterator([]any{})
} else if list, ok := value.(*ListType); ok {
it = NewListIterator(list, nil)
} else if array, ok := value.([]any); ok {
it = NewArrayIterator(array)
} else if it1, ok := value.(*ListIterator); ok {
it = it1
} else {
it = NewArrayIterator([]any{value})
}
return
}
func (it *ListIterator) String() string { func (it *ListIterator) String() string {
var l = 0 var l = 0
if it.a != nil { if it.a != nil {
l = len(*it.a) l = len(*it.a)
} }
return fmt.Sprintf("$(#%d)", l) return fmt.Sprintf("$([#%d])", l)
} }
func (it *ListIterator) TypeName() string { func (it *ListIterator) TypeName() string {

View File

@ -31,7 +31,10 @@ func evalBuiltin(ctx ExprContext, opTerm *term) (v any, err error) {
count, err = ImportInContextByGlobPattern(module) count, err = ImportInContextByGlobPattern(module)
} else { } else {
var moduleSpec any var moduleSpec any
it := NewAnyIterator(childValue) var it Iterator
if it, err = NewIterator(childValue); err != nil {
return
}
for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() { for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() {
if module, ok := moduleSpec.(string); ok { if module, ok := moduleSpec.(string); ok {
if ImportInContext(module) { if ImportInContext(module) {

View File

@ -93,10 +93,12 @@ func importPlugin( /*ctx ExprContext,*/ dirList []string, name string) (err erro
func importPluginFromSearchPath(name any) (count int, err error) { func importPluginFromSearchPath(name any) (count int, err error) {
var moduleSpec any var moduleSpec any
var it Iterator
dirList := buildSearchDirList("plugin", ENV_EXPR_PLUGIN_PATH) dirList := buildSearchDirList("plugin", ENV_EXPR_PLUGIN_PATH)
count = 0 count = 0
it := NewAnyIterator(name) if it, err = NewIterator(name); err != nil {
return
}
for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() { for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() {
if module, ok := moduleSpec.(string); ok { if module, ok := moduleSpec.(string); ok {
if err = importPlugin(dirList, module); err != nil { if err = importPlugin(dirList, module); err != nil {

View File

@ -59,7 +59,7 @@ func TestNewIterList2(t *testing.T) {
func TestNewIterList3(t *testing.T) { func TestNewIterList3(t *testing.T) {
list := []any{"a", "b", "c", "d"} list := []any{"a", "b", "c", "d"}
it := NewAnyIterator(list) it, _ := NewIterator(list)
if item, err := it.Next(); err != nil { if item, err := it.Next(); err != nil {
t.Errorf("error: %v", err) t.Errorf("error: %v", err)
} else if item != "a" { } else if item != "a" {
@ -71,7 +71,7 @@ func TestNewIterList3(t *testing.T) {
func TestNewIterList4(t *testing.T) { func TestNewIterList4(t *testing.T) {
list := any(nil) list := any(nil)
it := NewAnyIterator(list) it, _ := NewIterator(list)
if _, err := it.Next(); err != io.EOF { if _, err := it.Next(); err != io.EOF {
t.Errorf("error: %v", err) t.Errorf("error: %v", err)
} }
@ -79,7 +79,7 @@ func TestNewIterList4(t *testing.T) {
func TestNewIterList5(t *testing.T) { func TestNewIterList5(t *testing.T) {
list := "123" list := "123"
it := NewAnyIterator(list) it, _ := NewIterator(list)
if item, err := it.Next(); err != nil { if item, err := it.Next(); err != nil {
t.Errorf("error: %v", err) t.Errorf("error: %v", err)
} else if item != "123" { } else if item != "123" {
@ -91,8 +91,8 @@ func TestNewIterList5(t *testing.T) {
func TestNewIterList6(t *testing.T) { func TestNewIterList6(t *testing.T) {
list := newListA("a", "b", "c", "d") list := newListA("a", "b", "c", "d")
it1 := NewAnyIterator(list) it1, _ := NewIterator(list)
it := NewAnyIterator(it1) it, _ := NewIterator(it1)
if item, err := it.Next(); err != nil { if item, err := it.Next(); err != nil {
t.Errorf("error: %v", err) t.Errorf("error: %v", err)
} else if item != "a" { } else if item != "a" {
@ -103,9 +103,9 @@ func TestNewIterList6(t *testing.T) {
} }
func TestNewString(t *testing.T) { func TestNewString(t *testing.T) {
list := "123" list := "123"
it := NewAnyIterator(list) it, _ := NewIterator(list)
if s := it.String(); s != "$(#1)" { if s := it.String(); s != "$([#1])" {
t.Errorf("expected $(#1), got %s", s) t.Errorf("expected $([#1]), got %s", s)
} }
} }