<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="">The following proposal apparently was not considered widely enough discussed since it was “buried” in a 400 message discussion thread that meandered before coming to the final draft.</div><div class=""><br class=""></div><div class="">As such, to have it reopened — I am restarting the discussion in a new thread to ensure wider discussion.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><a href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md" class="">https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md</a></div><div class=""><br class=""></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'; widows: 1; margin-top: 0px !important;" class="">Pattern Matching Partial Function</h1><ul style="box-sizing: border-box; padding: 0px 0px 0px 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; line-height: 25.6px; widows: 1;" class=""><li style="box-sizing: border-box;" class="">Proposal:&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md" style="box-sizing: border-box; color: rgb(64, 120, 192); text-decoration: none;" class="">SE-0024</a></li><li style="box-sizing: border-box;" class="">Author(s):&nbsp;<a href="https://github.com/cacruden" style="box-sizing: border-box; color: rgb(64, 120, 192); text-decoration: none;" class="">Craig Cruden</a></li><li style="box-sizing: border-box;" class="">Status:&nbsp;<strong style="box-sizing: border-box;" class="">Awaiting review</strong></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'; widows: 1;" class=""><a id="user-content-introduction" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#introduction" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></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; line-height: 25.6px; widows: 1;" class="">Provide the ability for defining partial functions using familiar&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;pattern matching syntax. A new global&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">match</code>function would use this to provide switch-expression functionality for all types. This function would accept a value and a closure containing the&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;partial functions. Combining&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;partial functions in a closure must always be exhaustive providing a total function. Functions on arrays, dictionaries or other collections such as&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">reduce</code>&nbsp;or<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">filter</code>, or rather all higher order functions taking a unary function as argument, would accept these closures as they are just normal closures.</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; line-height: 25.6px; widows: 1;" class="">Swift-evolution thread:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160111/006194.html" style="box-sizing: border-box; color: rgb(64, 120, 192); text-decoration: none;" class="">ternary operator ?: suggestion</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'; widows: 1;" class=""><a id="user-content-motivation" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#motivation" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></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; line-height: 25.6px; widows: 1;" class="">There is currently no elegant methodology within Swift closures to conditionally map values. This type of scenario occurs often in Swift code and this proposal provides a generalized and flexible solution. Anywhere a closure is used the developer will also be able to conditionally execute multiple partial closures depending on the mapping of values. The syntax proposed makes Swift code easier to read, easier to write, and less issue prone.</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; line-height: 25.6px; widows: 1;" class="">The following example where a string is mapped to an enum case is indicative of the problem:</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> str:<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">switch</span> state {
<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Cold: 
    str <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> “Too cold”
<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Hot: 
    str <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> “Too hot”
<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">default</span>: 
    str <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> “Just <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">right</span>”
}</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; line-height: 25.6px; widows: 1;" class="">The syntax above does not elegantly express our intent as the&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">switch</code>&nbsp;statement is designed for “flow control”. Aside from being limited to choosing a single value our example requires no “flow control”. In addition, the ability to execute unrelated statements inside the switch statement makes it harder prove correctness of the algorithm.</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; line-height: 25.6px; widows: 1;" class="">Alternatives to using&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">switch</code>&nbsp;do exist but are unsatisfactory. A&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">Dictionary</code>, for example, increases cognitive load (i.e. requires&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">Hashable</code>&nbsp;keys and returns an optional). This makes it less clear as to what function is being performed.<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">Dictionary</code>&nbsp;also lacks exhautiveness or uniqueness checks which may result in unexpected runtime exceptions.</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; line-height: 25.6px; widows: 1;" class="">This proposal provides a simple mechanism which covers many different types of scenarios. It may be used where the ideal solution is a&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">switch</code>&nbsp;expression. It may also be used to provide a way of simply mapping conditionally between multiple values in two related but different domains. In addition, it can be used in combination with other functions such as&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">reduce</code>and&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">filter</code>&nbsp;where the logic is partially conditional.</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; line-height: 25.6px; widows: 1;" class="">The syntax is based on familiar&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;clauses common to switch statements which may be used in functions such as&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">map</code>,&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">filter</code>,&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">reduce</code>. This makes it easy for the developer to remember and understand.</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'; widows: 1;" class=""><a id="user-content-proposed-solution" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#proposed-solution" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></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; line-height: 25.6px; widows: 1;" class="">Any function which accepts a closure would also be able to accept a closure composed of partial functions defined using<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;syntax used in switch-case. Each&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>&nbsp;or&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>is considered a partial function since it defines the closure for a subset of values.</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">public</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">enum</span> Trade {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Buy(quantity: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>, price: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Sell(quantity: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>, price: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> commissions <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> trades<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">map</span> {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Buy(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> price) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <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);">10000</span>:
        <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> vipCommissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> calculateCommissionRate(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">...</span>)
        quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> vipCommissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Buy(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> price):
        <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> commissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> calculateCommissionRate(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">...</span>)
        quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> commissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Sell(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> price) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <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);">10000</span>:
        <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> vipCommissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> calculateCommissionRate(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">...</span>)
        quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> vipCommissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Sell(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> price):
        <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> commissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> calculateCommissionRate(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">...</span>)
        quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> commissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span>
}      </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; line-height: 25.6px; widows: 1;" class="">Each of the case clauses represent a partial closure / partial function. As with a total closure the case result may be specified with the optional&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">return</code>&nbsp;clause. For example:</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Buy(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> price) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">where</span> quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <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);">10000</span>:
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> vipCommissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> calculateCommissionRate(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">...</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">return</span> quantity <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> price <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> vipCommissionRate <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">/</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">100</span></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; line-height: 25.6px; widows: 1;" class="">Alternative grammar&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;which is a specialized version that can be used for the simplest and the most consise use case. If the use case is a simple definition of mapping of values then&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>&nbsp;can be used to define multiple case clauses.&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>&nbsp;clause may not be used with a&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">where</code>&nbsp;clause. The purpose of allowing&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>&nbsp;as syntatic sugar for multiple&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>&nbsp;clauses is to allow a less verbose option for use cases where the developer would use a multi-case ternary expression.</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> col <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> [<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">1</span>,<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>,<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">7</span>,<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">9</span>]

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> newCol <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> col<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">map</span> {
    cases <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">1</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>one<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">2</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>two<span class="pl-pds" style="box-sizing: border-box;">"</span></span>,   <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">3</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>three<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">4</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>four<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>five<span class="pl-pds" style="box-sizing: border-box;">"</span></span>,
          <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">6</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>six<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">7</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>seven<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">8</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>eight<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">9</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>nine<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>zero<span class="pl-pds" style="box-sizing: border-box;">"</span></span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">default</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span><span class="pl-pds" style="box-sizing: border-box;">"</span></span>
}</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; line-height: 25.6px; widows: 1;" class="">The following global&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">match</code>&nbsp;function would provide switch-expression functionality to all types:</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><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);">match</span>&lt;T,U&gt;(x: T, <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">@noescape</span> mapping: T <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> U) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">-&gt;</span> U {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">return</span> mapping(x)
}</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; line-height: 25.6px; widows: 1;" class="">The&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">match</code>&nbsp;function would be used similar to the following:</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> n <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> s <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> match(n) {
    cases <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">1</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>one<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">2</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>two<span class="pl-pds" style="box-sizing: border-box;">"</span></span>,   <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">3</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>three<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">4</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>four<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>five<span class="pl-pds" style="box-sizing: border-box;">"</span></span>,
          <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">6</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>six<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">7</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>seven<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">8</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>eight<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">9</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>nine<span class="pl-pds" style="box-sizing: border-box;">"</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span>zero<span class="pl-pds" style="box-sizing: border-box;">"</span></span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">default</span>: <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span><span class="pl-pds" style="box-sizing: border-box;">"</span></span>
}</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; line-height: 25.6px; widows: 1;" class="">Functions such as&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">reduce</code>&nbsp;that receive two or more values must be enclosed in brackets&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">(x, y)</code>&nbsp;to otherwise the parser would likely have trouble distinquishing between comma delimited lists of values which are currently allowed as a single case.</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">public</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">enum</span> Troy {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Pound(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Ounce(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Pennyweight(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Grain(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> weightTroy <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> [Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pound(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>), Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Ounce(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">4</span>), Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pennyweight(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">6</span>), Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Grain(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">9</span>)]

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> weightKg <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> weightTroy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">reduce</span>(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">00</span>) {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pound(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)):
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">373</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Ounce(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)):
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">031103</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pennyweight(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)):
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">001555</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Grain(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)):
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0000648</span>
}</pre></div><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'; widows: 1;" class=""><a id="user-content-detailed-design" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#detailed-design" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Detailed design</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; line-height: 25.6px; widows: 1;" class="">Any function which accepts a closure would also be able to accept a closure composed of partial functions defined using<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;syntax used in switch-case. Each&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>&nbsp;or&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>is considered a partial function since it defines the closure for a subset of values.</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; line-height: 25.6px; widows: 1;" class=""><strong style="box-sizing: border-box;" class="">GRAMMAR OF A CLOSURE COMPOSED OF PARTIAL FUNCTIONS</strong></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; line-height: 25.6px; widows: 1;" class="">closure → ­ {­switch-cases­<span style="box-sizing: border-box; font-size: 12px; line-height: 0; position: relative; vertical-align: baseline; bottom: -0.25em;" class="">opt</span>­}­<br style="box-sizing: border-box;" class="">switch-cases → switch-case­ switch-cases­<span style="box-sizing: border-box; font-size: 12px; line-height: 0; position: relative; vertical-align: baseline; bottom: -0.25em;" class="">opt</span><br style="box-sizing: border-box;" class="">switch-case → case-label­ statements­ | default-label­ statements<br style="box-sizing: border-box;" class="">case-label →&nbsp;<strong style="box-sizing: border-box;" class="">case­</strong>&nbsp;case-item-list­ :­<br style="box-sizing: border-box;" class="">case-item-list → pattern­ where-clause­<span style="box-sizing: border-box; font-size: 12px; line-height: 0; position: relative; vertical-align: baseline; bottom: -0.25em;" class="">opt</span>­ | pattern ­where-clause­<span style="box-sizing: border-box; font-size: 12px; line-height: 0; position: relative; vertical-align: baseline; bottom: -0.25em;" class="">opt</span>­ , ­case-item-list­<br style="box-sizing: border-box;" class="">default-label →&nbsp;<strong style="box-sizing: border-box;" class="">default</strong>­ :­<br style="box-sizing: border-box;" class="">where-clause →&nbsp;<strong style="box-sizing: border-box;" class="">where</strong>­ where-expression­<br style="box-sizing: border-box;" class="">where-expression → expression­</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; line-height: 25.6px; widows: 1;" class="">Alternative grammar&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>/<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">default</code>&nbsp;which is a specialized version that can be used for the simplest and the most consise use case. If the use case is a simple definition of mapping of values then&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>&nbsp;can be used to define multiple case clauses.&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>&nbsp;clause may not be used with a&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">where</code>&nbsp;clause. The purpose of allowing&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">cases</code>&nbsp;as syntatic sugar for multiple&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">case</code>&nbsp;clauses is to allow a less verbose option for use cases where the developer would use a multi-case ternary expression.</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; line-height: 25.6px; widows: 1;" class=""><strong style="box-sizing: border-box;" class="">NEW GRAMMAR FOR CONSISE FORM OF CASES</strong></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; line-height: 25.6px; widows: 1;" class="">closure → ­ {­switch-cases­<span style="box-sizing: border-box; font-size: 12px; line-height: 0; position: relative; vertical-align: baseline; bottom: -0.25em;" class="">opt</span>­}­<br style="box-sizing: border-box;" class="">switch-cases → cases-label­ statements­ | default-label­ statements<br style="box-sizing: border-box;" class="">cases-label →&nbsp;<strong style="box-sizing: border-box;" class="">cases</strong>­ case-item-map­<br style="box-sizing: border-box;" class="">case-item-map → pattern­ : value | pattern : value ­ , ­case-item-list­<br style="box-sizing: border-box;" class="">default-label →&nbsp;<strong style="box-sizing: border-box;" class="">default</strong>­:­</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'; widows: 1;" class=""><a id="user-content-impact-on-existing-code" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#impact-on-existing-code" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></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; line-height: 25.6px; widows: 1;" class="">This mechanism is opt-in, so existing code won't be affected by this change.</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'; widows: 1;" class=""><a id="user-content-alternatives-considered" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#alternatives-considered" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Alternatives considered</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; line-height: 25.6px; widows: 1;" class="">There were various specialized multi-ternary suggestions made as a replacement/expansion of ternary which supported more than two possible examples, but are more of a specialized case that this proposal should eliminate the need for.</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; line-height: 25.6px; widows: 1;" class="">The only other alternative considered that was a generalized version similar to the proposal above was basically the same but using&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">in</code>&nbsp;instead of&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">:</code>&nbsp;because we were defining partial functions and not a&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">switch</code>&nbsp;command. The overwelming sentiment was in favour of using exactly the same syntax as the&nbsp;<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; border-radius: 3px; background-color: rgba(0, 0, 0, 0.0392157);" class="">switch</code>&nbsp;command where possible.</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; line-height: 25.6px; widows: 1;"><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; padding: 16px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal; word-break: normal; background-color: rgb(247, 247, 247);" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">public</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">enum</span> Troy {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Pound(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Ounce(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Pennyweight(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> Grain(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Int</span>)
}

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> weightTroy <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> [Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pound(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">5</span>), Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Ounce(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">4</span>), Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pennyweight(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">6</span>), Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Grain(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">9</span>)]

<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> weightKg <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> weightTroy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">reduce</span>(<span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">00</span>) {
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pound(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span>
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">373</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Ounce(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span>
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">031103</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Pennyweight(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span>
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">001555</span>
    <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> (<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> acc, Troy<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span>Grain(<span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> quantity)) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">in</span>
        acc <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">+</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Double</span>(quantity) <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">*</span> <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0</span><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">.</span><span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">0000648</span>
    }
}</pre></div><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'; widows: 1;" class=""><a id="user-content-out-of-scope" class="anchor" href="https://github.com/cacruden/swift-evolution/blob/master/proposals/0024-Pattern-Matching-Partial-Function.md#out-of-scope" aria-hidden="true" style="box-sizing: border-box; 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" role="img" version="1.1" viewBox="0 0 16 16" width="16"><path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"></path></svg></a>Out of Scope</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; line-height: 25.6px; widows: 1; margin-bottom: 0px !important;" class="">Named partial functions are out of scope for this proposal.</div></div><div class=""><br class=""></div></body></html>