<div dir="ltr"><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13">Georgios, Yes lets go with clamp for a name!</div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13"><br></div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13">Pyry, Originally I thought of just adding a global function akin to `min` and `max` but I am also </div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13">in favour of adding the above extension to `Comparable`. </div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13">I think having both the global function and the protocol extension for `clamp` would be great. </div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13"><br></div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13">- Nick </div><div class="gmail_default" style="font-family:comic sans ms,sans-serif;color:#274e13"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 25, 2016 at 9:37 PM, Pyry Jahkola <span dir="ltr">&lt;<a href="mailto:pyry.jahkola@iki.fi" target="_blank">pyry.jahkola@iki.fi</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><span class=""><div></div><blockquote type="cite"><div>On 25 Aug 2016, at 12:05, Nicholas Maccharoli wrote:<br><br>I personally see merit in adding a function to bound the value of a variable within a range and think it would be simple to write with the existing implementations of `min` and `max` with something like:<br><br>    public func bounds&lt;T : Comparable&gt;(value: T, _ <wbr>lower: T, _ upper: T) -&gt; T {<br>        return max(lower, min(value, upper))<br>    }<br><br>Does this sound like something the community thinks would be worthwhile to add?<br></div></blockquote><div><br></div></span><div>I&#39;d welcome that addition. In terms of function interface, I think we can do better than the 3-argument `<span style="font-family:Menlo;font-size:11px">clamp(x, min, max)</span>` function that is seen in several math libraries.</div><div><br></div><div>Our ***Range types already have a `<span style="font-family:Menlo;font-size:11px">clamped(to:)</span>` member function, e.g. <a href="https://developer.apple.com/reference/swift/closedrange/1779071-clamped" target="_blank">here&#39;s one for ClosedRange</a>. It creates a new range constraining the receiver&#39;s bounds within the new bounds given as argument.</div><div><br></div><div>I think the sensible thing would be to add a similar, and equally named, method to the Comparable protocol, taking in the <span style="font-family:Menlo;font-size:11px;color:rgb(112,61,170)">ClosedRange</span><span style="font-family:Menlo;font-size:11px">&lt;</span><span style="font-family:Menlo;font-size:11px;color:rgb(79,129,135)">Self</span><span style="font-family:Menlo;font-size:11px">&gt;</span> to limit the value to:</div><div><br></div><div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112,61,170)"><span style="color:#bb2ca2">    extension</span><span style="color:#000000"> </span><span>Comparable</span><span style="color:#000000"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>      </span><span style="color:#bb2ca2">public func</span><span> clamped(to limits: </span><span style="color:#703daa">ClosedRange</span><span>&lt;</span><span style="color:#4f8187">Self</span><span>&gt;) -&gt; </span><span style="color:#4f8187">Self</span><span> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>        </span><span style="color:#bb2ca2">return</span><span> </span><span style="color:#bb2ca2">self</span><span> </span><span style="color:#3d1d81">&lt;</span><span> limits.</span><span style="color:#703daa">lowerBound</span><span> ? limits.</span><span style="color:#703daa">lowerBound</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>             : </span><span style="color:#bb2ca2">self</span><span> </span><span style="color:#3d1d81">&gt;</span><span> limits.</span><span style="color:#703daa">upperBound</span><span> ? limits.</span><span style="color:#703daa">upperBound</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>             : </span><span style="color:#bb2ca2">self</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>      }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>    }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px"><span></span><br></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span>    (</span><span style="color:#272ad8">-0.1</span><span>).</span><span style="color:#31595d">clamped</span><span>(to: </span><span style="color:#272ad8">0</span><span> ... </span><span style="color:#272ad8">1</span><span>)       </span><span style="color:#008400">// 0.0</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#272ad8">    3.14</span><span>.</span><span style="color:#31595d">clamped</span><span>(to: </span><span style="color:#272ad8">0</span><span> ... .</span><span style="color:#703daa">infinity</span><span>) </span><span style="color:#008400">// 3.14</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#d12f1b">    &quot;foo&quot;</span><span>.</span><span style="color:#31595d">clamped</span><span>(to: </span><span style="color:#d12f1b">&quot;a&quot;</span><span> ... </span><span style="color:#d12f1b">&quot;f&quot;</span><span>)    </span><span style="color:#008400">// &quot;f&quot;</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:#d12f1b">    &quot;foo&quot;</span><span>.</span><span style="color:#31595d">clamped</span><span>(to: </span><span style="color:#d12f1b">&quot;a&quot;</span><span> ... </span><span style="color:#d12f1b">&quot;g&quot;</span><span>)    </span><span style="color:#008400">// &quot;foo&quot;</span></div></div><div><br></div><div>From my experience, I&#39;d say it&#39;d be most useful for clamping floating-point numbers and collection indices.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>— Pyry</div><div><br></div></font></span></div></blockquote></div><br></div>