[swift-evolution] [Proposal draft] Add `Clamp` function to standard library

Xiaodi Wu xiaodi.wu at gmail.com
Fri Sep 2 12:42:20 CDT 2016

Besides my concern that this is not in scope for Swift 4 phase 1, or for
the standard library generally, the function as proposed is unsatisfactory
because the behavior is incorrect when lower > upper.


(a) the parameters should be labeled (and for consistency with ranges,
those labels should be "lowerBound" and "upperBound") and a precondition
should exist before evaluation of the return value, or

(b) this function should take two arguments, one of these being a Range, or

(c) better still--this should be a method on numeric types or on Range. I'm
not convinced that there is a use case for clamping values of any
Comparable type. What does it mean to clamp a String, for example?

Finally, it could possibly be more performant to compute the value using
the comparison operators < and > directly instead of using the functions
max and min. It would be nice to have benchmarks on that.

But I am still not convinced that this function is important enough *and*
susceptible enough to an incorrect implementation that the standard library
should provide its own.
On Fri, Sep 2, 2016 at 11:56 Nicholas Maccharoli via swift-evolution <
swift-evolution at swift.org> wrote:

> Introduction
> The aim of this proposal is to introduce clamp functionality to the swift
> standard library. The clamp function would take a value and a upper and
> lower bounds to clamp the value to, ensuring that the return value of the
> function is within the range specified by the upper and lower bounds.
> Swift-evolution thread: Discussion thread topic for that proposal
> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160829/026748.html>
> <https://github.com/Nirma/swift-evolution/blob/clamp_proposal/proposals/NNNN-add-clamp-to-standard-library.md#motivation>
> Motivation
> The standard library already includes functionality for min and max but
> at the time of this writing there is no global function for clamp. Adding
> a clamp function would complement min and max really well and would also
> eliminate the need for developers to write their own clamp functionality.
> <https://github.com/Nirma/swift-evolution/blob/clamp_proposal/proposals/NNNN-add-clamp-to-standard-library.md#proposed-solution>Proposed
> solution
> I propose that a global clamp function akin to min and max be added to
> the standard library.
> <https://github.com/Nirma/swift-evolution/blob/clamp_proposal/proposals/NNNN-add-clamp-to-standard-library.md#detailed-design>Detailed
> design
> The implementation of the global clamp function would be as follows:
> public func clamp<T : Comparable>(value: T, _ lower: T, _ upper: T) -> T {
>   return max(lower, min(value, upper))
> }
> <https://github.com/Nirma/swift-evolution/blob/clamp_proposal/proposals/NNNN-add-clamp-to-standard-library.md#impact-on-existing-code>Impact
> on existing code
> There are no impacts on existing code, this proposal is purely additive.
> <https://github.com/Nirma/swift-evolution/blob/clamp_proposal/proposals/NNNN-add-clamp-to-standard-library.md#alternatives-considered>Alternatives
> considered
> Aside from not making the additions that this proposal wishes to make to
> the standard library no other alternatives have been considered.
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160902/79256269/attachment.html>

More information about the swift-evolution mailing list