<div dir="ltr">On Tue, Oct 4, 2016 at 2:07 AM, Adrian Zubarev via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div class="gmail-m_-3783399058596069655bloop_markdown"><p>There are still a lot of open questions here to solve.</p>

<ul>
<li>How to statically guarantee the uniqueness + immutability of the <code>hashValue</code>s?

<ul>
<li><p>Should we allow only the usage of an initializer?</p></li>
<li><p>Sometimes an init might be not enough and you’d wish you can use custom function which would return the same value for the same input you provide.</p>

<pre><code class="gmail-m_-3783399058596069655swift">struct A : Hashable { … }
         
enum B : A {
    case a: A(someLabel: someInput)
    case b: createAFunction()
    case c: createA(with: someOtherInput)
}
</code></pre></li>
<li><p>Should we allow only value types here or how do we handle reference types?</p></li>
</ul></li>
</ul>

<p>A protocol to create custom enum-like types would be really interesting and useful. Instead of <code>switch</code> checking the value that conforms to that new protocol directly I’d suggest that we need some kind of an interface to satisfy and enable the enum-like <code>switch</code> usage (or maybe I’m totally wrong here).</p>

<pre><code class="gmail-m_-3783399058596069655swift">protocol SomeFancyName : RawRepresentable {
    var interface: SomeType { get }
}

struct C : SomeFancyName { /* implement */ }

let c = C.someCase

switch c.interface {
     
case .someCase:
    // Handle
     
case .someOtherCase:
    // Handle
     
// No need for `default` when all cases are present
}
</code></pre>

<p>I couldn’t think up a simple and elegant model for such a protocol. Any suggestions is welcome.</p>

<ul>
<li><p>Does the core team and the community feel this might have some potential future?</p></li>
<li><p>Does this impact the ABI somehow?</p></li></ul></div></div></blockquote><div><br></div><div>A protocol wouldn&#39;t work, I don&#39;t think, because classes can be extended and so exhaustiveness can&#39;t be guaranteed, and there is no syntax to limit protocols only to structs and final classes.</div><div><br></div><div>While I&#39;ve sometimes wished RawRepresentable could be used with more Hashable types, for your motivating problem, you can already get pretty close to your desired end goal:</div><div><br></div><div>```</div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">protocol</span><span style="font-variant-ligatures:no-common-ligatures"> _RawRepresentable : </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">RawRepresentable</span><span style="font-variant-ligatures:no-common-ligatures"> { }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">extension</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">_RawRepresentable</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">where</span><span style="font-variant-ligatures:no-common-ligatures"> RawValue : Hashable {</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">static</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">func</span><span style="font-variant-ligatures:no-common-ligatures"> ~= (lhs: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">Self</span><span style="font-variant-ligatures:no-common-ligatures">, rhs: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">Self</span><span style="font-variant-ligatures:no-common-ligatures">) -&gt; </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Bool</span><span style="font-variant-ligatures:no-common-ligatures"> {</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(112,61,170)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">    </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">return</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> lhs.</span><span style="font-variant-ligatures:no-common-ligatures">rawValue</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(62,30,129)">==</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> rhs.</span><span style="font-variant-ligatures:no-common-ligatures">rawValue</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(79,129,135)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">struct</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> Example : </span><span style="font-variant-ligatures:no-common-ligatures">_RawRepresentable</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> {</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">let</span><span style="font-variant-ligatures:no-common-ligatures"> rawValue: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">String</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">init</span><span style="font-variant-ligatures:no-common-ligatures">?(rawValue: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">String</span><span style="font-variant-ligatures:no-common-ligatures">) {</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">    </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">switch</span><span style="font-variant-ligatures:no-common-ligatures"> rawValue {</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(209,47,27)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">    </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">case</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">&quot;foo&quot;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">, </span><span style="font-variant-ligatures:no-common-ligatures">&quot;bar&quot;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">:</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">      </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">self</span><span style="font-variant-ligatures:no-common-ligatures">.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">rawValue</span><span style="font-variant-ligatures:no-common-ligatures"> = rawValue</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">    </span><span style="font-variant-ligatures:no-common-ligatures">default</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">:</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">      </span><span style="font-variant-ligatures:no-common-ligatures">return</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">nil</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">    }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  }</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">static</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">let</span><span style="font-variant-ligatures:no-common-ligatures"> foo = </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">Example</span><span style="font-variant-ligatures:no-common-ligatures">(rawValue: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)">&quot;foo&quot;</span><span style="font-variant-ligatures:no-common-ligatures">)!</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">static</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">let</span><span style="font-variant-ligatures:no-common-ligatures"> bar = </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">Example</span><span style="font-variant-ligatures:no-common-ligatures">(rawValue: </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)">&quot;bar&quot;</span><span style="font-variant-ligatures:no-common-ligatures">)!</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(79,129,135)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">let</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> ex = </span><span style="font-variant-ligatures:no-common-ligatures">Example</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">.</span><span style="font-variant-ligatures:no-common-ligatures">foo</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0);min-height:13px"><span style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">switch</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(79,129,135)">ex</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> {</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(79,129,135)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">case</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">Example</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">.</span><span style="font-variant-ligatures:no-common-ligatures">foo</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">: // the syntax could be made more intelligent here to allow `.foo`</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(209,47,27)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(62,30,129)">print</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">(</span><span style="font-variant-ligatures:no-common-ligatures">&quot;Foo!&quot;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">)</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(79,129,135)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">case</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)"> </span><span style="font-variant-ligatures:no-common-ligatures">Example</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">.</span><span style="font-variant-ligatures:no-common-ligatures">bar</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">:</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(209,47,27)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">  </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(62,30,129)">print</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">(</span><span style="font-variant-ligatures:no-common-ligatures">&quot;Bar!&quot;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">)</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(186,45,162)"><span style="font-variant-ligatures:no-common-ligatures">default</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">:</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(62,30,129)"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(0,0,0)">  </span><span style="font-variant-ligatures:no-common-ligatures">fatalError()</span></p>
<p style="margin:0px;font-size:11px;line-height:normal;font-family:menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p></div><div>```</div><div><br></div><div>As in the other thread, I don&#39;t understand your unwillingness to writing a default case. It is a very practical solution, and it tells your reader that your custom type is really meant to be switched over exhaustively. In fact, it does so at the point of use much more clearly than a protocol conformance that would not be nearly as obvious to the reader of the code.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><div class="gmail-m_-3783399058596069655bloop_original_html"><span class="gmail-"><div id="gmail-m_-3783399058596069655bloop_customfont" style="font-family:helvetica,arial;font-size:13px;color:rgb(0,0,0);margin:0px"></div> <br> <div id="gmail-m_-3783399058596069655bloop_sign_1475563657807241984" class="gmail-m_-3783399058596069655bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div> <br></span><div><div class="gmail-h5"><p class="gmail-m_-3783399058596069655airmail_on">Am 4. Oktober 2016 um 08:25:24, Rien (<a href="mailto:rien@balancingrock.nl" target="_blank">rien@balancingrock.nl</a>) schrieb:</p> <blockquote type="cite" class="gmail-m_-3783399058596069655clean_bq"><span><div><div></div><div>+1.
<br>
<br>I have several cases where I cannot use enums, this proposal would solve that.
<br>
<br>
<br>&gt; On 03 Oct 2016, at 21:53, Adrian Zubarev via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:
<br>&gt;  
<br>&gt; I made a typo in my previous post.
<br>&gt;  
<br>&gt; Bikeshdding with correct types:
<br>&gt;  
<br>&gt; struct A : Hashable { /* implement everything */ }
<br>&gt;  
<br>&gt; // Variant 1:
<br>&gt; enum Test : A {
<br>&gt;     case something = A(value: &quot;something&quot;)
<br>&gt;     case nothing = A(value: &quot;nothing&quot;)
<br>&gt; }
<br>&gt;  
<br>&gt; // Variant 2:
<br>&gt;  
<br>&gt; protocol SomeFancyName : RawRepresentable { … }
<br>&gt;  
<br>&gt; struct Test : SomeFancyName {
<br>&gt;        
<br>&gt;     let rawValue: A
<br>&gt;     init?(rawValue: A) {
<br>&gt;             // Implement + reject unwanted `A`s    
<br>&gt;     }
<br>&gt;        
<br>&gt;     static let something = Test(rawValue: A(value: &quot;something&quot;))
<br>&gt;     static let nothing = Test(rawValue: A(value: &quot;nothing&quot;))
<br>&gt; }
<br>&gt;  
<br>&gt; let value = Test.something
<br>&gt;  
<br>&gt; switch value {
<br>&gt;        
<br>&gt; case .something:
<br>&gt;     // handle
<br>&gt;        
<br>&gt; case .nothing:
<br>&gt;     // handle
<br>&gt;        
<br>&gt; // Because of `SomeFancyName` the switch can use enum-like pattern matching + does not need the `default` case when all cases are present
<br>&gt; }
<br>&gt;  
<br>&gt;  
<br>&gt;  
<br>&gt;  
<br>&gt; --  
<br>&gt; Adrian Zubarev
<br>&gt; Sent with Airmail
<br>&gt;  
<br>&gt; Am 3. Oktober 2016 um 21:50:07, Adrian Zubarev (<a href="mailto:adrian.zubarev@devandartist.com" target="_blank">adrian.zubarev@devandartist.<wbr>com</a>) schrieb:
<br>&gt;  
<br>&gt;&gt; Hi there,
<br>&gt;&gt;  
<br>&gt;&gt; I’m interested if this idea has some potential future in Swift or not.
<br>&gt;&gt;  
<br>&gt;&gt; Currently RawRepresentable enums accept only a subset of literal types like String, Character and the Integer family (enum Name : String { … }).
<br>&gt;&gt;  
<br>&gt;&gt; Sometimes this is not enough for my use-case and I wish I could feed my enums with other Hashable types!
<br>&gt;&gt;  
<br>&gt;&gt; As a workaround I can create a custom struct or even a class and conform it to RawRepresentable and fake an enum with some static variables (similar to what is done with OptionSet types).
<br>&gt;&gt;  
<br>&gt;&gt; The problem there is that I cannot use the same switch pattern matching like with enums. I’d wish either enums could accept Hashable types (maybe with some restriction) or the existence on a protocol to build custom enum-like types with strucs/classes and use the same switch pattern matching.
<br>&gt;&gt;  
<br>&gt;&gt; struct A : Hashable { /* implement everything */ }
<br>&gt;&gt;  
<br>&gt;&gt; // Variant 1:
<br>&gt;&gt; enum Test : A {
<br>&gt;&gt;     case something = A(rawValue: A(value: &quot;something&quot;))
<br>&gt;&gt;     case nothing = A(rawValue: A(value: &quot;nothing&quot;))    
<br>&gt;&gt; }
<br>&gt;&gt;  
<br>&gt;&gt; // Variant 2:
<br>&gt;&gt;  
<br>&gt;&gt; protocol SomeFancyName : RawRepresentable { … }
<br>&gt;&gt;  
<br>&gt;&gt; struct Test : SomeFancyName {
<br>&gt;&gt;        
<br>&gt;&gt;     let rawValue: A
<br>&gt;&gt;     init?(rawValue: A) {
<br>&gt;&gt;             // Implement + reject unwanted `A`s    
<br>&gt;&gt;     }
<br>&gt;&gt;        
<br>&gt;&gt;     static let something = A(rawValue: A(value: &quot;something&quot;))
<br>&gt;&gt;     static let nothing = A(rawValue: A(value: &quot;nothing&quot;))
<br>&gt;&gt; }
<br>&gt;&gt;  
<br>&gt;&gt; let value = Test.something
<br>&gt;&gt;  
<br>&gt;&gt; switch value {
<br>&gt;&gt;        
<br>&gt;&gt; case .something:
<br>&gt;&gt;     // handle
<br>&gt;&gt;        
<br>&gt;&gt; case .nothing:
<br>&gt;&gt;     // handle
<br>&gt;&gt;        
<br>&gt;&gt; // Because of `SomeFancyName` the switch can use enum-like pattern matching + does not need the `default` case when all cases are present
<br>&gt;&gt; }
<br>&gt;&gt;  
<br>&gt;&gt;  
<br>&gt;&gt;  
<br>&gt;&gt; --  
<br>&gt;&gt; Adrian Zubarev
<br>&gt;&gt; Sent with Airmail
<br>&gt;  
<br>&gt; ______________________________<wbr>_________________
<br>&gt; swift-evolution mailing list
<br>&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>
<br>&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a>
<br>
<br></div></div></span></blockquote></div></div></div><div class="gmail-m_-3783399058596069655bloop_markdown"><p></p></div></div><br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div></div>