47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
// Copyright (c) 2024-2026 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// iter-factory.go
|
|
package expr
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"git.portale-stac.it/go-pkg/expr/kern"
|
|
"git.portale-stac.it/go-pkg/expr/scan"
|
|
)
|
|
|
|
func NewIterator(ctx kern.ExprContext, value any, ops []*scan.Term) (it kern.Iterator, err error) {
|
|
if value == nil {
|
|
return NewArrayIterator([]any{}), nil
|
|
}
|
|
|
|
switch v := value.(type) {
|
|
case *kern.ListType:
|
|
it = NewListIterator(v, nil)
|
|
case *kern.LinkedList:
|
|
it = NewLinkedListIterator(v, nil)
|
|
case *kern.DictType:
|
|
it, err = NewDictIterator(v, nil)
|
|
case []any:
|
|
it = NewArrayIterator(v)
|
|
case kern.Iterator:
|
|
// var exprs []*scan.Term
|
|
it, err = NewIterIter(v, ctx, ops)
|
|
default:
|
|
it = NewArrayIterator([]any{value})
|
|
}
|
|
return
|
|
}
|
|
|
|
func HasIterStandardOperations(name string) bool {
|
|
return slices.Contains([]string{kern.NextName, kern.ResetName, kern.IndexName, kern.CountName, kern.CurrentName, kern.CleanName}, name)
|
|
}
|
|
|
|
func HasIterOperations(name string, ops ...string) bool {
|
|
return slices.Contains([]string{
|
|
kern.NextName, kern.ResetName, kern.IndexName, kern.CountName, kern.CurrentName, kern.CleanName,
|
|
}, name) ||
|
|
slices.Contains(ops, name)
|
|
}
|