<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"><p>From my imagination, by the time we’ll have variadic generics in Swift one would assume to be able to write own variadic generic enums, but without the pitched auto wrapping feature, and probably without the index of the parameter.</p>

<p>Bikeshedding:</p>

<pre><code class="swift">enum MyEnum&lt;vector T&gt; {
     
    vector case name(T)
}
</code></pre>

<p>As for my second thought, allowing auto wrapping for every enum seems like an overkill.</p>

<p>For instance</p>

<pre><code class="swift">enum Test {
    case a(Int, Int)
    case b(Int, Int)
}

let test: Test = (0, 1) // You might really want here `b(0, 1)` and not `a(0, 1)`
</code></pre>

<p>Therefore a single <code>Wrapped</code> type that would support this auto wrapping would come handy. We already have auto wrapping for <code>Optional</code>s. <code>Wrapped</code> would be a second enum that supports this behavior.</p>

<p>Btw to make <code>Wrapped</code> not wrap a single value we’d make it like this:</p>

<pre><code class="swift">enum Wrapped&lt;T, vector U&gt; {

    case 0(T)
    vector case #(U) // make # somehow start from +1
}
</code></pre>

<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_1479820363671811072" 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 22. November 2016 um 14:00:20, Adrian Zubarev (<a href="mailto:adrian.zubarev@devandartist.com">adrian.zubarev@devandartist.com</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;"><div></div><div>




<title></title>



<div class="bloop_markdown">
<p>The problem I run into where only something similar as described
could safe me is as follows.</p>
<p>I’ve got a type <code>Document</code> which is like an ordered
dictionary of <code>[String: Value]</code> where <code>Value</code>
is my custom value type. I also have a protocol
<code>ValueConvertible</code>. Now I want to use the protocol with
<code>ExpressibleByDictionaryLiteral</code> in my Document. The
<code>Value</code> type is an enum and can also wrap a
<code>Document</code>.</p>
<p>The problem that I get here is when creating nested dictionary
literals.</p>
<pre><code class="swift">// This works just fine with only with
// `public init(dictionaryLiteral elements: (String, Value)...)`

let valueConverible: ValueConvertible = …   

let document: Document = [
    "double": 2.0,
    "string": "test",
    "document": [
        "level": 1,
        "document": ["level": 2]
    ],
    "array": [1, 2, 3],
    "bool": true,
    "int64": 42,
    "doc": [["key": 1]],
    "HERE": valueConverible.value // &lt;— get a `Value` from the computed property.
]
</code></pre>
<p>Instead I want a more natural way.</p>
<pre><code class="swift">// For // `public init(dictionaryLiteral elements: (String, ValueConvertible)…)`

let document: Document = [
    "double": 2.0,
    "string": "test",
    "document": [
        "level": 1,
        "document": ["level": 2]
    ], // Error `Dictionary` does not conform to `ValueConvertible`
    "HERE": valueConverible // It will unwrap the value inside the initializer.
]
</code></pre>
<p>Now I lost nested dictionaries. You may think that something
like <code>extension Dictionary : ValueConvertible where Key ==
String, Value == ModuleName.Value</code> will solve the issue here.
But that’s not true because a <code>Dictionary</code> as a default
type for dictionary literals is unordered, where the order from my
literal is needed to be strict.</p>
<p>Now assume that I’d have <code>Wrapped</code>.</p>
<pre><code class="swift">// For // `public init(dictionaryLiteral elements: (String, Wrapped&lt;Value, ValueConvertible&gt;)…)`

let document: Document = [
    "double": 2.0,
    "string": "test",
    "document": [
        "level": 1,
        "document": ["level": 2]
    ], // Fine, compiler is happy again. `Value` conforms to `ExpressibleByDictionaryLiteral`
    "HERE": valueConverible // fine
]
</code></pre>
<p>To me it would be enough if <code>Wrapped</code> would match
types from left to right.</p>
<pre><code class="swift">let x: Wrapped&lt;A, B, C&gt; = b // checks A -&gt; fails, checks B, fine wrap into `Wrapped&lt;A, B, C&gt;.1(b)`
</code></pre>
<p>Again even we’d allow <code>Wrapped&lt;A, A&gt;</code> the
compiler would walk from left to right during the matching process,
and never reach the <code>.1(A)</code> when wrapping an instance of
<code>A</code>. This last example is simply useless but it makes
<code>Wrapped</code> simple.</p>
<p>Basically I imagine <code>Wrapped</code> like this:</p>
<pre><code class="swift">enum Wrapped&lt;A, B&gt; {
    case 0(A)
    case 1(B)
}

enum Wrapped&lt;A, B, C&gt; {
    case 0(A)
    case 1(B)
    case 2(C)
}

enum Wrapped&lt;A, B, C, D&gt; {
    case 0(A)
    case 1(B)
    case 2(C)
    case 3(D)
}



// or simply
enum Wrapped&lt;vector T&gt; {
      
    vector case #(T)
}
</code></pre>
<p>Wouldn’t sucht a type come handy in other areas as well? Any
idea?</p>
<p>If not <code>Wrapped</code>, so what about the first pitch of
allowing implicitly wrap enums?</p>
</div>
<div class="bloop_original_html">

<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_1479815643099041024" 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 22. November 2016 um 12:49:39, Karl
(<a href="mailto:razielim@gmail.com">razielim@gmail.com</a>)
schrieb:</p>
<blockquote type="cite" class="clean_bq">
<div>
<div class="" style="color: rgb(0, 0, 0); font-family: 'helvetica Neue', helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
<span>So you want a variadic enum whose cases are bound by the
number of generic type parameters. The cases would all need to be
unique types, or your assignment syntax wouldn’t work. I’m guessing
you want to avoid the boilerplate of having several enums with
different names, so you want to merge them all in to one enum you
can use everywhere.</span></div>
<div class="" style="color: rgb(0, 0, 0); font-family: 'helvetica Neue', helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
<span><br class=""></span></div>
<div class="" style="color: rgb(0, 0, 0); font-family: 'helvetica Neue', helvetica; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">
<span>Effectively, what you end up with is indistinguishable from
an anonymous logical OR type which the core team have expressly
said they don’t want in Swift. For that reason I’m -1 on the
`Wrapped` idea.</span></div>
</div>
</blockquote>
</div>
<div class="bloop_markdown"></div>


</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>