Re: Minor breaking change of chop(Iterator, int...) method for Groovy 5

Per Nyfelt <[email protected]> Fri, 4 Apr 2025 17:33:07 +0200
Newsgroups gmane.comp.lang.groovy.user
Organization Alipsa HB
Message-ID <[email protected]>
I think the change is good and the right one. Consistency of API will 
bring a much better benefit in the long run compared so the initial 
discomfort to adapt.

Regards,

Per

On 4/4/25 13:41, Paul King wrote:
> Hi folks,
>
> I am seeking feedback on making a breaking change for the DGM chop
> method (just for an Iterator parameter) for Groovy 5. This wouldn't
> change chop for any of the other aggregate types (collections and
> arrays).
>
> For our DGM methods on iterators, we have a bunch that are a little
> like stream intermediate operators which return iterators, and others
> which are more like terminal operators which return non-aggregate
> results or some kind of aggregate like a collection. The benefit of
> the ones which return iterators is that they are lazily evaluated (to
> vary degrees). You can chain a bunch of them together and intermediate
> calculations are done lazily, and intermediate collections aren't
> created unnecessarily, saving memory and time.
>
> Currently, chop is treated like a terminal operator (fully eager),
> returning a list of lists. I'd like to make this an iterator of lists
> (just when working on an iterator). This would make it align more
> closely with other operators (e.g. collate and others). I'd supply a
> bridge method with the existing signature, so code compiled with
> Groovy 4 and earlier using compile static would happily work without
> change.
>
> Is this really needed? Well, to some extent no. We can just call
> ".toIterator()" and continue chaining. There will just be one step
> that isn't as efficient as it could be.
>
> Is this the most efficient and lazy? Well, no, returning an iterator
> of iterators could be made more lazy.
>
> But the iterator of lists is the happy middle ground we have chosen
> for many other operators and that is what I'd like to move this to. We
> could always add a "chopLazy" or some such that return the iterator of
> iterators. And also consider collateLazy, etc.
>
> There is a PR here:
> https://github.com/apache/groovy/pull/2173
>
> The implications: folks using this method (we don't believe it is
> widely used) would need to add ".toList()" if they needed the eager
> behavior. Folks wanting the chaining behavior would no longer need to
> add ".iterator()".
>
> Breaking changes are always disruptive but inconsistent APIs are also
> troublesome. We are seeking feedback on whether folks would be greatly
> impacted/amenable to this change. It would be added as a breaking
> change in the release notes.
>
> Thoughts?
>
> Thanks, Paul.