> On Mar 15, 2017, at 12:40 PM, Nate Cook via swift-evolution
> <[email protected]> wrote:
>
> Hi Nick,
>
> I think this might have come up in an earlier thread, but clamped(to:) with a
> half-open range argument brings up the question of how to clamp to an empty
> range. As proposed, the implementation of this method would result in an
> error when passed an empty range:
>
> foo.clamped(to: 0..<0)
> // fatal error: Can't form Range with upperBound < lowerBound
Ahh, good catch! The implementation ought to add something like:
guard !range.isEmpty else { fatalError("Cannot clamp to an empty range") }
I don’t think that this is problematic. Ideally we could express in the
type-system that the range must not be empty, but it is definitely not
worthwhile creating a `NonemptyRange` type.
>
> Is that the desired behavior? Providing documentation for both new methods
> would help make it clear what the expected functionality is.
>
> Thanks!
> Nate
>
>
>> On Mar 13, 2017, at 9:16 PM, Nicholas Maccharoli via swift-evolution
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>> Swift-Evolution,
>>
>> After considering the indispensable feedback from the community here is a
>> slightly more polished draft.
>>
>> If anyone is interested the draft can be downloaded here:
>> https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md>
>>
>> Thank you so much,
>>
>> - Nick
>>
>>
>> Add clamp(to:) to the stdlib
>>
>> Proposal: SE-NNNN
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-filename.md>
>> Authors: Nicholas Maccharoli <https://github.com/Nirma>
>> Review Manager: TBD
>> Status: Awaiting review
>> During the review process, add the following fields as needed:
>>
>> Decision Notes: Rationale
>> <https://lists.swift.org/pipermail/swift-evolution/>, Additional Commentary
>> <https://lists.swift.org/pipermail/swift-evolution/>
>> Bugs: SR-NNNN <https://bugs.swift.org/browse/SR-NNNN>, SR-MMMM
>> <https://bugs.swift.org/browse/SR-MMMM>
>> Previous Revision: 1
>> <https://github.com/apple/swift-evolution/blob/...commit-ID.../proposals/NNNN-filename.md>
>> Previous Proposal: SE-XXXX
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/XXXX-filename.md>
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#introduction>Introduction
>>
>> This proposal aims to add functionality to the standard library for clamping
>> a value to a ClosedRange. The proposed function would allow the user to
>> specify a range to clamp a value to where if the value fell within the
>> range, the value would be returned as is, if the value being clamped
>> exceeded the upper or lower bound in value the value of the boundary the
>> value exceeded would be returned.
>>
>> Swift-evolution thread: Add a clamp function to Algorithm.swift
>> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20170306/thread.html#33674>
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#motivation>Motivation
>>
>> There have been quite a few times in my professional and personal
>> programming life where I reached for a clampedfunction and was disappointed
>> it was not part of the standard library.
>>
>> Having functionality like clamped(to:) added to Comparable as a protocol
>> extension would benefit users of the Swift language who wish to guarantee
>> that a value is kept within bounds.
>>
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#proposed-solution>Proposed
>> solution
>>
>> The solution proposed is simply that there be a clamped(to:) function added
>> to the Swift Standard Library. The function would behave much like its name
>> describes.
>>
>> Given a clamped(to:) function existed it could be called in the following
>> way, yielding the results in the adjacent comments:
>>
>> let foo = 100
>>
>> // Closed range variant
>>
>> foo.clamped(to: 0...50) // 50
>> foo.clamped(to: 200...300) // 200
>> foo.clamped(to: 0...150) // 100
>>
>> // Half-Open range variant
>>
>> foo.clamped(to: 0..<50) // 49
>> foo.clamped(to: 200..<300) // 200
>> foo.clamped(to: 0..<150) // 100
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#detailed-design>Detailed
>> design
>>
>> The implementation of clamped(to:) that is being proposed is composed of two
>> protocol extensions; one protocol extension on Comparable and another on
>> Strideable.
>>
>> The implementation for clamped(to:) as an extension to Comparable accepting
>> a range of type ClosedRange<Self>would look like the following:
>>
>> extension Comparable {
>> func clamped(to range: ClosedRange<Self>) -> Self {
>> if self > range.upperBound {
>> return range.upperBound
>> } else if self < range.lowerBound {
>> return range.lowerBound
>> } else {
>> return self
>> }
>> }
>> }
>> The implementation of clamped(to:) as an extension on Strideable would be
>> confined to cases where the stride is of type Integer. The implementation
>> would be as follows:
>>
>> extension Strideable where Stride: Integer {
>> func clamped(to range: Range<Self>) -> Self {
>> return clamped(to: range.lowerBound...(range.upperBound - 1))
>> }
>> }
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#source-compatibility>Source
>> compatibility
>>
>> This feature is purely additive; it has no effect on source compatibility.
>>
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#effect-on-abi-stability>Effect
>> on ABI stability
>>
>> This feature is purely additive; it has no effect on ABI stability.
>>
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#effect-on-api-resilience>Effect
>> on API resilience
>>
>> The proposed function would become part of the API but purely additive.
>>
>>
>> <https://github.com/Nirma/swift-evolution/blob/clamp_function/proposals/NNNN-add-clamp-function.md#alternatives-considered>Alternatives
>> considered
>>
>> Aside from doing nothing, no other alternatives were considered.
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution