<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 31, 2015, at 10:52 AM, Donnacha Oisín Kidney &lt;<a href="mailto:oisin.kidney@gmail.com" class="">oisin.kidney@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Just to add to that, it’s always seemed strange to me that to signify your sequence is multi-pass (i.e., to make it conform to CollectionType) you have to have it conform to Indexable.&nbsp;</div></div></blockquote><div><br class=""></div>FWIW, Indexable is an implementation artifact that will go away when Swift’s generics system is improved.</div><div><br class=""></div><div>But if your real objection is that you have to come up with an Index and a subscripting operator, I can understand that. &nbsp;Part of the reason for this is our reluctance to&nbsp;<a href="http://news.gmane.org/find-root.php?message_id=2A3E0C76-1C88-4752-8A70-AA64BB14223A@apple.com" class="">create any distinct protocols with identical syntactic requirements</a>. &nbsp;To justify having a separate multi-pass sequence protocol, there would have to be a significant/important class of multi-pass sequences for which CollectionType was unimplementable without serious costs.</div><div><br class=""></div><div>In principle there’s a way to ease the pain of creating CollectionType conformances for multipass SequenceTypes…if only it didn’t&nbsp;<a href="https://bugs.swift.org/browse/SR-427" class="">crash the compiler</a>&nbsp;;-). &nbsp;Here’s a variation that uses a generic adapter instead of a protocol conformance declaration:</div><div><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><div><div><font face="Menlo" class="">/// A `CollectionType` containing the same elements as `Base`, without storing them.</font></div><div><font face="Menlo" class="">///</font></div><div><font face="Menlo" class="">/// - Requires: `Base` supports multiple passes (traversing it does not</font></div><div><font face="Menlo" class="">/// &nbsp; consume the sequence), and `Base.Generator` has value semantics</font></div><div><font face="Menlo" class="">public struct Multipass&lt;Base: SequenceType where Base.Generator: Equatable&gt; : CollectionType {</font></div><div><font face="Menlo" class="">&nbsp; public var startIndex: MultipassIndex&lt;Base&gt; {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; var g = _base.generate()</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; return MultipassIndex(buffer: g.next(), generator: g)</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class="">&nbsp;&nbsp;</font></div><div><font face="Menlo" class="">&nbsp; public var endIndex: MultipassIndex&lt;Base&gt; {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; return MultipassIndex(buffer: nil, generator: _base.generate())</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">&nbsp; public subscript(position: MultipassIndex&lt;Base&gt;) -&gt; Base.Generator.Element {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; return position.buffer!</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">&nbsp; public init(_ base: Base) {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; _base = base</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class="">&nbsp;&nbsp;</font></div><div><font face="Menlo" class="">&nbsp; var _base: Base</font></div><div><font face="Menlo" class="">}</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">// Note: Requires T.Generator has value semantics</font></div><div><font face="Menlo" class="">public struct MultipassIndex&lt;T: SequenceType where T.Generator: Equatable&gt; : ForwardIndexType {</font></div><div><font face="Menlo" class="">&nbsp; public func successor() -&gt; MultipassIndex {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; var r = self</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; r.buffer = r.generator.next()</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; return r</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class="">&nbsp; var buffer: T.Generator.Element?</font></div><div><font face="Menlo" class="">&nbsp; var generator: T.Generator</font></div><div><font face="Menlo" class="">}</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">public func == &lt;T&gt;(x: MultipassIndex&lt;T&gt;, y: MultipassIndex&lt;T&gt;) -&gt; Bool {</font></div><div><font face="Menlo" class="">&nbsp; return x.buffer == nil &amp;&amp; y.buffer == nil || x.generator == y.generator</font></div><div><font face="Menlo" class="">}</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">//===--- An example fibonacci sequence ------------------------------------===//</font></div><div><font face="Menlo" class="">struct FibGenerator : GeneratorType {</font></div><div><font face="Menlo" class="">&nbsp; mutating func next() -&gt; Int? {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; let c = a + b</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; a = b</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; b = c</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; return a &lt; limit ? a : nil</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class="">&nbsp; var a, b, limit: Int</font></div><div><font face="Menlo" class="">}</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">struct Fib : SequenceType {</font></div><div><font face="Menlo" class="">&nbsp; var limit = 1000</font></div><div><font face="Menlo" class="">&nbsp;&nbsp;</font></div><div><font face="Menlo" class="">&nbsp; func generate() -&gt; FibGenerator {</font></div><div><font face="Menlo" class="">&nbsp; &nbsp; return Generator(a: 0, b: 1, limit: limit)</font></div><div><font face="Menlo" class="">&nbsp; }</font></div><div><font face="Menlo" class="">}</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">//===--- Adapt Fib for use with Multipass ---------------------------------===//</font></div><div><font face="Menlo" class="">extension FibGenerator : Equatable {}</font></div><div><font face="Menlo" class="">func == (x: Fib.Generator, y: Fib.Generator) -&gt; Bool {</font></div><div><font face="Menlo" class="">&nbsp; return x.a == y.a</font></div><div><font face="Menlo" class="">}</font></div><div><font face="Menlo" class=""><br class=""></font></div><div><font face="Menlo" class="">//===--- Demonstration ----------------------------------------------------===//</font></div><div><font face="Menlo" class="">let c = Multipass(Fib())</font></div><div><font face="Menlo" class="">print(c.first)</font></div><div><font face="Menlo" class="">print(c.count)</font></div><div><font face="Menlo" class="">print(c.lazy.map { $0 + 1 })</font></div><div><br class=""></div></div></div></blockquote><div><div class=""><br class=""></div></div><div><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On 31 Dec 2015, at 17:52, Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="" 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;">I'm trying to work them out, so it's still muddled.</div><div class="" 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;"><br class=""></div><div class="" 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;">Right now, I think<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">SequenceType</font><span class="Apple-converted-space">&nbsp;</span>is better described as<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">CollectionWalkType</font><span class="Apple-converted-space">&nbsp;</span>but that's kind of (1) a mouthful and (2) not entirely accurate.&nbsp;</div><div class="" 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;"><br class=""></div><div class="" 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;">Moving back a step:<span class="Apple-converted-space">&nbsp;</span><font face="Menlo" class="">SequenceType</font><span class="Apple-converted-space">&nbsp;</span>is defined as: "A type that can be iterated with a `for`...`in` loop." But it says nothing about whether that loop ever terminates and many stdlib sequence functions currently don't make sense (at least if they're not lazy) with respect to infinite sequences, which should probably be "<font face="Menlo" class="">StreamType</font>" not sequences. A couple of examples:</div><div class="" 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;"><ul class=""><li class="">Here's my fib:&nbsp;<a href="http://swiftstub.com/189513594/" class="">http://swiftstub.com/189513594/</a></li><li class="">And here's Oisin's user-input sequence: &nbsp;<a href="https://gist.github.com/oisdk/2c7ac33bf2188528842a" class="">https://gist.github.com/oisdk/2c7ac33bf2188528842a</a></li></ul></div><div class="" 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;">Both of these are theoretically filterable, but they aren't dropLast-able, suffix-able, properly split-able, etc.</div><div class="" 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;"><br class=""></div><div class="" 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;">Hopefully that's enough of a starting point to indicate where my thinking is at and what I'm trying to think through when it comes to this. -- E</div><div class="" 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;"><br class=""></div><br class="" 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 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;" class=""><blockquote type="cite" class=""><div class="">On Dec 31, 2015, at 10:09 AM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com" class="">dabrahams@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class=""><br class=""><blockquote type="cite" class="">On Dec 31, 2015, at 9:05 AM, Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class="">It does seem that in Swift the concepts of collection, sequence, permutation, stream, etc are a bit muddled.<br class=""></blockquote><br class="">This is a pretty vague critique. &nbsp;Do you have specifics, and suggestions that address them?<br class=""><br class=""><blockquote type="cite" class=""><br class="">-- E<br class=""><br class=""><br class=""><blockquote type="cite" class="">On Dec 31, 2015, at 6:51 AM, Tino Heth via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class=""><blockquote type="cite" class="">Those are collections. &nbsp;Collections can be iterated over multiple times.<br class=""></blockquote>Speaking of the Fibonacci-numbers:<br class="">Sure we can write an algorithm that iterates over them several times — it just won't ever finish the first iteration ;-)<br class="">(only nitpicking — I just couldn't resist)<br class=""><br class="">Happy new year!<br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></blockquote><br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></blockquote><br class="">-Dave<br class=""><br class=""></div></div></blockquote></div><br class="" 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;"><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=Lo8TP3b1oIn3yQXUt9zA1UCQfR-2BMBCuqnubTuDg47-2B3-2FatXWNpDmYGYAnFTKQq3XVgnSsv069JwuhvJV8VbI61gbR8W0qjWm5n9c7UyKOimeQ-2FQraasb0vH73VZgdd8v6-2F8KBmcrf-2FjJ-2FtojWeomjpy-2F1r-2B8PFdGlOZQK2skCLI5CyUcjWR-2FwioQXxiSPxjzeROuT3iwvgmFSOTNqckiLs8Ap9FSuEEnzO5H71ts-2Fos-3D" alt="" width="1" height="1" border="0" 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-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""><span 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; float: none; display: inline !important;" class=""><span class="Apple-converted-space">&nbsp;</span></span><span 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; float: none; display: inline !important;" class="">_______________________________________________</span><br 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;" class=""><span 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; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br 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;" class=""><a href="mailto:swift-evolution@swift.org" 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;" class="">swift-evolution@swift.org</a><br 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;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" 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;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""><div class="">
-Dave
</div>
<br class=""></body></html>