On Wed, 8 Nov 2023 16:26:56 GMT, Tagir F. Valeev <tval...@openjdk.org> wrote:

>> @amaembo pairMap should be straight-forward to implement. And regarding 
>> parallelization I don't think that will necessarily work since it would not 
>> be able to run incrementally (depth-first).
>
> Sorry, I'm not sure what do you mean by incrementally. But I've realized that 
> to implement this you may need to push to downstream during combining. E.g., 
> imagine the stream of numbers 1...1000, and you want to make 
> `parallel().gather(pairMap((left, right) -> 
> left+"->"+right)).collect(toList())`, creating a list of "1->2", "2->3", ..., 
> "999->1000" strings. Now, let's assume that the stream was split into four 
> parts during the parallelization: `1..250`, `251..500`, `501..750`, 
> `751..1000`. So you create downstream accumulators and push the pairs there 
> with integrator, like:
> "1->2", ..., "249->250" into first toList() accumulator, 
> "251->252", ..., "499->500" into second toList() accumulator
> "501->502", ..., "749->750" into third toList() accumulator
> "751->752", ..., "999->1000" into fourth toList() accumulator
> At this point we have four independent gatherer states, and they keep the 
> first and last element from the upstream. Now, you combine for example, first 
> and second gatherer states. The first one is [first=1, last=250], and the 
> second is [first=251, last=500]. The combined gatherer should be [first=1, 
> last=500] and at the same time during the combining it should push the 
> "250->251" object to the downstream, which will land into the first toList() 
> accumulator.
> 
> Hopefully my explanation is clear. Will it be possible to extend the combiner 
> function and provide the Downstream there as well, so combiner can also work 
> as a finisher for the first combined chunk?

Ah, now I see what you mean. In this specific case you might be able to create 
a combiner (which would also need a Downstream) such that you can add the 
missing combinations (the end of the "left" and the beginning of the "right"). 
But imagine something like `windowFixed(3)`, where the presence of 1 or 2 
elements to the "left" will skew all the elements to the "right", potentially 
rippling through the entire stream.

I think the Preview is a perfect place to see if the combiner would be made 
even better with a Downstream reference or not. Logically, the output of said 
Downstream would be placed *after* the "left"'s output, and *before* the 
"right"'s output (so in the middle of the two).

But then someone might want to be able to inject elements outside of that 
order, but I guess that remains to be seen.

Great thoughts, @amaembo 👍

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/16420#discussion_r1386910345

Reply via email to