def call(args)
if args.count == 1
values = args.first
else
raise Errors::InvalidArityError, "function min() expects one argument"
end
if Array === values
return nil if values.empty?
first = values.first
first_type = get_type(first)
unless first_type == NUMBER_TYPE || first_type == STRING_TYPE
msg = "function min() expects numeric or string values"
raise Errors::InvalidTypeError, msg
end
values.inject([first, first_type]) do |(min, min_type), v|
v_type = get_type(v)
if min_type == v_type
v < min ? [v, v_type] : [min, min_type]
else
msg = "function min() encountered a type mismatch in sequence: "
msg << "#{min_type}, #{v_type}"
raise Errors::InvalidTypeError, msg
end
end.first
else
raise Errors::InvalidTypeError, "function min() expects an array"
end
end