On Friday, April 15, 2016 22:42:55 Andrei Alexandrescu via Digitalmars-d 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?
The first one is way cleaner IMHO. - Jonathan M Davis
