new operator 'digest'

This commit is contained in:
Celestino Amoroso 2026-04-25 06:25:39 +02:00
parent ce7bfc5e3f
commit 20dc502438
3 changed files with 79 additions and 9 deletions

70
operator-digest.go Normal file
View File

@ -0,0 +1,70 @@
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
// operator-digest.go
package expr
import (
"fmt"
"io"
)
//-------- map term
func newDigestTerm(tk *Token) (inst *term) {
return &term{
tk: *tk,
children: make([]*term, 0, 2),
position: posInfix,
priority: priIterOp,
evalFunc: evalDigest,
}
}
func evalDigest(ctx ExprContext, opTerm *term) (v any, err error) {
var leftValue, rightValue any
var it Iterator
var item, lastValue any
if err = opTerm.checkOperands(); err != nil {
return
}
if leftValue, err = opTerm.children[0].compute(ctx); err != nil {
return
}
if it, err = NewIterator(leftValue); err != nil {
return nil, fmt.Errorf("left operand of MAP must be an iterable data-source; got %s", TypeName(leftValue))
}
lastValue = nil
for item, err = it.Next(); err == nil; item, err = it.Next() {
ctx.SetVar("_", item)
ctx.SetVar("_index", it.Index())
ctx.SetVar("_count", it.Count())
if rightValue, err = opTerm.children[1].compute(ctx); err == nil {
if rightValue == nil {
break
} else {
lastValue = rightValue
}
}
ctx.DeleteVar("_count")
ctx.DeleteVar("_index")
ctx.DeleteVar("_")
if err != nil {
break
}
}
if err == io.EOF {
err = nil
}
v = lastValue
return
}
// init
func init() {
registerTermConstructor(SymKwDigest, newDigestTerm)
}

View File

@ -137,7 +137,7 @@ func init() {
SymKwBut: {"but", symClassOperator, posInfix}, SymKwBut: {"but", symClassOperator, posInfix},
SymKwMap: {"map", symClassOperator, posInfix}, SymKwMap: {"map", symClassOperator, posInfix},
SymKwFilter: {"filter", symClassOperator, posInfix}, SymKwFilter: {"filter", symClassOperator, posInfix},
// SymKwDigest: {"digest", symClassOperator, posInfix}, SymKwDigest: {"digest", symClassOperator, posInfix},
SymKwFunc: {"func(", symClassDeclaration, posPrefix}, SymKwFunc: {"func(", symClassDeclaration, posPrefix},
SymKwBuiltin: {"builtin", symClassOperator, posPrefix}, SymKwBuiltin: {"builtin", symClassOperator, posPrefix},
SymKwPlugin: {"plugin", symClassOperator, posPrefix}, SymKwPlugin: {"plugin", symClassOperator, posPrefix},

View File

@ -121,7 +121,7 @@ const (
SymKwInclude SymKwInclude
SymKwMap SymKwMap
SymKwFilter SymKwFilter
// SymKwDigest SymKwDigest
SymKwNil SymKwNil
SymKwUnset SymKwUnset
) )
@ -144,6 +144,6 @@ func init() {
"OR": SymKwOr, "OR": SymKwOr,
"NIL": SymKwNil, "NIL": SymKwNil,
"UNSET": SymKwUnset, "UNSET": SymKwUnset,
// "DIGEST": SymKwDigest, "DIGEST": SymKwDigest,
} }
} }