47 lines
954 B
Go
47 lines
954 B
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// operator-in.go
|
|
package expr
|
|
|
|
//-------- in term
|
|
|
|
func newInTerm(tk *Token) (inst *term) {
|
|
return &term{
|
|
tk: *tk,
|
|
children: make([]*term, 0, 2),
|
|
position: posInfix,
|
|
priority: priRelational,
|
|
evalFunc: evalIn,
|
|
}
|
|
}
|
|
|
|
// func hasKey(d map[any]any, target any) (ok bool) {
|
|
// _, ok = d[target]
|
|
// return
|
|
// }
|
|
|
|
func evalIn(ctx ExprContext, opTerm *term) (v any, err error) {
|
|
var leftValue, rightValue any
|
|
|
|
if leftValue, rightValue, err = opTerm.evalInfix(ctx); err != nil {
|
|
return
|
|
}
|
|
|
|
if IsList(rightValue) {
|
|
list, _ := rightValue.(*ListType)
|
|
v = list.indexDeepSameCmp(leftValue) >= 0
|
|
} else if IsDict(rightValue) {
|
|
dict, _ := rightValue.(*DictType)
|
|
v = dict.hasKey(leftValue)
|
|
} else {
|
|
err = opTerm.errIncompatibleTypes(leftValue, rightValue)
|
|
}
|
|
return
|
|
}
|
|
|
|
// init
|
|
func init() {
|
|
registerTermConstructor(SymKwIn, newInTerm)
|
|
}
|