https://d.puremagic.com/issues/show_bug.cgi?id=12007
--- Comment #2 from matovitch <[email protected]> 2014-01-27 01:06:27 PST --- I found an ugly workaround for finite ranges (using cycle([a]) instead of repeat(a)) : import std.algorithm; import std.range; import std.stdio; auto myCartesianProduct(R1, R2)(R1 range1, R2 range2) { static if (isInfinite!R1 && isInfinite!R2) { static if (isForwardRange!R1 && isForwardRange!R2) { // This algorithm traverses the cartesian product by alternately // covering the right and bottom edges of an increasing square area // over the infinite table of combinations. This schedule allows us // to require only forward ranges. return zip(sequence!"n"(cast(size_t)0), range1.save, range2.save, repeat(range1), repeat(range2)) .map!(function(a) => chain( zip(repeat(a[1]), take(a[4].save, a[0])), zip(take(a[3].save, a[0]+1), repeat(a[2])) ))() .joiner(); } else static assert(0, "cartesianProduct of infinite ranges requires "~ "forward ranges"); } else static if (isInputRange!R2 && isForwardRange!R1 && !isInfinite!R1) { return joiner(map!((ElementType!R2 a) => zip(range1.save, cycle([a]))) (range2)); } else static if (isInputRange!R1 && isForwardRange!R2 && !isInfinite!R2) { return joiner(map!((ElementType!R1 a) => zip(cycle([a]), range2.save)) (range1)); } else static assert(0, "cartesianProduct involving finite ranges must "~ "have at least one finite forward range"); } void main() { immutable int[] A = [1,2,3]; immutable int[] B = [4,5,6]; auto AB = myCartesianProduct(A,B); writeln(AB); } -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
