feat(dummies): extend Combine to arity 8 - #178
Merged
Merged
Conversation
Add Combine overloads for four through eight generators, so a value object or aggregate built from many constrained parts composes in one flat, reflection-free call with caller-named lambda parameters, instead of nested Combine calls or positional tuple access. Each overload mirrors the existing source-resolution and failure-wrapping pattern. Eight is the ceiling: past it, intermediate value objects are the healthier design. The arity-7 and arity-8 overloads exceed seven parameters, so they carry a justified S107 suppression (see ADR-0015). Tests exercise arities 4 to 8, argument validation and composer-failure wrapping. Full suite green on both target legs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
Record, as Proposed, the decision to cap Any.Combine at eight parts and to accept the parameter- and generic-count code smell of the two largest overloads (the inline S107 suppressions) as the irreducible cost of heterogeneous, reflection-free composition. Includes the French translation and the index entry. Numbered 0015: ADR-0014 was taken by the binder required-list-presence decision merged to main in the meantime. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
Reefact
force-pushed
the
claude/dummies-combine-arity
branch
from
July 18, 2026 11:16
51b7c45 to
a5de0ba
Compare
Reefact
pushed a commit
that referenced
this pull request
Jul 18, 2026
Renumber ADR-0015 -> ADR-0016 (main took 0015 for the Combine arity ceiling, #178) and resolve the ADR index.
18 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Extends
Any.Combinefrom two/three parts up to eight, so a value object or aggregate built from many constrained generators composes in one flat, reflection-free call instead of nestedCombinecalls or positional tuple access.Type of change
Changes
Any.Combineoverloads for four through eight generators, each mirroring the existing pattern: null-check every argument, resolve the random context from the first operand that carries one, and wrap a composer failure in anAnyGenerationExceptionnaming the generated parts. Caller-named lambda parameters keep the call site readable (Combine(a, b, c, d, (w, x, y, z) => new Thing(w, x, y, z))).S107suppression pointing at ADR-0015.The tuple sugar
PairOf/TripleOfdeliberately stays at 2/3 — raw tuples past three (Item4…) are unreadable; the value of higher arity is inCombine's named-constructor lambda.Testing
dotnet build FirstClassErrors.sln— succeeded, 0 warnings (bothnetstandard2.0andnet8.0legs), re-verified after rebase ontomain.dotnet test FirstClassErrors.sln— all green (Dummies 152; FCE 423; Analyzers 85; GenDoc 155; PropertyTests 21; Binder 76; Cli 64).FirstClassErrors.Analyzers.UnitTests) — ran as part of the full suite above.Documentation
doc/updated —Dummies/README.nuget.mdand ADR-0015.doc/handwritten/for-users/README.fr.md) updated if user-facing behavior changedThe handwritten EN/FR user guides stay deferred until the V1 surface stabilizes (ADR-0011 follow-up); only the packaged NuGet readme is kept current.
Architecture decisions
Proposed: ADR-0015ADR-0015 records the arity-8 ceiling and the accepted parameter/generic-count smell (the inline
S107suppressions) as the irreducible cost of heterogeneous, reflection-free composition.Rebased onto
mainand renumbered the ADR 0014 → 0015 (and its two in-code references) after ADR-0014 (binder required-list presence, #177) landed onmain.🤖 Generated with Claude Code