2024-03-26 08:45:18 +01:00
|
|
|
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
|
|
// All rights reserved.
|
|
|
|
|
2024-03-26 07:00:53 +01:00
|
|
|
// utils.go
|
|
|
|
package expr
|
|
|
|
|
2024-03-28 06:26:20 +01:00
|
|
|
import "reflect"
|
|
|
|
|
2024-03-26 07:00:53 +01:00
|
|
|
func isString(v any) (ok bool) {
|
|
|
|
_, ok = v.(string)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func isInteger(v any) (ok bool) {
|
|
|
|
_, ok = v.(int64)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func isFloat(v any) (ok bool) {
|
|
|
|
_, ok = v.(float64)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
2024-03-30 06:50:49 +01:00
|
|
|
func isList(v any) (ok bool) {
|
|
|
|
_, ok = v.([]any)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
2024-04-21 14:24:56 +02:00
|
|
|
func isDict(v any) (ok bool) {
|
|
|
|
_, ok = v.(map[any]any)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
2024-03-26 07:00:53 +01:00
|
|
|
func isNumber(v any) (ok bool) {
|
|
|
|
return isFloat(v) || isInteger(v)
|
|
|
|
}
|
|
|
|
|
|
|
|
func isNumberString(v any) (ok bool) {
|
|
|
|
return isString(v) || isNumber(v)
|
|
|
|
}
|
|
|
|
|
2024-04-28 06:43:57 +02:00
|
|
|
func isFunctor(v any) (ok bool) {
|
|
|
|
_, ok = v.(Functor)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-03-26 07:00:53 +01:00
|
|
|
func numAsFloat(v any) (f float64) {
|
|
|
|
var ok bool
|
|
|
|
if f, ok = v.(float64); !ok {
|
|
|
|
i, _ := v.(int64)
|
|
|
|
f = float64(i)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func toBool(v any) (b bool, ok bool) {
|
|
|
|
ok = true
|
|
|
|
switch x := v.(type) {
|
|
|
|
case string:
|
|
|
|
b = len(x) > 0
|
|
|
|
case float64:
|
|
|
|
b = x != 0.0
|
|
|
|
case int64:
|
|
|
|
b = x != 0
|
|
|
|
case bool:
|
|
|
|
b = x
|
|
|
|
default:
|
|
|
|
ok = false
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2024-03-28 06:26:20 +01:00
|
|
|
|
|
|
|
func isFunc(v any) bool {
|
|
|
|
return reflect.TypeOf(v).Kind() == reflect.Func
|
|
|
|
}
|
|
|
|
|
|
|
|
func anyInteger(v any) (i int64, ok bool) {
|
|
|
|
ok = true
|
|
|
|
switch intval := v.(type) {
|
|
|
|
case int:
|
|
|
|
i = int64(intval)
|
|
|
|
case uint8:
|
|
|
|
i = int64(intval)
|
|
|
|
case uint16:
|
|
|
|
i = int64(intval)
|
2024-04-09 07:12:22 +02:00
|
|
|
case uint64:
|
|
|
|
i = int64(intval)
|
2024-03-28 06:26:20 +01:00
|
|
|
case uint32:
|
|
|
|
i = int64(intval)
|
|
|
|
case int8:
|
|
|
|
i = int64(intval)
|
|
|
|
case int16:
|
|
|
|
i = int64(intval)
|
|
|
|
case int32:
|
|
|
|
i = int64(intval)
|
|
|
|
case int64:
|
|
|
|
i = intval
|
|
|
|
default:
|
|
|
|
ok = false
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-04-09 07:12:22 +02:00
|
|
|
func fromGenericAny(v any) (exprAny any, ok bool) {
|
|
|
|
if exprAny, ok = v.(bool); ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if exprAny, ok = v.(string); ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if exprAny, ok = anyInteger(v); ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if exprAny, ok = anyFloat(v); ok {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-03-28 06:26:20 +01:00
|
|
|
func anyFloat(v any) (float float64, ok bool) {
|
|
|
|
ok = true
|
|
|
|
switch floatval := v.(type) {
|
|
|
|
case float32:
|
|
|
|
float = float64(floatval)
|
|
|
|
case float64:
|
|
|
|
float = floatval
|
|
|
|
default:
|
|
|
|
ok = false
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
2024-04-02 04:36:03 +02:00
|
|
|
|
|
|
|
func CopyMap[K comparable, V any](dest, source map[K]V) map[K]V {
|
|
|
|
for k, v := range source {
|
|
|
|
dest[k] = v
|
|
|
|
}
|
|
|
|
return dest
|
|
|
|
}
|
|
|
|
|
|
|
|
func CloneMap[K comparable, V any](source map[K]V) map[K]V {
|
|
|
|
dest := make(map[K]V, len(source))
|
|
|
|
return CopyMap(dest, source)
|
|
|
|
}
|