temporary

This commit is contained in:
Celestino Amoroso 2024-04-26 21:03:22 +02:00
parent d2bab5fd9e
commit 894b1884eb
3 changed files with 34 additions and 11 deletions

View File

@ -23,24 +23,36 @@ type dataCursor struct {
currentFunc Functor
}
func newDataCursor(ctx ExprContext) (dc *dataCursor) {
dc = &dataCursor{
index: -1,
ctx: ctx.Clone(),
}
return
}
func (dc *dataCursor) String() string {
return "$(...)"
}
func (dc *dataCursor) Current() (item any, err error) { // must return io.EOF at the last item
if item, err = dc.currentFunc.Invoke(dc.ctx, currentName, []any{}); err == nil && item == nil {
ctx := cloneContext(dc.ctx)
if item, err = dc.currentFunc.Invoke(ctx, currentName, []any{}); err == nil && item == nil {
err = io.EOF
}
exportObjects(dc.ctx, ctx)
return
}
func (dc *dataCursor) Next() (item any, err error) { // must return io.EOF after the last item
if item, err = dc.nextFunc.Invoke(dc.ctx, nextName, []any{}); err == nil {
ctx := cloneContext(dc.ctx)
if item, err = dc.nextFunc.Invoke(ctx, nextName, []any{}); err == nil {
if item == nil {
err = io.EOF
} else {
dc.index++
}
exportObjects(dc.ctx, ctx)
}
return
}

View File

@ -27,11 +27,22 @@ func TestExpr(t *testing.T) {
succeeded := 0
failed := 0
// inputs1 := []inputType{
// /* 1 */ {`0?{}`, nil, nil},
// }
inputs1 := []inputType{
/* 1 */ {`
ds={
"init":func(end){@end=end; @current=0 but true},
"current":func(){current},
"next":func(){
((next=current+1) <= end) ? [true] {@current=next but current} :: {nil}
}
};
it=$(ds,3);
it++;
it++
`, int64(1), nil},
}
for i, input := range inputs {
for i, input := range inputs1 {
var expr Expr
var gotResult any
var gotErr error

View File

@ -77,10 +77,7 @@ func evalIterator(ctx ExprContext, self *term) (v any, err error) {
return
}
dc := &dataCursor{
index: -1,
ctx: ctx.Clone(),
}
dc := newDataCursor(ctx)
if initFunc, exists := ds[initName]; exists && initFunc != nil {
var args []any
@ -91,9 +88,12 @@ func evalIterator(ctx ExprContext, self *term) (v any, err error) {
} else {
args = []any{}
}
if dc.resource, err = initFunc.Invoke(dc.ctx, initName, args); err != nil {
initCtx := dc.ctx.Clone()
if dc.resource, err = initFunc.Invoke(initCtx, initName, args); err != nil {
return
}
exportObjects(dc.ctx, initCtx)
}
dc.nextFunc, _ = ds[nextName]