<div dir="ltr">My preferences in order would be:<div><br></div><div>  1. Split out of Sequence Iterable/ForEachable (whatever the name) and have Set and Dictionary conform to this new protocol instead of Sequence. With further protocols splits made to other &#39;mixin&#39; protocols to keep the order of iteration undefined. </div><div><br></div><div>  2. Rename elementsEqual, iterableOrderEqual and change the definitions of all the order dependent methods in the &#39;collections&#39; hierarchy to explicitly say &quot;based on iteration order&quot; and to explicitly say that &quot;the method iterates over the collection to produce their result and if the collection can only iterate once then subsequent calls will cause a fatal error&quot;.</div><div><br></div><div>There is only one reason that I can see for rejecting my 1st option - it&#39;s just too much effort. I don&#39;t accept the argument of a breaking change in the true sense of the word breaking because algorithms over Set/Dictionary that rely on order are broken and there explicitly cause a compile time error for these is good. Arguing that it isn&#39;t good to deliberately break these algorithms is like saying that if there is a bug in the compiler that accepts faulty code we shouldn&#39;t fix it because that will break someones code - no a bug should be flagged.</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">  -- Howard.<br></div></div>
<br><div class="gmail_quote">On 17 October 2017 at 10:40, Jonathan Hull via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">To expand on this, Set([1,2,3,4,5]).hasPrefix([1,<wbr>2,3]) currently returns true.  But let’s say a year from now, we change Set to return an ordering based on hash values (which is entirely reasonable). Suddenly the same code may return true or false. <div><br></div><div>No guarantees will be broken by doing that, but the result has still changed because we are building on top of undefined behavior. Collection says nothing about the ordering over different builds of a program.<br><div><br></div><div>Thanks,</div><div>Jon</div><div><br></div><div><div><blockquote type="cite"><div><div class="h5"><div>On Oct 16, 2017, at 4:11 PM, Jonathan Hull via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_-4560388497046291056Apple-interchange-newline"></div></div><div><div><div class="h5"><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div><br class="m_-4560388497046291056Apple-interchange-newline">On Oct 16, 2017, at 1:05 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="m_-4560388497046291056Apple-interchange-newline"><div><div><br><div class="gmail_quote"><div dir="auto">On Mon, Oct 16, 2017 at 10:49 Jonathan Hull &lt;<a href="mailto:jhull@gbis.com" target="_blank">jhull@gbis.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On Oct 16, 2017, at 7:20 AM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="m_-4560388497046291056m_-3004557228007923799Apple-interchange-newline"><div><blockquote class="gmail_quote" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div>To start with, the one you gave as an example at the beginning of this discussion: Two sets with identical elements which have different internal storage and thus give different orderings as sequences.  You yourself have argued that the confusion around this is enough of a problem that we need to make a source-breaking change (renaming it) to warn people that the results of the ‘elementsEqual’ algorithm are undefined for sets and dictionaries.</div></div></blockquote><div dir="auto" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div dir="auto" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">No, I am arguing that the confusion about ‘elementsEqual’ is foremost a problem with its name; the result of this operation is not at all undefined for two sets but actually clearly defined: it returns true if two sets have the same elements in the same iteration order, which is a publicly observable behavior of sets (likewise dictionaries).</div></div></blockquote></div><br></div><div style="word-wrap:break-word"><div>But that iteration order is undefined and could easily change due to changes in the private/internal structure of sets/dictionaries.  Algorithms that rely on that “publicly observable behavior” (i.e. leaking of internals) will suddenly break.</div></div></blockquote><div dir="auto"><br></div><div dir="auto">And an algorithm in which such “sudden breakage” would occur is…?</div></div></div></div></blockquote><div><br></div><div>Here are a few off the top of my head:</div><div><br></div><div>func hasPrefix(Sequence)-&gt;Bool</div><div>func hasSuffix(Sequence)-&gt;Bool</div><div>func containsSubsequence(Sequence)-<wbr>&gt;Bool</div><div><br></div><div>What do these methods mean with regards to Set’s “publicly observable behavior”?</div><br><blockquote type="cite"><div><div><div class="gmail_quote"><div dir="auto"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div>You keep claiming that this bug is a feature because it is the current behavior… but that is tautological reasoning.</div><div><br></div><div>Thanks,</div><div>Jon</div></div></blockquote></div></div></div></blockquote></div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"></div></div><span class=""><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">______________________________<wbr>_________________</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">swift-evolution mailing list</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="mailto:swift-evolution@swift.org" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">swift-evolution@swift.org</a><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a></span></div></blockquote></div><br></div></div></div><br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div>