<div dir="ltr">Please correct me if I&#39;m off here, but I quickly looked at the implementation of lazy collections/sequences, and I think it&#39;s because the goal is to keep the API of e.g. normal Array and a lazy Array the same, so that you don&#39;t actually have to know which one you&#39;re working with. But under the hood, they&#39;re very different objects, as one owns the memory of its elements, whereas the lazy one goes back to the array it was created with and pulls it elements (before e.g. transforming them). And as structs cannot be subclassed, a lot of the functionality is implemented in default functions on the protocol. So if you wanted to create a lazy version of a Dictionary, which has an identical API, you&#39;d have to duplicate a lot of code - unless you pull the Dictionary-ness into a protocol, make Dictionary just the normal form of Dictionary, but allow a LazyDictionary under the hood to pull values from a parent dictionary based on keys, transform them with mapValues and return them.<div><br></div><div>Does that make sense? I looked at the implementation of Dictionary in the stdlib yesterday, and IMO it&#39;d be a pretty huge amount of work to refactor it into the Map protocol first, so I&#39;m trying to push for having a non-lazy version done first, and then add the lazy version once someone proposes to add the Map protocol later (otherwise this&#39;ll just get stuck here for months, because I doubt the core team would be happy with making such large changes for allowing one convenience method only, now that Swift 3 is being stabilized).<div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Sun, May 22, 2016 at 7:48 AM Dan Appel &lt;<a href="mailto:dan.appel00@gmail.com">dan.appel00@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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" target="_blank">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>
</blockquote></div>