<div dir="ltr"><div class="gmail_extra"><div><div><div dir="ltr"><div>On Wed, Dec 9, 2015 at 5:26 PM, Chris Lattner <span dir="ltr">&lt;<a href="mailto:clattner@apple.com" target="_blank">clattner@apple.com</a>&gt;</span> wrote:<br></div></div></div></div><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"><br><div><span><blockquote type="cite"><div>On Dec 9, 2015, at 5:24 PM, Jacob Bandes-Storch &lt;<a href="mailto:jtbandes@gmail.com" target="_blank">jtbandes@gmail.com</a>&gt; wrote:</div><br><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Dec 9, 2015 at 5:05 PM, Chris Lattner <span dir="ltr">&lt;<a href="mailto:clattner@apple.com" target="_blank">clattner@apple.com</a>&gt;</span> wrote:<br><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"><br><div><span><blockquote type="cite"><div>On Dec 9, 2015, at 10:19 AM, David Waite &lt;<a href="mailto:david@alkaline-solutions.com" target="_blank">david@alkaline-solutions.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div><div>There are a number of possible proposals for enhancements I see off the bat for “basic&quot; enums (without associated data):</div><div><br></div><div>1. A generated implementation of SequenceType based on declaration order</div><div>2. A second interface or extension to the enum type could supply static max and min properties when the RawValue is Comparable</div></div><div>3. For enums with a String raw value, CustomStringConvertible and Streamable might make sense as well. You would likely want CustomDebugStringConvertible to also be defined to supply the original type-based value.</div></div></div></blockquote><div><br></div></span><div>Another design point to consider: instead of making *every* enum generate the “allValues” capability, it might make sense to restrict this synthesization to enums that opt into it by conforming to a protocol.  Intentionally not the right protocol name, but perhaps:</div><div><br></div><div>enum X { A, B }  // not enumerable.</div><div>enum X : Enumerable { A, B } // has allValues and other stuff automatically generated.</div><span><font color="#888888"><div><br></div><div>-Chris</div></font></span></div></div></blockquote><div><br></div><div>And I suppose it would have to be possible to add this conformance to a pre-existing type?  You&#39;d want to be able to do &quot;extension NSTextAlignment : Enumerable {}”.  </div></div></div></div></div></blockquote><div><br></div></span><div>Yes, exactly.  This would allow it to work with C types as you suggest, as well as providing the ability to retroactively provide it for Swift enums that didn’t anticipate the need.</div><span><br><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>But I&#39;m not sure if it would work well to generate this on-demand; might work better to do it at interface-generation time, along with OptionSetType conformances, etc.</div></div></div></div></div></blockquote></span></div><br><div>I’m not sure what you mean here,</div><div><br></div><div>-Chris</div></div></blockquote></div><br></div><div class="gmail_extra">I&#39;d have to look at the code before I&#39;ll be able to ask a fully coherent question (you mentioned the same place memberwise initializers are synthesized).</div><div class="gmail_extra"><br></div><div class="gmail_extra">I was guessing that having multiple &quot;extension NSSortOptions : Enumerable {}&quot; in different modules (or different files in the same module) might cause problems, so you&#39;d have to do it only one place — i.e. NSSortOptions would either be imported as protocol&lt;OptionSetType, Enumerable&gt; or it wouldn&#39;t, with no way to change it post-hoc from user code.</div><div class="gmail_extra"><br></div></div>