On 10/10/2012 01:13 AM, H. S. Teoh wrote:
On Tue, Oct 09, 2012 at 11:24:27PM +0200, Timon Gehr wrote:
[...]
That's cute. =)
flatten is in std.algorithm and is called joiner.

Ahahahaha... I knew joiner existed; why didn't I think of it. :P


Also, you need to be careful with index types.
I'd suggest:

import std.algorithm, std.range;

auto cartesianProd(R1,R2)(R1 range1, R2 range2)
if (isForwardRange!R1 && isInfinite!R1 &&
     isBidirectionalRange!(typeof(take(range2,1))) && isInfinite!R2)
{
        return sequence!"n"(cast(size_t)1).map!(
                (size_t n)=>range1.save.take(n) // need to specify param type. 
DMD bug.
                .zip(range2.save.take(n).retro),
        ).joiner;
}
[...]

Ack! UFCS overload! ;-) (just kidding... it's actually a lot easier to
read with UFCS.)


I usually use standard function call notation for zip. (but the mail
client wraps around the code, so I inserted a manual line break.)


Reply via email to