Paul King created GROOVY-12216:
----------------------------------

             Summary: Fat-free twins for the fold/reduce DGM methods (inject, 
injectAll)
                 Key: GROOVY-12216
                 URL: https://issues.apache.org/jira/browse/GROOVY-12216
             Project: Groovy
          Issue Type: Sub-task
            Reporter: Paul King
            Assignee: Paul King


h3. Summary

Sub-task of GROOVY-12205. Adds functional-interface twins for the fold/reduce 
family. Grouped together because they share one design decision — the 
{{BinaryOperator}} vs {{BiFunction}} choice and how it pairs with the 
{{initialValue}} overloads — so the type conventions are settled once. 
{{inject}} on {{Iterable}} already has both twins (from GROOVY-12054); this 
completes the remaining receivers.

({{sum}} was originally grouped here but is split out — its twin collides 
positionally with an existing {{Object initialValue}} overload; see the 
separate {{sum}} item.)

h3. Type convention

* No-initial-value forms (2-arg reduce): {{BinaryOperator<T>}}.
* Initial-value forms (3-arg reduce): {{BiFunction<? super U, ? super E, ? 
extends U>}}, matching the existing {{inject(Iterable, U, BiFunction)}}.

No collision risk: in both methods the reduce function sits in a distinct 
trailing position after any explicit {{initialValue}} parameter, so it never 
competes with the initial value for overload selection.

h3. Methods

||Method||Closure overloads without a twin||Functional type||Receivers||
|{{inject}}|8|{{BinaryOperator<T>}} (no init) / {{BiFunction<? super U, ? super 
E, ? extends U>}} (init)|no-init: Object, {{E[]}}, Collection; with-init: 
Object, Iterator, Map, {{E[]}}, Collection|
|{{injectAll}}|5|{{BinaryOperator<T>}} (no init) / {{BiFunction}} 
(init)|no-init: Iterable, Iterator; with-init: Iterable, Iterator, Map|

Total: 13 new overloads.

h3. Conventions (per GROOVY-12054)

* PECS wildcards; {{@since 6.0.0}}; inline javadoc example via {{<pre 
class="language-groovy groovyTestCase">}} cross-linking the {{Closure}} 
counterpart with {{@link}}.
* Plain single-SAM overloads only — not {{@Incubating}}.

h3. Compatibility

* *{{inject}} arity*: since {{BinaryOperator<T> extends BiFunction<T,T,T>}}, 
the no-init ({{BinaryOperator}}, 2-arg) and with-init ({{BiFunction}}, 3-arg) 
forms stay distinct by arity — no erasure clash, mirroring the existing 
{{Iterable}} pair.
* Existing closure/lambda call sites unaffected; method references and typed 
functional values select the twin under {{@CompileStatic}} (GROOVY-12214). Only 
check: an existing {{@CompileStatic}} call passing a literal {{null}} to a 
currently-single-overload form would become ambiguous — grep-checkable, 
resolved with a cast if found.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to