I always forget to reply-all :)

---------- Forwarded message ---------
From: Gus Caplan <[email protected]>
Date: Fri, Jun 21, 2019, 16:34
Subject: Re: ECMAScript feature suggestion: Streaming Array items through
filter/map/reduce functions
To: Roma Bronstein <[email protected]>


I'm working on a proposal that adds generalized iteration methods (most of
which are lazy). https://github.com/tc39/proposal-iterator-helpers

I believe this would solve your problem.

-Gus

On Fri, Jun 21, 2019, 16:10 Roma Bronstein <[email protected]> wrote:

> Thanks Oliver for the quick response.
>
> The problem for me with forEach, that it's pretty much like a for loop.
> Anything can go inside the iteration logic.
> However with filter/map/reduce/some/every functions, the intention is
> explicit.
> Also you don't need to implement basic array operations that the above
> mentioned functions already provide.
>
> For instance in my opinion writing something like:
> a.filter()
>   .map()
>   .reduce()
>
> Is much clearer and safer than:
>
> let reducedValue
> a.forEach(item => {
>   if(!<filter condition>) return
>   const mappedItem = mappingLogic(item)
>   reducedValue = reduceLogic(mappedItem)
> })
>
>
>
> On Fri, Jun 21, 2019 at 11:58 PM Oliver Dunk <[email protected]>
> wrote:
>
>> This seems like a good place to share the idea, and it’s helpful that you
>> provided use cases etc.
>>
>> 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.
>>
>> > On 21 Jun 2019, at 16:32, Roma Bronstein <[email protected]> wrote:
>> >
>> > Hi,
>> >
>> > It's my first time suggesting a feature, hope I'm doing it correctly.
>> >
>> > I really like using Array.prototype.map(), Array.prototype.reduce() and
>> all related functions.
>> > The code is more readable and it looks better.
>> > However, when I want to write performance sensitive code, chaining
>> these functions is not a good approach.
>> > For example, writing this:
>> > // a is an Array of length N
>> > const b = a.filter().map()
>> >
>> > will require 2 traversals over the whole array, up to 2*N iterations
>> (if the filter passes all items).
>> >
>> > This is why I often resort to writing this:
>> > const b= []
>> > a.forEach(() => {
>> >   if (/*the filter condition*/)
>> >     b.push(/*mapping logic*/)
>> > })
>> >
>> > Which requires only N iterations.
>> >
>> > I suggest adding a capability to streamline items to these functions.
>> > I get my inspiration from Redis's transaction syntax where you declare
>> starting a transaction and finally call EXEC in order to execute it.
>> > So now I'll be able to write something like this:
>> > const b = a.stream()
>> >   .filter()
>> >   .map()
>> >   .exec()
>> >
>> > Just to clarify the example:
>> > 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.
>> > Finally I've activated it using the exec() function.
>> >
>> > I'm not sure if this is the best syntactical approach, but this example
>> is more intuitive to understand in my opinion.
>> >
>> > Another approach could be thinking about a "pipeline" operator like in
>> UNIX cli, providing a more generic capability to pipeline iterators.
>> >
>> > Again, I hope I'm doing this correctly and in the right forum.
>> > And if so, I'd be happy to hear some feedback.
>> >
>> > Thanks,
>> > Roma
>> >
>> >
>> >
>> > _______________________________________________
>> > es-discuss mailing list
>> > [email protected]
>> > https://mail.mozilla.org/listinfo/es-discuss
>>
>> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to