// Copyright (c) 2024-2026 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.

// expr-function.go
package kern

// ---- Functor interface
type Functor interface {
	Typer
	InvokeNamed(ctx ExprContext, name string, args map[string]any) (result any, err error)
	SetFunc(info ExprFunc)
	GetFunc() ExprFunc
	GetParams() []ExprFuncParam
	GetDefinitionContext() ExprContext
}

// ---- Function Param Info
type ExprFuncParam interface {
	Name() string
	Type() string
	IsDefault() bool
	IsOptional() bool
	IsRepeat() bool
	DefaultValue() any
}

// ---- Function Info
type ExprFunc interface {
	Formatter
	Name() string
	MinArgs() int
	MaxArgs() int
	Functor() Functor
	Params() []ExprFuncParam
	ParamSpec(paramName string) ExprFuncParam
	ReturnType() string
	PrepareCall(name string, actualParams map[string]any) (err error)
	AllocContext(parentCtx ExprContext) (ctx ExprContext)
}

func IsFunctor(v any) (ok bool) {
	_, ok = v.(Functor)
	return
}
