func LessOrEqual(k string, v float64) Exp {
	return Or(Lt(k, v), Eq(k, v))
}
LessOrEqual is a shorthand for Lt(Gt(k, v), Eq(k, v)).
package exp
import "strconv"
type expEq struct {
	key   string
	value float64
}
func (eq expEq) Eval(p Params) bool {
	value, err := strconv.ParseFloat(p.Get(eq.key), 64)
	if err != nil {
		return false
	}
	return value == eq.value
}
func (eq expEq) String() string {
	return sprintf("[%s==%.2f]", eq.key, eq.value)
}
func Equal(k string, v float64) Exp {
	return expEq{k, v}
}
func Eq(k string, v float64) Exp {
	return Equal(k, v)
}
func NotEqual(k string, v float64) Exp {
	return Neq(k, v)
}
func Neq(k string, v float64) Exp {
	return Not(Eq(k, v))
}
type expGt struct {
	key   string
	value float64
}
func (gt expGt) Eval(p Params) bool {
	value, err := strconv.ParseFloat(p.Get(gt.key), 64)
	if err != nil {
		return false
	}
	return value > gt.value
}
func (gt expGt) String() string {
	return sprintf("[%s>%.2f]", gt.key, gt.value)
}
func GreaterThan(k string, v float64) Exp {
	return expGt{k, v}
}
func Gt(k string, v float64) Exp {
	return GreaterThan(k, v)
}
func GreaterOrEqual(k string, v float64) Exp {
	return Or(Gt(k, v), Eq(k, v))
}
func Gte(k string, v float64) Exp {
	return GreaterOrEqual(k, v)
}
type expLt struct {
	key   string
	value float64
}
func (lt expLt) Eval(p Params) bool {
	value, err := strconv.ParseFloat(p.Get(lt.key), 64)
	if err != nil {
		return false
	}
	return value < lt.value
}
func (lt expLt) String() string {
	return sprintf("[%s<%.2f]", lt.key, lt.value)
}
func LessThan(k string, v float64) Exp {
	return expLt{k, v}
}
func Lt(k string, v float64) Exp {
	return LessThan(k, v)
}