On Wednesday, 15 February 2017 at 17:10:26 UTC, Adam D. Ruppe
wrote:
On Wednesday, 15 February 2017 at 07:56:00 UTC, Jacob Carlborg
wrote:
Your documentation is an improvement but it doesn't help when
reading the source code.
Yeah, I think there's a few things we can do in the source too.
We should find the common combinations and abstract them out,
like I said before, isInputRangeOf is potentially useful.
Though, like Andrei, I'm skeptical on doing too much of that,
since the combinations can quickly explode and then you just
have to search through more to figure out wtf they mean.
That'd help the source and docs if we find the right balance.
Speaking of right balance, there's currently a PR at Phobos that
is a good candidate to get a common measure on how this balance
should be set:
https://github.com/dlang/phobos/pull/5132
The open question here is that for nearly every function in
std.file & std.path the constraint block looks like this:
uint getAttributes(R)(R name)
if (isInputRange!R && !isInfinite!R &&
isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R);
Now as this same block is used > 30x in Phobos one could argue
that it makes sense to use a convenience trait like:
enum isSomeInputRangeChar(R) = isInputRange!R && !isInfinite!R &&
isSomeChar!(ElementEncodingType!R) && !isConvertibleToString!R
which would obviously lead to:
uint getAttributes(R)(R name)
if (isSomeInputRangeChar!R)
What's your opinion on such a case?