<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div><div><div>On Thu, Dec 31, 2015, at 12:36 AM, Dave Abrahams wrote:<br></div>
</div>
</div>
<blockquote type="cite"><div><blockquote type="cite"><div>On Dec 30, 2015, at 3:57 PM, Kevin Ballard 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><div>It's sometimes useful to get the first element of a sequence. To that end I'd like to propose<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>SequenceType<span style=""> {</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>/// Returns the first element of `self`, or `nil` if `self` is empty.<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>/// - Complexity: O(1)<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(112, 61, 170);"><span style=""></span><span class="colour" style="color:rgb(187, 44, 162)">var</span><span style=""> first: </span>Self<span style="">.</span>Generator<span style="">.</span>Element<span style="">? {</span><br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">var</span> gen = <span class="colour" style="color:rgb(61, 29, 129)">generate</span>()<br></div>
<div style="margin-top:0px;margin-bottom:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">return</span> gen.<span class="colour" style="color:rgb(61, 29, 129)">next</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>I think it makes sense to add this property to the definition of SequenceType as well, so various sequences can override it to avoid constructing a generator.<br></div>
</div>
<div>&nbsp;</div>
<div>With this added to SequenceType, we can remove it from CollectionType, as the behavior will be the same.<br></div>
</div>
</div>
</blockquote><div>&nbsp;</div>
<div>Property accesses should not mutate the receiver, and because of how Sequences work, inspecting first may consume the first element.<br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>Fair enough. Swift does support `mutating get`, but it looks like the stdlib doesn't actually use this anywhere (at least, in the public API).<br></div>
<div>&nbsp;</div>
<div>Still, it's a shame that there's no way to do this generically for sequences. It's something I need upon occasion. I wish I could actually say something like `seq.generate().next()`, but you can't call mutating functions on temporaries.<br></div>
<div>&nbsp;</div>
<div>I'd be tempted to say we should have a `func first()` method, except then CollectionTypes would have both a property and a method named `first` and that would just be confusing.<br></div>
<div>&nbsp;</div>
<blockquote type="cite"><div><div>I suggest you consider adding a BufferedSequence&lt;Base: SequenceType&gt; that has a stable first property (at least until it is iterated)<br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>Good idea, though I'd probably call it PeekSequence because it would only buffer a single element (and BufferedSequence sounds like it's got an arbitrary-sized buffer). Perhaps more useful would be the associated PeekGenerator, because peek() is a useful thing to have when writing custom generator-using code.<br></div>
<div>&nbsp;</div>
<div>I'll write up a more detailed email with a proposed design in a minute.</div>
<div>&nbsp;</div>
<blockquote type="cite"><div><div>Another related adapter I’d like to add is a model of CollectionType that is backed by a sequence and lazily populated in fixed-sized chunks.<br></div>
</div>
</blockquote><div>&nbsp;</div>
<div>Also a good idea. Although really it could just be backed by a ContiguousArray, those things already grow in chunks. I'll write up a design for that too.<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard</div>
</body>
</html>