import type { Ancestry, Stack } from "../Instance/Types"; import type { RandomSource } from "../Random/Types"; import type { Enumerable, Limits } from "./Types"; /** * Typed `combinatorial`/`coverage` boundary, closing over one instance's * `source` and its already-validated `limits` — same shape as * `Constructor(source, stack, ancestry)`. No separate `clock`: `source` carries * its resolved clock (`Random/Types.ts`'s `Options.clock`), so `Constructor`'s * `toConstructionContext` reads it off the resolved `ConstructionTrace`. * `plan`/ `resolve` (`./Plan.ts`) do the untyped recursive work; this is the * one precisely-typed layer, mirroring `Constructor.ts`'s `make`/`construct` * split. * * Two derived salts — one per API — each composed from the _effective_ source's * salt (`effectiveSource()` below — the innermost visible `wrap` frame's, or * this instance's `source`; read fresh on every * `combinatorial(...)`/`coverage(...)` call, not once when `enumerables()` was * built, so the same `combinatorial` reference behaves differently inside a * `wrap` this instance can see). Each build pins that salt via `new * Fabricator(schema, { salt })` (see `Constructor.ts`'s `construct()`) — a pin, * not a fork — so every rebuild of one schema draws from the same universe, * distinct from anything built under the instance's own salt. * * `ordinal: null` is pinned alongside it, and is not incidental: a salt says * nothing about ordering, so without this pin each lazy rebuild would take the * next ordinal from the effective source's counter — advancing it for every * later construction, and giving each pass over the `Iterable` a different * ordinal. A pinned ordinal is taken verbatim, so the counter is untouched, * every iteration rebuilds from the same explicit identity, and the `null` can * never coincide with a counted construction. */ export declare function enumerables(source: RandomSource, limits: Limits, stack: Stack, ancestry: Ancestry): { combinatorial: Enumerable; coverage: Enumerable; };