diff --git a/data-cursor.go b/data-cursor.go index 97cba92..ea8283a 100644 --- a/data-cursor.go +++ b/data-cursor.go @@ -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 } diff --git a/expr_test.go b/expr_test.go index ad2f5b6..e1d0885 100644 --- a/expr_test.go +++ b/expr_test.go @@ -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 diff --git a/operand-iterator.go b/operand-iterator.go index 0546a35..5f062f6 100644 --- a/operand-iterator.go +++ b/operand-iterator.go @@ -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]