<div dir="auto"><div dir="auto"></div>I always forget to reply-all :)<div dir="auto"><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">Gus Caplan</strong> <span dir="auto"><<a href="mailto:fluffyrobotcheese@gmail.com" target="_blank" rel="noreferrer">fluffyrobotcheese@gmail.com</a>></span><br>Date: Fri, Jun 21, 2019, 16:34<br>Subject: Re: ECMAScript feature suggestion: Streaming Array items through filter/map/reduce functions<br>To: Roma Bronstein <<a href="mailto:outsidenote@gmail.com" target="_blank" rel="noreferrer">outsidenote@gmail.com</a>><br></div><br><br><div dir="auto">I'm working on a proposal that adds generalized iteration methods (most of which are lazy). <a href="https://github.com/tc39/proposal-iterator-helpers" rel="noreferrer noreferrer" target="_blank">https://github.com/tc39/proposal-iterator-helpers</a><div dir="auto"><br></div><div dir="auto">I believe this would solve your problem.</div><div dir="auto"><br></div><div dir="auto">-Gus</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 21, 2019, 16:10 Roma Bronstein <<a href="mailto:outsidenote@gmail.com" rel="noreferrer noreferrer" target="_blank">outsidenote@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div>Thanks Oliver for the quick response.</div><div><br></div>The problem for me with forEach, that it's pretty much like a for loop.<br></div>Anything can go inside the iteration logic.<br></div>However with filter/map/reduce/some/every functions, the intention is explicit.</div><div>Also you don't need to implement basic array operations that the above mentioned functions already provide.<br><br></div><div>For instance in my opinion writing something like:<br></div><div>a.filter()<br></div><div>  .map()<br></div><div>  .reduce()<br><br></div><div>Is much clearer and safer than:<br></div><div><br>let reducedValue<br></div><div>a.forEach(item => {<br></div><div>  if(!<filter condition>) return<br></div><div>  const mappedItem = mappingLogic(item)<br></div><div>  reducedValue = reduceLogic(mappedItem)<br></div><div>})<br><br><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 21, 2019 at 11:58 PM Oliver Dunk <<a href="mailto:oliver@oliverdunk.com" rel="noreferrer noreferrer noreferrer" target="_blank">oliver@oliverdunk.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This seems like a good place to share the idea, and it’s helpful that you provided use cases etc.<br>
<br>
Is there a reason why you prefer the proposed syntax over the forEach loop you mentioned? Personally I like how the forEach is easy to understand, but maybe there are other examples of when the stream is useful and the polyfill is much more complex.<br>
<br>
> On 21 Jun 2019, at 16:32, Roma Bronstein <<a href="mailto:outsidenote@gmail.com" rel="noreferrer noreferrer noreferrer" target="_blank">outsidenote@gmail.com</a>> wrote:<br>
> <br>
> Hi,<br>
> <br>
> It's my first time suggesting a feature, hope I'm doing it correctly.<br>
> <br>
> I really like using Array.prototype.map(), Array.prototype.reduce() and all related functions.<br>
> The code is more readable and it looks better.<br>
> However, when I want to write performance sensitive code, chaining these functions is not a good approach.<br>
> For example, writing this:<br>
> // a is an Array of length N<br>
> const b = a.filter().map()<br>
> <br>
> will require 2 traversals over the whole array, up to 2*N iterations (if the filter passes all items).<br>
> <br>
> This is why I often resort to writing this:<br>
> const b= []<br>
> a.forEach(() => {<br>
>   if (/*the filter condition*/)<br>
>     b.push(/*mapping logic*/)<br>
> })<br>
> <br>
> Which requires only N iterations.<br>
> <br>
> I suggest adding a capability to streamline items to these functions.<br>
> I get my inspiration from Redis's transaction syntax where you declare starting a transaction and finally call EXEC in order to execute it.<br>
> So now I'll be able to write something like this:<br>
> const b = a.stream()<br>
>   .filter()<br>
>   .map()<br>
>   .exec()<br>
> <br>
> Just to clarify the example:<br>
> I've declared that I'd like to stream array items of a. Then I've chained the functions I'd like to items to pass through.<br>
> Finally I've activated it using the exec() function.<br>
> <br>
> I'm not sure if this is the best syntactical approach, but this example is more intuitive to understand in my opinion.<br>
> <br>
> Another approach could be thinking about a "pipeline" operator like in UNIX cli, providing a more generic capability to pipeline iterators.<br>
> <br>
> Again, I hope I'm doing this correctly and in the right forum.<br>
> And if so, I'd be happy to hear some feedback.<br>
> <br>
> Thanks,<br>
> Roma<br>
> <br>
> <br>
> <br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> <a href="mailto:es-discuss@mozilla.org" rel="noreferrer noreferrer noreferrer" target="_blank">es-discuss@mozilla.org</a><br>
> <a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer noreferrer noreferrer noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br>
</blockquote></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" rel="noreferrer noreferrer noreferrer" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer noreferrer noreferrer noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>
</div></div></div>