I don&#39;t understand - why do we need a map protocol for a lazy mapvalues? <br><div class="gmail_quote"><div dir="ltr">On Sat, May 21, 2016 at 11:12 PM Brent Royal-Gordon &lt;<a href="mailto:brent@architechies.com">brent@architechies.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; Obviously if it&#39;s required to have a lazy variant for all collection methods, I&#39;d probably pull back this proposal, as it would automatically be rejected by the core team.<br>
<br>
I&#39;m not a member of the core team, but I doubt it&#39;s necessary.<br>
<br>
I don&#39;t think it makes much sense to wait for a lazy implementation. If there *is* going to be a Map protocol, then the best way to implement it will require an advanced generics feature that&#39;s still in the proposal stages:<br>
<br>
        // Note: I&#39;m simplifying signatures here.<br>
<br>
        protocol Map: Collection {<br>
                associatedtype Key<br>
                associatedtype Value<br>
                associatedtype Iterator: IteratorProtocol where Iterator.Element == (Key, Value)<br>
<br>
                subscript (key: Key) -&gt; Value? { get }<br>
                func mapValues&lt;T&gt;(transform: Value -&gt; T) -&gt; [Key: T]<br>
        }<br>
<br>
And implementing the laziness will similarly work best with not only that feature, but also conditional conformances:<br>
<br>
        protocol LazyMap: Map, LazyCollectionProtocol {<br>
                subscript (key: Base.Key) -&gt; Base.Value? { get }<br>
                func mapValues&lt;T&gt;(transform: Value -&gt; T)(…) -&gt; LazyMappedValuesMap&lt;Base, T&gt;<br>
        }<br>
<br>
        extension LazyCollection: LazyMap where Base: Map {<br>
                …<br>
        }<br>
<br>
        struct LazyMapValuesMap&lt;Base: Map, NewValue&gt;: Map {<br>
                …<br>
        }<br>
<br>
If we *don&#39;t* wait, on the other hand, we&#39;re going to end up in manual-specification and GYB hell. (And even then, I believe conditional conformances are not enough to force all LazyCollectionProtocol conformers to support Map if they have a Map base. You&#39;d need conditional *conformance requirements*, which are *not* planned because it&#39;s not safe to add a requirement to a protocol.)<br>
<br>
I just don&#39;t think laziness is so crucial that we should stop the presses until we have it. `mapValues` carries water all by itself, even without a matching `lazy.mapValues`.<br>
<br>
--<br>
Brent Royal-Gordon<br>
Architechies<br>
<br>
</blockquote></div><div dir="ltr">-- <br></div><div dir="ltr"><div><div>Dan Appel<br></div></div></div>