class WithinMatcher

defm match(expected, actual)
  [delta, num] = expected
  self.result = abs(num - actual)
  return self.result <= delta
end

defm failure_message_for_match(expected, actual)
  [actual_str, delta_str, num_str, result_str] = self.numeric_string_values(expected, actual)
  return "expected “#{actual_str}” to be within +/- “#{delta_str}” of “#{num_str}”, delta was “#{result_str}”"
end

defm failure_message_for_mismatch(expected, actual)
  [actual_str, delta_str, num_str, result_str] = self.numeric_string_values(expected, actual)
  return "expected “#{actual_str}” to not be within +/- “#{delta_str}” of “#{num_str}”, delta was “#{result_str}”"
end

def numeric_string_values(expected, actual)
  [delta, num] = expected
  actual_str = printf("%f", actual)
  delta_str = printf("%f", delta)
  num_str = printf("%f", num)
  result_str = printf('%f', self.result)
  return [actual_str, delta_str, num_str, result_str]
end

end