<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Dec 17, 2017 at 7:37 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:1px solid rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><br><blockquote type="cite"><span class="gmail-"><div>On Dec 16, 2017, at 4:34 PM, Nevin Brackett-Rozinsky via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div><br class="gmail-m_2667904589485617490Apple-interchange-newline"></span><span class="gmail-"><div><div style="font-family:HelveticaNeue;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><font face="monospace, monospace">public extension MutableCollection where Self: RandomAccessCollection, IndexDistance == Int {</font></div></div></span></blockquote></div><br><div>IndexDistance == Int is an over-constraint, FWIW.  Adding it is generally a mistake.  Not a serious one, but it does limit utility somewhat.</div><div><br></div><div>HTH,</div><div>Dave</div></div></blockquote></div><br></div><div class="gmail_extra">You are correct, however there is an accepted-and-implemented proposal (<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0191-eliminate-indexdistance.md">SE–0191</a>) to eliminate IndexDistance and replace it with Int, so the constraint will always be satisfied starting in Swift 4.1.</div><div class="gmail_extra"><br></div><div class="gmail_extra">I wrote a version of shuffle() without that constraint, but it is less elegant: the line “for n in 0 ..&lt; count - 1” no longer compiles, and writing “0 as IndexDistance” doesn’t fix it because the resulting Range is not a Sequence, since IndexDistance.Stride does not conform to SignedInteger (at least in Swift 4.0 according to Xcode 9.2).</div><div class="gmail_extra"><br></div><div class="gmail_extra">A while loop works of course, though a direct conversion requires writing “var n = 0 as IndexDistance” before the loop. Luckily, with a bit of cleverness we can eliminate all mention of IndexDistance, and this time we really and truly don’t need the “guard !isEmpty” line:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra"><font face="monospace, monospace">extension MutableCollection where Self: RandomAccessCollection {</font></div><div class="gmail_extra"><font face="monospace, monospace">    mutating func shuffle() {</font></div><div class="gmail_extra"><font face="monospace, monospace">        </font><span style="font-family:monospace,monospace">var n = count</span></div><div class="gmail_extra"><font face="monospace, monospace">        while n &gt; 1 {</font></div><div class="gmail_extra"><font face="monospace, monospace">            let i = index(startIndex, offsetBy: count - n)</font></div><div class="gmail_extra"><font face="monospace, monospace">            let j = index(i, offsetBy: random(n))</font></div><div class="gmail_extra"><span style="font-family:monospace,monospace">            n -= 1</span><font face="monospace, monospace"><br></font></div><div class="gmail_extra"><font face="monospace, monospace">            swapAt(i, j)</font></div><div class="gmail_extra"><font face="monospace, monospace">        }</font></div><div class="gmail_extra"><font face="monospace, monospace">    }</font></div><div class="gmail_extra"><font face="monospace, monospace">}</font></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">Essentially, the constraint is there to make the code nicer on pre-4.1 versions of Swift, though I’m happy to remove it if you think that’s better. If nothing else, removing the constraint means people reading the example code in the future won’t be misled into thinking they need to use it themselves, so perhaps it should go just on that account.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Okay, you’ve convinced me, I’ll update the PR. :-)</div><div class="gmail_extra"><br></div><div class="gmail_extra">Nevin</div></div>