Hi Gwendal, these are use cases for using indices as unordered references which 
certainly are useful. I was looking for use cases depending on the order 
exposed by Sequence, specifically use cases for elementsEqual.

-Thorsten 

> Am 17.10.2017 um 09:03 schrieb Gwendal Roué <gwendal.r...@gmail.com>:
> 
>>> Modeling is, by definition, imperfect. The question is, what imperfect 
>>> model is most useful _to Swift_. The idea is that conforming Set and 
>>> Dictionary to Collection is on balance more useful than not doing so; that 
>>> having two protocols, Sequence and Collection, is on balance more useful 
>>> than having one or three, and that the set of semantic guarantees of 
>>> Collection are on balance more useful than other possible sets of semantic 
>>> guarantees.
>> 
>> That is your idea which is disputed and underlined with arguments whereas 
>> you keep repeating that Set behaves as dictated by its conformance without 
>> giving use cases why this should be useful.
> 
> Hello,
> 
> You can't *control* the ordering of a set or a dictionary, but you can still 
> *rely* on it.
> 
> For example, to find a key in a dictionary that is associated a given value, 
> you can rely on the fact that a dictionary's order is guaranteed to be 
> stable, and that on top of that its indexes can address the dictionary 
> itself, but also its keys and values sequences. The code below has no bug;
> 
> let dict = ["a": "foo", "b": "bar", "c": "needle"]
> 
> // Find a key associated with "needle"
> if let index = dict.values.index(of: "needle") {
>     let key = dict.keys[index]
>     print(key) // prints "c"
> }
> 
> It's more difficult to find a use case for set's ordering and indexes. But 
> since you ask, here is an example. The goal is to find any element which is 
> not equal to another value, in any collection:
> 
> extension Collection where Element: Equatable {
>     /// Returns any element which is not equal to the given element
>     func anyElement(notEqualTo v: Element) -> Element? {
>         if let i = index(of: v) {
>             if let alt = index(i, offsetBy: 1, limitedBy: endIndex), alt != 
> endIndex {
>                 return self[alt]
>             }
>             if i == startIndex {
>                 return nil
>             }
>             return first
>         }
>         return first
>     }
> }
> 
> Set([1, 2, 3]).anyElement(notEqualTo: 1) // 2 or 3
> Set([1, 2]).anyElement(notEqualTo: 1)    // 2
> Set([1]).anyElement(notEqualTo: 1)       // nil
> Set([2]).anyElement(notEqualTo: 1)       // 2
> Set([]).anyElement(notEqualTo: 1)        // nil
> 
> That *can* be useful, isn't it?
> 
> Gwendal Roué
> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to