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

Xiaodi Wu xiaodi.wu at gmail.com
Fri Sep 2 16:09:18 CDT 2016


On some thought, Strideable rather than Comparable seems appropriate.
Strideable types have some meaningful concept of distance between two
values and would (or should, if they don't already?) include types like
Date. I like Strideable.clamped(to:) a lot, and the parallels with
Range.clamped(to:) make sense.
On Fri, Sep 2, 2016 at 15:58 David Rönnqvist via swift-evolution <
swift-evolution at swift.org> wrote:

> There is already a `clamped` function for clamping one range to another
> and I feel that this function should be consistent with that one. As I see
> it, it can either be consistent in that it takes a Range as its argument,
> or in being an extension to Range. Probably something like either one of
> these:
>
> extension Comparable { // or something else?
>     func clamped(to range: Range<Self>) -> Self
> }
>
> extension Range {
>     func clamping(_ value: Bound) -> Bound
> }
>
> Involving a range is good because that means that ensuring that the bounds
> checking (lower < upper) is already taken care of.
>
> I do feel that this a useful addition to the standard library. But it is
> purely additive, so it should wait until after Phase 1.
>
> - David
>
> Sent from my iPad
>
> On 2 Sep 2016, at 18:55, 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
>
> _______________________________________________
> 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/5466d413/attachment.html>


More information about the swift-evolution mailing list