Right now when you write something like
x in -1..1
elixir compiles it to
is_integer(x) and x >= -1 and x <= 1
If we were to write
It would have the exact same effect (as x would have to be an int that is bigger than or equal to -1 and lesser than or equal to 1 to pass) which makes sense when we look at Ranges as being just a lazily-evaluated enumerable (like a Stream).
But i think that we should consider a range (atleast in the context of an "in" operation) equal to a space. Right now if we were to check if a float is inside a range, it would always fail (which, again, makes sense if we see the Range as a lazy enum).
What i propose is that elixir accepts floats when executing "in" for a range. I believe it semantically makes sense (as in "0.5 is a number in the -1..1 range ?" instead of "0.5 is inside the list of integer produced by the -1..1 range/sequence")
So, tl;dr, changing Kernel's macro in_range_literal/3 to
(is_integer(x) or is_float(x)) and increasing_compare(a, b, c)
That way we can easily check things like
def valid_probability?(val), do: val in 0..1
def contains_enough_products(amount), do: is_integer(amount) and amount in 1..10
Note that in the above example i shown that you explicitly checks if the value is integer when you want it to be, which i believe is not a bad side-effect to this proposal (and i think that it is not obvious that this is the default behaviour, specially because the documentation doesn't states that ranges won't succeed with floats)