module Fbe::Award::BTerm

def calc(bill)

Raises:
  • (RuntimeError) - If the term operation is unknown

Returns:
  • (Object) - The calculated value (number, boolean, etc.)

Parameters:
  • bill (Fbe::Award::Bill) -- The bill providing context for calculation
def calc(bill)
  case @op
  when :total
    bill.points
  when :if
    to_val(@operands[0], bill) ? to_val(@operands[1], bill) : to_val(@operands[2], bill)
  when :and
    @operands.all? { |o| to_val(o, bill) }
  when :or
    @operands.any? { |o| to_val(o, bill) }
  when :not
    !to_val(@operands[0], bill)
  when :eq
    to_val(@operands[0], bill) == to_val(@operands[1], bill)
  when :lt
    to_val(@operands[0], bill) < to_val(@operands[1], bill)
  when :lte
    to_val(@operands[0], bill) <= to_val(@operands[1], bill)
  when :gt
    to_val(@operands[0], bill) > to_val(@operands[1], bill)
  when :gte
    to_val(@operands[0], bill) >= to_val(@operands[1], bill)
  when :div
    to_val(@operands[0], bill) / to_val(@operands[1], bill)
  when :times
    to_val(@operands[0], bill) * to_val(@operands[1], bill)
  when :plus
    to_val(@operands[0], bill) + to_val(@operands[1], bill)
  when :minus
    to_val(@operands[0], bill) - to_val(@operands[1], bill)
  when :max
    [to_val(@operands[0], bill), to_val(@operands[1], bill)].max
  when :min
    [to_val(@operands[0], bill), to_val(@operands[1], bill)].min
  when :between
    v = to_val(@operands[0], bill)
    a = to_val(@operands[1], bill)
    b = to_val(@operands[2], bill)
    min, max = [a, b].minmax
    return 0 if (!v.negative? && v < min) || (!v.positive? && v > max)
    v.clamp(min, max)
  else
    raise "Unknown term '#{@op}'"
  end
end