<div dir="ltr"><div><br></div><div>I was just talking about this kind of thing (I&#39;ve updated the repo with up to 5-tuples) for times where you seq1 • seq2 • seq3</div><div><br></div><div><p style="margin:0px;font-size:18px;line-height:normal;font-family:Menlo;color:rgb(0,143,0)">// &#39;Cartesian product&#39; of a Cartesian product and a collection. Meant to help manage type explosion.</p>
<p style="margin:0px;font-size:18px;line-height:normal;font-family:Menlo"><span style="color:rgb(4,51,255)">public</span> <span style="color:rgb(4,51,255)">func</span> •&lt;Left: <span style="color:rgb(52,149,175)">SequenceType</span>, Right: <span style="color:rgb(52,149,175)">SequenceType</span>, A, B <span style="color:rgb(4,51,255)">where</span></p>
<p style="margin:0px;font-size:18px;line-height:normal;font-family:Menlo;color:rgb(52,149,175)"><span style="color:rgb(0,0,0)">    </span>Left<span style="color:rgb(0,0,0)">.</span>Generator<span style="color:rgb(0,0,0)">.</span>Element<span style="color:rgb(0,0,0)"> == (</span>A<span style="color:rgb(0,0,0)">, </span>B<span style="color:rgb(0,0,0)">)&gt;(lhs:</span>Left<span style="color:rgb(0,0,0)">, rhs:</span>Right<span style="color:rgb(0,0,0)">) -&gt; [(</span>A<span style="color:rgb(0,0,0)">, </span>B<span style="color:rgb(0,0,0)">, </span>Right<span style="color:rgb(0,0,0)">.</span>Generator<span style="color:rgb(0,0,0)">.</span>Element<span style="color:rgb(0,0,0)">)] {</span></p>
<p style="margin:0px;font-size:18px;line-height:normal;font-family:Menlo">        <span style="color:rgb(4,51,255)">return</span> lhs.<span style="color:rgb(52,149,175)">flatMap</span> { x <span style="color:rgb(4,51,255)">in</span>  rhs.<span style="color:rgb(52,149,175)">map</span> { (x.0, x.1, $0) } }</p>
<p style="margin:0px;font-size:18px;line-height:normal;font-family:Menlo">}</p></div><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 18, 2015 at 9:25 PM, Dave Abrahams <span dir="ltr">&lt;<a href="mailto:dabrahams@apple.com" target="_blank">dabrahams@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On Dec 18, 2015, at 5:46 PM, T.J. Usiyan &lt;<a href="mailto:griotspeak@gmail.com" target="_blank">griotspeak@gmail.com</a>&gt; wrote:</div><br><div><div dir="ltr">Updated the library with that. The only downside that I can see is that flattening, as I had always planned but finally bothered to do, has no way to tell if the left tuple was the produce of a previous cartesian product operation. </div></div></blockquote><div><br></div></span><div>Not sure what that means, I’m afraid.</div><span class=""><br><blockquote type="cite"><div><div dir="ltr">Small price to pay and all that. Thanks for the insight!</div></div></blockquote><div><br></div></span>Glad to help.</div><span class=""><div><br><blockquote type="cite"><div><div class="gmail_extra"><div class="gmail_quote">On Fri, Dec 18, 2015 at 8:19 PM, T.J. Usiyan <span dir="ltr">&lt;<a href="mailto:griotspeak@gmail.com" target="_blank">griotspeak@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">That is… damned nice. I choose not to feel that bad about it… for reasons.<div><br></div><div><br></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 18, 2015 at 8:04 PM, Dave Abrahams <span dir="ltr">&lt;<a href="mailto:dabrahams@apple.com" target="_blank">dabrahams@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><span><br><div><blockquote type="cite"><div>On Dec 18, 2015, at 4:35 AM, Al Skipp via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div>On 18 Dec 2015, at 00:19, T.J. Usiyan via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">With a Cartesian Product type [like this](</span><a href="https://github.com/griotspeak/CartesianProduct" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">https://github.com/griotspeak/CartesianProduct</a><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">), the for-in-where syntax actually gets us to list comprehensions. I&#39;ll admit that I might not have implemented the best Cartesian Product type possible, but it should illustrate that we have what we need.</span><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><font><font face="Consolas, Liberation Mono, Menlo, Courier, monospace"><span style="font-size:12px;line-height:16px;white-space:pre-wrap">`for case … in cartProd(cartProd(seq1, seq2), seq3) // An operator for cartProd would make it more pleasing to read.`</span></font></font></div></div></blockquote></div><br><div>That’s impressive work, but it strikes me as quite a difficult undertaking to get there. (Is it just me, or are generators and sequences the most scary part of Swift?) Also, is it possible to get it working as an expression, or is it restricted to a ‘for’ statement? If it can only be performed as a ‘for’ statement it will still need an external mutable var to be updated outside of the loop. It’s fine if you want to just do side-effecty things, like print the elements, but I’d consider the ability to return a value to be more important.</div></div></div></blockquote><br></div></span><div>This is a much simpler cartesian product implementation:</div><div><br></div><div><font face="Menlo">   seq1.flatMap { x in seq2.map { (x,$0) } }</font></div><div><br></div><div>or, if you want speed,</div><div><br></div><div><div><font face="Menlo">   seq1<b>.lazy</b>.flatMap { x in seq2<b>.lazy</b>.map { (x,$0) } }</font></div></div><div><br></div><div>HTH,</div><div><br></div><div>
-Dave<div><br></div><br>

</div>
<br></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></blockquote></div><br></span><span class=""><font color="#888888"><div>
-Dave<div><br></div><br>

</div>
<br></font></span></div></blockquote></div><br></div></div>