// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // data-cursors.go package expr import ( "io" ) const ( initName = "init" nextName = "next" currentName = "current" ) type dataCursor struct { ds map[any]*term ctx ExprContext index int resource any nextFunc Functor currentFunc Functor } 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 { err = io.EOF } 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 { if item == nil { err = io.EOF } else { dc.index++ } } return } func (dc *dataCursor) Index() int { return dc.index }