<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}

h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}

h1 {
        color: #000000;
        font-size: 28pt;
}

h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}

h3 {
        font-size: 18px;
}

h4 {
        font-size: 16px;
}

h5 {
        font-size: 14px;
}

h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}

hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
    display: inherit;
}

p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}

a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}

#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}

button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}

code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}

code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}

pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}

pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}

#ws { background-color: #f8f8f8; }


.bloop_markdown table {
border-collapse: collapse;  
font-family: Helvetica, arial, freesans, clean, sans-serif;  
color: rgb(51, 51, 51);  
font-size: 15px; line-height: 25px;
padding: 0; }

.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
     
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }

.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }

.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }

.bloop_markdown blockquote{
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

code, pre, #ws, #message {
    word-break: normal;
    word-wrap: normal;
}

hr {
    display: inherit;
}

.bloop_markdown :first-child {
    -webkit-margin-before: 0;
}

code, pre, #ws, #message {
    font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}


.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><blockquote>
<p>what if OneOf&lt;A, A&gt;?</p>

<p>duplicate variable compile warning?</p>
</blockquote>

<p>I already answered that question:</p>

<blockquote>
<blockquote>
<p>For example:</p>

<p>typealias ABC = A | B | C</p>

<p>typealias ABCD = ABC | D</p>

<p>we just use an existed type ABC to construct ABCD</p>

<p>But how about generic wrap?</p>
</blockquote>

<p>Bikeshedding:</p>

<pre><code class="swift">// we generate the boundary with `A | B` or directly OneOf&lt;A, B&gt;
enum OneOf&lt;...T&gt; {

  ...case $#(T)

  // Bikeshedding variadic enum casses:
  // we might need an index to set the value?
  init(index: Int, value: T) {
       
      self = .$index(value)
  }
}

/// Usage:
/// A | B&nbsp;| C == OneOf&lt;A, B, C&gt;
func |&lt;T, U&gt;(_: T.Type, _: U.Type) -&gt; OneOf&lt;T, U&gt;.Type {
   
  // I also use the proposal to remove `.self` magic here
  return OneOf&lt;T, U&gt;
}

// Here is how to merge OneOf into a single dimension
func |&lt;...T, U&gt;(_: OneOf&lt;...T&gt;.Type, _: U.Type) -&gt; OneOf&lt;...T, U&gt;.Type {
   
  // Copy and merge types into the new `OneOf` type
  return OneOf&lt;...T, U&gt;
}

func |&lt;T, ...U&gt;(_: T.Type, _: OneOf&lt;...U&gt;.Type) -&gt; OneOf&lt;T, ...U&gt;.Type {
   
  // Copy and merge types into the new `OneOf` type
  return OneOf&lt;T, ...U&gt;
}

func |&lt;...T, ...U&gt;(_: OneOf&lt;...T&gt;.Type, _: OneOf&lt;...U&gt;.Type) -&gt; OneOf&lt;...T, ...U&gt;.Type {
   
  // Copy and merge types into the new `OneOf` type
  return OneOf&lt;...T, ...U&gt;
}
</code></pre>

<p>Your example will become:</p>

<pre><code class="swift">typealias ABC = A | B | C // or OneOf&lt;A, B, C&gt;
typealias ABCD = ABC | D // merging lhs OneOf with D to OneOf&lt;A, B, C, D&gt;
</code></pre>

<p>Mission accomplished.</p>

<p><strong>Again this is not a true union type because <code>String | String</code> != <code>String</code></strong></p>
</blockquote>

<p>You’d get a OneOf enum with both first and second case as <code>A</code>. You still can distinguish them by the indexed label.</p>

<pre><code class="swift">let test = OneOf&lt;A, A&gt;.init(index: 0, value: A())

switch test {
     
    case .$1(let value)
        // do something
             
    case .$2(let value)
        // do something
}
</code></pre>

<p>Again this is all bikeshedding of variadic generics and variadic enums!</p>

<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1467379460018212096" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 1. Juli 2016 um 11:08:40, Cao Jiannan via swift-evolution (<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div></div><div>



<title></title>


<div class=""><br class=""></div>
<div class=""><br class=""></div>
<div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<div class="">
<div class="">Hi all,</div>
<div class=""><br class=""></div>
<div class="">I'm now officially proposal the union type feature
for Swift. Please see:</div>
<div class=""><br class=""></div>
<br class="Apple-interchange-newline">
<a href="https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md" class="">https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md</a></div>
<div class="">
<h2 class="" 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);">
Introduction</h2>
<p class="" 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);">
Add union type grammar, represents the type which is one of other
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; background-color: rgb(255, 255, 255);">
<pre class="" style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; 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;"><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> stringOrURL: <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);">|</span> URL <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</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><a href="https://www.apple.com/" class="">https://www.apple.com</a><span class="pl-pds" style="box-sizing: border-box;">"</span></span></pre></div>
<div class=""><br class=""></div>
<div class=""><br class=""></div>
<div class="">I would be thankful if someone support this idea and
give some advice. Thanks!</div>
<div class=""><br class=""></div>
<div class=""><br class=""></div>
<div class="">--</div>
</div>
<div class="">Jiannan</div>
</div>
<br class="">


_______________________________________________<br>swift-evolution mailing list<br>swift-evolution@swift.org<br>https://lists.swift.org/mailman/listinfo/swift-evolution<br></div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>