<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Apr 13, 2017, at 4:17 PM, Ben Cohen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><h3 id="comparisonresult-conveniences" style="color: rgb(17, 17, 17); margin: 21px 0px; font-size: 20px; line-height: 21px; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;" class="">ComparisonResult Conveniences</h3><p style="color: rgb(17, 17, 17); font-family: 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif; word-wrap: break-word; margin: 1.3125em 0px; font-size: 1.1429em; line-height: 1.3125em;" class="">There are a few conveniences we could consider providing to make ComparisonResult more ergonomic to manipulate. Such as:</p><pre style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 11.999999046325684px; background-color: rgb(248, 248, 248); height: 140px;" class=""><code class="swift hljs" style="line-height: inherit; display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); height: auto;"><span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// A way to combine orderings</span>
<span class="hljs-function"><span class="hljs-keyword" style="font-weight: bold;">func</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">ComparisonResult</span>.<span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">breakingTiesWith</span><span class="hljs-params">(<span class="hljs-number" style="color: rgb(0, 128, 128);">_</span> order: <span class="hljs-params">()</span></span></span> -&gt; <span class="hljs-type" style="color: rgb(68, 85, 136); font-weight: bold;">ComparisonResult</span>) -&gt; <span class="hljs-type" style="color: rgb(68, 85, 136); font-weight: bold;">ComparisonResult</span>

array.<span class="hljs-built_in" style="color: rgb(0, 134, 179);">sort</span> {
  $<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>.x.compare($<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>.y)
  .breakingTiesWith { $<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>.y.compare($<span class="hljs-number" style="color: rgb(0, 128, 128);">1</span>.y) }
  == .orderedAscending 
}</code></pre></div></div></div></div></blockquote></div><div>The really nice thing about compare being an operator is that you can very nicely combine it with an operator here and get a much more light-weight syntax for chained comparisons, e.g.:</div><div><br class=""></div><div>struct MyPoint : Comparable {</div><div>&nbsp; var x, y, z: Double</div><div>&nbsp; func compare(_ other: MyPointer) -&gt; ComparisonResult {</div><div>&nbsp; &nbsp; return self.x &lt;=&gt; other.x || self.y &lt;=&gt; other.y || self.z &lt;=&gt; other.z</div><div>&nbsp; }</div><div>}</div><div><br class=""></div><div>as opposed to, I guess,</div><div>&nbsp; return self.x.compare(other.x).breakingTiesWith { self.y.compare(other.y).breakingTiesWith { self.z.compare(other.z) } }</div><div><br class=""></div><div>But this is mostly useful for defining custom comparisons, so perhaps it's not worth having to paint a bikeshed for &lt;=&gt; and whatever the combining operator is.</div><div><br class=""></div><div>Also, in this example:</div><blockquote type="cite" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div dir="auto" class="" style="word-wrap: break-word; -webkit-nbsp-mode: space;"><div class=""><pre class="" style="margin-top: 21px; margin-bottom: 21px; tab-size: 4; color: rgb(17, 17, 17); font-size: 11.999999046325684px; background-color: rgb(248, 248, 248); height: 140px;"><code class="swift hljs" style="line-height: inherit; display: block; overflow-x: auto; padding: 0.5em; color: rgb(51, 51, 51); height: auto;"><span class="hljs-comment" style="color: rgb(153, 153, 136); font-style: italic;">// A way to combine orderings</span>
<span class="hljs-function"><span class="hljs-keyword" style="font-weight: bold;">func</span> <span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">ComparisonResult</span>.<span class="hljs-title" style="color: rgb(153, 0, 0); font-weight: bold;">breakingTiesWith</span><span class="hljs-params">(<span class="hljs-number" style="color: rgb(0, 128, 128);">_</span> order: <span class="hljs-params">()</span></span></span> -&gt; <span class="hljs-type" style="color: rgb(68, 85, 136); font-weight: bold;">ComparisonResult</span>) -&gt; <span class="hljs-type" style="color: rgb(68, 85, 136); font-weight: bold;">ComparisonResult</span>

array.<span class="hljs-built_in" style="color: rgb(0, 134, 179);">sort</span> {
  $<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>.x.compare($<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>.y)
  .breakingTiesWith { $<span class="hljs-number" style="color: rgb(0, 128, 128);">0</span>.y.compare($<span class="hljs-number" style="color: rgb(0, 128, 128);">1</span>.y) }
  == .orderedAscending 
}</code></pre></div></div></div></blockquote><div class="">Requiring this last "== .orderedAscending" seems like a tragic failure of ergonomics. &nbsp;I understand that sorting doesn't actually require a tri-valued comparison, but is it really worth maintaining two currencies of comparison result over that? &nbsp;Are there any types that can answer '&lt;' substantially more efficiently than they can answer 'compare'? &nbsp;And I assume this is related to why you've kept &lt; in the protocol.</div><div class=""><br class=""></div><div class="">John.</div></body></html>