On Saturday, 16 April 2016 at 02:42:55 UTC, Andrei Alexandrescu
wrote:
So the constraint on chain() is:
Ranges.length > 0 &&
allSatisfy!(isInputRange, staticMap!(Unqual, Ranges)) &&
!is(CommonType!(staticMap!(ElementType, staticMap!(Unqual,
Ranges))) == void)
Noice. Now, an alternative is to express it as a recursive
constraint:
(Ranges.length == 1 && isInputRange!(Unqual!(Ranges[0])))
||
(Ranges.length == 2 &&
isInputRange!(Unqual!(Ranges[0])) &&
isInputRange!(Unqual!(Ranges[1])) &&
!is(CommonType!(ElementType!(Ranges[0]),
ElementType!(Ranges[1])) == void))
|| is(typeof(chain(rs[0 .. $ / 2], chain(rs[$ / 2 .. $]))))
In the latter case there's no need for additional helpers but
the constraint is a bit more bulky.
Pros? Cons? Preferences?
Andrei
Very strong preference for the first. The second is so much
harder to read (not everyone is great at thinking recursively)
and also could depend on the implementation of chain if the
return type must be inferred from the body.