operand-iterator.go: accepts two new optional functions 'reset' and 'clean' from data-source

This commit is contained in:
Celestino Amoroso 2024-04-27 22:32:57 +02:00
parent 354cb79580
commit 81c85afbea

View File

@ -54,14 +54,23 @@ func getDataSourceDict(ctx ExprContext, self *term) (ds map[string]Functor, err
if dictAny, ok := value.(map[any]any); ok { if dictAny, ok := value.(map[any]any); ok {
ds = make(map[string]Functor) ds = make(map[string]Functor)
for _, k := range []string{initName, currentName, nextName} { // required functions
for _, k := range []string{currentName, nextName} {
if item, exists := dictAny[k]; exists && item != nil { if item, exists := dictAny[k]; exists && item != nil {
if functor, ok := item.(*funcDefFunctor); ok { if functor, ok := item.(*funcDefFunctor); ok {
ds[k] = functor ds[k] = functor
} }
} else if k != initName { } else {
err = fmt.Errorf("the data-source must provide a non-nil %q operator", k) err = fmt.Errorf("the data-source must provide a non-nil %q operator", k)
break return
}
}
// Optional functions
for _, k := range []string{initName, resetName, cleanName} {
if item, exists := dictAny[k]; exists && item != nil {
if functor, ok := item.(*funcDefFunctor); ok {
ds[k] = functor
}
} }
} }
} else { } else {
@ -98,6 +107,9 @@ func evalIterator(ctx ExprContext, self *term) (v any, err error) {
dc.nextFunc, _ = ds[nextName] dc.nextFunc, _ = ds[nextName]
dc.currentFunc, _ = ds[currentName] dc.currentFunc, _ = ds[currentName]
dc.cleanFunc, _ = ds[cleanName]
dc.resetFunc, _ = ds[resetName]
v = dc v = dc
return return