<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>On Wed, Dec 30, 2015, at 07:33 AM, Donnacha Oisín Kidney via swift-evolution wrote:<br></div>
<blockquote type="cite"><div>+1 on this.<br></div>
<div>&nbsp;</div>
<div>I see a lot of code like this:<br></div>
<div>&nbsp;</div>
<div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 129, 135);">sequence<span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(61, 29, 129)">filter</span><span class="colour" style="color:rgb(0, 0, 0)">(</span>predicate<span class="colour" style="color:rgb(0, 0, 0)">).</span><span class="colour" style="color:rgb(112, 61, 170)">first</span><br></div>
</div>
<div>&nbsp;</div>
<div>Which is of course is inefficient. However, the go-to optimisation:<br></div>
<div>&nbsp;</div>
<div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(49, 89, 93);"><span class="colour" style="color:rgb(79, 129, 135)">sequence</span><span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(112, 61, 170)">lazy</span><span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(61, 29, 129)">filter</span><span class="colour" style="color:rgb(0, 0, 0)">(</span>predicate<span class="colour" style="color:rgb(0, 0, 0)">).</span><span class="colour" style="color:rgb(112, 61, 170)">first</span><br></div>
</div>
<div>&nbsp;</div>
<div>Is not necessarily better, and has some strange behaviour:<br></div>
<div>&nbsp;</div>
<div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">let</span> array = [<span class="colour" style="color:rgb(49, 44, 221)">1</span>, <span class="colour" style="color:rgb(49, 44, 221)">2</span>, <span class="colour" style="color:rgb(49, 44, 221)">3</span>, <span class="colour" style="color:rgb(49, 44, 221)">4</span>, <span class="colour" style="color:rgb(49, 44, 221)">5</span>, <span class="colour" style="color:rgb(49, 44, 221)">6</span>]<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">func</span> noisyPredicate(n: <span class="colour" style="color:rgb(112, 61, 170)">Int</span>) -&gt; <span class="colour" style="color:rgb(112, 61, 170)">Bool</span> {<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(61, 29, 129)">print</span>(n, terminator: <span class="colour" style="color:rgb(201, 49, 8)">" "</span>)<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">return</span> n &gt; <span class="colour" style="color:rgb(49, 44, 221)">2</span><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">}<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px;">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(49, 89, 93);"><span class="colour" style="color:rgb(79, 129, 135)">array</span><span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(112, 61, 170)">lazy</span><span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(61, 29, 129)">filter</span><span class="colour" style="color:rgb(0, 0, 0)">(</span>noisyPredicate<span class="colour" style="color:rgb(0, 0, 0)">).</span><span class="colour" style="color:rgb(112, 61, 170)">first</span><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 143, 0);">// 1 2 3 1 2 3<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px;">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112, 61, 170);">AnySequence<span class="colour" style="color:rgb(0, 0, 0)">(</span><span class="colour" style="color:rgb(79, 129, 135)">array</span><span class="colour" style="color:rgb(0, 0, 0)">).</span>lazy<span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(61, 29, 129)">filter</span><span class="colour" style="color:rgb(0, 0, 0)">(</span><span class="colour" style="color:rgb(49, 89, 93)">noisyPredicate</span><span class="colour" style="color:rgb(0, 0, 0)">).</span>first<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 143, 0);">// 1 2 3 4 5 6<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 143, 0);">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">If it’s called on a collection, the collection is only evaluated up until the element being looked for, but it’s done twice. If it’s called on a sequence, the <i>whole</i>&nbsp;sequence is evaluated, regardless of where the element is found.<br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>Actually, you're calling it on a collection in both cases. SequenceType doesn't have a `first` property (honestly, I think it should). Saying `lazy.filter(noisyPredicate)` is actually resolving to the version of filter() from SequenceType, the one that returns an Array, because the one from LazySequenceType that returns a LazyFilterSequence doesn't have a `first` property.<br></div>
<div>&nbsp;</div>
<div>As for it calling it twice on a collection, this is because it's implemented as `isEmpty ? nil : self[startIndex]`, which is honestly pretty silly.<br></div>
<div>&nbsp;</div>
<div>FWIW, there's other sequence methods that actually evaluate lazy collections twice, because they detect that the receiver is a collection and run a preprocessing pass first. For example, the version of joinWithSeparator() that returns a String does this (to size all of the elements so it can preallocate a buffer), which causes duplicate evaluation of lazy filter/map collections. I filed this a while ago as <a href="https://bugs.swift.org/browse/SR-68">SR-68</a>.<br></div>
<div>&nbsp;</div>
<blockquote type="cite"><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">I think that&nbsp;<span class="colour" style="color:rgb(49, 89, 93)"><span class="font" style="font-family:Menlo"><span class="size" style="font-size:11px">find</span></span></span>&nbsp;is maybe not the best name, though. It’s not immediately clear that it doesn’t return an index.<br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>indexOf() used to be called find(), but it was renamed because find() didn't make it obvious that it returned an index. I know I personally got confused all the time about what find() returned.<br></div>
<div>&nbsp;</div>
<div>Also, this is a sequence method. Sequences don't have indexes.<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard</div>
<div>&nbsp;</div>
<blockquote type="cite"><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">I’d prefer to call it&nbsp;<span class="colour" style="color:rgb(112, 61, 170)"><span class="font" style="font-family:Menlo"><span class="size" style="font-size:11px">first</span></span></span>, as in:<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 143, 0);">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(187, 44, 162)">extension</span><span class="colour" style="color:rgb(0, 0, 0)"></span>SequenceType<span class="colour" style="color:rgb(0, 0, 0)"> {</span><br></div>
<div style="color:rgb(0, 132, 0);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(0, 0, 0)"></span>/// Returns the first element where `predicate` returns `true`, or `nil`<br></div>
<div style="color:rgb(0, 132, 0);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(0, 0, 0)"></span>/// if such value is not found.<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(187, 44, 162)">public</span> <span class="colour" style="color:rgb(187, 44, 162)">func</span> first(<span class="colour" style="color:rgb(187, 44, 162)">@noescape</span> thatSatisfies: (<span class="colour" style="color:rgb(187, 44, 162)">Self</span>.Generator.Element) <span class="colour" style="color:rgb(187, 44, 162)">throws</span> -&gt; Bool) <span class="colour" style="color:rgb(187, 44, 162)">rethrows</span> -&gt; Self.Generator.Element? {<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(187, 44, 162)">for</span> elt <span class="colour" style="color:rgb(187, 44, 162)">in</span> <span class="colour" style="color:rgb(187, 44, 162)">self</span> {<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(187, 44, 162)">if</span> <span class="colour" style="color:rgb(187, 44, 162)">try</span> thatSatisfies(elt) {<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(187, 44, 162)">return</span> elt<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">&nbsp; &nbsp; &nbsp; }<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">&nbsp; &nbsp; }<br></div>
<div style="color:rgb(187, 44, 162);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(0, 0, 0)"></span>return<span class="colour" style="color:rgb(0, 0, 0)"></span>nil<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">&nbsp; }<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">}<br></div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;min-height:13px;">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;min-height:13px;"><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;"><span class="colour" style="color:rgb(112, 61, 170)">[</span><span class="colour" style="color:rgb(49, 44, 221)">1</span><span class="colour" style="color:rgb(112, 61, 170)">, </span><span class="colour" style="color:rgb(49, 44, 221)">2</span><span class="colour" style="color:rgb(112, 61, 170)">, </span><span class="colour" style="color:rgb(49, 44, 221)">3</span><span class="colour" style="color:rgb(112, 61, 170)">, </span><span class="colour" style="color:rgb(49, 44, 221)">4</span><span class="colour" style="color:rgb(112, 61, 170)">, </span><span class="colour" style="color:rgb(49, 44, 221)">5</span><span class="colour" style="color:rgb(112, 61, 170)">].</span><span class="colour" style="color:rgb(49, 89, 93)">first</span><span class="colour" style="color:rgb(112, 61, 170)">(</span>thatSatisfies: (Int) throws -&gt; Bool<span class="colour" style="color:rgb(112, 61, 170)">)</span><br></div>
</div>
</div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;min-height:13px;">&nbsp;</div>
<div style="color:rgb(112, 61, 170);margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:normal;">[<span class="colour" style="color:rgb(49, 44, 221)">1</span>, <span class="colour" style="color:rgb(49, 44, 221)">2</span>, <span class="colour" style="color:rgb(49, 44, 221)">3</span>, <span class="colour" style="color:rgb(49, 44, 221)">4</span>, <span class="colour" style="color:rgb(49, 44, 221)">5</span>].<span class="colour" style="color:rgb(49, 89, 93)">first</span> { $0 &gt; <span class="colour" style="color:rgb(49, 44, 221)">3</span> }<br></div>
</div>
</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 143, 0);">&nbsp;</div>
<div><blockquote type="cite"><div>On 30 Dec 2015, at 10:13, James Campbell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<div>&nbsp;</div>
<div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;">We should add the full collection of ruby methods&nbsp;<a href="http://matthewcarriere.com/06/23/using-select-reject-collect-inject-and-detect/">http://matthewcarriere.com/06/23/using-select-reject-collect-inject-and-detect/</a><br></div>
<div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;">&nbsp;</div>
<div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;">&nbsp;</div>
<div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;"><div>&nbsp;</div>
<div>Sent from my iPhone<br></div>
</div>
<div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;"><div>&nbsp;</div>
<div>On 30 Dec 2015, at 02:40, Keith Smiley via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div>
</div>
<blockquote style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;" type="cite"><div><div>+1. We've added an extension for this and find it very useful.<br></div>
<div><div dir="ltr">On Tue, Dec 29, 2015 at 18:38 Kevin Ballard via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204, 204, 204);border-left-style:solid;padding-left:1ex;"><div><u></u><br></div>
<div><div>I'm proposing a new extension method on SequenceType called find(). It's similar to CollectionType.indexOf() except it returns the element:<br></div>
<div>&nbsp;</div>
<div><div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112, 61, 170);"><span class="colour" style="color:rgb(187, 44, 162)">extension</span><span style=""><span></span></span>SequenceType<span style=""><span></span>{</span><br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(144, 45, 208);"><span style=""><span></span></span>/// Returns the first element where `predicate` returns `true`, or `nil`<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(144, 45, 208);"><span style=""><span></span></span>/// if such value is not found.<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span></span><span class="colour" style="color:rgb(187, 44, 162)">public</span><span></span><span class="colour" style="color:rgb(187, 44, 162)">func</span><span></span>find(<span class="colour" style="color:rgb(187, 44, 162)">@noescape</span><span></span>predicate: (<span class="colour" style="color:rgb(187, 44, 162)">Self</span>.Generator.Element)<span></span><span class="colour" style="color:rgb(187, 44, 162)">throws</span><span></span>-&gt;<span></span><span class="colour" style="color:rgb(112, 61, 170)">Bool</span>)<span></span><span class="colour" style="color:rgb(187, 44, 162)">rethrows</span><span></span>-&gt;<span></span><span class="colour" style="color:rgb(112, 61, 170)">Self</span>.<span class="colour" style="color:rgb(112, 61, 170)">Generator</span>.<span class="colour" style="color:rgb(112, 61, 170)">Element</span>? {<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span></span><span class="colour" style="color:rgb(187, 44, 162)">for</span><span></span>elt<span></span><span class="colour" style="color:rgb(187, 44, 162)">in</span><span></span><span class="colour" style="color:rgb(187, 44, 162)">self</span><span></span>{<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span></span><span class="colour" style="color:rgb(187, 44, 162)">if</span><span></span><span class="colour" style="color:rgb(187, 44, 162)">try</span><span></span>predicate(elt) {<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span></span><span class="colour" style="color:rgb(187, 44, 162)">return</span><span></span>elt<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; }<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span></span><span class="colour" style="color:rgb(187, 44, 162)">return</span><span></span><span class="colour" style="color:rgb(187, 44, 162)">nil</span><br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp; &nbsp; }<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;">}<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard<br></div>
</div>
<div>&nbsp;</div>
<div><img style="min-height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-right:0px !important;margin-bottom:0px !important;margin-left:0px !important;padding-top:0px !important;padding-right:0px !important;padding-bottom:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/4f4b9744bab4d4789a6b01ba68bf637900ea646ee493df052af9af4ecc760c6f/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d335a5547677441576552766d4c6336416c6264433373523968673936653a65497366373f4b697a4750575b6d41755268447e44583175766a656771357c477d2236457443505778367d6377776239607758377c666c69777f616d6169417947537651454e453a49705d223648515457457033313d4a52616746625c416238454168675e4e6775607b485a48473d6d2232455367426242645b6051637a53553e42384370725549694872596f6158403363736d22364f4d44387d22364a6b41773264643a65794566315f6375394a46315b65313a594a595c6563626a41555a6d22364d22364834475d4b626a7e61694b4e6071646a7643627f4f6d23344/open"><br></div>
</div>
<div>_______________________________________________<br></div>
<div>swift-evolution mailing list<br></div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote></div>
<div><img style="height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-right:0px !important;margin-bottom:0px !important;margin-left:0px !important;padding-top:0px !important;padding-right:0px !important;padding-bottom:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/acacf2bf017e828ebad3967c9fcfdf703687cd898524e92b61bd408d543bc441/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d3876503a495d2236446a5d4e655d467356447a5e6c496240525454444f435156633d22364078433338495f4c624877453d22324662516761395f60596d65624547613b4d22324f65336d684f4a51555e6f65784d22324470703f67437278353135494f47513158656e44596c4867537463475a5a4449563141477842513a437355484d22324e653b645355724d45695b607d4a726363587c41486e614e4d61596257314c6d647a677b4e6e67434957694c684674643a433a42477765596a5d667534686e4a52754d416254353d615a516b685138494b675149537a646f43363d4a7f4542477739305b63317356553453584e464b6a7c654d23344/open"><br></div>
</div>
</blockquote><blockquote style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;" type="cite"><div><div><span>_______________________________________________</span><br></div>
<div><span>swift-evolution mailing list</span><br></div>
<div><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br></div>
<div><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div>
</div>
</blockquote><div><img style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-right:0px !important;margin-bottom:0px !important;margin-left:0px !important;padding-top:0px !important;padding-right:0px !important;padding-bottom:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/63132acc63e94ffc96a9847774470c9dadccb3d1e0e85b4d08ee12db3ee9ed03/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d3c4f6834505332613f694e633971585554793a714135534156625d22324d424345717e65726455744764373d223243315057766651734a7a714332617232383a7753665b416a725c6555617c6459475c4b48537e6c426b49637d2236414a5e44675377796462464b4a6d223247666e6d49387932744d223243684c60757468437547653d694a717a74374a7b4d22324036773b65387864743143603863337f6b4034425a77524b6743547732613051793f426935493463435b45453d484341795a687542553277637461335c474e6662484631453d6d223646505548697779476a546b6f603669666a4d223247394f4a775a6e617335743d4846695d23344/open"><span class="font" style="font-family:Helvetica"><span class="size" style="font-size:12px"><span></span>_______________________________________________</span></span><br></div>
<div><span class="font" style="font-family:Helvetica"><span class="size" style="font-size:12px">swift-evolution mailing list</span></span><br></div>
<div><a style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;" href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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-stroke-width:0px;" href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</div>
</blockquote></div>
<div><img style="height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-bottom:0px !important;margin-right:0px !important;margin-left:0px !important;padding-top:0px !important;padding-bottom:0px !important;padding-right:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/59411c81219fa6c20f1c422fa84e70c5786b935cd66dfe056834e6a31b6bc402/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d3148765176786c673171614a7d2236454230345272776e4453637955324e4760787d45483d223247596b69445033695462435a5277555a5a7a427972396c435358323238794c605a6f45685c663b465365683757736245786d223245727a6533454a624c4664715d485d22324257536460324e676860717b494f415950583338466d697b477c607f496164433e6d633649543732444255483c6d644e61516945753740594b4477514346477637777463546d2236456d2232437273614d4c664967725f456b4373665a68543856565233703b6a66763373673d475668683755744a414d23344d23344/open"><br></div>
<div><u>_______________________________________________</u><br></div>
<div>swift-evolution mailing list<br></div>
</div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote><div>&nbsp;</div>
</body>
</html>