<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br>Sent from my iPhone</div><div><br>On 3 May 2017, at 02:05, Howard Lovatt via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="content-type" content="text/html; charset=utf-8"><div>My experience with languages that have generalised existential is that they are superior in many circumstances; not just for collections, e.g. I gave the example of the comparison protocol.&nbsp;</div></div></blockquote><div><br></div><div>I think generalised existential is where we want to get to, is it not?</div><br><blockquote type="cite"><div><div id="AppleMailSignature">I don't think methods called on a returned&nbsp;<span style="background-color: rgba(255, 255, 255, 0);">generalised existential have to be called via a Vtable. If the return type is Self&lt;T&gt; then the compiler can eliminate the Vtable for selfs that are value types. For selfs that are classes it would still have to use a Vtable though, because classes always use Vtables! In most cases the return type will be Self&lt;T&gt; and in most cases the Self will be a value type, so I would argue that in most cases a Vtable won't be used.&nbsp;</span><br><br>-- Howard.</div><div><br>On 2 May 2017, at 8:57 pm, Anders Ha &lt;<a href="mailto:hello@andersio.co">hello@andersio.co</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="content-type" content="text/html; charset=utf-8"><div></div><div>I would like to add that generalized existential is not really a better solution than letting the collection optionally and statically supply one. It consequentially forces all calls to the filtered collections virtual/dynamic.</div><div><br></div><div>Higher kinded type would ideally help, but we all know it is not coming anytime soon, or perhaps ever.&nbsp;</div><div><br></div><div>Regards</div><div>Anders</div><div><br>On 2 May 2017, at 08:41, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div>Howard, this is also mentioned in the generics manifesto under "Opening existentials," and it's received plentiful discussion and will surely receive more as these issues become addressed in future proposals. Let's not divert the conversation here about map and filter.<br><div class="gmail_quote"><div dir="ltr">On Mon, May 1, 2017 at 19:36 Howard Lovatt &lt;<a href="mailto:howard.lovatt@gmail.com">howard.lovatt@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Yes, I know the change I suggested involves making generalised&nbsp;<span style="font-size:12.8px">existentials</span>. I am suggesting not making *any* changes until such effort is available. I understand that this would be after Swift 4. I think the wait would be worthwhile.<div><br></div><div>As an aside: Currently one of the big issues with generalised existentials in Swift is with Self (which you can think of as a form of generic argument). Currently:</div><div><br></div>&nbsp; &nbsp; protocol Equatable {<br>&nbsp; &nbsp; &nbsp; &nbsp; static func ==(lhs: Self, rhs: Self) -&gt; Bool<div>&nbsp; &nbsp; &nbsp; &nbsp; ...<br><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; struct Int: Equatable { ... }<br>&nbsp; &nbsp; let e1: Equatable = 1<br>&nbsp; &nbsp; let e2: Equatable = 2<br>&nbsp; &nbsp; if e1 == e2 { ... } // error: e1 and e2 don't necessarily have the same dynamic type<br></div><div><br></div><div>I would replace this with:</div><div><br></div><div>&nbsp; &nbsp; protocol Equatable&lt;T&gt; { // Use T instead of Self<br>&nbsp; &nbsp; &nbsp; &nbsp; static func ==(lhs: T, rhs: T) -&gt; Bool</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ...<br><div>&nbsp; &nbsp; }<br>&nbsp; &nbsp; struct Int: Equatable&lt;Int&gt; { ... }</div><div>&nbsp; &nbsp; let e1: Equatable&lt;Int&gt; = 1<br>&nbsp; &nbsp; let e2: Equatable&lt;Int&gt; = 2<br>&nbsp; &nbsp; if e1 == e2 { ... } // No longer an error since they are both Equatable&lt;Int&gt;</div></div></div><div><br></div><div>As an aside on the aside, even better:</div><div><br></div><div><div><div>&nbsp; &nbsp; protocol Equatable&lt;T = Self&gt; { // T defaults to Self<br>&nbsp; &nbsp; &nbsp; &nbsp; static func ==(lhs: T, rhs: T) -&gt; Bool</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ...<br><div>&nbsp; &nbsp; }<br>&nbsp; &nbsp; struct Int: Equatable { ... } // T is Int, the default is Self</div><div>&nbsp; &nbsp; let e1: Equatable = 1 &nbsp;// T is Int, the default is Self<br>&nbsp; &nbsp; let e2: Equatable = 2&nbsp;// T is Int, the default is Self<br>&nbsp; &nbsp; if e1 == e2 { ... } // No longer an error since they are both Equatable&lt;Int&gt;</div></div></div></div><div><br></div><div>Everything I am suggesting is done in other languages and from my personal experience works out better.</div><div><br></div></div><div class="gmail_extra"></div><div class="gmail_extra"><br clear="all"><div><div class="m_-3826331308702640030gmail_signature" data-smartmail="gmail_signature">&nbsp; -- Howard.<br></div></div></div><div class="gmail_extra">
<br><div class="gmail_quote">On 2 May 2017 at 09:53, Xiaodi Wu <span dir="ltr">&lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Howard, take a look at the generics manifesto section on generic protocols:<br><br><a href="https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md" target="_blank">https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md</a><br><br>It explains very nicely how what you're really asking for is not generic protocols but generalized existentials. This would be nice to have, but it's clearly not happening within the next month and it wouldn't change the solution for filter, for which this proposal is the obvious fix.<br><br><div class="gmail_quote"><div><div class="m_-3826331308702640030h5"><div dir="ltr">On Mon, May 1, 2017 at 18:09 Howard Lovatt via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-3826331308702640030h5"><div dir="auto"><div><blockquote type="cite"><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px"><font color="#000000"><span style="background-color:rgba(255,255,255,0)">review of SE-0174 "Change `filter` to return an associated type"&nbsp;</span></font></p></blockquote></div></div><div dir="auto"><div><blockquote type="cite"><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px"><li style="box-sizing:border-box"><font color="#000000"><span style="background-color:rgba(255,255,255,0)">What is your evaluation of the proposal?</span></font></li></ul></blockquote>I think a change in this 'area' is valuable because currently always returning an array from collection operations is limiting. However I think this proposal feels like 'papering' over problems rather than fixing the root cause. I think it would be better to reject this and do two more adventurous proposals instead:</div><div><br></div><div>&nbsp; 1. Allow protocols to be generic, instead of associated types, so that you can write Sequence&lt;T&gt;</div><div>&nbsp; 2. Allow Self to accept a generic argument, so that you can write Self&lt;T&gt;</div><div><br></div><div>With these to, admittedly much more major changes, you can then write:</div><div><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box"><br></span></div><div><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; protocol Sequence&lt;T&gt; {</span></div><div><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; func&nbsp;</span><span style="background-color:rgba(255,255,255,0)"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="box-sizing:border-box">filter</span>(<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="box-sizing:border-box">_</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-smi" style="box-sizing:border-box">isIncluded</span>: (T)&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">throws</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">-&gt;</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">Bool</span>)&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">rethrows</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">-&gt;</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">Sequence&lt;T&gt;</span></span></div><div><span style="background-color:rgba(255,255,255,0)"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">func map&lt;M&gt;</span>(<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="box-sizing:border-box">_</span>&nbsp;mapper: (T)&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">throws</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">-&gt;</span>&nbsp;M)&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">rethrows</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">-&gt;</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">Sequence&lt;M&gt;</span></span></div><div><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; }</span></div><div><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; extension</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="background-color:rgba(255,255,255,0);box-sizing:border-box"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">RangeReplaceableCollection</span></span><span style="background-color:rgba(255,255,255,0)">&nbsp;{</span></div><div><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; func</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="background-color:rgba(255,255,255,0);box-sizing:border-box">filter</span><span style="background-color:rgba(255,255,255,0)">(</span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="background-color:rgba(255,255,255,0);box-sizing:border-box">_</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-smi" style="background-color:rgba(255,255,255,0);box-sizing:border-box">isIncluded</span><span style="background-color:rgba(255,255,255,0)">: (T</span><span style="background-color:rgba(255,255,255,0)">) </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">throws</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">-&gt;</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="background-color:rgba(255,255,255,0);box-sizing:border-box">Bool</span><span style="background-color:rgba(255,255,255,0)">) </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">rethrows</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">-&gt;</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="background-color:rgba(255,255,255,0);box-sizing:border-box">Self&lt;T&gt;</span><span style="background-color:rgba(255,255,255,0)">&nbsp;{&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"></span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var</span><span style="background-color:rgba(255,255,255,0)"> result </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">=</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="background-color:rgba(255,255,255,0);box-sizing:border-box">Self&lt;T&gt;</span><span style="background-color:rgba(255,255,255,0)">()&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"></span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for</span><span style="background-color:rgba(255,255,255,0)"> element </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">in</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="background-color:rgba(255,255,255,0);box-sizing:border-box">self</span><span style="background-color:rgba(255,255,255,0)"> {&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"></span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">try</span><span style="background-color:rgba(255,255,255,0)"> </span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="background-color:rgba(255,255,255,0);box-sizing:border-box">isIncluded</span><span style="background-color:rgba(255,255,255,0)">(element) {&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;result.</span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="background-color:rgba(255,255,255,0);box-sizing:border-box">append</span><span style="background-color:rgba(255,255,255,0)">(element)&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"></span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="background-color:rgba(255,255,255,0);box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return</span><span style="background-color:rgba(255,255,255,0)"> result&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;</span></div><div><div><span style="background-color:rgba(255,255,255,0)"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">func map&lt;M&gt;</span>(<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-en" style="box-sizing:border-box">_</span>&nbsp;mapper: (T)&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">throws</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">-&gt;</span>&nbsp;M)&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">rethrows</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">-&gt;</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">Self&lt;M&gt;</span>&nbsp;{&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var</span>&nbsp;result&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">=</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">Self&lt;M&gt;</span>()&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for</span>&nbsp;element&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">in</span>&nbsp;<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">self</span>&nbsp;{&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try result.<span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-c1" style="box-sizing:border-box">append</span>(mapper(element))</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)"><span class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390pl-k" style="box-sizing:border-box">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return</span>&nbsp;result&nbsp;</span></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;</span></div></div><div><span style="background-color:rgba(255,255,255,0)">&nbsp; &nbsp; }</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">Which I think both reads better and is more powerful since it allows map to be written also.</span></div><div></div></div><div dir="auto"><div><br><blockquote type="cite"><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px"><li style="box-sizing:border-box;margin-top:0.25em"><font color="#000000"><span style="background-color:rgba(255,255,255,0)">Is the problem being addressed significant enough to warrant a change to Swift?</span></font></li></ul></blockquote></div></div><div dir="auto"><div><div>Yes, return an array is a real pain</div></div></div><div dir="auto"><div><br><blockquote type="cite"><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px"><li style="box-sizing:border-box;margin-top:0.25em"><font color="#000000"><span style="background-color:rgba(255,255,255,0)">Does this proposal fit well with the feel and direction of Swift?</span></font></li></ul></blockquote></div></div><div dir="auto"><div><div>Yes and no, really smacks of papering over other flaws. Might box Swift into a corner were other problems can't be fixed because the underlying, real, problems still remain.</div></div></div><div dir="auto"><div><br><blockquote type="cite"><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px"><li style="box-sizing:border-box;margin-top:0.25em"><font color="#000000"><span style="background-color:rgba(255,255,255,0)">If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?</span></font></li></ul></blockquote></div></div><div dir="auto"><div><div>Virtually all other languages I have used, e.g. Java, Scala, use the solution I presented above.&nbsp;</div></div></div><div dir="auto"><div><br><blockquote type="cite"><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px"><li style="box-sizing:border-box;margin-top:0.25em"><font color="#000000"><span style="background-color:rgba(255,255,255,0)">How much effort did you put into your review? A glance, a quick reading, or an in-depth study?</span></font></li></ul></blockquote></div></div><div dir="auto"><div>Have been bitten by this and have written my own collection hierarchy to overcome this limitation, and others, of the current library.&nbsp;<br><br><div>-- Howard.</div></div></div><div dir="auto"><div><br>On 29 Apr 2017, at 10:06 am, Douglas Gregor &lt;<a href="mailto:dgregor@apple.com" target="_blank">dgregor@apple.com</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">Hello Swift community,</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">The review of SE-0174 "Change `filter` to return an associated type" begins now and runs through May 3, 2017. The proposal is available here:</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229);background-color:rgb(255,255,255)"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px"><font color="#6a737d" face="-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol" size="3"><a href="https://github.com/apple/swift-evolution/blob/master/proposals/0174-filter-range-replaceable.md" target="_blank">https://github.com/apple/swift-evolution/blob/master/proposals/0174-filter-range-replaceable.md</a></font></div></blockquote><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">Reviews are an important part of the Swift evolution process. All reviews should be sent to the swift-evolution mailing list at</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(106,115,125);border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="box-sizing:border-box;background-color:transparent;color:rgb(3,102,214);text-decoration:none" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">or, if you would like to keep your feedback private, directly to the review manager. When replying, please try to keep the proposal link at the top of the message:</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229);background-color:rgb(255,255,255)"><p style="color:rgb(106,115,125);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;box-sizing:border-box;margin-top:0px;margin-bottom:16px">Proposal link:</p><blockquote style="box-sizing:border-box;margin:0px;padding:0px 1em;border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229)"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px"><font color="#6a737d" face="-apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol" size="3"><a href="https://github.com/apple/swift-evolution/blob/master/proposals/0174-filter-range-replaceable.md" target="_blank">https://github.com/apple/swift-evolution/blob/master/proposals/0174-filter-range-replaceable.md</a></font></div></blockquote></blockquote><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(106,115,125);border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px">Reply text</div></blockquote><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(106,115,125);border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)"><blockquote style="box-sizing:border-box;margin:0px;padding:0px 1em;border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229)"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px">Other replies</div></blockquote></blockquote><h5 style="box-sizing:border-box;margin-top:24px;margin-bottom:16px;font-size:0.875em;line-height:1.25;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';background-color:rgb(255,255,255)"><a id="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390user-content-what-goes-into-a-review-1" class="m_-3826331308702640030m_-3014924675851174157m_-4476559238435470390anchor" href="https://github.com/apple/swift-evolution#what-goes-into-a-review-1" style="box-sizing:border-box;background-color:transparent;color:rgb(3,102,214);text-decoration:none;float:left;padding-right:4px;line-height:1" target="_blank"><u></u><u></u><u></u><u></u></a>What goes into a review?</h5><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">The goal of the review process is to improve the proposal under review through constructive criticism and, eventually, determine the direction of Swift. When writing your review, here are some questions you might want to answer in your review:</p><ul style="box-sizing:border-box;padding-left:2em;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)"><li style="box-sizing:border-box">What is your evaluation of the proposal?</li><li style="box-sizing:border-box;margin-top:0.25em">Is the problem being addressed significant enough to warrant a change to Swift?</li><li style="box-sizing:border-box;margin-top:0.25em">Does this proposal fit well with the feel and direction of Swift?</li><li style="box-sizing:border-box;margin-top:0.25em">If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?</li><li style="box-sizing:border-box;margin-top:0.25em">How much effort did you put into your review? A glance, a quick reading, or an in-depth study?</li></ul><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">More information about the Swift evolution process is available at</p><blockquote style="box-sizing:border-box;margin:0px 0px 16px;padding:0px 1em;color:rgb(106,115,125);border-left-width:0.25em;border-left-style:solid;border-left-color:rgb(223,226,229);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)"><div style="box-sizing:border-box;margin-top:0px;margin-bottom:0px"><a href="https://github.com/apple/swift-evolution/blob/master/process.md" style="box-sizing:border-box;background-color:transparent;color:rgb(3,102,214);text-decoration:none" target="_blank">https://github.com/apple/swift-evolution/blob/master/process.md</a></div></blockquote><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">Thank you,</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">-Doug Gregor</p><p style="box-sizing:border-box;margin-top:0px;margin-bottom:16px;color:rgb(36,41,46);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:16px;background-color:rgb(255,255,255)">Review Manager</p></div></blockquote></div><div dir="auto"><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution-announce mailing list</span><br><span><a href="mailto:swift-evolution-announce@swift.org" target="_blank">swift-evolution-announce@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution-announce" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution-announce</a></span><br></div></blockquote></div></div></div>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>
</blockquote></div><br></div></blockquote></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></div></blockquote></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></body></html>