On 12/16/13 2:24 PM, Jakob Ovrum wrote:
On Monday, 16 December 2013 at 22:10:28 UTC, Walter Bright wrote:
Exactly, meaning I'd have to go look at the source code for it,
whereas with the latter I can see right away what it is. The function
is a net programmer time loss.
Surely you would turn to the documentation, not the source code. We
could make it require the bounds template parameter, so it would always
be required to use it like:
if(val.between!"[)"(0, 10))
...
However, with a good, solid default that is easy to remember, I wouldn't
mind having a default argument for the bounds.
I guess if we need several versions of between, we could give up on it.
At any rate, the implementation of `among` should probably be something
closer to:
---
uint among(T, Values...)(auto ref T value, auto ref Values values)
if(!is(CommonType!(T, Values) == void))
{
foreach(uint i, ref v; values)
{
if(value == v) return i + 1;
}
return 0;
}
---
It would of course be even better if we had a nice and clear way to
express that all types in Values must be equatable (?) with T, something
like `allSatisfy!(isComparable!("==", T), Values)`, where `isComparable`
is the missing link.
A custom predicate defaulted to '==' would be the ticket.
Andrei