Skip to content

Fix BigDecimal arbitrary magnitude coverage and constrained shrinking - #8281

Closed
adrian-gierakowski wants to merge 1 commit into
Effect-TS:mainfrom
adrian-gierakowski:fix/bigdecimal-arbitrary-diversity
Closed

adrian-gierakowski wants to merge 1 commit into
Effect-TS:mainfrom
adrian-gierakowski:fix/bigdecimal-arbitrary-diversity

Conversation

@adrian-gierakowski

Copy link
Copy Markdown
Contributor

Problem

A one-sided BigDecimal bound fixes every generated value at scale 20. With the default size 10, a strictly positive decimal consequently has only 101 possible values, all between 1e-20 and 1.01e-18. Increasing the sample count cannot improve that range. Unconstrained decimals also miss large magnitudes at small sizes.

Change

Mix ordinary decimal amounts with representative wide scales and explicit coefficient ranges. This exercises both signs, values beyond JavaScript floating-point range, and nonzero values below its minimum, while keeping ordinary amounts common.

Project inclusive and exclusive bounds onto each scale using exact integer rounding, omit empty grids, and include boundary scales for narrow or high-precision intervals. Generate offsets from the permitted boundary nearest zero so even coarse-scale samples shrink to the exact inclusive boundary.

This PR is independent of the separate BigInt arbitrary change.

Validation

  • 183 focused tests: BigDecimal.test.ts and Arbitrary.test.ts.
  • Coverage at sizes 0, 1 and 10; positive and negative bounds; narrow, exclusive, singleton and extreme-scale intervals; shrink validity, exact inclusive-boundary shrinking and replay.
  • pnpm check, pnpm lint-fix and pnpm lint passed in the repository's Nix development shell.

The commit was validated against Effect 4.0.0-rc.115 (4a05d4914).

A one-sided decimal bound previously fixed every sample at scale 20.
Combined with size-limited bigint coefficients, a positive decimal at
size 10 had only 101 possible values, all close to zero. Unconstrained
decimals also failed to cover large magnitudes at small sizes.

Generate a mixture of ordinary decimal amounts and representative wide
scales, with explicit coefficient ranges independent of collection size.
Include magnitudes beyond floating-point overflow and underflow while
keeping ordinary values common and coefficient widths manageable.

Project decimal constraints onto each scale using sign-correct floor
and ceiling rules, skip grids without valid coefficients, and include
boundary scales so narrow and high-precision intervals remain
constructible without rejection sampling. Generate offsets from the
allowed boundary closest to zero so shrinking a coarse-scale sample
still reaches the exact inclusive boundary.

Add deterministic coverage at sizes 0, 1 and 10, positive and negative
one-sided bounds, inclusive/exclusive narrow intervals, singleton and
extreme-scale bounds, valid shrink candidates, exact boundary shrinking,
and replay. This change does not depend on changing BigInt generation.

Validation:
- pnpm test --run packages/effect/test/unstable/arbitrary/BigDecimal.test.ts packages/effect/test/unstable/arbitrary/Arbitrary.test.ts (183 tests)
- pnpm check
- pnpm lint-fix
- pnpm lint

All commands ran in the repository's Nix development shell.
@changeset-bot

changeset-bot Bot commented Sep 17, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9637577

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 30 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 34.58 KB 34.58 KB 0.00 KB (0.00%)
basic.ts 6.87 KB 6.87 KB 0.00 KB (0.00%)
batching.ts 9.95 KB 9.95 KB 0.00 KB (0.00%)
brand.ts 6.45 KB 6.45 KB 0.00 KB (0.00%)
cache.ts 10.77 KB 10.77 KB 0.00 KB (0.00%)
config.ts 21.51 KB 21.51 KB 0.00 KB (0.00%)
differ.ts 20.32 KB 20.32 KB 0.00 KB (0.00%)
http-client.ts 21.94 KB 21.94 KB 0.00 KB (0.00%)
http-router.ts 36.92 KB 36.92 KB 0.00 KB (0.00%)
logger.ts 10.88 KB 10.88 KB 0.00 KB (0.00%)
metric.ts 9.02 KB 9.02 KB 0.00 KB (0.00%)
optic.ts 6.70 KB 6.70 KB 0.00 KB (0.00%)
pubsub.ts 15.10 KB 15.10 KB 0.00 KB (0.00%)
queue.ts 11.85 KB 11.85 KB 0.00 KB (0.00%)
schedule.ts 10.96 KB 10.96 KB 0.00 KB (0.00%)
schema-binary.ts 39.51 KB 39.51 KB 0.00 KB (0.00%)
schema-class.ts 20.06 KB 20.06 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 30.93 KB 30.93 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 26.34 KB 26.34 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.63 KB 13.63 KB 0.00 KB (0.00%)
schema-string.ts 11.12 KB 11.12 KB 0.00 KB (0.00%)
schema-template-literal.ts 15.41 KB 15.41 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 34.10 KB 34.10 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.56 KB 24.56 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 19.27 KB 19.27 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 19.38 KB 19.38 KB 0.00 KB (0.00%)
schema-toFormatter.ts 19.49 KB 19.49 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 23.77 KB 23.77 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.54 KB 19.54 KB 0.00 KB (0.00%)
schema.ts 19.27 KB 19.27 KB 0.00 KB (0.00%)
stm.ts 12.80 KB 12.80 KB 0.00 KB (0.00%)
stream.ts 9.83 KB 9.83 KB 0.00 KB (0.00%)

@gcanti gcanti self-assigned this Sep 17, 2026
@gcanti

gcanti commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Closing in favor of #8296

@gcanti gcanti closed this Sep 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants