<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 7:46 PM, Susan Cheng &lt;<a href="mailto:susan.doggie@gmail.com" class="">susan.doggie@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">How GeneratorType confirm to Equatable??</div></div></div></blockquote><div><br class=""></div>I don’t understand the question. &nbsp;In the code I posted there’s a working example of how a GeneratorType model can conform to Equatable..</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">struct Fib : SequenceType {</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; var a: Int</div><div class="">&nbsp; &nbsp; var b: Int</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; var limit: Int</div><div class="">&nbsp; &nbsp;&nbsp;</div><div class="">&nbsp; &nbsp; func generate() -&gt; FibGenerator {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return Generator(a: a, b: b, limit: limit)</div><div class="">&nbsp; &nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">let c = Multipass(Fib(a: 1, b: -1, limit: 10))</div><div class=""><br class=""></div><div class="">-Susan</div><div class=""><br class=""></div><div class="gmail_extra"><br class=""><div class="gmail_quote">2016-01-01 11:17 GMT+08:00 Dave Abrahams <span dir="ltr" class="">&lt;<a href="mailto:dabrahams@apple.com" target="_blank" class="">dabrahams@apple.com</a>&gt;</span>:<br class=""><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">FWIW, Indexable is an implementation artifact that will go away when Swift’s generics system is improved.<br class="">
<br class="">
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 create any distinct protocols with identical syntactic requirements &lt;<a href="http://news.gmane.org/find-root.php?message_id=2A3E0C76-1C88-4752-8A70-AA64BB14223A@apple.com" rel="noreferrer" target="_blank" class="">http://news.gmane.org/find-root.php?message_id=2A3E0C76-1C88-4752-8A70-AA64BB14223A@apple.com</a>&gt;.&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.<br class="">
<br class="">
In principle there’s a way to ease the pain of creating CollectionType conformances for multipass SequenceTypes…if only it didn’t crash the compiler &lt;<a href="https://bugs.swift.org/browse/SR-427" rel="noreferrer" target="_blank" class="">https://bugs.swift.org/browse/SR-427</a>&gt; ;-).&nbsp; Here’s a variation that uses a generic adapter instead of a protocol conformance declaration:<br class="">
<br class="">
/// A `CollectionType` containing the same elements as `Base`, without storing them.<br class="">
///<br class="">
/// - Requires: `Base` supports multiple passes (traversing it does not<br class="">
///&nbsp; &nbsp;consume the sequence), and `Base.Generator` has value semantics<br class="">
public struct Multipass&lt;Base: SequenceType where Base.Generator: Equatable&gt; : CollectionType {<br class="">
&nbsp; public var startIndex: MultipassIndex&lt;Base&gt; {<br class="">
&nbsp; &nbsp; var g = _base.generate()<br class="">
&nbsp; &nbsp; return MultipassIndex(buffer: g.next(), generator: g)<br class="">
&nbsp; }<br class="">
<br class="">
&nbsp; public var endIndex: MultipassIndex&lt;Base&gt; {<br class="">
&nbsp; &nbsp; return MultipassIndex(buffer: nil, generator: _base.generate())<br class="">
&nbsp; }<br class="">
<br class="">
&nbsp; public subscript(position: MultipassIndex&lt;Base&gt;) -&gt; Base.Generator.Element {<br class="">
&nbsp; &nbsp; return position.buffer!<br class="">
&nbsp; }<br class="">
<br class="">
&nbsp; public init(_ base: Base) {<br class="">
&nbsp; &nbsp; _base = base<br class="">
&nbsp; }<br class="">
<br class="">
&nbsp; var _base: Base<br class="">
}<br class="">
<br class="">
// Note: Requires T.Generator has value semantics<br class="">
public struct MultipassIndex&lt;T: SequenceType where T.Generator: Equatable&gt; : ForwardIndexType {<br class="">
&nbsp; public func successor() -&gt; MultipassIndex {<br class="">
&nbsp; &nbsp; var r = self<br class="">
&nbsp; &nbsp; r.buffer = r.generator.next()<br class="">
&nbsp; &nbsp; return r<br class="">
&nbsp; }<br class="">
&nbsp; var buffer: T.Generator.Element?<br class="">
&nbsp; var generator: T.Generator<br class="">
}<br class="">
<br class="">
public func == &lt;T&gt;(x: MultipassIndex&lt;T&gt;, y: MultipassIndex&lt;T&gt;) -&gt; Bool {<br class="">
&nbsp; return x.buffer == nil &amp;&amp; y.buffer == nil || x.generator == y.generator<br class="">
}<br class="">
<br class="">
//===--- An example fibonacci sequence ------------------------------------===//<br class="">
struct FibGenerator : GeneratorType {<br class="">
&nbsp; mutating func next() -&gt; Int? {<br class="">
&nbsp; &nbsp; let c = a + b<br class="">
&nbsp; &nbsp; a = b<br class="">
&nbsp; &nbsp; b = c<br class="">
&nbsp; &nbsp; return a &lt; limit ? a : nil<br class="">
&nbsp; }<br class="">
&nbsp; var a, b, limit: Int<br class="">
}<br class="">
<br class="">
<br class="">
struct Fib : SequenceType {<br class="">
&nbsp; var limit = 1000<br class="">
<br class="">
&nbsp; func generate() -&gt; FibGenerator {<br class="">
&nbsp; &nbsp; return Generator(a: 0, b: 1, limit: limit)<br class="">
&nbsp; }<br class="">
}<br class="">
<br class="">
//===--- Adapt Fib for use with Multipass ---------------------------------===//<br class="">
extension FibGenerator : Equatable {}<br class="">
func == (x: Fib.Generator, y: Fib.Generator) -&gt; Bool {<br class="">
&nbsp; return x.a == y.a<br class="">
}<br class="">
<br class="">
//===--- Demonstration ----------------------------------------------------===//<br class="">
let c = Multipass(Fib())<br class="">
print(c.first)<br class="">
print(c.count)<br class="">
print(c.lazy.map { $0 + 1 })<br class="">
</blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""><div class="">
-Dave
</div>
<br class=""></body></html>