<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I doesn’t seem that anyone noticed the previous post. &nbsp;Here’s an inline copy:</div><div class=""><br class=""></div><div class=""><h1 style="box-sizing: border-box; font-size: 2.25em; margin-right: 0px; margin-bottom: 16px; margin-left: 0px; line-height: 1.2; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255); margin-top: 0px !important;" class="">Implement a mismatch algorithm, equivalent to std::mismatch() in C++</h1><ul style="box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class=""><li style="box-sizing: border-box;" class="">Proposal:&nbsp;<a href="https://gist.github.com/CTMacUser/NNNN-filename.md" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none;" class="">SE-NNNN</a></li><li style="box-sizing: border-box;" class="">Author:&nbsp;<a href="https://github.com/CTMacUser" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); outline-width: 0px;" class="">Daryle Walker</a></li><li style="box-sizing: border-box;" class="">Status:&nbsp;<span style="box-sizing: border-box;" class="">Awaiting review</span></li><li style="box-sizing: border-box;" class="">Review manager: TBD</li></ul><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-introduction" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#introduction" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Introduction</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">This proposal is to add difference detection to Swift's standard library collections.</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Swift-evolution thread:&nbsp;<a href="http://news.gmane.org/gmane.comp.lang.swift.evolution" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none;" class="">Discussion thread topic for that proposal</a></p><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-motivation" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#motivation" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Motivation</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Finding where two similar collections differ is needed in algorithms that have different policies on handling the common part versus the uncommon parts. Similar tests already exist in the standard library: the&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">elementsEqual</code>&nbsp;methods in&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Sequence</code>&nbsp;for instance; the methods can indicate two sequences are different but not where they diverged. Flipping it around, it means that sequence equivalence, and several other sequence methods, can be expressed in terms of mismatch-finding. However, returning the divergence point means returning references to the diverging elements, which means an index, which means that collections are required instead of plain sequences.</p><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-proposed-solution" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#proposed-solution" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Proposed solution</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">The Swift standard library should provide generic implementations of the "mismatch" algorithm for forward searches on prefixes and backward searches on suffixes. The forward/prefix form is called&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">diverges(from: isEquivalent:)</code>. The backward/suffix form is called&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">converges(with: isEquivalent:)</code>, and is present only when the collection type supports bidirectional indexing. If the collection's element type conforms to&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Equatable</code>, there variants of the method(s) that drop the second argument and instead use&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">==</code>&nbsp;for the equivalency test.</p><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-detailed-design" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#detailed-design" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Detailed design</h2><h3 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-divergesfromisequivalent-and-divergesfrom" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#divergesfromisequivalent-and-divergesfrom" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: inherit; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">diverges(from:isEquivalent:)</code>&nbsp;and&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: inherit; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">diverges(from:)</code></h3><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Forward mismatching on prefixes will be added to the&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Collection</code>&nbsp;protocol requirements with a default implementation. Its variant will extend&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">Collection</code>&nbsp;with a default implementation. These methods will have the following declarations:</p><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">protocol</span> Collection {
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// existing declarations</span>

    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">/**</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Compares the collection against a given collection element-wise until either corresponding elements are no longer equivalent, using the given predicate as the equivalence test, or at least one collection reaches its end index.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        The predicate must be an equivalence relation over the elements.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter from: A collection to compare to this one.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter isEquivalent: A predicate the returns `true` if and only if its two arguments are equivalent.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - returns: A pair of indices, indicating where the two collections mismatched.  The first member is the index of the element that mismatched in this collection, the second is the index of the element that mismatched in the given collection.  If the testing stopped because the collections were of different lengths, but were equivalent until that point, then exactly one member of the tuple will be at its collection's end index.  If both tuple members are at their respective collection's end index, then the collections were equivalent.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - complexity: `min(count, from.count)` comparisons.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - throws: Whatever `isEquivalent` may throw.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">    */</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">diverges</span>&lt;PossiblePrefix: Collection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> PossiblePrefix<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">==</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element&gt;(<span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">from</span> <span class="pl-smi" style="box-sizing: border-box;">possiblePrefix</span>: PossiblePrefix, isEquivalent: (Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element, Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element) throws <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Bool</span>) rethrows -&gt; (Index, PossiblePrefix.Index)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">extension</span> Collection {
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">/**</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Compares the collection against a given collection element-wise until either corresponding elements are no longer equivalent, using the given predicate as the equivalence test, or at least one collection reaches its end index.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        The predicate must be an equivalence relation over the elements.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter from: A collection to compare to this one.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter isEquivalent: A predicate the returns `true` if and only if its two arguments are equivalent.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - returns: A pair of indices, indicating where the two collections mismatched.  The first member is the index of the element that mismatched in this collection, the second is the index of the element that mismatched in the given collection.  If the testing stopped because the collections were of different lengths, but were equivalent until that point, then exactly one member of the tuple will be at its collection's end index.  If both tuple members are at their respective collection's end index, then the collections were equivalent.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - complexity: `min(count, from.count)` comparisons.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - throws: Whatever `isEquivalent` may throw.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">    */</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">diverges</span>&lt;PossiblePrefix: Collection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> PossiblePrefix<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">==</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element&gt;(<span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">from</span> <span class="pl-smi" style="box-sizing: border-box;">possiblePrefix</span>: PossiblePrefix, isEquivalent: (Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element, Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element) throws <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Bool</span>) rethrows -&gt; (Index, PossiblePrefix.Index)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">extension</span> Collection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Equatable</span> {
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">/**</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Compares the collection against a given collection element-wise until either corresponding elements are no longer equal, or at least one collection reaches its end index.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter from: A collection to compare to this one.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - returns: A pair of indices, indicating where the two collections mismatched.  The first member is the index of the element that mismatched in this collection, the second is the index of the element that mismatched in the given collection.  If the testing stopped because the collections were of different lengths, but were equal until that point, then exactly one member of the tuple will be at its collection's end index.  If both tuple members are at their respective collection's end index, then the collections were equal.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - complexity: `min(count, from.count)` comparisons.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">    */</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">diverges</span>&lt;PossiblePrefix: Collection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> PossiblePrefix<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">==</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element&gt;(<span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">from</span> <span class="pl-smi" style="box-sizing: border-box;">possiblePrefix</span>: PossiblePrefix) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> (Index, PossiblePrefix.Index)
}</pre></div><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">I don't know if we should insist that at least one (or both) of the collections tested should be finite. I don't know if the results should be discardable.</p><h3 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.43; font-size: 1.5em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-convergeswithisequivalent-and-convergeswith" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#convergeswithisequivalent-and-convergeswith" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1.2;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: inherit; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">converges(with:isEquivalent:)</code>&nbsp;and&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: inherit; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">converges(with:)</code></h3><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Backward mismatching on suffixes will be added to the&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">BidirectionalCollection</code>&nbsp;protocol requirements with a default implementation. Its variant will extend&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; padding: 0.2em 0px; margin: 0px; background-color: rgba(0, 0, 0, 0.0392157); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;" class="">BidirectionalCollection</code>&nbsp;with a default implementation. These methods will have the following declarations:</p><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 14px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">protocol</span> BidirectionalCollection {
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">// existing declarations</span>

    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">/**</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Compares the collection against a given collection element-wise and backwards until either corresponding elements are no longer equivalent, using the given predicate as the equivalence test, or at least one collection reaches its start index.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Both collections must be finite.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        The predicate must be an equivalence relation over the elements.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter with: A collection to compare to this one.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter isEquivalent: A predicate the returns `true` if and only if its two arguments are equivalent.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - returns: A pair of indices, indicating where the two collections started to match.  The first member is the index of the element that suffix-matched in this collection, the second is the index of the element that suffix-matched in the given collection.  If the testing stopped because the collections were of different lengths, but were equivalent until that point, then exactly one member of the tuple will be at its collection's start index.  If both tuple members are at their respective collection's start index, then the collections were equivalent.  If both tuple members are at their respective collection's end index, then either the collections' last elements differ or at least one collection was empty.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - complexity: `min(count, from.count)` comparisons.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - throws: Whatever `isEquivalent` may throw.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">    */</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">converges</span>&lt;PossibleSuffix: BidirectionalCollection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> PossibleSuffix<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">==</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element&gt;(<span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">with</span> <span class="pl-smi" style="box-sizing: border-box;">possibleSuffix</span>: PossibleSuffix, isEquivalent: (Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element, Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element) throws <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Bool</span>) rethrows -&gt; (Index, PossibleSuffix.Index)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">extension</span> BidirectionalCollection {
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">/**</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Compares the collection against a given collection element-wise and backwards until either corresponding elements are no longer equivalent, using the given predicate as the equivalence test, or at least one collection reaches its start index.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Both collections must be finite.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        The predicate must be an equivalence relation over the elements.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter with: A collection to compare to this one.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter isEquivalent: A predicate the returns `true` if and only if its two arguments are equivalent.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - returns: A pair of indices, indicating where the two collections started to match.  The first member is the index of the element that suffix-matched in this collection, the second is the index of the element that suffix-matched in the given collection.  If the testing stopped because the collections were of different lengths, but were equivalent until that point, then exactly one member of the tuple will be at its collection's start index.  If both tuple members are at their respective collection's start index, then the collections were equivalent.  If both tuple members are at their respective collection's end index, then either the collections' last elements differ or at least one collection was empty.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - complexity: `min(count, from.count)` comparisons.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - throws: Whatever `isEquivalent` may throw.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">    */</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">converges</span>&lt;PossibleSuffix: BidirectionalCollection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> PossibleSuffix<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">==</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element&gt;(<span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">with</span> <span class="pl-smi" style="box-sizing: border-box;">possibleSuffix</span>: PossibleSuffix, isEquivalent: (Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element, Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element) throws <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Bool</span>) rethrows -&gt; (Index, PossibleSuffix.Index)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">extension</span> BidirectionalCollection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Equatable</span> {
    <span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">/**</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Compares the collection against a given collection element-wise and backwards until either corresponding elements are no longer equal, or at least one collection reaches its start index.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        Both collections must be finite.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - parameter with: A collection to compare to this one.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - returns: A pair of indices, indicating where the two collections started to match.  The first member is the index of the element that suffix-matched in this collection, the second is the index of the element that suffix-matched in the given collection.  If the testing stopped because the collections were of different lengths, but were equivalent until that point, then exactly one member of the tuple will be at its collection's start index.  If both tuple members are at their respective collection's start index, then the collections were equivalent.  If both tuple members are at their respective collection's end index, then either the collections' last elements differ or at least one collection was empty.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">        - complexity: `min(count, from.count)` comparisons.</span>
<span class="pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);">    */</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">func</span> <span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">converges</span>&lt;PossibleSuffix: BidirectionalCollection <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> PossibleSuffix<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">==</span> Iterator<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Element&gt;(<span class="pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">with</span> <span class="pl-smi" style="box-sizing: border-box;">possibleSuffix</span>: PossibleSuffix) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> (Index, PossibleSuffix.Index)
}</pre></div><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">I don't know if the results should be discardable.</p><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-impact-on-existing-code" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#impact-on-existing-code" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Impact on existing code</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">The comparison methods are an additive feature that doesn’t impact existing code.</p><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class=""><a id="user-content-alternatives-considered" class="anchor" href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc#alternatives-considered" aria-hidden="true" style="box-sizing: border-box; background-color: transparent; -webkit-text-decoration-skip: objects; color: rgb(64, 120, 192); text-decoration: none; display: inline-block; padding-right: 2px; margin-left: -18px; line-height: 1;"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Alternatives considered</h2><div style="box-sizing: border-box; margin-top: 0px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255); margin-bottom: 0px !important;" class="">The alternative is to not include these methods in the standard library, but the user will need to develop their custom implementation of the mismatch algorithms tailored for their needs.</div></div><div class=""><br class=""></div><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">—&nbsp;</div><div class="">Daryle Walker<br class="">Mac, Internet, and Video Game Junkie<br class="">darylew AT mac DOT com&nbsp;</div></div>
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Jul 6, 2016, at 5:01 AM, Daryle Walker &lt;<a href="mailto:darylew@mac.com" class="">darylew@mac.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I mentioned in other messages about adding permutations and combinations (probably as generators/iterators) to the standard library. &nbsp;I tried making sample implementations and a proposal, but it transitioned to adapting C++’s “is_permutation,” “next_permutation,” and “prev_permutation” instead. &nbsp;The sample implementation of “is_permutation” I saw at &lt;<a href="http://en.cppreference.com/w/cpp/algorithm/is_permutation" class="">http://en.cppreference.com/w/cpp/algorithm/is_permutation</a>&gt; involves the “mismatch” function, which we also don’t seem to have. &nbsp;Since that function seems like a small enough bite the chew, I finally made a proposal at &lt;<a href="https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc" class="">https://gist.github.com/CTMacUser/c1a0d7ac60cf827184c33e8768a23dfc</a>&gt;. &nbsp;(The Gist is currently flagged as secret.)</div><div class=""><br class=""></div><div class="">Oh, it seems that everyone here has moved on to Swift 3, and so has my third-party documentation program. &nbsp;Unfortunately, I still on non-beta code, which means Swift 2.2. &nbsp;So I took some time having to translate concepts between the versions, including new names.</div><div class=""><br class=""></div><div class="">The name “mismatch” didn’t seem Swift-y enough since it doesn’t describe what’s happening from a Swift programming perspective. &nbsp;I tried:</div><div class=""><br class=""></div><div class="">* commonPrefixUntil / commonSuffixUntil</div><div class="">* elementsEqualUntil / elementsEqualSince</div><div class="">* elementsShared(until:) / elementsShared(since:)</div><div class="">* elementsDiverge / elementsConverge</div><div class=""><br class=""></div><div class="">No, those parameters on the third one don’t make sense. &nbsp;The last one inspired me to trim the fat and just use “diverge(from:)”. &nbsp;Since we use indexes here like C++’s iterators, that was the best choice for a return type that allows the users to take the results in an inspecting manner or mutating manner. &nbsp;But Swift’s model doesn’t handle reversed collections like C++ does, so I need a separate routine for mismatching with reverse iterators, i.e. searching backwards with indexes. &nbsp;Since I used the “diverge” name for the forward search, I flipped it to “converge(with:)” for the reverse/suffix search. &nbsp;The returns aren’t used in quite the same manner since I have to avoid needing a before-the-start index.</div><div class=""><br class=""></div><div class="">A lot of the format was badly copied from the rotate/reverse proposal (&lt;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0078-rotate-algorithm.md" class="">https://github.com/apple/swift-evolution/blob/master/proposals/0078-rotate-algorithm.md</a>&gt;). &nbsp;Looking for opinions, mistakes/clean-up, anything major missing?...</div><div class=""><br class=""></div><div class="">
<div style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">—&nbsp;</div><div class="">Daryle Walker<br class="">Mac, Internet, and Video Game Junkie<br class="">darylew AT mac DOT com&nbsp;</div></div>
</div>
<br class=""></div></div></blockquote></div><br class=""></body></html>