<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>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>

<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_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"><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;">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.</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;"><br class=""></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;">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.</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>