On 12/14/2011 09:14 PM, Justin Whear wrote:
I've looked through std.algorithm and std.range, but haven't found anything
to compute the Cartesian product of several ranges. I have the nagging
feeling that this can be accomplished by combining several of the range
transformations in the standard library.

What I'm after is something like this:

alias Tuple!(int, string) P;
assert(equal(
        cartesianProduct([1, 2], ["a", "b"]),
        [ P(1, "a"), P(1, "b"), P(2, "a"), P(2, "b") ]
));


auto cartesianProduct(R,S)(R r, S s)if(isInputRange!R && isForwardRange!S){
    struct CartesianProduct{
        private{R r; S s, startS;}
        this(R r, S s){this.r=r; this.s=s; startS=this.s.save;}
        @property auto front(){return tuple(r.front, s.front);}
        @property bool empty(){return r.empty;}
        void popFront(){
                s.popFront();
                if(s.empty){
                    s = startS.save;
                    r.popFront();
                }
        }
        static if(isForwardRange!R):
        @property auto save(){return typeof(this)(r.save, s.save);}
    }
    return CartesianProduct(r,s);
}

Reply via email to