<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 11, 2016 at 6:36 PM, plx via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On Jan 11, 2016, at 6:22 PM, Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com" target="_blank">gribozavr@gmail.com</a>&gt; wrote:</div><br><div><div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 6, 2016 at 10:42 AM, plx via swift-evolution<span> </span><span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span><span> </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 Jan 6, 2016, at 11:37 AM, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>I&#39;ve bounced this idea off of Dave and Dmitri internally, so might as well put it out publicly:</div><div><br></div><div>In Magic DWIM Swift, there would only be two types that you&#39;d ever conform to: a destructive iteration type (today&#39;s &quot;Generator&quot;), and a multi-pass indexed type (today&#39;s &quot;Collection&quot;). Some <i>operations</i> can meaningfully use either one (like forEach or maxElement); these operations go on a general &quot;traversable&quot; type (today&#39;s &quot;Sequence&quot;).</div><div><br></div><div>In this world, both GeneratorType and CollectionType are refinements of SequenceType (i.e. any GeneratorType &quot;is-a&quot; SequenceType), including the necessary default implementations. Maybe we rename some of the protocols in the process. Again, no concrete type would ever conform to SequenceType; it&#39;s just something you can use as a generic constraint.</div><div><br></div><div>We can&#39;t actually do this today because it creates a circularity between SequenceType and GeneratorType that the compiler can&#39;t handle. I&#39;m pretty sure it&#39;s possible to change the compiler&#39;s protocol checking logic to allow this, though.</div><div><br></div><div>Anyway, that&#39;s that idea. At the very least it helped me clear up my thoughts about Sequence, Collection, and Generator back when I was first learning them.</div><div><br></div><div>Jordan</div><div><br></div><div>P.S. This idea falls apart if someone comes up with a model (concrete type) for SequenceType that isn&#39;t a Collection or Generator. I wasn&#39;t able to think of one back when I was originally thinking about this, but of course that doesn&#39;t mean there isn&#39;t one. (Infinite collections are interesting as discussed on the &quot;cycle&quot; thread, but it&#39;s not the sequence/generator distinction that&#39;s really meaningful there.)</div></div></div></blockquote><div><br></div></span><div>It’s not clear what you mean by a `SequenceType` that isn’t either a `Collection` or a `Generator`, but if you mean a *concrete* sequence that:</div><div><br></div><div>- can be re-iterated (thus not a `Generator`)</div><div>- has no meaningful index (!) (thus not a `Collection`)</div><div><br></div><div>…then I can provide you with examples of such. The (!) is b/c you can of course always use `Int` as an index, in the sense that “the value at index `n` is obtained by iterating `n` steps from the start of the sequence”; I’ll assume this doesn’t “count” as an index for purposes of this discussion.</div></div></div></blockquote><div><br></div><div>You can use an opaque data type designed just for that collection, it is a valid design.</div></div></div></div></div></blockquote><div><br></div></span><div>I suppose you’re right, but wouldn’t the opaque-Int-wrapper-as-Index still only work for a finite sequence with its exact length already-known, so you can provide an `endIndex` in O(1) time?</div><div><br></div><div>I may not be understanding what you mean, here.</div></div></div></blockquote><div><br></div><div>Since the sequence is infinite, endIndex would be just a special value distinct from any other index value.  You can construct that value in O(1).  For example, Index can be wrapping an Optional of the PRNG state.  If the optional is nil, then the index is the endIndex.  Otherwise, it is an index that can be advanced.</div><div><br></div><div>Dmitri</div><div><br></div></div>-- <br><div class="gmail_signature">main(i,j){for(i=2;;i++){for(j=2;j&lt;i;j++){if(!(i%j)){j=0;break;}}if<br>(j){printf(&quot;%d\n&quot;,i);}}} /*Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com" target="_blank">gribozavr@gmail.com</a>&gt;*/</div>
</div></div>