<div dir="ltr"><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">Tim,</div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)"><br></div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">The protocol extension alone would be sufficient, but for as long as the global functions</div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">`min` and `max` are still around I thought adding a global clamp function would make</div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">for good symmetry.</div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)"><br></div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">I&#39;ll write a small draft proposal to illustrate my idea a little better.</div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)"><br></div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">What does the community think?</div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)"><br></div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)">- Nick </div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)"><br></div><div class="gmail_default" style="font-family:&quot;comic sans ms&quot;,sans-serif;color:rgb(39,78,19)"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 30, 2016 at 2:25 AM, Tim Vermeulen <span dir="ltr">&lt;<a href="mailto:tvermeulen@me.com" target="_blank">tvermeulen@me.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What would the point of a free function be if you already have a protocol extension?<br>
<span class=""><br>
&gt; Georgios, Yes lets go with clamp for a name!<br>
&gt;<br>
&gt; Pyry, Originally I thought of just adding a global function akin to `min`<br>
&gt; and `max` but I am also<br>
&gt; in favour of adding the above extension to `Comparable`.<br>
&gt; I think having both the global function and the protocol extension for<br>
&gt; `clamp` would be great.<br>
&gt;<br>
&gt; - Nick<br>
&gt;<br>
&gt;<br>
</span><span class="">&gt; On Thu, Aug 25, 2016 at 9:37 PM, Pyry Jahkola&lt;pyry.jahkola at <a href="http://iki.fi" rel="noreferrer" target="_blank">iki.fi</a>&gt;wrote:<br>
&gt;<br>
&gt; &gt; On 25 Aug 2016, at 12:05, Nicholas Maccharoli wrote:<br>
&gt; &gt;<br>
&gt; &gt; I personally see merit in adding a function to bound the value of a<br>
&gt; &gt; variable within a range and think it would be simple to write with the<br>
&gt; &gt; existing implementations of `min` and `max` with something like:<br>
&gt; &gt;<br>
&gt; &gt; public func bounds&lt;T : Comparable&gt;(value: T, _ lower: T, _ upper: T)<br>
&gt; &gt; -&gt;T {<br>
&gt; &gt; return max(lower, min(value, upper))<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; Does this sound like something the community thinks would be worthwhile to<br>
&gt; &gt; add?<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; I&#39;d welcome that addition. In terms of function interface, I think we can<br>
&gt; &gt; do better than the 3-argument `clamp(x, min, max)` function that is seen<br>
&gt; &gt; in several math libraries.<br>
&gt; &gt;<br>
&gt; &gt; Our ***Range types already have a `clamped(to:)` member function, e.g. here&#39;s<br>
&gt; &gt; one for ClosedRange<br>
</span>&gt; &gt; &lt;<a href="https://developer.apple.com/reference/swift/closedrange/1779071-clamped" rel="noreferrer" target="_blank">https://developer.apple.com/<wbr>reference/swift/closedrange/<wbr>1779071-clamped</a>&gt;.<br>
<div class="HOEnZb"><div class="h5">&gt; &gt; It creates a new range constraining the receiver&#39;s bounds within the new<br>
&gt; &gt; bounds given as argument.<br>
&gt; &gt;<br>
&gt; &gt; I think the sensible thing would be to add a similar, and equally named,<br>
&gt; &gt; method to the Comparable protocol, taking in the ClosedRange&lt;Self&gt;to<br>
&gt; &gt; limit the value to:<br>
&gt; &gt;<br>
&gt; &gt; extension Comparable {<br>
&gt; &gt; public func clamped(to limits: ClosedRange&lt;Self&gt;) -&gt;Self {<br>
&gt; &gt; return self&lt;limits.lowerBound ? limits.lowerBound<br>
&gt; &gt; : self&gt;limits.upperBound ? limits.upperBound<br>
&gt; &gt; : self<br>
&gt; &gt; }<br>
&gt; &gt; }<br>
&gt; &gt;<br>
&gt; &gt; (-0.1).clamped(to: 0 ... 1) // 0.0<br>
&gt; &gt; 3.14.clamped(to: 0 ... .infinity) // 3.14<br>
&gt; &gt; &quot;foo&quot;.clamped(to: &quot;a&quot; ... &quot;f&quot;) // &quot;f&quot;<br>
&gt; &gt; &quot;foo&quot;.clamped(to: &quot;a&quot; ... &quot;g&quot;) // &quot;foo&quot;<br>
&gt; &gt;<br>
&gt; &gt; From my experience, I&#39;d say it&#39;d be most useful for clamping<br>
&gt; &gt; floating-point numbers and collection indices.<br>
&gt; &gt;<br>
&gt; &gt; — Pyry<br>
&gt;<br>
&gt;<br>
&gt; </div></div></blockquote></div><br></div>