51 lines
968 B
Go
51 lines
968 B
Go
|
// 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
|
||
|
}
|